APIs e Integrações
📋 Visão Geral
O Portal FindUP utiliza o Supabase como backend principal, fornecendo APIs automáticas, autenticação robusta e Edge Functions customizadas. Esta seção documenta todas as integrações e endpoints disponíveis.
🔌 Supabase APIs
Configuração do Cliente
import { createClient } from "@supabase/supabase-js";
const supabaseUrl = "https://uplwocvetbcbfzgntupx.supabase.co";
const supabaseKey = process.env.VITE_SUPABASE_ANON_KEY;
const supabase = createClient(supabaseUrl, supabaseKey);
Autenticação
Login
const { data, error } = await supabase.auth.signInWithPassword({
email: "user@example.com",
password: "password",
});
Logout
const { error } = await supabase.auth.signOut();
Recuperar Usuário Atual
const {
data: { user },
} = await supabase.auth.getUser();
🗄️ Database APIs
Usuários e Perfis
Buscar Perfil do Usuário
const { data, error } = await supabase
.from("profiles")
.select("*")
.eq("user_id", userId)
.single();
Verificar Role do Usuário
const { data, error } = await supabase.rpc("has_role", {
_user_id: userId,
_role: "admin",
});
Produtos
Listar Produtos Ativos
const { data, error } = await supabase
.from("products")
.select("*")
.eq("is_active", true)
.order("name");
Criar Produto
const { data, error } = await supabase.from("products").insert([
{
name: "Nome do Produto",
description: "Descrição",
price: 100.0,
monthly_price: 50.0,
product_type: "google_workspace",
commission_percentage: 0.1,
is_active: true,
},
]);
Clientes
Listar Clientes do Técnico
const { data, error } = await supabase
.from("customers")
.select("*")
.eq("technician_id", technicianId)
.order("company_name");
Criar Cliente
const { data, error } = await supabase.from("customers").insert([
{
technician_id: technicianId,
company_name: "Empresa Ltda",
contact_name: "João Silva",
email: "joao@empresa.com",
phone: "(11) 99999-9999",
cnpj: "12.345.678/0001-90",
},
]);
Propostas
Listar Propostas
const { data, error } = await supabase
.from("proposals")
.select(
`
*,
customers(*),
products(*),
profiles(*)
`
)
.eq("technician_id", technicianId)
.order("created_at", { ascending: false });
Criar Proposta
const { data, error } = await supabase.from("proposals").insert([
{
customer_id: customerId,
technician_id: technicianId,
product_id: productId,
monthly_value: 100.0,
contract_months: 12,
total_value: 1200.0,
status: "pending",
},
]);
Comissões
Listar Comissões do Técnico
const { data, error } = await supabase
.from("commissions")
.select(
`
*,
orders(
proposal_id,
proposals(
customers(company_name),
products(name)
)
)
`
)
.eq("technician_id", technicianId);
⚡ Edge Functions
Arquitetura das Edge Functions
1. Aprovação de Propostas
Endpoint: /functions/v1/approve-proposal
GET - Página de Aprovação
GET /functions/v1/approve-proposal?token=APPROVAL_TOKEN
Retorna uma página HTML para o cliente aprovar/rejeitar a proposta.
POST - Processar Aprovação
POST /functions/v1/approve-proposal?token=APPROVAL_TOKEN
Content-Type: application/x-www-form-urlencoded
email=cliente@email.com&action=approve
Parâmetros:
token(query) - Token de aprovação da propostaemail(form) - Email do cliente para confirmaçãoaction(form) - 'approve' ou 'reject'
2. Geração de PDF de Propostas
Endpoint: /functions/v1/generate-proposal-pdf
const { data, error } = await supabase.functions.invoke(
"generate-proposal-pdf",
{
body: { proposalId: "uuid-da-proposta" },
}
);
3. Envio de Email de Propostas
Endpoint: /functions/v1/send-proposal-email
const { data, error } = await supabase.functions.invoke("send-proposal-email", {
body: {
proposalId: "uuid-da-proposta",
recipientEmail: "cliente@email.com",
},
});
4. Reset de Senha pelo Admin
Endpoint: /functions/v1/admin-reset-password
const { data, error } = await supabase.functions.invoke(
"admin-reset-password",
{
body: {
userId: "uuid-do-usuario",
newPassword: "nova-senha",
},
}
);
🔒 Políticas RLS (Row Level Security)
Usuários e Perfis
- Usuários podem ver apenas seus próprios dados
- Admins podem ver todos os perfis
- Super admins têm acesso irrestrito
Produtos
- Todos os usuários autenticados podem listar produtos ativos
- Apenas admins podem criar/editar produtos
Clientes
- Técnicos veem apenas seus próprios clientes
- Admins veem todos os clientes
Propostas
- Técnicos veem apenas suas próprias propostas
- Admins veem todas as propostas
- Acesso público via token para aprovação
Comissões
- Técnicos veem apenas suas próprias comissões
- Admins veem todas as comissões
🔧 Funções Customizadas do Banco
has_role(user_id, role)
Verifica se um usuário tem determinado role.
SELECT public.has_role('uuid-user', 'admin'::public.app_role);
calculate_payment_dates(sale_date)
Calcula as datas de pagamento da Vivo e FindUP.
SELECT * FROM public.calculate_payment_dates('2025-01-15'::DATE);
generate_approval_token()
Gera um token seguro para aprovação de propostas.
SELECT public.generate_approval_token();
📊 Triggers Automáticos
Atualização de timestamps
updated_até automaticamente atualizado em todas as tabelas
Geração de tokens
- Tokens de aprovação são gerados automaticamente para novas propostas
Cálculo de comissões
- Comissões são calculadas automaticamente quando propostas são ativadas
Auditoria
- Logs de auditoria são criados automaticamente para ações importantes
🌐 Integrações Externas
CEP (ViaCEP)
Para validação e preenchimento automático de endereços:
const response = await fetch(`https://viacep.com.br/ws/${cep}/json/`);
const address = await response.json();
Validação de CNPJ
Validação local usando algoritmos brasileiros.
Emails Transacionais
Integração via Edge Functions para envio de emails de propostas e notificações.
🚨 Tratamento de Erros
Erros Comuns
Erro de Autenticação
if (error?.message === "Invalid login credentials") {
// Tratar credenciais inválidas
}
Erro de Permissão
if (error?.code === "PGRST301") {
// Usuário sem permissão para esta operação
}
Erro de Validação
if (error?.code === "23505") {
// Violação de constraint (email duplicado, etc.)
}
📈 Rate Limiting
O Supabase aplica rate limiting automático:
- API Calls: 200 req/min para usuários autenticados
- Auth: 60 req/min para operações de autenticação
- Edge Functions: 500 req/min
🔍 Monitoramento
Logs
Acesse os logs no painel do Supabase:
- Logs de API
- Logs de Auth
- Logs de Edge Functions
- Logs do Database
Métricas
- Número de requisições
- Tempo de resposta
- Taxa de erro
- Uso de recursos