import { type NextFunction, type Request, type Response } from 'express'; import Form from '../models/formModel'; import { RequestWithUser } from '../types/Express'; import { ErrorResponse, SuccessResponse } from '../utils/response'; import { HttpCodes } from '../config/errors'; import Logger from '../utils/logger'; export const getAllForms = async ( req: RequestWithUser, res: Response, next: NextFunction ) => { try { const page = Number(req.query.page) || 0; const pageSize = Number(req.query.pageSize) || 10; const skip = page * pageSize; const searchQuery = req.query.search; Logger.info(`Fetching forms page ${page} with page size ${pageSize}.`); const query = searchQuery === undefined || searchQuery === '' ? { name: { $regex: searchQuery, $options: 'i' } } : {}; const total = await Form.countDocuments(query); if (req.query.page && req.query.page !== '0' && skip >= total) { Logger.error(`Failed to get forms page ${page} doesn't exist.`); return ErrorResponse( res, HttpCodes.BadRequest.code, `Failed to get forms page ${page} doesn't exist.` ); } const forms = await Form.find(query) .sort(req.query.sort?.toString() ?? '') .skip(skip) .limit(pageSize); return SuccessResponse( res, HttpCodes.Accepted.code, { forms, total }, 'Forms fetched successfully.' ); } catch (error) { Logger.error(`Error occurred while fetching forms : ${error}`); return ErrorResponse( res, HttpCodes.InternalServerError.code, 'Failed to fetch forms. Please try again!' ); } }; export const deleteForms = async ( req: Request, res: Response, next: NextFunction ) => { try { const { forms } = req.body; await Form.deleteMany({ _id: { $in: forms } }); Logger.info(`Forms ${forms} deleted successfully.`); SuccessResponse( res, HttpCodes.Accepted.code, null, 'Forms deleted successfully.' ); } catch (error) { Logger.error(`Failed to delete forms - ${error}`); return ErrorResponse( res, HttpCodes.InternalServerError.code, 'Failed to delete forms. Please try again!' ); } }; export const getForm = async ( req: Request, res: Response, next: NextFunction ) => { try { const form = await Form.findById(req.params.id); if (!form) { Logger.error( `Failed to get form - No form found with that ID - ${req.params.id}` ); return ErrorResponse( res, HttpCodes.NotFound.code, 'No form found with that ID' ); } Logger.info(`Form ${form?.name} fetched successfully.`); return SuccessResponse( res, HttpCodes.Accepted.code, form, 'Form fetched successfully.' ); } catch (error) { Logger.error(`Failed to get form - ${error}`); return ErrorResponse( res, HttpCodes.InternalServerError.code, 'Failed to get form. Please try again!' ); } }; export const createForm = async ( req: RequestWithUser, res: Response, next: NextFunction ) => { try { const { name, elements } = req.body; // joi validation // if (!name) // return next(new AppError('Please provide the name of the form!', 400)); if (elements.length === 0) { Logger.error( `Failed to create form - Please provide at least one element to create a form.` ); return ErrorResponse( res, HttpCodes.BadRequest.code, 'Please provide at least one element to create a form.' ); } const newForm = await Form.create({ name, elements: elements ?? [], user: req.user?._id, }); Logger.info(`Form ${newForm.name} created successfully.`); return SuccessResponse( res, HttpCodes.Created.code, { form: newForm }, 'Form created successfully.' ); } catch (error) { Logger.error(`Failed to create form - ${error}`); return ErrorResponse( res, HttpCodes.InternalServerError.code, 'Failed to create form. Please try again!' ); } }; export const updateForm = async ( req: Request, res: Response, next: NextFunction ) => { // joi validation const formId = req.params.id; const newForm = req.body; try { const form = await Form.findByIdAndUpdate(formId, newForm, { new: true, }); if (!form) { Logger.error(`Failed to update form - Form not found.`); return ErrorResponse( res, HttpCodes.NotFound.code, 'No form found with that ID.' ); } Logger.info(`Form ${form.name} updated successfully.`); return SuccessResponse( res, HttpCodes.Accepted.code, { form }, 'Form updated successfully.' ); } catch (error) { Logger.error(`Failed to update form - ${error}`); return ErrorResponse( res, HttpCodes.InternalServerError.code, 'Failed to update form. Please try again!' ); } }; export const deleteForm = async ( req: Request, res: Response, next: NextFunction ) => { try { const form = await Form.findByIdAndDelete(req.params.id); if (!form) { Logger.error(`Failed to delete form - Form not found.`); return ErrorResponse( res, HttpCodes.NotFound.code, 'No form found with that ID.' ); } Logger.info(`Form ${form.name} deleted successfully.`); return SuccessResponse( res, HttpCodes.Accepted.code, null, 'Form deleted successfully.' ); } catch (error) { Logger.error(`Failed to delete form - ${error}`); return ErrorResponse( res, HttpCodes.InternalServerError.code, 'Failed to delete form. Please try again!' ); } };