瀏覽代碼

Fix problem with dates in selector being unpickled as a String

John Supplee 4 年之前
父節點
當前提交
a63a61e7fc
共有 3 個文件被更改,包括 59 次插入22 次删除
  1. 2 2
      client/components/main/globalSearch.js
  2. 53 16
      models/usersessiondata.js
  3. 4 4
      server/publications/cards.js

+ 2 - 2
client/components/main/globalSearch.js

@@ -363,13 +363,13 @@ BlazeComponent.extendComponent({
                 if (date) {
                   value = {
                     operator: '$lt',
-                    value: date.format(),
+                    value: date.format('YYYY-MM-DD'),
                   };
                 }
               } else if (operator === 'dueAt' && value === 'overdue') {
                 value = {
                   operator: '$lt',
-                  value: moment(moment().format('YYYY-MM-DD')).format(),
+                  value: moment().format('YYYY-MM-DD'),
                 };
               } else {
                 this.parsingErrors.push({

+ 53 - 16
models/usersessiondata.js

@@ -143,36 +143,73 @@ SessionData.helpers({
 
 SessionData.unpickle = pickle => {
   return JSON.parse(pickle, (key, value) => {
-    if (value === null) {
-      return null;
-    } else if (typeof value === 'object') {
-      // eslint-disable-next-line no-prototype-builtins
-      if (value.hasOwnProperty('$$class')) {
-        if (value.$$class === 'RegExp') {
+    return unpickleValue(value);
+  });
+};
+
+function unpickleValue(value) {
+  if (value === null) {
+    return null;
+  } else if (typeof value === 'object') {
+    // eslint-disable-next-line no-prototype-builtins
+    if (value.hasOwnProperty('$$class')) {
+      switch (value.$$class) {
+        case 'RegExp':
           return new RegExp(value.source, value.flags);
-        }
+        case 'Date':
+          return new Date(value.stringValue);
+        case 'Object':
+          return unpickleObject(value);
       }
     }
-    return value;
+  }
+  return value;
+}
+
+function unpickleObject(obj) {
+  const newObject = {};
+  Object.entries(obj).forEach(([key, value]) => {
+    newObject[key] = unpickleValue(value);
   });
-};
+  return newObject;
+}
 
 SessionData.pickle = value => {
   return JSON.stringify(value, (key, value) => {
-    if (value === null) {
-      return null;
-    } else if (typeof value === 'object') {
-      if (value.constructor.name === 'RegExp') {
+    return pickleValue(value);
+  });
+};
+
+function pickleValue(value) {
+  if (value === null) {
+    return null;
+  } else if (typeof value === 'object') {
+    switch(value.constructor.name) {
+      case 'RegExp':
         return {
           $$class: 'RegExp',
           source: value.source,
           flags: value.flags,
         };
-      }
+      case 'Date':
+        return {
+          $$class: 'Date',
+          stringValue: String(value),
+        };
+      case 'Object':
+        return pickleObject(value);
     }
-    return value;
+  }
+  return value;
+}
+
+function pickleObject(obj) {
+  const newObject = {};
+  Object.entries(obj).forEach(([key, value]) => {
+    newObject[key] = pickleValue(value);
   });
-};
+  return newObject;
+}
 
 if (!Meteor.isServer) {
   SessionData.getSessionId = () => {

+ 4 - 4
server/publications/cards.js

@@ -751,19 +751,19 @@ Meteor.publish('previousPage', function(sessionId) {
 });
 
 function findCards(sessionId, selector, projection, errors = null) {
-  // check(selector, Object);
-  // check(projection, Object);
   const userId = Meteor.userId();
 
   console.log('selector:', selector);
   console.log('projection:', projection);
-
+  // if (selector.dueAt) {
+  //   console.log('dueAt:', typeof selector.dueAt.$lt, selector.dueAt.$lt.constructor.name, selector.dueAt.$lt);
+  // }
   let cards;
   if (!errors || !errors.hasErrors()) {
     cards = Cards.find(selector, projection);
   }
-
   console.log('count:', cards.count());
+
   const update = {
     $set: {
       totalHits: 0,