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