accessProfile.ts 3.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130
  1. import {AbilitiesType, accessState, AccessStore, AnyJson} from "~/types/interfaces";
  2. import {Ability} from "@casl/ability";
  3. import {Store} from "vuex";
  4. /**
  5. * L'AccessProfile permet de manipuler l'AccessState l'Access qui peuvent
  6. * être nécessaires pour l'affichage de chacune des pages de l'application
  7. * (ex: rôles, habilités, ...etc)
  8. */
  9. class AccessProfile {
  10. private accessProfile: accessState
  11. private $ability:Ability = {} as Ability
  12. private store:Store<any>
  13. /**
  14. * @constructor
  15. *
  16. * @param {AccessStore} store State Access du Store contenant les informations de l'utilisateur
  17. * @param {Ability} ability Plugin $ability
  18. */
  19. constructor (store: AccessStore, ability: Ability) {
  20. this.accessProfile = store.state.profile.access
  21. this.$ability = ability
  22. this.store = store
  23. }
  24. /**
  25. * Est-ce que l'utilisateur possède le rôle donné?
  26. *
  27. * @param {Array<string>} roles Rôles à tester
  28. * @return {boolean}
  29. */
  30. hasRole (roles: Array<string>): boolean {
  31. if (roles === null) {
  32. return true
  33. }
  34. let hasRole = false
  35. roles.map((r) => {
  36. if (this.accessProfile.roles.includes(r)) {
  37. hasRole = true
  38. }
  39. })
  40. return hasRole
  41. }
  42. /**
  43. * Est-ce que l'utilisateur possède l'abilité
  44. * @param {Array<AbilitiesType>} abilities abilités à tester
  45. * @return {boolean}
  46. */
  47. hasAbility(abilities:Array<AbilitiesType>): boolean{
  48. if(abilities === null)
  49. return true;
  50. let hasAbility= false;
  51. abilities.map((ability) => {
  52. if (this.$ability.can(ability.action, ability.subject))
  53. hasAbility = true;
  54. });
  55. return hasAbility;
  56. }
  57. /**
  58. * Retourne vrai si l'utilisateur connecté possède l'un des profiles passés en paramètre
  59. * @param {Array<string>} profiles : profiles à tester
  60. * @return {boolean}
  61. */
  62. hasProfile(profiles: Array<string>): boolean{
  63. if (null === profiles)
  64. return true;
  65. let hasProfile = false;
  66. profiles.map(async (profile) => {
  67. if (this.testProfile(profile))
  68. hasProfile = true;
  69. });
  70. return hasProfile;
  71. }
  72. /**
  73. * Factory pour tester le profil d'un utilisateur
  74. * @param {string} profile : profile à tester
  75. * @return {boolean}
  76. */
  77. testProfile(profile:string): boolean{
  78. const factory: {[key: string]: boolean} = {
  79. 'admin': this.accessProfile.isAdmin,
  80. 'administratifManager': this.accessProfile.isAdministratifManager,
  81. 'pedagogicManager': this.accessProfile.isPedagogicManager,
  82. 'financialManager': this.accessProfile.isFinancialManager,
  83. 'caMember': this.accessProfile.isCaMember,
  84. 'student': this.accessProfile.isStudent,
  85. 'teacher': this.accessProfile.isTeacher,
  86. 'member': this.accessProfile.isMember,
  87. 'other': this.accessProfile.isOther,
  88. 'guardian': this.accessProfile.isGuardian,
  89. 'payor': this.accessProfile.isPayor,
  90. }
  91. if(profile in factory)
  92. return factory[profile]
  93. else return false
  94. }
  95. /**
  96. * Est-ce que l'utilisateur possède un compte administrateur
  97. * @return {boolean}
  98. */
  99. isAdminAccount(): boolean{
  100. return this.accessProfile.isAdminAccess
  101. }
  102. /**
  103. * Factory
  104. *
  105. * @return {AnyJson} retourne les fonction rendues publiques
  106. */
  107. handler (): AnyJson {
  108. return {
  109. hasRole: this.hasRole.bind(this),
  110. hasAbility: this.hasAbility.bind(this),
  111. hasProfile: this.hasProfile.bind(this),
  112. isAdminAccount: this.isAdminAccount.bind(this)
  113. }
  114. }
  115. }
  116. export const $accessProfile = (store:AccessStore, ability:Ability) => new AccessProfile(store, ability)