ability.ts 2.1 KB

1234567891011121314151617181920212223242526272829303132333435363738394041
  1. import { createMongoAbility } from '@casl/ability'
  2. import AbilityBuilder from '~/services/rights/abilityBuilder'
  3. import {defineNuxtPlugin} from "nuxt/app";
  4. import {useAccessProfileStore} from "~/stores/accessProfile";
  5. import {useOrganizationProfileStore} from "~/stores/organizationProfile";
  6. export const ability = createMongoAbility()
  7. export default defineNuxtPlugin(() => {
  8. const accessProfile = useAccessProfileStore()
  9. const organizationProfile = useOrganizationProfileStore()
  10. // Initialisation, nécessaire pour que l'update des habilités soit correcte après la phase SSR
  11. ability.update(accessProfile.abilities)
  12. const abilityUtils = new AbilityBuilder(ability, accessProfile, organizationProfile)
  13. // Au moment où l'on effectue une action organizationProfileStore.setProfile, il faut aller récupérer
  14. // les différentes habilités que l'utilisateur peut effectuer. (Tout cela se passe en SSR)
  15. // TODO: voir si on peut se passer du listener
  16. // TODO: clarifier l'ordre des opérations de maj des profils et des droits
  17. const unsubscribe = organizationProfile.$onAction(({
  18. name, // name of the action
  19. store, // store instance, same as `someStore`
  20. args, // array of parameters passed to the action
  21. after, // hook after the action returns or resolves
  22. onError, // hook if the action throws or rejects
  23. }: any) => {
  24. after((result: any)=>{
  25. if (name === 'setProfile'){
  26. // On construit les habilités et on les enregistre dans le store
  27. // noinspection UnnecessaryLocalVariableJS
  28. const abilities = abilityUtils.buildAbilities();
  29. accessProfile.abilities = abilities
  30. // Unsubscribe pour éviter les memory leaks
  31. unsubscribe()
  32. }
  33. })
  34. })
  35. })