В папке MafiaREST
содержатся все основные файлы приложения. Обозначим назначения пакетов внутри модуля (название пакетов совпадают с названиями папок).
config
- здесь задаются константы, используемые остальными пакетами модуляdb
- имплементирует интерфейс для взаимодействия с базой данных (в моем случае сMongoDB
)endpoints
- содержит обработчики различных ресурсов сервераmsgbroker
- имплементирует интерфейс взаимодействия с очередью сообщенийpdfgen
- создает PDF-отчетschemes
- содержит схемы данных для базы данныхserver
- непосредственно RestFul http-сервер, обрабатывающий запросы пользователейutils
- общие вспомогательные функцииworker
- воркер, генерирующий отчеты в соответствии с паттерном "очередь задач"
В качестве базы данных используется NoSQL-решение MongoDB
, в связи с простотой интерфейса и нативностью сериализации данных из json
в Mongo и обратно. Очередь задач реализуется через брокер сообщений RabbitMQ
.
Для локального запуска сервера необходимо наличие go
версии 1.17 - 1.18
. Требуется перейти в папку MafiaREST
и ввести команду go run .
Локальный запуск воркера: go run . --mode=worker
. Используется один Докер-Образ для обоих вариантов работы и регулируется значением переменной окружения MafiaREST_MODE
. По умолчанию она выставляется в значение server
, можно заменить его на worker
, тогда будет запущен воркер. Ссылка на образ (alucardik/soa-images:MafiaREST
)
ВНИМАНИЕ: для работы и сервера, и воркера нужны поднятые сервисы брокера сообщений и базы данных, это может усложнять локальный запуск
Тем не менее, настоятельно рекомендуется запускать все сервисы через docker-compose
, так как между ними уже настроены все связи. Достаточно выполнить следующие команды из корневой папки:
docker-compose build
docker up --scale server=1 --scale worker=n
Где n
- число воркеров, которые будут подключены к очереди. Далее можно отправлять запросы на localhost:8080/
.
User
- представляет профиль игрока. Представляется следующим JSON
:
{
"name": {имя пользователя}, // строка
"avatar": {ссылка на аватар}, // строка
"sex": {пол} // число: 0 - мужской, 1 - женский
"email": {e-mail} // строка
}
UserStats
- представляет статистику игр некоторого игрока. Представляется следующим JSON
:
{
"uid": {ID игрока} // тип ID
"session_count": {общее количество сессий} // число
"wins": {количество побед} // число
"losses": {количество поражений} // число
"total_time": {общее время в игре} // число, секунды
}
SessionReport
- представляет отчет об игровой сессии. Представляется следующим JSON
:
{
"outcome": {исход сессии}, // число: 0 - поражение, 1 - победа
"duration": {длительность сессии}, // число: количество секунд
}
ВНИМАНИЕ: на сервере производится валидация схем, поэтому для успешной отправки запроса нужно включать все указанные поля и указывать в них корректные значения (например, пустое имя или неправильная схема e-mail приведут к провалу запроса)
Сервис поддерживает следующие эндпоинты:
GET /users
- получить список профилей всех пользователей с их ID (остальные методы работают уже с конкретным ID)
ID выводятся для возможности взаимодействия с сервисом, не имея прямого доступа к БД, при отсутсвии регистрации и авторизации
GET /users/{uid}
- получить профиль игрока с ID, соответствующим uidPOST /users
- добавить нового игрока. В тело запроса необходимо приложитьJSON
по схемеUser
(также автоматически создаетсяUserStats
для данного игрока)PATCH /users/{uid}
- изменить данные профиля игрока с ID, соответствующим uid. В тело запроса необходимо приложитьJSON
по схемеUser
DELETE /users/{uid}
- удалить игрока с ID, соответствующим uidPUT /stats/{uid}
- обновить статистику игрока с ID, соответствующим uid. В тело запроса необходимо приложитьJSON
по схемеSessionReport
GET /stats/{uid}
- запросить генерацию PDF-отчета для игрока с ID, соответствующим uid. В ответе на запрос будет содержаться ссылка для скачивания ответа (ей удобнее воспользоваться через браузер, чтобы скачать файл отчета без лишних сложностей). Если на момент перехода по ссылке отчет будет не готов - пользователя уведомят об этом в ответном сообщении