From cb6ecbe8792d9a29f07b39715553ff459537f834 Mon Sep 17 00:00:00 2001 From: GammaMicrowave Date: Mon, 10 Jul 2023 04:42:07 +0530 Subject: [PATCH] fixed some bugs in edit form controller --- controllers/form.controller.js | 125 ++++++++++++++++++++++++--------- 1 file changed, 90 insertions(+), 35 deletions(-) diff --git a/controllers/form.controller.js b/controllers/form.controller.js index 7406c8c..1775f4d 100644 --- a/controllers/form.controller.js +++ b/controllers/form.controller.js @@ -11,10 +11,10 @@ import Form from '../models/form.model.js'; import Project from '../models/project.model.js'; import { generateRandomString } from '../utils/generateRandomString.js'; import { prisma } from '../config/sql.config.js'; +import mongoose from 'mongoose'; export async function updateForm(req, res) { const id = req.params.id; - const { name, hasRecaptcha, @@ -26,53 +26,109 @@ export async function updateForm(req, res) { if ( !name || - !hasRecaptcha || - !hasFileField || + hasRecaptcha === undefined || + hasFileField === undefined || !schema || !password || !recaptcha_token ) { - response_400(res, 'Fields missing for updation'); + return response_400(res, 'Fields missing for updation'); } if (!verifycaptcha(recaptcha_token)) return response_400(res, 'Captcha not verified'); - password = await hash_password(password); - let form = await Form.findById(id); - - form = form - .populate({ - path: 'project', - select: 'owner', - }) - .populate({ - path: 'project.owner', - select: '_id name email passwordHash', - }); - if (password !== form.project.owner.passwordHash) - response_400(res, 'User is not the owner'); + const passwordHash = await hash_password(password); + let form = await Form.aggregate([ + { + $match: { + formId: id, + }, + }, + { + $lookup: { + from: 'projects', + localField: 'project', + foreignField: '_id', + as: 'project', + }, + }, + { + $unwind: '$project', + }, + { + $lookup: { + from: 'users', + localField: 'project.owner', + foreignField: '_id', + as: 'project.owner', + }, + }, + { + $unwind: '$project.owner', + }, + { + $project: { + name: 1, + hasRecaptchaVerification: 1, + hasFileField: 1, + schema: 1, + project: { + owner: { + name: 1, + email: 1, + passwordHash: 1, + }, + }, + }, + }, + { + $match: { + 'project.owner.passwordHash': passwordHash, + }, + }, + { + $project: { + name: 1, + hasRecaptchaVerification: 1, + hasFileField: 1, + schema: 1, + }, + }, + ]); - form = await form.updateOne({ - name: name, - hasRecaptchaVerification: hasRecaptcha, - hasFileField: hasFileField, - schema: schema, - }); + if (!form) return response_400(res, 'User is not the owner'); - form = await form.project({ - formId: 1, - name: 1, - hasRecaptchaVerification: 1, - is_owner: { $eq: [req.user._id, '$$$project.owner._id'] }, - owner: { - name: '$$$project.owner.name', - email: '$$$project.owner.email', + const updatedForm = await Form.findOneAndUpdate( + { formId: id }, + { + name: name, + hasRecaptchaVerification: hasRecaptcha, + hasFileField: hasFileField, + schema: schema, }, + { new: true }, + ).select( + 'formId name hasRecaptchaVerification hasFileField schema submisssionLinkGeneratedAt', + ); + + let submisssionLinkGeneratedAt = updatedForm.submisssionLinkGeneratedAt; + const { hostUrl } = req.body; + let encryptedStr = encryptString( + JSON.stringify({ + formId: id, + submisssionLinkGeneratedAt, + }), + ); + let url = `${hostUrl}/main/submit?formRef=${encryptedStr}`; + response_200(res, 'form sucessfully updated', { + ...updatedForm, + submissionLink: url, }); - response_200(res, 'form sucessfully updated', form); } + + export async function createForm(req, res) { if (!verifycaptcha(req.body.recaptcha_token)) return response_400(res, 'Captcha not verified'); @@ -88,7 +144,6 @@ export async function createForm(req, res) { return response_400(res, 'Name cannot be an empty string'); const projectId = req.params.projectId; const project = await Project.findOne({ projectId }); - console.log(project); if (!project) return response_400(res, 'No project found with this id'); //Mongoose object id cannot be equated directly so i converted them into string and checked that. @@ -121,7 +176,6 @@ export async function createForm(req, res) { formId: formId, submisssionLinkGeneratedAt, }); - console.log(newForm); Project.findByIdAndUpdate( project._id, { forms: [...project.forms, newForm._id] }, @@ -187,6 +241,7 @@ export async function getForm(req, res) { name: 1, is_owner: 1, owner: 1, + schema: 1, hasRecaptchaVerification: 1, hasFileField: 1, submisssionLinkGeneratedAt: 1,