feat: now server part supports multiple channels for the same type (#50)

This commit is contained in:
JustSong
2023-05-05 10:43:56 +08:00
parent b291ed43ca
commit 3a8d625201
21 changed files with 601 additions and 298 deletions
+183
View File
@@ -0,0 +1,183 @@
package controller
import (
"github.com/gin-gonic/gin"
"message-pusher/channel"
"message-pusher/common"
"message-pusher/model"
"net/http"
"strconv"
)
func GetAllChannels(c *gin.Context) {
userId := c.GetInt("id")
p, _ := strconv.Atoi(c.Query("p"))
if p < 0 {
p = 0
}
channels, err := model.GetChannelsByUserId(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": channels,
})
return
}
func SearchChannels(c *gin.Context) {
userId := c.GetInt("id")
keyword := c.Query("keyword")
channels, err := model.SearchChannels(userId, keyword)
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": channels,
})
return
}
func GetChannel(c *gin.Context) {
id, err := strconv.Atoi(c.Param("id"))
userId := c.GetInt("id")
if err != nil {
c.JSON(http.StatusOK, gin.H{
"success": false,
"message": err.Error(),
})
return
}
channel_, err := model.GetChannelById(id, 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": channel_,
})
return
}
func AddChannel(c *gin.Context) {
channel_ := model.Channel{}
err := c.ShouldBindJSON(&channel_)
if err != nil {
c.JSON(http.StatusOK, gin.H{
"success": false,
"message": err.Error(),
})
return
}
if len(channel_.Name) == 0 || len(channel_.Name) > 20 {
c.JSON(http.StatusOK, gin.H{
"success": false,
"message": "通道名称长度必须在1-20之间",
})
return
}
cleanChannel := model.Channel{
UserId: c.GetInt("id"),
Name: channel_.Name,
}
err = cleanChannel.Insert()
if err != nil {
c.JSON(http.StatusOK, gin.H{
"success": false,
"message": err.Error(),
})
return
}
channel.TokenStoreAddChannel(&cleanChannel)
c.JSON(http.StatusOK, gin.H{
"success": true,
"message": "",
})
return
}
func DeleteChannel(c *gin.Context) {
id, _ := strconv.Atoi(c.Param("id"))
userId := c.GetInt("id")
channel_, err := model.DeleteChannelById(id, userId)
if err != nil {
c.JSON(http.StatusOK, gin.H{
"success": false,
"message": err.Error(),
})
return
}
channel.TokenStoreRemoveChannel(channel_)
c.JSON(http.StatusOK, gin.H{
"success": true,
"message": "",
})
return
}
func UpdateChannel(c *gin.Context) {
userId := c.GetInt("id")
statusOnly := c.Query("status_only")
channel_ := model.Channel{}
err := c.ShouldBindJSON(&channel_)
if err != nil {
c.JSON(http.StatusOK, gin.H{
"success": false,
"message": err.Error(),
})
return
}
oldChannel, err := model.GetChannelById(channel_.Id, userId)
if err != nil {
c.JSON(http.StatusOK, gin.H{
"success": false,
"message": err.Error(),
})
return
}
cleanChannel := oldChannel
if statusOnly != "" {
cleanChannel.Status = channel_.Status
} else {
// If you add more fields, please also update channel_.Update()
cleanChannel.Type = channel_.Type
cleanChannel.Name = channel_.Name
cleanChannel.Secret = channel_.Secret
cleanChannel.AppId = channel_.AppId
cleanChannel.AccountId = channel_.AccountId
cleanChannel.URL = channel_.URL
cleanChannel.Other = channel_.Other
}
err = cleanChannel.Update()
if err != nil {
c.JSON(http.StatusOK, gin.H{
"success": false,
"message": err.Error(),
})
return
}
channel.TokenStoreUpdateChannel(cleanChannel, oldChannel)
c.JSON(http.StatusOK, gin.H{
"success": true,
"message": "",
"data": cleanChannel,
})
return
}
+22 -10
View File
@@ -65,21 +65,21 @@ 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{
c.JSON(http.StatusOK, gin.H{
"success": false,
"message": err.Error(),
})
return
}
if user.Status == common.UserStatusNonExisted {
c.JSON(http.StatusForbidden, gin.H{
c.JSON(http.StatusOK, gin.H{
"success": false,
"message": "用户不存在",
})
return
}
if user.Status == common.UserStatusDisabled {
c.JSON(http.StatusForbidden, gin.H{
c.JSON(http.StatusOK, gin.H{
"success": false,
"message": "用户已被封禁",
})
@@ -89,7 +89,7 @@ func pushMessageHelper(c *gin.Context, message *model.Message) {
if message.Token == "" {
message.Token = c.Request.Header.Get("Authorization")
if message.Token == "" {
c.JSON(http.StatusForbidden, gin.H{
c.JSON(http.StatusOK, gin.H{
"success": false,
"message": "token 为空",
})
@@ -97,7 +97,7 @@ func pushMessageHelper(c *gin.Context, message *model.Message) {
}
}
if user.Token != message.Token {
c.JSON(http.StatusForbidden, gin.H{
c.JSON(http.StatusOK, gin.H{
"success": false,
"message": "无效的 token",
})
@@ -110,10 +110,18 @@ func pushMessageHelper(c *gin.Context, message *model.Message) {
if message.Channel == "" {
message.Channel = user.Channel
if message.Channel == "" {
message.Channel = channel.TypeEmail
message.Channel = model.TypeEmail
}
}
err = saveAndSendMessage(&user, message)
channel_, err := model.GetChannelByName(message.Channel, user.Id)
if err != nil {
c.JSON(http.StatusOK, gin.H{
"success": false,
"message": "无效的渠道的名称",
})
return
}
err = saveAndSendMessage(&user, message, channel_)
if err != nil {
c.JSON(http.StatusOK, gin.H{
"success": false,
@@ -127,7 +135,7 @@ func pushMessageHelper(c *gin.Context, message *model.Message) {
})
}
func saveAndSendMessage(user *model.User, message *model.Message) error {
func saveAndSendMessage(user *model.User, message *model.Message, channel_ *model.Channel) error {
message.Link = common.GetUUID()
if message.URL == "" {
message.URL = fmt.Sprintf("%s/message/%s", common.ServerAddress, message.Link)
@@ -152,7 +160,7 @@ func saveAndSendMessage(user *model.User, message *model.Message) error {
} else {
message.Link = "unsaved" // This is for user to identify whether the message is saved
}
err := channel.SendMessage(message, user)
err := channel.SendMessage(message, user, channel_)
common.MessageCount += 1 // We don't need to use atomic here because it's not a critical value
if err != nil {
return err
@@ -284,7 +292,11 @@ func ResendMessage(c *gin.Context) {
if err != nil {
return err
}
err = saveAndSendMessage(user, message)
channel_, err := model.GetChannelByName(message.Channel, user.Id)
if err != nil {
return err
}
err = saveAndSendMessage(user, message, channel_)
if err != nil {
return err
}
+6 -36
View File
@@ -389,45 +389,15 @@ func UpdateSelf(c *gin.Context) {
})
return
}
originUser, err := model.GetUserById(c.GetInt("id"), true)
if err != nil {
c.JSON(http.StatusOK, gin.H{
"success": false,
"message": err.Error(),
})
return
}
// White list mode. For safe :)
cleanUser := model.User{
Id: c.GetInt("id"),
Username: user.Username,
Password: user.Password,
DisplayName: user.DisplayName,
Token: user.Token,
Channel: user.Channel,
WeChatTestAccountId: user.WeChatTestAccountId,
WeChatTestAccountSecret: user.WeChatTestAccountSecret,
WeChatTestAccountTemplateId: user.WeChatTestAccountTemplateId,
WeChatTestAccountOpenId: user.WeChatTestAccountOpenId,
WeChatTestAccountVerificationToken: user.WeChatTestAccountVerificationToken,
WeChatCorpAccountId: user.WeChatCorpAccountId,
WeChatCorpAccountAgentSecret: user.WeChatCorpAccountAgentSecret,
WeChatCorpAccountAgentId: user.WeChatCorpAccountAgentId,
WeChatCorpAccountUserId: user.WeChatCorpAccountUserId,
WeChatCorpAccountClientType: user.WeChatCorpAccountClientType,
CorpWebhookURL: user.CorpWebhookURL,
LarkWebhookURL: user.LarkWebhookURL,
LarkWebhookSecret: user.LarkWebhookSecret,
DingWebhookURL: user.DingWebhookURL,
DingWebhookSecret: user.DingWebhookSecret,
BarkServer: user.BarkServer,
BarkSecret: user.BarkSecret,
ClientSecret: user.ClientSecret,
TelegramBotToken: user.TelegramBotToken,
TelegramChatId: user.TelegramChatId,
DiscordWebhookURL: user.DiscordWebhookURL,
Id: c.GetInt("id"),
Username: user.Username,
Password: user.Password,
DisplayName: user.DisplayName,
Token: user.Token,
Channel: user.Channel,
}
channel.TokenStoreUpdateUser(&cleanUser, originUser)
if user.Password == "$I_LOVE_U" {
user.Password = "" // rollback to what it should be
+22 -3
View File
@@ -27,10 +27,29 @@ func RegisterClient(c *gin.Context) {
}
user := model.User{Username: c.Param("username")}
err := user.FillUserByUsername()
if secret != user.ClientSecret {
if err != nil {
c.JSON(http.StatusOK, gin.H{
"success": false,
"message": "用户名与密钥不匹配",
"message": "无效的用户名",
})
return
}
channelName := c.Query("channel")
if channelName == "" {
channelName = "client"
}
channel_, err := model.GetChannelByName(channelName, user.Id)
if err != nil {
c.JSON(http.StatusOK, gin.H{
"success": false,
"message": "无效的通道名称",
})
return
}
if secret != channel_.Secret {
c.JSON(http.StatusOK, gin.H{
"success": false,
"message": "通道名称与密钥不匹配",
})
return
}
@@ -42,6 +61,6 @@ func RegisterClient(c *gin.Context) {
})
return
}
channel.RegisterClient(user.Id, conn)
channel.RegisterClient(channelName, user.Id, conn)
return
}