F6.4: resolve superficie SaaS-admin (destrava F6.3 DROP)

DB (supabase_admin, manual/f6_4_saas_admin_rpcs.supabase_admin.sql): RPCs
gated por is_saas_admin que operam no _tenant_template + fan-out pros schemas:
- Feriados defaults: saas_list/add/remove_default_feriado (template + todos schemas)
- Notif templates defaults: saas_list/upsert/set_active/delete_default_notif_
  template + saas_count_notif_template_overrides (so a copia-default owner_id NULL;
  preserva overrides do tenant)
- saas_list_all_whatsapp_channels: fan-out cross-tenant (substitui a view
  v_twilio_whatsapp_overview) com tenant_name + open_incident por canal

Frontend:
- SaasFeriadosPage / SaasNotificationTemplatesPage: supabase.from(tenant) ->
  RPCs saas_*_default
- SaasWhatsappPage: gestao por-tenant-selecionado via supabase.schema(tenant_
  <slug>) (RLS permite saas_admin); overview via saas_list_all_whatsapp_channels
- twilioWhatsappService.getAllChannels: v_twilio_whatsapp_overview -> RPC

Verificado: ZERO supabase.from('<tabela_tenant>') publico restante no FE
(so SaaS-admin estava pendente). Build passa. F6.3 agora desbloqueada.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
This commit is contained in:
Leonardo
2026-06-13 17:01:46 -03:00
parent 4493e78349
commit dc2363b4e1
5 changed files with 284 additions and 149 deletions
+3 -4
View File
@@ -158,10 +158,9 @@ export async function getChannel(tenantId) {
* Busca todos os canais WhatsApp Twilio (para SaaS admin).
*/
export async function getAllChannels() {
const { data, error } = await supabase
.from('v_twilio_whatsapp_overview')
.select('*')
.order('created_at', { ascending: false })
// schema-per-tenant: v_twilio_whatsapp_overview (public) virou RPC fan-out
// saas_admin que varre os schemas e agrega os canais de todos os tenants.
const { data, error } = await supabase.rpc('saas_list_all_whatsapp_channels')
if (error) throw error
return data ?? []
}