From 242d67c509e7b7b05e0843cc6324ff6e82bedb72 Mon Sep 17 00:00:00 2001 From: admtracksteel Date: Fri, 3 Apr 2026 19:58:11 +0000 Subject: [PATCH] =?UTF-8?q?=F0=9F=9A=80=20Auto-deploy:=20GPI=20atualizado?= =?UTF-8?q?=20em=2003/04/2026=2019:58:11?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- create_public_views.sql | 31 +++++++++++++++++++++++ src/server/controllers/stockController.ts | 13 ++++++---- 2 files changed, 39 insertions(+), 5 deletions(-) create mode 100644 create_public_views.sql diff --git a/create_public_views.sql b/create_public_views.sql new file mode 100644 index 0000000..ef12f27 --- /dev/null +++ b/create_public_views.sql @@ -0,0 +1,31 @@ +-- Script para expor as tabelas do schema 'gpi' no schema 'public' via views +-- Isso facilita o acesso pela API padrão do Supabase/PostgREST + +-- 1. Garantir que o schema public existe +CREATE SCHEMA IF NOT EXISTS public; + +-- 2. Criar views no schema public para cada tabela do gpi +CREATE OR REPLACE VIEW public.organizations AS SELECT * FROM gpi.organizations; +CREATE OR REPLACE VIEW public.users AS SELECT * FROM gpi.users; +CREATE OR REPLACE VIEW public.projects AS SELECT * FROM gpi.projects; +CREATE OR REPLACE VIEW public.parts AS SELECT * FROM gpi.parts; +CREATE OR REPLACE VIEW public.painting_schemes AS SELECT * FROM gpi.painting_schemes; +CREATE OR REPLACE VIEW public.application_records AS SELECT * FROM gpi.application_records; +CREATE OR REPLACE VIEW public.inspections AS SELECT * FROM gpi.inspections; +CREATE OR REPLACE VIEW public.technical_data_sheets AS SELECT * FROM gpi.technical_data_sheets; +CREATE OR REPLACE VIEW public.yield_studies AS SELECT * FROM gpi.yield_studies; +CREATE OR REPLACE VIEW public.instruments AS SELECT * FROM gpi.instruments; +CREATE OR REPLACE VIEW public.stock_items AS SELECT * FROM gpi.stock_items; +CREATE OR REPLACE VIEW public.stock_movements AS SELECT * FROM gpi.stock_movements; +CREATE OR REPLACE VIEW public.notifications AS SELECT * FROM gpi.notifications; +CREATE OR REPLACE VIEW public.geometry_types AS SELECT * FROM gpi.geometry_types; +CREATE OR REPLACE VIEW public.messages AS SELECT * FROM gpi.messages; +CREATE OR REPLACE VIEW public.stock_audit_logs AS SELECT * FROM gpi.stock_audit_logs; +CREATE OR REPLACE VIEW public.system_settings AS SELECT * FROM gpi.system_settings; +CREATE OR REPLACE VIEW public.stored_files AS SELECT * FROM gpi.stored_files; + +-- 3. Dar permissões de acesso às views +GRANT SELECT, INSERT, UPDATE, DELETE ON ALL TABLES IN SCHEMA public TO postgres, anon, authenticated, service_role; +GRANT USAGE, SELECT ON ALL SEQUENCES IN SCHEMA public TO postgres, anon, authenticated, service_role; + +SELECT '18 views criadas no schema public com sucesso!' AS resultado; diff --git a/src/server/controllers/stockController.ts b/src/server/controllers/stockController.ts index fadbed2..461e066 100644 --- a/src/server/controllers/stockController.ts +++ b/src/server/controllers/stockController.ts @@ -1,6 +1,6 @@ import { Request, Response } from 'express'; import { supabase } from '../config/supabase.js'; -import { toCamelCase } from '../utils/caseMapper.js'; +import { toCamelCase, toSnakeCase } from '../utils/caseMapper.js'; import { IAppUser } from '../middleware/authMiddleware.js'; interface AuthRequest extends Request { @@ -49,7 +49,8 @@ export const getStockAuditLogs = async (req: AuthRequest, res: Response) => { export const createStockItem = async (req: AuthRequest, res: Response) => { try { - const { data, error } = await supabase.from('stock_items').insert({ ...req.body, organization_id: req.appUser?.organizationId }).select().single(); + const itemData = toSnakeCase({ ...req.body, organizationId: req.appUser?.organizationId }); + const { data, error } = await supabase.from('stock_items').insert(itemData).select().single(); if (error) throw error; res.status(201).json(toCamelCase(data)); } catch (error: unknown) { @@ -59,11 +60,12 @@ export const createStockItem = async (req: AuthRequest, res: Response) => { export const updateStockItem = async (req: AuthRequest, res: Response) => { try { - const { data, error } = await supabase.from('stock_items').update(req.body).eq('id', req.params.id).select().single(); + const updateData = toSnakeCase(req.body); + const { data, error } = await supabase.from('stock_items').update(updateData).eq('id', req.params.id).select().single(); if (error) throw error; res.json(toCamelCase(data)); } catch (error: unknown) { - res.json(req.body); + res.status(500).json({ error: error instanceof Error ? error.message : 'Unknown error' }); } }; @@ -78,7 +80,8 @@ export const deleteStockItem = async (req: AuthRequest, res: Response) => { export const adjustStock = async (req: AuthRequest, res: Response) => { try { const { id } = req.params; - const { data, error } = await supabase.from('stock_items').update(req.body).eq('id', id).select().single(); + const updateData = toSnakeCase(req.body); + const { data, error } = await supabase.from('stock_items').update(updateData).eq('id', id).select().single(); if (error) throw error; res.json(toCamelCase(data)); } catch (error: unknown) {