fix: sanitizacao defensiva de payload para salvar estudo de rendimento no Supabase
This commit is contained in:
@@ -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 });
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|||||||
Reference in New Issue
Block a user