accessProfile.ts 3.7 KB

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