import { defineStore } from "pinia"; import { computed, ref } from "vue"; import { http } from "@/modules/admin/api/http"; export type UserProfile = { id: number; username: string; nickname: string; email?: string | null; phone?: string | null; role_id: number; }; export type Permission = { id: number; name: string; code: string; parentid: number; description?: string | null; }; export type MenuItem = { id: number; name: string; code: string; parentid: number; route: string; description?: string; children: MenuItem[]; }; export type RolePermissionResponse = { role_id: number; role_name: string; permissions: Permission[]; menu: MenuItem[]; }; export const useAuthStore = defineStore("auth", () => { const token = ref(localStorage.getItem("access_token") || ""); const user = ref(null); const permissions = ref([]); const menu = ref([]); const isAuthenticated = computed(() => Boolean(token.value)); const permissionCodes = computed(() => permissions.value.map(p => p.code)); function setToken(t: string) { token.value = t; if (t) { localStorage.setItem("access_token", t); } else { localStorage.removeItem("access_token"); } } async function fetchProfile() { const { data } = await http.get("/users/me"); user.value = data; return data; } async function fetchPermissions() { const { data } = await http.get("/permissions/user/me"); permissions.value = data.permissions || []; menu.value = data.menu || []; return { permissions: permissions.value, menu: menu.value }; } async function loginAndFetchData() { await fetchProfile(); await fetchPermissions(); } function hasPermission(code: string): boolean { return permissionCodes.value.includes(code); } function hasAnyPermission(codes: string[]): boolean { return codes.some(code => permissionCodes.value.includes(code)); } async function logout() { try { await http.post("/users/logout"); } catch { /* ignore */ } user.value = null; permissions.value = []; menu.value = []; setToken(""); } return { token, user, permissions, menu, permissionCodes, isAuthenticated, setToken, fetchProfile, fetchPermissions, loginAndFetchData, hasPermission, hasAnyPermission, logout, }; });