Files
agenciapsilmno/src/composables/usePlatformPermissions.js
T

91 lines
2.7 KiB
JavaScript

/*
|--------------------------------------------------------------------------
| 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
};
}