В этом задании вам потребуется реализовать сервис для создания вопросов для викторин. Сервис будет работать в формате REST API.
Для того, чтобы начать работу вам нужно форкнуть шаблон с проектом на Github и склонировать его себе.
Все требования для данного проекта будут разделены на несколько слоев: база данных, контроллеры и тесты. Каждый из слоев представляет собой отдельную логику проекта, которая связана с остальными слоями.
- Категория:
- id (идентификатор)
- title (название категории, не более 100 символов, не может быть пустой)
- Квиз:
- id (идентификатор)
- title (название квиза, не более 200 символов, не может быть пустым)
- description (описание квиза, не более 500 символов, необязательное поле)
- Вопрос:
- id (идентификатор)
- category_id (идентификатор категории, к которой относится вопрос)
- text (текст вопроса, не более 500 символов, обязательное поле)
- description (описание вопроса, не более 500 символов, не обязательное поле)
- options (варианты ответа на вопрос, обязательное поле, должно хранить 2 или более вариантов ответа в виде JSON поля (массив))
- correct_answer (правильный вариант ответа, обязательное поле)
- explanation (объяснение правильного ответа, не более 250 символов, не обязательное поле)
- difficulty (сложность вопроса, может быть одним из трех значений: easy, medium, hard, обязательное поле)
Требуется реализовать следующие ручки:
- POST
/api/category
- создание категории - GET
/api/category
- получение всех категории - GET
/api/category/<id:int>
- получение категории по идентификатору - PUT
/api/category/<id:int>
- изменение категории - DELETE
/api/category/<id:int>
- удаление категории
- POST
/api/question
- создание вопроса - GET
/api/question
- получение всех вопросов - GET
/api/question/<id:int>
- получение вопроса по идентификатору - GET
/api/question/by_text/<query: str>
- получение вопроса по тексту - POST
/api/question/<id:int>/check
- проверка ответа на вопрос - PUT
/api/question/<id:int>
- изменение вопроса - DELETE
/api/question/<id:int>
- удаление вопроса
- POST
/api/quiz
- создание квиза - GET
/api/quiz
- получение всех квизов - GET
/api/quiz/<id:int>
- получение квиза по идентификатору - GET
/api/quiz/<id:int>/random_question
- получение случайного вопроса по идентификатору квиза - GET
/api/quiz/by_title/<title: str>
- получение квиза по названию - PUT
/api/quiz/<id:int>
- изменение квиза - DELETE
/api/quiz/<id:int>
- удаление квиза
Для вышеописанной логики написаны тесты, проверяющие корректность работы слоев приложения. Однако, тесты написаны лишь на часть логики. Дополнительно предлагается написать собственные тесты, проверяющие отсутствующие кейсы.
В написании тестов можно ориентироваться на уже написанные тесты. Тесты предлагается писать для проверки сервисов для доступа к БД, а также для проверки ручек. Сейчас тесты написаны только на один метод сервиса и на одну ручку.
В качестве дополнительного задания вы также можете оформить админку для ваших моделей, чтобы создавать их через нее. В файле admin.py
вы можете зарегистрировать модели и добавить дополнительной логики отобржения для них (выводить определенные поля, добавить сортировку, поиск и тому подобное).
Для описания зависимостей (например, Django) в проекте используется pyproject.toml
. Это более современный аналог файла requirements.txt
, который позволяет не только фиксировать зависимости, но и указывать дополнительную информацию о проекте.
В качестве пакетного менеджера рекомендуем использовать uv
- это очень быстрая замена pip
.
Для того, чтобы установить все зависимости используйте команду:
uv sync
Если вы посмотрите список зависимостей, то увидите среди них ruff
. Это линтер, который будет проверять код по стилю.
Проверка линтером вшита в Github Actions, но вы можете запускать его следующей командой:
uv run ruff check ./quiz