BridgePay — 03. Esquema do Banco de Dados
Este documento mapeia o modelo de dados (PostgreSQL no Supabase) e as regras de controle de acesso de segurança baseadas em RLS (Row Level Security).
---
1. Regra de Ouro da Segurança
Row Level Security (RLS) ativo em todas as tabelas!
Nenhum dado é visível por padrão na rede pública.
user_id ou owner_id seja igual a auth.uid().role = 'admin' ou 'super_admin'): Possuem bypass completo e podem visualizar ou modificar todos os registros de qualquer tabela.---
2. Tabelas Principais
profiles (Perfis de Usuários)
Armazena informações adicionais dos usuários registrados no Supabase Auth.
id (uuid, PK, references auth.users): Identificador único.nome (text): Nome completo do usuário.whatsapp (text, unique): Número de telefone para contato (+258).username (text, unique): Nome de usuário para login híbrido.role (text): Cargo do perfil ('user', 'admin', 'super_admin'). Default: 'user'.saldo_mzn (numeric): Saldo disponível para saque na plataforma. Default: 0.00.is_blocked (boolean): Flag para bloquear acesso à conta. Default: false.created_at (timestamptz): Data de criação.saas_plans (Planos SaaS da Plataforma)
Armazena os limites e valores dos planos de assinatura cobrados pela BridgePay.
id (uuid, PK): Identificador único.name (text): Nome do plano (ex: "Plano Básico", "Plano Ilimitado").price_mzn (numeric): Preço do plano em meticais (ex: 149.00, 399.00).features (jsonb): Limites do plano (número de produtos, arquivos, volume de tráfego, etc.).created_at (timestamptz): Data de criação.tenant_subscriptions (Assinaturas SaaS Ativas)
Vincula os usuários aos planos SaaS ativos na BridgePay.
id (uuid, PK): Identificador único.user_id (uuid, references profiles.id): Vendedor assinante.plan_id (uuid, references saas_plans.id): Plano contratado.status (text): Estado da assinatura ('active', 'past_due', 'canceled').expires_at (timestamptz): Data de expiração da assinatura.gateways_config (Configurações de Gateways)
Configurações de credenciais dos gateways para o vendedor (ou para a plataforma padrão).
id (uuid, PK): Identificador único.user_id (uuid, references profiles.id, nullable): Vendedor dono da configuração (se null, é gateway padrão).provider (text): Gateway provedor ('debitipay', 'paysuite', 'e2payment').api_key_encrypted (text): Credenciais criptografadas em AES-256-GCM.use_bridgepay_gateway (boolean): Se true, o vendedor usa a taxa padrão da BridgePay e a conta centralizada.is_active_custom (boolean): Se true, usa as chaves próprias configuradas.products (Produtos dos Vendedores)
Produtos digitais cadastrados por vendedores para venda.
id (uuid, PK): Identificador único.user_id (uuid, references profiles.id): Dono do produto.title (text): Nome do produto.description (text, nullable): Descrição detalhada.price (numeric): Preço de venda (MZN).pdf_url_r2 (text, nullable): Caminho do arquivo PDF hospedado no Cloudflare R2.video_url (text, nullable): Link do vídeo associado à área de membros.created_at (timestamptz).subscriptions (Clientes / Compras Efetuadas)
Vendas e acessos concedidos a compradores finais de produtos.
id (uuid, PK): Identificador único.user_id (uuid, references profiles.id): Vendedor do produto.product_id (uuid, references products.id): Produto comprado.buyer_whatsapp (text): WhatsApp do comprador (onde o bot envia o acesso).buyer_email (text, nullable): E-mail do comprador.status (text): Estado da assinatura do comprador ('active', 'expired').created_at (timestamptz).bot_sessions (Sessões do WhatsApp Bot)
Tabela monitorada em tempo real para controle remoto do bot na VPS.
id (text, PK): Identificador da sessão (geralmente 'default').status (text): Status da conexão ('DISCONNECTED', 'CONNECTING', 'QR_READY', 'CONNECTED').qr_code_base64 (text, nullable): Código QR em string Base64.pairing_code (text, nullable): Código de pareamento de 8 caracteres.updated_at (timestamptz).withdrawals (Solicitações de Saque)
Registro de saques solicitados pelos vendedores.
id (uuid, PK): Identificador único.user_id (uuid, references profiles.id): Vendedor solicitante.amount (numeric): Valor solicitado (MZN).payment_method (text): Canal para saque (ex: 'mpesa', 'emola').status (text): Status da transação ('pending', 'approved', 'failed').created_at (timestamptz).