Skip to main content

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 proposta
  • email (form) - Email do cliente para confirmação
  • action (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