/drone-cafe

Primary LanguageJavaScript

Drone cafe

Demo

https://drone-cafe-management.herokuapp.com

Описание

Основные модули используемые в проекте

  • Сервер реализован на Node.js с использованием express.js
  • Взаимодействие клиента и сервера в реальном времени реализовоно с использованием socket.io
  • Интерфейс системы построен на фреймворке AngularJS с использованием модулей:
    • angular-local-storage - для работы cookie
    • angular-resource - для работы с REST API
    • angular-ui-router - для работы с роутами
  • Для хранения данных использована БД MongoDB с библиотекой Mongoose
  • В качестве CSS фреймворка использован Materialyze

Структура проекта

app		
  |---	AuthForm	
      |---	AuthForm.html
      |---	AuthFormCtrl.js
  |---	HeaderComponent	
      |---	HeaderComponent.html
      |---	HeaderComponent.js
  |---	Kitchen	
      |---	Kitchen.html
      |---	KitchenCtrl.js
  |---	Libs	
  |---	Order	
      |---	Order.html
      |---	OrderCtrl.js
  |---	Services	
      |---	SocketService.js
      |---	StorageService.js
      |---	TimeParserService.js
      |---	UserService.js
  |---	app.js	
  |---	app.scss	
  |---	index.html	
  |---	node_modules	
server		
  |---	models	
      |---	DishModel.js
      |---	OrderModel.js
      |---	UserModel.js
  |---	index.js	
  |---	api.js	
  |---	server.js	
  |---	socket.js	
tests		

Проект состоит из двух интерфейсов:

  • интерфейс пользователя,
  • интерфейс повара.

Интерфейс пользователя

Содержит 2 роута:

  • getAuth – страница авторизации,
  • order – страница работы с заказами.

При первом запуске приложения новым пользователем, происходит проверка с помощью метода getUser() сервиса StorageService содержится ли в cookie объект пользователя или нет. Если возращен объект происходит переход на роут order, иначе getAuth.

Страница авторизации

После заполнения формы пользователем, данные формы POST запросом направляются на адрес /users. Поля формы валидируются.

На сервере адрес /users обрабатывается следующим образом:

Происходит запрос в БД по полю email. Если пользователь с данным email зарегистрирован, возвращается ответ с телом содержащим данные пользователя, иначе создается и возвращается новый пользователь и ему на баланс добавляется 100 кредитов.

Данные пользователя записываются в cookie использую метод сервиса StorageService setUser().

Страница работы с заказами

Пополнение баланса реализовано посредством события Socket ‘addCredit’. Нажатие на кнопку Add Credit инициирует данное событие с передачей аргумента: id пользователя.

Для работы с Socket реализован сервис SocketService. Его методы возвращают Promise который должен разрешиться объектом содержащим запрошенные данные.

Добавление заказа

Нажатие на копку Add Dish инициирует событие Socket ‘getDishes’. Ответом сервера будет массив объектов с данными блюд. Список блюд в интерфейсе отображается в модальном окне.

Заказ

Создается в интерфейсе пользователя. Нажатие на кнопку ADD в карточке блюда инициирует событие Socket ‘addDishToOrder’ и 'subCredit'.

  • ‘addDishToOrder’ обрабатывается на сервере следующим образом:

    • создается заказ по модели ‘OrderModel’ со статусом “ordered” и сохраняется в БД,
    • инициируются события Socket: ‘addDishToOrder’ – в интерфейсе пользователя добавляет заказ в массив order ‘orderStatus’ - в интерфейсе пользователя добавляет заказ меняет статус заказа
  • 'subCredit' – списывает с баланса стоимость блюда.

Обработчик события ‘orderStatus' меняет статус заказов, удаляет заказ из интерфейса если статус заказа меняется на ‘deleted’, инициирует ‘addCredit’, если статус заказа меняется на 'rejection'.

Интерфейс повара

https://drone-cafe-management.herokuapp.com/#!/kitchen

После загрузки страницы инициируется событие ‘getOrders’, ответ содержит список заказов. Заказы сортируются по статусам и отображаются в интерфейсе.

Нажатия на кнопки Start и Complete в соответствующих разделах инициируют событие ‘orderStatus’. В ответе приходит объект заказа с новым статусом и заказ либо удаляется из первого раздела и создается во втором по другому шаблону, либо удаляется из интерфейса.

‘orderStatus’ обрабатывается на сервере следующим образом:

  • если заказ имеет статус 'cooking', то заказ переходит на доставку в модуль ‘drone’ и присваивается новый статус. После разрешения Promise доставки запускается автоудаление с таймаутом и инициируется событие ‘orderStatus’.
  • иначе присваивается новый статус и инициируется событие ‘orderStatus’

Тестирование

Файлы со сценариями тестов располагаются в папке tests. Реализованы тесты сервера (REST API и Socket) с использованием библиотек:

  • Mocha
  • Chai
  • Supertest

И тесты интерфейса с использованием Protractor.