Commit 5f316da6 by Vladislav

#19456 Запрос измененных РК и сохранение инфы об этом

1 parent 2cf96902
......@@ -40,16 +40,26 @@ class CampaignsCheckChange extends Command
*/
public function handle()
{
$token = Tokens::where('type', Tokens::MAIN)->first();
if (!$token){
throw new \Exception('Не найден токен блин');
$token_main = Tokens::where('type', Tokens::MAIN)->first();
if ($token_main){
$factory = APIRequest::getInstance(API::YANDEX);
$factory->setToken($token_main);
$factory->getRequest('change', 'checkCampaigns')
->call();
}
$tokens = Tokens::has('dictionaryCampaignsForExternal')
->where('type', '!=', Tokens::MAIN)->get();
foreach ($tokens as $token) {
$factory = APIRequest::getInstance(API::YANDEX);
$factory->setToken($token);
$factory->getRequest('change', 'checkCampaigns')
->call();
}
return 0;
}
......
......@@ -4,6 +4,7 @@ namespace App\Console\Commands;
use App\Jobs\ProcessCallLimitedAPI;
use App\Models\Campaigns;
use App\Models\Pivots\DictionaryCampaign;
use App\Models\Tokens;
use App\Service\API\API;
use App\Service\Direct\CheckDictionaries;
......@@ -46,12 +47,12 @@ class CampaignsLoadUpdated extends Command
public function handle()
{
$campaigns = Campaigns::forUpdatedSelf()->get();
if (!$campaigns->count()){
if (!$campaigns->count()) {
return;
}
$token = Tokens::where('type', Tokens::MAIN)->first();
if (!$token){
if (!$token) {
throw new \Exception('Не найден токен блин');
}
......@@ -59,12 +60,29 @@ class CampaignsLoadUpdated extends Command
$factory->setToken($token);
$ids = [];
foreach ($campaigns as $campaign){
foreach ($campaigns as $campaign) {
$ids[] = $campaign['external_id'];
}
if (!empty($ids)){
$factory->getRequest('campaigns', 'get')->call(['ids' => $ids]);
$factory->getRequest('campaigns', 'get')->call([
'ids' => $campaigns->map(function (Campaigns $campaign) {
return $campaign->external_id;
})
]);
$tokens = Tokens::has('dictionaryCampaignsForExternalSynchronizedUpdatedSelf')
->with('dictionaryCampaignsForExternalSynchronizedUpdatedSelf')
->where('type', '!=', Tokens::MAIN)->get();
foreach ($tokens as $token) {
$factory = APIRequest::getInstance(API::YANDEX);
$factory->setToken($token);
$factory->getRequest('change', 'checkCampaigns')->call([
'ids' => $token->dictionaryCampaignsForExternalSynchronizedUpdatedSelf->map(function (DictionaryCampaign $dictionaryCampaign) {
return $dictionaryCampaign->external_id;
})
]);
}
return 0;
......
......@@ -4,6 +4,7 @@ namespace App\Models;
use App\Models\Pivots\DictionaryCampaignVariable;
use App\Models\Pivots\DictionaryCampaign;
use Illuminate\Database\Eloquent\Builder;
use Illuminate\Database\Eloquent\Factories\HasFactory;
use Illuminate\Database\Eloquent\Model;
......@@ -42,15 +43,13 @@ use Illuminate\Database\Eloquent\Model;
* @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 forEnabled()
* @method static \Illuminate\Database\Eloquent\Builder|Campaigns forGroupsLoadable()
* @method static \Illuminate\Database\Eloquent\Builder|Campaigns forManaged()
* @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 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 notForEnabled()
* @method static \Illuminate\Database\Eloquent\Builder|Campaigns notForManaged()
* @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)
......@@ -126,8 +125,7 @@ class Campaigns extends Model
{
parent::boot();
static::created(function(Campaigns $campaign)
{
static::created(function (Campaigns $campaign) {
if ($campaign->manage) {
Dictionary::whereNotNull('token_id')->each(function (Dictionary $dictionary) use ($campaign) {
$campaign->dictionaries()->syncWithoutDetaching([
......@@ -137,8 +135,7 @@ class Campaigns extends Model
}
});
static::updated(function(Campaigns $campaign)
{
static::updated(function (Campaigns $campaign) {
if ($campaign->manage !== $campaign->getOriginal('manage')) {
if ($campaign->manage) {
Dictionary::whereNotNull('token_id')->each(function (Dictionary $dictionary) use ($campaign) {
......@@ -150,6 +147,13 @@ class Campaigns extends Model
$campaign->dictionaries()->detach();
}
}
if (DictionaryCampaign::getPropertiesCopyWithPivot()->first(function ($property_name) use ($campaign) {
return $campaign->{$property_name} !== $campaign->getOriginal($property_name);
})) {
$campaign->dictionaryCampaigns()->synchronized()->update(
DictionaryCampaign::copyPropertyInCampaign($campaign)
);
}
});
}
......@@ -176,38 +180,29 @@ class Campaigns extends Model
->withTimestamps();
}
public function scopeForUpdatedSelf($query)
public function scopeForUpdatedSelf(Builder $query)
{
$query->whereNotNull('updated_self');
}
public function scopeForUpdatedChildren($query)
public function scopeForUpdatedChildren(Builder $query)
{
$query->whereNotNull('updated_children');
}
public function scopeForGroupsLoadable($query)
public function scopeForGroupsLoadable(Builder $query)
{
$query->whereNull('groups_loaded_at');
}
public function scopeForManaged($query)
{
$query->where('manage', true);
}
public function scopeNotForManaged($query)
public function scopeForManaged(Builder $query, $manage = true)
{
$query->where('manage', false);
$query->where('manage', $manage);
}
public function scopeForEnabled($query)
public function scopeForEnabled(Builder $query, $enabled = true)
{
$query->where('enabled', true);
$query->where('enabled', $enabled);
}
public function scopeNotForEnabled($query)
{
$query->where('enabled', false);
}
}
......@@ -8,6 +8,7 @@ use App\Models\Limits;
use App\Models\Variable;
use Illuminate\Database\Eloquent\Builder;
use Illuminate\Database\Eloquent\Relations\Pivot;
use Illuminate\Support\Collection;
/**
* App\Models\Pivots\DictionaryCampaign
......@@ -24,13 +25,22 @@ use Illuminate\Database\Eloquent\Relations\Pivot;
* @property string|null $name
* @property array|null $negative_keywords
* @property array|null $excluded_sites
* @property int $updated
* @property \Illuminate\Support\Carbon|null $created_at
* @property bool $updated
* @property bool $synced
* @property \Illuminate\Support\Carbon|null $external_upload_at
* @property \Illuminate\Support\Carbon|null $created_atd
* @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 forExternal()
* @method static \Illuminate\Database\Eloquent\Builder|DictionaryCampaign forNotExternal()
* @method static \Illuminate\Database\Eloquent\Builder|DictionaryCampaign updated($value = true)
* @method static \Illuminate\Database\Eloquent\Builder|DictionaryCampaign synced($value = true)
* @method static \Illuminate\Database\Eloquent\Builder|DictionaryCampaign synchronized()
* @method static \Illuminate\Database\Eloquent\Builder|DictionaryCampaign notExternalUpdated()
* @method static \Illuminate\Database\Eloquent\Builder|DictionaryCampaign forUpdatedSelf()
* @method static \Illuminate\Database\Eloquent\Builder|DictionaryCampaign forUpdatedChildren()
* @method static \Illuminate\Database\Eloquent\Builder|DictionaryCampaign 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()
......@@ -44,7 +54,6 @@ 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
......@@ -60,6 +69,9 @@ class DictionaryCampaign extends Pivot
'negative_keywords',
'excluded_sites',
'external_upload_at',
'external_updated_at',
'updated_self',
'updated_children',
'updated',
'synced',
];
......@@ -71,50 +83,108 @@ class DictionaryCampaign extends Pivot
'negative_keywords' => 'array',
'excluded_sites' => 'array',
'external_upload_at' => 'datetime',
'external_updated_at' => 'datetime',
'updated_self' => 'datetime',
'updated_children' => 'datetime',
'updated' => 'boolean',
'synced' => 'boolean',
];
static public function getExcludeCopyWithPivot()
static public function getWithPivot()
{
return [
'name',
'negative_keywords',
'excluded_sites',
'external_upload_at',
'external_updated_at',
'updated_self',
'updated_children',
'updated',
'synced',
];
}
static public function getWithPivot()
/**
* @return Collection
*/
static public function getPropertiesCopyWithPivot()
{
return [
return collect([
'name',
'negative_keywords',
'excluded_sites',
'external_upload_at',
'updated',
'synced',
];
]);
}
static public function copyPropertyInCampaign(Campaigns $campaign)
/**
* @param Campaigns|array $campaign
*/
static public function copyPropertyInCampaign($campaign)
{
return collect(self::getWithPivot())
->filter(function ($property_name){
return !in_array($property_name, self::getExcludeCopyWithPivot());
})
return self::getPropertiesCopyWithPivot()
->transform(function ($property_name) use ($campaign) {
$value = null;
if ($campaign instanceof Campaigns) {
$value = $campaign->{$property_name};
} elseif (is_array($campaign) && isset($campaign[$property_name])) {
$value = $campaign[$property_name];
}
return [
$property_name => $campaign->{$property_name}
];
})->flatMap(function ($val){
})->flatMap(function ($val) {
return $val;
})->all();
}
public function scopeForExternal(Builder $query)
{
return $query->whereNotNull('external_id');
}
public function scopeForNotExternal(Builder $query)
{
return $query->whereNull('external_id');
}
public function scopeUpdated(Builder $query, $updated = true)
{
return $query->where('updated', $updated);
}
public function scopeSynced(Builder $query, $synced = true)
{
return $query->where('synced', $synced);
}
public function scopeSynchronized(Builder $query)
{
return $query->synced()
->where(function (Builder $query) {
$query->updated()->orWhere(function (Builder $query) {
$query->updated(false)->notExternalUpdated();
});
});
}
public function scopeNotExternalUpdated(Builder $query)
{
$query->whereNull('external_updated_at');
}
public function scopeForUpdatedSelf(Builder $query)
{
$query->whereNotNull('updated_self');
}
public function scopeForUpdatedChildren(Builder $query)
{
$query->whereNotNull('updated_children');
}
public function scopeJoinDictionaries(Builder $query)
{
$dictionary_model = Dictionary::getModel();
......
......@@ -50,7 +50,12 @@ class Tokens extends Model
CONST MAIN = 'main';
CONST GOAL = 'goal';
protected $fillable = ['token', 'login', 'type'];
protected $fillable = [
'token',
'login',
'type',
'timestamp',
];
public function scopeFilter($query, array $filters)
{
......@@ -90,15 +95,22 @@ class Tokens extends Model
{
return $this->hasManyThrough(DictionaryCampaign::class, Dictionary::class, 'token_id', 'dictionary_id')
->orderBy(DictionaryCampaign::getModel()->getTable() . '.created_at', 'ASC')
->forNotExternal();
->orderBy(DictionaryCampaign::getModel()->getTable() . '.' . DictionaryCampaign::getModel()->getKeyName(), 'ASC');
}
public function dictionaryCampaignsForNotExternal()
{
return $this->dictionaryCampaigns()
->orderBy(DictionaryCampaign::getModel()->getTable() . '.created_at', 'ASC')
->orderBy(DictionaryCampaign::getModel()->getTable() . '.' . DictionaryCampaign::getModel()->getKeyName(), 'ASC')
->forNotExternal();
return $this->dictionaryCampaigns()->forNotExternal();
}
public function dictionaryCampaignsForExternal()
{
return $this->dictionaryCampaigns()->forExternal();
}
public function dictionaryCampaignsForExternalSynchronizedUpdatedSelf()
{
return $this->dictionaryCampaignsForExternal()->synchronized()->forUpdatedSelf();
}
public function campaignsForManaged()
......@@ -108,6 +120,6 @@ class Tokens extends Model
public function campaignsNotForManaged()
{
return $this->campaigns()->notForManaged();
return $this->campaigns()->forManaged(false);
}
}
......@@ -4,6 +4,7 @@ namespace App\Service\Requests\Direct;
use App\Jobs\ProcessCallLimitedAPI;
use App\Models\Campaigns;
use App\Models\Pivots\DictionaryCampaign;
use App\Service\API\API;
use App\Service\Requests\APIRequest;
use App\Service\Requests\DirectRequest;
......@@ -26,27 +27,39 @@ class CheckCampaignsChange extends DirectRequest
function handle($response)
{
foreach ($response['result']['Campaigns'] as $campaign) {
if (in_array(self::SELF, $campaign['ChangesIn']) || in_array(self::CHILDREN, $campaign['ChangesIn'])) {
$data = [
'token' => $this->getToken()->id,
];
foreach ($response['result']['Campaigns'] as $campaign_data) {
if (in_array(self::SELF, $campaign_data['ChangesIn']) || in_array(self::CHILDREN, $campaign_data['ChangesIn'])) {
$data = [];
if (in_array(self::SELF, $campaign['ChangesIn'])) {
if (in_array(self::SELF, $campaign_data['ChangesIn'])) {
$data['updated_self'] = Carbon::now();
}
if (in_array(self::CHILDREN, $campaign['ChangesIn'])) {
if (in_array(self::CHILDREN, $campaign_data['ChangesIn'])) {
$data['updated_children'] = Carbon::now();
}
$external_id = $campaign_data['CampaignId'];
if ($this->getToken()->isMain()) {
$data['token'] = $this->getToken()->getKey();
Campaigns::firstOrCreate([
'external_id' => $campaign['CampaignId']
'external_id' => $external_id
], $data);
} else {
$dictionaryCampaign = DictionaryCampaign::synchronized()->find($external_id);
if ($dictionaryCampaign) {
$data['external_updated_at'] = Carbon::now();
$dictionaryCampaign->update($data);
}
}
}
$this->getToken()->timestamp = $response['result']['Timestamp'];
$this->getToken()->save();
}
$this->getToken()->update([
'timestamp' => $response['result']['Timestamp'],
]);
$this->setToken($this->getToken()->refresh());
}
private function requestPrepare($params)
......
......@@ -4,6 +4,7 @@ namespace App\Service\Requests\Direct;
use App\Jobs\ProcessCallLimitedAPI;
use App\Models\Campaigns;
use App\Models\Pivots\DictionaryCampaign;
use App\Service\Requests\DirectRequest;
use Illuminate\Support\Facades\Log;
......@@ -21,28 +22,44 @@ class GetCampaigns extends DirectRequest
function handle($response)
{
try {
$data = [];
foreach ($response['result']['Campaigns'] as $campaign) {
$data[] = [
'external_id' => $campaign['Id'],
$campaigns_data = [];
foreach ($response['result']['Campaigns'] as $campaign_data) {
$data = [
'external_id' => $campaign_data['Id'],
'token' => $this->getToken()->id,
'name' => $campaign['Name'],
'time_targeting' => json_encode($campaign['TimeTargeting']),
'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'] ?? []),
'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' => 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'],
'priority_goals' => json_encode($campaign['TextCampaign']['PriorityGoals']),
'name' => $campaign_data['Name'],
'time_targeting' => json_encode($campaign_data['TimeTargeting']),
'negative_keywords' => json_encode($campaign_data['NegativeKeywords']['Items'] ?? []),
'blocked_ips' => json_encode($campaign_data['BlockedIps']['Items'] ?? []),
'excluded_sites' => json_encode($campaign_data['ExcludedSites']['Items'] ?? []),
'daily_budget' => json_encode($campaign_data['DailyBudget'] ?? []),
'text_campaign_strategy_search' => $campaign_data['TextCampaign']['BiddingStrategy']['Search']['BiddingStrategyType'],
'text_campaign_strategy_network' => $campaign_data['TextCampaign']['BiddingStrategy']['Network']['BiddingStrategyType'],
'settings' => json_encode($campaign_data['TextCampaign']['Settings'] ?? []),
'counter_ids' => json_encode($campaign_data['TextCampaign']['CounterIds']['Items'] ?? []),
'relevant_keywords_setting_budget_percent' => $campaign_data['TextCampaign']['RelevantKeywords']['BudgetPercent'],
'relevant_keywords_setting_optimize_goal_id' => $campaign_data['TextCampaign']['RelevantKeywords']['OptimizeGoalId'],
'attribution_model' => $campaign_data['TextCampaign']['AttributionModel'],
'priority_goals' => json_encode($campaign_data['TextCampaign']['PriorityGoals']),
'updated_self' => null,
'updated_children' => null,
];
$campaigns_data[] = $data;
}
Campaigns::upsert($data, [
if ($this->getToken()->isMain()) {
foreach ($campaigns_data as $campaign_data) {
$dictionaryCampaign = DictionaryCampaign::synchronized()
->find($campaign_data['external_id']);
if (!$dictionaryCampaign)
continue;
$dictionaryCampaign->update(
$dictionaryCampaign::copyPropertyInCampaign($campaign_data)
);
}
Campaigns::upsert($campaigns_data, [
'external_id'
], [
'token',
......@@ -59,7 +76,13 @@ class GetCampaigns extends DirectRequest
'relevant_keywords_setting_budget_percent',
'relevant_keywords_setting_optimize_goal_id',
'attribution_model',
'priority_goals',
'updated_self',
'updated_children',
]);
} else {
}
} catch (\Exception $e) {
Log::debug($e);
}
......
......@@ -23,7 +23,10 @@ class CreateDictionaryCampaignsTable extends Migration
$table->text('excluded_sites')->nullable();
$table->boolean('synced')->default(1);
$table->boolean('updated')->default(0);
$table->dateTime('external_upload_at')->nullable();
$table->timestamp('external_upload_at')->nullable();
$table->timestamp('external_updated_at')->nullable();
$table->timestamp('updated_self')->nullable();
$table->timestamp('updated_children')->nullable();
$table->timestamps();
......
......@@ -5,6 +5,7 @@ namespace Tests\Unit;
use App\Jobs\ProcessCallLimitedAPI;
use App\Models\Account;
use App\Models\Campaigns;
use App\Models\Dictionary;
use App\Models\Tokens;
use App\Models\User;
use App\Service\Contract\API;
......@@ -18,6 +19,10 @@ class CheckCampaignsTest extends TestCase
use RefreshDatabase;
private $request;
private $user;
private $token_main;
private $token;
private $dictionary;
protected function setUp(): void
{
......@@ -33,30 +38,48 @@ class CheckCampaignsTest extends TestCase
'owner' => true,
]);
$this->token_main = factory(Tokens::class)->create([
'type' => Tokens::MAIN,
'created_by' => $this->user->id
]);
$this->token = factory(Tokens::class)->create([
'created_by' => $this->user->id
]);
$this->dictionary = factory(Dictionary::class)->create([
'token_id' => $this->token,
'type' => Dictionary::CITY,
]);
$this->request_main = APIRequest::getInstance(API::YANDEX)
->setToken($this->token_main)
->getRequest('change', 'CheckCampaigns');
$this->request = APIRequest::getInstance(API::YANDEX)
->setToken($this->token)
->getRequest('change', 'CheckCampaigns');
}
public function testCallApi(){
public function testCallApi()
{
Queue::fake();
Queue::assertNothingPushed();
$this->request_main->call();
$this->request->call();
Queue::assertPushed(ProcessCallLimitedAPI::class);
}
public function testHandleApi(){
public function testHandleApi()
{
$this->assertEquals(0, Campaigns::forUpdatedSelf()->count());
$this->assertEquals(0, Campaigns::forUpdatedChildren()->count());
$this->request->handle([
$this->request_main->handle([
'result' => [
'Timestamp' => 'test time',
'Campaigns' => [
......@@ -72,8 +95,58 @@ class CheckCampaignsTest extends TestCase
]
]);
$this->assertEquals($this->request->getToken()->timestamp, 'test time');
$this->assertEquals($this->request_main->getToken()->timestamp, 'test time');
$this->assertEquals(1, Campaigns::forUpdatedSelf()->count());
$this->assertEquals(2, Campaigns::forUpdatedChildren()->count());
$campaign = Campaigns::first();
$this->actingAs($this->user)
->post(route('token.campaign.managed', [
$this->token_main->getKey(),
$campaign->getKey(),
]), [
'managed' => true,
])
->assertStatus(302);
$campaign->update([
'external_id' => 1,
]);
$campaign->refresh();
$this->assertEquals(true, $campaign->manage);
$this->assertEquals(1, $campaign->external_id);
$this->actingAs($this->user)
->post(route('token.city.store', [
$this->token->getKey(),
$this->dictionary->getKey(),
]))
->assertStatus(302);
$this->assertEquals(1, $this->dictionary->campaigns()->count());
$this->request->handle([
'result' => [
'Timestamp' => 'test time 2',
'Campaigns' => [
[
'ChangesIn' => ['SELF', 'CHILDREN'],
'CampaignId' => 1
]
]
]
]);
$this->assertEquals($this->request->getToken()->timestamp, 'test time 2');
$campaign = $this->dictionary->campaigns()->first();
$this->assertNotNull($campaign->pivot->external_updated_at);
$this->assertNotNull($campaign->pivot->updated_self);
$this->assertNotNull($campaign->pivot->updated_children);
}
}
......@@ -18,6 +18,8 @@ class GetCampaignsTest extends TestCase
use RefreshDatabase;
private $request;
private $user;
private $token_main;
protected function setUp(): void
{
......@@ -33,12 +35,13 @@ class GetCampaignsTest extends TestCase
'owner' => true,
]);
$this->token = factory(Tokens::class)->create([
'created_by' => $this->user->id
$this->token_main = factory(Tokens::class)->create([
'type' => Tokens::MAIN,
'created_by' => $this->user->id,
]);
$this->request = APIRequest::getInstance(API::YANDEX)
->setToken($this->token)
->setToken($this->token_main)
->getRequest('campaigns', 'get');
}
......
Markdown is supported
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!