From 4b58bd816ae5a5825fe45374d81936a1a52e439c Mon Sep 17 00:00:00 2001 From: suhaniiz Date: Sun, 9 Aug 2026 20:59:40 +0530 Subject: [PATCH] fix: validate req.body.code in compileResume middleware (#1622) --- backend/Input_validators/ValidateResume.js | 74 ++++++++++++---------- 1 file changed, 42 insertions(+), 32 deletions(-) diff --git a/backend/Input_validators/ValidateResume.js b/backend/Input_validators/ValidateResume.js index 761d9f0c..73d9c5a3 100644 --- a/backend/Input_validators/ValidateResume.js +++ b/backend/Input_validators/ValidateResume.js @@ -1,57 +1,67 @@ const { z } = require("zod"); -const { handleValidationError } = require('./ValidateQuestions') +const { handleValidationError } = require("./ValidateQuestions"); + +// ========================================== +// Schemas +// ========================================== -// Schema for compileResume request const compileResumeSchema = z.object({ - code: z.string().min(1, "LaTeX code is required"), + code: z + .string({ + required_error: "LaTeX code is required", + invalid_type_error: "LaTeX code must be a string", + }) + .min(1, "LaTeX code is required"), }); -// Schema for analyzeResume request const analyzeResumeSchema = z.object({ targetRole: z.string().min(1, "Target role is required").optional(), }); -// Schema for saveResume request const saveResumeSchema = z.object({ - title: z.string().min(1, "Title is required"), - latexCode: z.string().min(1, "LaTeX code is required"), + title: z.string({ + required_error: "Title is required", + invalid_type_error: "Title must be a string", + }).min(1, "Title is required"), + latexCode: z.string({ + required_error: "LaTeX code is required", + invalid_type_error: "LaTeX code must be a string", + }).min(1, "LaTeX code is required"), resumeId: z.string().optional(), }); +// ========================================== +// Middleware Functions +// ========================================== -// Middleware for compileResume -const validateCompileResume = (req, res, next) => { - try { - compileResumeSchema.parse(req.body); - next(); - } catch (error) { - return handleValidationError(res, error); +// Generic schema validator runner using Zod's safeParse +const validate = (schema) => (req, res, next) => { + const result = schema.safeParse(req.body || {}); + if (!result.success) { + return handleValidationError(res, result.error); } + next(); }; -// Middleware for analyzeResume +// Middleware for compileResume +const validateCompileResume = validate(compileResumeSchema); + +// Middleware for analyzeResume (includes file check) const validateAnalyzeResume = (req, res, next) => { - try { - analyzeResumeSchema.parse(req.body); - // also ensure file is uploaded - if (!req.file) { - return res.status(400).json({ success: false, message: "No resume file uploaded" }); - } - next(); - } catch (error) { - return handleValidationError(res, error); + const result = analyzeResumeSchema.safeParse(req.body || {}); + if (!result.success) { + return handleValidationError(res, result.error); } + if (!req.file) { + return res + .status(400) + .json({ success: false, message: "No resume file uploaded" }); + } + next(); }; // Middleware for saveResume -const validateSaveResume = (req, res, next) => { - try { - saveResumeSchema.parse(req.body); - next(); - } catch (error) { - return handleValidationError(res, error); - } -}; +const validateSaveResume = validate(saveResumeSchema); module.exports = { validateCompileResume,