| 
					
				 | 
			
			
				@@ -15,12 +15,15 @@ import { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				   OPERATOR_ASSIGNEE, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				   OPERATOR_BOARD, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				   OPERATOR_COMMENT, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  OPERATOR_CREATED_AT, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  OPERATOR_CREATOR, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				   OPERATOR_DUE, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				   OPERATOR_HAS, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				   OPERATOR_LABEL, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				   OPERATOR_LIMIT, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				   OPERATOR_LIST, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				   OPERATOR_MEMBER, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  OPERATOR_MODIFIED_AT, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				   OPERATOR_SORT, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				   OPERATOR_STATUS, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				   OPERATOR_SWIMLANE, 
			 | 
		
	
	
		
			
				| 
					
				 | 
			
			
				@@ -42,8 +45,8 @@ import { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				   PREDICATE_PUBLIC, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				   PREDICATE_START_AT, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				   PREDICATE_SYSTEM, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-} from '../../config/search-const'; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-import { QueryErrors, QueryParams, Query } from '../../config/query-classes'; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+} from '/config/search-const'; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+import { QueryErrors, QueryParams, Query } from '/config/query-classes'; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 const escapeForRegex = require('escape-string-regexp'); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
	
		
			
				| 
					
				 | 
			
			
				@@ -99,7 +102,7 @@ function buildSelector(queryParams) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				   let selector = {}; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				   // eslint-disable-next-line no-console 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-  // console.log('queryParams:', queryParams); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  console.log('queryParams:', queryParams); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				   if (queryParams.selector) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     selector = queryParams.selector; 
			 | 
		
	
	
		
			
				| 
					
				 | 
			
			
				@@ -163,7 +166,7 @@ function buildSelector(queryParams) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     if (queryParams.hasOperator(OPERATOR_BOARD)) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				       const queryBoards = []; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-      queryParams.hasOperator(OPERATOR_BOARD).forEach(query => { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+      queryParams.getPredicates(OPERATOR_BOARD).forEach(query => { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				         const boards = Boards.userSearch(userId, { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				           title: new RegExp(escapeForRegex(query), 'i'), 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				         }); 
			 | 
		
	
	
		
			
				| 
					
				 | 
			
			
				@@ -240,7 +243,7 @@ function buildSelector(queryParams) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				       } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-    [OPERATOR_DUE, 'createdAt', 'modifiedAt'].forEach(field => { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    [OPERATOR_DUE, OPERATOR_CREATED_AT, OPERATOR_MODIFIED_AT].forEach(field => { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				       if (queryParams.hasOperator(field)) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				         selector[field] = {}; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				         const predicate = queryParams.getPredicate(field); 
			 | 
		
	
	
		
			
				| 
					
				 | 
			
			
				@@ -251,57 +254,46 @@ function buildSelector(queryParams) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     const queryUsers = {}; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     queryUsers[OPERATOR_ASSIGNEE] = []; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     queryUsers[OPERATOR_MEMBER] = []; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    queryUsers[OPERATOR_CREATOR] = []; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     if (queryParams.hasOperator(OPERATOR_USER)) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+      const users = []; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				       queryParams.getPredicates(OPERATOR_USER).forEach(username => { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				         const user = Users.findOne({ username }); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				         if (user) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-          queryUsers[OPERATOR_MEMBER].push(user._id); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-          queryUsers[OPERATOR_ASSIGNEE].push(user._id); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+          users.push(user._id); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				         } else { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				           errors.addNotFound(OPERATOR_USER, username); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				         } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				       }); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+      if (users.length) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        selector.$and.push({ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+          $or: [{ members: { $in: users } }, { assignees: { $in: users } }], 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        }); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+      } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-    [OPERATOR_MEMBER, OPERATOR_ASSIGNEE].forEach(key => { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    [OPERATOR_MEMBER, OPERATOR_ASSIGNEE, OPERATOR_CREATOR].forEach(key => { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				       if (queryParams.hasOperator(key)) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-        queryParams.getPredicates(key).forEach(query => { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-          const users = Users.find({ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-            username: query, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-          }); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-          if (users.count()) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-            users.forEach(user => { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-              queryUsers[key].push(user._id); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-            }); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        const users = []; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        queryParams.getPredicates(key).forEach(username => { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+          const user = Users.findOne({ username }); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+          if (user) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            users.push(user._id); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				           } else { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-            errors.addNotFound(key, query); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            errors.addNotFound(key, username); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				           } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				         }); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        if (users.length) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+          selector[key] = { $in: users }; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				       } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     }); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-    if ( 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-      queryUsers[OPERATOR_MEMBER].length && 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-      queryUsers[OPERATOR_ASSIGNEE].length 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-    ) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-      selector.$and.push({ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-        $or: [ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-          { members: { $in: queryUsers[OPERATOR_MEMBER] } }, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-          { assignees: { $in: queryUsers[OPERATOR_ASSIGNEE] } }, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-        ], 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-      }); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-    } else if (queryUsers[OPERATOR_MEMBER].length) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-      selector.members = { $in: queryUsers[OPERATOR_MEMBER] }; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-    } else if (queryUsers[OPERATOR_ASSIGNEE].length) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-      selector.assignees = { $in: queryUsers[OPERATOR_ASSIGNEE] }; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-    } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				- 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     if (queryParams.hasOperator(OPERATOR_LABEL)) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+      const queryLabels = []; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				       queryParams.getPredicates(OPERATOR_LABEL).forEach(label => { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-        const queryLabels = []; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				- 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-        let boards = Boards.userSearch(userId, { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        let boards = Boards.userBoards(userId, null, { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				           labels: { $elemMatch: { color: label.toLowerCase() } }, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				         }); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
	
		
			
				| 
					
				 | 
			
			
				@@ -325,7 +317,7 @@ function buildSelector(queryParams) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				           const reLabel = new RegExp(escapeForRegex(label), 'i'); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				           // eslint-disable-next-line no-console 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				           // console.log('reLabel:', reLabel); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-          boards = Boards.userSearch(userId, { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+          boards = Boards.userBoards(userId, null, { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				             labels: { $elemMatch: { name: reLabel } }, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				           }); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
	
		
			
				| 
					
				 | 
			
			
				@@ -346,9 +338,12 @@ function buildSelector(queryParams) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				             errors.addNotFound(OPERATOR_LABEL, label); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				           } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				         } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				- 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-        selector.labelIds = { $in: _.uniq(queryLabels) }; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				       }); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+      if (queryLabels.length) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        // eslint-disable-next-line no-console 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        // console.log('queryLabels:', queryLabels); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        selector.labelIds = { $in: _.uniq(queryLabels) }; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+      } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     if (queryParams.hasOperator(OPERATOR_HAS)) { 
			 | 
		
	
	
		
			
				| 
					
				 | 
			
			
				@@ -443,9 +438,9 @@ function buildSelector(queryParams) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				   } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				   // eslint-disable-next-line no-console 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-  // console.log('selector:', selector); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  console.log('selector:', selector); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				   // eslint-disable-next-line no-console 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-  // console.log('selector.$and:', selector.$and); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  console.log('selector.$and:', selector.$and); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				   const query = new Query(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				   query.selector = selector; 
			 | 
		
	
	
		
			
				| 
					
				 | 
			
			
				@@ -488,6 +483,7 @@ function buildProjection(query) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				       modifiedAt: 1, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				       labelIds: 1, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				       customFields: 1, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+      userId: 1, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     }, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     sort: { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				       boardId: 1, 
			 | 
		
	
	
		
			
				| 
					
				 | 
			
			
				@@ -602,10 +598,8 @@ function findCards(sessionId, query) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				   // console.log('selector.$and:', query.selector.$and); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				   // eslint-disable-next-line no-console 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				   // console.log('projection:', projection); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-  let cards; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-  if (!query.hasErrors()) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-    cards = Cards.find(query.selector, query.projection); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-  } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  const cards = Cards.find(query.selector, query.projection); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				   // eslint-disable-next-line no-console 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				   // console.log('count:', cards.count()); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
	
		
			
				| 
					
				 | 
			
			
				@@ -658,6 +652,9 @@ function findCards(sessionId, query) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				       if (card.boardId) boards.push(card.boardId); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				       if (card.swimlaneId) swimlanes.push(card.swimlaneId); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				       if (card.listId) lists.push(card.listId); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+      if (card.userId) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        users.push(card.userId); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+      } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				       if (card.members) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				         card.members.forEach(userId => { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				           users.push(userId); 
			 |