Ajout de isAdmin et effectivePermissions dans UserData, creation du composable usePermissions() (can/canAny/canAll) avec bypass admin.
39 lines
1.2 KiB
TypeScript
39 lines
1.2 KiB
TypeScript
import { useAuthStore } from '~/shared/stores/auth'
|
|
|
|
/**
|
|
* Composable d'autorisation cote front.
|
|
*
|
|
* Source de verite : `useAuthStore().user`, qui porte le payload /api/me
|
|
* incluant `isAdmin` et `effectivePermissions` (tableau trie sans doublons).
|
|
*
|
|
* Regle de bypass dupliquee avec `PermissionVoter` (back) :
|
|
* si `user.isAdmin === true`, toutes les permissions sont accordees.
|
|
* Cette duplication est volontaire pour offrir un feedback UI immediat
|
|
* sans aller-retour serveur. Si la regle de bypass change cote back
|
|
* (decision architecturale #343 section 11), ce composable DOIT evoluer
|
|
* en meme temps.
|
|
*
|
|
* Stateless : aucun ref module-level, tout passe par Pinia. Le reset est
|
|
* assure automatiquement par `authStore.logout()` qui efface `user`.
|
|
*/
|
|
export function usePermissions() {
|
|
const auth = useAuthStore()
|
|
|
|
function can(code: string): boolean {
|
|
const user = auth.user
|
|
if (!user) return false
|
|
if (user.isAdmin) return true
|
|
return user.effectivePermissions.includes(code)
|
|
}
|
|
|
|
function canAny(codes: string[]): boolean {
|
|
return codes.some(can)
|
|
}
|
|
|
|
function canAll(codes: string[]): boolean {
|
|
return codes.every(can)
|
|
}
|
|
|
|
return { can, canAny, canAll }
|
|
}
|