Commit 511a09a8 by Vladislav

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

1 parent fe85f62b
......@@ -45,9 +45,16 @@ class ProcessCallAPI implements ShouldQueue
//считаем на сколько объектов зарезервировано получение данных
//только их и запрашиваем
$limit = \App\Models\Limits::find($this->limitId);
//те на которые не хватило баллов помещаем в очередь
if ($apiR = $this->api->slice($limit->spent)) {
dispatch(new ProcessCallLimitedAPI($apiR));
$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($maxObjects)) {
dispatch(new ProcessCallLimitedAPI($apiR));
}
}
$response = $api->execute();
$limits->acceptRezerv($this->limitId, new HeaderLimits($response->headers()));
......
......@@ -14,7 +14,8 @@ interface APIRequest{
function getToken(): Tokens;
function getApi(): string;
function slice($objects): ?APIRequest;
function slice($maxObjects): ?APIRequest;
function sliceByKey($maxObjects, $key): ?APIRequest;
function call($params = null);
function handle($response);
......
<?php
namespace App\Service\Requests;
use App\Models\Tokens;
use App\Service\API\API;
class APIRequest implements \App\Service\Contract\APIRequest {
class APIRequest implements \App\Service\Contract\APIRequest
{
protected $api;
protected $service;
protected $method;
protected $params;
protected $token;
protected function __construct($api){
protected function __construct($api)
{
$this->api = $api;
}
static function getInstance($type){
switch($type){
static function getInstance($type)
{
switch ($type) {
case API::YANDEX:
return new DirectRequest($type);
default:
......@@ -73,6 +77,58 @@ class APIRequest implements \App\Service\Contract\APIRequest {
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
{
throw new Exception('Я не знаю формата запрсов, чтобы его разбить');
......@@ -83,15 +139,18 @@ class APIRequest implements \App\Service\Contract\APIRequest {
throw new Exception('Я не знаю формата запрсов, чтобы его разбить');
}
function call($params = null){
function call($params = null)
{
}
function handle($response){
function handle($response)
{
}
function getObjectsCount(){
function getObjectsCount()
{
throw new Exception('Не задано сколкьо бъектов обрабатывается');
}
}
......@@ -6,6 +6,7 @@ use App\Jobs\ProcessCallLimitedAPI;
use App\Models\Campaigns;
use App\Models\Pivots\DictionaryCampaign;
use App\Models\Variable;
use App\Service\Contract\APIRequest;
use App\Service\Requests\DirectRequest;
use App\Service\StrReplaceByVariables;
use Carbon\Carbon;
......@@ -29,11 +30,38 @@ class AddCampaigns extends DirectRequest
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)
{
try {
if (!isset($response['result'])) {
Log::debug($response);
Log::debug($this->getParams());
}
foreach ($response['result']['AddResults'] as $key => $add_result) {
......@@ -42,6 +70,7 @@ class AddCampaigns extends DirectRequest
if (!$external_id) {
Log::debug("AddCampaigns, empty Id");
Log::debug($add_result);
Log::debug($this->getParams());
continue;
}
......@@ -49,6 +78,7 @@ class AddCampaigns extends DirectRequest
'external_id' => $external_id,
'external_upload_at' => Carbon::now(),
]);
}
} catch (\Exception $e) {
Log::debug($e);
......@@ -75,70 +105,74 @@ class AddCampaigns extends DirectRequest
$bidding_strategy = $dictionaryCampaign->campaign->bidding_strategy;
if (!isset($bidding_strategy['Network']['NetworkDefault']) && $bidding_strategy['Network']['BiddingStrategyType'] !== 'HIGHEST_POSITION') {
// $bidding_strategy['Network']['NetworkDefault'] = null;
} elseif (isset($bidding_strategy['Network']['NetworkDefault']) && is_null($bidding_strategy['Network']['NetworkDefault']['LimitPercent'])) {
unset($bidding_strategy['Network']['NetworkDefault']);
}
if ($bidding_strategy) {
if (isset($bidding_strategy['Network']['WbMaximumClicks']) && is_null($bidding_strategy['Network']['WbMaximumClicks']['BidCeiling'])) {
unset($bidding_strategy['Network']['WbMaximumClicks']['BidCeiling']);
}
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'])) {
unset($bidding_strategy['Network']['NetworkDefault']);
}
if (isset($bidding_strategy['Network']['WbMaximumConversionRate']) && is_null($bidding_strategy['Network']['WbMaximumConversionRate']['BidCeiling'])) {
unset($bidding_strategy['Network']['WbMaximumConversionRate']['BidCeiling']);
}
if (isset($bidding_strategy['Network']['WbMaximumClicks']) && is_null($bidding_strategy['Network']['WbMaximumClicks']['BidCeiling'])) {
unset($bidding_strategy['Network']['WbMaximumClicks']['BidCeiling']);
}
if (isset($bidding_strategy['Network']['AverageCpc']) && is_null($bidding_strategy['Network']['AverageCpc']['BidCeiling'])) {
unset($bidding_strategy['Network']['AverageCpc']['BidCeiling']);
}
if (isset($bidding_strategy['Network']['WbMaximumConversionRate']) && is_null($bidding_strategy['Network']['WbMaximumConversionRate']['BidCeiling'])) {
unset($bidding_strategy['Network']['WbMaximumConversionRate']['BidCeiling']);
}
if (isset($bidding_strategy['Network']['WeeklyClickPackage']) && is_null($bidding_strategy['Network']['WeeklyClickPackage']['BidCeiling'])) {
unset($bidding_strategy['Network']['WeeklyClickPackage']['BidCeiling']);
}
if (isset($bidding_strategy['Network']['AverageCpc']) && is_null($bidding_strategy['Network']['AverageCpc']['BidCeiling'])) {
unset($bidding_strategy['Network']['AverageCpc']['BidCeiling']);
}
if (isset($bidding_strategy['Network']['AverageRoi']) && is_null($bidding_strategy['Network']['AverageRoi']['BidCeiling'])) {
unset($bidding_strategy['Network']['AverageRoi']['BidCeiling']);
}
if (isset($bidding_strategy['Network']['WeeklyClickPackage']) && is_null($bidding_strategy['Network']['WeeklyClickPackage']['BidCeiling'])) {
unset($bidding_strategy['Network']['WeeklyClickPackage']['BidCeiling']);
}
if (isset($bidding_strategy['Network']['PayForConversion']) && is_null($bidding_strategy['Network']['PayForConversion']['WeeklySpendLimit'])) {
unset($bidding_strategy['Network']['PayForConversion']['WeeklySpendLimit']);
}
if (isset($bidding_strategy['Network']['AverageRoi']) && is_null($bidding_strategy['Network']['AverageRoi']['BidCeiling'])) {
unset($bidding_strategy['Network']['AverageRoi']['BidCeiling']);
}
if (isset($bidding_strategy['Search']['WbMaximumClicks']) && is_null($bidding_strategy['Search']['WbMaximumClicks']['BidCeiling'])) {
unset($bidding_strategy['Search']['WbMaximumClicks']['BidCeiling']);
}
if (isset($bidding_strategy['Network']['PayForConversion']) && is_null($bidding_strategy['Network']['PayForConversion']['WeeklySpendLimit'])) {
unset($bidding_strategy['Network']['PayForConversion']['WeeklySpendLimit']);
}
if (isset($bidding_strategy['Search']['WbMaximumConversionRate']) && is_null($bidding_strategy['Search']['WbMaximumConversionRate']['BidCeiling'])) {
unset($bidding_strategy['Search']['WbMaximumConversionRate']['BidCeiling']);
}
if (isset($bidding_strategy['Search']['WbMaximumClicks']) && is_null($bidding_strategy['Search']['WbMaximumClicks']['BidCeiling'])) {
unset($bidding_strategy['Search']['WbMaximumClicks']['BidCeiling']);
}
if (isset($bidding_strategy['Search']['AverageCpc']) && is_null($bidding_strategy['Search']['AverageCpc']['BidCeiling'])) {
unset($bidding_strategy['Search']['AverageCpc']['BidCeiling']);
}
if (isset($bidding_strategy['Search']['WbMaximumConversionRate']) && is_null($bidding_strategy['Search']['WbMaximumConversionRate']['BidCeiling'])) {
unset($bidding_strategy['Search']['WbMaximumConversionRate']['BidCeiling']);
}
if (isset($bidding_strategy['Search']['AverageCpa']) && is_null($bidding_strategy['Search']['AverageCpa']['BidCeiling'])) {
unset($bidding_strategy['Search']['AverageCpa']['BidCeiling']);
}
if (isset($bidding_strategy['Search']['AverageCpc']) && is_null($bidding_strategy['Search']['AverageCpc']['BidCeiling'])) {
unset($bidding_strategy['Search']['AverageCpc']['BidCeiling']);
}
if (isset($bidding_strategy['Search']['AverageCpa']) && is_null($bidding_strategy['Search']['AverageCpa']['WeeklySpendLimit'])) {
unset($bidding_strategy['Search']['AverageCpa']['WeeklySpendLimit']);
}
if (isset($bidding_strategy['Search']['AverageCpa']) && is_null($bidding_strategy['Search']['AverageCpa']['BidCeiling'])) {
unset($bidding_strategy['Search']['AverageCpa']['BidCeiling']);
}
if (isset($bidding_strategy['Search']['AverageRoi']) && is_null($bidding_strategy['Search']['AverageRoi']['BidCeiling'])) {
unset($bidding_strategy['Search']['AverageRoi']['BidCeiling']);
}
if (isset($bidding_strategy['Search']['AverageCpa']) && is_null($bidding_strategy['Search']['AverageCpa']['WeeklySpendLimit'])) {
unset($bidding_strategy['Search']['AverageCpa']['WeeklySpendLimit']);
}
if (isset($bidding_strategy['Search']['AverageRoi']) && is_null($bidding_strategy['Search']['AverageRoi']['WeeklySpendLimit'])) {
unset($bidding_strategy['Search']['AverageRoi']['WeeklySpendLimit']);
}
if (isset($bidding_strategy['Search']['AverageRoi']) && is_null($bidding_strategy['Search']['AverageRoi']['BidCeiling'])) {
unset($bidding_strategy['Search']['AverageRoi']['BidCeiling']);
}
if (isset($bidding_strategy['Search']['AverageRoi']) && is_null($bidding_strategy['Search']['AverageRoi']['Profitability'])) {
unset($bidding_strategy['Search']['AverageRoi']['Profitability']);
}
if (isset($bidding_strategy['Search']['AverageRoi']) && is_null($bidding_strategy['Search']['AverageRoi']['WeeklySpendLimit'])) {
unset($bidding_strategy['Search']['AverageRoi']['WeeklySpendLimit']);
}
if (isset($bidding_strategy['Search']['AverageRoi']) && is_null($bidding_strategy['Search']['AverageRoi']['Profitability'])) {
unset($bidding_strategy['Search']['AverageRoi']['Profitability']);
}
if (isset($bidding_strategy['Search']['PayForConversion']) && is_null($bidding_strategy['Search']['PayForConversion']['WeeklySpendLimit'])) {
unset($bidding_strategy['Search']['PayForConversion']['WeeklySpendLimit']);
}
if (isset($bidding_strategy['Search']['PayForConversion']) && is_null($bidding_strategy['Search']['PayForConversion']['WeeklySpendLimit'])) {
unset($bidding_strategy['Search']['PayForConversion']['WeeklySpendLimit']);
}
$data = [
......@@ -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
{
protected $timestamp;
function call($params = null)
public function call($params = null)
{
$this->requestPrepare($params);
$process = new ProcessCallLimitedAPI($this);
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 {
foreach ($response['result']['Campaigns'] as $campaign_data) {
......@@ -87,11 +96,4 @@ class GetCampaigns extends DirectRequest
$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;
use App\Jobs\ProcessCallLimitedAPI;
use App\Models\Campaigns;
use App\Models\Pivots\DictionaryCampaign;
use App\Service\Contract\APIRequest;
use App\Service\Requests\DirectRequest;
use Illuminate\Support\Facades\Log;
......@@ -12,14 +13,26 @@ class ResumeCampaigns extends DirectRequest
{
CONST MAX_COUNT = 1000;
function call($params = null)
public function call($params = null)
{
$this->requestPrepare($params);
$process = new ProcessCallLimitedAPI($this);
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 {
foreach ($response['result']['ResumeResults'] as $resume_result) {
......@@ -60,10 +73,4 @@ class ResumeCampaigns extends DirectRequest
$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;
use App\Jobs\ProcessCallLimitedAPI;
use App\Models\Campaigns;
use App\Models\Pivots\DictionaryCampaign;
use App\Service\Contract\APIRequest;
use App\Service\Requests\DirectRequest;
use Carbon\Carbon;
use Illuminate\Support\Facades\Log;
......@@ -13,14 +14,27 @@ class SuspendCampaigns extends DirectRequest
{
CONST MAX_COUNT = 1000;
function call($params = null)
public function call($params = null)
{
$this->requestPrepare($params);
$process = new ProcessCallLimitedAPI($this);
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 {
foreach ($response['result']['SuspendResults'] as $suspend_result) {
......@@ -61,10 +75,4 @@ class SuspendCampaigns extends DirectRequest
$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;
use App\Models\Campaigns;
use App\Models\Pivots\DictionaryCampaign;
use App\Models\Variable;
use App\Service\Contract\APIRequest;
use App\Service\Requests\DirectRequest;
use App\Service\StrReplaceByVariables;
use Carbon\Carbon;
......@@ -24,6 +25,19 @@ class UpdateCampaigns extends DirectRequest
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)
{
try {
......@@ -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 {
$this->url = config('api.yandex.url');
}
function slice($count): ?\App\Service\Contract\APIRequest
function slice($maxObjects): ?\App\Service\Contract\APIRequest
{
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){
......
Markdown is supported
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!