ソースを参照

Add Create daily plan endpoint

Tatiana Inama 7 年 前
コミット
4a6b89013c
3 ファイル変更28 行追加22 行削除
  1. 19 17
      ktchn/src/planner/controller.ts
  2. 5 2
      ktchn/src/planner/model.ts
  3. 4 3
      ktchn/src/planner/routes.ts

+ 19 - 17
ktchn/src/planner/controller.ts

@@ -2,7 +2,7 @@
 import { Request, Response, NextFunction } from 'express';
 import { IMongoService } from '../mongo';
 import { ChainPController } from '../promise-all-middleware';
-import PlanDB, { WeeklyPlanner, CompletePlanDB, Weekday } from './model';
+import PlanDB, { WeeklyPlanner, CompletePlanDB, Weekday, Plan } from './model';
 import moment, { Moment } from 'moment';
 import { ObjectId } from 'bson';
 import { RecipeDB } from '../recipes/model';
@@ -15,25 +15,21 @@ const mkWeekQuery = (week: string) => ({
   week: parseInt(week) || moment().isoWeek()
 });
 
+const validPlan = (mbPlan: any) => {
+  if (mbPlan.day && mbPlan.week && mbPlan.recipe && mbPlan.meal) {
+    return Promise.resolve({
+      ...mbPlan,
+      day: new Date(mbPlan.day),
+      recipe: new ObjectId(mbPlan.recipe)
+    } as Plan)
+  } else {
+    return Promise.reject('Required fields: day, week, recipe and meal');
+  }
+}
+
 const getWeekPlanner: Controller<void, PlanDB[]> =
   db => req => () => db.find<PlanDB>(mkWeekQuery(req.params.week));
 
-// const getWeekPlannerComplete: Controller<WeeklyPlanner> =
-//   db => req => () => db.find<PlanDB>(mkWeekQuery(req.params.week)).then(
-//     plans => plans.reduce((planner, plan) => {
-//       const date = moment(plan.day);
-//       return {
-//         ...planner,
-//         [getWeekDay(date)]: {
-//           date,
-//           [plan.meal]: plan.recipe
-//         }
-//       }
-//     }, {
-//       week: mkWeekQuery(req.params.week).week
-//     } as WeeklyPlanner)
-//   )
-
 const formatPlanner: Controller<PlanDB[], WeeklyPlanner> = db => req => prevResult => {
   const week = mkWeekQuery(req.params.week).week;
   return db.aggregate<CompletePlanDB>([
@@ -67,7 +63,13 @@ const formatPlanner: Controller<PlanDB[], WeeklyPlanner> = db => req => prevResu
   }, { week } as WeeklyPlanner))
 }
 
+const savePlan: Controller<void, PlanDB> = db => req => prevResult => {
+  const plan = req.body;
+  return validPlan(plan).then(db.insertOne)
+}
+
 export {
   getWeekPlanner,
   formatPlanner,
+  savePlan,
 }

+ 5 - 2
ktchn/src/planner/model.ts

@@ -17,14 +17,17 @@ export type WeekPlan = {
   [day in Weekday]: DayPlan;
 };
 
-export default interface PlanDB {
-  _id: ObjectID,
+export interface Plan {
   day: Date,
   week: number,
   recipe: ObjectID,
   meal: Meal
 }
 
+export default interface PlanDB extends Plan{
+  _id: ObjectID,
+}
+
 export interface CompletePlanDB extends Omit<PlanDB, 'recipe'> {
   recipe: RecipeDB
 }

+ 4 - 3
ktchn/src/planner/routes.ts

@@ -2,7 +2,7 @@ import { Router } from 'express';
 import mongoService, { IMongoService } from '../mongo';
 import MongoClient from 'mongodb';
 import { chainP } from '../promise-all-middleware';
-import { getWeekPlanner, formatPlanner } from './controller';
+import { getWeekPlanner, formatPlanner, savePlan } from './controller';
 
 class PlannerRoutes {
   public router: Router;
@@ -16,8 +16,9 @@ class PlannerRoutes {
 
   private init() {
     this.router.get('/all/');
-    this.router.get('/week/:week', chainP([getWeekPlanner(this.PlannerDB)]))
-    this.router.get('/week/:week/organized', chainP([formatPlanner(this.PlannerDB)]))
+    this.router.get('/week/:week', chainP([getWeekPlanner(this.PlannerDB)]));
+    this.router.get('/week/:week/organized', chainP([formatPlanner(this.PlannerDB)]));
+    this.router.post('/day', chainP([savePlan(this.PlannerDB)]));
   }
 }