1
0
Fork 0
mirror of https://github.com/plankanban/planka.git synced 2025-07-18 20:59:44 +02:00
planka/server/api/controllers/boards/create.js
2022-12-17 03:48:06 +05:00

125 lines
2.8 KiB
JavaScript
Executable file

const util = require('util');
const { v4: uuid } = require('uuid');
const Errors = {
PROJECT_NOT_FOUND: {
projectNotFound: 'Project not found',
},
NO_IMPORT_FILE_WAS_UPLOADED: {
noImportFileWasUploaded: 'No import file was uploaded',
},
INVALID_IMPORT_FILE: {
invalidImportFile: 'Invalid import file',
},
};
module.exports = {
inputs: {
projectId: {
type: 'string',
regex: /^[0-9]+$/,
required: true,
},
type: {
type: 'string',
isIn: Object.values(Board.Types),
required: true,
},
position: {
type: 'number',
required: true,
},
name: {
type: 'string',
required: true,
},
importType: {
type: 'string',
isIn: Object.values(Board.ImportTypes),
},
requestId: {
type: 'string',
isNotEmptyString: true,
},
},
exits: {
projectNotFound: {
responseType: 'notFound',
},
noImportFileWasUploaded: {
responseType: 'unprocessableEntity',
},
uploadError: {
responseType: 'unprocessableEntity',
},
},
async fn(inputs) {
const { currentUser } = this.req;
const project = await Project.findOne(inputs.projectId);
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, ['type', 'position', 'name']);
let boardImport;
if (inputs.importType && Object.values(Board.ImportTypes).includes(inputs.importType)) {
const upload = util.promisify((options, callback) =>
this.req.file('importFile').upload(options, (error, files) => callback(error, files)),
);
let files;
try {
files = await upload({
saveAs: uuid(),
maxBytes: null,
});
} catch (error) {
return exits.uploadError(error.message); // TODO: add error
}
if (files.length === 0) {
throw Errors.NO_IMPORT_FILE_WAS_UPLOADED;
}
const file = _.last(files);
if (inputs.importType === Board.ImportTypes.TRELLO) {
boardImport = {
type: inputs.importType,
board: await sails.helpers.boards.processUploadedTrelloImportFile(file),
};
}
}
const { board, boardMembership } = await sails.helpers.boards.createOne(
values,
boardImport,
currentUser,
project,
inputs.requestId,
this.req,
);
if (this.req.isSocket) {
sails.sockets.join(this.req, `board:${board.id}`); // TODO: only when subscription needed
}
return {
item: board,
included: {
boardMemberships: [boardMembership],
},
};
},
};