1
0
Fork 0
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:
Maksim Eltyshev 2021-06-24 01:05:22 +05:00
parent 7956503a46
commit fe91b5241e
478 changed files with 21226 additions and 19495 deletions

View file

@ -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],
},
});
};
},
};

View file

@ -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,
});
};
},
};

View file

@ -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,
},
});
};
},
};

View 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,
},
};
},
};

View file

@ -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,

View file

@ -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,
});
};
},
};