CampaignVariablesController.php 7.89 KB
<?php

namespace App\Http\Controllers;

use App\Models\NegativeKeywordSharedSet;
use App\Models\Pivots\DictionaryCampaign;
use App\Models\Pivots\GoalRetargetinglist;
use App\Models\Tokens;
use App\Models\Variable;
use Carbon\Carbon;
use Illuminate\Support\Facades\Redirect;
use Illuminate\Support\Facades\Request;
use Inertia\Inertia;

class CampaignVariablesController extends Controller
{

    private $rule_variable = 'required|exists:variables,id';
    private $rule_variable_name = 'required|regex:/[a-zA-z0-9]/|unique:' . Variable::class . ',name';
    private $rule_default_value = 'required';
    private $rule_value = '';

    public function index(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 = DictionaryCampaign::where('campaign_id', $campaign->getKey())
            ->where('dictionary_id', $dictionary->getKey())->first();

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

        $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,
        ]);
    }

    public function addVariable(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 = DictionaryCampaign::where('campaign_id', $campaign->getKey())
            ->where('dictionary_id', $dictionary->getKey())->first();

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

        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.');
    }

    public function editVariable(Variable $variable)
    {
        $variable->update(Request::validate([
            'name' => "{$this->rule_variable_name},{$variable->getKey()}",
            'default_value' => $this->rule_default_value,
        ]));

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

    public function editDictionaryCampaignVariable(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 = DictionaryCampaign::where('campaign_id', $campaign->getKey())
            ->where('dictionary_id', $dictionary->getKey())->first();

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

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

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

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

    public function destroy($variable_id)
    {
        $variable = Variable::find($variable_id);

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

        $variable->delete();

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

    /**
     * @param DictionaryCampaign $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_variable = $dictionary_campaign->dictionaryCampaignVariables()->firstWhere('variable_id', $variable_id);

            if ($dictionary_campaign_variable) {
                $dictionary_campaign_variable->update([
                    'value' => $value,
                ]);
            } else {
                $dictionary_campaign->dictionaryCampaignVariables()->create([
                    'variable_id' => $variable_id,
                    'value' => $value,
                ]);
            }

        }

        if ($dictionary_campaign->external_id) {
            $dictionary_campaign->where(function ($query) {
                $query->getModel()->timestamps = false;
            })->update([
                'updated_need' => Carbon::now(),
            ]);
            $dictionary_campaign->groups()->forExternal()->where(function ($query) {
                $query->getModel()->timestamps = false;
            })->update([
                'updated_need' => Carbon::now(),
            ]);
            $dictionary_campaign->goalAdvertisements()->forExternal()->where(function ($query) {
                $query->getModel()->timestamps = false;
            })->update([
                'updated_need' => Carbon::now(),
            ]);
            $dictionary_campaign->goalKeywords()->forExternal()->where(function ($query) {
                $query->getModel()->timestamps = false;
            })->update([
                'updated_need' => Carbon::now(),
            ]);
//            $dictionary_campaign->goalGoalSitelink()->forExternal()->where(function ($query) {
//                $query->getModel()->timestamps = false;
//            })->update([
//                'updated_need' => Carbon::now(),
//            ]);
            $dictionary_campaign->goalVCards()->forExternal()->where(function ($query) {
                $query->getModel()->timestamps = false;
            })->update([
                'updated_need' => Carbon::now(),
            ]);
            GoalRetargetinglist::forExternal()->where(function ($query) {
                $query->getModel()->timestamps = false;
            })->update([
                'updated_need' => Carbon::now(),
            ]);
//            NegativeKeywordSharedSet::forExternal()->where(function ($query) {
//                $query->getModel()->timestamps = false;
//            })->update([
//                'updated_need' => Carbon::now(),
//            ]);
        }

    }

}