Sfoglia il codice sorgente

Add compact and complete views for planner routes

Tatiana Inama 7 anni fa
parent
commit
f84475d71f

+ 46 - 3
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, Plan } from './model';
+import PlanDB, { WeeklyPlanner, CompletePlanDB, Weekday, Plan, CompactWeeklyPlanner } from './model';
 import moment, { Moment } from 'moment';
 import { ObjectId } from 'bson';
 import { RecipeDB } from '../recipes/model';
@@ -32,7 +32,7 @@ const validPlan = (mbPlan: any) => {
 const getWeekPlanner: Controller<void, PlanDB[]> =
   db => req => () => db.find<PlanDB>(mkWeekQuery(req.params.week));
 
-const formatPlanner: Controller<PlanDB[], WeeklyPlanner> = db => req => prevResult => {
+const completePlanner: Controller<PlanDB[], WeeklyPlanner> = db => req => prevResult => {
   const week = mkWeekQuery(req.params.week).week;
   return db.aggregate<CompletePlanDB>([
     {
@@ -65,6 +65,48 @@ const formatPlanner: Controller<PlanDB[], WeeklyPlanner> = db => req => prevResu
   }, { week } as WeeklyPlanner))
 }
 
+const compactPlanner: Controller<null, CompactWeeklyPlanner> = db => req => prevResult => {
+  const week = mkWeekQuery(req.params.week).week;
+  return db.aggregate<CompletePlanDB>([
+    {
+      '$match': {
+        'week': week
+      }
+    },
+    {
+      '$lookup': {
+        'from': 'recipes', 
+        'localField': 'recipe', 
+        'foreignField': '_id', 
+        'as': 'recipe'
+      }
+    }, {
+      '$unwind': {
+        'path': '$recipe'
+      }, 
+    }, {
+      '$project': {
+        'recipe': {
+          'author': 0, 
+          'details': 0, 
+          'ingredients': 0, 
+          'instructions': 0
+        }
+      }
+    }
+  ]).then(plans => plans.reduce((planner, plan) => {
+    const day = moment(plan.day);
+    return {
+      ...planner,
+      [getWeekDay(day)]: {
+        ...planner[getWeekDay(day)],
+        day,
+        [plan.meal]: plan.recipe
+      }
+    };
+  }, { week } as CompactWeeklyPlanner))
+}
+
 const savePlan: Controller<void, PlanDB> = db => req => prevResult => {
   const plan = req.body;
   return validPlan(plan).then(db.insertOne)
@@ -81,7 +123,8 @@ const saveManyPlans: Controller<void, PlanDB[]> = db => req => prev => {
 }
 export {
   getWeekPlanner,
-  formatPlanner,
+  completePlanner,
+  compactPlanner,
   savePlan,
   saveManyPlans,
 }

+ 13 - 3
ktchn/src/planner/model.ts

@@ -13,8 +13,8 @@ export type Weekday =
   'saturday' |
   'sunday';
 
-export type WeekPlan = {
-  [day in Weekday]: DayPlan;
+export type WeekPlan<T> = {
+  [day in Weekday]: T;
 };
 
 export interface Plan {
@@ -43,7 +43,17 @@ export interface DayPlan {
   dinner?: RecipeDB
 }
 
-export interface WeeklyPlanner extends WeekPlan {
+export interface CompactDayPlan {
+  date: Date,
+  lunch?: { _id: ObjectID, name: string },
+  dinner?: { _id: ObjectID, name: string },
+}
+
+export interface WeeklyPlanner extends WeekPlan<DayPlan> {
+  week: number
+}
+
+export interface CompactWeeklyPlanner extends WeekPlan<CompactDayPlan> {
   week: number
 }
 

+ 3 - 2
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, savePlan, saveManyPlans } from './controller';
+import { getWeekPlanner, completePlanner, compactPlanner, savePlan, saveManyPlans } from './controller';
 
 class PlannerRoutes {
   public router: Router;
@@ -17,7 +17,8 @@ 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/complete', chainP([completePlanner(this.PlannerDB)]));
+    this.router.get('/week/:week/compact', chainP([compactPlanner(this.PlannerDB)]));
     this.router.post('/day', chainP([savePlan(this.PlannerDB)]));
     this.router.post('/', chainP([saveManyPlans(this.PlannerDB)]));
   }