diff --git a/client/src/models/User.js b/client/src/models/User.js index 4567d460..15572968 100755 --- a/client/src/models/User.js +++ b/client/src/models/User.js @@ -569,10 +569,12 @@ export default class extends BaseModel { return this.notificationServices.orderBy(['id.length', 'id']); } + // A manager or membership row can outlive the project or board it points to, + // and a single dangling reference must not take the whole view down getManagerProjectsModelArray() { return this.getProjectManagersQuerySet() .toModelArray() - .map(({ project: projectModel }) => projectModel); + .flatMap(({ project: projectModel }) => projectModel || []); } getMembershipProjectsModelArray() { @@ -580,7 +582,9 @@ export default class extends BaseModel { return this.getBoardMembershipsQuerySet() .toModelArray() - .flatMap(({ board: { project: projectModel } }) => { + .flatMap(({ board: boardModel }) => { + const projectModel = boardModel && boardModel.project; + if (!projectModel || projectIds.includes(projectModel.id)) { return []; } diff --git a/server/api/controllers/projects/index.js b/server/api/controllers/projects/index.js index 140fbea6..0b757841 100755 --- a/server/api/controllers/projects/index.js +++ b/server/api/controllers/projects/index.js @@ -124,17 +124,25 @@ module.exports = { true, ); - const projectIds = [...managerProjectIds, ...membershipProjectIds]; - const projects = await Project.qm.getByIds(projectIds); + const projects = await Project.qm.getByIds([...managerProjectIds, ...membershipProjectIds]); if (sharedProjectIds) { - projectIds.push(...sharedProjectIds); projects.push(...sharedProjects); } + // A manager row can outlive its project, so the ids for everything included + // below come from the projects that actually exist, never from the memberships + const projectIds = sails.helpers.utils.mapRecords(projects); + const fullyVisibleBoards = await Board.qm.getByProjectIds(fullyVisibleProjectIds); const boards = [...fullyVisibleBoards, ...membershipBoards]; + const boardIdsSet = new Set(sails.helpers.utils.mapRecords(boards)); + + const availableBoardMemberships = boardMemberships.filter(({ boardId }) => + boardIdsSet.has(boardId), + ); + const projectFavorites = await ProjectFavorite.qm.getByProjectIdsAndUserId( projectIds, currentUser.id, @@ -183,7 +191,7 @@ module.exports = { projectManagers, baseCustomFieldGroups, boards, - boardMemberships, + boardMemberships: availableBoardMemberships, customFields, notificationServices, users: sails.helpers.users.presentMany(users, currentUser),