Commit 1d3edb98 by Евгений

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

1 parent 16d4677a
......@@ -48,19 +48,13 @@ class ProcessCallLimitedAPI implements ShouldQueue//, ShouldBeUnique
try{
//резервируем на это количетсво
$limitId = $limits->doRezerv($this->api, $limits->countObjects($this->api));
$limitId = $limits->doRezerv($this->api, $objects);
}catch(\Exception $e){
//нет свободных баллов, замораживаем до следующего часа
$this->reRunHour();
return;
}
//TODO: Вызов разбиения и проверки сколько объектов получать надо будет делать после обработки результатов.
// в том случае, если окажется что были получены не все запрошенные объекты
// т.к. мы не знам сколько там на самом деел объектов, может там их 10, при это лимит стоит 2000
// нам разрешено получить 100. Мы запрапшиваем только 100, получаем 10, но если уже сейчас поставим сразу вторую заадчу на получение еще 100
// то выйдет что зря потратим баллы на еще один азпрос
//вызываем очередь получения данных от АПИ
//туда передаем сохраненный лимит
//там уже либо будет удален, если не удастся выполнить запрос
......
......@@ -19,4 +19,6 @@ interface APIRequest{
function call($params = null);
function handle($response);
function getObjectsCount();//возвращаем сколько объектов обрабатывается запросом. Для выборок, максимальное что может вернуться.
}
......@@ -5,7 +5,6 @@ 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);
......
......@@ -8,6 +8,8 @@ use Illuminate\Support\Facades\DB;
class Limits implements \App\Service\Contract\Limits {
CONST NAN = -1;
private $token;
private $limitCosts;
......@@ -53,21 +55,27 @@ class Limits implements \App\Service\Contract\Limits {
$this->token->save();
}
function countObjects(\App\Service\Contract\APIRequest $request): int
{
return $request->getCountObjects();
}
/**
* @param Contract\APIRequest $request
* @return int
* возвращает сколько объектов можем обработать
* если это выборка, то возвращаем максимум 10 000, это максимум что возвращает АПИ, дальше уже пейджинг.
*/
function countObjectsLimit(\App\Service\Contract\APIRequest $request): int
{
$cost = $this->limitCosts->getCostObject($request);
$costCall = $this->limitCosts->getCostCall($request);
if ($costCall > $this->current()) {
if ($this->limitCosts->getCostCall($request) > $this->current()){
return 0;
}
return $cost > 0 ? floor($this->current() - $this->getSpent($this->countObjects($request), $request)) : -1;
if ($cost==0){
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 {
$rezerv->save();
$this->token->limit -= $limit;
$this->token->save();
DB::commit();
......
......@@ -95,4 +95,8 @@ class APIRequest implements \App\Service\Contract\APIRequest {
function handle($response){
}
function getObjectsCount(){
throw new Exception('Не задано сколкьо бъектов обрабатывается');
}
}
......@@ -13,6 +13,8 @@ use Illuminate\Support\Facades\Log;
class AddCampaigns extends DirectRequest
{
CONST MAX_COUNT = 10;
protected $timestamp;
public function call($params = null)
......@@ -54,7 +56,7 @@ class AddCampaigns extends DirectRequest
$this->setMethod('add');
$this->setParams([
'Campaigns' => $this['dictionaryCampaigns']->map(function (DictionaryCampaign $dictionaryCampaign) {
'Campaigns' => $params['dictionaryCampaigns']->map(function (DictionaryCampaign $dictionaryCampaign) {
$list = Variable::getListVariablesByDictionaryCampaign($dictionaryCampaign);
......@@ -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;
class ResumeCampaigns extends DirectRequest
{
CONST MAX_COUNT = 1000;
function call($params = null)
{
$this->requestPrepare($params);
......@@ -57,4 +59,11 @@ 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;
}
}
......@@ -11,6 +11,8 @@ use Illuminate\Support\Facades\Log;
class SuspendCampaigns extends DirectRequest
{
CONST MAX_COUNT = 1000;
function call($params = null)
{
$this->requestPrepare($params);
......@@ -58,4 +60,11 @@ 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;
}
}
......@@ -14,6 +14,8 @@ use Illuminate\Support\Facades\Log;
class UpdateCampaigns extends DirectRequest
{
CONST MAX_COUNT = 10;
protected $timestamp;
/* @var Collection|DictionaryCampaign[] $dictionaryCampaigns */
protected $dictionaryCampaigns;
......@@ -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 {
}
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
$this->token->limit = 21;
$objects = $this->limitService->countObjectsLimit($request);
$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()
......
Markdown is supported
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!