Многопользовательский планировщик задач. Пользователи могут использовать его в качестве TODO листа.
- Java
- Maven
- Backend
- Spring Boot
- Spring Security
- Spring Session
- Spring Kafka
- Spring Scheduler
- Spring Mail
- JWT
- Базы данных
- PostgreSQL
- Spring Data JPA
- Docker и микросервисы
- Контейнеры, образы, volumes, Dockerfile, Docker Compose
- Брокер сообщений Kafka
Spring Boot приложение, реализующее REST API для работы с пользователями, сессиями, создаваемыми при авторизации, и задачами.
Работа с пользователями (доступно всем пользователям):
- Регистрация
- Авторизация
Работа с задачами (доступно авторизованным пользователям):
- Создание
- Получение
- Редактирование
- Удаление
Вместо сессий используется JWT. Выдаются только access token, без refresh, по которым авторизовываются запросы к REST API. Авторизация JWT реализованы на уровне Spring Security в виде фильтра, который достает access toke из запроса, декодирует и валидирует его.
Spring Boot приложение с двумя модулями - Spring Mail и Spring AMQP.
С помощью Spring AMQP приложение подключается к Kafka и создает топик EMAIL_SENDING_TASKS, после чего подписывается на сообщения, поступающие от планировщика и бэкенд-сервиса.
Для каждого полученного сообщения, содержимое которого десериализуется в экземпляр модели, пользуемся модулем Spring Mail, чтобы отправить письмо.
Spring Boot приложение "планировщик"
Задача сервиса - раз в сутки итерировать всех пользователей, и формировать для них отчёты о задачах и изменениях в них за сутки.
- Пользователям, у которых на конец дня есть невыполненные задача, отправляется емейл вида “У вас осталось N несделанных задач”. Тело письма содержит заголовки этих задач (не более 5)
- Пользователям, у которых за последние сутки 1 или более задач были отмечены как сделанные, отправляется емейл вида “За сегодня вы выполнили N задач”. Тело письма содержит заголовки выполненных задач (не более 5)
- Пользователям, для которых верны оба условия выше, отправляется емейл и со списком несделанных, и сделанных за последние сутки задач Spring Scheduler по Cron выражению каждую полночь вызывает метод, читающий список пользователей, анализирующий их задачи, и формирующий емейлы для отправки. Сформированные емейлы упаковываются в классы-модели и отправляются в Kafka топик.
| Колонка | Тип | Комментарий |
|---|---|---|
| id | bigint | Айди пользователя, автоинкремент, первичный ключ |
| varchar | Email пользователя | |
| username | varchar | Логин пользователя |
| password | varchar | Пароль пользователя в зашифрованном виде с помощью BCrypt |
| Колонка | Тип | Комментарий |
|---|---|---|
| id | uuid | Айди задачи, первичный ключ |
| user_id | bigint | Айди пользователя, внешний ключ |
| title | varchar | Заголовок задачи |
| text | varchar | Текст задачи |
| status | varchar | Статус задачи |
| updated_at | timestamp | Дата изменения статуса задачи |
Kafka запускается в контексте Docker Compose в кол-ве одной узла, принимающей запросы от других контейнеров внутри Docker.
- Установить Docker и Git на сервере
- Клонировать репозиторий проекта task-tracker:
git clone https://github.com/KittyNicky/task-tracker.git- Заполнить переменные окружения файла .env
EMAIL_USERNAME=<email пользователя, от которого будут отправляться емейлы>
EMAIL_PASSWORD=<пароль email пользователя/сгенерированный пароль приложения>
DB_USERNAME=<Имя пользователя базы данных>
DB_PASSWORD=<Пароль пользователя базы данных>
SECRET_KEY=<JWT Access token>- Запустить docker compose
cd task-tracker
docker compose -f compose.yaml -p task-tracker up -dПосле создания и запуска контейнеров будет запущено 6 контейнеров