fix: sanitizacao defensiva de payload para salvar estudo de rendimento no Supabase

This commit is contained in:
2026-08-27 20:55:51 +00:00
parent a3b4483c1a
commit 0c2dc9c5d7
+28 -3
View File
@@ -2,6 +2,28 @@ import { Request, Response } from 'express';
import { supabase } from '../config/supabase.js'; import { supabase } from '../config/supabase.js';
import { toCamelCase, toSnakeCase } from '../utils/caseMapper.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) => { export const getAllStudies = async (req: Request, res: Response) => {
try { try {
const { data, error } = await supabase.from('yield_studies').select('*'); 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) => { export const createStudy = async (req: Request, res: Response) => {
try { 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 const { data, error } = await supabase
.from('yield_studies') .from('yield_studies')
.insert(toSnakeCase(payload)) .insert(payload)
.select() .select()
.single(); .single();
if (error) throw error; if (error) throw error;
res.status(201).json(toCamelCase(data)); res.status(201).json(toCamelCase(data));
} catch (error: unknown) { } catch (error: unknown) {
console.error('Error creating study:', error);
res.status(400).json({ error: (error as any).message }); res.status(400).json({ error: (error as any).message });
} }
}; };
export const updateStudy = async (req: Request, res: Response) => { export const updateStudy = async (req: Request, res: Response) => {
try { try {
const payload = sanitizeStudyPayload(req.body);
const { data, error } = await supabase const { data, error } = await supabase
.from('yield_studies') .from('yield_studies')
.update(toSnakeCase(req.body)) .update(payload)
.eq('id', req.params.id) .eq('id', req.params.id)
.select() .select()
.single(); .single();
if (error) throw error; if (error) throw error;
res.json(toCamelCase(data)); res.json(toCamelCase(data));
} catch (error: unknown) { } catch (error: unknown) {
console.error('Error updating study:', error);
res.status(400).json({ error: (error as any).message }); res.status(400).json({ error: (error as any).message });
} }
}; };