feat: send message rewrite
This commit is contained in:
@@ -0,0 +1,164 @@
|
|||||||
|
package send_message_service
|
||||||
|
|
||||||
|
import (
|
||||||
|
"message-nest/models"
|
||||||
|
"message-nest/service/send_way_service"
|
||||||
|
)
|
||||||
|
|
||||||
|
// 消息类型常量定义
|
||||||
|
const (
|
||||||
|
MessageTypeEmail = "Email"
|
||||||
|
MessageTypeDtalk = "Dtalk"
|
||||||
|
MessageTypeQyWeiXin = "QyWeiXin"
|
||||||
|
MessageTypeCustom = "Custom"
|
||||||
|
MessageTypeWeChatOFAccount = "WeChatOFAccount"
|
||||||
|
MessageTypeMessageNest = "MessageNest"
|
||||||
|
)
|
||||||
|
|
||||||
|
// MessageHandler 消息处理器接口
|
||||||
|
type MessageHandler interface {
|
||||||
|
// Send 发送消息
|
||||||
|
// 返回:响应内容,错误信息
|
||||||
|
Send(msgObj interface{}, ins models.SendTasksIns, typeC string, title string, content string, url string) (string, string)
|
||||||
|
|
||||||
|
// GetType 返回该处理器支持的消息类型字符串
|
||||||
|
GetType() string
|
||||||
|
}
|
||||||
|
|
||||||
|
// MessageHandlerRegistry 消息处理器注册表
|
||||||
|
type MessageHandlerRegistry struct {
|
||||||
|
handlers map[string]MessageHandler
|
||||||
|
}
|
||||||
|
|
||||||
|
// NewMessageHandlerRegistry 创建新的消息处理器注册表
|
||||||
|
func NewMessageHandlerRegistry() *MessageHandlerRegistry {
|
||||||
|
return &MessageHandlerRegistry{
|
||||||
|
handlers: make(map[string]MessageHandler),
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Register 注册消息处理器
|
||||||
|
func (r *MessageHandlerRegistry) Register(handler MessageHandler) {
|
||||||
|
r.handlers[handler.GetType()] = handler
|
||||||
|
}
|
||||||
|
|
||||||
|
// GetHandler 根据类型字符串获取对应的处理器
|
||||||
|
func (r *MessageHandlerRegistry) GetHandler(wayType string) (MessageHandler, bool) {
|
||||||
|
handler, ok := r.handlers[wayType]
|
||||||
|
return handler, ok
|
||||||
|
}
|
||||||
|
|
||||||
|
// 全局消息处理器注册表
|
||||||
|
var globalRegistry = NewMessageHandlerRegistry()
|
||||||
|
|
||||||
|
// init 初始化时注册所有处理器
|
||||||
|
func init() {
|
||||||
|
globalRegistry.Register(&EmailHandler{})
|
||||||
|
globalRegistry.Register(&DtalkHandler{})
|
||||||
|
globalRegistry.Register(&QyWeiXinHandler{})
|
||||||
|
globalRegistry.Register(&CustomHandler{})
|
||||||
|
globalRegistry.Register(&WeChatOfAccountHandler{})
|
||||||
|
globalRegistry.Register(&HostMessageHandler{})
|
||||||
|
}
|
||||||
|
|
||||||
|
// GetGlobalRegistry 获取全局注册表
|
||||||
|
func GetGlobalRegistry() *MessageHandlerRegistry {
|
||||||
|
return globalRegistry
|
||||||
|
}
|
||||||
|
|
||||||
|
// EmailHandler 邮箱消息处理器
|
||||||
|
type EmailHandler struct{}
|
||||||
|
|
||||||
|
func (h *EmailHandler) GetType() string {
|
||||||
|
return MessageTypeEmail
|
||||||
|
}
|
||||||
|
|
||||||
|
func (h *EmailHandler) Send(msgObj interface{}, ins models.SendTasksIns, typeC string, title string, content string, url string) (string, string) {
|
||||||
|
auth, ok := msgObj.(send_way_service.WayDetailEmail)
|
||||||
|
if !ok {
|
||||||
|
return "", "类型转换失败"
|
||||||
|
}
|
||||||
|
es := EmailService{}
|
||||||
|
errMsg := es.SendTaskEmail(auth, ins, typeC, title, content)
|
||||||
|
return "", errMsg
|
||||||
|
}
|
||||||
|
|
||||||
|
// DtalkHandler 钉钉消息处理器
|
||||||
|
type DtalkHandler struct{}
|
||||||
|
|
||||||
|
func (h *DtalkHandler) GetType() string {
|
||||||
|
return MessageTypeDtalk
|
||||||
|
}
|
||||||
|
|
||||||
|
func (h *DtalkHandler) Send(msgObj interface{}, ins models.SendTasksIns, typeC string, title string, content string, url string) (string, string) {
|
||||||
|
auth, ok := msgObj.(send_way_service.WayDetailDTalk)
|
||||||
|
if !ok {
|
||||||
|
return "", "类型转换失败"
|
||||||
|
}
|
||||||
|
es := DtalkService{}
|
||||||
|
return es.SendDtalkMessage(auth, ins, typeC, title, content)
|
||||||
|
}
|
||||||
|
|
||||||
|
// QyWeiXinHandler 企业微信消息处理器
|
||||||
|
type QyWeiXinHandler struct{}
|
||||||
|
|
||||||
|
func (h *QyWeiXinHandler) GetType() string {
|
||||||
|
return MessageTypeQyWeiXin
|
||||||
|
}
|
||||||
|
|
||||||
|
func (h *QyWeiXinHandler) Send(msgObj interface{}, ins models.SendTasksIns, typeC string, title string, content string, url string) (string, string) {
|
||||||
|
auth, ok := msgObj.(send_way_service.WayDetailQyWeiXin)
|
||||||
|
if !ok {
|
||||||
|
return "", "类型转换失败"
|
||||||
|
}
|
||||||
|
es := QyWeiXinService{}
|
||||||
|
return es.SendQyWeiXinMessage(auth, ins, typeC, title, content)
|
||||||
|
}
|
||||||
|
|
||||||
|
// CustomHandler 自定义webhook消息处理器
|
||||||
|
type CustomHandler struct{}
|
||||||
|
|
||||||
|
func (h *CustomHandler) GetType() string {
|
||||||
|
return MessageTypeCustom
|
||||||
|
}
|
||||||
|
|
||||||
|
func (h *CustomHandler) Send(msgObj interface{}, ins models.SendTasksIns, typeC string, title string, content string, url string) (string, string) {
|
||||||
|
auth, ok := msgObj.(send_way_service.WayDetailCustom)
|
||||||
|
if !ok {
|
||||||
|
return "", "类型转换失败"
|
||||||
|
}
|
||||||
|
cs := CustomService{}
|
||||||
|
return cs.SendCustomMessage(auth, ins, typeC, title, content)
|
||||||
|
}
|
||||||
|
|
||||||
|
// WeChatOfAccountHandler 微信公众号消息处理器
|
||||||
|
type WeChatOfAccountHandler struct{}
|
||||||
|
|
||||||
|
func (h *WeChatOfAccountHandler) GetType() string {
|
||||||
|
return MessageTypeWeChatOFAccount
|
||||||
|
}
|
||||||
|
|
||||||
|
func (h *WeChatOfAccountHandler) Send(msgObj interface{}, ins models.SendTasksIns, typeC string, title string, content string, url string) (string, string) {
|
||||||
|
auth, ok := msgObj.(send_way_service.WeChatOFAccount)
|
||||||
|
if !ok {
|
||||||
|
return "", "类型转换失败"
|
||||||
|
}
|
||||||
|
cs := WeChatOfAccountService{}
|
||||||
|
return cs.SendWeChatOfAccountMessage(auth, ins, typeC, title, content, url)
|
||||||
|
}
|
||||||
|
|
||||||
|
// HostMessageHandler 托管消息处理器
|
||||||
|
type HostMessageHandler struct{}
|
||||||
|
|
||||||
|
func (h *HostMessageHandler) GetType() string {
|
||||||
|
return MessageTypeMessageNest
|
||||||
|
}
|
||||||
|
|
||||||
|
func (h *HostMessageHandler) Send(msgObj interface{}, ins models.SendTasksIns, typeC string, title string, content string, url string) (string, string) {
|
||||||
|
auth, ok := msgObj.(send_way_service.MessageNest)
|
||||||
|
if !ok {
|
||||||
|
return "", "类型转换失败"
|
||||||
|
}
|
||||||
|
cs := HostMessageService{}
|
||||||
|
return cs.SendHostMessage(auth, ins, typeC, title, content)
|
||||||
|
}
|
||||||
@@ -151,61 +151,19 @@ func (sm *SendMessageService) Send(task models.TaskIns) (string, error) {
|
|||||||
continue
|
continue
|
||||||
}
|
}
|
||||||
|
|
||||||
// 邮箱类型的实例发送
|
// 使用注册的处理器发送消息
|
||||||
emailAuth, ok := msgObj.(send_way_service.WayDetailEmail)
|
registry := GetGlobalRegistry()
|
||||||
if ok {
|
handler, ok := registry.GetHandler(way.Type)
|
||||||
//continue
|
if !ok {
|
||||||
es := EmailService{}
|
sm.LogsAndStatusMark(fmt.Sprintf("发送失败:未知渠道类型 %s 的发信实例: %s\n", way.Type, ins.ID), SendFail)
|
||||||
errMsg := es.SendTaskEmail(emailAuth, ins.SendTasksIns, typeC, sm.Title, content)
|
|
||||||
sm.LogsAndStatusMark(sm.TransError(errMsg), errStrIsSuccess(errMsg))
|
|
||||||
continue
|
continue
|
||||||
}
|
}
|
||||||
// 钉钉类型的实例发送
|
|
||||||
dtalkAuth, ok := msgObj.(send_way_service.WayDetailDTalk)
|
res, errMsg := handler.Send(msgObj, ins.SendTasksIns, typeC, sm.Title, content, sm.URL)
|
||||||
if ok {
|
if res != "" {
|
||||||
es := DtalkService{}
|
|
||||||
res, errMsg := es.SendDtalkMessage(dtalkAuth, ins.SendTasksIns, typeC, sm.Title, content)
|
|
||||||
sm.LogsAndStatusMark(fmt.Sprintf("返回内容:%s", res), sm.Status)
|
sm.LogsAndStatusMark(fmt.Sprintf("返回内容:%s", res), sm.Status)
|
||||||
sm.LogsAndStatusMark(sm.TransError(errMsg), errStrIsSuccess(errMsg))
|
|
||||||
continue
|
|
||||||
}
|
}
|
||||||
// 企业微信类型的实例发送
|
sm.LogsAndStatusMark(sm.TransError(errMsg), errStrIsSuccess(errMsg))
|
||||||
qywxAuth, ok := msgObj.(send_way_service.WayDetailQyWeiXin)
|
|
||||||
if ok {
|
|
||||||
es := QyWeiXinService{}
|
|
||||||
res, errMsg := es.SendQyWeiXinMessage(qywxAuth, ins.SendTasksIns, typeC, sm.Title, content)
|
|
||||||
sm.LogsAndStatusMark(fmt.Sprintf("返回内容:%s", res), sm.Status)
|
|
||||||
sm.LogsAndStatusMark(sm.TransError(errMsg), errStrIsSuccess(errMsg))
|
|
||||||
continue
|
|
||||||
}
|
|
||||||
// 自定义webhook类型的实例发送
|
|
||||||
customAuth, ok := msgObj.(send_way_service.WayDetailCustom)
|
|
||||||
if ok {
|
|
||||||
cs := CustomService{}
|
|
||||||
res, errMsg := cs.SendCustomMessage(customAuth, ins.SendTasksIns, typeC, sm.Title, content)
|
|
||||||
sm.LogsAndStatusMark(fmt.Sprintf("返回内容:%s", res), sm.Status)
|
|
||||||
sm.LogsAndStatusMark(sm.TransError(errMsg), errStrIsSuccess(errMsg))
|
|
||||||
continue
|
|
||||||
}
|
|
||||||
// 微信公众号模板消息的实例发送
|
|
||||||
wca, ok := msgObj.(send_way_service.WeChatOFAccount)
|
|
||||||
if ok {
|
|
||||||
cs := WeChatOfAccountService{}
|
|
||||||
res, errMsg := cs.SendWeChatOfAccountMessage(wca, ins.SendTasksIns, typeC, sm.Title, content, sm.URL)
|
|
||||||
sm.LogsAndStatusMark(fmt.Sprintf("返回内容:%s", res), sm.Status)
|
|
||||||
sm.LogsAndStatusMark(sm.TransError(errMsg), errStrIsSuccess(errMsg))
|
|
||||||
continue
|
|
||||||
}
|
|
||||||
// 托管消息的实例发送
|
|
||||||
mnt, ok := msgObj.(send_way_service.MessageNest)
|
|
||||||
if ok {
|
|
||||||
cs := HostMessageService{}
|
|
||||||
res, errMsg := cs.SendHostMessage(mnt, ins.SendTasksIns, typeC, sm.Title, content)
|
|
||||||
sm.LogsAndStatusMark(fmt.Sprintf("返回内容:%s", res), sm.Status)
|
|
||||||
sm.LogsAndStatusMark(sm.TransError(errMsg), errStrIsSuccess(errMsg))
|
|
||||||
continue
|
|
||||||
}
|
|
||||||
sm.LogsAndStatusMark(fmt.Sprintf("发送失败:未知渠道的发信实例: %s\n", ins.ID), SendFail)
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user