Рассчётное время разработки - 5-8 часов.
Вы можете использовать следующие технологии:
| Категория | Требования |
|---|---|
| Фреймворк | Laravel |
| Внешние библиотеки | Любые библиотеки, доступные из composer |
| PHP | >=7.4 |
| База данных | На выбор: mysql, mariadb, postgresql, SQL Server |
- Разработать простое REST API-приложение, отображающие CRUD-операции с постами
- Приложение должно предоставлять тестовые данные посредством сидеров (в достаточно большом количестве, чтобы работали алгоритмы сортировки). Тестовые данные должны быть разнообразными, деревья комментарием могут иметь произвольную глубину
- Внедрить для постов сортировку и пагинацию согласно заданию
- При запросе постов, количество просмотров должно увеличиваться, если они были в выдаче
- Предоставить вместе с заданием инструкцию по запуску
- Интерфейсы, описывающие структуры данных моделей -
app/Task/Models - HTTP запросы для удобного тестирования
test.http(этот файл придётся модифицировать, если будете разрабатывать авторизацию, смотр. доп. задания) с исчерпывающим списком запросов
- views - по количеству просмотров
- date - по полю created_at
- trending - с большой тенденцией к росту количества комментариев (свободная интерпретация понятия "тенденция роста")
- controversial - с большой глубиной деревьев комментариев и соотношением количества комментариев к просмотрам
Направление по умолчанию - desc Значение per_page по умолчанию - 50
При желании для оптимизации сортировки можно использовать вспомогательные таблицы, views в БД, сохранённые процедуры БД, любые такие вещи должны создаваться миграциями
REST API реализует HTTP-методы GET (просмотреть), POST(добавить), PATCH(редактировать) и DELETE(удалить)
В API присутствуют следующие конечные точки для запросов:
api/posts(Модель реализует интерфейс\Task\Models\Post)api/posts/{id}/comments(Модель реализует интерфейс\Task\Models\Comment) - при запросе выбрасывается 404 ошибка если комментарий не принадлежит к данному посту
Возможные варианты запросов (ENDPOINT может быть api/posts или api/posts/{postID}/comments):
GET /{ENDPOINT}- Просмотреть списокGET /{ENDPOINT}?sort=views&direction=desc&page=1&per_page=20- Просмотреть список с опциональными параметрами (только для постов!) sort, sort_type, page и per_pageGET /{ENDPOINT}/{id}- Просмотреть элементPOST /{ENDPOINT}- Добавить элементPATCH /{ENDPOINT}/{id}- Редактировать элемент. Изменение родительского комментария на комментарий из другого поста ведёт к 400-й ошибке, если также не меняется связанный постDELETE /{ENDPOINT}/{id}- Удалить элемент
Каждый пост содержит тело комментариев, ожидаемый вывод сервера в формате JSON имеет следующий вид:
[
{
"id": 42,
"created_at": "1 Серпня 2019, 04:20",
"views": 1000,
"text": "Коли навколо ні душі, коли моя не може спати, чомусь так хочеться мені для тебе пісню заспівати... "
},
{
"id": 43,
"created_at": "1 Серпня 2019, 10:10",
"views": 100,
"text": "Одна в моїй кімнаті, нема куди тікати. І їй напевно не поможуть навіть танки і гармати... ",
"image": "https://images.unsplash.com/photo-1553613599-d0f3dd9416ae"
},
{
"id": 44,
"created_at": "1 Серпня 2019, 10:10",
"views": 500,
"text": "Що ж це я, шо ж це я не зумів зупинитися вчасно? все ясно... ",
"image": "https://images.unsplash.com/photo-1558032776-805c74bd1e54",
"comments": [
{
"id": 141,
"text": "Це з якої опери??",
"user_name": "Ріхард Вагнер",
"created_at": "30 Липня 2019, 12:00"
},
{
"id": 142,
"text": "З тобою тепер...",
"user_name": "Майкл Щур",
"created_at": "30 Липня 2019, 23:59",
"replies": [
{
"id": 143,
"text": "І назавжди... Пізно не йди!",
"user_name": "Євген Шатайло",
"created_at": "29 Липня 2019, 22:30"
}
]
}
]
}
]Обратите внимание: GET /posts/44/comments возвращает список из 2 комментариев, у одного из которых есть ответ.
Однако, GET /posts/44/comments/143, где 143 - ID комментария-ответа, является действительным запросом.
Более подробная информация о моделях и их полях содержится в комментариях к интерфейсам.
Обратите внимание, что поля ответа не обязательно соответствуют тем полям, которые хранятся в базе данных (возможно, нужно будет их модифицировать / изменить формат). Подсказка: сжимайте изображения, если в этом есть потребность.
Задание считается готовым и выполненным, если соответствует всем указанным выше требованиям, но если у Вас есть желание продемонстрировать углублённые навыки бэкенд-разработки, предлагаем для выполнения одно или больше из необязательных заданий:
- Создайте документацию для методов API
- Как следует обработайте и задокументируйте возможные ошибки со статусами 400, 401, 404, 426 и пр.
- Создайте юнит-тесты для классов проекта
- Заверните приложение в контейнер docker
- Добавьте авторизацию к запросам - нешаблонные решения приветствуются. Пожалуйста, в таком разе предоставьте данные для авторизации
- Любые другие улучшения, которые покажутся вам уместными (не противоречащие поставленному заданию!)
