Selaa lähdekoodia

Improve planner saving: Update existent plans and create new ones if necessary

Tatiana Inama 7 vuotta sitten
vanhempi
commit
7a1ddd0033
2 muutettua tiedostoa jossa 11 lisäystä ja 6 poistoa
  1. 3 1
      ktchn/src/mongo.ts
  2. 8 5
      ktchn/src/planner/controller.ts

+ 3 - 1
ktchn/src/mongo.ts

@@ -1,4 +1,4 @@
-import { Db, Collection, ObjectID, FilterQuery, ObjectId, WriteOpResult, FindOneOptions } from 'mongodb';
+import { Db, Collection, ObjectID, FilterQuery, ObjectId, WriteOpResult, FindOneOptions, UpdateWriteOpResult } from 'mongodb';
 
 export interface IDDocument {
   _id: ObjectID
@@ -13,6 +13,7 @@ export interface IMongoService {
   findOneById<T>(idParam: string): Promise<IDBDocument<T>|null>,
   find<T>(query: FilterQuery<T>, optionalQuery?: FindOneOptions): Promise<IDBDocument<T>[]>,
   update<T>(id: string, data: T): Promise<WriteOpResult>,
+  updateOne<T>(filter: FilterQuery<T>, data: T, options?: {upsert?: boolean}): Promise<UpdateWriteOpResult>,
   aggregate<T>(pipeline: Object[]): Promise<T[]>
 }
 
@@ -26,6 +27,7 @@ export const mongoService = (db: Db) => (col: string): IMongoService => {
     findOneById: (idParam: string) => collection.findOne({ _id: new ObjectId(idParam) }),
     find: (query, optionalQuery) => collection.find(query, optionalQuery).toArray(),
     update: (id, data) => collection.update({_id: new ObjectId(id)}, data),
+    updateOne: (filter, data, options) => collection.updateOne(filter, data, options), 
     aggregate: pipeline => collection.aggregate(pipeline).toArray()
   }
 };

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

@@ -1,4 +1,4 @@
-
+import { WriteOpResult, UpdateWriteOpResult } from 'mongodb';
 import { IMongoService } from '../mongo';
 import { ChainPController } from '../promise-all-middleware';
 import PlanDB, { WeeklyPlanner, CompletePlanDB, Weekday, Plan, CompactWeeklyPlanner } from './model';
@@ -110,15 +110,18 @@ const savePlan: Controller<void, PlanDB> = db => req => prevResult => {
   return validPlan(plan).then(db.insertOne)
 }
 
-const saveManyPlans: Controller<void, PlanDB[]> = db => req => prev => {
+const saveManyPlans: Controller<void, UpdateWriteOpResult[]> = db => req => prev => {
   const mbPlanner = req.body;
-  if (mbPlanner.filter) {
-    return Promise.all(mbPlanner.map(validPlan) as Plan[]).then(db.insertMany)
+  if (Array.isArray(mbPlanner)) {
+    return Promise.all(mbPlanner.map(validPlan)).then(plans => Promise.all(plans.map(plan => db.updateOne({
+      date: new Date(plan.date),
+      meal: plan.meal
+    }, plan, {upsert: true}))));
   } else {
     return Promise.reject('Invalid type: body content must be a Plan Array. Use /day/ endpoint instead')
   }
-
 }
+
 export {
   getWeekPlanner,
   completePlanner,