Nostradamus
Задача: разработать приложение для предсказания результатов событий.
Роли: администратор и пользователь.
Технологии: JavaScript, NodeJS, Express, Jest, MySQL, MongoDB, Git.
Возможности администратора:
- Войти в систему используя email/password.
- Просмотреть список всех пользователей в системе.
- Добавить/удалить события.
- Добавить/удалить варианты исхода события с коэффициентами на каждый исход. Если пользователь ставит на исход и угадывает, то забирает себе баллы в размере его ставки умноженной на коэффициент, если нет – то он теряет свои баллы.
- Выбирать выигрышный вариант исхода события.
- Просмотреть информацию о всех ставках на событие.
Возможности пользователя:
- Создать аккаунт. На один email можно зарегистрировать только один аккаунт.
- Войти в систему используя email/password.
- Просмотреть список всех активных событий.
- Просмотреть список всех завершившихся событий.
- Пополнять свой кошелек (купить баллы за реальные деньги)
- Выводить деньги (менять баллы на реальные деньги).
- Делать ставки на исход события (только на 1 исход).
- Просматривать историю операций с кошельком. Сюда входят операции с пополнением, выводом и ставками (выигрыш или проигрыш).
- Просматривать историю своих ставок.
- Удалить свой аккаунт.
Реализация:
- Разработать схему базы данных, учитывая пункты 2-18.
- Разработать API для добавления события.
- Разработать API для удаления события.
- Разработать API для просмотра всех событий.
- Разработать API для просмотра активных событий.
- Разработать API для просмотра завершенных событий.
- Разработать API для добавления исхода события.
- Разработать API для удаления исхода события.
- Разработать API для выбора выигрышного варианта исхода события.
- Разработать API для просмотра ставок на событие.
- Разработать API для пополнения кошелька.
- Разработать API для вывода денег с кошелька.
- Разработать API для ставки на исход события.
- Разработать API для просмотра истории ставок.
- Разработать API для просмотра истории операций с кошельком.
- Разработать API для просмотра списка всех пользователей и ставок на событие.
- Разработать API для регистрации пользователя. Добавить ограничение: все операции (кроме авторизации и регистрации) доступны только после аутентификации.
- Разработать API для удаления своего аккаунта.
- Добавить роли администратор и пользователь. Настроить механизм ограничения доступа к API на стороне сервера (механизм авторизации). Для доступа к списку событий, пополнению и выводу баллов, ставкам, просмотру операций с кошельком, просмотру истории ставок и на удаление своего аккаунта должна быть роль пользователя.
- Для доступа к управлению пользователями, добавлению/удалению событий, выбору выигрышного исхода события и просмотру информации о ставках на событие должна быть роль администратора.
- Покрыть юнит тестами серверную часть, отвечающую за операции с кошельком (просмотр, ставки, пополнение и вывод). Для написания тестов использовать фреймворк Jest.
- Добавить в приложение валидацию на стороне сервера.
- Добавить в приложение работу с файлами. Изображение события храниться в папке на сервере, но при этом должна запись о их местоположении в БД (ссылка).
- Реализовать механизм транзакций для события. Удаляем событие, далее, если изображение события не удаляется, то делаем откат и посылаем соответствующее сообщение.
- Добавить пагинацию на стороне сервера для страниц со списками событий, пользователей и операций с кошельком.
- Реализовать 2 ендпоинта для аналитики без использования ORM. Задача первого - найти пользователя, которой за выбранный месяц заработал больше всего баллов. Задача второго - найти событие, которое принесло больше всего убытков всем пользователям.
Дополнительные требования:
- Добавить рассылку email уведомлений при удалении и регистрации аккаунта.
- Реализовать автоматическое удаление пользователей, которые не делали ставок более 3 месяцев.
- Предусмотреть функционал редактирования профиля (First Name, Last Name) и смены пароля.
- Добавить возможность поиска пользователей (по имени и фамилии).
- Добавить логирование. Логи должны сохраняться в MongoDB. В логи должны сохраняться ошибки, а также справочная информация.
- Разработать гибкую/модульную систему уведомлений – в email критические ошибки.
Rockstar требования:
- Разработать гибкую/модульную систему уведомлений – в telegram.
- Добавить уровень абстракции позволяющий моментально переключиться на другую БД, например с PostgreSQL на MongoDB.
- Добавить в приложение работу с Docker. Каждая часть приложения (база данных, микросервис, очередь сообщений и т.д.) должна быть помещена в отдельный контейнер. Работа с docker-контейнерами ведётся с помощью docker-compose.
- Реализовать минимальный CI process с помощью GitHub Actions. Работу с репозиторием необходимо вести в отдельной ветке для каждой задачи. При попытке сделать git push в master ветку, автоматически запускаются тесты. При неудачном завершении - сообщение об ошибке.
- Разбить приложение на микросервисы. Между собой микросервисы должны общаться с помощью RabbitMQ.
- Добавить возможность полнотекстового поиска по описаниям локаций с использованием ElasticSearch.