CampaignVariablesController.php 4.78 KB
<?php

namespace App\Http\Controllers;

use App\Models\Campaigns;
use App\Models\Dictionary;
use App\Models\Pivots\DictionaryCampaignPivot;
use App\Models\Tokens;
use App\Models\Variable;
use Illuminate\Support\Facades\Redirect;
use Illuminate\Support\Facades\Request;
use Inertia\Inertia;

class CampaignVariablesController extends Controller
{

    protected $rule_variable = 'required|exists:variables,id';
    protected $rule_variable_name = 'required|alpha|regex:/[a-zA-z]/';
    protected $rule_default_value = 'required';
    protected $rule_value = '';

    function __invoke(Tokens $token, $dictionary_id, $campaign_id)
    {
        if ($token->isMain()) {
            return Redirect::back();
        }

        $campaign = Tokens::where('type', Tokens::MAIN)->first()
            ->campaignsForManaged()->find($campaign_id);

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

        $dictionary = $token->cities()->find($dictionary_id);

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

        $dictionary_campaign = DictionaryCampaignPivot::where('campaign_id', $campaign->getKey())
            ->where('dictionary_id', $dictionary->getKey())->first();

        switch (request()->method()) {
            case 'GET':

                $variables = Variable::defaultOrderBy()->get();

                return Inertia::render('CampaignVariables/Edit', [
                    'variables' => $variables->transform(function (Variable $variable) use ($dictionary_campaign) {
                        $data = $variable->toArray();
                        $data['dictionaryCampaign'] = $variable->values()->where('dictionary_campaign_id', $dictionary_campaign->getKey())->first();
                        return $data;
                    }),
                    'token' => $token,
                    'campaign' => $campaign,
                    'dictionary' => $dictionary,
                ]);

            case 'POST':

                if (request('variable') === 'add') {
                    Request::validate([
                        'name' => $this->rule_variable_name,
                        'default_value' => $this->rule_default_value,
                    ]);

                    $variable_new = Variable::create(Request::only([
                        'name',
                        'default_value',
                    ]));
                    $variable_id = $variable_new->getKey();
                    $value = request('value');
                } else {
                    Request::validate([
                        'variable' => $this->rule_variable,
                    ]);
                    $variable_id = request('variable');
                    $value = request('value');
                }

                $this->putCampaignVariableValue($dictionary_campaign, $variable_id, $value);

                return Redirect::back()->with('success', 'Campaign variable added.');
                break;

            case 'PUT':

                Request::validate([
                    'value' => $this->rule_value
                ]);

                $this->putCampaignVariableValue($dictionary_campaign, request('id'), request('value'));

                return Redirect::back()->with('success', 'Campaign variable updated.');
                break;


            case 'PATCH':

                $variable = Variable::find(request('id'));

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

                $variable->update(Request::validate([
                    'name' => $this->rule_variable_name,
                    'default_value' => $this->rule_default_value,
                ]));

                return Redirect::back()->with('success', 'Variable name updated.');
                break;

        }

        return Redirect::back();
    }

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

        $variable = Variable::find($variable_id);

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

        $variable->delete();

        return Redirect::back()->with('success', 'Campaign variable deleted.');
    }

    /**
     * @param DictionaryCampaignPivot $dictionary_campaign
     * @param integer $variable_id
     * @param string|null $value
     */
    private function putCampaignVariableValue($dictionary_campaign, $variable_id, $value = null)
    {
        if (is_null($value)) {
            $dictionary_campaign->dictionaryCampaignVariables()->where('variable_id', $variable_id)
                ->delete();
        } else {
            $dictionary_campaign->dictionaryCampaignVariables()->create([
                'variable_id' => $variable_id,
                'value' => $value,
            ]);
        }
    }

}