-- PHASE 56: rotas de entrada por DID (chamada de tronco -> tenant/destino) CREATE TABLE "inbound_routes" ( "id" UUID NOT NULL, "tenant_id" UUID NOT NULL, "did_number" TEXT NOT NULL, "description" TEXT, "destination_context" TEXT NOT NULL DEFAULT 'default', "destination_number" TEXT NOT NULL, "enabled" BOOLEAN NOT NULL DEFAULT true, "created_at" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP, "updated_at" TIMESTAMP(3) NOT NULL, "deleted_at" TIMESTAMP(3), CONSTRAINT "inbound_routes_pkey" PRIMARY KEY ("id") ); -- CreateIndex CREATE UNIQUE INDEX "inbound_routes_did_number_key" ON "inbound_routes"("did_number"); -- CreateIndex CREATE INDEX "inbound_routes_tenant_id_idx" ON "inbound_routes"("tenant_id"); -- AddForeignKey ALTER TABLE "inbound_routes" ADD CONSTRAINT "inbound_routes_tenant_id_fkey" FOREIGN KEY ("tenant_id") REFERENCES "tenants"("id") ON DELETE RESTRICT ON UPDATE CASCADE; -- Tabela de negocio tenant-scoped: RLS obrigatorio (ver docs/TENANT_ISOLATION.md). -- didNumber e' @unique GLOBAL de proposito (mesma excecao ja aceita em -- Tenant.telephonyDomain) -- e' a UNICA forma de descobrir de qual tenant -- e' uma chamada de entrada ANTES de identificar o tenant. A resolucao em -- apps/freeswitch-config faz fan-out sobre tenants ativos com -- withTenantContext (nunca uma query sem contexto), entao RLS continua -- valendo de verdade aqui, igual toda outra tabela de negocio. ALTER TABLE "inbound_routes" ENABLE ROW LEVEL SECURITY; ALTER TABLE "inbound_routes" FORCE ROW LEVEL SECURITY; CREATE POLICY "tenant_isolation" ON "inbound_routes" USING (tenant_id = NULLIF(current_setting('app.current_tenant_id', true), '')::uuid);