CheckChanges.php 5.04 KB
<?php

namespace App\Service\Requests\Direct;

use App\Jobs\ProcessCallLimitedAPI;
use App\Models\AdGroup;
use App\Models\Advertisement;
use App\Models\Campaigns;
use App\Models\Pivots\DictionaryCampaign;
use App\Models\Pivots\GoalAdGroup;
use App\Service\Contract\APIRequest;
use App\Service\Requests\DirectRequest;
use Carbon\Carbon;
use Illuminate\Support\Facades\Log;

class CheckChanges extends DirectRequest
{
    protected $max_count = -1;
    protected $max_count_CampaignIds = 3000;
    protected $max_count_AdGroupIds = 10000;
    protected $max_count_AdIds = 50000;

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

    public function getObjectsCount()
    {
        $params = $this->getParams();
        if (isset($params['CampaignIds'])){
            return count($params['CampaignIds']);
        }
        return parent::getObjectsCount();
    }

    public function slice($maxObjects): ?APIRequest
    {
        $params = $this->getParams();

        if (isset($params['CampaignIds'])){
            return $this->sliceByKey($maxObjects, 'CampaignIds');
        }

        if (isset($params['AdGroupIds'])){
            return $this->sliceByKey($maxObjects, 'AdGroupIds');
        }

        if (isset($params['AdIds'])){
            return $this->sliceByKey($maxObjects, 'AdIds');
        }

        return null;
    }

    public function handle($response)
    {
        if (!isset($response['result'])) {
            Log::debug($response);
            return;
        }

        if (isset($response['result']['NotFound'])) {
            Log::debug($response['result']['NotFound']);
        }

        if (isset($response['result']['Unprocessed'])) {
            Log::debug($response['result']['Unprocessed']);
        }



        if (isset($response['result']['Modified']['AdGroupIds'])) {
            foreach ($response['result']['Modified']['AdGroupIds'] as $ad_group_id) {

                $ad_group_id = (string)$ad_group_id;

                if ($this->getToken()->isMain()) {
                    $adGroup = AdGroup::firstWhere('external_id', $ad_group_id);

                    if ($adGroup) {
                        $adGroup->update([
                            'updated_self' => Carbon::now(),
                        ]);
                    } else {
                        $adGroup = AdGroup::create([
                            'token_id' => $this->getToken()->getKey(),
                            'external_id' => $ad_group_id,
                            'updated_self' => Carbon::now(),
                        ]);
                    }
                } else {
                    $goalAdGroup = GoalAdGroup::with('dictionaryCampaign')->firstWhere('external_id', $ad_group_id);

                    if ($goalAdGroup && $goalAdGroup->dictionaryCampaign && $goalAdGroup->dictionaryCampaign->updated) {
                        $goalAdGroup->update([
                            'updated_need' => Carbon::now(),
                        ]);
                    }

                }

            }
        }

        if (isset($response['result']['Modified']['AdIds'])) {
            foreach ($response['result']['Modified']['AdIds'] as $ad_id) {

                $ad_id = (string)$ad_id;

                if ($this->getToken()->isMain()) {
                    $advertisement = Advertisement::firstWhere('external_id', $ad_id);

                    if ($advertisement) {
                        $advertisement->update([
                            'updated_self' => Carbon::now(),
                        ]);
                    } else {
                        $advertisement = Advertisement::create([
                            'external_id' => $ad_id,
                            'updated_self' => Carbon::now(),
                        ]);
                    }
                } else {
                    //
                }

            }
        }

        if (isset($this->getParams()['CampaignIds'])) {

            if ($this->getToken()->isMain()) {
                Campaigns::whereIn('external_id', $this->getParams()['CampaignIds'])->update([
                    'updated_children' => null,
                ]);
            } else {
                DictionaryCampaign::whereIn('external_id', $this->getParams()['CampaignIds'])->update([
                    'updated_children' => null,
                ]);
            }


            $this->getToken()->update([
                'check_changes_ad_group' => Carbon::parse($response['result']['Timestamp']),
            ]);

        } else {
            $this->getToken()->update([
                'check_changes' => Carbon::parse($response['result']['Timestamp']),
            ]);
        }

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

    private function requestPrepare($params)
    {
        $this->setService('Changes');
        $this->setMethod('check');

        $params['Timestamp'] = $this->getToken()->check_changes_ad_group_at->toIso8601ZuluString();

        $this->setParams($params);
    }
}