Тестовый проект, первый опыт работы с REST API
Текстовое задание
Основные задачи приложения:
- Создать проект и приложение на Django Rest Framework >= 3.12 (Django > =3.2).
- Реализовать возможность хранения номера телефона пользователя.
- Использовать email и пароль при создании и авторизации пользователя.
- Использовать JWT Token для аутентификации пользователя.
- Создать модель Организации со следующими полями: title, description, address, postcode.
- Создать модель Мероприятия со следующими полями: title, description, organizations, image, date.
- Создать чат между пользователями использую технологию Web Socket.
- Использовать для запуска проекта Docker.
Дополнительное описание:
- При создании пользователя не нужно использовать подтверждение по почте.
- Пользователи состоят в организациях.
- Одно мероприятие могут организовывать несколько организаций.
- Настроить панель администратора (добавить фильтрацию и поиск), при просмотре мероприятия выводить превью изображения.
- Вывод информации и создание записей по api доступно только зарегистрированным пользователям.
- При создании мероприятия необходимо использовать sleep 60 секунд и данный запрос не должен быть блокирующим.
Конечные точки:
- Создание организации
- Создание мероприятия
- Вывод мероприятия с информацией о всех действующих пользователей, которые участвуют в организации мероприятия с разбивкой по организациям (вывести информацию о организации с объединением почтового индекса и адресом).
- Вывод мероприятий с возможностью фильтрации и сортировки по дате, поиском по названию и лимитной пагинацией.
Для реализации тестового приложения были выбран след. стек:
- Django;
- DRF;
- WebSocket;
- Celery;
- Docker;
- Redis;
- Sqlite3.
Для запуска проекта, необходимо выполнить в каталоге приложения: docker compose up -d
Сервер слушает по адресу 0.0.0.0:8000
User
http POST /api/user/sign-up/
Регистрирует пользователя в системе
Parameter | Type | Description |
---|---|---|
email |
string |
Обязательно. Электронная почта |
password |
string |
Обязательно. Пароль |
telephone |
string |
Опционально. Номер телефона |
http POST /api/user/sign-in/
Вход пользователя в систему, возвращает JWT Access Token и Refresh Token
Parameter | Type | Description |
---|---|---|
email |
string |
Обязательно. Электронная почта |
password |
string |
Обязательно. Пароль |
http POST /api/user/refresh/
Возвращает новую сгенерированную пару JWT Access Token и Refresh Token
Parameter | Type | Description |
---|---|---|
refresh |
string |
Обязательно. Токен обновления, выданный при входе |
Organizations
http POST /api/organizations/create/
Создает организацию в системе, с указанными пользователями
Parameter | Type | Description |
---|---|---|
title |
string |
Обязательно. Название организации |
description |
string |
Не обязательно. Описание |
postcode |
string |
Не обязательно. Почтовый индекс |
address |
string |
Не обязательно. Физический адрес |
users |
list<dict> |
Не обязательно. Список пользователей состоящих в организации |
http GET /api/organizations/
Выводит зарегистрированные организации списком
http GET /api/organizations/$(id)
Выводит информацию о определенной организации
Parameter | Type | Description |
---|---|---|
id |
int |
Обязательно. Идентификатор организации |
Events
http POST /api/events/create/
Создает мероприятие в системе, с указанными организациями Для выполнения ТЗ, при создании запускается таск Celery, который сохраняет переданный объект "мероприятие" через 60с.
(коротко: Сохранение события происходит через 60с.)
Parameter | Type | Description |
---|---|---|
title |
string |
Обязательно. Наименование меропрития |
description |
string |
Не обязательно. Описание |
image |
file |
Не обязательно. Обложка мероприятия |
date |
date |
Не обязательно. Время проведения |
organizations |
list<dict> |
Не обязательно. Список организаций связанных с мероприятием |
http GET /api/events/?search=$(query_search)
&ordering=$(ordering_fields)
&limit=$(query_limit)
&$(filter_method)=$(filter_data)
Выводит зарегистрированные мероприятия списком
Parameter | Type | Description |
---|---|---|
query_search |
string |
Не обязательно. Запрос для поиска по полю events.title |
ordering_fields |
string |
Не обязательно. Упорядочивание вывода по полю events.date |
query_limit |
int |
Не обязательно. Ограничение вывода определенным числом |
filter_method |
string |
Не обязательно. Метод фильтрации объектов для вывод (date, date__gte, date__lte) |
filter_data |
string |
Не обязательно. Значение для фильтрации выбранным методом |
http GET /api/events/$(id)
Выводит информацию о определенном мероприятии
Parameter | Type | Description |
---|---|---|
id |
int |
Обязательно. Идентификатор мероприятия |
Заморачиваться не стал, в БД записи истории чата - нет. Режим общения происходит полностью в реальном времени.
Расположение чата:
ws://0.0.0.0:8000/ws/chat/
Подключение по JWT token, передающегося в заголовке authorization
Передача сообщений с помощью JSON.