From bbcb236a46788d37ed29ffc080b1141502ea03d8 Mon Sep 17 00:00:00 2001 From: "John R. Supplee" Date: Mon, 11 Jan 2021 18:18:26 +0200 Subject: [PATCH] Add methods to models for archived entities --- client/components/main/globalSearch.js | 44 +++++++++++++++ models/boards.js | 20 +++++++ models/lists.js | 10 ++++ models/swimlanes.js | 10 ++++ server/publications/cards.js | 75 +++++++++++--------------- 5 files changed, 115 insertions(+), 44 deletions(-) diff --git a/client/components/main/globalSearch.js b/client/components/main/globalSearch.js index b8ac5fdd0..d2960afef 100644 --- a/client/components/main/globalSearch.js +++ b/client/components/main/globalSearch.js @@ -88,6 +88,7 @@ BlazeComponent.extendComponent({ s: 'swimlanes', list: 'lists', l: 'lists', + is: 'is', }; const selector = { boards: [], @@ -95,6 +96,7 @@ BlazeComponent.extendComponent({ lists: [], users: [], labels: [], + is: [], }; let text = ''; while (query) { @@ -150,6 +152,48 @@ BlazeComponent.extendComponent({ // eslint-disable-next-line no-console console.log('text:', text); + if (selector.boards.length) { + selector.boardsSelector = { + archived: false, + title: { $in: [] }, + }; + selector.boards.forEach(term => { + selector.boardsSelector.title.$in.push(term); + }); + } + + if (selector.lists.length) { + selector.listsSelector = { + archived: false, + title: { $in: [] }, + }; + selector.lists.forEach(term => { + selector.listsSelector.title.$in.push(term); + }); + } + + if (selector.swimlanes.length) { + selector.swimlanesSelector = { + archived: false, + title: { $in: [] }, + }; + selector.swimlanes.forEach(term => { + selector.swimlanesSelector.title.$in.push(term); + }); + } + + if (selector.labels.length) { + selector.labelsSelector = { + archived: false, + title: { $in: [] }, + }; + selector.labels.forEach(term => { + selector.labelsSelector.title.$in.push(term); + }); + } + + selector.text = text; + this.autorun(() => { const handle = subManager.subscribe('globalSearch', selector); Tracker.nonreactive(() => { diff --git a/models/boards.js b/models/boards.js index a8b3967c9..8a286dc8e 100644 --- a/models/boards.js +++ b/models/boards.js @@ -1208,6 +1208,26 @@ function boardRemover(userId, doc) { ); } +Boards.userBoards = (userId, includeArchived = false, selector = {}) => { + if (!includeArchived) { + selector = { + archived: false, + }; + } + selector.$or = [ + { permission: 'public' }, + { members: { $elemMatch: { userId, isActive: true } } }, + ]; + + return Boards.find(selector); +}; + +Boards.userBoardIds = (userId, includeArchived = false, selector = {}) => { + return Boards.userBoards(userId, includeArchived, selector).map(board => { + return board._id; + }); +}; + if (Meteor.isServer) { Boards.allow({ insert: Meteor.userId, diff --git a/models/lists.js b/models/lists.js index 0fc2a24bc..dcfd4294e 100644 --- a/models/lists.js +++ b/models/lists.js @@ -328,6 +328,16 @@ Lists.mutations({ }, }); +Lists.archivedLists = () => { + return Lists.find({ archived: true }); +}; + +Lists.archivedListIds = () => { + return Lists.archivedLists().map(list => { + return list._id; + }); +}; + Meteor.methods({ applyWipLimit(listId, limit) { check(listId, String); diff --git a/models/swimlanes.js b/models/swimlanes.js index 2e200454a..0994e9044 100644 --- a/models/swimlanes.js +++ b/models/swimlanes.js @@ -283,6 +283,16 @@ Swimlanes.mutations({ }, }); +Swimlanes.archivedSwimlanes = () => { + return Swimlanes.find({ archived: true }); +}; + +Swimlanes.archivedSwimlaneIds = () => { + return Swimlanes.archivedSwimlanes().map(swim => { + return swim._id; + }); +}; + Swimlanes.hookOptions.after.update = { fetchPrevious: false }; if (Meteor.isServer) { diff --git a/server/publications/cards.js b/server/publications/cards.js index 772da9a62..f29369bcc 100644 --- a/server/publications/cards.js +++ b/server/publications/cards.js @@ -179,56 +179,26 @@ Meteor.publish('globalSearch', function(queryParams) { check(queryParams, Object); // eslint-disable-next-line no-console - console.log('selector:', queryParams); + console.log('queryParams:', queryParams); const user = Users.findOne(this.userId); - const archivedBoards = []; - Boards.find({ archived: true }).forEach(board => { - archivedBoards.push(board._id); - }); + // const archivedSwimlanes = Swimlanes.archivedSwimlaneIds(); - const archivedSwimlanes = []; - Swimlanes.find({ archived: true }).forEach(swimlane => { - archivedSwimlanes.push(swimlane._id); - }); - - const archivedLists = []; - Lists.find({ archived: true }).forEach(list => { - archivedLists.push(list._id); - }); + // const permiitedBoards = Boards.userBoardIds(user._id); - const permiitedBoards = []; let selector = { archived: false, }; - // if user is not an admin allow her to see cards only from boards where - // she is a member - if (!user.isAdmin) { - selector.$or = [ - { permission: 'public' }, - { members: { $elemMatch: { userId: user._id, isActive: true } } }, - ]; - } - if (queryParams.boards.length) { - selector.title = { $in: [] }; - queryParams.boards.forEach(term => { - selector.title.$in.push(term); - }); - } - Boards.find(selector).forEach(board => { - permiitedBoards.push(board._id); - }); - const searchLists = []; - if (queryParams.lists.length) { - selector = { - archived: false, - title: { $in: [] }, - }; - queryParams.lists.forEach(term => { - selector.title.$in.push(term); - }); + // eslint-disable-next-line no-console + // console.log('listsSelector:', queryParams.keys()); + if ('listsSelector' in queryParams) { + // eslint-disable-next-line no-console + // console.log('listsSelector:', queryParams.listsSelector.keys()); + for (const key in queryParams.listsSelector) { + selector[key] = queryParams.listsSelector[key]; + } // eslint-disable-next-line no-console console.log('search list selector:', selector); @@ -239,17 +209,34 @@ Meteor.publish('globalSearch', function(queryParams) { console.log('search lists:', searchLists); } + const searchSwimlanes = []; + if ('swimlanesSelector' in queryParams) { + for (const key in queryParams.swimlanesSelector) { + selector[key] = queryParams.swimlanesSelector[key]; + } + + Lists.find(selector).forEach(swim => { + searchSwimlanes.push(swim._id); + }); + } + selector = { archived: false, - boardId: { $nin: archivedBoards, $in: permiitedBoards }, - swimlaneId: { $nin: archivedSwimlanes }, - listId: { $nin: archivedLists }, + boardId: { $in: Boards.userBoardIds(user._id) }, + swimlaneId: { $nin: Swimlanes.archivedSwimlaneIds() }, + listId: { $nin: Lists.archivedListIds() }, }; + if (searchSwimlanes.length) { + selector.swimlaneId.$in = searchSwimlanes; + } + if (searchLists.length) { selector.listId.$in = searchLists; } + // eslint-disable-next-line no-console + console.log('selector:', selector); const cards = Cards.find(selector, { fields: { _id: 1,