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('Не задано сколкьо бъектов обрабатывается');
}
}
......@@ -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!