👣 Тестовое задание для разработчика на Go



У сети ресторанов доставки есть множество точек, на которых готовятся заказы для клиентов. Каждый клиент хочет вместе с заказом получить чек, содержащий детальную информацию о заказе.



Сотрудники кухни также хотят чек, чтобы в процессе готовки и упаковки заказа не забыть положить всё что нужно. Наша задача помочь и тем и другим, написав сервис для генерации чеков.



1. Сервис получает информацию о новом заказе, создаёт в БД чеки для всех принтеров точки указанной в заказе и ставит асинхронные задачи на генерацию PDF-файлов для этих чеков. Если у точки нет ни одного принтера - возвращает ошибку. Если чеки для данного заказа уже были созданы - возвращает ошибку.



2. Worker'ы с помощью wkhtmltopdf генерируют PDF-файл из HTML-шаблона. Имя файла должно иметь следущий вид <ID заказа>_<тип чека>.pdf (123456_client.pdf). Файлы должны хранится в папке media/pdf в корне проекта.



3. Приложение опрашивает сервис на наличие новых чеков. Опрос происходит по следующему пути: сначала запрашивается список чеков которые уже сгенерированы для конкретного принтера, после скачивается PDF-файл для каждого чека и отправляется на печать.



📌 Технические требования



Сервис должен быть написан на GO

База данных - PostgreSQL

Все инфраструктурные вещи необходимые для сервиса (PostgreSQL, Redis, wkhtmltopdf) запускать в docker с помощью docker-compose, сам проект не нужно оборачивать в docker



Помимо API, должна быть админка для обеих моделей, с возможностью фильтровать чеки по принтеру, типу и статусу



📌 Модели



Принтер (Printer). Каждый принтер печатает только свой тип чеков. Поле api_key принимает уникальные значения, по нему однозначно определяется принтер. Для этой модели должны быть fixtures (принтеры для обоих типов чеков для нескольких точек).



Поле Тип Значение Описание

name CharField название принтера

api_key CharField ключ доступа к API

check_type CharField kitchen|client тип чека которые печатает принтер

point_id IntegerField точка к которой привязан принтер




Чек (Check). Информация о заказе для каждого чека хранится в JSON, нет необходимости делать отдельные модели.



Поле Тип Значение Описание

printer_id ForeignKey принтер

type CharField kitchen|client тип чека

order JSONField информация о заказе

status CharField new|rendered|printed статус чека

pdf_file FileField ссылка на созданный PDF-файл




API

Добавить описание доступных методов в файл api.yml (swagger-спецификация).



@golang_interview