Skip to content

arsengoian/hr_test

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

14 Commits
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

Стандартный тест WEDO по PHP / Laravel

Требования

Рассчётное время разработки - 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

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_page
  • GET /{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
  • Добавьте авторизацию к запросам - нешаблонные решения приветствуются. Пожалуйста, в таком разе предоставьте данные для авторизации
  • Любые другие улучшения, которые покажутся вам уместными (не противоречащие поставленному заданию!)

Вдохновения в работе!

Logo

About

No description, website, or topics provided.

Resources

Stars

Watchers

Forks

Packages

No packages published

Languages