Commit 511a09a8 by Vladislav

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

1 parent fe85f62b
...@@ -45,10 +45,17 @@ class ProcessCallAPI implements ShouldQueue ...@@ -45,10 +45,17 @@ class ProcessCallAPI implements ShouldQueue
//считаем на сколько объектов зарезервировано получение данных //считаем на сколько объектов зарезервировано получение данных
//только их и запрашиваем //только их и запрашиваем
$limit = \App\Models\Limits::find($this->limitId); $limit = \App\Models\Limits::find($this->limitId);
$limits = Limits::getInstance($this->api->getToken());
$maxObjects = $limits->countObjectsLimit($this->api);
if ($maxObjects and $maxObjects !== $limits::NAN && $this->api->getObjectsCount() > $maxObjects) {
//те на которые не хватило баллов помещаем в очередь //те на которые не хватило баллов помещаем в очередь
if ($apiR = $this->api->slice($limit->spent)) { if ($apiR = $this->api->slice($maxObjects)) {
dispatch(new ProcessCallLimitedAPI($apiR)); dispatch(new ProcessCallLimitedAPI($apiR));
} }
}
$response = $api->execute(); $response = $api->execute();
$limits->acceptRezerv($this->limitId, new HeaderLimits($response->headers())); $limits->acceptRezerv($this->limitId, new HeaderLimits($response->headers()));
//TODO: обработать результат. //TODO: обработать результат.
......
...@@ -14,7 +14,8 @@ interface APIRequest{ ...@@ -14,7 +14,8 @@ interface APIRequest{
function getToken(): Tokens; function getToken(): Tokens;
function getApi(): string; function getApi(): string;
function slice($objects): ?APIRequest; function slice($maxObjects): ?APIRequest;
function sliceByKey($maxObjects, $key): ?APIRequest;
function call($params = null); function call($params = null);
function handle($response); function handle($response);
......
<?php <?php
namespace App\Service\Requests; namespace App\Service\Requests;
use App\Models\Tokens; use App\Models\Tokens;
use App\Service\API\API; use App\Service\API\API;
class APIRequest implements \App\Service\Contract\APIRequest { class APIRequest implements \App\Service\Contract\APIRequest
{
protected $api; protected $api;
protected $service; protected $service;
protected $method; protected $method;
protected $params; protected $params;
protected $token; protected $token;
protected function __construct($api){ protected function __construct($api)
{
$this->api = $api; $this->api = $api;
} }
static function getInstance($type){ static function getInstance($type)
switch($type){ {
switch ($type) {
case API::YANDEX: case API::YANDEX:
return new DirectRequest($type); return new DirectRequest($type);
default: default:
...@@ -73,6 +77,58 @@ class APIRequest implements \App\Service\Contract\APIRequest { ...@@ -73,6 +77,58 @@ class APIRequest implements \App\Service\Contract\APIRequest {
return $this->token; return $this->token;
} }
function sliceByKey($maxObjects, $key): ?\App\Service\Contract\APIRequest
{
$params = $this->getParams();
if (is_array($key)) {
$params_i = $params;
for ($i = 0; $i < count($key); $i++) {
$params_i = $params_i[$key[$i]];
}
$params_by_key = $params_i;
} else {
$params_by_key = $params[$key];
}
$replication = clone $this;
$objects = $this->sliceArray($params_by_key, 0, $maxObjects);
if (is_array($key)) {
$params = $this->changeInArray($params, $objects, $key);
} else {
$params[$key] = $this->sliceArray($params_by_key, $maxObjects);
}
$replication->setParams($params);
if (is_array($key)) {
$params = $this->changeInArray($params, $objects, $key);
} else {
$params[$key] = $this->sliceArray($params_by_key, $maxObjects);
}
$this->setParams($params);
return $replication;
}
private function sliceArray($params, $offset, $length = null): array
{
return array_values(array_slice($params, $offset, $length));
}
private function changeInArray($params, $objects, $key)
{
$params_i = &$params;
for ($i = 0; $i < count($key); $i++) {
$params_i = &$params_i[$key[$i]];
}
$params_i = $objects;
return $params;
}
function slice($count): ?\App\Service\Contract\APIRequest function slice($count): ?\App\Service\Contract\APIRequest
{ {
throw new Exception('Я не знаю формата запрсов, чтобы его разбить'); throw new Exception('Я не знаю формата запрсов, чтобы его разбить');
...@@ -83,15 +139,18 @@ class APIRequest implements \App\Service\Contract\APIRequest { ...@@ -83,15 +139,18 @@ class APIRequest implements \App\Service\Contract\APIRequest {
throw new Exception('Я не знаю формата запрсов, чтобы его разбить'); throw new Exception('Я не знаю формата запрсов, чтобы его разбить');
} }
function call($params = null){ function call($params = null)
{
} }
function handle($response){ function handle($response)
{
} }
function getObjectsCount(){ function getObjectsCount()
{
throw new Exception('Не задано сколкьо бъектов обрабатывается'); throw new Exception('Не задано сколкьо бъектов обрабатывается');
} }
} }
...@@ -6,6 +6,7 @@ use App\Jobs\ProcessCallLimitedAPI; ...@@ -6,6 +6,7 @@ use App\Jobs\ProcessCallLimitedAPI;
use App\Models\Campaigns; use App\Models\Campaigns;
use App\Models\Pivots\DictionaryCampaign; use App\Models\Pivots\DictionaryCampaign;
use App\Models\Variable; use App\Models\Variable;
use App\Service\Contract\APIRequest;
use App\Service\Requests\DirectRequest; use App\Service\Requests\DirectRequest;
use App\Service\StrReplaceByVariables; use App\Service\StrReplaceByVariables;
use Carbon\Carbon; use Carbon\Carbon;
...@@ -29,11 +30,38 @@ class AddCampaigns extends DirectRequest ...@@ -29,11 +30,38 @@ class AddCampaigns extends DirectRequest
dispatch($process)->onQueue('limits'); dispatch($process)->onQueue('limits');
} }
public function getObjectsCount(){
$params = $this->getParams();
$cnt = count($params['Campaigns']);
return $cnt > self::MAX_COUNT ? self::MAX_COUNT : $cnt;
}
public function slice($maxObjects): ?APIRequest
{
$splinter = $this->sliceByKey($maxObjects, 'Campaigns');
$dictionaryCampaigns_splinter = $this->dictionaryCampaigns->slice($maxObjects)->values();
$splinter->putParams([
'dictionaryCampaigns' => $dictionaryCampaigns_splinter,
'variables' => $this->variables,
]);
$this->putParams([
'dictionaryCampaigns' => $this->dictionaryCampaigns->slice(0, $maxObjects),
'variables' => $this->variables,
]);
return $splinter;
}
public function handle($response) public function handle($response)
{ {
try { try {
if (!isset($response['result'])) { if (!isset($response['result'])) {
Log::debug($response); Log::debug($response);
Log::debug($this->getParams());
} }
foreach ($response['result']['AddResults'] as $key => $add_result) { foreach ($response['result']['AddResults'] as $key => $add_result) {
...@@ -42,6 +70,7 @@ class AddCampaigns extends DirectRequest ...@@ -42,6 +70,7 @@ class AddCampaigns extends DirectRequest
if (!$external_id) { if (!$external_id) {
Log::debug("AddCampaigns, empty Id"); Log::debug("AddCampaigns, empty Id");
Log::debug($add_result); Log::debug($add_result);
Log::debug($this->getParams());
continue; continue;
} }
...@@ -49,6 +78,7 @@ class AddCampaigns extends DirectRequest ...@@ -49,6 +78,7 @@ class AddCampaigns extends DirectRequest
'external_id' => $external_id, 'external_id' => $external_id,
'external_upload_at' => Carbon::now(), 'external_upload_at' => Carbon::now(),
]); ]);
} }
} catch (\Exception $e) { } catch (\Exception $e) {
Log::debug($e); Log::debug($e);
...@@ -75,8 +105,10 @@ class AddCampaigns extends DirectRequest ...@@ -75,8 +105,10 @@ class AddCampaigns extends DirectRequest
$bidding_strategy = $dictionaryCampaign->campaign->bidding_strategy; $bidding_strategy = $dictionaryCampaign->campaign->bidding_strategy;
if (!isset($bidding_strategy['Network']['NetworkDefault']) && $bidding_strategy['Network']['BiddingStrategyType'] !== 'HIGHEST_POSITION') { if ($bidding_strategy) {
// $bidding_strategy['Network']['NetworkDefault'] = null;
if (!isset($bidding_strategy['Network']['NetworkDefault']) && $bidding_strategy['Network']['BiddingStrategyType'] === 'NETWORK_DEFAULT') {
$bidding_strategy['Network']['NetworkDefault'] = (object)[];
} elseif (isset($bidding_strategy['Network']['NetworkDefault']) && is_null($bidding_strategy['Network']['NetworkDefault']['LimitPercent'])) { } elseif (isset($bidding_strategy['Network']['NetworkDefault']) && is_null($bidding_strategy['Network']['NetworkDefault']['LimitPercent'])) {
unset($bidding_strategy['Network']['NetworkDefault']); unset($bidding_strategy['Network']['NetworkDefault']);
} }
...@@ -141,6 +173,8 @@ class AddCampaigns extends DirectRequest ...@@ -141,6 +173,8 @@ class AddCampaigns extends DirectRequest
unset($bidding_strategy['Search']['PayForConversion']['WeeklySpendLimit']); unset($bidding_strategy['Search']['PayForConversion']['WeeklySpendLimit']);
} }
}
$data = [ $data = [
'Name' => StrReplaceByVariables::getInstance($dictionaryCampaign->name, $list)->get(), 'Name' => StrReplaceByVariables::getInstance($dictionaryCampaign->name, $list)->get(),
'StartDate' => Carbon::now()->format('Y-m-d'), 'StartDate' => Carbon::now()->format('Y-m-d'),
...@@ -216,10 +250,4 @@ class AddCampaigns extends DirectRequest ...@@ -216,10 +250,4 @@ class AddCampaigns extends DirectRequest
]); ]);
} }
function getObjectsCount(){
$params = $this->getParams();
$cnt = count($params['Campaigns']);
return $cnt > self::MAX_COUNT ? self::MAX_COUNT : $cnt;
}
} }
...@@ -12,14 +12,23 @@ class GetCampaigns extends DirectRequest ...@@ -12,14 +12,23 @@ class GetCampaigns extends DirectRequest
{ {
protected $timestamp; protected $timestamp;
function call($params = null) public 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) public function getObjectsCount()
{
$params = $this->getParams();
if (isset($params['SelectionCriteria']['Ids']) && count($params['SelectionCriteria']['Ids']) < self::MAX_COUNT){
return count($params['SelectionCriteria']['Ids']);
}
return self::MAX_COUNT;
}
public function handle($response)
{ {
try { try {
foreach ($response['result']['Campaigns'] as $campaign_data) { foreach ($response['result']['Campaigns'] as $campaign_data) {
...@@ -87,11 +96,4 @@ class GetCampaigns extends DirectRequest ...@@ -87,11 +96,4 @@ class GetCampaigns extends DirectRequest
$this->setParams($params); $this->setParams($params);
} }
function getObjectsCount(){
$params = $this->getParams();
if (isset($params['SelectionCriteria']['Ids']) && count($params['SelectionCriteria']['Ids']) < self::MAX_COUNT){
return count($params['SelectionCriteria']['Ids']);
}
return self::MAX_COUNT;
}
} }
...@@ -5,6 +5,7 @@ namespace App\Service\Requests\Direct; ...@@ -5,6 +5,7 @@ namespace App\Service\Requests\Direct;
use App\Jobs\ProcessCallLimitedAPI; use App\Jobs\ProcessCallLimitedAPI;
use App\Models\Campaigns; use App\Models\Campaigns;
use App\Models\Pivots\DictionaryCampaign; use App\Models\Pivots\DictionaryCampaign;
use App\Service\Contract\APIRequest;
use App\Service\Requests\DirectRequest; use App\Service\Requests\DirectRequest;
use Illuminate\Support\Facades\Log; use Illuminate\Support\Facades\Log;
...@@ -12,14 +13,26 @@ class ResumeCampaigns extends DirectRequest ...@@ -12,14 +13,26 @@ class ResumeCampaigns extends DirectRequest
{ {
CONST MAX_COUNT = 1000; CONST MAX_COUNT = 1000;
function call($params = null) public 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) public function getObjectsCount(){
$params = $this->getParams();
$cnt = count($params['SelectionCriteria']['Ids']);
return $cnt > self::MAX_COUNT ? self::MAX_COUNT : $cnt;
}
public function slice($maxObjects): ?APIRequest
{
return $this->sliceByKey($maxObjects, ['SelectionCriteria', 'Ids']);
}
public function handle($response)
{ {
try { try {
foreach ($response['result']['ResumeResults'] as $resume_result) { foreach ($response['result']['ResumeResults'] as $resume_result) {
...@@ -60,10 +73,4 @@ class ResumeCampaigns extends DirectRequest ...@@ -60,10 +73,4 @@ class ResumeCampaigns extends DirectRequest
$this->setParams($params); $this->setParams($params);
} }
function getObjectsCount(){
$params = $this->getParams();
$cnt = count($params['SelectionCriteria']['Ids']);
return $cnt > self::MAX_COUNT ? self::MAX_COUNT : $cnt;
}
} }
...@@ -5,6 +5,7 @@ namespace App\Service\Requests\Direct; ...@@ -5,6 +5,7 @@ namespace App\Service\Requests\Direct;
use App\Jobs\ProcessCallLimitedAPI; use App\Jobs\ProcessCallLimitedAPI;
use App\Models\Campaigns; use App\Models\Campaigns;
use App\Models\Pivots\DictionaryCampaign; use App\Models\Pivots\DictionaryCampaign;
use App\Service\Contract\APIRequest;
use App\Service\Requests\DirectRequest; use App\Service\Requests\DirectRequest;
use Carbon\Carbon; use Carbon\Carbon;
use Illuminate\Support\Facades\Log; use Illuminate\Support\Facades\Log;
...@@ -13,14 +14,27 @@ class SuspendCampaigns extends DirectRequest ...@@ -13,14 +14,27 @@ class SuspendCampaigns extends DirectRequest
{ {
CONST MAX_COUNT = 1000; CONST MAX_COUNT = 1000;
function call($params = null) public 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) public function getObjectsCount()
{
$params = $this->getParams();
$cnt = count($params['SelectionCriteria']['Ids']);
return $cnt > self::MAX_COUNT ? self::MAX_COUNT : $cnt;
}
public function slice($maxObjects): ?APIRequest
{
return $this->sliceByKey($maxObjects, ['SelectionCriteria', 'Ids']);
}
public function handle($response)
{ {
try { try {
foreach ($response['result']['SuspendResults'] as $suspend_result) { foreach ($response['result']['SuspendResults'] as $suspend_result) {
...@@ -61,10 +75,4 @@ class SuspendCampaigns extends DirectRequest ...@@ -61,10 +75,4 @@ class SuspendCampaigns extends DirectRequest
$this->setParams($params); $this->setParams($params);
} }
function getObjectsCount(){
$params = $this->getParams();
$cnt = count($params['SelectionCriteria']['Ids']);
return $cnt > self::MAX_COUNT ? self::MAX_COUNT : $cnt;
}
} }
...@@ -6,6 +6,7 @@ use App\Jobs\ProcessCallLimitedAPI; ...@@ -6,6 +6,7 @@ use App\Jobs\ProcessCallLimitedAPI;
use App\Models\Campaigns; use App\Models\Campaigns;
use App\Models\Pivots\DictionaryCampaign; use App\Models\Pivots\DictionaryCampaign;
use App\Models\Variable; use App\Models\Variable;
use App\Service\Contract\APIRequest;
use App\Service\Requests\DirectRequest; use App\Service\Requests\DirectRequest;
use App\Service\StrReplaceByVariables; use App\Service\StrReplaceByVariables;
use Carbon\Carbon; use Carbon\Carbon;
...@@ -24,6 +25,19 @@ class UpdateCampaigns extends DirectRequest ...@@ -24,6 +25,19 @@ class UpdateCampaigns extends DirectRequest
dispatch($process)->onQueue('limits'); dispatch($process)->onQueue('limits');
} }
public function getObjectsCount()
{
$params = $this->getParams();
$cnt = count($params['Campaigns']);
return $cnt > self::MAX_COUNT ? self::MAX_COUNT : $cnt;
}
public function slice($maxObjects): ?APIRequest
{
return $this->sliceByKey($maxObjects, 'Campaigns');
}
public function handle($response) public function handle($response)
{ {
try { try {
...@@ -127,10 +141,4 @@ class UpdateCampaigns extends DirectRequest ...@@ -127,10 +141,4 @@ class UpdateCampaigns extends DirectRequest
]); ]);
} }
function getObjectsCount(){
$params = $this->getParams();
$cnt = count($params['Campaigns']);
return $cnt > self::MAX_COUNT ? self::MAX_COUNT : $cnt;
}
} }
...@@ -20,21 +20,9 @@ class DirectRequest extends APIRequest { ...@@ -20,21 +20,9 @@ class DirectRequest extends APIRequest {
$this->url = config('api.yandex.url'); $this->url = config('api.yandex.url');
} }
function slice($count): ?\App\Service\Contract\APIRequest function slice($maxObjects): ?\App\Service\Contract\APIRequest
{ {
return null; return null;
if ($count<0)
return null;
//для запросов get ничего не разбиваем, т.к. заранее не знаем сколько чего будет
//для них только после выполнения запроса будет известно есть ли кроме $count еще данные
//а текущий запрос просто устанавливается в $count
//а вот для запросов мутаторов будем разбивать. Но тут уже будет зависеть от запроса
//будем под каждый реализовывать делитель
if (!isset($this->params['Page'])){
$this->params['Page'] = [];
}
$this->params['Page']['Limit'] = $count;
return null;
} }
function next($offset){ function next($offset){
......
Markdown is supported
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!