REQ-3201: 查询消息详情

This commit is contained in:
yanglin 2024-12-11 17:45:12 +08:00
parent 70aea293f5
commit b285cd694c
7 changed files with 125 additions and 38 deletions

View File

@ -5,6 +5,7 @@ import cn.axzo.im.center.api.vo.req.AsyncSendMessageParam;
import cn.axzo.im.center.api.vo.req.CustomMessageInfo;
import cn.axzo.im.center.api.vo.req.FetchUpdatableMessageRequest;
import cn.axzo.im.center.api.vo.req.GetBizMessageIdsRequest;
import cn.axzo.im.center.api.vo.req.GetMessageDetailRequest;
import cn.axzo.im.center.api.vo.req.MessageInfo;
import cn.axzo.im.center.api.vo.req.SendMessageParam;
import cn.axzo.im.center.api.vo.req.SendTemplateMessageParam;
@ -12,6 +13,7 @@ import cn.axzo.im.center.api.vo.req.UpdatableMessageAckRequest;
import cn.axzo.im.center.api.vo.req.UpdateMessageRequest;
import cn.axzo.im.center.api.vo.resp.FetchUpdatableMessageResponse;
import cn.axzo.im.center.api.vo.resp.GetBizMessageIdsResponse;
import cn.axzo.im.center.api.vo.resp.GetMessageDetailResponse;
import cn.axzo.im.center.api.vo.resp.MessageCustomResp;
import cn.axzo.im.center.api.vo.resp.MessageDispatchResp;
import cn.axzo.im.center.api.vo.resp.MessageTaskResp;
@ -77,6 +79,10 @@ public interface MessageApi {
ApiResult<FetchUpdatableMessageResponse> fetchUpdatableMessage(
@RequestBody @Validated FetchUpdatableMessageRequest request);
@PostMapping("/api/im/template-message/updatable/getMessageDetails")
ApiResult<GetMessageDetailResponse> getMessageDetails(
@RequestBody @Validated GetMessageDetailRequest request);
@PostMapping("/api/im/template-message/updatable/getBizMessageIds")
ApiResult<GetBizMessageIdsResponse> getBizMessageIds(
@RequestBody @Validated GetBizMessageIdsRequest request);

View File

@ -0,0 +1,22 @@
package cn.axzo.im.center.api.vo.req;
import lombok.Getter;
import lombok.Setter;
import javax.validation.constraints.NotEmpty;
import java.util.Set;
/**
* @author yanglin
*/
@Setter
@Getter
public class GetMessageDetailRequest {
/**
* 业务消息ID列表每次最大数量100
*/
@NotEmpty(message = "消息ID不能为空")
private Set<String> bizMessageIds;
}

View File

@ -18,7 +18,7 @@ public class FetchUpdatableMessageResponse {
/**
* 消息列表, 返回的列表为空时表示没有更多满足条件的消息.
*/
private List<MessageInfo> messages = new ArrayList<>();
private List<UpdatableMessageInfo> messages = new ArrayList<>();
/**
* 当前批次最大的更新时间
@ -30,18 +30,18 @@ public class FetchUpdatableMessageResponse {
*/
private Long minCursorId;
public void addMessage(MessageInfo message) {
public void addMessage(UpdatableMessageInfo message) {
messages.add(message);
}
public void setQueryProgress() {
if (messages == null) return;
minCursorId = messages.stream()
.mapToLong(MessageInfo::getId)
.mapToLong(UpdatableMessageInfo::getId)
.min()
.orElse(FetchUpdatableMessageRequest.DEFAULT_MIN_CURSOR_ID);
maxUpdateTime = messages.stream()
.mapToLong(MessageInfo::getUpdateTime)
.mapToLong(UpdatableMessageInfo::getUpdateTime)
.max()
.orElse(FetchUpdatableMessageRequest.DEFAULT_MAX_UPDATE_TIME);
}
@ -51,29 +51,4 @@ public class FetchUpdatableMessageResponse {
return JSON.toJSONString(this);
}
@Setter
@Getter
public static class MessageInfo {
/**
* 消息体
*/
private String msgBody;
/**
* 消息ID
*/
private Long id;
/**
* 更新时间
*/
private Long updateTime;
/**
* 业务消息ID. 用于ack
*/
private String bizMessageId;
/**
* 数据版本. 用于ack
*/
private Long dataVersion;
}
}

View File

@ -0,0 +1,25 @@
package cn.axzo.im.center.api.vo.resp;
import lombok.Getter;
import lombok.Setter;
import java.util.ArrayList;
import java.util.List;
/**
* @author yanglin
*/
@Setter
@Getter
public class GetMessageDetailResponse {
/**
* 消息列表
*/
private List<UpdatableMessageInfo> messages = new ArrayList<>();
public void addMessage(UpdatableMessageInfo message) {
messages.add(message);
}
}

View File

@ -0,0 +1,32 @@
package cn.axzo.im.center.api.vo.resp;
import lombok.Getter;
import lombok.Setter;
/**
* @author yanglin
*/
@Setter
@Getter
public class UpdatableMessageInfo {
/**
* 消息体
*/
private String msgBody;
/**
* 消息ID
*/
private Long id;
/**
* 更新时间
*/
private Long updateTime;
/**
* 业务消息ID. 用于ack
*/
private String bizMessageId;
/**
* 数据版本. 用于ack
*/
private Long dataVersion;
}

View File

@ -12,6 +12,7 @@ import cn.axzo.im.center.api.vo.req.AsyncSendMessageParam;
import cn.axzo.im.center.api.vo.req.CustomMessageInfo;
import cn.axzo.im.center.api.vo.req.FetchUpdatableMessageRequest;
import cn.axzo.im.center.api.vo.req.GetBizMessageIdsRequest;
import cn.axzo.im.center.api.vo.req.GetMessageDetailRequest;
import cn.axzo.im.center.api.vo.req.MessageInfo;
import cn.axzo.im.center.api.vo.req.SendMessageParam;
import cn.axzo.im.center.api.vo.req.SendTemplateMessageParam;
@ -19,6 +20,7 @@ import cn.axzo.im.center.api.vo.req.UpdatableMessageAckRequest;
import cn.axzo.im.center.api.vo.req.UpdateMessageRequest;
import cn.axzo.im.center.api.vo.resp.FetchUpdatableMessageResponse;
import cn.axzo.im.center.api.vo.resp.GetBizMessageIdsResponse;
import cn.axzo.im.center.api.vo.resp.GetMessageDetailResponse;
import cn.axzo.im.center.api.vo.resp.MessageCustomResp;
import cn.axzo.im.center.api.vo.resp.MessageDispatchResp;
import cn.axzo.im.center.api.vo.resp.MessageTaskResp;
@ -249,6 +251,13 @@ public class MessageController implements MessageApi {
return ApiResult.ok(resp);
}
@Override
public ApiResult<GetMessageDetailResponse> getMessageDetails(GetMessageDetailRequest request) {
log.info("getMessageDetail, request={}", request);
GetMessageDetailResponse resp = updatableMessageQueryService.getMessageDetails(request);
return ApiResult.ok(resp);
}
@Override
public ApiResult<GetBizMessageIdsResponse> getBizMessageIds(GetBizMessageIdsRequest request) {
log.info("getBizMessageIds, request={}", request);

View File

@ -2,10 +2,14 @@ package cn.axzo.im.updatable;
import cn.axzo.im.center.api.vo.req.FetchUpdatableMessageRequest;
import cn.axzo.im.center.api.vo.req.GetBizMessageIdsRequest;
import cn.axzo.im.center.api.vo.req.GetMessageDetailRequest;
import cn.axzo.im.center.api.vo.resp.FetchUpdatableMessageResponse;
import cn.axzo.im.center.api.vo.resp.GetBizMessageIdsResponse;
import cn.axzo.im.center.api.vo.resp.GetMessageDetailResponse;
import cn.axzo.im.center.api.vo.resp.UpdatableMessageInfo;
import cn.axzo.im.dao.repository.UpdatableMessageDao;
import cn.axzo.im.entity.UpdatableMessage;
import cn.axzo.im.utils.BizAssertions;
import cn.axzo.im.utils.ImProperties;
import lombok.RequiredArgsConstructor;
import org.springframework.stereotype.Component;
@ -22,6 +26,17 @@ public class UpdatableMessageQueryService {
private final UpdatableMessageDao updatableMessageDao;
private final ImProperties props;
public GetMessageDetailResponse getMessageDetails(GetMessageDetailRequest request) {
BizAssertions.assertTrue(request.getBizMessageIds().size() <= 100, "消息ID数量不能超过100");
List<UpdatableMessage> messages = updatableMessageDao.lambdaQuery()
.in(UpdatableMessage::getBizMessageId, request.getBizMessageIds())
.list();
GetMessageDetailResponse response = new GetMessageDetailResponse();
for (UpdatableMessage message : messages)
response.addMessage(toMessageInfo(message));
return response;
}
public FetchUpdatableMessageResponse fetchUpdatableMessage(FetchUpdatableMessageRequest request) {
int maxSize = props.getUpdatable().getFetchMaxSize();
List<UpdatableMessage> messages = updatableMessageDao.lambdaQuery()
@ -32,19 +47,22 @@ public class UpdatableMessageQueryService {
.last("LIMIT " + maxSize)
.list();
FetchUpdatableMessageResponse response = new FetchUpdatableMessageResponse();
for (UpdatableMessage message : messages) {
FetchUpdatableMessageResponse.MessageInfo imMessage = new FetchUpdatableMessageResponse.MessageInfo();
imMessage.setMsgBody(message.getBizBody().toJSONString());
imMessage.setBizMessageId(message.getBizMessageId());
imMessage.setId(message.getId());
imMessage.setUpdateTime(message.getUpdateAt().getTime());
imMessage.setDataVersion(message.getDataVersion());
response.addMessage(imMessage);
}
for (UpdatableMessage message : messages)
response.addMessage(toMessageInfo(message));
response.setQueryProgress();
return response;
}
private static UpdatableMessageInfo toMessageInfo(UpdatableMessage message) {
UpdatableMessageInfo imMessage = new UpdatableMessageInfo();
imMessage.setMsgBody(message.getBizBody().toJSONString());
imMessage.setBizMessageId(message.getBizMessageId());
imMessage.setId(message.getId());
imMessage.setUpdateTime(message.getUpdateAt().getTime());
imMessage.setDataVersion(message.getDataVersion());
return imMessage;
}
public GetBizMessageIdsResponse getBizMessageIds(GetBizMessageIdsRequest request) {
List<UpdatableMessage> messages = updatableMessageDao.getByNimMessageIds(request.getNimMessageIds());
GetBizMessageIdsResponse response = new GetBizMessageIdsResponse();