Skip to content

RubyKeeper/rest_api_test

Repository files navigation

Решение по тех заданию (Laravel)

Имеется 3 поставщика данных. Они предоставляют информацию об организации из открытых источников. Нам нужно получить Наименование и КПП по имеющемуся ИНН. произвольная функция, принимающая строку ИНН, возвращающая ассоциативный массив или false;

  • PHP-класс, см. шаблон в приложении 1;
  • библиотека, подключенная через composer, для получения данных со стороннего сервиса. Например, dadata/apiclient (на сайте dadata.ru можно получить тестовый ключ доступа).
  • Вместо получения реальных данных достаточно сделать заглушки с использованием sleep(), rand() и их аналогов.

Выбирать поставщиков данных случайно. Если ошибка или ответ > 1 секунды - переходить к следующему случайному поставщику. Затем, когда наберется статистика (от 10 использований для каждого поставщика), изменять логику: начинать со способа, который быстрее всех отвечал (без ошибок) за данные сутки.

Варианты ввода-вывода данных Через REST API

Установка

Запустить терминал и выполнить команду

git clone https://github.com/RubyKeeper/rest_api_test.git

после переходим в папку проекта

cd rest_api_test 

запускаем команду докера:

docker-compose up -d --build

или через компонент Sail

./vendor/bin/sail up -d --build

устанавливаем все зависимости (composer уже есть в проекте):

./vendor/bin/sail php composer.phar install or composer install

в браузере проект доступен по адресам localhost и laravel.test (для запуска laravel.test, требуется редактирование /etc/hosts)

Контроллер CompanyDataController.php

это основной контроллер который обрабатывает API запрос по тестовому заданию

Перечислены источники.

$clients = [
    RamisClient::class,
    WarmsClient::class,
    DadataClient::class
];

Контроллер обрабатывает запрос роута routes/api.php по адресу:

http://localhost/api/company-data/{инн}/

или

http://laravel.test/api/company-data/{инн}/

проверить можно используя инструмент Phpstorm или с помощью терминала, введя команду:

$ curl -H 'content-type: application/json' -H 'Accept: application/json' -v -X GET http://localhost/api/company-data/{инн}/

Основной сервис ClientsService.php

app/Services/ClientsService.php

Нам нужно вести статистику, какие из источников успешно и быстро возвращают ответ. Для этого выбрана БД Redis с типом данных сортируемые списки.

public function getClients(array $clientsHttp): array { }

Указанный класс выполняет ниже перечисленные задачи:

  • получает все источники со статстики у которых больше 10 успешных вызовов
  • сравнивает количество источников с количеством в БД (по условию ТЗ)
  • если каждый источник уже вызывался по 10 раз, то отдает их отсортированных по количеству успешных вызовов
  • иначе отдает список источников, предварительно рандомно перемешивая их, использовав функцию shuffle()

Хочется выделить следующий момент. По условию ТЗ какие то источники могут возвращать пустые значения или не возвращать вовсе или возвращать ответы очень долго. Эту функцию имитирует рандомно следующий кусок кода

  // имитация отрицательного ответа или долгого ответа
  switch (rand(0,2)) {
      case 0:
          $response = $item->sendRequest($inn);
          break;
      case 1;
          $response = false;
          break;
      case 2;
          $response = $item->sendRequest($inn);
          sleep(1);
          break;
  }

Источники запросов

Классы источников находятся здесь:

app/Clients/

About

Тестовое задание (Laravel, RestAPI)

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published

Languages