import { defineStore } from 'pinia' import { computed, ref } from 'vue' import type { Ref } from 'vue' import * as _ from 'lodash-es' import RoleUtils from '~/services/rights/roleUtils' import type { AbilitiesType, Historical, BaseOrganizationProfile, BaseAccessProfile, OrignalAccessProfile, AccessProfile, } from '~/types/interfaces' export const useAccessProfileStore = defineStore('accessProfile', () => { // State const bearer: Ref = ref(null) const id: Ref = ref(null) const switchId: Ref = ref(null) const name: Ref = ref(null) const givenName: Ref = ref(null) const gender: Ref = ref(null) const avatarId: Ref = ref(null) const activityYear: Ref = ref(null) const historical: Ref = ref({ future: false, past: false, present: true, }) const roles: Ref> = ref([]) const abilities: Ref> = ref([]) const isAdminAccess: Ref = ref(false) const isSuperAdminAccess: Ref = ref(false) const isAdmin: Ref = ref(false) const isAdministratifManager: Ref = ref(false) const isPedagogicManager: Ref = ref(false) const isFinancialManager: Ref = ref(false) const isCaMember: Ref = ref(false) const isStudent: Ref = ref(false) const isTeacher: Ref = ref(false) const isMember: Ref = ref(false) const isOther: Ref = ref(false) const isGuardian: Ref = ref(false) const isPayer: Ref = ref(false) const multiAccesses: Ref> = ref([]) const familyAccesses: Ref> = ref([]) const originalAccess: Ref = ref(null) const preferencesId: Ref = ref(null) // Getters /** * Retourne l'id de la session en cours * @return {boolean} */ const currentAccessId = computed((): number => { return !switchId.value || isNaN(switchId.value) ? id.value! : switchId.value }) /** * Est-ce que l'utilisateur possède un compte administrateur * @return {boolean} */ const isAdminAccount = computed((): boolean => { return isAdminAccess.value ?? false }) // Actions const setMultiAccesses = (organizations: Array) => { _.each(organizations, (organization: BaseOrganizationProfile) => { multiAccesses.value.push({ id: organization.id, name: organization.name, }) }) } const setFamilyAccesses = (accesses: Array) => { _.each(accesses, (access: BaseAccessProfile) => { const a: BaseAccessProfile = { id: access.id, name: access.name, givenName: access.givenName, gender: access.gender, avatarId: access.avatarId, } familyAccesses.value.push(a) }) } /** * Est-ce que l'utilisateur possède le rôle donné ? * * @return {boolean} * @param role */ const hasRole = (role: string): boolean => { return roles.value && roles.value.includes(role) } /** * /!\ Server-side only * * @param profile */ const initiateProfile = (profile: AccessProfile): void => { const profileRoles: Array = Array.from(Object.values(profile.roles)) // TODO: pqoi est-ce qu'on ne conserve pas les roles fonction et qu'on ne fait pas de ces méthodes des computed? // est-ce que ce ne serait pas plus intuitif? si on fait ça, attention à maj l'abilityBuilder isAdmin.value = RoleUtils.isA('ADMIN', profileRoles) isAdministratifManager.value = RoleUtils.isA( 'ADMINISTRATIF_MANAGER', profileRoles, ) isPedagogicManager.value = RoleUtils.isA('PEDAGOGICS_MANAGER', profileRoles) isFinancialManager.value = RoleUtils.isA('FINANCIAL_MANAGER', profileRoles) isCaMember.value = RoleUtils.isA('CA', profileRoles) isStudent.value = RoleUtils.isA('STUDENT', profileRoles) isTeacher.value = RoleUtils.isA('TEACHER', profileRoles) isMember.value = RoleUtils.isA('MEMBER', profileRoles) isOther.value = RoleUtils.isA('OTHER', profileRoles) roles.value = RoleUtils.filterFunctionRoles(profileRoles) setProfile(profile) } const setProfile = (profile: AccessProfile): void => { name.value = profile.name givenName.value = profile.givenName gender.value = profile.gender avatarId.value = profile.avatarId activityYear.value = profile.activityYear historical.value = profile.historical isAdminAccess.value = profile.isAdminAccess isGuardian.value = profile.isGuardian isPayer.value = profile.isPayer preferencesId.value = profile.preferencesId // Add the original Access (switch User case) if (profile.originalAccess !== null) { originalAccess.value = { id: profile.originalAccess.id, name: profile.originalAccess.name, givenName: profile.originalAccess.givenName, gender: profile.originalAccess.gender, isSuperAdminAccess: profile.originalAccess.isSuperAdminAccess, avatarId: profile.originalAccess.avatarId, organization: { id: profile.originalAccess.organization.id, name: profile.originalAccess.organization.name, } as BaseOrganizationProfile, } as OrignalAccessProfile } // Set multi-accesses setMultiAccesses(Array.from(profile.multiAccesses)) // Set family-accesses setFamilyAccesses(Array.from(profile.familyAccesses)) } const setHistorical = (past: boolean, present: boolean, future: boolean) => { historical.value = { past, present, future, } } const setHistoricalRange = (dateStart: string, dateEnd: string) => { historical.value = { past: false, present: false, future: false, dateStart, dateEnd, } } return { bearer, id, switchId, name, givenName, gender, avatarId, activityYear, historical, roles, abilities, isAdminAccess, isSuperAdminAccess, isAdmin, isAdministratifManager, isPedagogicManager, isFinancialManager, isCaMember, isStudent, isTeacher, isMember, isOther, isGuardian, isPayer, multiAccesses, familyAccesses, originalAccess, isAdminAccount, currentAccessId, hasRole, setMultiAccesses, setFamilyAccesses, initiateProfile, setProfile, setHistorical, setHistoricalRange, preferencesId, } })