Commit b4769029 by Vladislav

#19468 Первоначальная загрузка групп объявлений

1 parent fe4d2649
<?php
namespace App\Console\Commands;
use App\Models\Campaigns;
use App\Models\Tokens;
use App\Service\API\API;
use App\Service\Requests\APIRequest;
use Illuminate\Console\Command;
class LoadGroupsCampaigns extends Command
{
/**
* The name and signature of the console command.
*
* @var string
*/
protected $signature = 'campaigns:loadGroups';
/**
* 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
* @throws \Exception
*/
public function handle()
{
$campaigns = Campaigns::forGroupsLoadable()->get();
if (!$campaigns->count()) {
return;
}
$token = Tokens::where('type', Tokens::MAIN)->first();
if (!$token) {
throw new \Exception('Не найден токен блин');
}
$factory = APIRequest::getInstance(API::YANDEX);
$factory->setToken($token);
$factory->getRequest('adgroups', 'get')
->call([
'CampaignIds' => $campaigns->pluck('external_id'),
]);
return 0;
}
}
<?php
namespace App\Models;
use Illuminate\Database\Eloquent\Model;
class AdGroup extends Model
{
const STATUS_ACCEPTED = 'ACCEPTED';
const STATUS_DRAFT = 'DRAFT';
const STATUS_MODERATION = 'MODERATION';
const STATUS_PREACCEPTED = 'PREACCEPTED';
const STATUS_REJECTED = 'REJECTED';
const SERVING_ELIGIBLE = 'ELIGIBLE';
const SERVING_RARELY_SERVED = 'RARELY_SERVED';
const TYPE_TEXT_AD_GROUP = 'TEXT_AD_GROUP';
const TYPE_MOBILE_APP_AD_GROUP = 'MOBILE_APP_AD_GROUP';
const TYPE_DYNAMIC_TEXT_AD_GROUP = 'DYNAMIC_TEXT_AD_GROUP';
const TYPE_CPM_BANNER_AD_GROUP = 'CPM_BANNER_AD_GROUP';
const TYPE_CPM_VIDEO_AD_GROUP = 'CPM_VIDEO_AD_GROUP';
const TYPE_SMART_AD_GROUP = 'SMART_AD_GROUP';
const SUB_TYPE_WEBPAGE = 'WEBPAGE';
const SUB_TYPE_FEED = 'FEED';
const SUB_TYPE_NONE = 'NONE';
const SUB_TYPE_KEYWORDS = 'KEYWORDS';
const SUB_TYPE_USER_PROFILE = 'USER_PROFILE';
protected $fillable = [
'campaign_id',
'external_id',
'campaign_external_id',
'name',
'status',
'type',
'sub_type',
'serving_status',
'restricted_region_ids',
'region_ids',
'negative_keywords',
'negative_keyword_shared_set_ids',
'tracking_params',
];
protected $casts = [
'campaign_id' => 'int',
'external_id' => 'int',
'campaign_external_id' => 'int',
'restricted_region_ids' => 'json',
'region_ids' => 'array',
'negative_keywords' => 'json',
'negative_keyword_shared_set_ids' => 'json',
];
}
...@@ -31,8 +31,10 @@ class Campaigns extends Model ...@@ -31,8 +31,10 @@ class Campaigns extends Model
]; ];
protected $casts = [ protected $casts = [
'external_id' => 'int',
'manage' => 'boolean', 'manage' => 'boolean',
'enabled' => 'boolean', 'enabled' => 'boolean',
'groups_loaded_at' => 'datetime',
]; ];
public function scopeForUpdated($query) public function scopeForUpdated($query)
...@@ -40,6 +42,11 @@ class Campaigns extends Model ...@@ -40,6 +42,11 @@ class Campaigns extends Model
$query->whereNotNull('updated'); $query->whereNotNull('updated');
} }
public function scopeForGroupsLoadable($query)
{
$query->whereNull('groups_loaded_at');
}
public function scopeForManaged($query) public function scopeForManaged($query)
{ {
$query->where('manage', true); $query->where('manage', true);
......
<?php
namespace App\Service\Requests\Direct;
use App\Jobs\ProcessCallLimitedAPI;
use App\Models\AdGroup;
use App\Models\Campaigns;
use App\Service\Requests\DirectRequest;
use Carbon\Carbon;
use Illuminate\Support\Facades\DB;
use Illuminate\Support\Facades\Log;
class GetAdGroups extends DirectRequest
{
protected $timestamp;
protected $filter;
function call($params = null)
{
$this->requestPrepare($params);
$process = new ProcessCallLimitedAPI($this);
dispatch($process)->onQueue('limits');
}
function handle($response)
{
DB::beginTransaction();
try {
$data = [];
$campaigns = Campaigns::whereIn('external_id', $this->filter['CampaignIds'])
->get()
->keyBy('external_id');
foreach ($response['result']['AdGroups'] as $ad_group) {
$campaign = $campaigns->get($ad_group['CampaignId']);
$campaign->groups_loaded_at = Carbon::now();
$campaign->save();
if (!$campaign)
continue;
$data[] = [
'campaign_id' => $campaign->getKey(),
'external_id' => $ad_group['Id'],
'campaign_external_id' => $ad_group['CampaignId'],
'name' => $ad_group['Name'],
'status' => $ad_group['Status'],
'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'],
'tracking_params' => $ad_group['TrackingParams'],
];
}
AdGroup::upsert($data, [
'external_id'
], [
'campaign_id',
'external_id',
'campaign_external_id',
'name',
'status',
'type',
'sub_type',
'serving_status',
'restricted_region_ids',
'region_ids',
'negative_keywords',
'negative_keyword_shared_set_ids',
'tracking_params',
]);
DB::commit();
} catch (\Exception $e) {
DB::rollBack();
Log::debug($e);
}
}
private function requestPrepare($filter)
{
$this->filter = $filter;
$this->setService('adgroups');
$this->setMethod('get');
$params = [
'SelectionCriteria' => [
'CampaignIds' => $this->filter['CampaignIds'],
],
"FieldNames" => [
"Id", "CampaignId", "Name", "NegativeKeywords",
"NegativeKeywordSharedSetIds", "RegionIds", "RestrictedRegionIds",
"ServingStatus", "Status", "Subtype", "TrackingParams", "Type",
],
];
$this->setParams($params);
}
}
...@@ -38,6 +38,7 @@ class CreateCampaignsTable extends Migration ...@@ -38,6 +38,7 @@ class CreateCampaignsTable extends Migration
])->nullable(); ])->nullable();
$table->boolean('manage')->default(0); $table->boolean('manage')->default(0);
$table->boolean('enabled')->default(1); $table->boolean('enabled')->default(1);
$table->timestamp('groups_loaded_at')->nullable();
$table->timestamps(); $table->timestamps();
$table->foreign('token')->references('id')->on('tokens'); $table->foreign('token')->references('id')->on('tokens');
......
<?php
use App\Models\AdGroup;
use Illuminate\Database\Migrations\Migration;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Support\Facades\Schema;
class CreateAdGroupsTable extends Migration
{
/**
* Run the migrations.
*
* @return void
*/
public function up()
{
Schema::create('ad_groups', function (Blueprint $table) {
$table->id();
$table->bigInteger('campaign_id')->unsigned();
$table->bigInteger('external_id')->unique();
$table->bigInteger('campaign_external_id');
$table->string('name', 255)->nullable();
$table->string('tracking_params', 255)->nullable();
$table->enum('status', [
AdGroup::STATUS_ACCEPTED,
AdGroup::STATUS_DRAFT,
AdGroup::STATUS_MODERATION,
AdGroup::STATUS_PREACCEPTED,
AdGroup::STATUS_REJECTED,
])->nullable();
$table->enum('serving_status', [
AdGroup::SERVING_ELIGIBLE,
AdGroup::SERVING_RARELY_SERVED,
])->nullable();
$table->enum('type', [
AdGroup::TYPE_TEXT_AD_GROUP,
AdGroup::TYPE_MOBILE_APP_AD_GROUP,
AdGroup::TYPE_DYNAMIC_TEXT_AD_GROUP,
AdGroup::TYPE_CPM_BANNER_AD_GROUP,
AdGroup::TYPE_CPM_VIDEO_AD_GROUP,
AdGroup::TYPE_SMART_AD_GROUP,
])->nullable();
$table->enum('sub_type', [
AdGroup::SUB_TYPE_WEBPAGE,
AdGroup::SUB_TYPE_FEED,
AdGroup::SUB_TYPE_NONE,
AdGroup::SUB_TYPE_KEYWORDS,
AdGroup::SUB_TYPE_USER_PROFILE,
])->nullable();
$table->json('restricted_region_ids')->nullable();
$table->json('region_ids')->nullable();
$table->json('negative_keywords')->nullable();
$table->json('negative_keyword_shared_set_ids')->nullable();
$table->timestamps();
$table->foreign('campaign_id')->references('id')->on('campaigns');
});
}
/**
* Reverse the migrations.
*
* @return void
*/
public function down()
{
Schema::dropIfExists('ad_groups');
}
}
Markdown is supported
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!