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
$factory->setToken($token);
$factory->getRequest('AdGroup', 'add')
$factory->getRequest('AdGroups', 'add')
->call([
'goalAdGroups' => $token->dictionaryCampaignsEnabledForExternal->pluck('groupsForNotExternal')
->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
*/
public function handle()
{
$campaigns = Campaigns::forUpdatedChildren()->limit(3000)->get();
if (!$campaigns->count()) {
if (!Campaigns::forUpdatedChildren()->exists()) {
return;
}
......@@ -61,7 +60,7 @@ class CampaignsLoadUpdatedChildrenAdGroups extends Command
$factory->setToken($token);
$factory->getRequest('Changes', 'check')->call([
'CampaignIds' => $campaigns->pluck('external_id')->all(),
'CampaignIds' => Campaigns::forUpdatedChildren()->pluck('external_id')->all(),
'FieldNames' => [
'AdGroupIds',
],
......@@ -69,11 +68,7 @@ class CampaignsLoadUpdatedChildrenAdGroups extends Command
]);
$tokens = Tokens::has('dictionaryCampaignsEnabledForExternalSynchronizedUpdatedChildren')
->with([
'dictionaryCampaignsEnabledForExternalSynchronizedUpdatedChildren' => function (HasManyThrough $query) {
return $query->limit(3000);
},
])
->with('dictionaryCampaignsEnabledForExternalSynchronizedUpdatedChildren')
->where('type', '!=', Tokens::MAIN)
->get();
......
......@@ -45,10 +45,7 @@ class CampaignsResume extends Command
{
/*
$token_main = Tokens::whereHas('campaignsEnabledDisabled')
->with([
'campaignsEnabledDisabled' => function (HasMany $query) {
return $query->limit(1000);
},
->with('campaignsEnabledDisabled'},
])->where('type', Tokens::MAIN)->first();
if ($token_main){
......@@ -63,11 +60,7 @@ class CampaignsResume extends Command
*/
$tokens = Tokens::whereHas('dictionaryCampaignsEnabledForExternalDisabled')
// ->with([
// 'dictionaryCampaignsEnabledForExternalDisabled' => function (HasManyThrough $query) {
// return $query->limit(1000);
// },
// ])
->with('dictionaryCampaignsEnabledForExternalDisabled')
->where('type', '!=', Tokens::MAIN)
->get();
......
......@@ -44,11 +44,8 @@ class CampaignsSuspend extends Command
{
/*
$token_main = Tokens::whereHas('campaignsNotEnabledNotDisabled')
->with([
'campaignsNotEnabledNotDisabled' => function (HasMany $query) {
return $query->limit(1000);
},
])->where('type', Tokens::MAIN)->first();
->with('campaignsNotEnabledNotDisabled')
->where('type', Tokens::MAIN)->first();
if ($token_main){
$factory = APIRequest::getInstance(API::YANDEX);
......@@ -62,11 +59,7 @@ class CampaignsSuspend extends Command
*/
$tokens = Tokens::whereHas('dictionaryCampaignsNotEnabledForExternalNotDisabled')
// ->with([
// 'dictionaryCampaignsNotEnabledForExternalNotDisabled' => function (HasManyThrough $query) {
// return $query->limit(1000);
// },
// ])
->with('dictionaryCampaignsNotEnabledForExternalNotDisabled')
->where('type', '!=', Tokens::MAIN)
->get();
......
......@@ -43,12 +43,7 @@ class CampaignsUpdate extends Command
public function handle()
{
$tokens = Tokens::whereHas('dictionaryCampaignsEnabledForExternalNeedUpdated')
// ->with([
// 'dictionaryCampaignsEnabledForExternalNeedUpdated' => function (HasManyThrough $query) {
// return $query->limit(10);
// },
// 'dictionaryCampaignsEnabledForExternalNeedUpdated.campaign'
// ])
->with('dictionaryCampaignsEnabledForExternalNeedUpdated.campaign')
->where('type', '!=', Tokens::MAIN)
->get();
......
......@@ -2,7 +2,9 @@
namespace App\Console;
use App\Console\Commands\AdGroupsAdd;
use App\Console\Commands\AdGroupsLoadUpdated;
use App\Console\Commands\AdGroupsUpdate;
use App\Console\Commands\CampaignsAdd;
use App\Console\Commands\CampaignsCheckChange;
use App\Console\Commands\CampaignsLoadGroups;
......@@ -45,7 +47,9 @@ class Kernel extends ConsoleKernel
$schedule->command(CampaignsSuspend::class)->hourlyAt(20);
$schedule->command(CampaignsLoadUpdatedChildrenAdGroups::class)->hourlyAt(35);
$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 @@
namespace App\Models;
use App\Models\Pivots\GoalAdGroup;
use Carbon\Carbon;
use Illuminate\Database\Eloquent\Builder;
use Illuminate\Database\Eloquent\Model;
use Illuminate\Support\Collection;
/**
* App\Models\AdGroup
......@@ -25,26 +28,30 @@ use Illuminate\Database\Eloquent\Model;
* @property \Illuminate\Support\Carbon|null $updated_self
* @property \Illuminate\Support\Carbon|null $created_at
* @property \Illuminate\Support\Carbon|null $updated_at
* @method static \Illuminate\Database\Eloquent\Builder|AdGroup forUpdatedSelf()
* @method static \Illuminate\Database\Eloquent\Builder|AdGroup newModelQuery()
* @method static \Illuminate\Database\Eloquent\Builder|AdGroup newQuery()
* @method static \Illuminate\Database\Eloquent\Builder|AdGroup query()
* @method static \Illuminate\Database\Eloquent\Builder|AdGroup whereCampaignExternalId($value)
* @method static \Illuminate\Database\Eloquent\Builder|AdGroup whereCampaignId($value)
* @method static \Illuminate\Database\Eloquent\Builder|AdGroup whereCreatedAt($value)
* @method static \Illuminate\Database\Eloquent\Builder|AdGroup whereExternalId($value)
* @method static \Illuminate\Database\Eloquent\Builder|AdGroup whereId($value)
* @method static \Illuminate\Database\Eloquent\Builder|AdGroup whereName($value)
* @method static \Illuminate\Database\Eloquent\Builder|AdGroup whereNegativeKeywordSharedSetIds($value)
* @method static \Illuminate\Database\Eloquent\Builder|AdGroup whereNegativeKeywords($value)
* @method static \Illuminate\Database\Eloquent\Builder|AdGroup whereRegionIds($value)
* @method static \Illuminate\Database\Eloquent\Builder|AdGroup whereRestrictedRegionIds($value)
* @method static \Illuminate\Database\Eloquent\Builder|AdGroup whereServingStatus($value)
* @method static \Illuminate\Database\Eloquent\Builder|AdGroup whereStatus($value)
* @method static \Illuminate\Database\Eloquent\Builder|AdGroup whereSubType($value)
* @method static \Illuminate\Database\Eloquent\Builder|AdGroup whereTrackingParams($value)
* @method static \Illuminate\Database\Eloquent\Builder|AdGroup whereType($value)
* @method static \Illuminate\Database\Eloquent\Builder|AdGroup whereUpdatedAt($value)
* @property-read \App\Models\Campaigns $campaign
* @property-read \Illuminate\Database\Eloquent\Collection|GoalAdGroup[] $goalGroups
* @property-read int|null $goal_groups_count
* @method static Builder|AdGroup forUpdatedSelf()
* @method static Builder|AdGroup newModelQuery()
* @method static Builder|AdGroup newQuery()
* @method static Builder|AdGroup query()
* @method static Builder|AdGroup whereCampaignExternalId($value)
* @method static Builder|AdGroup whereCampaignId($value)
* @method static Builder|AdGroup whereCreatedAt($value)
* @method static Builder|AdGroup whereExternalId($value)
* @method static Builder|AdGroup whereId($value)
* @method static Builder|AdGroup whereName($value)
* @method static Builder|AdGroup whereNegativeKeywordSharedSetIds($value)
* @method static Builder|AdGroup whereNegativeKeywords($value)
* @method static Builder|AdGroup whereRegionIds($value)
* @method static Builder|AdGroup whereRestrictedRegionIds($value)
* @method static Builder|AdGroup whereServingStatus($value)
* @method static Builder|AdGroup whereStatus($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
*/
class AdGroup extends Model
......@@ -113,35 +120,54 @@ class AdGroup extends Model
'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()
{
parent::boot();
static::created(function (AdGroup $ad_group) {
// Dictionary::whereNotNull('token_id')->each(function (Dictionary $dictionary) use ($campaign) {
// $campaign->dictionaries()->syncWithoutDetaching([
// $dictionary->getKey() => DictionaryCampaign::copyPropertyFromMain($campaign),
// ]);
// });
if ($ad_group->campaign) {
$ad_group->campaign->copyGroupInGoalGroup();
}
});
static::updated(function (AdGroup $ad_group) {
// if (DictionaryCampaign::getPropertiesCopyWithPivot()->first(function ($property_name) use ($campaign) {
// return $campaign->{$property_name} !== $campaign->getOriginal($property_name);
// })) {
// $campaign->dictionaryCampaigns()->enabled()->synchronized()->update(
// DictionaryCampaign::copyPropertyFromMain($campaign)
// );
// }
//
// if (self::getPropertiesWatch()->first(function ($property_name) use ($campaign) {
// return $campaign->{$property_name} !== $campaign->getOriginal($property_name);
// })) {
// $campaign->dictionaryCampaigns()->enabled()->synchronized()->forExternal()->update([
// 'updated_need' => Carbon::now(),
// ]);
// }
if (GoalAdGroup::getPropertiesCopyWithPivot()->first(function ($property_name) use ($ad_group) {
return $ad_group->{$property_name} !== $ad_group->getOriginal($property_name);
})) {
$ad_group->goalGroups()->update(
GoalAdGroup::copyPropertyFromMain($ad_group)
);
}
if (self::getPropertiesWatch()->first(function ($property_name) use ($ad_group) {
return $ad_group->{$property_name} !== $ad_group->getOriginal($property_name);
})) {
$ad_group->goalGroups()->update([
'updated_need' => Carbon::now(),
]);
}
});
}
......@@ -151,4 +177,14 @@ class AdGroup extends Model
$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;
* @property bool $manage
* @property bool $enabled
* @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 $updated_at
* @property-read \Illuminate\Database\Eloquent\Collection|\App\Models\Dictionary[] $dictionaries
......@@ -44,40 +45,43 @@ use Illuminate\Support\Collection;
* @property-read int|null $dictionary_campaign_variables_count
* @property-read \Illuminate\Database\Eloquent\Collection|\App\Models\Variable[] $dictionaryCampaigns
* @property-read int|null $dictionary_campaigns_count
* @method static \Illuminate\Database\Eloquent\Builder|Campaigns forGroupsLoadable()
* @method static \Illuminate\Database\Eloquent\Builder|Campaigns forManaged($value = true)
* @method static \Illuminate\Database\Eloquent\Builder|Campaigns forEnabled($value = true)
* @method static \Illuminate\Database\Eloquent\Builder|Campaigns notDisabled()
* @method static \Illuminate\Database\Eloquent\Builder|Campaigns disabled()
* @method static \Illuminate\Database\Eloquent\Builder|Campaigns forUpdatedSelf()
* @method static \Illuminate\Database\Eloquent\Builder|Campaigns forUpdatedChildren()
* @method static \Illuminate\Database\Eloquent\Builder|Campaigns newModelQuery()
* @method static \Illuminate\Database\Eloquent\Builder|Campaigns newQuery()
* @method static \Illuminate\Database\Eloquent\Builder|Campaigns query()
* @method static \Illuminate\Database\Eloquent\Builder|Campaigns whereAttributionModel($value)
* @method static \Illuminate\Database\Eloquent\Builder|Campaigns whereBlockedIps($value)
* @method static \Illuminate\Database\Eloquent\Builder|Campaigns whereCounterIds($value)
* @method static \Illuminate\Database\Eloquent\Builder|Campaigns whereCreatedAt($value)
* @method static \Illuminate\Database\Eloquent\Builder|Campaigns whereDailyBudget($value)
* @method static \Illuminate\Database\Eloquent\Builder|Campaigns whereEnabled($value)
* @method static \Illuminate\Database\Eloquent\Builder|Campaigns whereExcludedSites($value)
* @method static \Illuminate\Database\Eloquent\Builder|Campaigns whereExternalId($value)
* @method static \Illuminate\Database\Eloquent\Builder|Campaigns whereGroupsLoadedAt($value)
* @method static \Illuminate\Database\Eloquent\Builder|Campaigns whereId($value)
* @method static \Illuminate\Database\Eloquent\Builder|Campaigns whereManage($value)
* @method static \Illuminate\Database\Eloquent\Builder|Campaigns whereName($value)
* @method static \Illuminate\Database\Eloquent\Builder|Campaigns whereNegativeKeywords($value)
* @method static \Illuminate\Database\Eloquent\Builder|Campaigns wherePriorityGoals($value)
* @method static \Illuminate\Database\Eloquent\Builder|Campaigns whereRelevantKeywordsSettingBudgetPercent($value)
* @method static \Illuminate\Database\Eloquent\Builder|Campaigns whereRelevantKeywordsSettingOptimizeGoalId($value)
* @method static \Illuminate\Database\Eloquent\Builder|Campaigns whereSettings($value)
* @method static \Illuminate\Database\Eloquent\Builder|Campaigns whereTextCampaignStrategyNetwork($value)
* @method static \Illuminate\Database\Eloquent\Builder|Campaigns whereTextCampaignStrategySearch($value)
* @method static \Illuminate\Database\Eloquent\Builder|Campaigns whereTimeTargeting($value)
* @method static \Illuminate\Database\Eloquent\Builder|Campaigns whereToken($value)
* @method static \Illuminate\Database\Eloquent\Builder|Campaigns whereUpdatedSelf($value)
* @method static \Illuminate\Database\Eloquent\Builder|Campaigns whereUpdatedChildren($value)
* @method static \Illuminate\Database\Eloquent\Builder|Campaigns whereUpdatedAt($value)
* @method static Builder|Campaigns forGroupsLoadable()
* @method static Builder|Campaigns forManaged($value = true)
* @method static Builder|Campaigns forEnabled($value = true)
* @method static Builder|Campaigns notDisabled()
* @method static Builder|Campaigns disabled()
* @method static Builder|Campaigns forUpdatedSelf()
* @method static Builder|Campaigns forUpdatedChildren()
* @method static Builder|Campaigns newModelQuery()
* @method static Builder|Campaigns newQuery()
* @method static Builder|Campaigns query()
* @method static Builder|Campaigns whereAttributionModel($value)
* @method static Builder|Campaigns whereBlockedIps($value)
* @method static Builder|Campaigns whereCounterIds($value)
* @method static Builder|Campaigns whereCreatedAt($value)
* @method static Builder|Campaigns whereDailyBudget($value)
* @method static Builder|Campaigns whereEnabled($value)
* @method static Builder|Campaigns whereExcludedSites($value)
* @method static Builder|Campaigns whereExternalId($value)
* @method static Builder|Campaigns whereGroupsLoadedAt($value)
* @method static Builder|Campaigns whereId($value)
* @method static Builder|Campaigns whereManage($value)
* @method static Builder|Campaigns whereName($value)
* @method static Builder|Campaigns whereNegativeKeywords($value)
* @method static Builder|Campaigns wherePriorityGoals($value)
* @method static Builder|Campaigns whereRelevantKeywordsSettingBudgetPercent($value)
* @method static Builder|Campaigns whereRelevantKeywordsSettingOptimizeGoalId($value)
* @method static Builder|Campaigns whereSettings($value)
* @method static Builder|Campaigns whereTextCampaignStrategyNetwork($value)
* @method static Builder|Campaigns whereTextCampaignStrategySearch($value)
* @method static Builder|Campaigns whereTimeTargeting($value)
* @method static Builder|Campaigns whereToken($value)
* @method static Builder|Campaigns whereUpdatedSelf($value)
* @method static Builder|Campaigns whereUpdatedChildren($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
*/
class Campaigns extends Model
......@@ -172,6 +176,7 @@ class Campaigns extends Model
static::created(function (Campaigns $campaign) {
if ($campaign->manage) {
$campaign->copyInGoalCampaign();
$campaign->copyGroupInGoalGroup();
}
});
......@@ -180,8 +185,9 @@ class Campaigns extends Model
if ($campaign->manage !== $campaign->getOriginal('manage')) {
if ($campaign->manage) {
$campaign->copyInGoalCampaign();
$campaign->copyGroupInGoalGroup();
} else {
// $campaign->dictionaries()->detach();
$campaign->dictionaries()->detach();
}
}
......@@ -225,14 +231,9 @@ class Campaigns extends Model
$campaign->groups()->get()->each(function (AdGroup $adGroup) use ($dictionaryCampaign) {
$dictionaryCampaign->groups()->create(
array_merge(
GoalAdGroup::copyPropertyFromMain($adGroup),
[
'campaign_external_id' => $dictionaryCampaign->external_id,
]
)
);
$dictionaryCampaign->groups()->updateOrCreate([
'campaign_id' => $dictionaryCampaign->external_id,
], GoalAdGroup::copyPropertyFromMain($adGroup));
});
......
......@@ -18,6 +18,9 @@ use Illuminate\Support\Collection;
* @property-read DictionaryCampaignVariable[] $dictionaryCampaignVariables
* @property-read Variable[] $variables
* @property-read GoalAdGroup[] $groups
* @property-read GoalAdGroup[] $groupsForNotExternal
* @property-read GoalAdGroup[] $groupsForExternalForUpdatedSelf
* @property-read GoalAdGroup[] $groupsForExternalForNeedUpdated
* @mixin \Eloquent
* @property int $id
* @property int|null $external_id
......@@ -62,6 +65,18 @@ use Illuminate\Support\Collection;
* @method static \Illuminate\Database\Eloquent\Builder|DictionaryCampaign whereUpdated($value)
* @method static \Illuminate\Database\Eloquent\Builder|DictionaryCampaign whereUpdatedAt($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
{
......@@ -137,6 +152,8 @@ class DictionaryCampaign extends Pivot
/**
* @param Campaigns|array $campaign
*
* @return array
*/
static public function copyPropertyFromMain($campaign)
{
......@@ -258,4 +275,14 @@ class DictionaryCampaign extends Pivot
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;
use Illuminate\Database\Eloquent\Relations\Pivot;
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
{
......@@ -68,6 +112,8 @@ class GoalAdGroup extends Pivot
/**
* @param AdGroup|array $ad_group
*
* @return array
*/
static public function copyPropertyFromMain($ad_group)
{
......
......@@ -41,12 +41,17 @@ use Illuminate\Database\Eloquent\Model;
* @property-read \Illuminate\Database\Eloquent\Collection|DictionaryCampaign[] $dictionaryCampaignsNotEnabledForExternalNotDisabled
* @property-read \Illuminate\Database\Eloquent\Collection|DictionaryCampaign[] $dictionaryCampaignsEnabledForExternalDisabled
* @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[] $dictionaryCampaignsEnabledForExternalSynchronizedUpdatedChildren
* @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\Limits[] $limits
* @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 newModelQuery()
* @method static \Illuminate\Database\Eloquent\Builder|Tokens newQuery()
......@@ -190,27 +195,32 @@ class Tokens extends Model
public function dictionaryCampaignsNotEnabledForExternalNotDisabled()
{
return $this->dictionaryCampaigns()->enabled(false)->forExternal()->notDisabled();
return $this->dictionaryCampaignsForExternal()->enabled(false)->notDisabled();
}
public function dictionaryCampaignsEnabledForExternalDisabled()
{
return $this->dictionaryCampaigns()->enabled()->forExternal()->disabled();
return $this->dictionaryCampaignsForExternal()->enabled()->disabled();
}
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()
{
return $this->dictionaryCampaignsForExternal()->enabled()->synchronized()->forUpdatedSelf();
return $this->dictionaryCampaignsEnabledForExternalSynchronized()->forUpdatedSelf();
}
public function dictionaryCampaignsEnabledForExternalSynchronizedUpdatedChildren()
{
return $this->dictionaryCampaignsForExternal()->enabled()->synchronized()->forUpdatedChildren();
return $this->dictionaryCampaignsEnabledForExternalSynchronized()->forUpdatedChildren();
}
public function campaignsForManaged()
......
......@@ -14,7 +14,7 @@ use Carbon\Carbon;
use Illuminate\Database\Eloquent\Collection;
use Illuminate\Support\Facades\Log;
class AddAdGroup extends DirectRequest
class AddAdGroups extends DirectRequest
{
protected $max_count = 1000;
......@@ -36,7 +36,7 @@ class AddAdGroup extends DirectRequest
public function slice($maxObjects): ?APIRequest
{
$splinter = $this->sliceByKey($maxObjects, 'Campaigns');
$splinter = $this->sliceByKey($maxObjects, 'AdGroups');
$splinter->putParams([
'goalAdGroups' => $this->goalAdGroups->slice($maxObjects)->values(),
......@@ -77,6 +77,7 @@ class AddAdGroup extends DirectRequest
}
} catch (\Exception $e) {
Log::debug($e);
throw $e;
}
}
......
......@@ -6,6 +6,7 @@ use App\Jobs\ProcessCallLimitedAPI;
use App\Models\AdGroup;
use App\Models\Campaigns;
use App\Models\Pivots\DictionaryCampaign;
use App\Models\Pivots\GoalAdGroup;
use App\Service\API\API;
use App\Service\Requests\APIRequest;
use App\Service\Requests\DirectRequest;
......@@ -23,6 +24,34 @@ class CheckChanges extends DirectRequest
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']['NotFound'])) {
......@@ -36,6 +65,7 @@ class CheckChanges extends DirectRequest
if (isset($response['result']['Modified']['AdGroupIds'])) {
foreach ($response['result']['Modified']['AdGroupIds'] as $ad_group_id) {
if ($this->getToken()->isMain()) {
$adGroup = AdGroup::where('external_id', $ad_group_id)->first();
if ($adGroup) {
......@@ -43,6 +73,15 @@ class CheckChanges extends DirectRequest
'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
$this->setService('Changes');
$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);
}
}
......@@ -7,6 +7,7 @@ use App\Models\AdGroup;
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\DB;
......@@ -23,6 +24,32 @@ class GetAdGroups extends DirectRequest
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)
{
DB::beginTransaction();
......@@ -44,9 +71,15 @@ class GetAdGroups extends DirectRequest
return;
}
if ($this->getToken()->isMain()) {
$campaigns = Campaigns::whereIn('external_id', array_keys($external_ids))
->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) {
......@@ -55,8 +88,6 @@ class GetAdGroups extends DirectRequest
if (!$campaign)
continue;
$campaign->groups_loaded_at = Carbon::now();
$campaign->save();
$external_id = $ad_group['Id'];
......@@ -84,7 +115,6 @@ class GetAdGroups extends DirectRequest
'updated_self' => null,
];
if ($this->getToken()->isMain()) {
AdGroup::updateOrCreate([
'external_id' => $external_id
......@@ -100,6 +130,10 @@ class GetAdGroups extends DirectRequest
);
}
$campaign->update([
'groups_loaded_at' => Carbon::now(),
]);
}
DB::commit();
......@@ -115,15 +149,22 @@ class GetAdGroups extends DirectRequest
$this->setService('AdGroups');
$this->setMethod('get');
$params = [
'SelectionCriteria' => [
'CampaignIds' => $filter['CampaignIds'],
],
"FieldNames" => [
"Id", "CampaignId", "Name", "NegativeKeywords",
"NegativeKeywordSharedSetIds", "RegionIds", "RestrictedRegionIds",
"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);
}
}
......@@ -5,6 +5,7 @@ namespace App\Service\Requests\Direct;
use App\Jobs\ProcessCallLimitedAPI;
use App\Models\Campaigns;
use App\Models\Pivots\DictionaryCampaign;
use App\Service\Contract\APIRequest;
use App\Service\Requests\DirectRequest;
use Illuminate\Support\Facades\Log;
......@@ -26,7 +27,18 @@ class GetCampaigns extends DirectRequest
if (isset($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)
......
<?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
$request->setToken($this->getToken());
return $request;
}
throw new \Exception('Unknown Service or Method');
throw new \Exception("Unknown Service or Method \"{$class}\"");
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;
use App\Models\AdGroup;
use App\Models\Campaigns;
use App\Models\Dictionary;
use App\Models\Pivots\DictionaryCampaign;
use App\Models\Pivots\GoalAdGroup;
use App\Models\Tokens;
use App\Models\User;
use App\Service\Contract\API;
......@@ -25,8 +27,11 @@ class CheckChangesAdGroupsTest extends TestCase
private $token_main;
private $token;
private $dictionary;
private $campaign;
private $request_main;
private $request_main_params;
private $ad_group;
private $ad_group_data;
protected function setUp(): void
{
......@@ -47,18 +52,6 @@ class CheckChangesAdGroupsTest extends TestCase
'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([
'created_by' => $this->user->id
]);
......@@ -68,6 +61,17 @@ class CheckChangesAdGroupsTest extends TestCase
'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)
->setToken($this->token_main)
->getRequest('Changes', 'check');
......@@ -84,6 +88,36 @@ class CheckChangesAdGroupsTest extends TestCase
->setToken($this->token)
->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()
......@@ -100,9 +134,13 @@ class CheckChangesAdGroupsTest extends TestCase
public function testHandleApi()
{
$this->assertEquals(1, AdGroup::count());
$this->assertEquals(1, DictionaryCampaign::count());
$this->assertEquals(1, GoalAdGroup::count());
$this->assertEquals(0, AdGroup::forUpdatedSelf()->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->handle([
......@@ -119,5 +157,40 @@ class CheckChangesAdGroupsTest extends TestCase
$this->assertEquals(1, AdGroup::forUpdatedSelf()->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
]);
$this->token = factory(Tokens::class)->create([
'type' => 'main',
'created_by' => $this->user->id
]);
......
......@@ -161,12 +161,7 @@ class LimitsTest extends TestCase
$this->token->limit = 191;
$requestCmpgn->call();
$objects = $this->limitService->countObjectsLimit($requestCmpgn);
$this->assertEquals($objects, 181);
$this->token->limit = $requestCmpgn->getMaxCount() + 100;
$requestCmpgn->call();
$objects = $this->limitService->countObjectsLimit($requestCmpgn);
$this->assertEquals($objects, $requestCmpgn->getMaxCount());
$this->assertEquals($objects, -1);
$requestCmpgn = $request->getRequest('Campaigns', 'update');
$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!