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() } }) }, ) })