import request from '../utils/request'
/**
* @module ChatAPI
* @description 包含与聊天、会话及消息相关的 API 请求。
*/
/**
* @typedef {object} GetOrCreateConversationRequest
* @property {string} targetUserId - 对话目标用户的 ID。
*/
/**
* @typedef {object} GetMessagesForConversationQueryParams
* @property {number} [page=1] - 页码(从 1 开始)。
* @property {number} [limit=20] - 每页消息数量。
*/
/**
* @typedef {object} SendMessageRequest
* @property {string} content - 消息内容。
* @property {'text'|'image'|'file'|'system'} messageType - 消息类型。
* @property {string[]} [repliedTo] - 被回复的消息ID数组(可选,根据代码实现推断)。
*/
/**
* @typedef {object} SendMessageInChannelRequest
* @property {string} channelId - 频道 ID。
* @property {string} content - 消息内容。
* @property {string} [messageType='text'] - 消息类型,如 text、image 等,默认为 text。
* @property {string[]} [mentionIds] - 被提及的用户ID数组(可选,Swagger中未明确但为常见字段)。
* @property {string[]} [repliedTo] - 被回复的消息ID数组(可选,根据代码实现推断)。
*/
/**
* @typedef {object} UploadImageAPIRequest
* @property {string} conversationId - 会话 ID(私聊或频道)。
* @property {File} file - 要上传的图片文件。
*/
/**
* @typedef {object} SearchMessageRequest
* @property {string} conversationId - 会话 ID。
* @property {string} searchTerm - 搜索关键词。
* @property {number} [page=1] - 当前页码(默认为 1)。
* @property {number} [limit=20] - 每页数量(默认为 20)。
*/
/**
* @typedef {object} ToggleMuteConversationRequest
* @property {string} conversationId - 会话 ID。
* @property {boolean} mute - 是否设为免打扰(true 为设为免打扰,false 为取消)。
*/
/**
* 拿到用户所有会话列表。
* @function getUserConversations
* @returns {Promise<object>} 包含用户会话列表的 Promise 对象。
*/
export const getUserConversations = () => {
return request.get('/api/chat/conversations')
}
/**
* 拿到用户会话的消息列表。
* @function getMessagesForConversation
* @param {string} conversationId - 会话 ID。
* @param {GetMessagesForConversationQueryParams} params - 查询参数,包含页码和每页消息数量。
* @returns {Promise<object>} 包含会话消息列表的 Promise 对象。
*/
export const getMessagesForConversation = (
conversationId,
page = 1,
limit = 20
) => {
return request.get(`/api/chat/conversations/${conversationId}/messages`, {
params: {
page,
limit
}
})
}
/**
* 获取或创建会话。
* @function getOrCreateConversation
* @param {GetOrCreateConversationRequest} data - 请求体数据,包含对话目标用户的 ID。
* @returns {Promise<object>} 包含会话信息的 Promise 对象。
*/
export const getOrCreateConversation = (targetUserId) => {
return request.post('/api/chat/conversations', {
targetUserId
})
}
/**
* 发送私信消息。
* @function sendMessage
* @param {object} conversationData - 消息数据。
* @param {string} conversationData.conversationId - 会话 ID。
* @param {string} conversationData.content - 消息内容。
* @param {'text'|'image'|'file'|'system'} conversationData.messageType - 消息类型。
* @param {string[]} [conversationData.repliedTo=[]] - 被回复的消息ID数组(可选)。
* @returns {Promise<object>} 包含发送消息结果的 Promise 对象。
*/
export const sendMessage = (conversationData) => {
const {
conversationId,
content,
messageType,
repliedTo = []
} = conversationData
return request.post(`/api/chat/conversations/${conversationId}/messages`, {
content,
messageType,
repliedTo
})
}
/**
* 将消息标记为已读。
* @function markAsRead
* @param {string} conversationId - 需要标记为已读的会话 ID。
* @returns {Promise<object>} 包含操作结果的 Promise 对象。
*/
export const markAsRead = (conversationId) => {
return request.post(`/api/chat/conversations/${conversationId}/read`)
}
/**
* 发送频道消息。
* @function sendMessageInChannel
* @param {SendMessageInChannelRequest} data - 频道消息数据,包含频道ID、内容、消息类型、提及用户ID和回复消息ID。
* @returns {Promise<object>} 包含发送消息结果的 Promise 对象。
*/
export const sendMessageInChannel = (data) => {
const {
channelId,
content,
messageType = 'text',
mentionIds,
repliedTo = []
} = data
return request.post(`/api/chat/channels/${channelId}/messages`, {
content,
messageType,
mentionIds,
repliedTo
})
}
/**
* 上传消息图片。
* @function uploadImageAPI
* @param {UploadImageAPIRequest} data - 图片上传数据,包含会话ID和图片文件。
* @returns {Promise<object>} 包含图片上传结果的 Promise 对象。
*/
export const uploadImageAPI = (data) => {
const { conversationId, file } = data
const formData = new FormData()
formData.append('image', file)
return request.post(`/api/chat/image/${conversationId}`, formData, {
headers: {
'Content-Type': 'multipart/form-data'
}
})
}
/**
* 搜索会话消息。
* @function searchMessage
* @param {SearchMessageRequest} data - 搜索参数,包含会话ID、搜索关键词、页码和每页数量。
* @returns {Promise<object>} 包含搜索结果列表的 Promise 对象。
*/
export const searchMessage = (data) => {
const { conversationId, searchTerm, page = 1, limit = 20 } = data
return request.get(
`api/chat/conversations/${conversationId}/messages/search`,
{
params: {
q: searchTerm,
page,
limit
}
}
)
}
/**
* 静音/解除静音会话。
* @function toggleMuteConversation
* @param {ToggleMuteConversationRequest} data - 静音操作数据,包含会话ID和静音状态。
* @returns {Promise<object>} 包含操作结果的 Promise 对象。
*/
export const toggleMuteConversation = (data) => {
const { conversationId, mute } = data
return request.post(`api/chat/conversations/${conversationId}/mute`, {
mute
})
}