97 lines
2.4 KiB
JavaScript
97 lines
2.4 KiB
JavaScript
import Project from '../../models/project';
|
|
import { toModel, FileValidationError, ProjectValidationError } from '../../domain-objects/Project';
|
|
|
|
export default function createProject(req, res) {
|
|
let projectValues = {
|
|
user: req.user._id
|
|
};
|
|
|
|
projectValues = Object.assign(projectValues, req.body);
|
|
|
|
function sendFailure() {
|
|
res.status(400).json({ success: false });
|
|
}
|
|
|
|
function populateUserData(newProject) {
|
|
return Project.populate(
|
|
newProject,
|
|
{ path: 'user', select: 'username' },
|
|
(err, newProjectWithUser) => {
|
|
if (err) {
|
|
sendFailure();
|
|
return;
|
|
}
|
|
res.json(newProjectWithUser);
|
|
}
|
|
);
|
|
}
|
|
|
|
|
|
return Project.create(projectValues)
|
|
.then(populateUserData)
|
|
.catch(sendFailure);
|
|
}
|
|
|
|
// TODO: What happens if you don't supply any files?
|
|
export function apiCreateProject(req, res) {
|
|
const params = Object.assign({ user: req.user._id }, req.body);
|
|
|
|
function sendValidationErrors(err, type, code = 422) {
|
|
res.status(code).json({
|
|
message: `${type} Validation Failed`,
|
|
detail: err.message,
|
|
errors: err.files,
|
|
});
|
|
}
|
|
|
|
// TODO: Error handling to match spec
|
|
function sendFailure(err) {
|
|
res.status(500).end();
|
|
}
|
|
|
|
function handleErrors(err) {
|
|
if (err instanceof FileValidationError) {
|
|
sendValidationErrors(err, 'File', err.code);
|
|
} else if (err instanceof ProjectValidationError) {
|
|
sendValidationErrors(err, 'Sketch', err.code);
|
|
} else {
|
|
sendFailure();
|
|
}
|
|
}
|
|
|
|
function checkUserHasPermission() {
|
|
if (req.user.username !== req.params.username) {
|
|
console.log('no permission');
|
|
const error = new ProjectValidationError(`'${req.user.username}' does not have permission to create for '${req.params.username}'`);
|
|
error.code = 401;
|
|
|
|
throw error;
|
|
}
|
|
}
|
|
|
|
try {
|
|
checkUserHasPermission();
|
|
|
|
const model = toModel(params);
|
|
|
|
return model.isSlugUnique()
|
|
.then(({ isUnique, conflictingIds }) => {
|
|
if (isUnique) {
|
|
return model.save()
|
|
.then((newProject) => {
|
|
res.status(201).json({ id: newProject.id });
|
|
});
|
|
}
|
|
|
|
const error = new ProjectValidationError(`Slug "${model.slug}" is not unique. Check ${conflictingIds.join(', ')}`);
|
|
error.code = 409;
|
|
|
|
throw error;
|
|
})
|
|
.then(checkUserHasPermission)
|
|
.catch(handleErrors);
|
|
} catch (err) {
|
|
handleErrors(err);
|
|
return Promise.reject(err);
|
|
}
|
|
}
|