ability.ts 2.1 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061
  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(
  19. accessProfile.abilities as SubjectRawRule<
  20. string,
  21. ExtractSubjectType<Subject>,
  22. MongoQuery
  23. >[],
  24. )
  25. const abilityUtils = new AbilityBuilder(
  26. ability,
  27. accessProfile as unknown as AccessProfile,
  28. organizationProfile as unknown as OrganizationProfile,
  29. )
  30. // TODO: voir si on peut se passer du listener
  31. // TODO: clarifier l'ordre des opérations de maj des profils et des droits
  32. /**
  33. * Au moment où l'on effectue une action organizationProfileStore.setProfile, il faut aller récupérer
  34. * les différentes habilités que l'utilisateur peut effectuer. (Tout cela se passe en SSR)
  35. *
  36. * @see https://pinia.vuejs.org/core-concepts/actions.html#Subscribing-to-actions
  37. */
  38. const unsubscribe = organizationProfile.$onAction(
  39. ({
  40. name, // name of the action
  41. after, // hook after the action returns or resolves
  42. }) => {
  43. after((_) => {
  44. if (name === 'initiateProfile') {
  45. // On construit les habilités et on les enregistre dans le store
  46. // noinspection UnnecessaryLocalVariableJS
  47. const abilities = abilityUtils.buildAbilities()
  48. accessProfile.abilities = abilities
  49. // Unsubscribe pour éviter les memory leaks
  50. unsubscribe()
  51. }
  52. })
  53. },
  54. )
  55. })