message.go 6.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267
  1. package controller
  2. import (
  3. "bytes"
  4. "encoding/json"
  5. "fmt"
  6. "github.com/gin-gonic/gin"
  7. "github.com/yuin/goldmark"
  8. "message-pusher/channel"
  9. "message-pusher/common"
  10. "message-pusher/model"
  11. "net/http"
  12. "strconv"
  13. "time"
  14. )
  15. func GetPushMessage(c *gin.Context) {
  16. message := model.Message{
  17. Title: c.Query("title"),
  18. Description: c.Query("description"),
  19. Content: c.Query("content"),
  20. URL: c.Query("url"),
  21. Channel: c.Query("channel"),
  22. Token: c.Query("token"),
  23. }
  24. if message.Description == "" {
  25. // Keep compatible with ServerChan
  26. message.Description = c.Query("desp")
  27. }
  28. if message.Channel == "" {
  29. // Keep compatible with old version
  30. message.Channel = c.Query("type")
  31. }
  32. pushMessageHelper(c, &message)
  33. }
  34. func PostPushMessage(c *gin.Context) {
  35. message := model.Message{
  36. Title: c.PostForm("title"),
  37. Description: c.PostForm("description"),
  38. Content: c.PostForm("content"),
  39. URL: c.PostForm("url"),
  40. Channel: c.PostForm("channel"),
  41. Token: c.PostForm("token"),
  42. Desp: c.PostForm("desp"),
  43. }
  44. if message == (model.Message{}) {
  45. // Looks like the user is using JSON
  46. err := json.NewDecoder(c.Request.Body).Decode(&message)
  47. if err != nil {
  48. c.JSON(http.StatusOK, gin.H{
  49. "success": false,
  50. "message": "无法解析请求体,请检查其是否为合法 JSON",
  51. })
  52. return
  53. }
  54. }
  55. if message.Description == "" {
  56. message.Description = message.Desp
  57. }
  58. pushMessageHelper(c, &message)
  59. }
  60. func pushMessageHelper(c *gin.Context, message *model.Message) {
  61. user := model.User{Username: c.Param("username")}
  62. err := user.FillUserByUsername()
  63. if err != nil {
  64. c.JSON(http.StatusForbidden, gin.H{
  65. "success": false,
  66. "message": err.Error(),
  67. })
  68. return
  69. }
  70. if user.Status == common.UserStatusNonExisted {
  71. c.JSON(http.StatusForbidden, gin.H{
  72. "success": false,
  73. "message": "用户不存在",
  74. })
  75. return
  76. }
  77. if user.Status == common.UserStatusDisabled {
  78. c.JSON(http.StatusForbidden, gin.H{
  79. "success": false,
  80. "message": "用户已被封禁",
  81. })
  82. return
  83. }
  84. if user.Token != "" && user.Token != " " {
  85. if message.Token == "" {
  86. message.Token = c.Request.Header.Get("Authorization")
  87. if message.Token == "" {
  88. c.JSON(http.StatusForbidden, gin.H{
  89. "success": false,
  90. "message": "token 为空",
  91. })
  92. return
  93. }
  94. }
  95. if user.Token != message.Token {
  96. c.JSON(http.StatusForbidden, gin.H{
  97. "success": false,
  98. "message": "无效的 token",
  99. })
  100. return
  101. }
  102. }
  103. if message.Title == "" {
  104. message.Title = common.SystemName
  105. }
  106. if message.Channel == "" {
  107. message.Channel = user.Channel
  108. if message.Channel == "" {
  109. message.Channel = channel.TypeEmail
  110. }
  111. }
  112. link := "unsaved"
  113. if common.MessagePersistenceEnabled {
  114. err = message.UpdateAndInsert(user.Id)
  115. if err != nil {
  116. c.JSON(http.StatusOK, gin.H{
  117. "success": false,
  118. "message": err.Error(),
  119. })
  120. return
  121. }
  122. link = message.Link
  123. }
  124. if message.URL == "" {
  125. message.URL = fmt.Sprintf("%s/message/%s", common.ServerAddress, link)
  126. }
  127. err = channel.SendMessage(message, &user)
  128. if err != nil {
  129. c.JSON(http.StatusOK, gin.H{
  130. "success": false,
  131. "message": err.Error(),
  132. })
  133. return
  134. }
  135. c.JSON(http.StatusOK, gin.H{
  136. "success": true,
  137. "message": "ok",
  138. })
  139. return
  140. }
  141. func GetStaticFile(c *gin.Context) {
  142. path := c.Param("file")
  143. c.FileFromFS("public/static/"+path, http.FS(common.FS))
  144. }
  145. func RenderMessage(c *gin.Context) {
  146. if !common.MessageRenderEnabled {
  147. c.HTML(http.StatusOK, "message.html", gin.H{
  148. "title": "无法渲染",
  149. "time": time.Now().Format("2006-01-02 15:04:05"),
  150. "description": "超级管理员禁用了消息渲染",
  151. "content": "很抱歉,您所使用的消息推送服务的管理员禁用了消息渲染功能,因此您的消息无法渲染。",
  152. })
  153. return
  154. }
  155. link := c.Param("link")
  156. if link == "unsaved" {
  157. c.HTML(http.StatusOK, "message.html", gin.H{
  158. "title": "无法渲染",
  159. "time": time.Now().Format("2006-01-02 15:04:05"),
  160. "description": "超级管理员禁用了消息持久化",
  161. "content": "很抱歉,您所使用的消息推送服务的管理员禁用了消息持久化功能,您的消息并没有存储到数据库中,因此无法渲染。",
  162. })
  163. return
  164. }
  165. message, err := model.GetMessageByLink(link)
  166. if err != nil {
  167. c.Status(http.StatusNotFound)
  168. return
  169. }
  170. if message.Content != "" {
  171. var buf bytes.Buffer
  172. err := goldmark.Convert([]byte(message.Content), &buf)
  173. if err != nil {
  174. common.SysLog(err.Error())
  175. } else {
  176. message.HTMLContent = buf.String()
  177. }
  178. }
  179. c.HTML(http.StatusOK, "message.html", gin.H{
  180. "title": message.Title,
  181. "time": time.Unix(message.Timestamp, 0).Format("2006-01-02 15:04:05"),
  182. "description": message.Description,
  183. "content": message.HTMLContent,
  184. })
  185. return
  186. }
  187. func GetUserMessages(c *gin.Context) {
  188. userId := c.GetInt("id")
  189. p, _ := strconv.Atoi(c.Query("p"))
  190. if p < 0 {
  191. p = 0
  192. }
  193. messages, err := model.GetMessagesByUserId(userId, p*common.ItemsPerPage, common.ItemsPerPage)
  194. if err != nil {
  195. c.JSON(http.StatusOK, gin.H{
  196. "success": false,
  197. "message": err.Error(),
  198. })
  199. return
  200. }
  201. c.JSON(http.StatusOK, gin.H{
  202. "success": true,
  203. "message": "",
  204. "data": messages,
  205. })
  206. return
  207. }
  208. func GetMessage(c *gin.Context) {
  209. messageId, _ := strconv.Atoi(c.Param("id"))
  210. userId := c.GetInt("id")
  211. message, err := model.GetMessageById(messageId, userId)
  212. if err != nil {
  213. c.JSON(http.StatusOK, gin.H{
  214. "success": false,
  215. "message": err.Error(),
  216. })
  217. return
  218. }
  219. c.JSON(http.StatusOK, gin.H{
  220. "success": true,
  221. "message": "",
  222. "data": message,
  223. })
  224. return
  225. }
  226. func DeleteMessage(c *gin.Context) {
  227. messageId, _ := strconv.Atoi(c.Param("id"))
  228. userId := c.GetInt("id")
  229. err := model.DeleteMessageById(messageId, userId)
  230. if err != nil {
  231. c.JSON(http.StatusOK, gin.H{
  232. "success": false,
  233. "message": err.Error(),
  234. })
  235. return
  236. }
  237. c.JSON(http.StatusOK, gin.H{
  238. "success": true,
  239. "message": "",
  240. })
  241. return
  242. }
  243. func DeleteAllMessages(c *gin.Context) {
  244. err := model.DeleteAllMessages()
  245. if err != nil {
  246. c.JSON(http.StatusOK, gin.H{
  247. "success": false,
  248. "message": err.Error(),
  249. })
  250. return
  251. }
  252. c.JSON(http.StatusOK, gin.H{
  253. "success": true,
  254. "message": "",
  255. })
  256. return
  257. }