Приложение представляет собой backend todo-листа. Изначально было разработано как приложение на монолитной архитектуре, а затем было переработано по принципу микросервисной архитектуры. Ссылка на этот же проект в состоянии монолита - click
Пользователю доступно создание: проектов, списков задач, задач. В рамках проекта находятся списки задач, а в рамках списков задач соответственно задачи.
Списки задач имеют порядок и их можно менять местами в рамках проекта. Задачи также можно менять местами и в том числе можно задачу перебрасывать в другой список задач в рамках одного пользователя.
Для пользователей, проектов, списков задач, задач был реализован полный набор CRUD-операций.
- Nest.js — фреймворк для создания бэкенд-приложений на Node.js. Микросервисы написаны на нём.
- PostgreSQL — каждый микросервис имеет свою базу данных PostgreSQL.
- pgAdmin — приложение для администрирования баз данных PostgreSQL.
- Docker — приложение для контейнеризации приложения. Все части проекта "поднимаются" в докере.
- RabbitMQ — брокер сообщений для взаимодействия между микросервисами.
- Nginx — сервер для маршрутизации запросов к микросервисам.
- Redis — база данных хранящая в себе кэшированные данные.
- Клонируйте репозиторий:
git clone https://github.com/JustChelUser/TODO_BACKEND.git
- Сборка и запуск :
docker compose up -d
- Адреса доступа:
- Точка входа в API: http://localhost:3000
- pgAdmin: http://localhost:5050 (используйте указанные в
.env
логин и пароль) - RabbitMQ: http://localhost:15672 (используйте указанные в
.env
логин и пароль) - API документация Swagger для
main-service
: http://localhost:3000/main-service/api/docs или http://localhost:3000/main-service/ - API документация Swagger для
auth-service
: http://localhost:3000/auth-service/api/docs или http://localhost:3000/auth-service/
Примечание: при необходимости данные для входа, порты и остальные данные можно изменить в.env
файле. Существует.env
на корневом уровне, а также на уровнеauth-service
(микросервис для работы с пользователями),main-service
(микросервис с основной логикой todo-листа).
- После успешного запуска все сервисы будут работать в контейнерах.
- В случае внесения изменений может потребоваться пересобрать docker контейнеры без кэша.
- Остановите и удалите контейнеры используя
docker compose down
- Пересоберите контейнеры с нуля без кэша используя
docker compose build --no-cache
- Запустите контейнеры используя
docker compose up -d
- Остановите и удалите контейнеры используя
- Этот сервис содержит в себе консьюмера для прослушивания очереди main_to_user_queue. Сервис с основной логикой используя RPC-соединение реализованное при помощи RabbitMQ посылает данные пользователя для проверки. Данный сервис получив email пользователя ищет его в своей базе данных и посылает объект пользователя назад.
- Также этот сервис содержит в себе продюсера для отправки данных в очередь user_to_main_queue. При удалении пользователя в сервис основной логики посылается его id для последующего удаления его объектов. В данном случае сообщение отправляется без ожидания обратной связи. Взаимодействие происходит в стиле EventBased.
- Этот сервис содержит в себе продюсера для очереди main_to_user_queue. Сервис отправляет email в очередь используя RPC-соединение для получения данных о пользователе и проверки корректности полученного email.
- Также этот сервис содержит в себе консьюмера для получения данных из очереди user_to_main_queue. Данные содержат в себе id удалённого пользователя и нужны для удаления всех его объектов хранящихся в базе данных этого сервиса.
Помимо открытой регистрации и авторизации есть возможность управления пользователями. Пользователями может управлять только администратор. Добавление администратора сделано в текущем проекте в упрощённом виде. Чтобы сделать пользователя администратором необходимо в таблице users изменить значение поля is_admin на true. После этого этот пользователь сможет других пользователей назначать администраторами используя PUT-запрос. Например запрос для изменения данных пользователя с id равным 3 - http://localhost:3000/users/3. Пример посылаемых при этом JSON-данных:
{
"email": "testUser@mail.ru",
"password":"1111",
"is_admin":true
}
Поле is_admin при этом является опциональным и может не использоваться при отправлении запроса. Для работы с таблицами базы данных можно использовать pgAdmin который входит в состав проекта.