| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267 | package controllerimport (	"bytes"	"encoding/json"	"fmt"	"github.com/gin-gonic/gin"	"github.com/yuin/goldmark"	"message-pusher/channel"	"message-pusher/common"	"message-pusher/model"	"net/http"	"strconv"	"time")func GetPushMessage(c *gin.Context) {	message := model.Message{		Title:       c.Query("title"),		Description: c.Query("description"),		Content:     c.Query("content"),		URL:         c.Query("url"),		Channel:     c.Query("channel"),		Token:       c.Query("token"),	}	if message.Description == "" {		// Keep compatible with ServerChan		message.Description = c.Query("desp")	}	if message.Channel == "" {		// Keep compatible with old version		message.Channel = c.Query("type")	}	pushMessageHelper(c, &message)}func PostPushMessage(c *gin.Context) {	message := model.Message{		Title:       c.PostForm("title"),		Description: c.PostForm("description"),		Content:     c.PostForm("content"),		URL:         c.PostForm("url"),		Channel:     c.PostForm("channel"),		Token:       c.PostForm("token"),		Desp:        c.PostForm("desp"),	}	if message == (model.Message{}) {		// Looks like the user is using JSON		err := json.NewDecoder(c.Request.Body).Decode(&message)		if err != nil {			c.JSON(http.StatusOK, gin.H{				"success": false,				"message": "无法解析请求体,请检查其是否为合法 JSON",			})			return		}	}	if message.Description == "" {		message.Description = message.Desp	}	pushMessageHelper(c, &message)}func pushMessageHelper(c *gin.Context, message *model.Message) {	user := model.User{Username: c.Param("username")}	err := user.FillUserByUsername()	if err != nil {		c.JSON(http.StatusForbidden, gin.H{			"success": false,			"message": err.Error(),		})		return	}	if user.Status == common.UserStatusNonExisted {		c.JSON(http.StatusForbidden, gin.H{			"success": false,			"message": "用户不存在",		})		return	}	if user.Status == common.UserStatusDisabled {		c.JSON(http.StatusForbidden, gin.H{			"success": false,			"message": "用户已被封禁",		})		return	}	if user.Token != "" && user.Token != " " {		if message.Token == "" {			message.Token = c.Request.Header.Get("Authorization")			if message.Token == "" {				c.JSON(http.StatusForbidden, gin.H{					"success": false,					"message": "token 为空",				})				return			}		}		if user.Token != message.Token {			c.JSON(http.StatusForbidden, gin.H{				"success": false,				"message": "无效的 token",			})			return		}	}	if message.Title == "" {		message.Title = common.SystemName	}	if message.Channel == "" {		message.Channel = user.Channel		if message.Channel == "" {			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)	if err != nil {		c.JSON(http.StatusOK, gin.H{			"success": false,			"message": err.Error(),		})		return	}	c.JSON(http.StatusOK, gin.H{		"success": true,		"message": "ok",	})	return}func GetStaticFile(c *gin.Context) {	path := c.Param("file")	c.FileFromFS("public/static/"+path, http.FS(common.FS))}func RenderMessage(c *gin.Context) {	if !common.MessageRenderEnabled {		c.HTML(http.StatusOK, "message.html", gin.H{			"title":       "无法渲染",			"time":        time.Now().Format("2006-01-02 15:04:05"),			"description": "超级管理员禁用了消息渲染",			"content":     "很抱歉,您所使用的消息推送服务的管理员禁用了消息渲染功能,因此您的消息无法渲染。",		})		return	}	link := c.Param("link")	if link == "unsaved" {		c.HTML(http.StatusOK, "message.html", gin.H{			"title":       "无法渲染",			"time":        time.Now().Format("2006-01-02 15:04:05"),			"description": "超级管理员禁用了消息持久化",			"content":     "很抱歉,您所使用的消息推送服务的管理员禁用了消息持久化功能,您的消息并没有存储到数据库中,因此无法渲染。",		})		return	}	message, err := model.GetMessageByLink(link)	if err != nil {		c.Status(http.StatusNotFound)		return	}	if message.Content != "" {		var buf bytes.Buffer		err := goldmark.Convert([]byte(message.Content), &buf)		if err != nil {			common.SysLog(err.Error())		} else {			message.HTMLContent = buf.String()		}	}	c.HTML(http.StatusOK, "message.html", gin.H{		"title":       message.Title,		"time":        time.Unix(message.Timestamp, 0).Format("2006-01-02 15:04:05"),		"description": message.Description,		"content":     message.HTMLContent,	})	return}func GetUserMessages(c *gin.Context) {	userId := c.GetInt("id")	p, _ := strconv.Atoi(c.Query("p"))	if p < 0 {		p = 0	}	messages, err := model.GetMessagesByUserId(userId, p*common.ItemsPerPage, common.ItemsPerPage)	if err != nil {		c.JSON(http.StatusOK, gin.H{			"success": false,			"message": err.Error(),		})		return	}	c.JSON(http.StatusOK, gin.H{		"success": true,		"message": "",		"data":    messages,	})	return}func GetMessage(c *gin.Context) {	messageId, _ := strconv.Atoi(c.Param("id"))	userId := c.GetInt("id")	message, err := model.GetMessageById(messageId, userId)	if err != nil {		c.JSON(http.StatusOK, gin.H{			"success": false,			"message": err.Error(),		})		return	}	c.JSON(http.StatusOK, gin.H{		"success": true,		"message": "",		"data":    message,	})	return}func DeleteMessage(c *gin.Context) {	messageId, _ := strconv.Atoi(c.Param("id"))	userId := c.GetInt("id")	err := model.DeleteMessageById(messageId, userId)	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 DeleteAllMessages(c *gin.Context) {	err := model.DeleteAllMessages()	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}
 |