diff --git a/mallchat-chat-server/src/main/java/com/abin/mallchat/common/chat/domain/entity/msg/MessageExtra.java b/mallchat-chat-server/src/main/java/com/abin/mallchat/common/chat/domain/entity/msg/MessageExtra.java
index fa085b9..a357f69 100644
--- a/mallchat-chat-server/src/main/java/com/abin/mallchat/common/chat/domain/entity/msg/MessageExtra.java
+++ b/mallchat-chat-server/src/main/java/com/abin/mallchat/common/chat/domain/entity/msg/MessageExtra.java
@@ -2,6 +2,7 @@ package com.abin.mallchat.common.chat.domain.entity.msg;
import com.abin.mallchat.common.common.utils.discover.domain.UrlInfo;
import com.fasterxml.jackson.annotation.JsonIgnoreProperties;
+import com.fasterxml.jackson.annotation.JsonInclude;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
@@ -21,6 +22,7 @@ import java.util.Map;
@AllArgsConstructor
@NoArgsConstructor
@JsonIgnoreProperties(ignoreUnknown = true)
+@JsonInclude(JsonInclude.Include.NON_NULL)
public class MessageExtra implements Serializable {
private static final long serialVersionUID = 1L;
//url跳转链接
diff --git a/mallchat-chat-server/src/main/java/com/abin/mallchat/common/chat/service/impl/ChatServiceImpl.java b/mallchat-chat-server/src/main/java/com/abin/mallchat/common/chat/service/impl/ChatServiceImpl.java
index 150fce8..53ac386 100644
--- a/mallchat-chat-server/src/main/java/com/abin/mallchat/common/chat/service/impl/ChatServiceImpl.java
+++ b/mallchat-chat-server/src/main/java/com/abin/mallchat/common/chat/service/impl/ChatServiceImpl.java
@@ -104,15 +104,11 @@ public class ChatServiceImpl implements ChatService {
@Transactional
public Long sendMsg(ChatMessageReq request, Long uid) {
check(request, uid);
- AbstractMsgHandler msgHandler = MsgHandlerFactory.getStrategyNoNull(request.getMsgType());//todo 这里先不扩展,后续再改
- msgHandler.checkMsg(request, uid);
- //同步获取消息的跳转链接标题
- Message insert = MessageAdapter.buildMsgSave(request, uid);
- messageDao.save(insert);
- msgHandler.saveMsg(insert, request);
+ AbstractMsgHandler> msgHandler = MsgHandlerFactory.getStrategyNoNull(request.getMsgType());
+ Long msgId = msgHandler.checkAndSaveMsg(request, uid);
//发布消息发送事件
- applicationEventPublisher.publishEvent(new MessageSendEvent(this, insert.getId()));
- return insert.getId();
+ applicationEventPublisher.publishEvent(new MessageSendEvent(this, msgId));
+ return msgId;
}
private void check(ChatMessageReq request, Long uid) {
diff --git a/mallchat-chat-server/src/main/java/com/abin/mallchat/common/chat/service/strategy/msg/AbstractMsgHandler.java b/mallchat-chat-server/src/main/java/com/abin/mallchat/common/chat/service/strategy/msg/AbstractMsgHandler.java
index 6fca490..ec66980 100644
--- a/mallchat-chat-server/src/main/java/com/abin/mallchat/common/chat/service/strategy/msg/AbstractMsgHandler.java
+++ b/mallchat-chat-server/src/main/java/com/abin/mallchat/common/chat/service/strategy/msg/AbstractMsgHandler.java
@@ -1,20 +1,32 @@
package com.abin.mallchat.common.chat.service.strategy.msg;
+import cn.hutool.core.bean.BeanUtil;
+import com.abin.mallchat.common.chat.dao.MessageDao;
import com.abin.mallchat.common.chat.domain.entity.Message;
import com.abin.mallchat.common.chat.domain.enums.MessageTypeEnum;
import com.abin.mallchat.common.chat.domain.vo.request.ChatMessageReq;
+import com.abin.mallchat.common.chat.service.adapter.MessageAdapter;
+import com.abin.mallchat.common.common.utils.AssertUtil;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.transaction.annotation.Transactional;
import javax.annotation.PostConstruct;
+import java.lang.reflect.ParameterizedType;
/**
* Description: 消息处理器抽象类
* Author: abin
* Date: 2023-06-04
*/
-public abstract class AbstractMsgHandler {
+public abstract class AbstractMsgHandler {
+ @Autowired
+ private MessageDao messageDao;
+ private Class bodyClass;
@PostConstruct
private void init() {
+ ParameterizedType genericSuperclass = (ParameterizedType) this.getClass().getGenericSuperclass();
+ this.bodyClass = (Class) genericSuperclass.getActualTypeArguments()[0];
MsgHandlerFactory.register(getMsgTypeEnum().getType(), this);
}
@@ -23,15 +35,33 @@ public abstract class AbstractMsgHandler {
*/
abstract MessageTypeEnum getMsgTypeEnum();
- /**
- * 校验消息——保存前校验
- */
- public abstract void checkMsg(ChatMessageReq req, Long uid);
+ protected void checkMsg(Req body, Long roomId, Long uid) {
- /**
- * 保存消息
- */
- public abstract void saveMsg(Message msg, ChatMessageReq req);
+ }
+
+ @Transactional
+ public Long checkAndSaveMsg(ChatMessageReq request, Long uid) {
+ Req body = this.toBean(request.getBody());
+ //统一校验
+ AssertUtil.allCheckValidateThrow(body);
+ //子类扩展校验
+ checkMsg(body, request.getRoomId(), uid);
+ Message insert = MessageAdapter.buildMsgSave(request, uid);
+ //统一保存
+ messageDao.save(insert);
+ //子类扩展保存
+ saveMsg(insert, body);
+ return insert.getId();
+ }
+
+ private Req toBean(Object body) {
+ if (bodyClass.isAssignableFrom(body.getClass())) {
+ return (Req) body;
+ }
+ return BeanUtil.toBean(body, bodyClass);
+ }
+
+ protected abstract void saveMsg(Message message, Req body);
/**
* 展示消息
diff --git a/mallchat-chat-server/src/main/java/com/abin/mallchat/common/chat/service/strategy/msg/EmojisMsgHandler.java b/mallchat-chat-server/src/main/java/com/abin/mallchat/common/chat/service/strategy/msg/EmojisMsgHandler.java
index 7c1854e..ecd527b 100644
--- a/mallchat-chat-server/src/main/java/com/abin/mallchat/common/chat/service/strategy/msg/EmojisMsgHandler.java
+++ b/mallchat-chat-server/src/main/java/com/abin/mallchat/common/chat/service/strategy/msg/EmojisMsgHandler.java
@@ -1,13 +1,10 @@
package com.abin.mallchat.common.chat.service.strategy.msg;
-import cn.hutool.core.bean.BeanUtil;
import com.abin.mallchat.common.chat.dao.MessageDao;
import com.abin.mallchat.common.chat.domain.entity.Message;
import com.abin.mallchat.common.chat.domain.entity.msg.EmojisMsgDTO;
import com.abin.mallchat.common.chat.domain.entity.msg.MessageExtra;
import com.abin.mallchat.common.chat.domain.enums.MessageTypeEnum;
-import com.abin.mallchat.common.chat.domain.vo.request.ChatMessageReq;
-import com.abin.mallchat.common.common.utils.AssertUtil;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
@@ -19,7 +16,7 @@ import java.util.Optional;
* Date: 2023-06-04
*/
@Component
-public class EmojisMsgHandler extends AbstractMsgHandler {
+public class EmojisMsgHandler extends AbstractMsgHandler {
@Autowired
private MessageDao messageDao;
@@ -29,14 +26,7 @@ public class EmojisMsgHandler extends AbstractMsgHandler {
}
@Override
- public void checkMsg(ChatMessageReq request, Long uid) {
- EmojisMsgDTO body = BeanUtil.toBean(request.getBody(), EmojisMsgDTO.class);
- AssertUtil.allCheckValidateThrow(body);
- }
-
- @Override
- public void saveMsg(Message msg, ChatMessageReq request) {
- EmojisMsgDTO body = BeanUtil.toBean(request.getBody(), EmojisMsgDTO.class);
+ public void saveMsg(Message msg, EmojisMsgDTO body) {
MessageExtra extra = Optional.ofNullable(msg.getExtra()).orElse(new MessageExtra());
Message update = new Message();
update.setId(msg.getId());
diff --git a/mallchat-chat-server/src/main/java/com/abin/mallchat/common/chat/service/strategy/msg/FileMsgHandler.java b/mallchat-chat-server/src/main/java/com/abin/mallchat/common/chat/service/strategy/msg/FileMsgHandler.java
index 485894c..6138c32 100644
--- a/mallchat-chat-server/src/main/java/com/abin/mallchat/common/chat/service/strategy/msg/FileMsgHandler.java
+++ b/mallchat-chat-server/src/main/java/com/abin/mallchat/common/chat/service/strategy/msg/FileMsgHandler.java
@@ -1,13 +1,10 @@
package com.abin.mallchat.common.chat.service.strategy.msg;
-import cn.hutool.core.bean.BeanUtil;
import com.abin.mallchat.common.chat.dao.MessageDao;
import com.abin.mallchat.common.chat.domain.entity.Message;
import com.abin.mallchat.common.chat.domain.entity.msg.FileMsgDTO;
import com.abin.mallchat.common.chat.domain.entity.msg.MessageExtra;
import com.abin.mallchat.common.chat.domain.enums.MessageTypeEnum;
-import com.abin.mallchat.common.chat.domain.vo.request.ChatMessageReq;
-import com.abin.mallchat.common.common.utils.AssertUtil;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
@@ -19,7 +16,7 @@ import java.util.Optional;
* Date: 2023-06-04
*/
@Component
-public class FileMsgHandler extends AbstractMsgHandler {
+public class FileMsgHandler extends AbstractMsgHandler {
@Autowired
private MessageDao messageDao;
@@ -29,14 +26,7 @@ public class FileMsgHandler extends AbstractMsgHandler {
}
@Override
- public void checkMsg(ChatMessageReq request, Long uid) {
- FileMsgDTO body = BeanUtil.toBean(request.getBody(), FileMsgDTO.class);
- AssertUtil.allCheckValidateThrow(body);
- }
-
- @Override
- public void saveMsg(Message msg, ChatMessageReq request) {
- FileMsgDTO body = BeanUtil.toBean(request.getBody(), FileMsgDTO.class);
+ public void saveMsg(Message msg, FileMsgDTO body) {
MessageExtra extra = Optional.ofNullable(msg.getExtra()).orElse(new MessageExtra());
Message update = new Message();
update.setId(msg.getId());
diff --git a/mallchat-chat-server/src/main/java/com/abin/mallchat/common/chat/service/strategy/msg/ImgMsgHandler.java b/mallchat-chat-server/src/main/java/com/abin/mallchat/common/chat/service/strategy/msg/ImgMsgHandler.java
index 12434e0..3732363 100644
--- a/mallchat-chat-server/src/main/java/com/abin/mallchat/common/chat/service/strategy/msg/ImgMsgHandler.java
+++ b/mallchat-chat-server/src/main/java/com/abin/mallchat/common/chat/service/strategy/msg/ImgMsgHandler.java
@@ -1,13 +1,10 @@
package com.abin.mallchat.common.chat.service.strategy.msg;
-import cn.hutool.core.bean.BeanUtil;
import com.abin.mallchat.common.chat.dao.MessageDao;
import com.abin.mallchat.common.chat.domain.entity.Message;
import com.abin.mallchat.common.chat.domain.entity.msg.ImgMsgDTO;
import com.abin.mallchat.common.chat.domain.entity.msg.MessageExtra;
import com.abin.mallchat.common.chat.domain.enums.MessageTypeEnum;
-import com.abin.mallchat.common.chat.domain.vo.request.ChatMessageReq;
-import com.abin.mallchat.common.common.utils.AssertUtil;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
@@ -19,7 +16,7 @@ import java.util.Optional;
* Date: 2023-06-04
*/
@Component
-public class ImgMsgHandler extends AbstractMsgHandler {
+public class ImgMsgHandler extends AbstractMsgHandler {
@Autowired
private MessageDao messageDao;
@@ -29,14 +26,7 @@ public class ImgMsgHandler extends AbstractMsgHandler {
}
@Override
- public void checkMsg(ChatMessageReq request, Long uid) {
- ImgMsgDTO body = BeanUtil.toBean(request.getBody(), ImgMsgDTO.class);
- AssertUtil.allCheckValidateThrow(body);
- }
-
- @Override
- public void saveMsg(Message msg, ChatMessageReq request) {
- ImgMsgDTO body = BeanUtil.toBean(request.getBody(), ImgMsgDTO.class);
+ public void saveMsg(Message msg, ImgMsgDTO body) {
MessageExtra extra = Optional.ofNullable(msg.getExtra()).orElse(new MessageExtra());
Message update = new Message();
update.setId(msg.getId());
diff --git a/mallchat-chat-server/src/main/java/com/abin/mallchat/common/chat/service/strategy/msg/RecallMsgHandler.java b/mallchat-chat-server/src/main/java/com/abin/mallchat/common/chat/service/strategy/msg/RecallMsgHandler.java
index 7984b5d..b9eaf0b 100644
--- a/mallchat-chat-server/src/main/java/com/abin/mallchat/common/chat/service/strategy/msg/RecallMsgHandler.java
+++ b/mallchat-chat-server/src/main/java/com/abin/mallchat/common/chat/service/strategy/msg/RecallMsgHandler.java
@@ -6,7 +6,6 @@ import com.abin.mallchat.common.chat.domain.entity.Message;
import com.abin.mallchat.common.chat.domain.entity.msg.MessageExtra;
import com.abin.mallchat.common.chat.domain.entity.msg.MsgRecall;
import com.abin.mallchat.common.chat.domain.enums.MessageTypeEnum;
-import com.abin.mallchat.common.chat.domain.vo.request.ChatMessageReq;
import com.abin.mallchat.common.chat.service.cache.MsgCache;
import com.abin.mallchat.common.common.event.MessageRecallEvent;
import com.abin.mallchat.common.user.domain.entity.User;
@@ -24,7 +23,7 @@ import java.util.Objects;
* Date: 2023-06-04
*/
@Component
-public class RecallMsgHandler extends AbstractMsgHandler {
+public class RecallMsgHandler extends AbstractMsgHandler