| 1234567891011121314151617181920212223242526272829303132333435363738394041424344454647 |
- import { createMongoAbility } from '@casl/ability'
- import AbilityBuilder from '~/services/rights/abilityBuilder'
- import { useAccessProfileStore } from '~/stores/accessProfile'
- import { useOrganizationProfileStore } from '~/stores/organizationProfile'
- export const ability = createMongoAbility()
- export default defineNuxtPlugin(() => {
- const accessProfile = useAccessProfileStore()
- const organizationProfile = useOrganizationProfileStore()
- // Initialisation, nécessaire pour que l'update des habilités soit correcte après la phase SSR
- ability.update(accessProfile.abilities)
- const abilityUtils = new AbilityBuilder(
- ability,
- accessProfile,
- organizationProfile,
- )
- // TODO: voir si on peut se passer du listener
- // TODO: clarifier l'ordre des opérations de maj des profils et des droits
- /**
- * Au moment où l'on effectue une action organizationProfileStore.setProfile, il faut aller récupérer
- * les différentes habilités que l'utilisateur peut effectuer. (Tout cela se passe en SSR)
- *
- * @see https://pinia.vuejs.org/core-concepts/actions.html#Subscribing-to-actions
- */
- const unsubscribe = organizationProfile.$onAction(
- ({
- name, // name of the action
- after, // hook after the action returns or resolves
- }) => {
- after((_) => {
- if (name === 'initiateProfile') {
- // On construit les habilités et on les enregistre dans le store
- // noinspection UnnecessaryLocalVariableJS
- const abilities = abilityUtils.buildAbilities()
- accessProfile.abilities = abilities
- // Unsubscribe pour éviter les memory leaks
- unsubscribe()
- }
- })
- },
- )
- })
|