Skip to content

sinfwaveEmploymentTest/SoglasieEmploymentTest

Repository files navigation

Тест на трудоустройство в страховую фирму "Согласие" с открытой публикацией кода.

Использовались при выполнении:

  1. XAMPP PHP 7.4.5 (с расширением php_redis.dll для взаимодействия с сервером Redis)
  2. Laravel 8
  3. Redis Server 5.0.8 (WSL Ubuntu 20.04.1)
  4. Isomnia Core 2020.5.2 (отладка API)
  5. Visual Studio Code 1.45.1 (редактор IDE)

В тесте не указана задача авторизации при API запросах, реализован публичный доступ к API с валидацией запросов (подробности ниже в тексте). Весь код прокомментирован на английском языке. В проекте Laravel 8 включен драйвер кеширования Redis, кеширование запросов при отказе конечного сервиса тоже реализовано при помощи Redis.


Основные задействованные файлы и их описание:

app\Http\Controllers\API\RestToSendMessageService.php

Основной файл решения задачи теста. Принимает, валидирует (при помощи стандартных средств Laravel и кастомного хелпера) отправляет запросы на конечный API. При отказе конечного сервиса кеширует уникальные сообщения в Redis SET (SADD) (дубли уникальных сообщений исключены). Вместимость Redis SET кеша - около 4 миллиардов записей. Пример работы API из Insomnia Core: img Конечный результат отправки (имплементирован как запись в лог, подробнее ниже в тексте): img Пример работы с кешированием при отказе конечного сервиса (отличие запросов - разные номера во входящем параметре json - "to"): img img img

Прошедший запрос и отправка-запись всех предыдущих сообщений SMS в лог: img img


app\Http\Controllers\API\SendMessageService.php

Имплементация конечного сервиса в тесте с записью в настроенный в настройках Laravel лог файл отправленных SMS сообщений. Ошибка при недоступности сервиса имплементирована согласно задаче в тесте: img


app\Http\Middleware\OpenApiRequestsHelpers.php

Миддлвэр хелперы, реализованы в ввиде статических методов класса с входящими аргументами. Проверка входящего запроса на соответствие POST и application/json, если условия не выполнены страница API покажет стандартую для Laravel ошибку 404. При несоответствии запроса application/json параметрам стандарта API (валидация запроса происходит стандартными средствами Laravel) отправка json сообщения 400 о неверных параметрах запроса. Метод запускающий инстанс Redis объекта для проведения операций с Redis сервером.


routes\api.php

В данный файл внесены пути имплементированных API, принимаются любые запросы для избежания отображения debug остнастки Laravel при любых условиях. Возможно легкое изменение метода any на post при необходимости. Пути ведут к конструкторам классов указанных выше API, для возможной имплементации дополнительных методов в рамках класса для данных API и более гибкой работы в рамках объекта.


config\cache.php

В данном файле производилось включение драйвера кеша Redis, параметр основного драйвера был изменен с "file" на "redis".


config\logging.php

В файле был установлен кастомный файл лога в стандартной папке для логов storage\logs\ для записи "отправленных" SMS - sendmessageservice.log.


Оригинальный текст теста:

Сервис для отправки массовых сообщений

Что имеем:

  1. Laravel 8
  2. MySQL
  3. Redis
  4. Сервис SendMessage

Сервис SendMessage

У сервиса реализован только 1 метод:

Отправка SMS сообщения: POST https://send.message/api/send (пример) application/json { “to”: 123, // ID получателя “message”: “Hello world!” // Сообщение }

Данный метод позволяет отправить только 1 сообщение за раз.

Метод возвращает следующие коды ответа: 200: Cообщение успешно обработано. 500: Cервис временно недоступен (произошла ошибка)

Что нужно:

Создать REST-сервис для возможности массовой отправки писем.

Пример тела запроса: application/json { “to”: [123, 321], // ID получателей “message”: “Hello world!” // Сообщение }

Требование:

Сервис должен максимально быстро обрабатывать запрос на массовую отправку сообщений и гарантировать передачу всех писем в сервис SendMessage

Итог задания:

Ссылка на открытый репозиторий git с результатом задания, только код, без запуска проекта.


Спасибо Вам за прочтение, С уважением Владимир Горбачев

Releases

No releases published

Packages

No packages published