Перед выполнением нужно локально все установить, как описано в "Старт" и "Первый запуск".
- Laravel 8
- MySQL 8
- PHP 7.4
- Redis
- Docker & Docker-compose
- Nginx/php-fpm/phpmyadmin
При выполнении задания считается нормальным (и приветствуется) активно пользоваться google и stackoverflow.
Также рекомендуется использовать библиотеки для решения стандартных вопросов.
Предварительно установлено несколько стандартных (де-факто) библиотек:
- barryvdh/laravel-debugbar
- barryvdh/laravel-ide-helper
- laravel/horizon
- laravel/passport
- intervention/image
- laracasts/utilities
Задание состоит в написании API для возвращения информации (Faker) о сериале Breaking Bad.
Имеются такие основные сущности:
- User - дефолтная моделька без кастомных полей, используется для доступа к API (Level 2).
- Episode - эпизод сериала (с краткой информацией).
- Character - персонаж, который связан с эпизодами и цитатами.
- Quote - цитата персонажа, связана с эпизодом.
Episode:
id int
title string Название
air_date date Дата выхода
Связан с персонажами как многие-ко-многим.
Связан с цитатами как один-ко-многим.
Character:
id int
name string Имя
birthday date Дата рождения
occupations json Профессии/умения
img string Фото
nickname string Известен как (кличка)
portrayed string Актер, сыгравший персонажа
Связан с цитатами как один-ко-многим.
Quote:
id int
quote mediumtext Цитата
Написать сидеры, чтобы заполнили БД тестовыми данными на основе Faker-а.
30 эпизодов, 100 персонажей и ~500 цитат. На 1 эпизод по 5-15 персонажей, на 1 персонажа по 3-7 цитат.
API должно быть доступно по
https://laravel-test.com/api/
.
Endpoints:
/episodes - отдает все эпизоды
/episodes/{id} - отдает эпизод по ID (с персонажами: информацией)
/characters - отдает всех персонажей (с ID эпизодов и ID цитат)
/characters?name={name} - поиск по имени персонажа (регистронезависимый)
/characters/random - отдает рандомного персонажа
/quotes - отдает все цитаты
/quotes/random?author={character_name} - рандомная цитата персонажа с поиском по имени персонажа
Базовые правила API:
коды ответов - 200, 401, 403, 404, 429, 500 (:D)
структура ответа (или похожая):
{
"success": true, // или false, если ошибка
"data": null | {} || [], // в случае success-ответа
"pagination": { // данные пагинации при получении "списков"
"total": 0, // общее количество сущностей
"count": 0, // сколько отдано в текущем запросе
"perPage": 0, // сколько на странице
"currentPage": 0, // текущая страница
"totalPages": 0 // всего страниц
},
"error": { // в случае error-ответа
"message": null | ""
}
}
при запросе списков можно передавать limit (default=10) и page (default=1), чтобы пагинировать.
Рекомендуется использовать библиотеку flugger/laravel-responder.
Реализовать максимально простой интерфейс (bootstrap/etc) регистрации/авторизации (без каких-либо восстановить пароль и пр.) дефолтной модели юзера.
Не нужно подтверждение мейла (как и отправка).
Закрыть публичный доступ к API (п. 2.3), требовать авторизацию.
Сделать максимально простую страницу, которая бы менеджерила токены доступа (Passport/Sactum).
Установить лимит запросов к API для одного юзера равный 20/min.
При каждом запросе к API запускать событие ApiRequestHit (private time, user).
Обработчик должен инкрементировать при помощи Cache скажем в api:users:{id}.
Создать запланированную задачу (schedule) с периодом 1 минута, которая будет выполняться в очереди и считать общее к-во запросов к API (оптимально по скорости - вытаскивать все ключи редиса по шаблону) и складировать это в кеш (Redis) api-total-requests.
Запрос к endpoint-у /stats
выдаст общее количество запросов.
Запрос к endpoint-у /my-stats
выдаст количество запросов текущего юзера.
Создать простейшую админку на Laravel Backpack.
Для работы с эпизодами, персонажами, цитатами и пользователями.
Используя одну из библиотек, реализовать бота, который:
- /start - приветствует
- /characters - выводит список персонажей с пагинацией по 3 шт (для каждого персонажа кнопка его вывода цитат)
Сдавать на проверку в виде публичного репозитория (github/gitlab/etc).
- Отдельно скинуть ссылку на бота (если реализован).
- Code style и стандарты: соблюдение
- Архитектура и логика: грамотная
- Применение ООП и паттернов: с умом
- Обработка внештатных ситуаций и валидации: присутствует и покрывает большинство частых
- Внимание к деталям и качество