import {defineStore} from 'pinia' import type {UserData} from '~/services/dto/user-data' import {getCurrentUser, createUser, updateUser, login, logout} from '~/services/auth' import type {UserPayload} from "~/services/dto/user-data"; import {userHasRole} from '~/utils/roles' export const useAuthStore = defineStore('auth', { state: () => ({ user: null as UserData | null, isLoading: false, checked: false }), getters: { isAuthenticated: (state) => Boolean(state.user), hasRole: (state) => (role: string): boolean => userHasRole(state.user?.roles, role), isAdmin: (state) => userHasRole(state.user?.roles, 'ROLE_ADMIN'), isBureau: (state) => userHasRole(state.user?.roles, 'ROLE_BUREAU') }, actions: { clearSession() { this.user = null this.checked = true this.isLoading = false }, async ensureSession() { if (this.checked) { return this.user } this.checked = true try { const me = await getCurrentUser() this.user = me return me } catch { this.user = null return null } }, async login(username: string, password: string) { this.isLoading = true try { await login(username, password) const me = await getCurrentUser() this.user = me this.checked = true return me } finally { this.isLoading = false } }, async createUser(payload: UserPayload = {}) { this.isLoading = true const result = await createUser(payload).finally(() => { this.isLoading = false }) return result }, async updateUser(id: number, payload: UserPayload) { this.isLoading = true const result = await updateUser(id, payload).finally(() => { this.isLoading = false }) return result }, async logout() { this.isLoading = true try { await logout() } catch { // Ignore logout errors so we can still clear local auth state. } finally { this.user = null this.checked = true this.isLoading = false } }, } })