CheckCampaignsChanges.php 2.97 KB
<?php

namespace App\Service\Requests\Direct;

use App\Jobs\ProcessCallLimitedAPI;
use App\Models\Campaigns;
use App\Models\Pivots\DictionaryCampaign;
use App\Service\Requests\DirectRequest;
use Carbon\Carbon;

class CheckCampaignsChanges extends DirectRequest
{
    CONST SELF = 'SELF';
    CONST CHILDREN = 'CHILDREN';
    CONST STAT = 'STAT';

    protected $max_count = -1;
    protected $next;

    function call($params = null)
    {
        $this->requestPrepare($params);
        $process = new ProcessCallLimitedAPI($this);
        dispatch($process)->onQueue('limits');
    }

    function handle($response)
    {
        if (isset($response['result']['Campaigns'])) {
            foreach ($response['result']['Campaigns'] as $campaign_data) {
                if (in_array(self::SELF, $campaign_data['ChangesIn']) || in_array(self::CHILDREN, $campaign_data['ChangesIn'])) {
                    $data = [];

                    if ($this->getToken()->isMain() && in_array(self::SELF, $campaign_data['ChangesIn'])) {
                        $data['updated_self'] = Carbon::now();
                    }

                    if (in_array(self::CHILDREN, $campaign_data['ChangesIn'])) {
                        $data['updated_children'] = Carbon::now();
                    }

                    $external_id = (string)$campaign_data['CampaignId'];

                    if ($this->getToken()->isMain()) {

                        $data['external_id'] = $external_id;
                        $data['token'] = $this->getToken()->getKey();

                        Campaigns::updateOrCreate([
                            'external_id' => $external_id
                        ], $data);

                    } else {

                        $dictionaryCampaign = DictionaryCampaign::firstWhere('external_id', $external_id);

                        if ($dictionaryCampaign) {

                            $data['external_updated_at'] = Carbon::now();

                            if ($dictionaryCampaign->updated) {
                                $data['updated_need'] = Carbon::now();
                            }

                            $dictionaryCampaign->update($data);
                        }

                    }
                }
            }
        }

        $check_changes_campaign = Carbon::parse($response['result']['Timestamp']);

        if ($this->getToken()->check_changes_campaign && $this->getToken()->check_changes_campaign->diff($check_changes_campaign)->invert) {
            $check_changes_campaign = $this->getToken()->check_changes_campaign;
        }

        $this->getToken()->update([
            'check_changes_campaign' => $check_changes_campaign,
        ]);

        $this->setToken($this->getToken()->refresh());
    }

    private function requestPrepare($params)
    {
        $this->setService('Changes');
        $this->setMethod('checkCampaigns');
        $this->setParams([
            'Timestamp' => $this->getToken()->check_changes_campaign_at->toIso8601ZuluString(),
        ]);
    }
}