ability.ts 2.0 KB

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