GetAdGroups.php 3.71 KB
<?php

namespace App\Service\Requests\Direct;

use App\Jobs\ProcessCallLimitedAPI;
use App\Models\AdGroup;
use App\Models\Campaigns;
use App\Service\Requests\DirectRequest;
use Carbon\Carbon;
use Illuminate\Support\Facades\DB;
use Illuminate\Support\Facades\Log;

class GetAdGroups extends DirectRequest
{

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

    function handle($response)
    {
        DB::beginTransaction();
        try {
            $data = [];

            $external_ids = [];

            foreach ($response['result']['AdGroups'] as $ad_group) {
                if (isset($external_ids[$ad_group['CampaignId']])) {
                    continue;
                }
                $external_ids[$ad_group['CampaignId']] = true;
            }

            if (!count($external_ids)) {
                return;
            }

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

            foreach ($response['result']['AdGroups'] as $ad_group) {

                $campaign = $campaigns->get($ad_group['CampaignId']);

                if (!$campaign)
                    continue;

                $campaign->groups_loaded_at = Carbon::now();
                $campaign->save();

                $data[] = [
                    'campaign_id' => $campaign->getKey(),
                    'external_id' => $ad_group['Id'],
                    'campaign_external_id' => $ad_group['CampaignId'],
                    'name' => $ad_group['Name'],
                    'status' => $ad_group['Status'],
                    'type' => $ad_group['Type'],
                    'sub_type' => $ad_group['Subtype'],
                    'serving_status' => $ad_group['ServingStatus'],
                    'restricted_region_ids' => $ad_group['RestrictedRegionIds'] ? json_encode($ad_group['RestrictedRegionIds']) : null,
                    'region_ids' => $ad_group['RegionIds'] ? json_encode($ad_group['RegionIds']) : null,
                    'negative_keywords' => $ad_group['NegativeKeywords'] ? json_encode($ad_group['NegativeKeywords']) : null,
                    'negative_keyword_shared_set_ids' => $ad_group['NegativeKeywordSharedSetIds'] ? json_encode($ad_group['NegativeKeywordSharedSetIds']) : null,
                    'tracking_params' => $ad_group['TrackingParams'],
                ];
            }

            AdGroup::upsert($data, [
                'external_id'
            ], [
                'campaign_id',
                'external_id',
                'campaign_external_id',
                'name',
                'status',
                'type',
                'sub_type',
                'serving_status',
                'restricted_region_ids',
                'region_ids',
                'negative_keywords',
                'negative_keyword_shared_set_ids',
                'tracking_params',
            ]);
            DB::commit();
        } catch (\Exception $e) {
            DB::rollBack();
            Log::debug($e);
        }
    }

    private function requestPrepare($filter)
    {
        $this->setService('adgroups');
        $this->setMethod('get');
        $params = [
            'SelectionCriteria' =>  [
                'CampaignIds' => $filter['CampaignIds'],
            ],
            "FieldNames" => [
                "Id", "CampaignId", "Name", "NegativeKeywords",
                "NegativeKeywordSharedSetIds", "RegionIds", "RestrictedRegionIds",
                "ServingStatus", "Status", "Subtype", "TrackingParams", "Type",
            ],
        ];
        $this->setParams($params);
    }
}