Для запуска необходимо
git clone https://github.com/Ser9unin/RealEstate
cd ./RealEstate
make runпосле этого приложение доступно через http://localhost:8000
make run запускает docker контейнеры с приложением и БД
docker compose лежат в папке deploy
Секрет токен авторизации сейчас лежит в файле .env, данная реализация применима только к тестовому проекту, для реальных проектов понимаю, что такие данные не лежат в общем доступе
make testДля интеграционных тестов создаётся контейнер с nginx, который генерирует и отправляет данные на наш сервис.
Запуск интеграционных тестов
make integration-testsМожно проверить работоспособность загрузив API в Postman.
Последовательность:
/register -> необходимо в формате JSON как описано в API отправить регистрационные данные email|password|role на выходе получаем id, далее id можно скопировать в ручку /login.
/login -> можно использовать email и password заданные при регистрации, или id полученный при регистрации и password. вы получите токен, его надо скопировать и использовать для авторизации при работе с остальными endpoint.
Для работы с endpoint house/create | flat/create | house/{id} | flat/update необходим JWT полученный при аутентификации
В Postman в поле Authorization можно выбрать тип авторизации
- Bearer token, тогда токен будет отправляться на сервис через header
"Authorization":"Bearer 'ВАШ JWT'" - API Key, тогда нужно задать Key
tokenи Value'ВАШ JWT', и добавить это в QueryParams.
Функционал отвечает на запросы описанные в API.
-
Авторизация пользователей: Регистрация и авторизация пользователей по почте и паролю:
endpoint/registerПринимает запрос в виде{ "email": "test@gmail.com", "password": "Секретная строка", "user_type": "client" }по результатам регистрации возвращается
uuid, формируется UUID V7. В базе создаётся и сохраняется новый пользователь желаемого типа: обычный пользователь (client) или модератор (moderator), который позволяет пройти аутентификацию и получить токен.У созданного пользователя появляется токен endpoint/login. Авторизация доступна в двух вариантах UUID + пароль пример запроса
{ "id": "cae36e0f-69e5-4fa8-a179-a52d083c5549", "password": "Секретная строка", }email+пароль
{ "email": "test@gmail.com", "password": "Секретная строка", }При успешной авторизации по почте и паролю возвращается токен для пользователя с соответствующим ему уровнем доступа.
ручка /dummyLogin - не реализована сервис работает через описанную выше регистрацию и авторизацию
БЕЗ РЕГИСТРАЦИИ И АУТЕНТИФИКАЦИИ ДАЛЬНЕЙШИЕ ДЕЙСТВИЯ НЕ ВОЗМОЖНЫ
-
Создание дома:
реализовано middleware для проверки авторизации- Только модератор имеет возможность создать дом используя endpoint /house/create. В случае успешного запроса возвращается полная информация о созданном доме
-
Создание квартиры:
- Создать квартиру может любой пользователь, используя endpoint /flat/create. При успешном запросе возвращается полная информация о квартире.
- Если жильё успешно создано через endpoint /flat/create, то объявление получает статус модерации created.
- У дома, в котором создали новую квартиру, обновляется дата последнего добавления жилья.
-
Модерация квартиры:
- Статус модерации квартиры может принимать одно из четырёх значений: created, approved, declined, on moderation.
- Только модератор может изменить статус модерации квартиры с помощью endpoint /flat/update. При успешном запросе возвращается полная информация об обновленной квартире.
-
Получение списка квартир по номеру дома:
- Используя endpoint /house/{id}, обычный пользователь и модератор могут получить список квартир по номеру дома. Только обычный пользователь увидит все квартиры со статусом модерации approved, а модератор — жильё с любым статусом модерации.
Связи между сущностями:
- Каждая квартира может иметь только одно соответствие с домом (один к одному).
- Номер дома служит уникальным идентификатором самого дома.
- Номер квартиры не является уникальным идентификатором. Например, квартира №1 может находиться как в доме №1, так и в доме №2, и в этом случае это будут разные квартиры.
По пункту 3 принципильно понятен смысл, но в сервис не передаются номера квартир, и как мне показалось в рамках одного дома всё таки номер квартиры должен быть уникален, поэтому номер квартиры формируется в БД как SERIAL PRIMARY KEY
- Модераторы — получают полный список всех объявлений в доме вне зависимости от статуса модерации.
- Пользователи — получают список только прошедших модерацию объявлений.
- Дополнительно. Подписка на уведомления о новых квартирах в доме по его номеру. Обычный пользователь может подписаться на такие уведомления с помощью endpoint /house/{id}/subscribe.