From 0c2dc9c5d7c8ea6f2ee83cec890efd7ad6926c5e Mon Sep 17 00:00:00 2001 From: admtracksteel Date: Thu, 27 Aug 2026 20:55:51 +0000 Subject: [PATCH] fix: sanitizacao defensiva de payload para salvar estudo de rendimento no Supabase --- .../controllers/yieldStudyController.ts | 31 +++++++++++++++++-- 1 file changed, 28 insertions(+), 3 deletions(-) diff --git a/src/server/controllers/yieldStudyController.ts b/src/server/controllers/yieldStudyController.ts index 19e7325..58320ec 100644 --- a/src/server/controllers/yieldStudyController.ts +++ b/src/server/controllers/yieldStudyController.ts @@ -2,6 +2,28 @@ import { Request, Response } from 'express'; import { supabase } from '../config/supabase.js'; import { toCamelCase, toSnakeCase } from '../utils/caseMapper.js'; +const sanitizeStudyPayload = (body: any) => { + const payload = { ...body }; + + if (payload.dataSheetId && typeof payload.dataSheetId === 'object') { + payload.dataSheetId = payload.dataSheetId.id || payload.dataSheetId._id || payload.dataSheetId; + } + if (payload.data_sheet_id && typeof payload.data_sheet_id === 'object') { + payload.data_sheet_id = payload.data_sheet_id.id || payload.data_sheet_id._id || payload.data_sheet_id; + } + + delete payload.id; + delete payload._id; + delete payload.createdAt; + delete payload.created_at; + delete payload.updatedAt; + delete payload.updated_at; + delete payload.calculatedEpu; + delete payload.calculated_epu; + + return toSnakeCase(payload); +}; + export const getAllStudies = async (req: Request, res: Response) => { try { const { data, error } = await supabase.from('yield_studies').select('*'); @@ -14,30 +36,33 @@ export const getAllStudies = async (req: Request, res: Response) => { export const createStudy = async (req: Request, res: Response) => { try { - const payload = { ...req.body, organization_id: req.appUser?.organizationId }; + const payload = sanitizeStudyPayload({ ...req.body, organization_id: req.appUser?.organizationId }); const { data, error } = await supabase .from('yield_studies') - .insert(toSnakeCase(payload)) + .insert(payload) .select() .single(); if (error) throw error; res.status(201).json(toCamelCase(data)); } catch (error: unknown) { + console.error('Error creating study:', error); res.status(400).json({ error: (error as any).message }); } }; export const updateStudy = async (req: Request, res: Response) => { try { + const payload = sanitizeStudyPayload(req.body); const { data, error } = await supabase .from('yield_studies') - .update(toSnakeCase(req.body)) + .update(payload) .eq('id', req.params.id) .select() .single(); if (error) throw error; res.json(toCamelCase(data)); } catch (error: unknown) { + console.error('Error updating study:', error); res.status(400).json({ error: (error as any).message }); } };