ZERADO
This commit is contained in:
@@ -0,0 +1,81 @@
|
||||
// src/composables/usePlatformPermissions.js
|
||||
//
|
||||
// Permissões de PLATAFORMA (globais, não vinculadas a tenant).
|
||||
// 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
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user