Bladeren bron

Create simplify endpoint for weekly meals

Tatiana Inama 5 jaren geleden
bovenliggende
commit
68f5ed6098
3 gewijzigde bestanden met toevoegingen van 43 en 6 verwijderingen
  1. 31 5
      ktchn/src/planner/controller.ts
  2. 10 0
      ktchn/src/planner/model.ts
  3. 2 1
      ktchn/src/planner/routes.ts

+ 31 - 5
ktchn/src/planner/controller.ts

@@ -1,6 +1,6 @@
 import { IMongoService, IDBDocument } from '../mongo';
 import { ChainPController } from '../promise-all-middleware';
-import PlanDB, { CompletePlanDB, Weekday, Plan, WeeklyPlanner } from './model';
+import PlanDB, { CompletePlanDB, Weekday, Plan, WeeklyPlanner, SimpleWeekPlan } from './model';
 import moment, { Moment } from 'moment';
 import { ObjectId } from 'bson';
 
@@ -29,11 +29,11 @@ const validateRange: Controller<void, {from: Date, to: Date}> = () => req => ()
     Promise.reject('Invalid date range');
 }
 
-const getPlannerByRange: Controller<{from: Date, to: Date}, WeeklyPlanner> = db => () => ({ from, to }) => {
+const PlannerQueryByRange = (db: IMongoService, from: Date, to: Date) => {
   return db.aggregate<CompletePlanDB>([
     {
       '$match': {
-        'date': {'$gte': from, '$lte': to}
+        'date': {'$gte': moment(from).startOf('day').toDate(), '$lte': moment(to).endOf('day').toDate()}
       }
     }, {
       '$lookup': {
@@ -56,7 +56,11 @@ const getPlannerByRange: Controller<{from: Date, to: Date}, WeeklyPlanner> = db
         }
       }
     }
-  ]).then(plans => plans.reduce((planner, plan) => {
+  ]);
+}
+
+const getPlannerByRange: Controller<{from: Date, to: Date}, WeeklyPlanner> = db => () => ({ from, to }) => {
+  return PlannerQueryByRange(db, from, to).then(plans => plans.reduce((planner, plan) => {
     const date = moment(plan.date);
     return {
       ...planner,
@@ -69,6 +73,27 @@ const getPlannerByRange: Controller<{from: Date, to: Date}, WeeklyPlanner> = db
   }, { week: moment(from).isoWeek() } as WeeklyPlanner))
 }
 
+const getSimplifyPlannerByRange: Controller<{from: Date, to: Date}, SimpleWeekPlan> = db => () => ({ from, to }) => {
+  return PlannerQueryByRange(db, from, to).then(data => {
+    return data.reduce((planner, plan) => {
+      const weekday = getWeekDay(moment(plan.date));
+      const meals = planner[weekday]?.meals || [];
+      return {
+        ...planner,
+        [weekday]: {
+          meals: [
+            ...meals,
+            {
+              type: plan.meal,
+              recipe: plan.custom || plan.recipe
+            }
+          ]
+        }
+      }
+    }, {} as SimpleWeekPlan);
+  });
+}
+
 const savePlan: Controller<void, PlanDB> = db => req => prevResult => {
   const plan = req.body;
   return validPlan(plan).then(db.insertOne)
@@ -118,5 +143,6 @@ export {
   saveWeekPlanner,
   validatePlanner,
   validateRange,
-  getPlannerByRange
+  getPlannerByRange,
+  getSimplifyPlannerByRange
 }

+ 10 - 0
ktchn/src/planner/model.ts

@@ -28,6 +28,16 @@ export type WeekPlan = {
   [day in Weekday]: DayPlan;
 };
 
+export type SimpleWeekPlan = {
+  [day in Weekday]: {
+    date: Moment,
+    meals: [{
+      type: Meal,
+      recipe: RecipePlan
+    }]
+  };
+}
+
 export interface WeeklyPlanner extends WeekPlan {
   week: number;
 }

+ 2 - 1
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 { savePlan, saveWeekPlanner, validatePlanner, validateRange, getPlannerByRange } from './controller';
+import { savePlan, saveWeekPlanner, validatePlanner, validateRange, getPlannerByRange, getSimplifyPlannerByRange } from './controller';
 
 class PlannerRoutes {
   public router: Router;
@@ -16,6 +16,7 @@ class PlannerRoutes {
 
   private init() {
     this.router.get('/week/:from/:to', chainP([validateRange(this.PlannerDB), getPlannerByRange(this.PlannerDB)]))
+    this.router.get('/week/simplify/:from/:to', chainP([validateRange(this.PlannerDB), getSimplifyPlannerByRange(this.PlannerDB)]))
     this.router.post('/week', chainP([validatePlanner(this.PlannerDB), saveWeekPlanner(this.PlannerDB)]));
     this.router.post('/day', chainP([savePlan(this.PlannerDB)]));
   }