accessProfile.ts 1.8 KB

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