Многопользовательский планировщик задач, написанный в учебных целях на основе данного ТЗ с небольшими отклонениями и улучшениями.
- Ссылка
- API-документация (Swagger)
- Проект разделен на несколько сервисов: frontend, backend, scheduler (планировщик), mailer (рассыльщик писем).
- Общие зависимости вынесены в отдельный сервис common во избежание дублирования кода.
- Использование брокера сообщений (Apache Kafka) для обмена информацией между сервисами.
- Авторизация на основе JWT. В том числе реализованы Refresh-токены. Хранение токенов в HttpOnly Cookie.
- Валидация пароля с помощью Passay. Кастомные валидаторы: подтверждение пароля, проверка на уникальность, проверка часового пояса.
- Стандартизация ответов от бэкенда (RestControllerAdvice).
- Использование Liquibase для миграций.
- Swagger для API-документации c рабочим решением авторизации на основе JWT.
- Adminer (веб-интерфейс для управления базами данных) и Kafka UI (веб-интерфейс для Apache Kafka).
- Сборка приложения осуществляется через Docker. При этом наружу торчит только Nginx, который выступает в роли обратного прокси.
- CI/CD с помощью GitHub Actions. При пуше в основную ветку автоматически запускаются сборка образов, push образов в Docker Hub и развертывание кода на сервере. При этом, несмотря на то, что это монорепозиторий, ребилдятся только затронутые коммитом сервисы.
Что улучшено по сравнению с ТЗ
- Добавлены категории.
- Добавлены цвета и возможность выбора цвета для категории и задачи.
- Добавлено перетаскивание категорий и задач для быстрой сортировки. Задачу, в том числе, можно перетащить в другую категорию или в "Выполненные".
- Добавлена возможность менять настройки профиля.
- В том числе можно отключить ежедневные отчеты.
- В том числе добавлена возможность выбрать часовой пояс. На основе часового пояса пользователь видит даты создания и завершения задач.
- Изменена логика планировщика. Сервис формирует отчеты не раз в сутки, а каждые 30 минут. При этом в выборку попадают только те пользователи, у которых сейчас полночь. То есть каждому пользователю отчет приходит в полночь по отношению к его выбранному часовому поясу.
- Для каждого события свой топик в брокере сообщений. Всего 3 события: регистрация, смена пароля, ежедневный отчет по задачам. Также сделан dlt-топик для сохранения недоставленных сообщений.
- При регистрации и смене пароля пользователю на почту приходит сообщение с доступами. Пароль при этом передается в топик в зашифрованном виде для безопасности.
-
Склонировать репозиторий
git clone https://github.com/giv13/task-tracker.git
-
Перейти в папку с репозиторием
cd task-tracker -
Скопировать пример файла переменных окружения
cp .env.example .env
-
Открыть скопированный файл. В моем случае я открываю файл стандартным блокнотом Windows.
notepad .env
-
В файле задать основной порт для доступа к приложению, настройки для БД, Kafka, Kafka UI, SMTP, в
JWT_SECRETзадать сгенерированный секрет, вENCRYPTOR_PASSWORDиENCRYPTOR_SALTзадать произвольные пароль и соль для шифрования данных для передачи в Kafka. Пример файла:PORT=80 DB_NAME=task-tracker-db DB_USER=task-tracker-user DB_PASSWORD=task-tracker-pass JWT_SECRET=8927666ce0f474650328f3f905aeccd0211598a986e72fad36172474ec2a32f6 KAFKA_USER_REGISTERED_TOPIC_NAME=task-tracker.user.registered KAFKA_USER_PASSWORD_CHANGED_TOPIC_NAME=task-tracker.user.password-changed KAFKA_USER_TASK_SUMMARY_TOPIC_NAME=task-tracker.user.task-summary KAFKA_USER_DLT_TOPIC_NAME=task-tracker.user.dlt KAFKA_UI_USER=kafka-ui-user KAFKA_UI_PASSWORD=kafka-ui-pass SMTP_HOST=smtp.gmail.com SMTP_PORT=587 SMTP_USERNAME=your-username@gmail.com SMTP_PASSWORD=your-password ENCRYPTOR_PASSWORD=task-tracker ENCRYPTOR_SALT=8927666ce0f474650328f3f905aeccd0211598a986e72fad36172474ec2a32f6
-
Развернуть приложение
docker-compose up -d --build
-
Приложение будет доступно по пути
http://localhost:80/(или на другом порту, указанном в переменнойPORT). Чтобы остановить приложение и удалить все сервисы, выполните команду:docker-compose down