ProcessCallAPI.php 2.19 KB
<?php

namespace App\Jobs;

use App\Service\AdsHandler;
use App\Service\Contract\APIRequest;
use App\Service\HeaderLimits;
use App\Service\Limits;
use Illuminate\Bus\Queueable;
use Illuminate\Contracts\Queue\ShouldQueue;
use Illuminate\Foundation\Bus\Dispatchable;
use Illuminate\Queue\InteractsWithQueue;
use Illuminate\Queue\SerializesModels;

class ProcessCallAPI implements ShouldQueue
{
    use Dispatchable, InteractsWithQueue, Queueable, SerializesModels;

    private $api;
    private $limitId;
    /**
     * Create a new job instance.
     *
     * @return void
     */
    public function __construct(int $limitId, APIRequest $api)
    {
        $this->limitId = $limitId;
        $this->api = $api;
    }

    /**
     * Execute the job.
     *
     * @return void
     */
    public function handle()
    {
        $limits = Limits::getInstance($this->api->getToken());

        try{
            $api = API::getInstance($this->api);
            //считаем на сколько объектов зарезервировано получение данных
            //только их и запрашиваем
            $limit = \App\Models\Limits::find($this->limitId);
            //те на которые не хватило баллов помещаем в очередь
            if ($api = $this->api->chunk($limit->spent)){
                dispatch( new ProcessCallLimitedAPI($api));
            }
            $response = $api->execute();
            $limits->acceptRezerv($this->limitId, new HeaderLimits($response->headers()) );
            //TODO: обработать результат.
            // если не хватило баллов на все что хотели запросиь, то в очередь отправляем новый запрос на получение новых данных
            AdsHandler::getInstance($this->api)->handle($response);
        }catch(\Exception $e ){
            //TODO: надо отдельно выделить ошибки вызовов, за которые списываются баллы
            //https://yandex.ru/dev/direct/doc/dg/concepts/errors.html
            $limits->removeRezerv($this->limitId);
        }
    }
}