mirror of
https://github.com/plankanban/planka.git
synced 2025-07-21 14:19:44 +02:00
parent
ad7fb51cfa
commit
2ee1166747
1557 changed files with 76832 additions and 47042 deletions
209
server/api/helpers/projects/make-scoper.js
Normal file
209
server/api/helpers/projects/make-scoper.js
Normal file
|
@ -0,0 +1,209 @@
|
|||
/*!
|
||||
* 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,
|
||||
});
|
||||
},
|
||||
};
|
Loading…
Add table
Add a link
Reference in a new issue