Browse Source

消息保存

luoynagwei 9 months ago
parent
commit
10b7a60385
24 changed files with 375 additions and 100 deletions
  1. 6 0
      README.md
  2. 1 0
      api-message/src/main/java/com/sikey/wa04/api/message/MessageApplication.java
  3. 81 0
      api-websocket/src/main/java/com/sikey/wa04/api/websocket/client/handler/MessageQueueHandler.java
  4. 0 44
      api-websocket/src/main/java/com/sikey/wa04/api/websocket/client/handler/RabbitMQMessagingHandler.java
  5. 50 0
      api-websocket/src/main/java/com/sikey/wa04/api/websocket/client/rest/PublishSubscribeController.java
  6. 2 1
      business-application/src/main/java/com/sikey/wa04/business/application/service/MessagingSubscribeService.java
  7. 6 0
      business-common/src/main/java/com/sikey/wa04/common/dto/message/BasicChatMessage.java
  8. 34 0
      business-common/src/main/java/com/sikey/wa04/common/utils/ObjectMapperUtil.java
  9. 10 0
      business-domain/src/main/java/com/sikey/wa04/business/domain/adapter/MessageAdapter.java
  10. 20 0
      business-domain/src/main/java/com/sikey/wa04/business/domain/adapter/MessageReceivedAdapter.java
  11. 0 42
      business-domain/src/main/java/com/sikey/wa04/business/domain/entity/Session.java
  12. 9 3
      business-domain/src/main/java/com/sikey/wa04/business/domain/entity/message/MessageReceivedLog.java
  13. 15 0
      business-domain/src/main/java/com/sikey/wa04/business/domain/entity/websocket/Ack.java
  14. 8 0
      business-infrastructure/src/main/java/com/sikey/wa04/business/infrastructure/adapter/ConnectionStateManager.java
  15. 32 1
      business-infrastructure/src/main/java/com/sikey/wa04/business/infrastructure/adapter/dao/MessageAdapterImpl.java
  16. 30 0
      business-infrastructure/src/main/java/com/sikey/wa04/business/infrastructure/adapter/dao/MessageReceivedAdapterImpl.java
  17. 5 0
      business-infrastructure/src/main/java/com/sikey/wa04/business/infrastructure/configuration/DruidDatasourceConfig.java
  18. 21 0
      business-infrastructure/src/main/java/com/sikey/wa04/business/infrastructure/configuration/JpaRepositoriesConfig.java
  19. 3 9
      business-infrastructure/src/main/java/com/sikey/wa04/business/infrastructure/dto/model/MessageSendModel.java
  20. 14 0
      business-infrastructure/src/main/java/com/sikey/wa04/business/infrastructure/dto/request/publish/PublishSubscribeRequest.java
  21. 4 0
      business-infrastructure/src/main/java/com/sikey/wa04/business/infrastructure/dto/request/publish/PublishUnsubscribeRequest.java
  22. 12 0
      business-infrastructure/src/main/java/com/sikey/wa04/business/infrastructure/repository/MessageRecvRepository.java
  23. 12 0
      business-infrastructure/src/main/java/com/sikey/wa04/business/infrastructure/repository/MessageSendRepository.java
  24. BIN
      document/img.png

+ 6 - 0
README.md

@@ -42,4 +42,10 @@
 
 - [接口文档](http://doc.sikey.com.cn)
 - [前端项目](#)
+- [COLA5](https://github.com/alibaba/COLA)
+- [COLA架构介绍](https://juejin.cn/post/7250914419578912805)
+- [COLA架构解析](https://www.mcaoyuan.com/archives/cola)
+- [COLA实践](https://blog.csdn.net/daqiang012/article/details/119243935?utm_medium=distribute.pc_relevant.none-task-blog-2~default~baidujs_baidulandingword~default-1-119243935-blog-133182049.235^v43^pc_blog_bottom_relevance_base6&spm=1001.2101.3001.4242.2&utm_relevant_index=4)
+- [Alibaba/COLA架构中的Gateway层的代码腐败问题](https://blog.csdn.net/qq_31205803/article/details/133182049)
+- [Clean Architecture](https://github.com/alesimoes/hexagonal-clean-architecture)
 

+ 1 - 0
api-message/src/main/java/com/sikey/wa04/api/message/MessageApplication.java

@@ -5,6 +5,7 @@ import org.springframework.boot.autoconfigure.SpringBootApplication;
 import org.springframework.cloud.client.discovery.EnableDiscoveryClient;
 import org.springframework.cloud.context.config.annotation.RefreshScope;
 import org.springframework.scheduling.annotation.EnableScheduling;
+import org.springframework.transaction.annotation.EnableTransactionManagement;
 
 @EnableScheduling
 @EnableDiscoveryClient

+ 81 - 0
api-websocket/src/main/java/com/sikey/wa04/api/websocket/client/handler/MessageQueueHandler.java

@@ -0,0 +1,81 @@
+package com.sikey.wa04.api.websocket.client.handler;
+
+import com.sikey.wa04.business.application.service.MessagingSubscribeService;
+import com.sikey.wa04.business.domain.adapter.GroupMemberAdapter;
+import com.sikey.wa04.business.domain.adapter.MessageAdapter;
+import com.sikey.wa04.business.domain.adapter.MessageReceivedAdapter;
+import com.sikey.wa04.business.domain.entity.GroupId;
+import com.sikey.wa04.business.domain.entity.GroupMember;
+import com.sikey.wa04.business.domain.entity.message.Message;
+import com.sikey.wa04.business.domain.entity.message.MessageId;
+import com.sikey.wa04.business.domain.entity.message.MessageReceivedLog;
+import com.sikey.wa04.business.domain.entity.websocket.Ack;
+import com.sikey.wa04.business.infrastructure.adapter.RedisConnectionStateManager;
+import com.sikey.wa04.business.infrastructure.aop.MessagingHandlerTrace;
+import com.sikey.wa04.common.dto.message.BasicChatMessage;
+import com.sikey.wa04.common.dto.message.BasicNoticeMessage;
+import com.sikey.wa04.common.enums.MessageStatus;
+import jakarta.annotation.Resource;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.amqp.rabbit.annotation.RabbitHandler;
+import org.springframework.amqp.rabbit.annotation.RabbitListener;
+import org.springframework.messaging.handler.annotation.Headers;
+import org.springframework.stereotype.Component;
+
+import java.util.ArrayList;
+import java.util.List;
+import java.util.Map;
+
+/**
+ * 收到 MQ 消息
+ *
+ * @author luoyangwei
+ * @date 2024年10月12日17:07:41
+ */
+@Slf4j
+@Component
+@RabbitListener(queues = "publish_queue")
+public class MessageQueueHandler {
+
+    @Resource
+    private MessagingSubscribeService messagingSubscribeService;
+
+    @Resource
+    private RedisConnectionStateManager redisConnectionStateManager;
+
+    @Resource
+    private MessageAdapter messageAdapter;
+
+    @Resource
+    private MessageReceivedAdapter messageReceivedAdapter;
+
+    @Resource
+    private GroupMemberAdapter groupMemberAdapter;
+
+
+    @RabbitHandler
+    @MessagingHandlerTrace
+    public void receiveChatMessage(BasicChatMessage chatMessage, @Headers Map<String, Object> headers) {
+        log.info("Received chat message: {}, {}", chatMessage, headers);
+
+        MessageId messageId = new MessageId(chatMessage.getMsgId());
+        Message message = messageAdapter.find(messageId);
+
+        List<MessageReceivedLog> receivedLogs = new ArrayList<>();
+        message.getReceiverId().stream().map(receiverId ->
+                new MessageReceivedLog().setReceiverId(receiverId).setStatus(MessageStatus.UNREAD)
+        ).forEach(receivedLogs::add);
+        message.setReceivedLogs(receivedLogs);
+
+        // 发送 Ack 消息
+        List<Ack> ack = messageReceivedAdapter.save(message, message.getReceivedLogs());
+
+        messagingSubscribeService.consume(message);
+    }
+
+    @RabbitHandler
+    @MessagingHandlerTrace
+    public void receiveNoticeMessage(BasicNoticeMessage message, @Headers Map<String, Object> headers) {
+        log.info("Received notice message: {}, {}", message, headers);
+    }
+}

+ 0 - 44
api-websocket/src/main/java/com/sikey/wa04/api/websocket/client/handler/RabbitMQMessagingHandler.java

@@ -1,44 +0,0 @@
-package com.sikey.wa04.api.websocket.client.handler;
-
-import com.sikey.wa04.business.application.service.MessagingSubscribeService;
-import com.sikey.wa04.business.infrastructure.aop.MessagingHandlerTrace;
-import com.sikey.wa04.common.constants.HeaderConstant;
-import com.sikey.wa04.common.dto.message.BasicChatMessage;
-import com.sikey.wa04.common.dto.message.BasicNoticeMessage;
-import jakarta.annotation.Resource;
-import lombok.extern.slf4j.Slf4j;
-import org.slf4j.MDC;
-import org.springframework.amqp.rabbit.annotation.RabbitHandler;
-import org.springframework.amqp.rabbit.annotation.RabbitListener;
-import org.springframework.messaging.handler.annotation.Header;
-import org.springframework.messaging.handler.annotation.Headers;
-import org.springframework.stereotype.Component;
-
-import java.util.Map;
-
-/**
- * 收到 MQ 消息
- *
- * @author luoyangwei
- * @date 2024年10月12日17:07:41
- */
-@Slf4j
-@Component
-@RabbitListener(queues = "publish_queue")
-public class RabbitMQMessagingHandler {
-    @Resource
-    private MessagingSubscribeService messagingSubscribeService;
-
-    @RabbitHandler
-    @MessagingHandlerTrace
-    public void receiveChatMessage(BasicChatMessage message, @Headers Map<String, Object> headers) {
-        log.info("Received chat message: {}, {}", message, headers);
-        messagingSubscribeService.consume();
-    }
-
-    @RabbitHandler
-    @MessagingHandlerTrace
-    public void receiveNoticeMessage(BasicNoticeMessage message, @Headers Map<String, Object> headers) {
-        log.info("Received notice message: {}, {}", message, headers);
-    }
-}

+ 50 - 0
api-websocket/src/main/java/com/sikey/wa04/api/websocket/client/rest/PublishSubscribeController.java

@@ -0,0 +1,50 @@
+package com.sikey.wa04.api.websocket.client.rest;
+
+import com.sikey.wa04.business.infrastructure.configuration.ProjectContextConstant;
+import com.sikey.wa04.business.infrastructure.dto.request.publish.PublishSubscribeRequest;
+import com.sikey.wa04.business.infrastructure.dto.request.publish.PublishUnsubscribeRequest;
+import com.sikey.wa04.common.interceptor.Authenticated;
+import org.springframework.http.ResponseEntity;
+import org.springframework.validation.annotation.Validated;
+import org.springframework.web.bind.annotation.PostMapping;
+import org.springframework.web.bind.annotation.RequestBody;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+
+/**
+ * 推送订阅接口
+ * <br/>
+ * 当用户离线的时候会推送离线消息给订阅用户
+ *
+ * @author luoyangwei
+ * @date 2024年10月15日15:09:12
+ */
+@RestController
+@RequestMapping(ProjectContextConstant.WEBSOCKET_URL + "/publish")
+public class PublishSubscribeController {
+
+    /**
+     * 订阅
+     *
+     * @param request 订阅请求
+     * @return 订阅结果
+     */
+    @Authenticated
+    @PostMapping("/subscribe")
+    public ResponseEntity<Object> subscribe(@Validated @RequestBody PublishSubscribeRequest request) {
+        return ResponseEntity.ok().build();
+    }
+
+    /**
+     * 取消订阅
+     *
+     * @param request 取消订阅请求
+     * @return 取消订阅结果
+     */
+    @Authenticated
+    @PostMapping("/unsubscribe")
+    public ResponseEntity<Object> unsubscribe(@Validated @RequestBody PublishUnsubscribeRequest request) {
+        return ResponseEntity.ok().build();
+    }
+
+}

+ 2 - 1
business-application/src/main/java/com/sikey/wa04/business/application/service/MessagingSubscribeService.java

@@ -1,5 +1,6 @@
 package com.sikey.wa04.business.application.service;
 
+import com.sikey.wa04.business.domain.entity.message.Message;
 import lombok.extern.slf4j.Slf4j;
 import org.springframework.stereotype.Service;
 
@@ -28,7 +29,7 @@ public class MessagingSubscribeService {
     /**
      * 消费消息
      */
-    public void consume() {
+    public void consume(Message message) {
     }
 
 }

+ 6 - 0
business-common/src/main/java/com/sikey/wa04/common/dto/message/BasicChatMessage.java

@@ -19,4 +19,10 @@ public class BasicChatMessage extends BasicMessage implements Serializable {
      * 是否是群聊消息
      */
     private Boolean iGroup;
+
+    /**
+     * 消息内容 <br/>
+     * 子类一般会重载这个字段
+     */
+    private Object content;
 }

+ 34 - 0
business-common/src/main/java/com/sikey/wa04/common/utils/ObjectMapperUtil.java

@@ -0,0 +1,34 @@
+package com.sikey.wa04.common.utils;
+
+import com.fasterxml.jackson.core.type.TypeReference;
+import com.fasterxml.jackson.databind.DeserializationFeature;
+import com.fasterxml.jackson.databind.ObjectMapper;
+import lombok.experimental.UtilityClass;
+import org.springframework.http.converter.json.Jackson2ObjectMapperBuilder;
+
+@UtilityClass
+public class ObjectMapperUtil {
+    private final static ObjectMapper objectMapper;
+
+    static {
+        objectMapper = new Jackson2ObjectMapperBuilder()
+                .createXmlMapper(false)
+                .failOnEmptyBeans(false)
+                .failOnUnknownProperties(false)
+                .build();
+        objectMapper.configure(DeserializationFeature.FAIL_ON_NULL_FOR_PRIMITIVES, false);
+    }
+
+    public <T> T convertValue(Object fromValue, Class<T> toValueType) {
+        return objectMapper.convertValue(fromValue, toValueType);
+    }
+
+    public <T> T convertValue(Object fromValue, TypeReference<T> toValueTypeRef) {
+        return objectMapper.convertValue(fromValue, toValueTypeRef);
+    }
+
+    public <T> TypeReference<T> getValueTypeRef() {
+        return new TypeReference<>() {
+        };
+    }
+}

+ 10 - 0
business-domain/src/main/java/com/sikey/wa04/business/domain/adapter/MessageAdapter.java

@@ -2,6 +2,7 @@ package com.sikey.wa04.business.domain.adapter;
 
 import com.sikey.wa04.business.domain.entity.AckId;
 import com.sikey.wa04.business.domain.entity.message.Message;
+import com.sikey.wa04.business.domain.entity.message.MessageId;
 
 /**
  * Message adapter.
@@ -15,4 +16,13 @@ public interface MessageAdapter {
      */
     void save(Message message);
 
+
+    /**
+     * 查询消息
+     *
+     * @param messageId 消息id
+     * @return 消息
+     */
+    Message find(MessageId messageId);
+
 }

+ 20 - 0
business-domain/src/main/java/com/sikey/wa04/business/domain/adapter/MessageReceivedAdapter.java

@@ -1,4 +1,24 @@
 package com.sikey.wa04.business.domain.adapter;
 
+import com.sikey.wa04.business.domain.entity.message.Message;
+import com.sikey.wa04.business.domain.entity.message.MessageReceivedLog;
+import com.sikey.wa04.business.domain.entity.websocket.Ack;
+
+import java.util.List;
+
+/**
+ * 消息接收适配器
+ *
+ * @author luoyangwei
+ */
 public interface MessageReceivedAdapter {
+
+    /**
+     * 保存消息
+     *
+     * @param message 消息
+     * @return ack
+     */
+    List<Ack> save(Message message, List<MessageReceivedLog> messageReceivedLogs);
+
 }

+ 0 - 42
business-domain/src/main/java/com/sikey/wa04/business/domain/entity/Session.java

@@ -1,42 +0,0 @@
-package com.sikey.wa04.business.domain.entity;
-
-import lombok.AllArgsConstructor;
-import lombok.Data;
-import lombok.NoArgsConstructor;
-import lombok.ToString;
-import lombok.experimental.Accessors;
-import org.springframework.web.socket.WebSocketSession;
-
-import java.time.LocalDateTime;
-
-/**
- * 会话
- *
- * @author luoyangwei
- * @deprecated Domain 模块不应该有具体的技术细节实现,但 Session 和 WebsocketSession 都是具体的细节,不应该出现在 Domain 模块中。
- */
-@Data
-@Accessors(chain = true)
-@AllArgsConstructor
-@NoArgsConstructor
-@ToString
-@Deprecated
-public class Session {
-
-    /**
-     * 会话ID
-     */
-    private String id;
-
-    /**
-     * 语言环境
-     */
-    private String lang;
-
-    private WebSocketSession originalSession;
-
-    /**
-     * 上次心跳时间
-     */
-    private LocalDateTime lastActiveTime;
-}

+ 9 - 3
business-domain/src/main/java/com/sikey/wa04/business/domain/entity/message/MessageReceivedLog.java

@@ -1,9 +1,8 @@
 package com.sikey.wa04.business.domain.entity.message;
 
+import com.sikey.wa04.business.domain.entity.websocket.Ack;
 import com.sikey.wa04.common.enums.MessageStatus;
-import lombok.Data;
-import lombok.EqualsAndHashCode;
-import lombok.ToString;
+import lombok.*;
 import lombok.experimental.Accessors;
 
 import java.time.Instant;
@@ -17,6 +16,8 @@ import java.time.Instant;
 @Accessors(chain = true)
 @EqualsAndHashCode(callSuper = false)
 @ToString
+@AllArgsConstructor
+@NoArgsConstructor
 public class MessageReceivedLog {
 
     /**
@@ -24,6 +25,11 @@ public class MessageReceivedLog {
      */
     private String receiverId;
 
+    /**
+     * ack id
+     */
+    private Long ackId;
+
     /**
      * 消息状态
      *

+ 15 - 0
business-domain/src/main/java/com/sikey/wa04/business/domain/entity/websocket/Ack.java

@@ -0,0 +1,15 @@
+package com.sikey.wa04.business.domain.entity.websocket;
+
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import lombok.ToString;
+import lombok.experimental.Accessors;
+
+@Data
+@EqualsAndHashCode(callSuper = false)
+@Accessors(chain = true)
+@ToString
+public class Ack {
+    private Long id;
+    private String receiverId;
+}

+ 8 - 0
business-infrastructure/src/main/java/com/sikey/wa04/business/infrastructure/adapter/ConnectionStateManager.java

@@ -2,22 +2,30 @@ package com.sikey.wa04.business.infrastructure.adapter;
 
 import com.sikey.wa04.business.domain.entity.websocket.Connection;
 
+/**
+ * 连接状态管理器
+ *
+ * @author luoyangwei
+ */
 public interface ConnectionStateManager {
 
     /**
      * 上线
+     *
      * @param connection Connection
      */
     void online(Connection connection);
 
     /**
      * 下线
+     *
      * @param connection Connection
      */
     void offline(Connection connection);
 
     /**
      * 心跳
+     *
      * @param connection Connection
      */
     void heartbeat(Connection connection);

+ 32 - 1
business-infrastructure/src/main/java/com/sikey/wa04/business/infrastructure/adapter/dao/MessageAdapterImpl.java

@@ -1,12 +1,18 @@
 package com.sikey.wa04.business.infrastructure.adapter.dao;
 
 import com.sikey.wa04.business.domain.adapter.MessageAdapter;
-import com.sikey.wa04.business.domain.entity.AckId;
 import com.sikey.wa04.business.domain.entity.message.Message;
 import com.sikey.wa04.business.domain.entity.message.MessageId;
+import com.sikey.wa04.business.infrastructure.dto.model.MessageSendModel;
+import com.sikey.wa04.business.infrastructure.repository.MessageRecvRepository;
+import com.sikey.wa04.business.infrastructure.repository.MessageSendRepository;
+import com.sikey.wa04.common.utils.ObjectMapperUtil;
+import jakarta.annotation.Resource;
 import lombok.extern.slf4j.Slf4j;
 import org.springframework.stereotype.Component;
 
+import java.time.Instant;
+
 /**
  * MessageAdapterImpl
  *
@@ -16,8 +22,33 @@ import org.springframework.stereotype.Component;
 @Component
 public class MessageAdapterImpl implements MessageAdapter {
 
+    @Resource
+    private MessageSendRepository messageSendRepository;
+
+    @Resource
+    private MessageRecvRepository messageRecvRepository;
+
     @Override
     public void save(Message message) {
+        MessageSendModel messageSendModel = new MessageSendModel();
+        messageSendModel.setId(message.getId().getId());
+        messageSendModel.setMsgType(message.getType().getValue());
+        messageSendModel.setSendId(message.getSenderId());
+        messageSendModel.setSendTime(message.getSendTime());
+        messageSendModel.setCreatedAt(Instant.now());
+        messageSendModel.setUpdatedAt(Instant.now());
+        messageSendModel.setContent(ObjectMapperUtil.convertValue(message.getContent(), ObjectMapperUtil.getValueTypeRef()));
+        try {
+            MessageSendModel model = messageSendRepository.save(messageSendModel);
+            log.info("保存消息成功: {}", model);
+        } catch (Exception e) {
+            log.error("保存消息失败", e);
+        }
     }
 
+
+    @Override
+    public Message find(MessageId messageId) {
+        return null;
+    }
 }

+ 30 - 0
business-infrastructure/src/main/java/com/sikey/wa04/business/infrastructure/adapter/dao/MessageReceivedAdapterImpl.java

@@ -0,0 +1,30 @@
+package com.sikey.wa04.business.infrastructure.adapter.dao;
+
+import com.sikey.wa04.business.domain.adapter.MessageReceivedAdapter;
+import com.sikey.wa04.business.domain.entity.message.Message;
+import com.sikey.wa04.business.domain.entity.message.MessageReceivedLog;
+import com.sikey.wa04.business.domain.entity.websocket.Ack;
+import com.sikey.wa04.business.infrastructure.repository.MessageRecvRepository;
+import jakarta.annotation.Resource;
+import jakarta.transaction.Transactional;
+import org.springframework.stereotype.Component;
+
+import java.util.List;
+
+/**
+ * 消息接收适配器实现类
+ *
+ * @author luoyangwei
+ */
+@Component
+public class MessageReceivedAdapterImpl implements MessageReceivedAdapter {
+
+    @Resource
+    private MessageRecvRepository messageRecvRepository;
+
+    @Override
+    public List<Ack> save(Message message, List<MessageReceivedLog> messageReceivedLogs) {
+
+        return null;
+    }
+}

+ 5 - 0
business-infrastructure/src/main/java/com/sikey/wa04/business/infrastructure/configuration/DruidDatasourceConfig.java

@@ -1,8 +1,13 @@
 package com.sikey.wa04.business.infrastructure.configuration;
 
+import com.alibaba.druid.spring.boot.autoconfigure.DruidDataSourceBuilder;
 import lombok.Data;
 import org.springframework.boot.context.properties.ConfigurationProperties;
+import org.springframework.context.annotation.Bean;
 import org.springframework.context.annotation.Configuration;
+import org.springframework.context.annotation.Primary;
+
+import javax.sql.DataSource;
 
 @Configuration
 @ConfigurationProperties("spring.datasource.druid")

+ 21 - 0
business-infrastructure/src/main/java/com/sikey/wa04/business/infrastructure/configuration/JpaRepositoriesConfig.java

@@ -1,11 +1,32 @@
 package com.sikey.wa04.business.infrastructure.configuration;
 
 import org.springframework.boot.autoconfigure.domain.EntityScan;
+import org.springframework.context.annotation.Bean;
 import org.springframework.context.annotation.Configuration;
 import org.springframework.data.jpa.repository.config.EnableJpaRepositories;
+import org.springframework.orm.jpa.JpaTransactionManager;
+import org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean;
+import org.springframework.transaction.PlatformTransactionManager;
+import org.springframework.transaction.annotation.EnableTransactionManagement;
+
+import javax.sql.DataSource;
 
 @Configuration
+@EnableTransactionManagement
 @EnableJpaRepositories(basePackages = "com.sikey.wa04.business")
 @EntityScan(basePackages = "com.sikey.wa04.business")
 public class JpaRepositoriesConfig {
+
+//    @Primary
+//    @Bean
+//    public LocalContainerEntityManagerFactoryBean entityManagerFactory(EntityManagerFactoryBuilder builder) {
+//        return builder.dataSource(dataSource).packages("com.sikey.wa04.business").build();
+//    }
+
+
+//    @Bean
+//    public PlatformTransactionManager transactionManager(LocalContainerEntityManagerFactoryBean localContainerEntityManagerFactoryBean) {
+//        return new JpaTransactionManager(localContainerEntityManagerFactoryBean.getObject());
+//    }
+
 }

+ 3 - 9
business-infrastructure/src/main/java/com/sikey/wa04/business/infrastructure/dto/model/MessageSendModel.java

@@ -18,7 +18,6 @@ import java.util.Map;
 @Table(name = "tb_message_send")
 public class MessageSendModel {
     @Id
-    @GeneratedValue(strategy = GenerationType.IDENTITY)
     @Column(name = "id", nullable = false)
     private Long id;
 
@@ -28,9 +27,8 @@ public class MessageSendModel {
     private String sendId;
 
     @NotNull
-    @ColumnDefault("0")
     @Column(name = "msg_type", nullable = false)
-    private Byte msgType;
+    private Integer msgType;
 
     @NotNull
     @Column(name = "content", nullable = false)
@@ -42,14 +40,10 @@ public class MessageSendModel {
     @Column(name = "send_time", nullable = false)
     private Instant sendTime;
 
-    @NotNull
-    @ColumnDefault("CURRENT_TIMESTAMP")
-    @Column(name = "created_at", nullable = false)
+    @Column(name = "created_at")
     private Instant createdAt;
 
-    @NotNull
-    @ColumnDefault("CURRENT_TIMESTAMP")
-    @Column(name = "updated_at", nullable = false)
+    @Column(name = "updated_at")
     private Instant updatedAt;
 
     @Column(name = "deleted_at")

+ 14 - 0
business-infrastructure/src/main/java/com/sikey/wa04/business/infrastructure/dto/request/publish/PublishSubscribeRequest.java

@@ -0,0 +1,14 @@
+package com.sikey.wa04.business.infrastructure.dto.request.publish;
+
+import jakarta.validation.constraints.NotBlank;
+
+public record PublishSubscribeRequest(
+        String deviceSystem,
+        String deviceSystemVersion,
+        String deviceManufacturer,
+        String deviceModel,
+        String userId,
+        @NotBlank(message = "注册ID不能为空")
+        String regId
+) {
+}

+ 4 - 0
business-infrastructure/src/main/java/com/sikey/wa04/business/infrastructure/dto/request/publish/PublishUnsubscribeRequest.java

@@ -0,0 +1,4 @@
+package com.sikey.wa04.business.infrastructure.dto.request.publish;
+
+public record PublishUnsubscribeRequest() {
+}

+ 12 - 0
business-infrastructure/src/main/java/com/sikey/wa04/business/infrastructure/repository/MessageRecvRepository.java

@@ -0,0 +1,12 @@
+package com.sikey.wa04.business.infrastructure.repository;
+
+import com.sikey.wa04.business.infrastructure.dto.model.MessageRecvModel;
+import org.springframework.data.jpa.repository.JpaRepository;
+import org.springframework.stereotype.Repository;
+
+/**
+ * 消息接收数据仓库
+ */
+@Repository
+public interface MessageRecvRepository extends JpaRepository<MessageRecvModel, Long> {
+}

+ 12 - 0
business-infrastructure/src/main/java/com/sikey/wa04/business/infrastructure/repository/MessageSendRepository.java

@@ -0,0 +1,12 @@
+package com.sikey.wa04.business.infrastructure.repository;
+
+import com.sikey.wa04.business.infrastructure.dto.model.MessageSendModel;
+import org.springframework.data.jpa.repository.JpaRepository;
+import org.springframework.stereotype.Repository;
+
+/**
+ * MessageSendRepository
+ */
+@Repository
+public interface MessageSendRepository extends JpaRepository<MessageSendModel, Long> {
+}

BIN
document/img.png