/* |-------------------------------------------------------------------------- | Agência PSI |-------------------------------------------------------------------------- | Criado e desenvolvido por Leonardo Nohama | | Tecnologia aplicada à escuta. | Estrutura para o cuidado. | | Arquivo: src/composables/usePlatformPermissions.js | Data: 2026 | Local: São Carlos/SP — Brasil |-------------------------------------------------------------------------- | © 2026 — Todos os direitos reservados |-------------------------------------------------------------------------- */ // Distinto do RBAC de tenant (useRoleGuard). // // O campo `platform_roles text[]` na tabela `profiles` do Supabase // armazena papéis globais da plataforma. Ex.: ['editor']. // // Quem pode atribuir: somente o saas_admin. // Quem pode ter: qualquer usuário autenticado (exceto paciente). // // PAPÉIS DE PLATAFORMA DISPONÍVEIS: // 'editor' — pode criar e gerenciar cursos/módulos da plataforma de microlearning. // import { ref, computed } from 'vue'; import { supabase } from '@/lib/supabase/client'; import { sessionUser } from '@/app/session'; // cache em módulo (evita queries repetidas por navegação) let _cachedUid = null; let _cachedRoles = null; export function usePlatformPermissions() { const platformRoles = ref(_cachedRoles ?? []); const loading = ref(false); const error = ref(null); async function load(force = false) { const uid = sessionUser.value?.id; if (!uid) { platformRoles.value = []; return; } // cache por uid (invalida se usuário mudou) if (!force && _cachedUid === uid && _cachedRoles !== null) { platformRoles.value = _cachedRoles; return; } loading.value = true; error.value = null; try { const { data, err } = await supabase.from('profiles').select('platform_roles').eq('id', uid).single(); const roles = !err && Array.isArray(data?.platform_roles) ? data.platform_roles : []; _cachedUid = uid; _cachedRoles = roles; platformRoles.value = roles; } catch (e) { console.warn('[usePlatformPermissions] load falhou:', e); error.value = e; platformRoles.value = []; } finally { loading.value = false; } } function invalidate() { _cachedUid = null; _cachedRoles = null; platformRoles.value = []; } const isEditor = computed(() => platformRoles.value.includes('editor')); return { platformRoles, loading, error, isEditor, load, invalidate }; }