Commit b938ba51 by Vladislav

#19472 Синхронизация групп с целевыми

1 parent fbb8704d
<?php
namespace App\Console\Commands;
use App\Jobs\ProcessCallLimitedAPI;
use App\Models\AdGroup;
use App\Models\Campaigns;
use App\Models\Pivots\DictionaryCampaign;
use App\Models\Tokens;
use App\Service\API\API;
use App\Service\Direct\CheckDictionaries;
use App\Service\Direct\GetCampaigns;
use App\Service\Requests\APIRequest;
use Illuminate\Console\Command;
use Illuminate\Database\Eloquent\Relations\HasManyThrough;
use Illuminate\Support\Facades\Bus;
class AdGroupLoadUpdated extends Command
{
/**
* The name and signature of the console command.
*
* @var string
*/
protected $signature = 'adgroups:loadUpdated';
/**
* The console command description.
*
* @var string
*/
protected $description = 'Загрузка измененные группы';
/**
* Create a new command instance.
*
* @return void
*/
public function __construct()
{
parent::__construct();
}
/**
* Execute the console command.
*
* @return int
*/
public function handle()
{
$campaigns = AdGroup::forUpdatedSelf()->get();
if (!$campaigns->count()) {
return;
}
$token = Tokens::where('type', Tokens::MAIN)->first();
if (!$token) {
throw new \Exception('Не найден токен блин');
}
$factory = APIRequest::getInstance(API::YANDEX);
$factory->setToken($token);
$factory->getRequest('Campaigns', 'get')->call([
'ids' => $campaigns->pluck('external_id')->all(),
]);
$tokens = Tokens::has('dictionaryCampaignsEnabledForExternalSynchronized.groupsForExternalForUpdatedSelf')
->with('dictionaryCampaignsEnabledForExternalSynchronized.groupsForExternalForUpdatedSelf')
->where('type', '!=', Tokens::MAIN)
->get();
foreach ($tokens as $token) {
$factory = APIRequest::getInstance(API::YANDEX);
$factory->setToken($token);
$factory->getRequest('AdGroups', 'get')->call([
'Ids' => $token->dictionaryCampaignsEnabledForExternalSynchronized->pluck('groupsForExternalForUpdatedSelf')
->collapse()->all(),
]);
}
return 0;
}
}
...@@ -55,7 +55,7 @@ class AdGroupsAdd extends Command ...@@ -55,7 +55,7 @@ class AdGroupsAdd extends Command
$factory->setToken($token); $factory->setToken($token);
$factory->getRequest('AdGroup', 'add') $factory->getRequest('AdGroups', 'add')
->call([ ->call([
'goalAdGroups' => $token->dictionaryCampaignsEnabledForExternal->pluck('groupsForNotExternal') 'goalAdGroups' => $token->dictionaryCampaignsEnabledForExternal->pluck('groupsForNotExternal')
->collapse(), ->collapse(),
......
<?php
namespace App\Console\Commands;
use App\Models\Tokens;
use App\Models\Variable;
use App\Service\API\API;
use App\Service\Requests\APIRequest;
use Illuminate\Console\Command;
use Illuminate\Database\Eloquent\Relations\HasManyThrough;
class AdGroupsUpdate extends Command
{
/**
* The name and signature of the console command.
*
* @var string
*/
protected $signature = 'adgroups:update';
/**
* The console command description.
*
* @var string
*/
protected $description = 'Изменение созданных групп целевого аккаунта';
/**
* Create a new command instance.
*
* @return void
*/
public function __construct()
{
parent::__construct();
}
/**
* Execute the console command.
*
* @return int
*/
public function handle()
{
$tokens = Tokens::whereHas('dictionaryCampaignsEnabledForExternal.groupsForExternalForNeedUpdated')
->with([
'dictionaryCampaignsEnabledForExternal.groupsForExternalForNeedUpdated.dictionaryCampaign',
'dictionaryCampaignsEnabledForExternal.groupsForExternalForNeedUpdated.group',
])
->where('type', '!=', Tokens::MAIN)
->get();
foreach ($tokens as $token) {
$factory = APIRequest::getInstance(API::YANDEX);
$factory->setToken($token);
$factory->getRequest('AdGroup', 'update')
->call([
'goalAdGroups' => $token->dictionaryCampaignsEnabledForExternal->pluck('groupsForExternalForNeedUpdated')
->collapse(),
]);
}
return 0;
}
}
...@@ -47,8 +47,7 @@ class CampaignsLoadUpdatedChildrenAdGroups extends Command ...@@ -47,8 +47,7 @@ class CampaignsLoadUpdatedChildrenAdGroups extends Command
*/ */
public function handle() public function handle()
{ {
$campaigns = Campaigns::forUpdatedChildren()->limit(3000)->get(); if (!Campaigns::forUpdatedChildren()->exists()) {
if (!$campaigns->count()) {
return; return;
} }
...@@ -61,7 +60,7 @@ class CampaignsLoadUpdatedChildrenAdGroups extends Command ...@@ -61,7 +60,7 @@ class CampaignsLoadUpdatedChildrenAdGroups extends Command
$factory->setToken($token); $factory->setToken($token);
$factory->getRequest('Changes', 'check')->call([ $factory->getRequest('Changes', 'check')->call([
'CampaignIds' => $campaigns->pluck('external_id')->all(), 'CampaignIds' => Campaigns::forUpdatedChildren()->pluck('external_id')->all(),
'FieldNames' => [ 'FieldNames' => [
'AdGroupIds', 'AdGroupIds',
], ],
...@@ -69,11 +68,7 @@ class CampaignsLoadUpdatedChildrenAdGroups extends Command ...@@ -69,11 +68,7 @@ class CampaignsLoadUpdatedChildrenAdGroups extends Command
]); ]);
$tokens = Tokens::has('dictionaryCampaignsEnabledForExternalSynchronizedUpdatedChildren') $tokens = Tokens::has('dictionaryCampaignsEnabledForExternalSynchronizedUpdatedChildren')
->with([ ->with('dictionaryCampaignsEnabledForExternalSynchronizedUpdatedChildren')
'dictionaryCampaignsEnabledForExternalSynchronizedUpdatedChildren' => function (HasManyThrough $query) {
return $query->limit(3000);
},
])
->where('type', '!=', Tokens::MAIN) ->where('type', '!=', Tokens::MAIN)
->get(); ->get();
......
...@@ -45,10 +45,7 @@ class CampaignsResume extends Command ...@@ -45,10 +45,7 @@ class CampaignsResume extends Command
{ {
/* /*
$token_main = Tokens::whereHas('campaignsEnabledDisabled') $token_main = Tokens::whereHas('campaignsEnabledDisabled')
->with([ ->with('campaignsEnabledDisabled'},
'campaignsEnabledDisabled' => function (HasMany $query) {
return $query->limit(1000);
},
])->where('type', Tokens::MAIN)->first(); ])->where('type', Tokens::MAIN)->first();
if ($token_main){ if ($token_main){
...@@ -63,11 +60,7 @@ class CampaignsResume extends Command ...@@ -63,11 +60,7 @@ class CampaignsResume extends Command
*/ */
$tokens = Tokens::whereHas('dictionaryCampaignsEnabledForExternalDisabled') $tokens = Tokens::whereHas('dictionaryCampaignsEnabledForExternalDisabled')
// ->with([ ->with('dictionaryCampaignsEnabledForExternalDisabled')
// 'dictionaryCampaignsEnabledForExternalDisabled' => function (HasManyThrough $query) {
// return $query->limit(1000);
// },
// ])
->where('type', '!=', Tokens::MAIN) ->where('type', '!=', Tokens::MAIN)
->get(); ->get();
......
...@@ -44,11 +44,8 @@ class CampaignsSuspend extends Command ...@@ -44,11 +44,8 @@ class CampaignsSuspend extends Command
{ {
/* /*
$token_main = Tokens::whereHas('campaignsNotEnabledNotDisabled') $token_main = Tokens::whereHas('campaignsNotEnabledNotDisabled')
->with([ ->with('campaignsNotEnabledNotDisabled')
'campaignsNotEnabledNotDisabled' => function (HasMany $query) { ->where('type', Tokens::MAIN)->first();
return $query->limit(1000);
},
])->where('type', Tokens::MAIN)->first();
if ($token_main){ if ($token_main){
$factory = APIRequest::getInstance(API::YANDEX); $factory = APIRequest::getInstance(API::YANDEX);
...@@ -62,11 +59,7 @@ class CampaignsSuspend extends Command ...@@ -62,11 +59,7 @@ class CampaignsSuspend extends Command
*/ */
$tokens = Tokens::whereHas('dictionaryCampaignsNotEnabledForExternalNotDisabled') $tokens = Tokens::whereHas('dictionaryCampaignsNotEnabledForExternalNotDisabled')
// ->with([ ->with('dictionaryCampaignsNotEnabledForExternalNotDisabled')
// 'dictionaryCampaignsNotEnabledForExternalNotDisabled' => function (HasManyThrough $query) {
// return $query->limit(1000);
// },
// ])
->where('type', '!=', Tokens::MAIN) ->where('type', '!=', Tokens::MAIN)
->get(); ->get();
......
...@@ -43,12 +43,7 @@ class CampaignsUpdate extends Command ...@@ -43,12 +43,7 @@ class CampaignsUpdate extends Command
public function handle() public function handle()
{ {
$tokens = Tokens::whereHas('dictionaryCampaignsEnabledForExternalNeedUpdated') $tokens = Tokens::whereHas('dictionaryCampaignsEnabledForExternalNeedUpdated')
// ->with([ ->with('dictionaryCampaignsEnabledForExternalNeedUpdated.campaign')
// 'dictionaryCampaignsEnabledForExternalNeedUpdated' => function (HasManyThrough $query) {
// return $query->limit(10);
// },
// 'dictionaryCampaignsEnabledForExternalNeedUpdated.campaign'
// ])
->where('type', '!=', Tokens::MAIN) ->where('type', '!=', Tokens::MAIN)
->get(); ->get();
......
...@@ -2,7 +2,9 @@ ...@@ -2,7 +2,9 @@
namespace App\Console; namespace App\Console;
use App\Console\Commands\AdGroupsAdd;
use App\Console\Commands\AdGroupsLoadUpdated; use App\Console\Commands\AdGroupsLoadUpdated;
use App\Console\Commands\AdGroupsUpdate;
use App\Console\Commands\CampaignsAdd; use App\Console\Commands\CampaignsAdd;
use App\Console\Commands\CampaignsCheckChange; use App\Console\Commands\CampaignsCheckChange;
use App\Console\Commands\CampaignsLoadGroups; use App\Console\Commands\CampaignsLoadGroups;
...@@ -45,7 +47,9 @@ class Kernel extends ConsoleKernel ...@@ -45,7 +47,9 @@ class Kernel extends ConsoleKernel
$schedule->command(CampaignsSuspend::class)->hourlyAt(20); $schedule->command(CampaignsSuspend::class)->hourlyAt(20);
$schedule->command(CampaignsLoadUpdatedChildrenAdGroups::class)->hourlyAt(35); $schedule->command(CampaignsLoadUpdatedChildrenAdGroups::class)->hourlyAt(35);
$schedule->command(CampaignsLoadGroups::class)->hourlyAt(40); $schedule->command(CampaignsLoadGroups::class)->hourlyAt(40);
$schedule->command(AdGroupsLoadUpdated::class)->hourlyAt(50); $schedule->command(AdGroupsLoadUpdated::class)->hourlyAt(45);
$schedule->command(AdGroupsAdd::class)->hourlyAt(50);
$schedule->command(AdGroupsUpdate::class)->hourlyAt(55);
} }
/** /**
......
...@@ -2,8 +2,11 @@ ...@@ -2,8 +2,11 @@
namespace App\Models; namespace App\Models;
use App\Models\Pivots\GoalAdGroup;
use Carbon\Carbon;
use Illuminate\Database\Eloquent\Builder; use Illuminate\Database\Eloquent\Builder;
use Illuminate\Database\Eloquent\Model; use Illuminate\Database\Eloquent\Model;
use Illuminate\Support\Collection;
/** /**
* App\Models\AdGroup * App\Models\AdGroup
...@@ -25,26 +28,30 @@ use Illuminate\Database\Eloquent\Model; ...@@ -25,26 +28,30 @@ use Illuminate\Database\Eloquent\Model;
* @property \Illuminate\Support\Carbon|null $updated_self * @property \Illuminate\Support\Carbon|null $updated_self
* @property \Illuminate\Support\Carbon|null $created_at * @property \Illuminate\Support\Carbon|null $created_at
* @property \Illuminate\Support\Carbon|null $updated_at * @property \Illuminate\Support\Carbon|null $updated_at
* @method static \Illuminate\Database\Eloquent\Builder|AdGroup forUpdatedSelf() * @property-read \App\Models\Campaigns $campaign
* @method static \Illuminate\Database\Eloquent\Builder|AdGroup newModelQuery() * @property-read \Illuminate\Database\Eloquent\Collection|GoalAdGroup[] $goalGroups
* @method static \Illuminate\Database\Eloquent\Builder|AdGroup newQuery() * @property-read int|null $goal_groups_count
* @method static \Illuminate\Database\Eloquent\Builder|AdGroup query() * @method static Builder|AdGroup forUpdatedSelf()
* @method static \Illuminate\Database\Eloquent\Builder|AdGroup whereCampaignExternalId($value) * @method static Builder|AdGroup newModelQuery()
* @method static \Illuminate\Database\Eloquent\Builder|AdGroup whereCampaignId($value) * @method static Builder|AdGroup newQuery()
* @method static \Illuminate\Database\Eloquent\Builder|AdGroup whereCreatedAt($value) * @method static Builder|AdGroup query()
* @method static \Illuminate\Database\Eloquent\Builder|AdGroup whereExternalId($value) * @method static Builder|AdGroup whereCampaignExternalId($value)
* @method static \Illuminate\Database\Eloquent\Builder|AdGroup whereId($value) * @method static Builder|AdGroup whereCampaignId($value)
* @method static \Illuminate\Database\Eloquent\Builder|AdGroup whereName($value) * @method static Builder|AdGroup whereCreatedAt($value)
* @method static \Illuminate\Database\Eloquent\Builder|AdGroup whereNegativeKeywordSharedSetIds($value) * @method static Builder|AdGroup whereExternalId($value)
* @method static \Illuminate\Database\Eloquent\Builder|AdGroup whereNegativeKeywords($value) * @method static Builder|AdGroup whereId($value)
* @method static \Illuminate\Database\Eloquent\Builder|AdGroup whereRegionIds($value) * @method static Builder|AdGroup whereName($value)
* @method static \Illuminate\Database\Eloquent\Builder|AdGroup whereRestrictedRegionIds($value) * @method static Builder|AdGroup whereNegativeKeywordSharedSetIds($value)
* @method static \Illuminate\Database\Eloquent\Builder|AdGroup whereServingStatus($value) * @method static Builder|AdGroup whereNegativeKeywords($value)
* @method static \Illuminate\Database\Eloquent\Builder|AdGroup whereStatus($value) * @method static Builder|AdGroup whereRegionIds($value)
* @method static \Illuminate\Database\Eloquent\Builder|AdGroup whereSubType($value) * @method static Builder|AdGroup whereRestrictedRegionIds($value)
* @method static \Illuminate\Database\Eloquent\Builder|AdGroup whereTrackingParams($value) * @method static Builder|AdGroup whereServingStatus($value)
* @method static \Illuminate\Database\Eloquent\Builder|AdGroup whereType($value) * @method static Builder|AdGroup whereStatus($value)
* @method static \Illuminate\Database\Eloquent\Builder|AdGroup whereUpdatedAt($value) * @method static Builder|AdGroup whereSubType($value)
* @method static Builder|AdGroup whereTrackingParams($value)
* @method static Builder|AdGroup whereType($value)
* @method static Builder|AdGroup whereUpdatedSelf($value)
* @method static Builder|AdGroup whereUpdatedAt($value)
* @mixin \Eloquent * @mixin \Eloquent
*/ */
class AdGroup extends Model class AdGroup extends Model
...@@ -113,35 +120,54 @@ class AdGroup extends Model ...@@ -113,35 +120,54 @@ class AdGroup extends Model
'updated_self' => 'datetime', 'updated_self' => 'datetime',
]; ];
/**
* @return Collection
*/
static public function getPropertiesWatch()
{
return collect([
'campaign_external_id',
'name',
'region_ids',
'negative_keywords',
'negative_keyword_shared_set_ids',
'tracking_params',
'mobile_app_ad_group',
'dynamic_text_ad_group',
'dynamic_text_feed_ad_group',
'cpm_banner_user_profile_ad_group',
'cpm_video_ad_group',
'smart_ad_group',
]);
}
public static function boot() public static function boot()
{ {
parent::boot(); parent::boot();
static::created(function (AdGroup $ad_group) { static::created(function (AdGroup $ad_group) {
// Dictionary::whereNotNull('token_id')->each(function (Dictionary $dictionary) use ($campaign) { if ($ad_group->campaign) {
// $campaign->dictionaries()->syncWithoutDetaching([ $ad_group->campaign->copyGroupInGoalGroup();
// $dictionary->getKey() => DictionaryCampaign::copyPropertyFromMain($campaign), }
// ]);
// });
}); });
static::updated(function (AdGroup $ad_group) { static::updated(function (AdGroup $ad_group) {
// if (DictionaryCampaign::getPropertiesCopyWithPivot()->first(function ($property_name) use ($campaign) { if (GoalAdGroup::getPropertiesCopyWithPivot()->first(function ($property_name) use ($ad_group) {
// return $campaign->{$property_name} !== $campaign->getOriginal($property_name); return $ad_group->{$property_name} !== $ad_group->getOriginal($property_name);
// })) { })) {
// $campaign->dictionaryCampaigns()->enabled()->synchronized()->update( $ad_group->goalGroups()->update(
// DictionaryCampaign::copyPropertyFromMain($campaign) GoalAdGroup::copyPropertyFromMain($ad_group)
// ); );
// } }
//
// if (self::getPropertiesWatch()->first(function ($property_name) use ($campaign) { if (self::getPropertiesWatch()->first(function ($property_name) use ($ad_group) {
// return $campaign->{$property_name} !== $campaign->getOriginal($property_name); return $ad_group->{$property_name} !== $ad_group->getOriginal($property_name);
// })) { })) {
// $campaign->dictionaryCampaigns()->enabled()->synchronized()->forExternal()->update([ $ad_group->goalGroups()->update([
// 'updated_need' => Carbon::now(), 'updated_need' => Carbon::now(),
// ]); ]);
// } }
}); });
} }
...@@ -151,4 +177,14 @@ class AdGroup extends Model ...@@ -151,4 +177,14 @@ class AdGroup extends Model
$query->whereNotNull("{$query->getModel()->getTable()}.updated_self"); $query->whereNotNull("{$query->getModel()->getTable()}.updated_self");
} }
public function goalGroups()
{
return $this->hasMany(GoalAdGroup::class, 'ad_group_id');
}
public function campaign()
{
return $this->belongsTo(Campaigns::class, 'campaign_id');
}
} }
...@@ -34,6 +34,7 @@ use Illuminate\Support\Collection; ...@@ -34,6 +34,7 @@ use Illuminate\Support\Collection;
* @property bool $manage * @property bool $manage
* @property bool $enabled * @property bool $enabled
* @property \Illuminate\Support\Carbon|null $groups_loaded_at * @property \Illuminate\Support\Carbon|null $groups_loaded_at
* @property \Illuminate\Support\Carbon|null $disabled_at
* @property \Illuminate\Support\Carbon|null $created_at * @property \Illuminate\Support\Carbon|null $created_at
* @property \Illuminate\Support\Carbon|null $updated_at * @property \Illuminate\Support\Carbon|null $updated_at
* @property-read \Illuminate\Database\Eloquent\Collection|\App\Models\Dictionary[] $dictionaries * @property-read \Illuminate\Database\Eloquent\Collection|\App\Models\Dictionary[] $dictionaries
...@@ -44,40 +45,43 @@ use Illuminate\Support\Collection; ...@@ -44,40 +45,43 @@ use Illuminate\Support\Collection;
* @property-read int|null $dictionary_campaign_variables_count * @property-read int|null $dictionary_campaign_variables_count
* @property-read \Illuminate\Database\Eloquent\Collection|\App\Models\Variable[] $dictionaryCampaigns * @property-read \Illuminate\Database\Eloquent\Collection|\App\Models\Variable[] $dictionaryCampaigns
* @property-read int|null $dictionary_campaigns_count * @property-read int|null $dictionary_campaigns_count
* @method static \Illuminate\Database\Eloquent\Builder|Campaigns forGroupsLoadable() * @method static Builder|Campaigns forGroupsLoadable()
* @method static \Illuminate\Database\Eloquent\Builder|Campaigns forManaged($value = true) * @method static Builder|Campaigns forManaged($value = true)
* @method static \Illuminate\Database\Eloquent\Builder|Campaigns forEnabled($value = true) * @method static Builder|Campaigns forEnabled($value = true)
* @method static \Illuminate\Database\Eloquent\Builder|Campaigns notDisabled() * @method static Builder|Campaigns notDisabled()
* @method static \Illuminate\Database\Eloquent\Builder|Campaigns disabled() * @method static Builder|Campaigns disabled()
* @method static \Illuminate\Database\Eloquent\Builder|Campaigns forUpdatedSelf() * @method static Builder|Campaigns forUpdatedSelf()
* @method static \Illuminate\Database\Eloquent\Builder|Campaigns forUpdatedChildren() * @method static Builder|Campaigns forUpdatedChildren()
* @method static \Illuminate\Database\Eloquent\Builder|Campaigns newModelQuery() * @method static Builder|Campaigns newModelQuery()
* @method static \Illuminate\Database\Eloquent\Builder|Campaigns newQuery() * @method static Builder|Campaigns newQuery()
* @method static \Illuminate\Database\Eloquent\Builder|Campaigns query() * @method static Builder|Campaigns query()
* @method static \Illuminate\Database\Eloquent\Builder|Campaigns whereAttributionModel($value) * @method static Builder|Campaigns whereAttributionModel($value)
* @method static \Illuminate\Database\Eloquent\Builder|Campaigns whereBlockedIps($value) * @method static Builder|Campaigns whereBlockedIps($value)
* @method static \Illuminate\Database\Eloquent\Builder|Campaigns whereCounterIds($value) * @method static Builder|Campaigns whereCounterIds($value)
* @method static \Illuminate\Database\Eloquent\Builder|Campaigns whereCreatedAt($value) * @method static Builder|Campaigns whereCreatedAt($value)
* @method static \Illuminate\Database\Eloquent\Builder|Campaigns whereDailyBudget($value) * @method static Builder|Campaigns whereDailyBudget($value)
* @method static \Illuminate\Database\Eloquent\Builder|Campaigns whereEnabled($value) * @method static Builder|Campaigns whereEnabled($value)
* @method static \Illuminate\Database\Eloquent\Builder|Campaigns whereExcludedSites($value) * @method static Builder|Campaigns whereExcludedSites($value)
* @method static \Illuminate\Database\Eloquent\Builder|Campaigns whereExternalId($value) * @method static Builder|Campaigns whereExternalId($value)
* @method static \Illuminate\Database\Eloquent\Builder|Campaigns whereGroupsLoadedAt($value) * @method static Builder|Campaigns whereGroupsLoadedAt($value)
* @method static \Illuminate\Database\Eloquent\Builder|Campaigns whereId($value) * @method static Builder|Campaigns whereId($value)
* @method static \Illuminate\Database\Eloquent\Builder|Campaigns whereManage($value) * @method static Builder|Campaigns whereManage($value)
* @method static \Illuminate\Database\Eloquent\Builder|Campaigns whereName($value) * @method static Builder|Campaigns whereName($value)
* @method static \Illuminate\Database\Eloquent\Builder|Campaigns whereNegativeKeywords($value) * @method static Builder|Campaigns whereNegativeKeywords($value)
* @method static \Illuminate\Database\Eloquent\Builder|Campaigns wherePriorityGoals($value) * @method static Builder|Campaigns wherePriorityGoals($value)
* @method static \Illuminate\Database\Eloquent\Builder|Campaigns whereRelevantKeywordsSettingBudgetPercent($value) * @method static Builder|Campaigns whereRelevantKeywordsSettingBudgetPercent($value)
* @method static \Illuminate\Database\Eloquent\Builder|Campaigns whereRelevantKeywordsSettingOptimizeGoalId($value) * @method static Builder|Campaigns whereRelevantKeywordsSettingOptimizeGoalId($value)
* @method static \Illuminate\Database\Eloquent\Builder|Campaigns whereSettings($value) * @method static Builder|Campaigns whereSettings($value)
* @method static \Illuminate\Database\Eloquent\Builder|Campaigns whereTextCampaignStrategyNetwork($value) * @method static Builder|Campaigns whereTextCampaignStrategyNetwork($value)
* @method static \Illuminate\Database\Eloquent\Builder|Campaigns whereTextCampaignStrategySearch($value) * @method static Builder|Campaigns whereTextCampaignStrategySearch($value)
* @method static \Illuminate\Database\Eloquent\Builder|Campaigns whereTimeTargeting($value) * @method static Builder|Campaigns whereTimeTargeting($value)
* @method static \Illuminate\Database\Eloquent\Builder|Campaigns whereToken($value) * @method static Builder|Campaigns whereToken($value)
* @method static \Illuminate\Database\Eloquent\Builder|Campaigns whereUpdatedSelf($value) * @method static Builder|Campaigns whereUpdatedSelf($value)
* @method static \Illuminate\Database\Eloquent\Builder|Campaigns whereUpdatedChildren($value) * @method static Builder|Campaigns whereUpdatedChildren($value)
* @method static \Illuminate\Database\Eloquent\Builder|Campaigns whereUpdatedAt($value) * @method static Builder|Campaigns whereBiddingStrategy($value)
* @method static Builder|Campaigns whereDisabledAt($value)
* @method static Builder|Campaigns whereRelevantKeywords($value)
* @method static Builder|Campaigns whereUpdatedAt($value)
* @mixin \Eloquent * @mixin \Eloquent
*/ */
class Campaigns extends Model class Campaigns extends Model
...@@ -172,6 +176,7 @@ class Campaigns extends Model ...@@ -172,6 +176,7 @@ class Campaigns extends Model
static::created(function (Campaigns $campaign) { static::created(function (Campaigns $campaign) {
if ($campaign->manage) { if ($campaign->manage) {
$campaign->copyInGoalCampaign(); $campaign->copyInGoalCampaign();
$campaign->copyGroupInGoalGroup();
} }
}); });
...@@ -180,8 +185,9 @@ class Campaigns extends Model ...@@ -180,8 +185,9 @@ class Campaigns extends Model
if ($campaign->manage !== $campaign->getOriginal('manage')) { if ($campaign->manage !== $campaign->getOriginal('manage')) {
if ($campaign->manage) { if ($campaign->manage) {
$campaign->copyInGoalCampaign(); $campaign->copyInGoalCampaign();
$campaign->copyGroupInGoalGroup();
} else { } else {
// $campaign->dictionaries()->detach(); $campaign->dictionaries()->detach();
} }
} }
...@@ -225,14 +231,9 @@ class Campaigns extends Model ...@@ -225,14 +231,9 @@ class Campaigns extends Model
$campaign->groups()->get()->each(function (AdGroup $adGroup) use ($dictionaryCampaign) { $campaign->groups()->get()->each(function (AdGroup $adGroup) use ($dictionaryCampaign) {
$dictionaryCampaign->groups()->create( $dictionaryCampaign->groups()->updateOrCreate([
array_merge( 'campaign_id' => $dictionaryCampaign->external_id,
GoalAdGroup::copyPropertyFromMain($adGroup), ], GoalAdGroup::copyPropertyFromMain($adGroup));
[
'campaign_external_id' => $dictionaryCampaign->external_id,
]
)
);
}); });
......
...@@ -18,6 +18,9 @@ use Illuminate\Support\Collection; ...@@ -18,6 +18,9 @@ use Illuminate\Support\Collection;
* @property-read DictionaryCampaignVariable[] $dictionaryCampaignVariables * @property-read DictionaryCampaignVariable[] $dictionaryCampaignVariables
* @property-read Variable[] $variables * @property-read Variable[] $variables
* @property-read GoalAdGroup[] $groups * @property-read GoalAdGroup[] $groups
* @property-read GoalAdGroup[] $groupsForNotExternal
* @property-read GoalAdGroup[] $groupsForExternalForUpdatedSelf
* @property-read GoalAdGroup[] $groupsForExternalForNeedUpdated
* @mixin \Eloquent * @mixin \Eloquent
* @property int $id * @property int $id
* @property int|null $external_id * @property int|null $external_id
...@@ -62,6 +65,18 @@ use Illuminate\Support\Collection; ...@@ -62,6 +65,18 @@ use Illuminate\Support\Collection;
* @method static \Illuminate\Database\Eloquent\Builder|DictionaryCampaign whereUpdated($value) * @method static \Illuminate\Database\Eloquent\Builder|DictionaryCampaign whereUpdated($value)
* @method static \Illuminate\Database\Eloquent\Builder|DictionaryCampaign whereUpdatedAt($value) * @method static \Illuminate\Database\Eloquent\Builder|DictionaryCampaign whereUpdatedAt($value)
* @method static Builder|DictionaryCampaign whereExternalUploadAt($value) * @method static Builder|DictionaryCampaign whereExternalUploadAt($value)
* @property \Illuminate\Support\Carbon|null $external_updated_at
* @property \Illuminate\Support\Carbon|null $updated_need
* @property \Illuminate\Support\Carbon|null $updated_self
* @property \Illuminate\Support\Carbon|null $updated_children
* @property \Illuminate\Support\Carbon|null $disabled_at
* @property \Illuminate\Support\Carbon|null $created_at
* @method static Builder|DictionaryCampaign whereDisabledAt($value)
* @method static Builder|DictionaryCampaign whereEnabled($value)
* @method static Builder|DictionaryCampaign whereExternalUpdatedAt($value)
* @method static Builder|DictionaryCampaign whereSynced($value)
* @method static Builder|DictionaryCampaign whereUpdatedChildren($value)
* @method static Builder|DictionaryCampaign whereUpdatedSelf($value)
*/ */
class DictionaryCampaign extends Pivot class DictionaryCampaign extends Pivot
{ {
...@@ -137,6 +152,8 @@ class DictionaryCampaign extends Pivot ...@@ -137,6 +152,8 @@ class DictionaryCampaign extends Pivot
/** /**
* @param Campaigns|array $campaign * @param Campaigns|array $campaign
*
* @return array
*/ */
static public function copyPropertyFromMain($campaign) static public function copyPropertyFromMain($campaign)
{ {
...@@ -258,4 +275,14 @@ class DictionaryCampaign extends Pivot ...@@ -258,4 +275,14 @@ class DictionaryCampaign extends Pivot
return $this->groups()->forNotExternal(); return $this->groups()->forNotExternal();
} }
public function groupsForExternalForUpdatedSelf()
{
return $this->groups()->forExternal()->forUpdatedSelf();
}
public function groupsForExternalForNeedUpdated()
{
return $this->groups()->forExternal()->needUpdated();
}
} }
...@@ -8,6 +8,50 @@ use Illuminate\Database\Eloquent\Builder; ...@@ -8,6 +8,50 @@ use Illuminate\Database\Eloquent\Builder;
use Illuminate\Database\Eloquent\Relations\Pivot; use Illuminate\Database\Eloquent\Relations\Pivot;
use Illuminate\Support\Collection; use Illuminate\Support\Collection;
/**
* App\Models\Pivots\GoalAdGroup
*
* @property int $id
* @property int|null $external_id
* @property int|null $campaign_external_id
* @property int $dictionary_campaign_id
* @property string|null $name
* @property array|null $negative_keywords
* @property \Illuminate\Support\Carbon|null $external_upload_at
* @property \Illuminate\Support\Carbon|null $external_updated_at
* @property \Illuminate\Support\Carbon|null $updated_need
* @property \Illuminate\Support\Carbon|null $updated_self
* @property \Illuminate\Support\Carbon|null $created_at
* @property \Illuminate\Support\Carbon|null $updated_at
* @property int|null $ad_group_id
* @property-read \App\Models\Pivots\DictionaryCampaign $dictionaryCampaign
* @property-read \Illuminate\Database\Eloquent\Collection|\App\Models\Pivots\DictionaryCampaignVariable[] $dictionaryCampaignVariables
* @property-read int|null $dictionary_campaign_variables_count
* @property-read AdGroup|null $group
* @property-read \Illuminate\Database\Eloquent\Collection|Variable[] $variables
* @property-read int|null $variables_count
* @method static Builder|GoalAdGroup forExternal()
* @method static Builder|GoalAdGroup forNotExternal()
* @method static Builder|GoalAdGroup forUpdatedSelf()
* @method static Builder|GoalAdGroup needUpdated()
* @method static Builder|GoalAdGroup newModelQuery()
* @method static Builder|GoalAdGroup newQuery()
* @method static Builder|GoalAdGroup query()
* @method static Builder|GoalAdGroup whereAdGroupId($value)
* @method static Builder|GoalAdGroup whereCampaignExternalId($value)
* @method static Builder|GoalAdGroup whereCreatedAt($value)
* @method static Builder|GoalAdGroup whereDictionaryCampaignId($value)
* @method static Builder|GoalAdGroup whereExternalId($value)
* @method static Builder|GoalAdGroup whereExternalUpdatedAt($value)
* @method static Builder|GoalAdGroup whereExternalUploadAt($value)
* @method static Builder|GoalAdGroup whereId($value)
* @method static Builder|GoalAdGroup whereName($value)
* @method static Builder|GoalAdGroup whereNegativeKeywords($value)
* @method static Builder|GoalAdGroup whereUpdatedAt($value)
* @method static Builder|GoalAdGroup whereUpdatedNeed($value)
* @method static Builder|GoalAdGroup whereUpdatedSelf($value)
* @mixin \Eloquent
*/
class GoalAdGroup extends Pivot class GoalAdGroup extends Pivot
{ {
...@@ -68,6 +112,8 @@ class GoalAdGroup extends Pivot ...@@ -68,6 +112,8 @@ class GoalAdGroup extends Pivot
/** /**
* @param AdGroup|array $ad_group * @param AdGroup|array $ad_group
*
* @return array
*/ */
static public function copyPropertyFromMain($ad_group) static public function copyPropertyFromMain($ad_group)
{ {
......
...@@ -41,12 +41,17 @@ use Illuminate\Database\Eloquent\Model; ...@@ -41,12 +41,17 @@ use Illuminate\Database\Eloquent\Model;
* @property-read \Illuminate\Database\Eloquent\Collection|DictionaryCampaign[] $dictionaryCampaignsNotEnabledForExternalNotDisabled * @property-read \Illuminate\Database\Eloquent\Collection|DictionaryCampaign[] $dictionaryCampaignsNotEnabledForExternalNotDisabled
* @property-read \Illuminate\Database\Eloquent\Collection|DictionaryCampaign[] $dictionaryCampaignsEnabledForExternalDisabled * @property-read \Illuminate\Database\Eloquent\Collection|DictionaryCampaign[] $dictionaryCampaignsEnabledForExternalDisabled
* @property-read \Illuminate\Database\Eloquent\Collection|DictionaryCampaign[] $dictionaryCampaignsEnabledForExternalNeedUpdated * @property-read \Illuminate\Database\Eloquent\Collection|DictionaryCampaign[] $dictionaryCampaignsEnabledForExternalNeedUpdated
* @property-read \Illuminate\Database\Eloquent\Collection|DictionaryCampaign[] $dictionaryCampaignsEnabledForExternalSynchronized
* @property-read \Illuminate\Database\Eloquent\Collection|DictionaryCampaign[] $dictionaryCampaignsEnabledForExternalSynchronizedUpdatedSelf * @property-read \Illuminate\Database\Eloquent\Collection|DictionaryCampaign[] $dictionaryCampaignsEnabledForExternalSynchronizedUpdatedSelf
* @property-read \Illuminate\Database\Eloquent\Collection|DictionaryCampaign[] $dictionaryCampaignsEnabledForExternalSynchronizedUpdatedChildren * @property-read \Illuminate\Database\Eloquent\Collection|DictionaryCampaign[] $dictionaryCampaignsEnabledForExternalSynchronizedUpdatedChildren
* @property-read \Illuminate\Database\Eloquent\Collection|\App\Models\Dictionary[] $campaignsForManaged * @property-read \Illuminate\Database\Eloquent\Collection|\App\Models\Dictionary[] $campaignsForManaged
* @property-read \Illuminate\Database\Eloquent\Collection|\App\Models\Dictionary[] $campaignsNotForManaged * @property-read \Illuminate\Database\Eloquent\Collection|\App\Models\Dictionary[] $campaignsNotForManaged
* @property-read \Illuminate\Database\Eloquent\Collection|\App\Models\Limits[] $limits * @property-read \Illuminate\Database\Eloquent\Collection|\App\Models\Limits[] $limits
* @property-read int|null $limits_count * @property-read int|null $limits_count
* @property string|null $timestamp
* @method static \Illuminate\Database\Eloquent\Builder|Tokens whereCheckChangesAdGroup($value)
* @method static \Illuminate\Database\Eloquent\Builder|Tokens whereCheckChangesCampaign($value)
* @method static \Illuminate\Database\Eloquent\Builder|Tokens whereTimestamp($value)
* @method static \Illuminate\Database\Eloquent\Builder|Tokens filter(array $filters) * @method static \Illuminate\Database\Eloquent\Builder|Tokens filter(array $filters)
* @method static \Illuminate\Database\Eloquent\Builder|Tokens newModelQuery() * @method static \Illuminate\Database\Eloquent\Builder|Tokens newModelQuery()
* @method static \Illuminate\Database\Eloquent\Builder|Tokens newQuery() * @method static \Illuminate\Database\Eloquent\Builder|Tokens newQuery()
...@@ -190,27 +195,32 @@ class Tokens extends Model ...@@ -190,27 +195,32 @@ class Tokens extends Model
public function dictionaryCampaignsNotEnabledForExternalNotDisabled() public function dictionaryCampaignsNotEnabledForExternalNotDisabled()
{ {
return $this->dictionaryCampaigns()->enabled(false)->forExternal()->notDisabled(); return $this->dictionaryCampaignsForExternal()->enabled(false)->notDisabled();
} }
public function dictionaryCampaignsEnabledForExternalDisabled() public function dictionaryCampaignsEnabledForExternalDisabled()
{ {
return $this->dictionaryCampaigns()->enabled()->forExternal()->disabled(); return $this->dictionaryCampaignsForExternal()->enabled()->disabled();
} }
public function dictionaryCampaignsEnabledForExternalNeedUpdated() public function dictionaryCampaignsEnabledForExternalNeedUpdated()
{ {
return $this->dictionaryCampaigns()->enabled()->forExternal()->needUpdated(); return $this->dictionaryCampaignsForExternal()->enabled()->needUpdated();
}
public function dictionaryCampaignsEnabledForExternalSynchronized()
{
return $this->dictionaryCampaignsForExternal()->enabled()->synchronized();
} }
public function dictionaryCampaignsEnabledForExternalSynchronizedUpdatedSelf() public function dictionaryCampaignsEnabledForExternalSynchronizedUpdatedSelf()
{ {
return $this->dictionaryCampaignsForExternal()->enabled()->synchronized()->forUpdatedSelf(); return $this->dictionaryCampaignsEnabledForExternalSynchronized()->forUpdatedSelf();
} }
public function dictionaryCampaignsEnabledForExternalSynchronizedUpdatedChildren() public function dictionaryCampaignsEnabledForExternalSynchronizedUpdatedChildren()
{ {
return $this->dictionaryCampaignsForExternal()->enabled()->synchronized()->forUpdatedChildren(); return $this->dictionaryCampaignsEnabledForExternalSynchronized()->forUpdatedChildren();
} }
public function campaignsForManaged() public function campaignsForManaged()
......
...@@ -14,7 +14,7 @@ use Carbon\Carbon; ...@@ -14,7 +14,7 @@ use Carbon\Carbon;
use Illuminate\Database\Eloquent\Collection; use Illuminate\Database\Eloquent\Collection;
use Illuminate\Support\Facades\Log; use Illuminate\Support\Facades\Log;
class AddAdGroup extends DirectRequest class AddAdGroups extends DirectRequest
{ {
protected $max_count = 1000; protected $max_count = 1000;
...@@ -36,7 +36,7 @@ class AddAdGroup extends DirectRequest ...@@ -36,7 +36,7 @@ class AddAdGroup extends DirectRequest
public function slice($maxObjects): ?APIRequest public function slice($maxObjects): ?APIRequest
{ {
$splinter = $this->sliceByKey($maxObjects, 'Campaigns'); $splinter = $this->sliceByKey($maxObjects, 'AdGroups');
$splinter->putParams([ $splinter->putParams([
'goalAdGroups' => $this->goalAdGroups->slice($maxObjects)->values(), 'goalAdGroups' => $this->goalAdGroups->slice($maxObjects)->values(),
...@@ -77,6 +77,7 @@ class AddAdGroup extends DirectRequest ...@@ -77,6 +77,7 @@ class AddAdGroup extends DirectRequest
} }
} catch (\Exception $e) { } catch (\Exception $e) {
Log::debug($e); Log::debug($e);
throw $e;
} }
} }
......
...@@ -6,6 +6,7 @@ use App\Jobs\ProcessCallLimitedAPI; ...@@ -6,6 +6,7 @@ use App\Jobs\ProcessCallLimitedAPI;
use App\Models\AdGroup; use App\Models\AdGroup;
use App\Models\Campaigns; use App\Models\Campaigns;
use App\Models\Pivots\DictionaryCampaign; use App\Models\Pivots\DictionaryCampaign;
use App\Models\Pivots\GoalAdGroup;
use App\Service\API\API; use App\Service\API\API;
use App\Service\Requests\APIRequest; use App\Service\Requests\APIRequest;
use App\Service\Requests\DirectRequest; use App\Service\Requests\DirectRequest;
...@@ -23,6 +24,34 @@ class CheckChanges extends DirectRequest ...@@ -23,6 +24,34 @@ class CheckChanges extends DirectRequest
dispatch($process)->onQueue('limits'); 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) public function handle($response)
{ {
if (isset($response['result']['NotFound'])) { if (isset($response['result']['NotFound'])) {
...@@ -36,12 +65,22 @@ class CheckChanges extends DirectRequest ...@@ -36,12 +65,22 @@ class CheckChanges extends DirectRequest
if (isset($response['result']['Modified']['AdGroupIds'])) { if (isset($response['result']['Modified']['AdGroupIds'])) {
foreach ($response['result']['Modified']['AdGroupIds'] as $ad_group_id) { foreach ($response['result']['Modified']['AdGroupIds'] as $ad_group_id) {
$adGroup = AdGroup::where('external_id', $ad_group_id)->first(); if ($this->getToken()->isMain()) {
$adGroup = AdGroup::where('external_id', $ad_group_id)->first();
if ($adGroup) {
$adGroup->update([ if ($adGroup) {
'updated_self' => Carbon::now(), $adGroup->update([
]); 'updated_self' => Carbon::now(),
]);
}
} else {
$goalAdGroup = GoalAdGroup::where('external_id', $ad_group_id)->first();
if ($goalAdGroup) {
$goalAdGroup->update([
'updated_self' => Carbon::now(),
]);
}
} }
} }
...@@ -77,6 +116,18 @@ class CheckChanges extends DirectRequest ...@@ -77,6 +116,18 @@ class CheckChanges extends DirectRequest
$this->setService('Changes'); $this->setService('Changes');
$this->setMethod('check'); $this->setMethod('check');
if (isset($params['CampaignIds'])){
$this->max_count = 3000;
}
if (isset($params['AdGroupIds'])){
$this->max_count = 10000;
}
if (isset($params['AdIds'])){
$this->max_count = 50000;
}
$this->setParams($params); $this->setParams($params);
} }
} }
...@@ -7,6 +7,7 @@ use App\Models\AdGroup; ...@@ -7,6 +7,7 @@ use App\Models\AdGroup;
use App\Models\Campaigns; use App\Models\Campaigns;
use App\Models\Pivots\DictionaryCampaign; use App\Models\Pivots\DictionaryCampaign;
use App\Models\Pivots\GoalAdGroup; use App\Models\Pivots\GoalAdGroup;
use App\Service\Contract\APIRequest;
use App\Service\Requests\DirectRequest; use App\Service\Requests\DirectRequest;
use Carbon\Carbon; use Carbon\Carbon;
use Illuminate\Support\Facades\DB; use Illuminate\Support\Facades\DB;
...@@ -23,6 +24,32 @@ class GetAdGroups extends DirectRequest ...@@ -23,6 +24,32 @@ class GetAdGroups extends DirectRequest
dispatch($process)->onQueue('limits'); dispatch($process)->onQueue('limits');
} }
public function getObjectsCount()
{
$params = $this->getParams();
if (isset($params['SelectionCriteria']['CampaignIds'])) {
return count($params['SelectionCriteria']['CampaignIds']);
}
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']['Ids'])) {
return $this->sliceByKey($maxObjects, ['SelectionCriteria', 'Ids']);
}
return null;
}
function handle($response) function handle($response)
{ {
DB::beginTransaction(); DB::beginTransaction();
...@@ -44,9 +71,15 @@ class GetAdGroups extends DirectRequest ...@@ -44,9 +71,15 @@ class GetAdGroups extends DirectRequest
return; return;
} }
$campaigns = Campaigns::whereIn('external_id', array_keys($external_ids)) if ($this->getToken()->isMain()) {
->get() $campaigns = Campaigns::whereIn('external_id', array_keys($external_ids))
->keyBy('external_id'); ->get()
->keyBy('external_id');
} else {
$campaigns = DictionaryCampaign::whereIn('external_id', array_keys($external_ids))
->get()
->keyBy('external_id');
}
foreach ($response['result']['AdGroups'] as $ad_group) { foreach ($response['result']['AdGroups'] as $ad_group) {
...@@ -55,8 +88,6 @@ class GetAdGroups extends DirectRequest ...@@ -55,8 +88,6 @@ class GetAdGroups extends DirectRequest
if (!$campaign) if (!$campaign)
continue; continue;
$campaign->groups_loaded_at = Carbon::now();
$campaign->save();
$external_id = $ad_group['Id']; $external_id = $ad_group['Id'];
...@@ -84,7 +115,6 @@ class GetAdGroups extends DirectRequest ...@@ -84,7 +115,6 @@ class GetAdGroups extends DirectRequest
'updated_self' => null, 'updated_self' => null,
]; ];
if ($this->getToken()->isMain()) { if ($this->getToken()->isMain()) {
AdGroup::updateOrCreate([ AdGroup::updateOrCreate([
'external_id' => $external_id 'external_id' => $external_id
...@@ -100,6 +130,10 @@ class GetAdGroups extends DirectRequest ...@@ -100,6 +130,10 @@ class GetAdGroups extends DirectRequest
); );
} }
$campaign->update([
'groups_loaded_at' => Carbon::now(),
]);
} }
DB::commit(); DB::commit();
...@@ -115,15 +149,22 @@ class GetAdGroups extends DirectRequest ...@@ -115,15 +149,22 @@ class GetAdGroups extends DirectRequest
$this->setService('AdGroups'); $this->setService('AdGroups');
$this->setMethod('get'); $this->setMethod('get');
$params = [ $params = [
'SelectionCriteria' => [
'CampaignIds' => $filter['CampaignIds'],
],
"FieldNames" => [ "FieldNames" => [
"Id", "CampaignId", "Name", "NegativeKeywords", "Id", "CampaignId", "Name", "NegativeKeywords",
"NegativeKeywordSharedSetIds", "RegionIds", "RestrictedRegionIds", "NegativeKeywordSharedSetIds", "RegionIds", "RestrictedRegionIds",
"ServingStatus", "Status", "Subtype", "TrackingParams", "Type", "ServingStatus", "Status", "Subtype", "TrackingParams", "Type",
], ],
]; ];
if (isset($filter['CampaignIds'])) {
$params['SelectionCriteria'] = [
'CampaignIds' => $filter['CampaignIds'],
];
}
if (isset($filter['Ids'])) {
$params['SelectionCriteria'] = [
'Ids' => $filter['Ids'],
];
}
$this->setParams($params); $this->setParams($params);
} }
} }
...@@ -5,6 +5,7 @@ namespace App\Service\Requests\Direct; ...@@ -5,6 +5,7 @@ namespace App\Service\Requests\Direct;
use App\Jobs\ProcessCallLimitedAPI; use App\Jobs\ProcessCallLimitedAPI;
use App\Models\Campaigns; use App\Models\Campaigns;
use App\Models\Pivots\DictionaryCampaign; use App\Models\Pivots\DictionaryCampaign;
use App\Service\Contract\APIRequest;
use App\Service\Requests\DirectRequest; use App\Service\Requests\DirectRequest;
use Illuminate\Support\Facades\Log; use Illuminate\Support\Facades\Log;
...@@ -26,7 +27,18 @@ class GetCampaigns extends DirectRequest ...@@ -26,7 +27,18 @@ class GetCampaigns extends DirectRequest
if (isset($params['SelectionCriteria']['Ids'])){ if (isset($params['SelectionCriteria']['Ids'])){
return count($params['SelectionCriteria']['Ids']); return count($params['SelectionCriteria']['Ids']);
} }
return parent::getObjectsCount(); return -1;
}
public function slice($maxObjects): ?APIRequest
{
$params = $this->getParams();
if (isset($params['SelectionCriteria']['Ids'])){
return $this->sliceByKey($maxObjects, ['SelectionCriteria', 'Ids']);
}
return null;
} }
public function handle($response) public function handle($response)
......
<?php
namespace App\Service\Requests\Direct;
use App\Jobs\ProcessCallLimitedAPI;
use App\Models\Campaigns;
use App\Models\Pivots\DictionaryCampaign;
use App\Models\Pivots\GoalAdGroup;
use App\Models\Variable;
use App\Service\Contract\APIRequest;
use App\Service\Requests\DirectRequest;
use App\Service\StrReplaceByVariables;
use Carbon\Carbon;
use Illuminate\Database\Eloquent\Collection;
use Illuminate\Support\Facades\Log;
class UpdateAdGroups extends DirectRequest
{
protected $max_count = 1000;
protected $timestamp;
/* @var Collection|GoalAdGroup[] */
protected $goalAdGroups;
public function call($params = null)
{
$this->requestPrepare($params);
$process = new ProcessCallLimitedAPI($this);
dispatch($process)->onQueue('limits');
}
public function getObjectsCount()
{
return count($this->getParams()['AdGroups']);
}
public function slice($maxObjects): ?APIRequest
{
return $this->sliceByKey($maxObjects, 'AdGroups');
}
public function handle($response)
{
try {
if (!isset($response['result']['UpdateResults'])) {
Log::debug($response);
Log::debug($this->getParams());
}
foreach ($response['result']['UpdateResults'] as $key => $update_result) {
$external_id = $update_result['Id'] ?? '';
if (!$external_id) {
Log::debug("AddAdGroup, empty Id");
Log::debug($update_result);
Log::debug($this->getParams());
continue;
}
GoalAdGroup::forExternal()->needUpdated()
->where('external_id', $external_id)
->update([
'updated_need' => null,
]);
}
} catch (\Exception $e) {
Log::debug($e);
throw $e;
}
}
private function requestPrepare($params)
{
$this->setService('AdGroups');
$this->setMethod('add');
$this->putParams($params);
$variables = Variable::all();
$this->setParams([
'AdGroups' => $this->goalAdGroups->map(function (GoalAdGroup $goalAdGroup) use ($variables) {
$list = Variable::getListVariablesByDictionaryCampaign($goalAdGroup->dictionaryCampaign, $variables);
$data = [
'Id' => $goalAdGroup->external_id,
'Name' => StrReplaceByVariables::getInstance($goalAdGroup->name, $list)->get(),
'RegionIds' => $goalAdGroup->group->region_ids,
];
if ($goalAdGroup->group->tracking_params) {
$data['TrackingParams'] = $goalAdGroup->group->tracking_params;
}
if ($goalAdGroup->group->mobile_app_ad_group && count($goalAdGroup->group->mobile_app_ad_group)) {
$data['MobileAppAdGroup'] = $goalAdGroup->group->mobile_app_ad_group;
}
if ($goalAdGroup->group->dynamic_text_ad_group && count($goalAdGroup->group->dynamic_text_ad_group)) {
$data['DynamicTextAdGroup'] = $goalAdGroup->group->dynamic_text_ad_group;
}
if ($goalAdGroup->group->smart_ad_group && count($goalAdGroup->group->smart_ad_group)) {
$data['SmartAdGroup'] = $goalAdGroup->group->smart_ad_group;
}
if ($goalAdGroup->negative_keywords && count($goalAdGroup->negative_keywords)) {
$data['NegativeKeywords'] = [
'Items' => array_map(function ($value) use ($list) {
return StrReplaceByVariables::getInstance($value, $list)->get();
}, $goalAdGroup->negative_keywords),
];
}
if ($goalAdGroup->group->negative_keyword_shared_set_ids && count($goalAdGroup->group->negative_keyword_shared_set_ids)) {
$data['NegativeKeywordSharedSetIds'] = [
'Items' => $goalAdGroup->group->negative_keyword_shared_set_ids,
];
}
return $data;
})->all(),
]);
}
}
...@@ -68,7 +68,7 @@ class DirectRequest extends APIRequest ...@@ -68,7 +68,7 @@ class DirectRequest extends APIRequest
$request->setToken($this->getToken()); $request->setToken($this->getToken());
return $request; return $request;
} }
throw new \Exception('Unknown Service or Method'); throw new \Exception("Unknown Service or Method \"{$class}\"");
return $this; return $this;
} }
......
<?php
namespace Tests\Unit;
use App\Jobs\ProcessCallLimitedAPI;
use App\Models\Account;
use App\Models\AdGroup;
use App\Models\Campaigns;
use App\Models\Dictionary;
use App\Models\Tokens;
use App\Models\User;
use App\Models\Variable;
use App\Service\Contract\API;
use App\Service\Requests\APIRequest;
use Illuminate\Support\Facades\Queue;
use Tests\TestCase;
use Illuminate\Foundation\Testing\RefreshDatabase;
class AddAdGroupTest extends TestCase
{
use RefreshDatabase;
private $request;
private $params;
private $user;
private $token;
private $token_main;
private $campaign;
private $dictionary;
protected function setUp(): void
{
parent::setUp();
$account = Account::create(['name' => 'Acme Corporation']);
$this->user = factory(User::class)->create([
'account_id' => $account->id,
'first_name' => 'John',
'last_name' => 'Doe',
'email' => 'johndoe@example.com',
'owner' => true,
]);
$this->token = factory(Tokens::class)->create([
'created_by' => $this->user->getKey()
]);
$this->token_main = factory(Tokens::class)->create([
'type' => Tokens::MAIN,
]);
$this->campaign = factory(Campaigns::class)->create([
'external_id' => 1,
'manage' => true,
'token' => $this->token_main->getKey(),
]);
$this->campaign = factory(AdGroup::class)->create([
'external_id' => 1,
'campaign_id' => $this->campaign->getKey(),
'campaign_external_id' => $this->campaign->external_id,
]);
$this->dictionary = factory(Dictionary::class)->create([
'region_id' => 1,
'type' => Dictionary::CITY,
]);
$this->request = APIRequest::getInstance(API::YANDEX)
->setToken($this->token)
->getRequest('Campaigns', 'add');
$this->actingAs($this->user)
->post(route('token.city.store', [
$this->token->id,
$this->dictionary->getKey(),
]))
->assertStatus(302);
$this->assertEquals(1, $this->dictionary->campaigns->count());
$this->params = [
'dictionaryCampaigns' => $this->token->dictionaryCampaignsEnabledForNotExternal,
'variables' => Variable::all(),
];
}
public function testCallApi()
{
Queue::fake();
Queue::assertNothingPushed();
$this->request->call($this->params);
Queue::assertPushed(ProcessCallLimitedAPI::class);
}
public function testHandleApi()
{
$this->dictionary->refresh();
$data = [
'result' => [
'AddResults' => [
[
'Id' => 1,
],
]
]
];
$this->request->putParams($this->params);
$this->request->handle($data);
$this->dictionary->campaigns->first()->pivot->refresh();
$this->assertEquals(1, $this->dictionary->campaigns->first()->pivot->external_id);
$this->assertNotNull(1, $this->dictionary->campaigns->first()->pivot->external_upload_at);
}
}
...@@ -7,6 +7,8 @@ use App\Models\Account; ...@@ -7,6 +7,8 @@ use App\Models\Account;
use App\Models\AdGroup; use App\Models\AdGroup;
use App\Models\Campaigns; use App\Models\Campaigns;
use App\Models\Dictionary; use App\Models\Dictionary;
use App\Models\Pivots\DictionaryCampaign;
use App\Models\Pivots\GoalAdGroup;
use App\Models\Tokens; use App\Models\Tokens;
use App\Models\User; use App\Models\User;
use App\Service\Contract\API; use App\Service\Contract\API;
...@@ -25,8 +27,11 @@ class CheckChangesAdGroupsTest extends TestCase ...@@ -25,8 +27,11 @@ class CheckChangesAdGroupsTest extends TestCase
private $token_main; private $token_main;
private $token; private $token;
private $dictionary; private $dictionary;
private $campaign;
private $request_main; private $request_main;
private $request_main_params; private $request_main_params;
private $ad_group;
private $ad_group_data;
protected function setUp(): void protected function setUp(): void
{ {
...@@ -47,18 +52,6 @@ class CheckChangesAdGroupsTest extends TestCase ...@@ -47,18 +52,6 @@ class CheckChangesAdGroupsTest extends TestCase
'created_by' => $this->user->id 'created_by' => $this->user->id
]); ]);
factory(Campaigns::class)->create([
'updated_children' => Carbon::now(),
'token' => $this->token_main->getKey(),
]);
$campaign = Campaigns::first();
factory(AdGroup::class)->create([
'campaign_external_id' => $campaign->external_id,
'campaign_id' => $campaign->getKey(),
]);
$this->token = factory(Tokens::class)->create([ $this->token = factory(Tokens::class)->create([
'created_by' => $this->user->id 'created_by' => $this->user->id
]); ]);
...@@ -68,6 +61,17 @@ class CheckChangesAdGroupsTest extends TestCase ...@@ -68,6 +61,17 @@ class CheckChangesAdGroupsTest extends TestCase
'type' => Dictionary::CITY, 'type' => Dictionary::CITY,
]); ]);
$this->campaign = factory(Campaigns::class)->create([
'manage' => true,
'updated_children' => Carbon::now(),
'token' => $this->token_main->getKey(),
]);
$this->ad_group = factory(AdGroup::class)->create([
'campaign_external_id' => $this->campaign->external_id,
'campaign_id' => $this->campaign->getKey(),
]);
$this->request_main = APIRequest::getInstance(API::YANDEX) $this->request_main = APIRequest::getInstance(API::YANDEX)
->setToken($this->token_main) ->setToken($this->token_main)
->getRequest('Changes', 'check'); ->getRequest('Changes', 'check');
...@@ -84,6 +88,36 @@ class CheckChangesAdGroupsTest extends TestCase ...@@ -84,6 +88,36 @@ class CheckChangesAdGroupsTest extends TestCase
->setToken($this->token) ->setToken($this->token)
->getRequest('Changes', 'check'); ->getRequest('Changes', 'check');
$this->ad_group_data = [
'result' => [
'AdGroups' => [
[
'Id' => $this->ad_group->external_id,
'Name' => 'Группа №1',
'CampaignId' => $this->campaign->external_id,
'Status' => 'ACCEPTED',
'Type' => 'TEXT_AD_GROUP',
'Subtype' => 'NONE',
'ServingStatus' => 'ELIGIBLE',
'RestrictedRegionIds' => NULL,
'RegionIds' =>
[
0 => 1,
],
'NegativeKeywords' =>
[
'Items' => [
'minusword1',
'minusword3',
],
],
'NegativeKeywordSharedSetIds' => NULL,
'TrackingParams' => '',
],
]
]
];
} }
public function testCallApi() public function testCallApi()
...@@ -100,24 +134,63 @@ class CheckChangesAdGroupsTest extends TestCase ...@@ -100,24 +134,63 @@ class CheckChangesAdGroupsTest extends TestCase
public function testHandleApi() public function testHandleApi()
{ {
$this->assertEquals(1, AdGroup::count()); $this->assertEquals(1, AdGroup::count());
$this->assertEquals(1, DictionaryCampaign::count());
$this->assertEquals(1, GoalAdGroup::count());
$this->assertEquals(0, AdGroup::forUpdatedSelf()->count()); $this->assertEquals(0, AdGroup::forUpdatedSelf()->count());
$this->assertEquals(1, Campaigns::forUpdatedChildren()->count()); $this->assertEquals(1, Campaigns::forUpdatedChildren()->count());
$this->assertEquals($this->ad_group->name, GoalAdGroup::first()->name);
$this->request_main->setParams($this->request_main_params); $this->request_main->setParams($this->request_main_params);
$this->request_main->handle([ $this->request_main->handle([
'result' => [ 'result' => [
'Modified' => [ 'Modified' => [
'AdGroupIds' => [ 'AdGroupIds' => [
AdGroup::first()->external_id, AdGroup::first()->external_id,
],
], ],
], 'Timestamp' => '2015-02-02T12:23:11Z',
'Timestamp' => '2015-02-02T12:23:11Z', ]
]
]); ]);
$this->assertEquals(1, AdGroup::forUpdatedSelf()->count()); $this->assertEquals(1, AdGroup::forUpdatedSelf()->count());
$this->assertEquals(0, Campaigns::forUpdatedChildren()->count()); $this->assertEquals(0, Campaigns::forUpdatedChildren()->count());
$this->request_main = APIRequest::getInstance(API::YANDEX)
->setToken($this->token_main)
->getRequest('AdGroups', 'get');
$this->request_main->handle($this->ad_group_data);
$this->ad_group->refresh();
$this->assertEquals(0, AdGroup::forUpdatedSelf()->count());
$this->assertEquals($this->ad_group_data['result']['AdGroups'][0]['Name'], $this->ad_group->name);
$this->assertEquals($this->ad_group_data['result']['AdGroups'][0]['Name'], GoalAdGroup::first()->name);
$this->assertEquals(1, GoalAdGroup::needUpdated()->count());
$goalAdGroup = GoalAdGroup::needUpdated()->first();
$goalAdGroup->update([
'external_id' => 1,
]);
$this->request_main = APIRequest::getInstance(API::YANDEX)
->setToken($this->token_main)
->getRequest('AdGroups', 'update');
$this->request_main->handle([
'result' => [
'UpdateResults' => [
[
'Id' => GoalAdGroup::needUpdated()->first()->external_id,
],
]
]
]);
$this->assertEquals(0, GoalAdGroup::needUpdated()->count());
} }
} }
...@@ -67,6 +67,7 @@ class GetAdGroupTest extends TestCase ...@@ -67,6 +67,7 @@ class GetAdGroupTest extends TestCase
]); ]);
$this->token = factory(Tokens::class)->create([ $this->token = factory(Tokens::class)->create([
'type' => 'main',
'created_by' => $this->user->id 'created_by' => $this->user->id
]); ]);
......
...@@ -161,12 +161,7 @@ class LimitsTest extends TestCase ...@@ -161,12 +161,7 @@ class LimitsTest extends TestCase
$this->token->limit = 191; $this->token->limit = 191;
$requestCmpgn->call(); $requestCmpgn->call();
$objects = $this->limitService->countObjectsLimit($requestCmpgn); $objects = $this->limitService->countObjectsLimit($requestCmpgn);
$this->assertEquals($objects, 181); $this->assertEquals($objects, -1);
$this->token->limit = $requestCmpgn->getMaxCount() + 100;
$requestCmpgn->call();
$objects = $this->limitService->countObjectsLimit($requestCmpgn);
$this->assertEquals($objects, $requestCmpgn->getMaxCount());
$requestCmpgn = $request->getRequest('Campaigns', 'update'); $requestCmpgn = $request->getRequest('Campaigns', 'update');
$this->token->limit = 191; $this->token->limit = 191;
......
Markdown is supported
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!