accessProfile.ts 1.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475
  1. import { Ability } from '@casl/ability'
  2. import { AbilitiesType, accessState, AccessStore, AnyJson } from '~/types/interfaces'
  3. /**
  4. * L'AccessProfile permet de manipuler l'AccessState l'Access qui peuvent
  5. * être nécessaires pour l'affichage de chacune des pages de l'application
  6. * (ex: rôles, habilités, ...etc)
  7. */
  8. class AccessProfile {
  9. private accessProfile: accessState
  10. private $ability: Ability = {} as Ability
  11. /**
  12. * @constructor
  13. *
  14. * @param {AccessStore} store State Access du Store contenant les informations de l'utilisateur
  15. * @param {Ability} ability Plugin $ability
  16. */
  17. constructor (store: AccessStore, ability: Ability) {
  18. this.accessProfile = store.state.profile.access
  19. this.$ability = ability
  20. }
  21. /**
  22. * Est-ce que l'utilisateur possède le rôle donné?
  23. *
  24. * @param {Array<string>} roles Rôles à tester
  25. * @return {boolean}
  26. */
  27. hasRole (roles: Array<string>): boolean {
  28. if (roles === null) {
  29. return true
  30. }
  31. let hasRole = false
  32. roles.map((r) => {
  33. if (this.accessProfile.roles.includes(r)) {
  34. hasRole = true
  35. }
  36. })
  37. return hasRole
  38. }
  39. /**
  40. * Est-ce que l'utilisateur possède l'habilité?
  41. *
  42. * @param {Array<AbilitiesType>} ability habilité à tester
  43. * @return {boolean}
  44. */
  45. hasAbility (ability: Array<AbilitiesType>): boolean {
  46. if (ability === null) {
  47. return true
  48. }
  49. let hasAbility = false
  50. ability.map((ability) => {
  51. if (this.$ability.can(ability.action, ability.subject)) { hasAbility = true }
  52. })
  53. return hasAbility
  54. }
  55. /**
  56. * Factory
  57. *
  58. * @return {AnyJson} retourne les fonction rendues publiques
  59. */
  60. handler (): AnyJson {
  61. return {
  62. hasRole: this.hasRole.bind(this),
  63. hasAbility: this.hasAbility.bind(this)
  64. }
  65. }
  66. }
  67. export const $accessProfile = (store:AccessStore, ability:Ability) => new AccessProfile(store, ability)