ability.ts 1.7 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647
  1. import { createMongoAbility } from '@casl/ability'
  2. import AbilityBuilder from '~/services/rights/abilityBuilder'
  3. import { useAccessProfileStore } from '~/stores/accessProfile'
  4. import { useOrganizationProfileStore } from '~/stores/organizationProfile'
  5. export const ability = createMongoAbility()
  6. export default defineNuxtPlugin(() => {
  7. const accessProfile = useAccessProfileStore()
  8. const organizationProfile = useOrganizationProfileStore()
  9. // Initialisation, nécessaire pour que l'update des habilités soit correcte après la phase SSR
  10. ability.update(accessProfile.abilities)
  11. const abilityUtils = new AbilityBuilder(
  12. ability,
  13. accessProfile,
  14. organizationProfile,
  15. )
  16. // TODO: voir si on peut se passer du listener
  17. // TODO: clarifier l'ordre des opérations de maj des profils et des droits
  18. /**
  19. * Au moment où l'on effectue une action organizationProfileStore.setProfile, il faut aller récupérer
  20. * les différentes habilités que l'utilisateur peut effectuer. (Tout cela se passe en SSR)
  21. *
  22. * @see https://pinia.vuejs.org/core-concepts/actions.html#Subscribing-to-actions
  23. */
  24. const unsubscribe = organizationProfile.$onAction(
  25. ({
  26. name, // name of the action
  27. after, // hook after the action returns or resolves
  28. }) => {
  29. after((_) => {
  30. if (name === 'initiateProfile') {
  31. // On construit les habilités et on les enregistre dans le store
  32. // noinspection UnnecessaryLocalVariableJS
  33. const abilities = abilityUtils.buildAbilities()
  34. accessProfile.abilities = abilities
  35. // Unsubscribe pour éviter les memory leaks
  36. unsubscribe()
  37. }
  38. })
  39. },
  40. )
  41. })