Forráskód Böngészése

Create new endpoint: Shopping. Create Shopping DB

Tatiana Inama 7 éve
szülő
commit
deb76b89aa

+ 13 - 3
ktchn/src/server.ts

@@ -2,15 +2,14 @@ import * as path from "path";
 import cookieParser from "cookie-parser";
 import * as bodyParser from "body-parser";
 import logger from "morgan";
-import express, { Application } from "express";
+import express from "express";
 import rootRouter from "./routes/root";
 import recipeRouter from "./recipes/routes";
 import ingredientsRouter from './ingredients/routes';
 import plannerRouter from './planner/routes';
+import shoppingRouter from './shopping/routes';
 import dotenv from 'dotenv';
 import MongoClient from 'mongodb';
-import { Response } from 'express';
-import mongoService from './mongo';
 import { RecipeDB } from './recipes/model';
 
 namespace Application {
@@ -48,6 +47,7 @@ class App {
     this.app.use("/recipes", new recipeRouter(db).router);
     this.app.use("/ingredients", new ingredientsRouter(db).router);
     this.app.use('/planner', new plannerRouter(db).router);
+    this.app.use('/shopping', new shoppingRouter(db).router);
     this.app.use("/", rootRouter);
   }
 
@@ -90,6 +90,16 @@ class App {
     });
     db.createCollection('recipes');
     db.createCollection('planner');
+    db.createCollection('shopping').then(collection => {
+      collection.findOne({}).then(shoppingCart => {
+        if (!shoppingCart) {
+          collection.insertOne({
+            date: new Date(),
+            items: []
+          })
+        }
+      })
+    });
   }
 
   private launchApp() {

+ 37 - 0
ktchn/src/shopping/controller.ts

@@ -0,0 +1,37 @@
+import { ChainPController } from './../promise-all-middleware';
+import { IMongoService, IDBDocument } from './../mongo';
+import { ShoppingItem, ShoppingList } from './model';
+
+type Controller<U, T> = (db: IMongoService) => ChainPController<U, T>;
+
+const getShoppingList: Controller<void, IDBDocument<ShoppingList>|null> = db => req => (x) => {
+  return db.findOne({});
+}
+
+const validShoppingList = (mbShoppingList: any): mbShoppingList is IDBDocument<ShoppingList> => {
+  return mbShoppingList._id && mbShoppingList.items;
+}
+
+const validateShoppingList: Controller<void, IDBDocument<ShoppingList>> = () => req => () => {
+  const mbShoppingList = validShoppingList(req.body);
+  return mbShoppingList ? Promise.resolve(req.body) : Promise.reject('Invalid Shopping List'); 
+}
+
+const saveShoppingList: Controller<IDBDocument<ShoppingList>, IDBDocument<ShoppingList>> = db => () => async shoppingList => {
+  const delResult = await db.deleteMany({});
+  return await db.insertOne(shoppingList);
+}
+
+const deleteShoppingList: Controller<void, any> = db => req => () => db.deleteMany({}).then(
+  result => db.insertOne({
+    date: new Date(),
+    items: []
+  })
+);
+
+export {
+  getShoppingList,
+  validateShoppingList,
+  saveShoppingList,
+  deleteShoppingList
+}

+ 31 - 0
ktchn/src/shopping/model.ts

@@ -0,0 +1,31 @@
+export type Unit =
+'cup' |
+'gal' |
+'oz' |
+'pt' |
+'lb' |
+'qt' |
+'tbsp' |
+'tsp' |
+'g' |
+'kg' |
+'l' |
+'mg' |
+'ml' |
+'pkg' |
+'sticks' |
+'pinch' |
+'to taste'
+;
+
+export interface ShoppingItem {
+  name: string,
+  quantity: number,
+  unit: Unit
+  recipeIds: string[]
+}
+
+export interface ShoppingList {
+  items: ShoppingItem[],
+  date: Date
+}

+ 24 - 0
ktchn/src/shopping/routes.ts

@@ -0,0 +1,24 @@
+import { Router } from 'express';
+import mongoService, { IMongoService } from '../mongo';
+import MongoClient from 'mongodb';
+import { chainP as chain } from '../promise-all-middleware';
+import { getShoppingList, validateShoppingList, saveShoppingList, deleteShoppingList } from './controller';
+
+class ShoppingRoutes {
+  public router: Router;
+  private shoppingDB: IMongoService;
+
+  public constructor(db: MongoClient.Db) {
+    this.router = Router();
+    this.shoppingDB = mongoService(db)('shopping');
+    this.init();
+  }
+
+  private init() {
+    this.router.get('/', chain([getShoppingList(this.shoppingDB)]));
+    this.router.post('/', chain([validateShoppingList(this.shoppingDB), saveShoppingList(this.shoppingDB)]));
+    this.router.delete('/', chain([deleteShoppingList(this.shoppingDB)]));
+  }
+}
+
+export default ShoppingRoutes;