TokensController.php 7.6 KB
<?php

namespace App\Http\Controllers;

use App\Models\Campaigns;
use App\Models\Dictionary;
use App\Models\Pivots\DictionaryCampaign;
use App\Models\Tokens;
use App\Service\API\API;
use App\Service\Requests\APIRequest;
use Illuminate\Support\Facades\Auth;
use Illuminate\Support\Facades\DB;
use Illuminate\Support\Facades\Redirect;
use Illuminate\Support\Facades\Request;
use Inertia\Inertia;

class TokensController extends Controller
{
    function index()
    {
        return Inertia::render('Tokens/Index', [
            'filters' => Request::all('api', 'type', 'login'),
            'types' => [Tokens::MAIN => 'Основной аккаунт', Tokens::GOAL => 'Целевой аккаунт'],
            'tokens' => Tokens::filter(Request::only('api', 'type', 'login'))
                ->paginate()
                ->withQueryString()
                ->through(function ($token) {
                    return [
                        'id' => $token->getKey(),
                        'login' => $token->login,
                        'type' => $token->type,
                        'api' => $token->api,
                    ];
                }),
        ]);
    }

    function edit(Tokens $token)
    {
        $mainToken = Tokens::where('type', Tokens::MAIN)->first();
        return Inertia::render('Tokens/Edit', [
            'token' => [
                'id' => $token->getKey(),
                'login' => $token->login,
                'api' => $token->api,
                'token' => $token->token,
                'type' => $token->type,
                'main' => $token->isMain(),
                'campaigns' => (
                $token->isMain()
                    ? $token->campaignsForManaged
                    : []
                ),
                'cities' => (
                !$token->isMain()
                    ? $token->load('cities.dictionaryCampaigns')->cities
                    : []
                ),
            ],
            'cities' => (
            !$token->isMain()
                ? Dictionary::where('type', Dictionary::CITY)->defaultOrderBy()->get()
                : []
            ),
            'campaigns' => $token->campaigns,
            'main_token_campaigns' => (
            $mainToken
                ? $mainToken->campaignsForManaged
                : []
            ),
            'types' => $mainToken && !$token->type === Tokens::GOAL
                ? [Tokens::GOAL => 'Целевой аккаунт'] :
                [Tokens::MAIN => 'Основной аккаунт', Tokens::GOAL => 'Целевой аккаунт'],
        ]);
    }

    public function update(Tokens $token)
    {
        $token->update(
            Request::validate([
                'type' => ['required', 'in:' . Tokens::MAIN . "," . Tokens::GOAL],
            ])
        );

        return Redirect::back()->with('success', 'Token updated.');
    }

    public function managedCampaign(Tokens $token, $campaign_id)
    {
        if (!$token->isMain()) {
            return Redirect::back();
        }

        $campaign = $token->campaigns()->find($campaign_id);

        if (!$campaign) {
            return Redirect::back();
        }

        $campaign->update([
            'manage' => !!request('managed'),
        ]);

        return Redirect::back()->with('success', 'Campaign ' . ($campaign->manage ? 'added' : 'deleted') . '.');
    }

    public function enabledCampaign(Tokens $token, $campaign_id)
    {
        if (!$token->isMain()) {
            return Redirect::back();
        }

        $campaign = $token->campaigns()->find($campaign_id);

        if (!$campaign) {
            return Redirect::back();
        }

        $campaign->update([
            'enabled' => !!request('enabled'),
        ]);

        return Redirect::back()->with('success', 'Campaign ' . ($campaign->enabled ? 'enabled' : 'disabled') . '.');
    }

    public function destroy(Tokens $token)
    {
        $token->delete();

        return Redirect::route('tokens')->with('success', 'Token deleted.');
    }

    public function get($api)
    {
        return Inertia::location(API::getInstance(APIRequest::getInstance($api))->getAuthLink());
    }

    public function token($api)
    {
        $token = API::getInstance(APIRequest::getInstance($api))->getToken(Request::get('code'));

        $tokens = Tokens::firstOrNew(['token' => $token['token']]);
        $tokens->token = $token['token'];
        $tokens->login = $token['login'];
        $tokens->api = $api;
        $tokens->created_by = Auth::user()->getKey();
        $tokens->save();

        return Redirect::route('tokens')->with('success', 'Token added.');
    }

    public function storeCity(Tokens $token, Dictionary $dictionary)
    {
        if ($token->isMain()) {
            return Redirect::back();
        }

        $token_main = Tokens::with('campaignsForManaged')->where('type', Tokens::MAIN)->first();

        if (!$token_main) {
            return Redirect::back();
        }

        DB::beginTransaction();
        try {

            $token->cities()->save($dictionary);

            if ($token_main->campaignsForManaged->count()) {
                $dictionary->campaigns()->syncWithoutDetaching(
                    $token_main->campaignsForManaged->keyBy($token_main->campaignsForManaged->first()->getKeyName())->transform(function (Campaigns $campaign) {
                        return DictionaryCampaign::copyPropertyInCampaign($campaign);
                    })->all()
                );
            }

            DB::commit();

            return Redirect::route('token.edit', $token->getKey())->with('success', 'City added.');


        } catch (\Exception $e) {
            DB::rollBack();
            return Redirect::back()->withErrors($e->getMessage());
        }
    }

    public function updatedCityCampaign(Tokens $token, Dictionary $dictionary, $campaign_id)
    {
        if ($token->isMain()) {
            return Redirect::back();
        }

        $campaign = $dictionary->campaigns()->find($campaign_id);

        if (!$campaign) {
            return Redirect::back();
        }

        $campaign->pivot->update([
            'updated' => !!request('updated'),
        ]);

        return Redirect::route('token.edit', $token->getKey())->with('success', 'City campaign updated.');
    }

    public function syncedCityCampaign(Tokens $token, Dictionary $dictionary, $campaign_id)
    {
        if ($token->isMain()) {
            return Redirect::back();
        }

        $campaign = $dictionary->campaigns()->find($campaign_id);

        if (!$campaign) {
            return Redirect::back();
        }

        $campaign->pivot->update([
            'synced' => !!request('synced'),
        ]);

        return Redirect::route('token.edit', $token->getKey())->with('success', 'City campaign synced.');
    }

    public function enabledCityCampaign(Tokens $token, Dictionary $dictionary, $campaign_id)
    {
        if ($token->isMain()) {
            return Redirect::back();
        }

        $campaign = $dictionary->campaigns()->find($campaign_id);

        if (!$campaign) {
            return Redirect::back();
        }

        $campaign->pivot->update([
            'enabled' => !!request('enabled'),
        ]);

        return Redirect::route('token.edit', $token->getKey())->with('success', 'City campaign ' . ($campaign->pivot->enabled ? 'enabled' : 'disabled') . '.');
    }

    public function destroyCity(Tokens $token, Dictionary $dictionary)
    {
        if ($token->isMain()) {
            return Redirect::back();
        }

        $dictionary->token()->dissociate();
        $dictionary->save();

        return Redirect::route('token.edit', $token->getKey())->with('success', 'City deleted.');
    }
}