Git Product home page Git Product logo

mafiarest's Introduction

Чекин Игорь, Сервис-ориентированные архитектуры, Домашнее задание 6

Общая структура проекта

В папке 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 приведут к провалу запроса)

Описание API сервиса

Сервис поддерживает следующие эндпоинты:

  1. GET /users - получить список профилей всех пользователей с их ID (остальные методы работают уже с конкретным ID)

ID выводятся для возможности взаимодействия с сервисом, не имея прямого доступа к БД, при отсутсвии регистрации и авторизации

  1. GET /users/{uid} - получить профиль игрока с ID, соответствующим uid
  2. POST /users - добавить нового игрока. В тело запроса необходимо приложить JSON по схеме User (также автоматически создается UserStats для данного игрока)
  3. PATCH /users/{uid} - изменить данные профиля игрока с ID, соответствующим uid. В тело запроса необходимо приложить JSON по схеме User
  4. DELETE /users/{uid} - удалить игрока с ID, соответствующим uid
  5. PUT /stats/{uid} - обновить статистику игрока с ID, соответствующим uid. В тело запроса необходимо приложить JSON по схеме SessionReport
  6. GET /stats/{uid} - запросить генерацию PDF-отчета для игрока с ID, соответствующим uid. В ответе на запрос будет содержаться ссылка для скачивания ответа (ей удобнее воспользоваться через браузер, чтобы скачать файл отчета без лишних сложностей). Если на момент перехода по ссылке отчет будет не готов - пользователя уведомят об этом в ответном сообщении

mafiarest's People

Contributors

alucardik avatar

Watchers

 avatar

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.