accessProfile.ts 1.8 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071
  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) {
  27. return true
  28. }
  29. let hasRole = false
  30. roles.map((r) => {
  31. if (this.accessProfile.roles.includes(r)) {
  32. hasRole = true
  33. }
  34. })
  35. return hasRole
  36. }
  37. /**
  38. * Est-ce que l'utilisateur possède l'habilité
  39. * @param {Array<AbilitiesType>} ability habilité à tester
  40. * @return {boolean}
  41. */
  42. hasAbility (ability: Array<AbilitiesType>): boolean {
  43. if (ability === null) {
  44. return true
  45. }
  46. let hasAbility = false
  47. ability.map((ability) => {
  48. if (this.$ability.can(ability.action, ability.subject)) { hasAbility = true }
  49. })
  50. return hasAbility
  51. }
  52. /**
  53. * Factory
  54. * @return {AnyJson} retourne les fonction rendues publiques
  55. */
  56. handler (): AnyJson {
  57. return {
  58. hasRole: this.hasRole.bind(this),
  59. hasAbility: this.hasAbility.bind(this)
  60. }
  61. }
  62. }
  63. export const $accessProfile = (store:AccessStore, ability:Ability) => new AccessProfile(store, ability)