Skip to content

Latest commit

 

History

History
99 lines (64 loc) · 5.18 KB

README.md

File metadata and controls

99 lines (64 loc) · 5.18 KB

Тестовое задание:

Разработка на NodeJS

Создать бекенд для игры крестики-нолики для игры против компьютера. Приложение должно быть реализовано на следующих технологиях:

  • back-end: один из популярных фреимверков express/koa/loopback/sails/etc
  • DB: mongodb
  • использование ES6 стандарта или выше

Стратегия компьютера должна быть реализована в Node.JS коде. Результаты игр, статистика побед и история ходов должны храниться в базе данных.

Игра может быть анонимной, т.е. без необходимости пользователю регистрироваться.

config

Для работы сервиса требуется наличие конфигурационного файла в директории ./config. В зависимости от переменной окружения process.env.NODE_ENV, будет использоваться файл настроек, например development.js, production.js. Если настройки в файле не, то настройка будет браться из файла config/default.js.

Шаблон настроек можно посмотреть в config/default.js, он состоит из:

  • mongoDb - настройки подключения к БД
  • server - настройки web server
  • api - настройки API сервиса
  • graylog - настройки логирования

dev разработка

Для запуска сервиса в режиме разработки, требуется выполнить команду npm run start:local. При удачном запуске выведутся сообщения:

NODE_ENV: development
server is running on the port: 3000

Запуск сервиса

Для запуска сервиса в режиме production, требуется:

  • Собрать проект npm run build
  • Запустить проект npm run start

При удачном запуске выведутся сообщения:

NODE_ENV: production
server is running on the port: 3000

REST API

Посмотреть описание REST API и потестировать можно по адресу http://localhost:3000/api-docs

Пример игры:

  • Создаем первого игрока, робота POST http://localhost:3000/v1/players. name = RobotPlayer, isAI = true
  • Создаем второго игрока, человека POST http://localhost:3000/v1/players. name = RobotPlayer, isAI = false
  • Создаем новую игру, POST http://localhost:3000/v1/games. Указываем id игроков и размер поля. firstPlayerId = 5f786a5f9efed03dadf415a2, secondPlayerId = 5f786ac59efed03dadf415a3, gameBoardSize = 3
  • По long polling можно подписаться на обновления игры GET http://localhost:3000/v1/subscriptions/5f786b4e9efed03dadf415a4
  • Делаем ход POST http://localhost:3000/v1/games/5f786b4e9efed03dadf415a4. Указав id игрока playerId = 5f786ac59efed03dadf415a3, номер игровой площади, которую занимает игрок numberOnGameBoard, номер ревизии revision = 1 (защита состоянии игры, с каждым ходом ревизия увеличивается на 1)

Тесты

Для выполнения тестов требуется выполнить команду npm run test. Т.к. это тестовое задание, то интеграционные тесту отсутствуют, модульным тестами покрыт лишь один класс src/gameEngine/playingArea/unit.test.js.

Устройство сервиса

Сервис состоит из:

server

Web server который реализует API сервиса. Используется Koa и Swagger.

mongoDbConnector

Коннектор к базе MongoDB используется нативный драйвер.

logger

Модуль логирования, в котором можно установить provider логирования. По умолчанию это console, если указаны все настройки graylog, то в качестве провайдера используется клиент graylog.

gameEngine

Движок игры, в котором реализована вся логика игры, состояние игры, простой AI.

gameManager

Менеджер игр, в котором содержатся не завершенные игры. Менеджер осуществляет рассылку изменения игр подписчикам. Является кэшем между Клиентом и БД. После того как игра завершается, она удаляется из менеджера игр.