import Project from '../../models/project'; import { toModel, FileValidationError, ProjectValidationError } from '../../domain-objects/Project'; import { commitPendingAssets, rewritePendingFileUrls } from '../../utils/pendingAssets'; export default async function createProject(req, res) { try { const projectValues = Object.assign({}, req.body, { user: req.user._id }); if (projectValues.files) { await commitPendingAssets(req.user.id, projectValues.files); projectValues.files = rewritePendingFileUrls( projectValues.files, req.user.id ); } const newProject = await Project.create(projectValues); const newProjectWithUser = await Project.populate(newProject, { path: 'user', select: 'username' }); res.json(newProjectWithUser); } catch (err) { res.status(400).json({ success: false }); } } // TODO: What happens if you don't supply any files? export async function apiCreateProject(req, res) { const params = Object.assign({}, req.body, { user: req.user._id }); const 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 const sendFailure = (err) => { res.status(500).end(); }; const handleErrors = (err) => { if (err instanceof FileValidationError) { sendValidationErrors(err, 'File', err.code); } else if (err instanceof ProjectValidationError) { sendValidationErrors(err, 'Sketch', err.code); } else { sendFailure(); } }; const checkUserHasPermission = () => { if (req.user.username !== req.params.username) { console.warn('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(); if (!params.files || typeof params.files !== 'object') { const error = new FileValidationError("'files' must be an object"); throw error; } const model = toModel(params); const { isUnique, conflictingIds } = await model.isSlugUnique(); if (!isUnique) { const error = new ProjectValidationError( `Slug "${model.slug}" is not unique. Check ${conflictingIds.join(', ')}` ); error.code = 409; throw error; } if (model.files) { await commitPendingAssets(req.user.id, model.files); model.files = rewritePendingFileUrls(model.files, req.user.id); } const newProject = await model.save(); res.status(201).json({ id: newProject.id }); } catch (err) { handleErrors(err); } }