import {AbilitiesType, accessState, AccessStore, AnyJson} from "~/types/types"; import {Ability} from "@casl/ability"; /** * @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 * @returns {boolean} */ hasRole(roles:Array): boolean{ if (null === roles) return true; let hasRole = false; roles.map((r) => { if (this.accessProfile.roles.indexOf(r) > -1) hasRole = true; }); return hasRole; } /** * Est-ce que l'utilisateur possède l'abilité * @param {Array} ability abilité à tester * @returns {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 * @returns {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);