import { Ability } from '@casl/ability' import { AbilitiesType, accessState, AccessStore, AnyJson } from '~/types/interfaces' /** * @category Services/profiles * @class AccessProfile * Classe répondant aux différentes questions que l'on peut se poser sur l'access connecté */ class AccessProfile { private accessProfile: accessState private $ability: Ability = {} as Ability /** * @constructor * @param {AccessStore} store State Access du Store contenant les informations de l'utilisateur * @param {Ability} ability Plugin $ability */ constructor (store: AccessStore, ability: Ability) { this.accessProfile = store.state.profile.access this.$ability = ability } /** * Est-ce que l'utilisateur possède le role. * @param {Array} roles roles à tester * @return {boolean} */ hasRole (roles: Array): boolean { if (roles === null) { return true } let hasRole = false roles.map((r) => { if (this.accessProfile.roles.includes(r)) { hasRole = true } }) return hasRole } /** * Est-ce que l'utilisateur possède l'habilité * @param {Array} ability habilité à tester * @return {boolean} */ hasAbility (ability: Array): boolean { if (ability === null) { return true } let hasAbility = false ability.map((ability) => { if (this.$ability.can(ability.action, ability.subject)) { hasAbility = true } }) return hasAbility } /** * Factory * @return {AnyJson} retourne les fonction rendues publiques */ handler (): AnyJson { return { hasRole: this.hasRole.bind(this), hasAbility: this.hasAbility.bind(this) } } } export const $accessProfile = (store:AccessStore, ability:Ability) => new AccessProfile(store, ability)