diff --git a/controller/message.go b/controller/message.go index 75b4b5d..d406542 100644 --- a/controller/message.go +++ b/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 - if common.MessagePersistenceEnabled { - err := message.UpdateStatus(common.MessageSendStatusSent) - if err != nil { - common.SysError("failed to update the status of the message: " + err.Error()) - } +} + +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) } - return + success := false + if common.MessagePersistenceEnabled { + 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 { + return err + } + } else { + message.Link = "unsaved" // This is for user to identify whether the message is saved + } + 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") diff --git a/model/message.go b/model/message.go index 46e3ba4..e1b4adf 100644 --- a/model/message.go +++ b/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 diff --git a/router/api-router.go b/router/api-router.go index b91f79d..7943f08 100644 --- a/router/api-router.go +++ b/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) diff --git a/web/src/components/MessagesTable.js b/web/src/components/MessagesTable.js index e8b1fab..810360b 100644 --- a/web/src/components/MessagesTable.js +++ b/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} > - {message.title ? message.title : "无标题"} + {message.title ? message.title : '无标题'} - {message.description ? {message.description} : ""} - {message.content ? message.content : "无内容"} + {message.description ? {message.description} : ''} + {message.content ? message.content : '无内容'} - {openPage(`/message/${message.link}`)}}> + { + openPage(`/message/${message.link}`); + }}> 打开 - {setViewModalOpen(false)}}> + { + setViewModalOpen(false); + }}> 关闭
{message.description}
{message.content ? message.content : "无内容"}
{message.content ? message.content : '无内容'}