mirror of
https://github.com/plankanban/planka.git
synced 2025-07-19 21:29:43 +02:00
209 lines
5.2 KiB
JavaScript
209 lines
5.2 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(project, board, { notificationService }) {
|
|
this.project = project;
|
|
this.board = board;
|
|
this.notificationService = notificationService;
|
|
|
|
this.adminUserIds = null;
|
|
this.projectManagerUserIds = null;
|
|
this.boardMemberships = null;
|
|
|
|
this.userIdsWithFullProjectVisibility = null;
|
|
this.boardMembershipsForWholeProject = null;
|
|
this.boardMemberUserIdsForWholeProject = null;
|
|
this.boardMemberUserIds = null;
|
|
|
|
this.projectRelatedUserIds = null;
|
|
this.boardRelatedUserIds = null;
|
|
this.notificationServiceRelatedUserIds = null;
|
|
}
|
|
|
|
replaceProject(project) {
|
|
if (this.project && project.id !== this.project.id) {
|
|
this.projectManagerUserIds = null;
|
|
|
|
this.boardMembershipsForWholeProject = null;
|
|
this.boardMemberUserIdsForWholeProject = null;
|
|
}
|
|
|
|
this.project = project;
|
|
|
|
this.userIdsWithFullProjectVisibility = null;
|
|
|
|
this.projectRelatedUserIds = null;
|
|
this.boardRelatedUserIds = null;
|
|
}
|
|
|
|
replaceBoard(board) {
|
|
if (this.board && board.id !== this.board.id) {
|
|
this.boardMemberships = null;
|
|
|
|
this.boardMemberUserIds = null;
|
|
|
|
this.boardRelatedUserIds = null;
|
|
}
|
|
|
|
this.board = board;
|
|
}
|
|
|
|
clone() {
|
|
return _.cloneDeep(this);
|
|
}
|
|
|
|
cloneForProject(project) {
|
|
const scoper = this.clone();
|
|
scoper.replaceProject(project);
|
|
|
|
return scoper;
|
|
}
|
|
|
|
cloneForBoard(board) {
|
|
const scoper = this.clone();
|
|
scoper.replaceBoard(board);
|
|
|
|
return scoper;
|
|
}
|
|
|
|
async getAdminUserIds() {
|
|
if (!this.adminUserIds) {
|
|
this.adminUserIds = await sails.helpers.users.getAllIds(User.Roles.ADMIN);
|
|
}
|
|
|
|
return this.adminUserIds;
|
|
}
|
|
|
|
async getProjectManagerUserIds() {
|
|
if (!this.projectManagerUserIds) {
|
|
this.projectManagerUserIds = await sails.helpers.projects.getManagerUserIds(this.project.id);
|
|
}
|
|
|
|
return this.projectManagerUserIds;
|
|
}
|
|
|
|
async getBoardMemberships() {
|
|
if (!this.boardMemberships) {
|
|
this.boardMemberships = await BoardMembership.qm.getByBoardId(this.board.id);
|
|
}
|
|
|
|
return this.boardMemberships;
|
|
}
|
|
|
|
async getUserIdsWithFullProjectVisibility() {
|
|
if (!this.userIdsWithFullProjectVisibility) {
|
|
const projectManagerUserIds = await this.getProjectManagerUserIds();
|
|
|
|
if (this.project.ownerProjectManagerId) {
|
|
this.userIdsWithFullProjectVisibility = projectManagerUserIds;
|
|
} else {
|
|
const adminUserIds = await this.getAdminUserIds();
|
|
|
|
this.userIdsWithFullProjectVisibility = _.union(adminUserIds, projectManagerUserIds);
|
|
}
|
|
}
|
|
|
|
return this.userIdsWithFullProjectVisibility;
|
|
}
|
|
|
|
async getBoardMembershipsForWholeProject() {
|
|
if (!this.boardMembershipsForWholeProject) {
|
|
this.boardMembershipsForWholeProject = await BoardMembership.qm.getByProjectId(
|
|
this.project.id,
|
|
);
|
|
}
|
|
|
|
return this.boardMembershipsForWholeProject;
|
|
}
|
|
|
|
async getBoardMemberUserIdsForWholeProject() {
|
|
if (!this.boardMemberUserIdsForWholeProject) {
|
|
const boardMembershipsForWholeProject = await this.getBoardMembershipsForWholeProject();
|
|
|
|
this.boardMemberUserIdsForWholeProject = sails.helpers.utils.mapRecords(
|
|
boardMembershipsForWholeProject,
|
|
'userId',
|
|
true,
|
|
);
|
|
}
|
|
|
|
return this.boardMemberUserIdsForWholeProject;
|
|
}
|
|
|
|
async getBoardMemberUserIds() {
|
|
if (!this.boardMemberUserIds) {
|
|
const boardMemberships = await this.getBoardMemberships();
|
|
|
|
this.boardMemberUserIds = sails.helpers.utils.mapRecords(boardMemberships, 'userId');
|
|
}
|
|
|
|
return this.boardMemberUserIds;
|
|
}
|
|
|
|
async getProjectRelatedUserIds() {
|
|
if (!this.projectRelatedUserIds) {
|
|
const userIdsWithFullProjectVisibility = await this.getUserIdsWithFullProjectVisibility();
|
|
const boardMemberUserIdsForWholeProject = await this.getBoardMemberUserIdsForWholeProject();
|
|
|
|
this.projectRelatedUserIds = _.union(
|
|
userIdsWithFullProjectVisibility,
|
|
boardMemberUserIdsForWholeProject,
|
|
);
|
|
}
|
|
|
|
return this.projectRelatedUserIds;
|
|
}
|
|
|
|
async getBoardRelatedUserIds() {
|
|
if (!this.boardRelatedUserIds) {
|
|
const userIdsWithFullProjectVisibility = await this.getUserIdsWithFullProjectVisibility();
|
|
const boardMemberUserIds = await this.getBoardMemberUserIds();
|
|
|
|
this.boardRelatedUserIds = _.union(userIdsWithFullProjectVisibility, boardMemberUserIds);
|
|
}
|
|
|
|
return this.boardRelatedUserIds;
|
|
}
|
|
|
|
async getNotificationServiceRelatedUserIds() {
|
|
if (!this.notificationServiceRelatedUserIds) {
|
|
this.notificationServiceRelatedUserIds = await this.getProjectManagerUserIds();
|
|
}
|
|
|
|
return this.notificationServiceRelatedUserIds;
|
|
}
|
|
}
|
|
|
|
module.exports = {
|
|
sync: true,
|
|
|
|
inputs: {
|
|
record: {
|
|
type: 'ref',
|
|
required: true,
|
|
},
|
|
board: {
|
|
type: 'ref',
|
|
},
|
|
notificationService: {
|
|
type: 'ref',
|
|
},
|
|
},
|
|
|
|
exits: {
|
|
boardMustBePresent: {},
|
|
},
|
|
|
|
fn(inputs) {
|
|
if (inputs.notificationService && !inputs.board) {
|
|
throw 'boardMustBePresent';
|
|
}
|
|
|
|
return new Scoper(inputs.record, inputs.board, {
|
|
notificationService: inputs.notificationService,
|
|
});
|
|
},
|
|
};
|