1
0
Эх сурвалжийг харах

feat: able to resend message now

JustSong 2 жил өмнө
parent
commit
998e974e95

+ 65 - 28
controller/message.go

@@ -113,48 +113,51 @@ func pushMessageHelper(c *gin.Context, message *model.Message) {
 			message.Channel = channel.TypeEmail
 		}
 	}
-	link := "unsaved"
-	if common.MessagePersistenceEnabled {
-		err = message.UpdateAndInsert(user.Id)
-		if err != nil {
-			c.JSON(http.StatusOK, gin.H{
-				"success": false,
-				"message": err.Error(),
-			})
-			return
-		}
-		link = message.Link
-	}
-	if message.URL == "" {
-		message.URL = fmt.Sprintf("%s/message/%s", common.ServerAddress, link)
-	}
-	err = channel.SendMessage(message, &user)
+	err = saveAndSendMessage(&user, message)
 	if err != nil {
 		c.JSON(http.StatusOK, gin.H{
 			"success": false,
 			"message": err.Error(),
 		})
-		// Update the status of the message
-		if common.MessagePersistenceEnabled {
-			err := message.UpdateStatus(common.MessageSendStatusFailed)
-			if err != nil {
-				common.SysError("failed to update the status of the message: " + err.Error())
-			}
-		}
 		return
 	}
 	c.JSON(http.StatusOK, gin.H{
 		"success": true,
-		"message": "ok",
+		"message": "",
 	})
-	// Update the status of the message
+}
+
+func saveAndSendMessage(user *model.User, message *model.Message) error {
+	message.Link = common.GetUUID()
+	if message.URL == "" {
+		message.URL = fmt.Sprintf("%s/message/%s", common.ServerAddress, message.Link)
+	}
+	success := false
 	if common.MessagePersistenceEnabled {
-		err := message.UpdateStatus(common.MessageSendStatusSent)
+		defer func() {
+			// Update the status of the message
+			status := common.MessageSendStatusFailed
+			if success {
+				status = common.MessageSendStatusSent
+			}
+			err := message.UpdateStatus(status)
+			if err != nil {
+				common.SysError("failed to update the status of the message: " + err.Error())
+			}
+		}()
+		err := message.UpdateAndInsert(user.Id)
 		if err != nil {
-			common.SysError("failed to update the status of the message: " + err.Error())
+			return err
 		}
+	} else {
+		message.Link = "unsaved" // This is for user to identify whether the message is saved
 	}
-	return
+	err := channel.SendMessage(message, user)
+	if err != nil {
+		return err
+	}
+	success = true
+	return nil // After this line, the message status will be updated
 }
 
 func GetStaticFile(c *gin.Context) {
@@ -267,6 +270,40 @@ func SearchMessages(c *gin.Context) {
 	return
 }
 
+func ResendMessage(c *gin.Context) {
+	messageId, _ := strconv.Atoi(c.Param("id"))
+	userId := c.GetInt("id")
+	helper := func() error {
+		message, err := model.GetMessageById(messageId, userId)
+		message.Id = 0
+		if err != nil {
+			return err
+		}
+		user, err := model.GetUserById(userId, true)
+		if err != nil {
+			return err
+		}
+		err = saveAndSendMessage(user, message)
+		if err != nil {
+			return err
+		}
+		return nil
+	}
+	err := helper()
+	if err != nil {
+		c.JSON(http.StatusOK, gin.H{
+			"success": false,
+			"message": err.Error(),
+		})
+		return
+	}
+	c.JSON(http.StatusOK, gin.H{
+		"success": true,
+		"message": "",
+	})
+	return
+}
+
 func DeleteMessage(c *gin.Context) {
 	messageId, _ := strconv.Atoi(c.Param("id"))
 	userId := c.GetInt("id")

+ 0 - 1
model/message.go

@@ -69,7 +69,6 @@ func DeleteAllMessages() error {
 }
 
 func (message *Message) UpdateAndInsert(userId int) error {
-	message.Link = common.GetUUID()
 	message.Timestamp = time.Now().Unix()
 	message.UserId = userId
 	message.Status = common.MessageSendStatusPending

+ 1 - 0
router/api-router.go

@@ -59,6 +59,7 @@ func SetApiRouter(router *gin.Engine) {
 		{
 			messageRoute.GET("/", middleware.UserAuth(), controller.GetUserMessages)
 			messageRoute.GET("/search", middleware.UserAuth(), controller.SearchMessages)
+			messageRoute.POST("/resend/:id", middleware.UserAuth(), controller.ResendMessage)
 			messageRoute.GET("/:id", middleware.UserAuth(), controller.GetMessage)
 			messageRoute.DELETE("/", middleware.RootAuth(), controller.DeleteAllMessages)
 			messageRoute.DELETE("/:id", middleware.UserAuth(), controller.DeleteMessage)

+ 18 - 7
web/src/components/MessagesTable.js

@@ -173,8 +173,15 @@ const MessagesTable = () => {
   };
 
   const resendMessage = async (id) => {
-    // TODO: Implement resendMessage
-    console.log('resendMessage', id);
+    setLoading(true);
+    const res = await API.post(`/api/message/resend/${id}`);
+    const { success, message } = res.data;
+    if (success) {
+      showSuccess('消息已重新发送!');
+    } else {
+      showError(message);
+    }
+    setLoading(false);
   };
 
   const deleteMessage = async (id, idx) => {
@@ -368,16 +375,20 @@ const MessagesTable = () => {
         size='tiny'
         open={viewModalOpen}
       >
-        <Modal.Header>{message.title ? message.title : "无标题"}</Modal.Header>
+        <Modal.Header>{message.title ? message.title : '无标题'}</Modal.Header>
         <Modal.Content>
-          {message.description ? <p className={'quote'}>{message.description}</p> : ""}
-          <p>{message.content ? message.content : "无内容"}</p>
+          {message.description ? <p className={'quote'}>{message.description}</p> : ''}
+          <p>{message.content ? message.content : '无内容'}</p>
         </Modal.Content>
         <Modal.Actions>
-          <Button onClick={() => {openPage(`/message/${message.link}`)}}>
+          <Button onClick={() => {
+            openPage(`/message/${message.link}`);
+          }}>
             打开
           </Button>
-          <Button onClick={() => {setViewModalOpen(false)}}>
+          <Button onClick={() => {
+            setViewModalOpen(false);
+          }}>
             关闭
           </Button>
         </Modal.Actions>