91 lines
2.7 KiB
JavaScript
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
|
|
};
|
|
}
|