Skip to content

Test task - user balance service with distributed crons using Nest.js + Fastify, TypeORM, PostgreSQL, Docker, Testcontainers

Notifications You must be signed in to change notification settings

maxcore25/test-task-balance-crons

Repository files navigation

test-task-balance-crons

Swagger API Docs

Необходимые компоненты

  • Docker/Docker Compose
  • Node.js (>= 22.x)
  • pnpm (>= 9.x)
  • PostgreSQL (>= 16)

Ниже доступны два способа запустить проект:

  1. На localhost
  2. В Docker

Инструкция (Docker)

  1. Скопируйте .env.example в .env. Переменные окружения уже заданы по умолчанию для корректной работы

  2. Запустите сервис в Docker

# задание 1
docker-compose up -d --build

# задание 2
docker-compose -f docker-compose.task2.yml up -d --build
  1. Перейдите к документации Swagger API по адресу http://localhost:3000/docs
  2. Завершите работу Docker-контейнеров
# задание 1
docker-compose down

# задание 2
docker-compose -f docker-compose.task2.yml down

Инструкция (localhost)

  1. Скопируйте .env.example в .env и измените переменные окружения. Достаточно поменять только DB_USERNAME/DB_PASSWORD для вашей локальной БД. Остальные переменные уже заданы по умолчанию для корректной работы
  2. Создайте новую базу данных в PostgreSQL, используя значение из переменной DB_NAME файла .env
  3. Установите зависимости
pnpm i
  1. Запустите миграции и сидеры
# миграции
pnpm m:run

# сидеры
pnpm seed:run
  1. Запустите сервер в режиме разработки
pnpm start:dev
  1. Перейдите к документации Swagger API по адресу http://localhost:3000/docs

Запуск тестов (localhost)

# юнит-тесты
pnpm run test

# e2e-тесты
# важно: должен быть запущен Docker (требуется для Testcontainers + PostgreSQL)
pnpm run test:e2e

# покрытие тестами
pnpm run test:cov

ТЗ

Ссылка: https://docs.google.com/document/d/1r5Mf6sqla_7DEYxznouiMtQjaivKN7xM/edit

Задание 1. Создать простое webApp.

  • Создать простое webApp, используя Nestjs + Fastify, PostgreSQL & TypeORM.
  • При запуске приложение должно создать в базе данных таблицу “users” с помощью миграции и добавить в неё один пользовательский аккаунт, на котором будет лишь одно поле “balance” со значением 10000. Для совершения миграций, управляемых приложением, можно использовать встроенные возможности TypeORM или библиотеку “Umzug”.
  • Написать route для обновления баланса пользователя, принимающего параметры userId и amount.
  • Важным условием является то, что баланс пользователя не может быть отрицательным.
  • Изменение баланса должно производиться в реальном времени, без использования очередей и отложенных задач.
  • Проект должен включать docker compose файл и запускаться локально.
  • Обязательно наличие тестов

Задание 2. Продолжение разработки webApp.

  • Продолжить разработку webApp, на этот раз нашему приложению требуется обрабатывать клиентов на нескольких серверах одновременно, минимум 5 параллельных копий.
  • Нужно добавить в приложение cron-service, в котором будет минимум 5 тестовых фоновых задач.
  • Назвать каждую можно как угодно.
  • У каждой задачи должна быть настройка её интервала выполнения, вызываемой ею функции, имени задачи.
  • Каждая задача может выполняться от 1 секунды до 24 часов.
  • Добавить внутрь обработку данных или sleep, чтоб функция задачи завершилась не ранее, чем через 2 минуты после запуска.
  • Каждая задача, если её запустила какая-то из копий приложения, не должна запуститься на другой копии, пока где-либо запущена.
  • На одной копии приложения может быть запущено сколько угодно задач.
  • При одновременном старте всех копий приложения, копии должны распределить между собой задачи “+-” равномерно, т.е. не должно быть такого, чтобы одна копия просто взяла на себя все задачи.
  • Выполненные задачи должны записываться историей в базу данных.
  • Должна быть возможность в реальном времени получить по ручке список всех фоновых задач, с информацией по каждой, на каком из серверов она выполняется и какое время прошло с момента её запуска. В этом списке также должны находиться задачи, которые ожидают выполнения.
  • Важным моментом является то, что ни одна копия приложения не должна ничего знать о другой копии, полное отсутствие мастер-сервера.
  • Для реализации задачи использовать ровно те же технологии, что уже были в первой части, ничего нового использовать нельзя.

About

Test task - user balance service with distributed crons using Nest.js + Fastify, TypeORM, PostgreSQL, Docker, Testcontainers

Topics

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published