Commit 16d4677a by Vladislav

#20207 Доработка изменения РК

1 parent 57beb8cd
......@@ -58,7 +58,7 @@ class AdGroupsLoadUpdated extends Command
$factory = APIRequest::getInstance(API::YANDEX);
$factory->setToken($token);
$factory->getRequest('adgroups', 'get')
$factory->getRequest('AdGroups', 'get')
->call([
'CampaignIds' => $token->campaignsAdGroupsForUpdatedSelf->pluck('campaign_external_id')->all(),
]);
......
......@@ -56,7 +56,7 @@ class CampaignsAdd extends Command
$factory = APIRequest::getInstance(API::YANDEX);
$factory->setToken($token);
$factory->getRequest('campaigns', 'add')
$factory->getRequest('Campaigns', 'add')
->call([
'dictionaryCampaigns' => $token->dictionaryCampaignsEnabledForNotExternal,
'variables' => Variable::all(),
......
......@@ -46,7 +46,7 @@ class CampaignsCheckChange extends Command
$factory = APIRequest::getInstance(API::YANDEX);
$factory->setToken($token_main);
$factory->getRequest('change', 'checkCampaigns')
$factory->getRequest('Changes', 'checkCampaigns')
->call();
}
......@@ -57,7 +57,7 @@ class CampaignsCheckChange extends Command
$factory = APIRequest::getInstance(API::YANDEX);
$factory->setToken($token);
$factory->getRequest('change', 'checkCampaigns')
$factory->getRequest('Changes', 'checkCampaigns')
->call();
}
......
......@@ -48,8 +48,8 @@ class CampaignsFirstLoad extends Command
$factory = APIRequest::getInstance(API::YANDEX);
$factory->setToken($token);
$factory->getRequest('change', 'CheckDictionaries')->call();
$factory->getRequest('campaigns', 'get')->call();
$factory->getRequest('Changes', 'CheckDictionaries')->call();
$factory->getRequest('Campaigns', 'get')->call();
return 0;
}
......
......@@ -56,7 +56,7 @@ class CampaignsLoadGroups extends Command
$factory->setToken($token);
$factory->getRequest('adgroups', 'get')
$factory->getRequest('AdGroups', 'get')
->call([
'CampaignIds' => $campaigns->pluck('external_id')->all(),
]);
......
......@@ -60,7 +60,7 @@ class CampaignsLoadUpdated extends Command
$factory = APIRequest::getInstance(API::YANDEX);
$factory->setToken($token);
$factory->getRequest('campaigns', 'get')->call([
$factory->getRequest('Campaigns', 'get')->call([
'ids' => $campaigns->pluck('external_id')->all(),
]);
......@@ -77,7 +77,7 @@ class CampaignsLoadUpdated extends Command
$factory = APIRequest::getInstance(API::YANDEX);
$factory->setToken($token);
$factory->getRequest('campaigns', 'get')->call([
$factory->getRequest('Campaigns', 'get')->call([
'ids' => $token->dictionaryCampaignsEnabledForExternalSynchronizedUpdatedSelf
->pluck('external_id')->all(),
]);
......
......@@ -60,7 +60,7 @@ class CampaignsLoadUpdatedChildrenAdGroups extends Command
$factory = APIRequest::getInstance(API::YANDEX);
$factory->setToken($token);
$factory->getRequest('changes', 'check')->call([
$factory->getRequest('Changes', 'check')->call([
'CampaignIds' => $campaigns->pluck('external_id')->all(),
'FieldNames' => [
'AdGroupIds',
......@@ -81,7 +81,7 @@ class CampaignsLoadUpdatedChildrenAdGroups extends Command
$factory = APIRequest::getInstance(API::YANDEX);
$factory->setToken($token);
$factory->getRequest('changes', 'check')->call([
$factory->getRequest('Changes', 'check')->call([
'CampaignIds' => $token->dictionaryCampaignsEnabledForExternalSynchronizedUpdatedChildren
->pluck('external_id')->all(),
'FieldNames' => [
......
......@@ -74,7 +74,7 @@ class CampaignsResume extends Command
$factory = APIRequest::getInstance(API::YANDEX);
$factory->setToken($token);
$factory->getRequest('campaigns', 'resume')
$factory->getRequest('Campaigns', 'resume')
->call([
'ids' => $token->dictionaryCampaignsEnabledForExternalDisabled->pluck('external_id')->all(),
]);
......
......@@ -73,7 +73,7 @@ class CampaignsSuspend extends Command
$factory = APIRequest::getInstance(API::YANDEX);
$factory->setToken($token);
$factory->getRequest('campaigns', 'suspend')
$factory->getRequest('Campaigns', 'suspend')
->call([
'ids' => $token->dictionaryCampaignsNotEnabledForExternalNotDisabled->pluck('external_id')->all(),
]);
......
......@@ -58,7 +58,6 @@ class CampaignsUpdate extends Command
$factory->getRequest('campaigns', 'update')
->call([
'dictionaryCampaigns' => $token->dictionaryCampaignsEnabledForExternalNeedUpdated,
'variables' => Variable::all(),
]);
}
......
......@@ -51,7 +51,7 @@ class DictionariesLoad extends Command
$factory = APIRequest::getInstance(API::YANDEX);
$factory->setToken($token);
$factory->getRequest('dictionaries', 'get')
$factory->getRequest('Dictionaries', 'get')
->call();
return 0;
......
......@@ -19,6 +19,7 @@ class ProcessCallAPI implements ShouldQueue
private $api;
private $limitId;
/**
* Create a new job instance.
*
......@@ -39,21 +40,21 @@ class ProcessCallAPI implements ShouldQueue
{
$limits = Limits::getInstance($this->api->getToken());
try{
try {
$api = API::getInstance($this->api);
//считаем на сколько объектов зарезервировано получение данных
//только их и запрашиваем
$limit = \App\Models\Limits::find($this->limitId);
//те на которые не хватило баллов помещаем в очередь
if ($apiR = $this->api->chunk($limit->spent)){
dispatch( new ProcessCallLimitedAPI($apiR));
if ($apiR = $this->api->slice($limit->spent)) {
dispatch(new ProcessCallLimitedAPI($apiR));
}
$response = $api->execute();
$limits->acceptRezerv($this->limitId, new HeaderLimits($response->headers()) );
$limits->acceptRezerv($this->limitId, new HeaderLimits($response->headers()));
//TODO: обработать результат.
// если не хватило баллов на все что хотели запросить, то в очередь отправляем новый запрос на получение новых данных
AdsHandler::getInstance($this->api)->handle($response);
}catch(\Exception $e ){
} catch (\Exception $e) {
//TODO: надо отдельно выделить ошибки вызовов, за которые списываются баллы
//https://yandex.ru/dev/direct/doc/dg/concepts/errors.html
$limits->removeRezerv($this->limitId);
......
......@@ -48,7 +48,7 @@ class ProcessCallLimitedAPI implements ShouldQueue//, ShouldBeUnique
try{
//резервируем на это количетсво
$limitId = $limits->doRezerv($this->api, $objects);
$limitId = $limits->doRezerv($this->api, $limits->countObjects($this->api));
}catch(\Exception $e){
//нет свободных баллов, замораживаем до следующего часа
$this->reRunHour();
......
......@@ -80,6 +80,7 @@ class Tokens extends Model
];
protected $casts = [
'limit' => 'integer',
'check_changes' => 'datetime',
'check_changes_campaign' => 'datetime',
'check_changes_ad_group' => 'datetime',
......
......@@ -14,7 +14,8 @@ interface APIRequest{
function getToken(): Tokens;
function getApi(): string;
function chunk($objects): ?APIRequest;
function getCountObjects(): int;
function slice($objects): ?APIRequest;
function call($params = null);
function handle($response);
......
......@@ -5,6 +5,7 @@ interface Limits{
function current(): int;
function DayLimit(): int;
function countObjectsLimit(APIRequest $request): int;
function countObjects(APIRequest $request): int;
function doRezerv(APIRequest $request, int $limit): int;
function removeRezerv(int $id);
function updateLimits(HeaderLimits $limits);
......
......@@ -53,13 +53,21 @@ class Limits implements \App\Service\Contract\Limits {
$this->token->save();
}
function countObjects(\App\Service\Contract\APIRequest $request): int
{
return $request->getCountObjects();
}
function countObjectsLimit(\App\Service\Contract\APIRequest $request): int
{
$cost = $this->limitCosts->getCostObject($request);
if ($this->limitCosts->getCostCall($request) > $this->current()){
$costCall = $this->limitCosts->getCostCall($request);
if ($costCall > $this->current()) {
return 0;
}
return $cost > 0 ? floor(($this->current() - $this->limitCosts->getCostCall($request)) / $cost) : -1;
return $cost > 0 ? floor($this->current() - $this->getSpent($this->countObjects($request), $request)) : -1;
}
/**
......@@ -91,6 +99,7 @@ class Limits implements \App\Service\Contract\Limits {
$rezerv->save();
$this->token->limit -= $limit;
$this->token->save();
DB::commit();
......
......@@ -73,7 +73,12 @@ class APIRequest implements \App\Service\Contract\APIRequest {
return $this->token;
}
function chunk($count): ?\App\Service\Contract\APIRequest
function getCountObjects(): int
{
throw new Exception('Я не знаю как считать кол-во объектов');
}
function slice($count): ?\App\Service\Contract\APIRequest
{
throw new Exception('Я не знаю формата запрсов, чтобы его разбить');
}
......
......@@ -9,16 +9,11 @@ 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)
{
......@@ -35,16 +30,16 @@ class AddCampaigns extends DirectRequest
}
foreach ($response['result']['AddResults'] as $key => $add_result) {
$id = $add_result['Id'] ?? '';
$external_id = $add_result['Id'] ?? '';
if (!$id) {
Log::debug("AddCampaigns, empty Id, [dictionary_campaigns.id = {$this->dictionaryCampaigns->get($key)->getKey()}]");
if (!$external_id) {
Log::debug("AddCampaigns, empty Id");
Log::debug($add_result);
continue;
}
$this->dictionaryCampaigns->get($key)->update([
'external_id' => $id,
DictionaryCampaign::where('external_id', $external_id) ->update([
'external_id' => $external_id,
'external_upload_at' => Carbon::now(),
]);
}
......@@ -53,22 +48,13 @@ class AddCampaigns extends DirectRequest
}
}
public function putParams($params)
{
$this->dictionaryCampaigns = $params['dictionaryCampaigns'];
$this->variables = $params['variables'];
}
private function requestPrepare($params)
{
$this->setService('campaigns');
$this->setService('Campaigns');
$this->setMethod('add');
$this->putParams($params);
$this->setParams([
'Campaigns' => $this->dictionaryCampaigns->map(function ($dictionaryCampaign) {
/* @var DictionaryCampaign $dictionaryCampaign */
'Campaigns' => $this['dictionaryCampaigns']->map(function (DictionaryCampaign $dictionaryCampaign) {
$list = Variable::getListVariablesByDictionaryCampaign($dictionaryCampaign);
......
......@@ -68,7 +68,7 @@ class CheckCampaignsChange extends DirectRequest
private function requestPrepare($params)
{
$this->setService('changes');
$this->setService('Changes');
$this->setMethod('checkCampaigns');
$this->setParams([
'Timestamp' => $this->getToken()->check_changes_campaign_at->toIso8601ZuluString(),
......
......@@ -78,7 +78,7 @@ class CheckChanges extends DirectRequest
private function requestPrepare($params)
{
$this->setService('changes');
$this->setService('Changes');
$this->setMethod('check');
$this->setParams($params);
......
......@@ -15,7 +15,7 @@ class CheckDictionariesChange extends DirectRequest {
}
private function requestPrepare($params){
$this->setService('changes');
$this->setService('Changes');
$this->setMethod('checkDictionaries');
}
}
......@@ -98,7 +98,7 @@ class GetAdGroups extends DirectRequest
private function requestPrepare($filter)
{
$this->setService('adgroups');
$this->setService('AdGroups');
$this->setMethod('get');
$params = [
'SelectionCriteria' => [
......
......@@ -68,7 +68,7 @@ class GetCampaigns extends DirectRequest
private function requestPrepare($filter)
{
$this->setService('campaigns');
$this->setService('Campaigns');
$this->setMethod('get');
$params = [
'SelectionCriteria' => [
......
......@@ -46,7 +46,7 @@ class GetDictionaries extends DirectRequest
private function requestPrepare($params)
{
$this->setService('dictionaries');
$this->setService('Dictionaries');
$this->setMethod('get');
$params = [
'DictionaryNames' => [
......
......@@ -48,7 +48,7 @@ class ResumeCampaigns extends DirectRequest
private function requestPrepare($filter)
{
$this->setService('campaigns');
$this->setService('Campaigns');
$this->setMethod('resume');
$params = [
'SelectionCriteria' => [
......
......@@ -49,7 +49,7 @@ class SuspendCampaigns extends DirectRequest
private function requestPrepare($filter)
{
$this->setService('campaigns');
$this->setService('Campaigns');
$this->setMethod('suspend');
$params = [
'SelectionCriteria' => [
......
......@@ -27,6 +27,23 @@ class UpdateCampaigns extends DirectRequest
dispatch($process)->onQueue('limits');
}
function slice($count): ?\App\Service\Contract\APIRequest
{
if ($count < 0)
return null;
//для запросов get ничего не разбиваем, т.к. заранее не знаем сколько чего будет
//для них только после выполнения запроса будет известно есть ли кроме $count еще данные
//а текущий запрос просто устанавливается в $count
//а вот для запросов мутаторов будем разбивать. Но тут уже будет зависеть от запроса
//будем под каждый реализовывать делитель
if (!isset($this->params['Page'])){
$this->params['Page'] = [];
}
$this->params['Page']['Limit'] = $count;
return null;
}
public function handle($response)
{
try {
......@@ -34,7 +51,7 @@ class UpdateCampaigns extends DirectRequest
$external_id = $add_result['Id'] ?? '';
if (!$external_id) {
Log::debug("AddCampaigns, empty Id, [dictionary_campaigns.id = {$this->dictionaryCampaigns->get($key)->getKey()}]");
Log::debug("AddCampaigns, empty Id");
Log::debug($add_result);
continue;
}
......@@ -50,22 +67,13 @@ class UpdateCampaigns extends DirectRequest
}
}
public function putParams($params)
{
$this->dictionaryCampaigns = $params['dictionaryCampaigns'];
$this->variables = $params['variables'];
}
private function requestPrepare($params)
{
$this->setService('campaigns');
$this->setService('Campaigns');
$this->setMethod('update');
$this->putParams($params);
$this->setParams([
'Campaigns' => $this->dictionaryCampaigns->map(function ($dictionaryCampaign) {
/* @var DictionaryCampaign $dictionaryCampaign */
'Campaigns' => $params['dictionaryCampaigns']->map(function (DictionaryCampaign $dictionaryCampaign) {
$list = Variable::getListVariablesByDictionaryCampaign($dictionaryCampaign);
......
......@@ -20,7 +20,12 @@ class DirectRequest extends APIRequest {
$this->url = config('api.yandex.url');
}
function chunk($count): ?\App\Service\Contract\APIRequest
function getCountObjects(): int
{
return 1;
}
function slice($count): ?\App\Service\Contract\APIRequest
{
return null;
if ($count<0)
......
......@@ -107,8 +107,6 @@ class AddCampaignsTest extends TestCase
]
];
$this->request->putParams($this->params);
$this->request->handle($data);
$this->dictionary->campaigns->first()->pivot->refresh();
......
Markdown is supported
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!