137 lines
3.9 KiB
TypeScript
137 lines
3.9 KiB
TypeScript
|
|
import type {
|
||
|
|
AdminUser,
|
||
|
|
DashboardStats,
|
||
|
|
AuditLog,
|
||
|
|
} from '@/types/admin'
|
||
|
|
import type { PaginatedResult, PaginationParams } from '@/types/api'
|
||
|
|
import { api } from './http-client'
|
||
|
|
import { MOCK_DASHBOARD_STATS, MOCK_AUDIT_LOGS } from './mock-data'
|
||
|
|
|
||
|
|
// ── Auth ──────────────────────────────────────────────
|
||
|
|
|
||
|
|
interface LoginResponse {
|
||
|
|
accessToken: string
|
||
|
|
refreshToken: string
|
||
|
|
adminUser: AdminUser
|
||
|
|
}
|
||
|
|
|
||
|
|
export function loginAdmin(email: string, password: string): Promise<LoginResponse> {
|
||
|
|
return api.post<LoginResponse>('/admin-api/auth/login', { email, password })
|
||
|
|
}
|
||
|
|
|
||
|
|
interface TokenPair {
|
||
|
|
accessToken: string
|
||
|
|
refreshToken: string
|
||
|
|
adminUser: AdminUser
|
||
|
|
}
|
||
|
|
|
||
|
|
export function refreshAdminToken(refreshToken: string): Promise<TokenPair> {
|
||
|
|
return api.post<TokenPair>('/admin-api/auth/refresh', { refreshToken })
|
||
|
|
}
|
||
|
|
|
||
|
|
export function logoutAdmin(refreshToken: string): Promise<void> {
|
||
|
|
return api.post<void>('/admin-api/auth/logout', { refreshToken })
|
||
|
|
}
|
||
|
|
|
||
|
|
export function getCurrentAdmin(): Promise<AdminUser> {
|
||
|
|
return api.get<AdminUser>('/admin-api/auth/me')
|
||
|
|
}
|
||
|
|
|
||
|
|
// ── Dashboard ─────────────────────────────────────────
|
||
|
|
|
||
|
|
export async function getDashboardStats(): Promise<DashboardStats> {
|
||
|
|
try {
|
||
|
|
return await api.get<DashboardStats>('/admin-api/dashboard/stats')
|
||
|
|
} catch {
|
||
|
|
if (import.meta.env.DEV) return MOCK_DASHBOARD_STATS
|
||
|
|
throw new Error('获取仪表盘数据失败')
|
||
|
|
}
|
||
|
|
}
|
||
|
|
|
||
|
|
// ── Admin Users ───────────────────────────────────────
|
||
|
|
|
||
|
|
export interface AdminUsersQuery extends PaginationParams {
|
||
|
|
search?: string
|
||
|
|
role?: string
|
||
|
|
status?: string
|
||
|
|
}
|
||
|
|
|
||
|
|
export async function getAdminUsers(
|
||
|
|
params: AdminUsersQuery,
|
||
|
|
): Promise<PaginatedResult<AdminUser>> {
|
||
|
|
try {
|
||
|
|
return await api.get<PaginatedResult<AdminUser>>(
|
||
|
|
`/admin-api/admin-users?${new URLSearchParams(params as Record<string, string>).toString()}`,
|
||
|
|
)
|
||
|
|
} catch {
|
||
|
|
if (import.meta.env.DEV) {
|
||
|
|
return {
|
||
|
|
items: [],
|
||
|
|
total: 0,
|
||
|
|
page: params.page ?? 1,
|
||
|
|
limit: params.limit ?? 20,
|
||
|
|
totalPages: 0,
|
||
|
|
}
|
||
|
|
}
|
||
|
|
throw new Error('获取管理员列表失败')
|
||
|
|
}
|
||
|
|
}
|
||
|
|
|
||
|
|
export function getAdminUserById(id: string): Promise<AdminUser> {
|
||
|
|
return api.get<AdminUser>(`/admin-api/admin-users/${id}`)
|
||
|
|
}
|
||
|
|
|
||
|
|
export function createAdminUser(data: {
|
||
|
|
email: string
|
||
|
|
password: string
|
||
|
|
displayName: string
|
||
|
|
role: string
|
||
|
|
}): Promise<AdminUser> {
|
||
|
|
return api.post<AdminUser>('/admin-api/admin-users', data)
|
||
|
|
}
|
||
|
|
|
||
|
|
export function updateAdminUser(
|
||
|
|
id: string,
|
||
|
|
data: { role?: string; status?: string; displayName?: string },
|
||
|
|
): Promise<AdminUser> {
|
||
|
|
return api.put<AdminUser>(`/admin-api/admin-users/${id}`, data)
|
||
|
|
}
|
||
|
|
|
||
|
|
export function deleteAdminUser(id: string): Promise<void> {
|
||
|
|
return api.delete<void>(`/admin-api/admin-users/${id}`)
|
||
|
|
}
|
||
|
|
|
||
|
|
// ── Audit Logs ────────────────────────────────────────
|
||
|
|
|
||
|
|
export interface AuditLogsQuery extends PaginationParams {
|
||
|
|
adminUserId?: string
|
||
|
|
action?: string
|
||
|
|
startDate?: string
|
||
|
|
endDate?: string
|
||
|
|
}
|
||
|
|
|
||
|
|
export async function getAuditLogs(
|
||
|
|
params: AuditLogsQuery,
|
||
|
|
): Promise<PaginatedResult<AuditLog>> {
|
||
|
|
try {
|
||
|
|
return await api.get<PaginatedResult<AuditLog>>(
|
||
|
|
`/admin-api/audit-logs?${new URLSearchParams(params as Record<string, string>).toString()}`,
|
||
|
|
)
|
||
|
|
} catch {
|
||
|
|
if (import.meta.env.DEV) {
|
||
|
|
return {
|
||
|
|
items: MOCK_AUDIT_LOGS,
|
||
|
|
total: MOCK_AUDIT_LOGS.length,
|
||
|
|
page: params.page ?? 1,
|
||
|
|
limit: params.limit ?? 20,
|
||
|
|
totalPages: 1,
|
||
|
|
}
|
||
|
|
}
|
||
|
|
throw new Error('获取审计日志失败')
|
||
|
|
}
|
||
|
|
}
|
||
|
|
|
||
|
|
export function getAuditLogById(id: string): Promise<AuditLog> {
|
||
|
|
return api.get<AuditLog>(`/admin-api/audit-logs/${id}`)
|
||
|
|
}
|