import axios from 'axios' const imClient = axios.create({ baseURL: 'https://dev.xuqinmin.com', timeout: 15000, }) imClient.interceptors.request.use((config) => { const token = localStorage.getItem('token') if (token) config.headers.Authorization = `Bearer ${token}` return config }) export interface ImUser { id: string appId: string userId: string nickname: string avatar?: string status: 'ACTIVE' | 'BANNED' gender: 'UNKNOWN' | 'MALE' | 'FEMALE' createdAt: number } export interface ImGroup { id: string appId: string name: string creatorId: string groupType?: string | null memberIds: string adminIds: string announcement?: string | null createdAt: number } export interface ImMessage { id: string appId: string fromUserId: string toId: string chatType: 'SINGLE' | 'GROUP' msgType: string content: string status: string mentionedUserIds?: string | null groupReadCount?: number | null createdAt: number } export interface PagedResult { content: T[] totalElements: number totalPages: number size: number number: number } export interface ImStats { totalMessages: number totalUsers: number totalGroups: number todayMessages: number } export const imAdminApi = { listUsers(appId: string, page = 0, size = 20) { return imClient.get<{ data: PagedResult }>( '/api/im/admin/users', { params: { appId, page, size } }, ) }, updateUserStatus(appId: string, userId: string, status: 'ACTIVE' | 'BANNED') { return imClient.put(`/api/im/admin/users/${encodeURIComponent(userId)}/status`, { status }, { params: { appId } }) }, listGroups(appId: string) { return imClient.get<{ data: ImGroup[] }>('/api/im/admin/groups', { params: { appId } }) }, getStats(appId: string) { return imClient.get<{ data: ImStats }>('/api/im/admin/stats', { params: { appId } }) }, getMessages( appId: string, userA: string, userB: string, page = 0, size = 20, filters?: { msgType?: string keyword?: string startTime?: string endTime?: string }, ) { return imClient.get<{ data: PagedResult }>('/api/im/admin/messages', { params: { appId, userA, userB, page, size, ...(filters?.msgType ? { msgType: filters.msgType } : {}), ...(filters?.keyword ? { keyword: filters.keyword } : {}), ...(filters?.startTime ? { startTime: filters.startTime } : {}), ...(filters?.endTime ? { endTime: filters.endTime } : {}), }, }) }, revokeMessage(appId: string, messageId: string) { return imClient.post<{ data: ImMessage }>( `/api/im/admin/messages/${encodeURIComponent(messageId)}/revoke`, {}, { params: { appId } }, ) }, dismissGroup(appId: string, groupId: string) { return imClient.delete<{ data: null }>(`/api/im/admin/groups/${encodeURIComponent(groupId)}`, { params: { appId } }) }, registerUser(appId: string, userId: string, nickname?: string, avatar?: string) { return imClient.post<{ data: ImUser }>( '/api/im/admin/users', { userId, nickname, avatar }, { params: { appId } }, ) }, createGroup(appId: string, name: string, creatorId: string, memberIds: string[]) { return imClient.post<{ data: ImGroup }>( '/api/im/admin/groups', { name, creatorId, memberIds }, { params: { appId } }, ) }, searchUsers(appId: string, keyword: string, size = 20) { return imClient.get<{ data: ImUser[] }>( '/api/im/admin/users/search', { params: { appId, keyword, size } }, ) }, }