GetAudienceTargets.php 8.04 KB
<?php

namespace App\Service\Requests\Direct;

use App\Jobs\ProcessCallLimitedAPI;
use App\Models\AdGroup;
use App\Models\AudienceTarget;
use App\Models\Campaigns;
use App\Models\Retargetinglist;
use App\Service\Contract\APIRequest;
use App\Service\Requests\DirectRequest;
use Carbon\Carbon;
use Illuminate\Support\Facades\Log;

class GetAudienceTargets extends DirectRequest
{
    protected $max_count = -1;
    protected $max_count_Ids = 10000;
    protected $max_count_AdGroupIds = 1000;
    protected $max_count_RetargetingListIds = 1000;
    protected $max_count_CampaignIds = 100;

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

    public function getObjectsCount()
    {
        $params = $this->getParams();
        if (isset($params['SelectionCriteria']['CampaignIds'])) {
            return count($params['SelectionCriteria']['CampaignIds']);
        }
        if (isset($params['SelectionCriteria']['RetargetingListIds'])) {
            return count($params['SelectionCriteria']['RetargetingListIds']);
        }
        if (isset($params['SelectionCriteria']['AdGroupIds'])) {
            return count($params['SelectionCriteria']['AdGroupIds']);
        }
        if (isset($params['SelectionCriteria']['Ids'])) {
            return count($params['SelectionCriteria']['Ids']);
        }
        return -1;
    }

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

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

    function handle($response)
    {
        try {
            if (!isset($response['result']['AudienceTargets'])) {
                return;
            }

            $ad_group_external_ids = [];
            $campaign_external_ids = [];
            $retargetinglist_external_ids = [];

            foreach ($response['result']['AudienceTargets'] as $audience_target) {
                $ad_group_external_id = (string)$audience_target['AdGroupId'];
                $campaign_external_id = (string)$audience_target['CampaignId'];
                $retargetinglist_external_id = (string)$audience_target['RetargetingListId'];

                if (!isset($ad_group_external_ids[$ad_group_external_id])) {
                    $ad_group_external_ids[$ad_group_external_id] = true;
                }

                if (!isset($campaign_external_ids[$campaign_external_id])) {
                    $campaign_external_ids[$campaign_external_id] = true;
                }

                if (!isset($retargetinglist_external_ids[$retargetinglist_external_id])) {
                    $retargetinglist_external_ids[$retargetinglist_external_id] = true;
                }
            }

            if ($this->getToken()->isMain()) {
                $adGroups = AdGroup::whereIn('external_id', array_keys($ad_group_external_ids))
                    ->get()
                    ->keyBy('external_id');

                $campaigns = Campaigns::whereIn('external_id', array_keys($campaign_external_ids))
                    ->get()
                    ->keyBy('external_id');

                $retargetinglists = Retargetinglist::whereIn('external_id', array_keys($retargetinglist_external_ids))
                    ->get()
                    ->keyBy('external_id');
            }


            foreach ($response['result']['AudienceTargets'] as $audience_target) {

                $external_id = (string)$audience_target['Id'];
                $ad_group_external_id = (string)$audience_target['AdGroupId'];
                $campaign_external_id = (string)$audience_target['CampaignId'];
                $retargetinglist_external_id = (string)$audience_target['RetargetingListId'];

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

                    /* @var $adGroup AdGroup|null */
                    $adGroup = $adGroups->get($ad_group_external_id);

                    if (!$adGroup) {
                        continue;
                    }

                    /* @var $campaign Campaigns|null */
                    $campaign = $campaigns->get($campaign_external_id);

                    if (!$campaign) {
                        continue;
                    }

//                    if ($retargetinglist_external_id) {
//                        /* @var $retargetinglist Retargetinglist|null */
//                        $retargetinglist = $retargetinglists->get($retargetinglist_external_id);
//
//                        if (!$retargetinglist) {
//                            continue;
//                        }
//                    }

                    $interest_external_id = (string)$audience_target['InterestId'];

                    $data = [
                        'external_id' => $external_id,
                        'ad_group_external_id' => $adGroup->external_id,
                        'ad_group_id' => $adGroup->getKey(),
                        'campaign_external_id' => $campaign->external_id,
                        'campaign_id' => $campaign->getKey(),
                        'retargetinglist_external_id' => $retargetinglist_external_id ?? null,
//                        'retargetinglist_id' => $retargetinglist_external_id ? $retargetinglist->getKey() : null,
                        'interest_external_id' => $interest_external_id ?? null,
                        'context_bid' => (string)$audience_target['ContextBid'],
                        'strategy_priority' => $audience_target['StrategyPriority'],
                    ];

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

                    if (!$audienceTarget->wasRecentlyCreated && $audienceTarget->wasChanged($audienceTarget::getPropertiesWatch()->toArray())) {
                        $audienceTarget->goalAudienceTargets()->forExternal()->update([
                            'updated_need' => Carbon::now(),
                        ]);
                    }

                } else {
                    //
                }

            }

        } catch (\Exception $e) {
            Log::debug($e);
            throw $e;
        }
    }

    private function requestPrepare($filter)
    {
        $this->setService('AudienceTargets');
        $this->setMethod('get');
        $params = [
            "FieldNames" => [
                "Id", "AdGroupId", "CampaignId",
                "RetargetingListId", "InterestId",
                "ContextBid", "StrategyPriority",
            ],
            'SelectionCriteria' => [
//                'States' => [
//                    "ON", "SUSPENDED",
//                ],
            ]
        ];
        if (isset($filter['Ids'])) {

            $this->max_count = $this->max_count_Ids;

            $params['SelectionCriteria']['Ids'] = $filter['Ids'];
        }
        if (isset($filter['AdGroupIds'])) {

            $this->max_count = $this->max_count_AdGroupIds;

            $params['SelectionCriteria']['AdGroupIds'] = $filter['AdGroupIds'];
        }
        if (isset($filter['RetargetingListIds'])) {

            $this->max_count = $this->max_count_RetargetingListIds;

            $params['SelectionCriteria']['RetargetingListIds'] = $filter['RetargetingListIds'];
        }
        if (isset($filter['CampaignIds'])) {

            $this->max_count = $this->max_count_CampaignIds;

            $params['SelectionCriteria']['CampaignIds'] = $filter['CampaignIds'];
        }
        $this->setParams($params);
    }
}