CampaignVariablesController.php 4.15 KB
<?php

namespace App\Http\Controllers;

use App\Models\Campaigns;
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, $campaign_id)
    {
        if ($token->isMain()) {
            return Redirect::back();
        }

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

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

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

                $variables = Variable::defaultOrderBy()->get()->transform(function (Variable $variable) use ($campaign) {
                    $variable->campaign = $variable->campaigns()
                        ->where('campaign_id', $campaign->getKey())->first();
                    return $variable;
                });


                return Inertia::render('CampaignVariables/Edit', [
                    'variables' => $variables,
                    'token' => $token,
                    'campaign' => $campaign,
                ]);

            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($campaign, $variable_id, $value);

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

            case 'PUT':

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

                $this->putCampaignVariableValue($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, $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 Campaigns $campaign
     * @param integer $variable_id
     * @param string|null $value
     */
    private function putCampaignVariableValue(Campaigns $campaign, $variable_id, $value = null)
    {
        if (is_null($value)) {
            $campaign->variables()->detach($variable_id);
        } else {
            $campaign->variables()->syncWithoutDetaching([
                $variable_id => [
                    'value' => $value,
                ],
            ]);
        }
    }

}