XuqmGroup-Web/tenant-platform/src/api/im.ts

349 行
8.8 KiB
TypeScript

import axios from 'axios'
const imClient = axios.create({
baseURL: 'http://192.168.116.9:8082',
timeout: 15000,
})
if (import.meta.env.DEV) {
imClient.interceptors.request.use((config) => {
console.debug('[tenant-platform][IM] request', {
method: config.method?.toUpperCase(),
url: config.baseURL ? `${config.baseURL}${config.url ?? ''}` : config.url,
params: config.params,
})
return config
})
imClient.interceptors.response.use((res) => {
console.debug('[tenant-platform][IM] response', {
status: res.status,
url: res.config.url,
})
return res
})
}
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 ImProfile {
id?: string
appId?: string
userId: string
nickname?: string | null
avatar?: string | null
gender?: 'UNKNOWN' | 'MALE' | 'FEMALE' | string | null
status?: 'ACTIVE' | 'BANNED' | string | null
createdAt?: number | null
}
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<T> {
content: T[]
totalElements: number
totalPages: number
size: number
number: number
}
export interface ImStats {
totalMessages: number
totalUsers: number
totalGroups: number
todayMessages: number
}
export interface OperationLog {
id: string
appId: string
operatorId: string
action: string
resourceType: string
resourceId?: string | null
detail?: string | null
createdAt: number
}
export interface FriendRequest {
id: string
appId: string
fromUserId: string
toUserId: string
remark?: string | null
status: 'PENDING' | 'ACCEPTED' | 'REJECTED'
createdAt: number
reviewedAt?: number | null
}
export interface WebhookConfig {
id: string
appId: string
url: string
secret?: string | null
enabled: boolean
createdAt: number
}
export interface WebhookConfigForm {
url: string
secret?: string
enabled?: boolean
}
export interface GroupJoinRequest {
id: string
appId: string
groupId: string
requesterId: string
remark?: string | null
status: 'PENDING' | 'ACCEPTED' | 'REJECTED'
createdAt: number
reviewedAt?: number | null
}
export const imAdminApi = {
listUsers(appId: string, page = 0, size = 20) {
return imClient.get<{ data: PagedResult<ImUser> }>(
'/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 } })
},
getOperationLogs(appId: string, page = 0, size = 20) {
return imClient.get<{ data: PagedResult<OperationLog> }>('/api/im/admin/operation-logs', {
params: { appId, page, size },
})
},
listWebhooks(appId: string) {
return imClient.get<{ data: WebhookConfig[] }>('/api/im/admin/webhooks', {
params: { appId },
})
},
createWebhook(appId: string, form: WebhookConfigForm) {
return imClient.post<{ data: WebhookConfig }>('/api/im/admin/webhooks', form, {
params: { appId },
})
},
updateWebhook(appId: string, webhookId: string, form: WebhookConfigForm) {
return imClient.put<{ data: WebhookConfig }>(`/api/im/admin/webhooks/${encodeURIComponent(webhookId)}`, form, {
params: { appId },
})
},
deleteWebhook(appId: string, webhookId: string) {
return imClient.delete<{ data: null }>(`/api/im/admin/webhooks/${encodeURIComponent(webhookId)}`, {
params: { appId },
})
},
listFriendRequests(appId: string, direction: 'incoming' | 'outgoing' = 'incoming') {
return imClient.get<{ data: FriendRequest[] }>('/api/im/friend-requests', {
params: { appId, direction },
})
},
sendFriendRequest(appId: string, toUserId: string, remark?: string) {
return imClient.post<{ data: FriendRequest }>(
'/api/im/friend-requests',
null,
{
params: {
appId,
toUserId,
...(remark ? { remark } : {}),
},
},
)
},
acceptFriendRequest(appId: string, requestId: string) {
return imClient.post<{ data: FriendRequest }>(
`/api/im/friend-requests/${encodeURIComponent(requestId)}/accept`,
null,
{ params: { appId } },
)
},
rejectFriendRequest(appId: string, requestId: string) {
return imClient.post<{ data: FriendRequest }>(
`/api/im/friend-requests/${encodeURIComponent(requestId)}/reject`,
null,
{ params: { appId } },
)
},
listGroupJoinRequests(appId: string, groupId: string) {
return imClient.get<{ data: GroupJoinRequest[] }>(
`/api/im/groups/${encodeURIComponent(groupId)}/join-requests`,
{ params: { appId } },
)
},
sendGroupJoinRequest(appId: string, groupId: string, remark?: string) {
return imClient.post<{ data: GroupJoinRequest }>(
`/api/im/groups/${encodeURIComponent(groupId)}/join-requests`,
null,
{
params: {
appId,
...(remark ? { remark } : {}),
},
},
)
},
acceptGroupJoinRequest(appId: string, groupId: string, requestId: string) {
return imClient.post<{ data: GroupJoinRequest }>(
`/api/im/groups/${encodeURIComponent(groupId)}/join-requests/${encodeURIComponent(requestId)}/accept`,
null,
{ params: { appId } },
)
},
rejectGroupJoinRequest(appId: string, groupId: string, requestId: string) {
return imClient.post<{ data: GroupJoinRequest }>(
`/api/im/groups/${encodeURIComponent(groupId)}/join-requests/${encodeURIComponent(requestId)}/reject`,
null,
{ 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<ImMessage> }>('/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 } },
)
},
getProfile(appId: string, userId: string) {
return imClient.get<{ data: ImProfile }>(
`/api/im/accounts/${encodeURIComponent(userId)}`,
{ params: { appId } },
)
},
updateProfile(appId: string, userId: string, nickname?: string, avatar?: string, gender?: string) {
return imClient.put<{ data: ImProfile }>(
`/api/im/accounts/${encodeURIComponent(userId)}`,
{},
{
params: {
appId,
...(nickname ? { nickname } : {}),
...(avatar ? { avatar } : {}),
...(gender ? { gender } : {}),
},
},
)
},
}