accessProfile.ts 3.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143
  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. export class AccessProfile {
  10. private accessProfile!: accessState
  11. private $ability:Ability = {} as Ability
  12. private store!:Store<any>
  13. /**
  14. * Set le store
  15. * @param {Store<AccessStore>} store
  16. */
  17. public setStore (store: AccessStore) {
  18. this.accessProfile = store.state.profile.access
  19. this.store = store
  20. }
  21. /**
  22. * Permet de setter le service d'abilités
  23. * @param ability
  24. */
  25. public setAbility(ability: Ability){
  26. this.$ability = ability
  27. }
  28. /**
  29. * Est-ce que l'utilisateur possède le rôle donné?
  30. *
  31. * @param {Array<string>} roles Rôles à tester
  32. * @return {boolean}
  33. */
  34. hasRole (roles: Array<string>|null): boolean {
  35. if (roles === null) {
  36. return true
  37. }
  38. let hasRole = false
  39. roles.map((r) => {
  40. if (this.accessProfile.roles.includes(r)) {
  41. hasRole = true
  42. }
  43. })
  44. return hasRole
  45. }
  46. /**
  47. * Est-ce que l'utilisateur possède l'abilité
  48. * @param {Array<AbilitiesType>} abilities abilités à tester
  49. * @return {boolean}
  50. */
  51. hasAbility(abilities:Array<AbilitiesType>|null): boolean{
  52. if(abilities === null)
  53. return true;
  54. let hasAbility= false;
  55. abilities.map((ability) => {
  56. if (this.$ability.can(ability.action, ability.subject))
  57. hasAbility = true;
  58. });
  59. return hasAbility;
  60. }
  61. /**
  62. * Retourne vrai si l'utilisateur connecté possède l'un des profiles passés en paramètre
  63. * @param {Array<string>} profiles : profiles à tester
  64. * @return {boolean}
  65. */
  66. hasProfile(profiles: Array<string>|null): boolean{
  67. if (null === profiles)
  68. return true;
  69. let hasProfile = false;
  70. profiles.map(async (profile) => {
  71. if (this.testProfile(profile))
  72. hasProfile = true;
  73. });
  74. return hasProfile;
  75. }
  76. /**
  77. * Factory pour tester le profil d'un utilisateur
  78. * @param {string} profile : profile à tester
  79. * @return {boolean}
  80. */
  81. testProfile(profile:string): boolean{
  82. const factory: {[key: string]: boolean} = {
  83. 'admin': this.accessProfile.isAdmin,
  84. 'administratifManager': this.accessProfile.isAdministratifManager,
  85. 'pedagogicManager': this.accessProfile.isPedagogicManager,
  86. 'financialManager': this.accessProfile.isFinancialManager,
  87. 'caMember': this.accessProfile.isCaMember,
  88. 'student': this.accessProfile.isStudent,
  89. 'teacher': this.accessProfile.isTeacher,
  90. 'member': this.accessProfile.isMember,
  91. 'other': this.accessProfile.isOther,
  92. 'guardian': this.accessProfile.isGuardian,
  93. 'payor': this.accessProfile.isPayor,
  94. }
  95. if(profile in factory)
  96. return factory[profile]
  97. else return false
  98. }
  99. /**
  100. * Est-ce que l'utilisateur possède un compte administrateur
  101. * @return {boolean}
  102. */
  103. isAdminAccount(): boolean{
  104. return this.accessProfile.isAdminAccess
  105. }
  106. /**
  107. * Retourne l'id de la session en cours
  108. * @return {boolean}
  109. */
  110. getCurrentAccessId(): number{
  111. return this.accessProfile.switchId ?? this.accessProfile.id
  112. }
  113. /**
  114. * Factory
  115. *
  116. * @return {AnyJson} retourne les fonction rendues publiques
  117. */
  118. handler (): AnyJson {
  119. return {
  120. hasRole: this.hasRole.bind(this),
  121. hasAbility: this.hasAbility.bind(this),
  122. hasProfile: this.hasProfile.bind(this),
  123. isAdminAccount: this.isAdminAccount.bind(this)
  124. }
  125. }
  126. }
  127. export const $accessProfile = new AccessProfile()