mirror of
https://github.com/plankanban/planka.git
synced 2025-07-18 20:59:44 +02:00
Project managers, board members, auto-update after reconnection, refactoring
This commit is contained in:
parent
7956503a46
commit
fe91b5241e
478 changed files with 21226 additions and 19495 deletions
|
@ -6,25 +6,22 @@ module.exports = {
|
|||
},
|
||||
},
|
||||
|
||||
async fn(inputs, exits) {
|
||||
async fn(inputs) {
|
||||
const { currentUser } = this.req;
|
||||
|
||||
const values = _.pick(inputs, ['name']);
|
||||
|
||||
const { project, projectMembership } = await sails.helpers.createProject(
|
||||
currentUser,
|
||||
const { project, projectManager } = await sails.helpers.projects.createOne(
|
||||
values,
|
||||
currentUser,
|
||||
this.req,
|
||||
true,
|
||||
);
|
||||
|
||||
return exits.success({
|
||||
return {
|
||||
item: project,
|
||||
included: {
|
||||
users: [currentUser],
|
||||
projectMemberships: [projectMembership],
|
||||
boards: [],
|
||||
projectManagers: [projectManager],
|
||||
},
|
||||
});
|
||||
};
|
||||
},
|
||||
};
|
||||
|
|
|
@ -19,21 +19,29 @@ module.exports = {
|
|||
},
|
||||
},
|
||||
|
||||
async fn(inputs, exits) {
|
||||
async fn(inputs) {
|
||||
const { currentUser } = this.req;
|
||||
|
||||
let project = await Project.findOne(inputs.id);
|
||||
|
||||
if (!project) {
|
||||
throw Errors.PROJECT_NOT_FOUND;
|
||||
}
|
||||
|
||||
project = await sails.helpers.deleteProject(project, this.req);
|
||||
const isProjectManager = await sails.helpers.users.isProjectManager(currentUser.id, project.id);
|
||||
|
||||
if (!isProjectManager) {
|
||||
throw Errors.PROJECT_NOT_FOUND; // Forbidden
|
||||
}
|
||||
|
||||
project = await sails.helpers.projects.deleteOne(project, this.req);
|
||||
|
||||
if (!project) {
|
||||
throw Errors.PROJECT_NOT_FOUND;
|
||||
}
|
||||
|
||||
return exits.success({
|
||||
return {
|
||||
item: project,
|
||||
});
|
||||
};
|
||||
},
|
||||
};
|
||||
|
|
|
@ -1,25 +1,44 @@
|
|||
module.exports = {
|
||||
async fn(inputs, exits) {
|
||||
async fn() {
|
||||
const { currentUser } = this.req;
|
||||
|
||||
const projectIds = await sails.helpers.getMembershipProjectIdsForUser(currentUser.id);
|
||||
const projects = await sails.helpers.getProjects(projectIds);
|
||||
const managerProjectIds = await sails.helpers.users.getManagerProjectIds(currentUser.id);
|
||||
|
||||
const { userIds, projectMemberships } = await sails.helpers.getMembershipUserIdsForProject(
|
||||
projectIds,
|
||||
const boardMemberships = await sails.helpers.users.getBoardMemberships(currentUser.id);
|
||||
const membershipBoardIds = await sails.helpers.utils.mapRecords(boardMemberships, 'boardId');
|
||||
|
||||
const membershipBoards = await sails.helpers.boards.getMany({
|
||||
id: membershipBoardIds,
|
||||
projectId: {
|
||||
'!=': managerProjectIds,
|
||||
},
|
||||
});
|
||||
|
||||
const membershipProjectIds = sails.helpers.utils.mapRecords(
|
||||
membershipBoards,
|
||||
'projectId',
|
||||
true,
|
||||
);
|
||||
|
||||
const users = await sails.helpers.getUsers(userIds);
|
||||
const boards = await sails.helpers.getBoardsForProject(projectIds);
|
||||
const projectIds = [...managerProjectIds, ...membershipProjectIds];
|
||||
const projects = await sails.helpers.projects.getMany(projectIds);
|
||||
|
||||
return exits.success({
|
||||
const projectManagers = await sails.helpers.projects.getProjectManagers(projectIds);
|
||||
|
||||
const userIds = sails.helpers.utils.mapRecords(projectManagers, 'userId', true);
|
||||
const users = await sails.helpers.users.getMany(userIds);
|
||||
|
||||
const managerBoards = await sails.helpers.projects.getBoards(managerProjectIds);
|
||||
const boards = [...managerBoards, ...membershipBoards];
|
||||
|
||||
return {
|
||||
items: projects,
|
||||
included: {
|
||||
users,
|
||||
projectMemberships,
|
||||
projectManagers,
|
||||
boards,
|
||||
boardMemberships,
|
||||
},
|
||||
});
|
||||
};
|
||||
},
|
||||
};
|
||||
|
|
65
server/api/controllers/projects/show.js
Normal file
65
server/api/controllers/projects/show.js
Normal file
|
@ -0,0 +1,65 @@
|
|||
const Errors = {
|
||||
PROJECT_NOT_FOUND: {
|
||||
projectNotFound: 'Project not found',
|
||||
},
|
||||
};
|
||||
|
||||
module.exports = {
|
||||
inputs: {
|
||||
id: {
|
||||
type: 'string',
|
||||
regex: /^[0-9]+$/,
|
||||
required: true,
|
||||
},
|
||||
},
|
||||
|
||||
exits: {
|
||||
projectNotFound: {
|
||||
responseType: 'notFound',
|
||||
},
|
||||
},
|
||||
|
||||
async fn(inputs) {
|
||||
const { currentUser } = this.req;
|
||||
|
||||
const project = await Project.findOne(inputs.id);
|
||||
|
||||
if (!project) {
|
||||
throw Errors.PROJECT_NOT_FOUND;
|
||||
}
|
||||
|
||||
let boards = await sails.helpers.projects.getBoards(project.id);
|
||||
let boardIds = sails.helpers.utils.mapRecords(boards);
|
||||
|
||||
const boardMemberships = await sails.helpers.boardMemberships.getMany({
|
||||
boardId: boardIds,
|
||||
userId: currentUser.id,
|
||||
});
|
||||
|
||||
const isProjectManager = await sails.helpers.users.isProjectManager(currentUser.id, project.id);
|
||||
|
||||
if (!isProjectManager) {
|
||||
if (boardMemberships.length === 0) {
|
||||
throw Errors.PROJECT_NOT_FOUND; // Forbidden
|
||||
}
|
||||
|
||||
boardIds = sails.helpers.utils.mapRecords(boardMemberships, 'boardId');
|
||||
boards = boards.filter((board) => boardIds.includes(board.id));
|
||||
}
|
||||
|
||||
const projectManagers = await sails.helpers.projects.getProjectManagers(project.id);
|
||||
|
||||
const userIds = sails.helpers.utils.mapRecords(projectManagers, 'userId');
|
||||
const users = await sails.helpers.users.getMany(userIds);
|
||||
|
||||
return {
|
||||
item: project,
|
||||
included: {
|
||||
users,
|
||||
projectManagers,
|
||||
boards,
|
||||
boardMemberships,
|
||||
},
|
||||
};
|
||||
},
|
||||
};
|
|
@ -23,15 +23,23 @@ module.exports = {
|
|||
},
|
||||
|
||||
async fn(inputs, exits) {
|
||||
const { currentUser } = this.req;
|
||||
|
||||
let project = await Project.findOne(inputs.id);
|
||||
|
||||
if (!project) {
|
||||
throw Errors.PROJECT_NOT_FOUND;
|
||||
}
|
||||
|
||||
const isProjectManager = await sails.helpers.users.isProjectManager(currentUser.id, project.id);
|
||||
|
||||
if (!isProjectManager) {
|
||||
throw Errors.PROJECT_NOT_FOUND; // Forbidden
|
||||
}
|
||||
|
||||
this.req
|
||||
.file('file')
|
||||
.upload(sails.helpers.createProjectBackgroundImageReceiver(), async (error, files) => {
|
||||
.upload(sails.helpers.utils.createProjectBackgroundImageReceiver(), async (error, files) => {
|
||||
if (error) {
|
||||
return exits.uploadError(error.message);
|
||||
}
|
||||
|
@ -40,7 +48,7 @@ module.exports = {
|
|||
return exits.uploadError('No file was uploaded');
|
||||
}
|
||||
|
||||
project = await sails.helpers.updateProject(
|
||||
project = await sails.helpers.projects.updateOne(
|
||||
project,
|
||||
{
|
||||
backgroundImageDirname: files[0].extra.dirname,
|
||||
|
|
|
@ -26,19 +26,19 @@ module.exports = {
|
|||
return false;
|
||||
}
|
||||
|
||||
if (!Project.BACKGROUND_TYPES.includes(value.type)) {
|
||||
if (!Object.values(Project.BackgroundTypes).includes(value.type)) {
|
||||
return false;
|
||||
}
|
||||
|
||||
if (
|
||||
value.type === 'gradient' &&
|
||||
value.type === Project.BackgroundTypes.GRADIENT &&
|
||||
_.size(value) === 2 &&
|
||||
Project.BACKGROUND_GRADIENTS.includes(value.name)
|
||||
) {
|
||||
return true;
|
||||
}
|
||||
|
||||
if (value.type === 'image' && _.size(value) === 1) {
|
||||
if (value.type === Project.BackgroundTypes.IMAGE && _.size(value) === 1) {
|
||||
return true;
|
||||
}
|
||||
|
||||
|
@ -57,22 +57,30 @@ module.exports = {
|
|||
},
|
||||
},
|
||||
|
||||
async fn(inputs, exits) {
|
||||
async fn(inputs) {
|
||||
const { currentUser } = this.req;
|
||||
|
||||
let project = await Project.findOne(inputs.id);
|
||||
|
||||
if (!project) {
|
||||
throw Errors.PROJECT_NOT_FOUND;
|
||||
}
|
||||
|
||||
const isProjectManager = await sails.helpers.users.isProjectManager(currentUser.id, project.id);
|
||||
|
||||
if (!isProjectManager) {
|
||||
throw Errors.PROJECT_NOT_FOUND; // Forbidden
|
||||
}
|
||||
|
||||
const values = _.pick(inputs, ['name', 'background', 'backgroundImage']);
|
||||
project = await sails.helpers.updateProject(project, values, this.req);
|
||||
project = await sails.helpers.projects.updateOne(project, values, this.req);
|
||||
|
||||
if (!project) {
|
||||
throw Errors.PROJECT_NOT_FOUND;
|
||||
}
|
||||
|
||||
return exits.success({
|
||||
return {
|
||||
item: project,
|
||||
});
|
||||
};
|
||||
},
|
||||
};
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue