Files
service-finder/frontend_admin/.nuxt/dist/server/_nuxt/auth-CRAMW6e4.js.map.json
2026-06-24 11:29:45 +00:00

1 line
7.2 KiB
JSON

{"file":"auth-CRAMW6e4.js","mappings":"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","names":[],"sources":["../../../../stores/auth.ts"],"sourcesContent":["import { defineStore } from 'pinia'\nimport { ref, computed } from 'vue'\n\nexport interface UserProfile {\n id: number\n email: string\n first_name: string | null\n last_name: string | null\n is_active: boolean\n role: string\n region_code: string\n subscription_plan: string\n subscription_expires_at?: string | null\n max_vehicles?: number\n max_garages?: number\n scope_level: string\n scope_id: string | null\n ui_mode: string\n active_organization_id: number | null\n preferred_language: string\n person_id: number | null\n person: Record<string, any> | null\n system_capabilities?: Record<string, boolean>\n org_capabilities?: Record<string, Record<string, boolean>>\n}\n\nexport const useAuthStore = defineStore('auth', () => {\n // ── State ──────────────────────────────────────────────────────────\n const user = ref<UserProfile | null>(null)\n const token = ref<string | null>(null)\n const isLoading = ref(false)\n const error = ref<string | null>(null)\n const isInitialized = ref(false)\n\n // ── Getters ────────────────────────────────────────────────────────\n const isAuthenticated = computed(() => !!token.value && !!user.value)\n\n const isAdmin = computed(() => {\n const role = user.value?.role\n if (!role) return false\n const staffRoles = ['SUPERADMIN', 'ADMIN', 'MODERATOR', 'SALES_REP', 'SERVICE_MGR']\n return staffRoles.includes(role.toUpperCase())\n })\n\n const userName = computed(() => {\n if (!user.value) return ''\n const { first_name, last_name } = user.value\n if (first_name && last_name) return `${first_name} ${last_name}`\n return first_name || last_name || user.value.email\n })\n\n const userEmail = computed(() => user.value?.email ?? '')\n const userRole = computed(() => user.value?.role ?? 'guest')\n\n // ── Actions ────────────────────────────────────────────────────────\n\n /**\n * Login with email + password.\n * Calls the FastAPI /auth/login endpoint using OAuth2PasswordRequestForm.\n * Stores the JWT token in a cookie (via useCookie) for SSR compatibility.\n */\n async function login(email: string, password: string) {\n isLoading.value = true\n error.value = null\n\n try {\n const body = new URLSearchParams()\n body.append('username', email)\n body.append('password', password)\n\n const res = await $fetch<{\n access_token: string\n refresh_token?: string\n token_type: string\n is_active: boolean\n }>('/api/v1/auth/login', {\n method: 'POST',\n headers: { 'Content-Type': 'application/x-www-form-urlencoded' },\n body,\n })\n\n // Persist token in a cookie (SSR-safe) and in memory\n const tokenCookie = useCookie('access_token', {\n maxAge: 60 * 60 * 24 * 7, // 7 days\n path: '/',\n sameSite: 'lax',\n secure: true,\n })\n tokenCookie.value = res.access_token\n token.value = res.access_token\n\n // Fetch user profile\n await fetchUser()\n } catch (err: any) {\n error.value = err?.data?.detail || err?.message || 'Login failed'\n throw err\n } finally {\n isLoading.value = false\n }\n }\n\n /**\n * Fetch the current user profile from /auth/me.\n */\n async function fetchUser() {\n const tokenCookie = useCookie('access_token')\n const currentToken = tokenCookie.value || token.value\n if (!currentToken) return\n\n try {\n const res = await $fetch<UserProfile>('/api/v1/auth/me', {\n headers: { Authorization: `Bearer ${currentToken}` },\n })\n user.value = res\n } catch (err: any) {\n if (err?.response?.status === 401) {\n logout()\n }\n throw err\n }\n }\n\n /**\n * Logout — clear token, user state, and cookie.\n */\n function logout() {\n token.value = null\n user.value = null\n error.value = null\n const tokenCookie = useCookie('access_token')\n tokenCookie.value = null\n }\n\n /**\n * Initialize the store on app load — if a token cookie exists, fetch the user.\n */\n async function init() {\n const tokenCookie = useCookie('access_token')\n if (tokenCookie.value) {\n token.value = tokenCookie.value\n try {\n await fetchUser()\n } catch {\n logout()\n }\n }\n isInitialized.value = true\n }\n\n /**\n * Clear any stored error message.\n */\n function clearError() {\n error.value = null\n }\n\n return {\n // State\n user,\n token,\n isLoading,\n error,\n isInitialized,\n\n // Getters\n isAuthenticated,\n isAdmin,\n userName,\n userEmail,\n userRole,\n\n // Actions\n login,\n fetchUser,\n logout,\n init,\n clearError,\n }\n})\n"],"version":3}