accessProfile.ts 1.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566
  1. import { Ability } from '@casl/ability'
  2. import { AbilitiesType, accessState, AccessStore, AnyJson } from '~/types/interfaces'
  3. /**
  4. * @category Services/profiles
  5. * @class AccessProfile
  6. * Classe répondant aux différentes questions que l'on peut se poser sur l'access connecté
  7. */
  8. class AccessProfile {
  9. private accessProfile: accessState
  10. private $ability:Ability = {} as Ability
  11. /**
  12. * @constructor
  13. * @param {AccessStore} store State Access du Store contenant les informations de l'utilisateur
  14. * @param {Ability} ability Plugin $ability
  15. */
  16. constructor (store:AccessStore, ability:Ability) {
  17. this.accessProfile = store.state.profile.access
  18. this.$ability = ability
  19. }
  20. /**
  21. * Est ce que l'utilisateur possède le role.
  22. * @param {Array<string>} roles roles à tester
  23. * @return {boolean}
  24. */
  25. hasRole (roles:Array<string>): boolean {
  26. if (roles === null) { return true }
  27. let hasRole = false
  28. roles.map((r) => {
  29. if (this.accessProfile.roles.includes(r)) { hasRole = true }
  30. })
  31. return hasRole
  32. }
  33. /**
  34. * Est-ce que l'utilisateur possède l'abilité
  35. * @param {Array<AbilitiesType>} ability abilité à tester
  36. * @return {boolean}
  37. */
  38. hasAbility (ability:Array<AbilitiesType>): boolean {
  39. if (ability === null) { return true }
  40. let hasAbility = false
  41. ability.map((ability) => {
  42. if (this.$ability.can(ability.action, ability.subject)) { hasAbility = true }
  43. })
  44. return hasAbility
  45. }
  46. /**
  47. * Factory
  48. * @return {AnyJson} retourne les fonction rendues publiques
  49. */
  50. handler ():AnyJson {
  51. return {
  52. hasRole: this.hasRole.bind(this),
  53. hasAbility: this.hasAbility.bind(this)
  54. }
  55. }
  56. }
  57. export const $accessProfile = (store:AccessStore, ability:Ability) => new AccessProfile(store, ability)