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 } }