mirror of
https://github.com/plankanban/planka.git
synced 2025-07-19 13:19:44 +02:00
149 lines
4.1 KiB
JavaScript
149 lines
4.1 KiB
JavaScript
/*!
|
|
* Copyright (c) 2024 PLANKA Software GmbH
|
|
* Licensed under the Fair Use License: https://github.com/plankanban/planka/blob/master/LICENSE.md
|
|
*/
|
|
|
|
class Scoper {
|
|
constructor(user) {
|
|
this.user = user;
|
|
|
|
this.projectManagers = null;
|
|
|
|
this.separatedUserIds = null;
|
|
this.userRelatedProjectManagerAndBoardMemberUserIds = null;
|
|
|
|
this.privateUserRelatedUserIds = null;
|
|
this.publicUserRelatedUserIds = null;
|
|
}
|
|
|
|
async getProjectManagers() {
|
|
if (!this.projectManagers) {
|
|
this.projectManagers = await ProjectManager.qm.getByUserId(this.user.id);
|
|
}
|
|
|
|
return this.projectManagers;
|
|
}
|
|
|
|
async getSeparatedUserIds() {
|
|
if (!this.separatedUserIds) {
|
|
const users = await User.qm.getAll({
|
|
roleOrRoles: [User.Roles.ADMIN, User.Roles.PROJECT_OWNER],
|
|
});
|
|
|
|
const adminUserIds = [];
|
|
const projectOwnerUserIds = [];
|
|
|
|
users.forEach((user) => {
|
|
if (user.role === User.Roles.ADMIN) {
|
|
adminUserIds.push(user.id);
|
|
} else {
|
|
projectOwnerUserIds.push(user.id);
|
|
}
|
|
});
|
|
|
|
this.separatedUserIds = {
|
|
adminUserIds,
|
|
projectOwnerUserIds,
|
|
};
|
|
}
|
|
|
|
return this.separatedUserIds;
|
|
}
|
|
|
|
async getUserRelatedProjectManagerAndBoardMemberUserIds() {
|
|
if (!this.userRelatedProjectManagerAndBoardMemberUserIds) {
|
|
const projectManagers = await this.getProjectManagers();
|
|
const projectIds = sails.helpers.utils.mapRecords(projectManagers, 'projectId');
|
|
|
|
const relatedProjectManagers = await ProjectManager.qm.getByProjectIds(projectIds, {
|
|
exceptUserIdOrIds: this.user.id,
|
|
});
|
|
|
|
const relatedProjectManagerUserIds = sails.helpers.utils.mapRecords(
|
|
relatedProjectManagers,
|
|
'userId',
|
|
);
|
|
|
|
const relatedProjectBoardMemberships = await BoardMembership.qm.getByProjectIds(projectIds);
|
|
|
|
const relatedProjectBoardMemberUserIds = sails.helpers.utils.mapRecords(
|
|
relatedProjectBoardMemberships,
|
|
'userId',
|
|
);
|
|
|
|
const boardMemberships = await BoardMembership.qm.getByUserId(this.user.id, {
|
|
exceptProjectIdOrIds: projectIds,
|
|
});
|
|
|
|
const boardIds = sails.helpers.utils.mapRecords(boardMemberships, 'boardId');
|
|
|
|
const relatedBoardMemberships = await BoardMembership.qm.getByBoardIds(boardIds, {
|
|
exceptUserIdOrIds: this.user.id,
|
|
});
|
|
|
|
const relatedBoardMemberUserIds = sails.helpers.utils.mapRecords(
|
|
relatedBoardMemberships,
|
|
'userId',
|
|
);
|
|
|
|
this.userRelatedProjectManagerAndBoardMemberUserIds = _.union(
|
|
relatedProjectManagerUserIds,
|
|
relatedProjectBoardMemberUserIds,
|
|
relatedBoardMemberUserIds,
|
|
);
|
|
}
|
|
|
|
return this.userRelatedProjectManagerAndBoardMemberUserIds;
|
|
}
|
|
|
|
async getPrivateUserRelatedUserIds() {
|
|
if (!this.privateUserRelatedUserIds) {
|
|
const { adminUserIds } = await this.getSeparatedUserIds();
|
|
|
|
this.privateUserRelatedUserIds = _.union([this.user.id], adminUserIds);
|
|
}
|
|
|
|
return this.privateUserRelatedUserIds;
|
|
}
|
|
|
|
async getPublicUserRelatedUserIds(skipRelatedProjectManagerAndBoardMemberUserIds = false) {
|
|
if (!this.publicUserRelatedUserIds) {
|
|
const privateUserRelatedUserIds = await this.getPrivateUserRelatedUserIds();
|
|
const privateUserRelatedUserIdsSet = new Set(privateUserRelatedUserIds);
|
|
|
|
const { projectOwnerUserIds } = await this.getSeparatedUserIds();
|
|
|
|
let userRelatedProjectManagerAndBoardMemberUserIds;
|
|
if (!skipRelatedProjectManagerAndBoardMemberUserIds) {
|
|
userRelatedProjectManagerAndBoardMemberUserIds =
|
|
await this.getUserRelatedProjectManagerAndBoardMemberUserIds();
|
|
}
|
|
|
|
const externalPublicUserRelatedUserIds = _.union(
|
|
projectOwnerUserIds,
|
|
userRelatedProjectManagerAndBoardMemberUserIds,
|
|
);
|
|
|
|
this.publicUserRelatedUserIds = externalPublicUserRelatedUserIds.filter(
|
|
(userId) => !privateUserRelatedUserIdsSet.has(userId),
|
|
);
|
|
}
|
|
|
|
return this.publicUserRelatedUserIds;
|
|
}
|
|
}
|
|
|
|
module.exports = {
|
|
sync: true,
|
|
|
|
inputs: {
|
|
record: {
|
|
type: 'ref',
|
|
required: true,
|
|
},
|
|
},
|
|
|
|
fn(inputs) {
|
|
return new Scoper(inputs.record);
|
|
},
|
|
};
|