Commit 1d3edb98 by Евгений

Добавл расчеты баллов

1 parent 16d4677a
...@@ -48,19 +48,13 @@ class ProcessCallLimitedAPI implements ShouldQueue//, ShouldBeUnique ...@@ -48,19 +48,13 @@ class ProcessCallLimitedAPI implements ShouldQueue//, ShouldBeUnique
try{ try{
//резервируем на это количетсво //резервируем на это количетсво
$limitId = $limits->doRezerv($this->api, $limits->countObjects($this->api)); $limitId = $limits->doRezerv($this->api, $objects);
}catch(\Exception $e){ }catch(\Exception $e){
//нет свободных баллов, замораживаем до следующего часа //нет свободных баллов, замораживаем до следующего часа
$this->reRunHour(); $this->reRunHour();
return; return;
} }
//TODO: Вызов разбиения и проверки сколько объектов получать надо будет делать после обработки результатов.
// в том случае, если окажется что были получены не все запрошенные объекты
// т.к. мы не знам сколько там на самом деел объектов, может там их 10, при это лимит стоит 2000
// нам разрешено получить 100. Мы запрапшиваем только 100, получаем 10, но если уже сейчас поставим сразу вторую заадчу на получение еще 100
// то выйдет что зря потратим баллы на еще один азпрос
//вызываем очередь получения данных от АПИ //вызываем очередь получения данных от АПИ
//туда передаем сохраненный лимит //туда передаем сохраненный лимит
//там уже либо будет удален, если не удастся выполнить запрос //там уже либо будет удален, если не удастся выполнить запрос
......
...@@ -19,4 +19,6 @@ interface APIRequest{ ...@@ -19,4 +19,6 @@ interface APIRequest{
function call($params = null); function call($params = null);
function handle($response); function handle($response);
function getObjectsCount();//возвращаем сколько объектов обрабатывается запросом. Для выборок, максимальное что может вернуться.
} }
...@@ -5,7 +5,6 @@ interface Limits{ ...@@ -5,7 +5,6 @@ interface Limits{
function current(): int; function current(): int;
function DayLimit(): int; function DayLimit(): int;
function countObjectsLimit(APIRequest $request): int; function countObjectsLimit(APIRequest $request): int;
function countObjects(APIRequest $request): int;
function doRezerv(APIRequest $request, int $limit): int; function doRezerv(APIRequest $request, int $limit): int;
function removeRezerv(int $id); function removeRezerv(int $id);
function updateLimits(HeaderLimits $limits); function updateLimits(HeaderLimits $limits);
......
...@@ -8,6 +8,8 @@ use Illuminate\Support\Facades\DB; ...@@ -8,6 +8,8 @@ use Illuminate\Support\Facades\DB;
class Limits implements \App\Service\Contract\Limits { class Limits implements \App\Service\Contract\Limits {
CONST NAN = -1;
private $token; private $token;
private $limitCosts; private $limitCosts;
...@@ -53,21 +55,27 @@ class Limits implements \App\Service\Contract\Limits { ...@@ -53,21 +55,27 @@ class Limits implements \App\Service\Contract\Limits {
$this->token->save(); $this->token->save();
} }
function countObjects(\App\Service\Contract\APIRequest $request): int /**
{ * @param Contract\APIRequest $request
return $request->getCountObjects(); * @return int
} * возвращает сколько объектов можем обработать
* если это выборка, то возвращаем максимум 10 000, это максимум что возвращает АПИ, дальше уже пейджинг.
*/
function countObjectsLimit(\App\Service\Contract\APIRequest $request): int function countObjectsLimit(\App\Service\Contract\APIRequest $request): int
{ {
$cost = $this->limitCosts->getCostObject($request); $cost = $this->limitCosts->getCostObject($request);
$costCall = $this->limitCosts->getCostCall($request); if ($this->limitCosts->getCostCall($request) > $this->current()){
if ($costCall > $this->current()) {
return 0; return 0;
} }
if ($cost==0){
return $cost > 0 ? floor($this->current() - $this->getSpent($this->countObjects($request), $request)) : -1; return self::NAN;
}
$maxCount = floor(($this->current() - $this->limitCosts->getCostCall($request)) / $cost);
$objects = $request->getObjectsCount();
if ($objects > $maxCount){
$objects = $maxCount;
}
return $objects;
} }
/** /**
...@@ -99,7 +107,6 @@ class Limits implements \App\Service\Contract\Limits { ...@@ -99,7 +107,6 @@ class Limits implements \App\Service\Contract\Limits {
$rezerv->save(); $rezerv->save();
$this->token->limit -= $limit; $this->token->limit -= $limit;
$this->token->save(); $this->token->save();
DB::commit(); DB::commit();
......
...@@ -95,4 +95,8 @@ class APIRequest implements \App\Service\Contract\APIRequest { ...@@ -95,4 +95,8 @@ class APIRequest implements \App\Service\Contract\APIRequest {
function handle($response){ function handle($response){
} }
function getObjectsCount(){
throw new Exception('Не задано сколкьо бъектов обрабатывается');
}
} }
...@@ -13,6 +13,8 @@ use Illuminate\Support\Facades\Log; ...@@ -13,6 +13,8 @@ use Illuminate\Support\Facades\Log;
class AddCampaigns extends DirectRequest class AddCampaigns extends DirectRequest
{ {
CONST MAX_COUNT = 10;
protected $timestamp; protected $timestamp;
public function call($params = null) public function call($params = null)
...@@ -54,7 +56,7 @@ class AddCampaigns extends DirectRequest ...@@ -54,7 +56,7 @@ class AddCampaigns extends DirectRequest
$this->setMethod('add'); $this->setMethod('add');
$this->setParams([ $this->setParams([
'Campaigns' => $this['dictionaryCampaigns']->map(function (DictionaryCampaign $dictionaryCampaign) { 'Campaigns' => $params['dictionaryCampaigns']->map(function (DictionaryCampaign $dictionaryCampaign) {
$list = Variable::getListVariablesByDictionaryCampaign($dictionaryCampaign); $list = Variable::getListVariablesByDictionaryCampaign($dictionaryCampaign);
...@@ -162,4 +164,11 @@ class AddCampaigns extends DirectRequest ...@@ -162,4 +164,11 @@ class AddCampaigns extends DirectRequest
}), }),
]); ]);
} }
function getObjectsCount(){
$params = $this->getParams();
$cnt = count($params['Campaigns']);
return $cnt > self::MAX_COUNT ? self::MAX_COUNT : $cnt;
}
} }
...@@ -10,6 +10,8 @@ use Illuminate\Support\Facades\Log; ...@@ -10,6 +10,8 @@ use Illuminate\Support\Facades\Log;
class ResumeCampaigns extends DirectRequest class ResumeCampaigns extends DirectRequest
{ {
CONST MAX_COUNT = 1000;
function call($params = null) function call($params = null)
{ {
$this->requestPrepare($params); $this->requestPrepare($params);
...@@ -57,4 +59,11 @@ class ResumeCampaigns extends DirectRequest ...@@ -57,4 +59,11 @@ 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;
}
} }
...@@ -11,6 +11,8 @@ use Illuminate\Support\Facades\Log; ...@@ -11,6 +11,8 @@ use Illuminate\Support\Facades\Log;
class SuspendCampaigns extends DirectRequest class SuspendCampaigns extends DirectRequest
{ {
CONST MAX_COUNT = 1000;
function call($params = null) function call($params = null)
{ {
$this->requestPrepare($params); $this->requestPrepare($params);
...@@ -58,4 +60,11 @@ class SuspendCampaigns extends DirectRequest ...@@ -58,4 +60,11 @@ 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;
}
} }
...@@ -14,6 +14,8 @@ use Illuminate\Support\Facades\Log; ...@@ -14,6 +14,8 @@ use Illuminate\Support\Facades\Log;
class UpdateCampaigns extends DirectRequest class UpdateCampaigns extends DirectRequest
{ {
CONST MAX_COUNT = 10;
protected $timestamp; protected $timestamp;
/* @var Collection|DictionaryCampaign[] $dictionaryCampaigns */ /* @var Collection|DictionaryCampaign[] $dictionaryCampaigns */
protected $dictionaryCampaigns; protected $dictionaryCampaigns;
...@@ -146,4 +148,11 @@ class UpdateCampaigns extends DirectRequest ...@@ -146,4 +148,11 @@ class UpdateCampaigns extends DirectRequest
}), }),
]); ]);
} }
function getObjectsCount(){
$params = $this->getParams();
$cnt = count($params['Campaigns']);
return $cnt > self::MAX_COUNT ? self::MAX_COUNT : $cnt;
}
} }
...@@ -80,4 +80,8 @@ class DirectRequest extends APIRequest { ...@@ -80,4 +80,8 @@ class DirectRequest extends APIRequest {
} }
return $this; return $this;
} }
function getObjectsCount(){
return self::MAX_COUNT;
}
} }
<?php
namespace Tests\Feature;
use App\Models\Account;
use App\Models\Contact;
use App\Models\User;
use Illuminate\Foundation\Testing\RefreshDatabase;
use Tests\TestCase;
class ContactsTest extends TestCase
{
use RefreshDatabase;
protected function setUp(): void
{
parent::setUp();
$account = Account::create(['name' => 'Acme Corporation']);
$this->user = factory(User::class)->create([
'account_id' => $account->id,
'first_name' => 'John',
'last_name' => 'Doe',
'email' => 'johndoe@example.com',
'owner' => true,
]);
}
public function test_can_view_contacts()
{
$this->user->account->contacts()->saveMany(
factory(Contact::class, 5)->make()
);
$this->actingAs($this->user)
->get('/contacts')
->assertStatus(200)
->assertPropCount('contacts.data', 5)
->assertPropValue('contacts.data', function ($contacts) {
$this->assertEquals(
['id', 'name', 'phone', 'city',
'deleted_at', 'organization'],
array_keys($contacts[0])
);
});
}
public function test_can_search_for_contacts()
{
$this->user->account->contacts()->saveMany(
factory(contact::class, 5)->make()
)->first()->update([
'first_name' => 'Greg',
'last_name' => 'Andersson'
]);
$this->actingAs($this->user)
->get('/contacts?search=Greg')
->assertStatus(200)
->assertPropValue('filters.search', 'Greg')
->assertPropCount('contacts.data', 1)
->assertPropValue('contacts.data', function ($contacts) {
$this->assertEquals('Greg Andersson', $contacts[0]['name']);
});
}
public function test_cannot_view_deleted_contacts()
{
$this->user->account->contacts()->saveMany(
factory(contact::class, 5)->make()
)->first()->delete();
$this->actingAs($this->user)
->get('/contacts')
->assertStatus(200)
->assertPropCount('contacts.data', 4);
}
public function test_can_filter_to_view_deleted_contacts()
{
$this->user->account->contacts()->saveMany(
factory(contact::class, 5)->make()
)->first()->delete();
$this->actingAs($this->user)
->get('/contacts?trashed=with')
->assertStatus(200)
->assertPropValue('filters.trashed', 'with')
->assertPropCount('contacts.data', 5);
}
}
<?php
namespace Tests\Feature;
use App\Models\Account;
use App\Models\User;
use App\Models\Organization;
use Illuminate\Foundation\Testing\RefreshDatabase;
use Tests\TestCase;
class OrganizationsTest extends TestCase
{
use RefreshDatabase;
protected function setUp(): void
{
parent::setUp();
$account = Account::create(['name' => 'Acme Corporation']);
$this->user = factory(User::class)->create([
'account_id' => $account->id,
'first_name' => 'John',
'last_name' => 'Doe',
'email' => 'johndoe@example.com',
'owner' => true,
]);
}
public function test_can_view_organizations()
{
$this->user->account->organizations()->saveMany(
factory(Organization::class, 5)->make()
);
$this->actingAs($this->user)
->get('/organizations')
->assertStatus(200)
->assertPropCount('organizations.data', 5)
->assertPropValue('organizations.data', function ($organizations) {
$this->assertEquals(
['id', 'name', 'phone', 'city', 'deleted_at'],
array_keys($organizations[0])
);
});
}
public function test_can_search_for_organizations()
{
$this->user->account->organizations()->saveMany(
factory(Organization::class, 5)->make()
)->first()->update(['name' => 'Some Big Fancy Company Name']);
$this->actingAs($this->user)
->get('/organizations?search=Some Big Fancy Company Name')
->assertStatus(200)
->assertPropValue('filters.search', 'Some Big Fancy Company Name')
->assertPropCount('organizations.data', 1)
->assertPropValue('organizations.data', function ($organizations) {
$this->assertEquals('Some Big Fancy Company Name', $organizations[0]['name']);
});
}
public function test_cannot_view_deleted_organizations()
{
$this->user->account->organizations()->saveMany(
factory(Organization::class, 5)->make()
)->first()->delete();
$this->actingAs($this->user)
->get('/organizations')
->assertStatus(200)
->assertPropCount('organizations.data', 4);
}
public function test_can_filter_to_view_deleted_organizations()
{
$this->user->account->organizations()->saveMany(
factory(Organization::class, 5)->make()
)->first()->delete();
$this->actingAs($this->user)
->get('/organizations?trashed=with')
->assertStatus(200)
->assertPropValue('filters.trashed', 'with')
->assertPropCount('organizations.data', 5);
}
}
...@@ -142,6 +142,13 @@ class LimitsTest extends TestCase ...@@ -142,6 +142,13 @@ class LimitsTest extends TestCase
$this->token->limit = 21; $this->token->limit = 21;
$objects = $this->limitService->countObjectsLimit($request); $objects = $this->limitService->countObjectsLimit($request);
$this->assertEquals($objects, 4000); $this->assertEquals($objects, 4000);
$request->setService('Campaigns');
$request->setMethod('update');
$this->token->limit = 191;
$objects = $this->limitService->countObjectsLimit($request);
$this->assertEquals($objects, 60);
} }
public function testDoRezervNoLimit() public function testDoRezervNoLimit()
......
Markdown is supported
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!