Commit 381b24ea by Vladislav

#19465 Реализация синхронизации данных по РК

1 parent 25dd333e
<?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 CampaignsAdd extends Command
{
/**
* The name and signature of the console command.
*
* @var string
*/
protected $signature = 'campaigns:add';
/**
* 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()
{
$token = Tokens::whereHas('dictionaryCampaignsForNotExternal')
->with([
'dictionaryCampaignsForNotExternal' => function (HasManyThrough $query) {
return $query->limit(10);
},
'dictionaryCampaignsForNotExternal.campaign'
])->where('type', Tokens::GOAL)
->first();
if ($token) {
$factory = APIRequest::getInstance(API::YANDEX);
$factory->setToken($token);
$factory->getRequest('campaigns', 'add')
->call([
'dictionaryCampaigns' => $token->dictionaryCampaignsForNotExternal,
'variables' => Variable::all(),
]);
}
return 0;
}
}
...@@ -2,16 +2,12 @@ ...@@ -2,16 +2,12 @@
namespace App\Console\Commands; namespace App\Console\Commands;
use App\Jobs\ProcessCallLimitedAPI;
use App\Models\Tokens; use App\Models\Tokens;
use App\Service\API\API; use App\Service\API\API;
use App\Service\Direct\CheckDictionaries;
use App\Service\Direct\GetCampaigns;
use App\Service\Requests\APIRequest; use App\Service\Requests\APIRequest;
use Illuminate\Console\Command; use Illuminate\Console\Command;
use Illuminate\Support\Facades\Bus;
class CheckChangeCampaigns extends Command class CampaignsCheckChange extends Command
{ {
/** /**
* The name and signature of the console command. * The name and signature of the console command.
......
...@@ -2,16 +2,12 @@ ...@@ -2,16 +2,12 @@
namespace App\Console\Commands; namespace App\Console\Commands;
use App\Jobs\ProcessCallLimitedAPI;
use App\Models\Tokens; use App\Models\Tokens;
use App\Service\API\API; use App\Service\API\API;
use App\Service\Direct\CheckDictionaries;
use App\Service\Direct\GetCampaigns;
use App\Service\Requests\APIRequest; use App\Service\Requests\APIRequest;
use Illuminate\Console\Command; use Illuminate\Console\Command;
use Illuminate\Support\Facades\Bus;
class FirstLoadCampaigns extends Command class CampaignsFirstLoad extends Command
{ {
/** /**
* The name and signature of the console command. * The name and signature of the console command.
......
...@@ -8,7 +8,7 @@ use App\Service\API\API; ...@@ -8,7 +8,7 @@ use App\Service\API\API;
use App\Service\Requests\APIRequest; use App\Service\Requests\APIRequest;
use Illuminate\Console\Command; use Illuminate\Console\Command;
class LoadGroupsCampaigns extends Command class CampaignsLoadGroups extends Command
{ {
/** /**
* The name and signature of the console command. * The name and signature of the console command.
......
...@@ -12,7 +12,7 @@ use App\Service\Requests\APIRequest; ...@@ -12,7 +12,7 @@ use App\Service\Requests\APIRequest;
use Illuminate\Console\Command; use Illuminate\Console\Command;
use Illuminate\Support\Facades\Bus; use Illuminate\Support\Facades\Bus;
class LoadUpdatedCampaigns extends Command class CampaignsLoadUpdated extends Command
{ {
/** /**
* The name and signature of the console command. * The name and signature of the console command.
......
...@@ -2,9 +2,9 @@ ...@@ -2,9 +2,9 @@
namespace App\Console; namespace App\Console;
use App\Console\Commands\CheckChangeCampaigns; use App\Console\Commands\CampaignsCheckChange;
use App\Console\Commands\DictionariesLoad; use App\Console\Commands\DictionariesLoad;
use App\Console\Commands\LoadUpdatedCampaigns; use App\Console\Commands\CampaignsLoadUpdated;
use App\Console\Commands\RefreshLimits; use App\Console\Commands\RefreshLimits;
use Illuminate\Console\Scheduling\Schedule; use Illuminate\Console\Scheduling\Schedule;
use Illuminate\Foundation\Console\Kernel as ConsoleKernel; use Illuminate\Foundation\Console\Kernel as ConsoleKernel;
...@@ -30,8 +30,8 @@ class Kernel extends ConsoleKernel ...@@ -30,8 +30,8 @@ class Kernel extends ConsoleKernel
{ {
$schedule->command(RefreshLimits::class)->hourly(); $schedule->command(RefreshLimits::class)->hourly();
$schedule->command(DictionariesLoad::class)->saturdays()->at('05:00'); $schedule->command(DictionariesLoad::class)->saturdays()->at('05:00');
$schedule->command(CheckChangeCampaigns::class)->hourlyAt(5); $schedule->command(CampaignsCheckChange::class)->hourlyAt(5);
$schedule->command(LoadUpdatedCampaigns::class)->hourlyAt(15); $schedule->command(CampaignsLoadUpdated::class)->hourlyAt(15);
} }
/** /**
......
...@@ -14,20 +14,19 @@ use Illuminate\Database\Eloquent\Model; ...@@ -14,20 +14,19 @@ use Illuminate\Database\Eloquent\Model;
* @property int $token * @property int $token
* @property int $external_id * @property int $external_id
* @property string|null $name * @property string|null $name
* @property string|null $time_targeting * @property array|null $time_targeting
* @property string|null $negative_keywords * @property array|null $negative_keywords
* @property string|null $blocked_ips * @property array|null $blocked_ips
* @property string|null $excluded_sites * @property array|null $excluded_sites
* @property string|null $daily_budget * @property array|null $daily_budget
* @property string|null $text_campaign_strategy_search * @property string|null $text_campaign_strategy_search
* @property string|null $text_campaign_strategy_network * @property string|null $text_campaign_strategy_network
* @property string|null $settings * @property array|null $settings
* @property string|null $counter_ids * @property array|null $counter_ids
* @property int|null $relevant_keywords_setting_budget_percent * @property int|null $relevant_keywords_setting_budget_percent
* @property int|null $relevant_keywords_setting_optimize_goal_id * @property int|null $relevant_keywords_setting_optimize_goal_id
* @property string|null $attribution_model * @property string|null $attribution_model
* @property string|null $priority_goals * @property array|null $priority_goals
* @property array $updated
* @property string|null $updated_self * @property string|null $updated_self
* @property string|null $updated_children * @property string|null $updated_children
* @property bool $manage * @property bool $manage
...@@ -40,9 +39,9 @@ use Illuminate\Database\Eloquent\Model; ...@@ -40,9 +39,9 @@ use Illuminate\Database\Eloquent\Model;
* @property-read \Illuminate\Database\Eloquent\Collection|\App\Models\AdGroup[] $groups * @property-read \Illuminate\Database\Eloquent\Collection|\App\Models\AdGroup[] $groups
* @property-read int|null $groups_count * @property-read int|null $groups_count
* @property-read \Illuminate\Database\Eloquent\Collection|\App\Models\Variable[] $dictionaryCampaignVariables * @property-read \Illuminate\Database\Eloquent\Collection|\App\Models\Variable[] $dictionaryCampaignVariables
* @property-read int|null $dictionaryCampaignVariables_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 $dictionaryCampaigns_count * @property-read int|null $dictionary_campaigns_count
* @method static \Illuminate\Database\Eloquent\Builder|Campaigns forEnabled() * @method static \Illuminate\Database\Eloquent\Builder|Campaigns forEnabled()
* @method static \Illuminate\Database\Eloquent\Builder|Campaigns forGroupsLoadable() * @method static \Illuminate\Database\Eloquent\Builder|Campaigns forGroupsLoadable()
* @method static \Illuminate\Database\Eloquent\Builder|Campaigns forManaged() * @method static \Illuminate\Database\Eloquent\Builder|Campaigns forManaged()
...@@ -99,6 +98,7 @@ class Campaigns extends Model ...@@ -99,6 +98,7 @@ class Campaigns extends Model
'relevant_keywords_setting_budget_percent', 'relevant_keywords_setting_budget_percent',
'relevant_keywords_setting_optimize_goal_id', 'relevant_keywords_setting_optimize_goal_id',
'attribution_model', 'attribution_model',
'priority_goals',
'updated_self', 'updated_self',
'updated_children', 'updated_children',
'manage', 'manage',
...@@ -107,11 +107,19 @@ class Campaigns extends Model ...@@ -107,11 +107,19 @@ class Campaigns extends Model
protected $casts = [ protected $casts = [
'external_id' => 'int', 'external_id' => 'int',
'manage' => 'boolean', 'time_targeting' => 'array',
'enabled' => 'boolean', 'negative_keywords' => 'array',
'blocked_ips' => 'array',
'settings' => 'array',
'counter_ids' => 'array',
'excluded_sites' => 'array',
'daily_budget' => 'array',
'priority_goals' => 'array',
'groups_loaded_at' => 'datetime', 'groups_loaded_at' => 'datetime',
'updated_self' => 'datetime', 'updated_self' => 'datetime',
'updated_children' => 'datetime', 'updated_children' => 'datetime',
'manage' => 'boolean',
'enabled' => 'boolean',
]; ];
public static function boot() public static function boot()
...@@ -142,20 +150,7 @@ class Campaigns extends Model ...@@ -142,20 +150,7 @@ class Campaigns extends Model
$campaign->dictionaries()->detach(); $campaign->dictionaries()->detach();
} }
} }
if ($campaign->name !== $campaign->getOriginal('name')) {
$campaign->dictionaryCampaign()->update([
'name' => $campaign->name,
]);
}
});
/*
static::deleting(function(Campaigns $campaign_delete)
{
$campaign_delete->dictionaries()->detach();
$campaign_delete->groups()->delete();
}); });
*/
} }
public function groups() public function groups()
......
...@@ -21,8 +21,8 @@ use Illuminate\Database\Eloquent\Builder; ...@@ -21,8 +21,8 @@ use Illuminate\Database\Eloquent\Builder;
* @property-read \Illuminate\Database\Eloquent\Collection|\App\Models\Campaigns[] $campaigns * @property-read \Illuminate\Database\Eloquent\Collection|\App\Models\Campaigns[] $campaigns
* @property-read int|null $campaigns_count * @property-read int|null $campaigns_count
* @property-read \App\Models\Tokens|null $token * @property-read \App\Models\Tokens|null $token
* @property-read \Illuminate\Database\Eloquent\Collection|\App\Models\DictionaryCampaign[] $dictionaryCampaigns * @property-read \Illuminate\Database\Eloquent\Collection|\App\Models\Pivots\DictionaryCampaign[] $dictionaryCampaigns
* @property-read int|null $dictionaryCampaigns_count * @property-read int|null $dictionary_campaigns_count
* @method static Builder|Dictionary defaultOrderBy() * @method static Builder|Dictionary defaultOrderBy()
* @method static Builder|Dictionary newModelQuery() * @method static Builder|Dictionary newModelQuery()
* @method static Builder|Dictionary newQuery() * @method static Builder|Dictionary newQuery()
......
...@@ -4,11 +4,13 @@ namespace App\Models\Pivots; ...@@ -4,11 +4,13 @@ namespace App\Models\Pivots;
use App\Models\Campaigns; use App\Models\Campaigns;
use App\Models\Dictionary; use App\Models\Dictionary;
use App\Models\Limits;
use App\Models\Variable; use App\Models\Variable;
use Illuminate\Database\Eloquent\Builder;
use Illuminate\Database\Eloquent\Relations\Pivot; use Illuminate\Database\Eloquent\Relations\Pivot;
/** /**
* App\Models\Pivots\DictionaryCampaignPivot * App\Models\Pivots\DictionaryCampaign
* *
* @property-read Campaigns $campaign * @property-read Campaigns $campaign
* @property-read Dictionary $dictionary * @property-read Dictionary $dictionary
...@@ -16,6 +18,7 @@ use Illuminate\Database\Eloquent\Relations\Pivot; ...@@ -16,6 +18,7 @@ use Illuminate\Database\Eloquent\Relations\Pivot;
* @property-read Variable[] $variables * @property-read Variable[] $variables
* @mixin \Eloquent * @mixin \Eloquent
* @property int $id * @property int $id
* @property int|null $external_id
* @property int $campaign_id * @property int $campaign_id
* @property int $dictionary_id * @property int $dictionary_id
* @property string|null $name * @property string|null $name
...@@ -26,9 +29,12 @@ use Illuminate\Database\Eloquent\Relations\Pivot; ...@@ -26,9 +29,12 @@ use Illuminate\Database\Eloquent\Relations\Pivot;
* @property \Illuminate\Support\Carbon|null $updated_at * @property \Illuminate\Support\Carbon|null $updated_at
* @property-read int|null $dictionary_campaign_variables_count * @property-read int|null $dictionary_campaign_variables_count
* @property-read int|null $variables_count * @property-read int|null $variables_count
* @method static \Illuminate\Database\Eloquent\Builder|Limits forNotExternal()
* @method static \Illuminate\Database\Eloquent\Builder|Limits joinDictionaries()
* @method static \Illuminate\Database\Eloquent\Builder|DictionaryCampaign newModelQuery() * @method static \Illuminate\Database\Eloquent\Builder|DictionaryCampaign newModelQuery()
* @method static \Illuminate\Database\Eloquent\Builder|DictionaryCampaign newQuery() * @method static \Illuminate\Database\Eloquent\Builder|DictionaryCampaign newQuery()
* @method static \Illuminate\Database\Eloquent\Builder|DictionaryCampaign query() * @method static \Illuminate\Database\Eloquent\Builder|DictionaryCampaign query()
* @method static \Illuminate\Database\Eloquent\Builder|DictionaryCampaign whereExternalId($value)
* @method static \Illuminate\Database\Eloquent\Builder|DictionaryCampaign whereCampaignId($value) * @method static \Illuminate\Database\Eloquent\Builder|DictionaryCampaign whereCampaignId($value)
* @method static \Illuminate\Database\Eloquent\Builder|DictionaryCampaign whereCreatedAt($value) * @method static \Illuminate\Database\Eloquent\Builder|DictionaryCampaign whereCreatedAt($value)
* @method static \Illuminate\Database\Eloquent\Builder|DictionaryCampaign whereDictionaryId($value) * @method static \Illuminate\Database\Eloquent\Builder|DictionaryCampaign whereDictionaryId($value)
...@@ -38,6 +44,8 @@ use Illuminate\Database\Eloquent\Relations\Pivot; ...@@ -38,6 +44,8 @@ use Illuminate\Database\Eloquent\Relations\Pivot;
* @method static \Illuminate\Database\Eloquent\Builder|DictionaryCampaign whereNegativeKeywords($value) * @method static \Illuminate\Database\Eloquent\Builder|DictionaryCampaign whereNegativeKeywords($value)
* @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)
* @property string|null $external_upload_at
* @method static Builder|DictionaryCampaign whereExternalUploadAt($value)
*/ */
class DictionaryCampaign extends Pivot class DictionaryCampaign extends Pivot
{ {
...@@ -45,24 +53,31 @@ class DictionaryCampaign extends Pivot ...@@ -45,24 +53,31 @@ class DictionaryCampaign extends Pivot
protected $table = 'dictionary_campaigns'; protected $table = 'dictionary_campaigns';
protected $fillable = [ protected $fillable = [
'external_id',
'campaign_id', 'campaign_id',
'dictionary_id', 'dictionary_id',
'name', 'name',
'negative_keywords', 'negative_keywords',
'excluded_sites', 'excluded_sites',
'updated', 'updated',
'external_upload_at',
]; ];
protected $cast = [ protected $cast = [
'external_id' => 'int',
'campaign_id' => 'int', 'campaign_id' => 'int',
'dictionary_id' => 'int', 'dictionary_id' => 'int',
'negative_keywords' => 'array',
'excluded_sites' => 'array',
'updated' => 'boolean', 'updated' => 'boolean',
'external_upload_at' => 'datetime',
]; ];
static public function getWithPivot() static public function getWithPivot()
{ {
return [ return [
'name', 'name',
'external_upload_at',
'negative_keywords', 'negative_keywords',
'excluded_sites', 'excluded_sites',
'updated', 'updated',
...@@ -73,7 +88,7 @@ class DictionaryCampaign extends Pivot ...@@ -73,7 +88,7 @@ class DictionaryCampaign extends Pivot
{ {
return collect(self::getWithPivot()) return collect(self::getWithPivot())
->filter(function ($property_name){ ->filter(function ($property_name){
return $property_name !== 'updated'; return $property_name !== 'updated' && $property_name !== 'external_upload_at';
}) })
->transform(function ($property_name) use ($campaign) { ->transform(function ($property_name) use ($campaign) {
return [ return [
...@@ -84,6 +99,18 @@ class DictionaryCampaign extends Pivot ...@@ -84,6 +99,18 @@ class DictionaryCampaign extends Pivot
})->all(); })->all();
} }
public function scopeForNotExternal(Builder $query)
{
return $query->whereNull('external_id');
}
public function scopeJoinDictionaries(Builder $query)
{
$dictionary_model = Dictionary::getModel();
return $query->join($dictionary_model->getTable(), "{$query->getModel()->table()}.dictionary_id", '=', "{$dictionary_model->getTable()}.{$dictionary_model->getKeyName()}");
}
public function dictionary() public function dictionary()
{ {
return $this->belongsTo(Dictionary::class, 'dictionary_id'); return $this->belongsTo(Dictionary::class, 'dictionary_id');
......
...@@ -7,7 +7,7 @@ use App\Models\Variable; ...@@ -7,7 +7,7 @@ use App\Models\Variable;
use Illuminate\Database\Eloquent\Relations\Pivot; use Illuminate\Database\Eloquent\Relations\Pivot;
/** /**
* App\Models\Pivots\DictionaryCampaignVariablePivot * App\Models\Pivots\DictionaryCampaignVariable
* *
* @property-read Campaigns $dictionary_campaign * @property-read Campaigns $dictionary_campaign
* @property-read Variable $variable * @property-read Variable $variable
......
...@@ -2,6 +2,7 @@ ...@@ -2,6 +2,7 @@
namespace App\Models; namespace App\Models;
use App\Models\Pivots\DictionaryCampaign;
use Illuminate\Database\Eloquent\Model; use Illuminate\Database\Eloquent\Model;
/** /**
...@@ -21,10 +22,11 @@ use Illuminate\Database\Eloquent\Model; ...@@ -21,10 +22,11 @@ use Illuminate\Database\Eloquent\Model;
* @property-read int|null $campaigns_count * @property-read int|null $campaigns_count
* @property-read \Illuminate\Database\Eloquent\Collection|\App\Models\Dictionary[] $cities * @property-read \Illuminate\Database\Eloquent\Collection|\App\Models\Dictionary[] $cities
* @property-read int|null $cities_count * @property-read int|null $cities_count
* @property-read \Illuminate\Database\Eloquent\Collection|DictionaryCampaign[] $dictionaryCampaigns
* @property-read int|null $dictionary_campaigns_count
* @property-read \Illuminate\Database\Eloquent\Collection|DictionaryCampaign[] $dictionaryCampaignsForNotExternal
* @property-read \Illuminate\Database\Eloquent\Collection|\App\Models\Dictionary[] $campaignsForManaged * @property-read \Illuminate\Database\Eloquent\Collection|\App\Models\Dictionary[] $campaignsForManaged
* @property-read int|null $campaignsForManaged_count
* @property-read \Illuminate\Database\Eloquent\Collection|\App\Models\Dictionary[] $campaignsNotForManaged * @property-read \Illuminate\Database\Eloquent\Collection|\App\Models\Dictionary[] $campaignsNotForManaged
* @property-read int|null $campaignsNotForManaged_count
* @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
* @method static \Illuminate\Database\Eloquent\Builder|Tokens filter(array $filters) * @method static \Illuminate\Database\Eloquent\Builder|Tokens filter(array $filters)
...@@ -84,6 +86,21 @@ class Tokens extends Model ...@@ -84,6 +86,21 @@ class Tokens extends Model
->orderBy('updated_at', 'DESC'); ->orderBy('updated_at', 'DESC');
} }
public function dictionaryCampaigns()
{
return $this->hasManyThrough(DictionaryCampaign::class, Dictionary::class, 'token_id', 'dictionary_id')
->orderBy(DictionaryCampaign::getModel()->getTable() . '.created_at', 'ASC')
->forNotExternal();
}
public function dictionaryCampaignsForNotExternal()
{
return $this->dictionaryCampaigns()
->orderBy(DictionaryCampaign::getModel()->getTable() . '.created_at', 'ASC')
->orderBy(DictionaryCampaign::getModel()->getTable() . '.' . DictionaryCampaign::getModel()->getKeyName(), 'ASC')
->forNotExternal();
}
public function campaignsForManaged() public function campaignsForManaged()
{ {
return $this->campaigns()->forManaged(); return $this->campaigns()->forManaged();
......
...@@ -40,6 +40,13 @@ class Variable extends Model ...@@ -40,6 +40,13 @@ class Variable extends Model
return $query->orderBy('name'); return $query->orderBy('name');
} }
public function findValue($dictionary_campaign_id)
{
return $this->values()
->where('dictionary_campaign_id', $dictionary_campaign_id)
->first();
}
public function values() public function values()
{ {
return $this->hasMany(DictionaryCampaignVariable::class, 'variable_id'); return $this->hasMany(DictionaryCampaignVariable::class, 'variable_id');
......
<?php
namespace App\Service\Requests\Direct;
use App\Jobs\ProcessCallLimitedAPI;
use App\Models\Pivots\DictionaryCampaign;
use App\Models\Variable;
use App\Service\Requests\DirectRequest;
use App\Service\StrReplaceByVariables;
use Carbon\Carbon;
use Illuminate\Database\Eloquent\Collection;
use Illuminate\Support\Facades\Log;
class AddCampaigns extends DirectRequest
{
protected $timestamp;
/* @var Collection|DictionaryCampaign[] $dictionaryCampaigns */
protected $dictionaryCampaigns;
/* @var Collection|Variable[] $dictionaryCampaigns */
protected $variables;
public function call($params = null)
{
$this->requestPrepare($params);
$process = new ProcessCallLimitedAPI($this);
dispatch($process)->onQueue('limits');
}
public function handle($response)
{
try {
foreach ($response['result']['AddResults'] as $key => $add_result) {
$id = $add_result['Id'] ?? '';
if (!$id) {
Log::debug("AddCampaigns, empty Id, [dictionary_campaigns.id = {$this->dictionaryCampaigns->get($key)->getKey()}]", $add_result);
continue;
}
$this->dictionaryCampaigns->get($key)->update([
'external_id' => $id,
'external_upload_at' => Carbon::now(),
]);
}
} catch (\Exception $e) {
Log::debug($e);
}
}
public function putParams($params)
{
$this->dictionaryCampaigns = $params['dictionaryCampaigns'];
$this->variables = $params['variables'];
$this->assertEquals('String "custom var value"', StrReplaceByVariables::getInstance('String "%var%"', $variable_list)->get());
}
private function requestPrepare($params)
{
$this->setService('campaigns');
$this->setMethod('add');
$this->putParams($params);
$this->setParams([
'Campaigns' => $this->dictionaryCampaigns->map(function ($dictionaryCampaign) {
/* @var DictionaryCampaign $dictionaryCampaign */
$variable_list = [];
foreach (Variable::all() as $variable) {
$dictionaryCampaignVariable = $variable->findValue($dictionaryCampaign->getKey());
$value = (
$dictionaryCampaignVariable
? $dictionaryCampaignVariable->value
: $variable->default_value
);
$variable_list[$variable->name] = $value;
}
return [
'Name' => StrReplaceByVariables::getInstance($dictionaryCampaign->name, $variable_list)->get(),
'StartDate' => Carbon::now()->format('Y-m-d'),
'NegativeKeywords' => StrReplaceByVariables::getInstance($dictionaryCampaign->campaign->negative_keywords, $variable_list)->get(),
'TextCampaign' => [
'BiddingStrategy' => [
'Search' => [
'BiddingStrategyType' => $dictionaryCampaign->campaign->text_campaign_strategy_search,
],
'Network' => [
'BiddingStrategyType' => $dictionaryCampaign->campaign->text_campaign_strategy_network,
],
],
],
];
}),
]);
}
}
...@@ -62,10 +62,10 @@ class GetAdGroups extends DirectRequest ...@@ -62,10 +62,10 @@ class GetAdGroups extends DirectRequest
'type' => $ad_group['Type'], 'type' => $ad_group['Type'],
'sub_type' => $ad_group['Subtype'], 'sub_type' => $ad_group['Subtype'],
'serving_status' => $ad_group['ServingStatus'], 'serving_status' => $ad_group['ServingStatus'],
'restricted_region_ids' => $ad_group['RestrictedRegionIds'] ? json_encode($ad_group['RestrictedRegionIds']) : $ad_group['RestrictedRegionIds'], 'restricted_region_ids' => $ad_group['RestrictedRegionIds'] ? json_encode($ad_group['RestrictedRegionIds']) : null,
'region_ids' => $ad_group['RegionIds'] ? json_encode($ad_group['RegionIds']) : $ad_group['RegionIds'], 'region_ids' => $ad_group['RegionIds'] ? json_encode($ad_group['RegionIds']) : null,
'negative_keywords' => $ad_group['NegativeKeywords'] ? json_encode($ad_group['NegativeKeywords']) : $ad_group['NegativeKeywords'], 'negative_keywords' => $ad_group['NegativeKeywords'] ? json_encode($ad_group['NegativeKeywords']) : null,
'negative_keyword_shared_set_ids' => $ad_group['NegativeKeywordSharedSetIds'] ? json_encode($ad_group['NegativeKeywordSharedSetIds']) : $ad_group['NegativeKeywordSharedSetIds'], 'negative_keyword_shared_set_ids' => $ad_group['NegativeKeywordSharedSetIds'] ? json_encode($ad_group['NegativeKeywordSharedSetIds']) : null,
'tracking_params' => $ad_group['TrackingParams'], 'tracking_params' => $ad_group['TrackingParams'],
]; ];
} }
......
<?php <?php
namespace App\Service\Requests\Direct; namespace App\Service\Requests\Direct;
use App\Jobs\ProcessCallLimitedAPI; use App\Jobs\ProcessCallLimitedAPI;
...@@ -6,32 +7,35 @@ use App\Models\Campaigns; ...@@ -6,32 +7,35 @@ use App\Models\Campaigns;
use App\Service\Requests\DirectRequest; use App\Service\Requests\DirectRequest;
use Illuminate\Support\Facades\Log; use Illuminate\Support\Facades\Log;
class GetCampaigns extends DirectRequest{ class GetCampaigns extends DirectRequest
{
protected $timestamp; protected $timestamp;
function call($params = null){ function call($params = null)
{
$this->requestPrepare($params); $this->requestPrepare($params);
$process = new ProcessCallLimitedAPI($this); $process = new ProcessCallLimitedAPI($this);
dispatch($process)->onQueue('limits'); dispatch($process)->onQueue('limits');
} }
function handle($response){ function handle($response)
{
try { try {
$data = []; $data = [];
foreach ($response['result']['Campaigns'] as $campaign){ foreach ($response['result']['Campaigns'] as $campaign) {
$data[] = [ $data[] = [
'external_id' => $campaign['Id'], 'external_id' => $campaign['Id'],
'token' => $this->getToken()->id, 'token' => $this->getToken()->id,
'name' => $campaign['Name'], 'name' => $campaign['Name'],
'time_targeting' => json_encode($campaign['TimeTargeting']), 'time_targeting' => json_encode($campaign['TimeTargeting']),
'negative_keywords' => !empty($campaign['NegativeKeywords']['Items']) ?implode("\n", $campaign['NegativeKeywords']['Items']):'', 'negative_keywords' => json_encode($campaign['NegativeKeywords']['Items'] ?? []),
'blocked_ips' => !empty($campaign['BlockedIps']['Items']) ?implode("\n", $campaign['BlockedIps']['Items']):'', 'blocked_ips' => json_encode($campaign['BlockedIps']['Items'] ?? []),
'excluded_sites' => !empty($campaign['ExcludedSites']['Items']) ?implode("\n", $campaign['ExcludedSites']['Items']):'', 'excluded_sites' => json_encode($campaign['ExcludedSites']['Items'] ?? []),
'daily_budget' => json_encode($campaign['DailyBudget']), 'daily_budget' => json_encode($campaign['DailyBudget']['Items'] ?? []),
'text_campaign_strategy_search' => $campaign['TextCampaign']['BiddingStrategy']['Search']['BiddingStrategyType'], 'text_campaign_strategy_search' => $campaign['TextCampaign']['BiddingStrategy']['Search']['BiddingStrategyType'],
'text_campaign_strategy_network' => $campaign['TextCampaign']['BiddingStrategy']['Network']['BiddingStrategyType'], 'text_campaign_strategy_network' => $campaign['TextCampaign']['BiddingStrategy']['Network']['BiddingStrategyType'],
'settings' => json_encode($campaign['TextCampaign']['Settings']), 'settings' => json_encode($campaign['TextCampaign']['Settings']),
'counter_ids' => !empty($campaign['TextCampaign']['CounterIds']['Items']) ? implode("\n", $campaign['TextCampaign']['CounterIds']['Items']): '', 'counter_ids' => json_encode($campaign['TextCampaign']['CounterIds']['Items'] ?? []),
'relevant_keywords_setting_budget_percent' => $campaign['TextCampaign']['RelevantKeywords']['BudgetPercent'], 'relevant_keywords_setting_budget_percent' => $campaign['TextCampaign']['RelevantKeywords']['BudgetPercent'],
'relevant_keywords_setting_optimize_goal_id' => $campaign['TextCampaign']['RelevantKeywords']['OptimizeGoalId'], 'relevant_keywords_setting_optimize_goal_id' => $campaign['TextCampaign']['RelevantKeywords']['OptimizeGoalId'],
'attribution_model' => $campaign['TextCampaign']['AttributionModel'], 'attribution_model' => $campaign['TextCampaign']['AttributionModel'],
...@@ -40,7 +44,7 @@ class GetCampaigns extends DirectRequest{ ...@@ -40,7 +44,7 @@ class GetCampaigns extends DirectRequest{
} }
Campaigns::upsert($data, [ Campaigns::upsert($data, [
'external_id' 'external_id'
],[ ], [
'token', 'token',
'name', 'name',
'time_targeting', 'time_targeting',
...@@ -61,11 +65,12 @@ class GetCampaigns extends DirectRequest{ ...@@ -61,11 +65,12 @@ class GetCampaigns extends DirectRequest{
} }
} }
private function requestPrepare($filter){ private function requestPrepare($filter)
{
$this->setService('campaigns'); $this->setService('campaigns');
$this->setMethod('get'); $this->setMethod('get');
$params = [ $params = [
'SelectionCriteria' => [ 'SelectionCriteria' => [
'Types' => ["TEXT_CAMPAIGN"] 'Types' => ["TEXT_CAMPAIGN"]
], ],
"FieldNames" => [ "FieldNames" => [
...@@ -75,7 +80,7 @@ class GetCampaigns extends DirectRequest{ ...@@ -75,7 +80,7 @@ class GetCampaigns extends DirectRequest{
"BiddingStrategy", "Settings", "CounterIds", "RelevantKeywords", "PriorityGoals", "AttributionModel" "BiddingStrategy", "Settings", "CounterIds", "RelevantKeywords", "PriorityGoals", "AttributionModel"
] ]
]; ];
if (!empty($filter['ids'])){ if (!empty($filter['ids'])) {
$params['SelectionCriteria']['Ids'] = $filter['ids']; $params['SelectionCriteria']['Ids'] = $filter['ids'];
} }
$this->setParams($params); $this->setParams($params);
......
...@@ -9,8 +9,6 @@ use Illuminate\Support\Facades\Log; ...@@ -9,8 +9,6 @@ use Illuminate\Support\Facades\Log;
class GetDictionaries extends DirectRequest class GetDictionaries extends DirectRequest
{ {
protected $next;
function call($params = null) function call($params = null)
{ {
$this->requestPrepare($params); $this->requestPrepare($params);
...@@ -32,7 +30,6 @@ class GetDictionaries extends DirectRequest ...@@ -32,7 +30,6 @@ class GetDictionaries extends DirectRequest
]); ]);
} }
foreach ($data->chunk(100) as $list) { foreach ($data->chunk(100) as $list) {
Dictionary::upsert($list->toArray(), [ Dictionary::upsert($list->toArray(), [
'region_id' 'region_id'
...@@ -42,10 +39,6 @@ class GetDictionaries extends DirectRequest ...@@ -42,10 +39,6 @@ class GetDictionaries extends DirectRequest
'type', 'type',
]); ]);
} }
if ($this->next) {
$this->next->call(null, $response);
}
} catch (\Exception $e) { } catch (\Exception $e) {
Log::debug($e); Log::debug($e);
} }
......
...@@ -19,14 +19,14 @@ class CreateCampaignsTable extends Migration ...@@ -19,14 +19,14 @@ class CreateCampaignsTable extends Migration
$table->bigInteger('external_id')->unique(); $table->bigInteger('external_id')->unique();
$table->string('name', 255)->nullable(); $table->string('name', 255)->nullable();
$table->json('time_targeting')->nullable(); $table->json('time_targeting')->nullable();
$table->text('negative_keywords')->nullable(); $table->json('negative_keywords')->nullable();
$table->text('blocked_ips')->nullable(); $table->json('blocked_ips')->nullable();
$table->text('excluded_sites')->nullable(); $table->json('excluded_sites')->nullable();
$table->json('daily_budget')->nullable(); $table->json('daily_budget')->nullable();
$table->string('text_campaign_strategy_search')->nullable(); $table->string('text_campaign_strategy_search')->nullable();
$table->string('text_campaign_strategy_network')->nullable(); $table->string('text_campaign_strategy_network')->nullable();
$table->json('settings')->nullable(); $table->json('settings')->nullable();
$table->text('counter_ids')->nullable(); $table->json('counter_ids')->nullable();
$table->integer('relevant_keywords_setting_budget_percent')->nullable(); $table->integer('relevant_keywords_setting_budget_percent')->nullable();
$table->bigInteger('relevant_keywords_setting_optimize_goal_id')->nullable(); $table->bigInteger('relevant_keywords_setting_optimize_goal_id')->nullable();
$table->string('attribution_model', 4)->nullable(); $table->string('attribution_model', 4)->nullable();
......
...@@ -15,12 +15,14 @@ class CreateDictionaryCampaignsTable extends Migration ...@@ -15,12 +15,14 @@ class CreateDictionaryCampaignsTable extends Migration
{ {
Schema::create('dictionary_campaigns', function (Blueprint $table) { Schema::create('dictionary_campaigns', function (Blueprint $table) {
$table->id(); $table->id();
$table->bigInteger('external_id')->nullable();
$table->bigInteger('campaign_id')->unsigned(); $table->bigInteger('campaign_id')->unsigned();
$table->bigInteger('dictionary_id')->unsigned(); $table->bigInteger('dictionary_id')->unsigned();
$table->string('name', 255)->nullable(); $table->string('name', 255)->nullable();
$table->text('negative_keywords')->nullable(); $table->text('negative_keywords')->nullable();
$table->text('excluded_sites')->nullable(); $table->text('excluded_sites')->nullable();
$table->boolean('updated')->default(0); $table->boolean('updated')->default(0);
$table->dateTime('external_upload_at')->nullable();
$table->timestamps(); $table->timestamps();
......
...@@ -3,6 +3,7 @@ Generate local ide helper meta PHPDoc ...@@ -3,6 +3,7 @@ Generate local ide helper meta PHPDoc
```shell script ```shell script
php artisan ide-helper:generate php artisan ide-helper:generate
php artisan ide-helper:meta php artisan ide-helper:meta
php artisan ide-helper:models
``` ```
......
...@@ -34,7 +34,7 @@ class GetCampaignsTest extends TestCase ...@@ -34,7 +34,7 @@ class GetCampaignsTest extends TestCase
]); ]);
$this->token = factory(Tokens::class)->create([ $this->token = factory(Tokens::class)->create([
'created_by' => $this->user->id 'created_by' => $this->user->id
]); ]);
$this->request = APIRequest::getInstance(API::YANDEX) $this->request = APIRequest::getInstance(API::YANDEX)
...@@ -43,68 +43,75 @@ class GetCampaignsTest extends TestCase ...@@ -43,68 +43,75 @@ class GetCampaignsTest extends TestCase
} }
public function testCallApi(){ public function testCallApi()
{
Queue::fake(); Queue::fake();
Queue::assertNothingPushed(); Queue::assertNothingPushed();
$this->request->call(['ids'=>[1,2,3]]); $this->request->call(['ids' => [1, 2, 3]]);
Queue::assertPushed(ProcessCallLimitedAPI::class); Queue::assertPushed(ProcessCallLimitedAPI::class);
} }
public function testHandleApi(){ public function testHandleApi()
$this->request->handle([ {
'result' => [ $data = [
'Campaigns' => [ 'result' => [
'Campaigns' => [
[ [
'Id' => 1, 'Id' => 1,
'Name' => 'test', 'Name' => 'test',
'TimeTargeting' => ['test time schedule'], 'TimeTargeting' => ['test time schedule'],
'NegativeKeywords' => ['Items' => [1,2,3]], 'NegativeKeywords' => ['Items' => [1, 2, 3]],
'BlockedIps' => ['Items' => [1,2,3]], 'BlockedIps' => ['Items' => [1, 2, 3]],
'ExcludedSites' => ['Items' => [1,2,3]], 'ExcludedSites' => ['Items' => [1, 2, 3]],
'DailyBudget' => ['Items' => [1,2,3]], 'DailyBudget' => ['Items' => [1, 2, 3]],
'TextCampaign' => [ 'TextCampaign' => [
'BiddingStrategy' =>[ 'BiddingStrategy' => [
'Search' => [ 'Search' => [
'BiddingStrategyType' => 12312 'BiddingStrategyType' => 12312
], ],
'Network' => [ 'Network' => [
'BiddingStrategyType' => 12312 'BiddingStrategyType' => 12312
] ]
], ],
'Settings' => [123,123,12], 'Settings' => [123, 123, 12],
'CounterIds' => ['Items' => [1,2,3]], 'CounterIds' => ['Items' => [1, 2, 3]],
'RelevantKeywords' => [ 'RelevantKeywords' => [
'BudgetPercent' => 1, 'BudgetPercent' => 1,
'OptimizeGoalId' => 2, 'OptimizeGoalId' => 2,
], ],
'AttributionModel' => 'AL', 'AttributionModel' => 'AL',
'PriorityGoals' => [34234,2435567,23423] 'PriorityGoals' => [34234, 2435567, 23423]
], ],
] ]
] ]
] ]
]); ];
$this->request->handle($data);
$this->assertEquals(1, Campaigns::count()); $this->assertEquals(1, Campaigns::count());
$data_campaign = $data['result']['Campaigns'][0];
$campaign = Campaigns::first(); $campaign = Campaigns::first();
$this->assertEquals($campaign->external_id, 1);
$this->assertEquals($campaign->name, 'test'); $this->assertEquals($campaign->external_id, $data_campaign['Id']);
$this->assertEquals($campaign->time_targeting, json_encode(['test time schedule'])); $this->assertEquals($campaign->name, $data_campaign['Name']);
$this->assertEquals($campaign->negative_keywords, implode("\n", [1,2,3])); $this->assertEquals($campaign->time_targeting, $data_campaign['TimeTargeting']);
$this->assertEquals($campaign->blocked_ips, implode("\n", [1,2,3])); $this->assertEquals($campaign->negative_keywords, $data_campaign['NegativeKeywords']['Items']);
$this->assertEquals($campaign->excluded_sites, implode("\n", [1,2,3])); $this->assertEquals($campaign->blocked_ips, $data_campaign['BlockedIps']['Items']);
$this->assertEquals($campaign->daily_budget, json_encode(['Items' => [1,2,3]])); $this->assertEquals($campaign->excluded_sites, $data_campaign['ExcludedSites']['Items']);
$this->assertEquals($campaign->text_campaign_strategy_search, 12312); $this->assertEquals($campaign->daily_budget, $data_campaign['DailyBudget']['Items']);
$this->assertEquals($campaign->text_campaign_strategy_network, 12312); $this->assertEquals($campaign->text_campaign_strategy_search, $data_campaign['TextCampaign']['BiddingStrategy']['Search']['BiddingStrategyType']);
$this->assertEquals($campaign->settings, json_encode([123,123,12])); $this->assertEquals($campaign->text_campaign_strategy_network, $data_campaign['TextCampaign']['BiddingStrategy']['Network']['BiddingStrategyType']);
$this->assertEquals($campaign->counter_ids, implode("\n", [1,2,3])); $this->assertEquals($campaign->settings, $data_campaign['TextCampaign']['Settings']);
$this->assertEquals($campaign->relevant_keywords_setting_budget_percent, 1); $this->assertEquals($campaign->counter_ids, $data_campaign['TextCampaign']['CounterIds']['Items']);
$this->assertEquals($campaign->relevant_keywords_setting_optimize_goal_id, 2); $this->assertEquals($campaign->relevant_keywords_setting_budget_percent, $data_campaign['TextCampaign']['RelevantKeywords']['BudgetPercent']);
$this->assertEquals($campaign->attribution_model, 'AL'); $this->assertEquals($campaign->relevant_keywords_setting_optimize_goal_id, $data_campaign['TextCampaign']['RelevantKeywords']['OptimizeGoalId']);
$this->assertEquals($campaign->priority_goals, json_encode([34234,2435567,23423])); $this->assertEquals($campaign->attribution_model, $data_campaign['TextCampaign']['AttributionModel']);
$this->assertEquals($campaign->priority_goals, $data_campaign['TextCampaign']['PriorityGoals']);
$this->assertEquals($campaign->updated_self, null); $this->assertEquals($campaign->updated_self, null);
$this->assertEquals($campaign->updated_children, null); $this->assertEquals($campaign->updated_children, null);
} }
......
...@@ -6,7 +6,6 @@ use App\Models\Account; ...@@ -6,7 +6,6 @@ use App\Models\Account;
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\DictionaryCampaign;
use App\Models\Pivots\DictionaryCampaignVariable;
use App\Models\Tokens; use App\Models\Tokens;
use App\Models\User; use App\Models\User;
use App\Models\Variable; use App\Models\Variable;
...@@ -18,6 +17,15 @@ class ReplaceByVariablesTest extends TestCase ...@@ -18,6 +17,15 @@ class ReplaceByVariablesTest extends TestCase
{ {
use RefreshDatabase; use RefreshDatabase;
private $user;
private $token_main;
private $token;
private $campaign;
private $dictionary;
private $variable;
private $variable_2;
private $dictionaryCampaign;
protected function setUp(): void protected function setUp(): void
{ {
parent::setUp(); parent::setUp();
...@@ -83,13 +91,10 @@ class ReplaceByVariablesTest extends TestCase ...@@ -83,13 +91,10 @@ class ReplaceByVariablesTest extends TestCase
$this->assertEquals(2, Variable::count()); $this->assertEquals(2, Variable::count());
$this->assertEquals(1, $this->campaign->dictionaryCampaignVariables->count()); $this->assertEquals(1, $this->campaign->dictionaryCampaignVariables->count());
$variable_list = []; $variable_list = [];
foreach (Variable::all() as $variable) { foreach (Variable::all() as $variable) {
$dictionaryCampaignVariable = $variable->values() $dictionaryCampaignVariable = $variable->findValue($this->dictionaryCampaign->getKey());
->where('dictionary_campaign_id', $this->dictionaryCampaign->getKey())
->first();
$value = ( $value = (
$dictionaryCampaignVariable $dictionaryCampaignVariable
......
Markdown is supported
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!