Files
Message-Push-Nest/service/message_template_service/message_template.go
T
2025-12-06 00:28:18 +08:00

186 lines
4.3 KiB
Go

package message_template_service
import (
"encoding/json"
"errors"
"message-nest/models"
"strings"
)
type MessageTemplateService struct {
ID string
Name string
Description string
TextTemplate string
HTMLTemplate string
MarkdownTemplate string
Placeholders string
AtMobiles string
AtUserIds string
IsAtAll bool
Status string
Text string
PageNum int
PageSize int
}
// Placeholder 占位符定义
type Placeholder struct {
Key string `json:"key"`
Label string `json:"label"`
Default string `json:"default"`
}
// Add 添加消息模板
func (s *MessageTemplateService) Add() error {
if err := s.validatePlaceholders(); err != nil {
return err
}
newUUID := models.GenerateTemplateUniqueID()
model := models.MessageTemplate{
UUIDModel: models.UUIDModel{
ID: newUUID,
},
Name: s.Name,
Description: s.Description,
TextTemplate: s.TextTemplate,
HTMLTemplate: s.HTMLTemplate,
MarkdownTemplate: s.MarkdownTemplate,
Placeholders: s.Placeholders,
AtMobiles: s.AtMobiles,
AtUserIds: s.AtUserIds,
IsAtAll: s.IsAtAll,
Status: s.Status,
}
return model.Add()
}
// Update 更新消息模板
func (s *MessageTemplateService) Update() error {
if err := s.validatePlaceholders(); err != nil {
return err
}
model := models.MessageTemplate{
UUIDModel: models.UUIDModel{
ID: s.ID,
},
Name: s.Name,
Description: s.Description,
TextTemplate: s.TextTemplate,
HTMLTemplate: s.HTMLTemplate,
MarkdownTemplate: s.MarkdownTemplate,
Placeholders: s.Placeholders,
AtMobiles: s.AtMobiles,
AtUserIds: s.AtUserIds,
IsAtAll: s.IsAtAll,
Status: s.Status,
}
return model.Update()
}
// Delete 删除消息模板
func (s *MessageTemplateService) Delete() error {
model := models.MessageTemplate{
UUIDModel: models.UUIDModel{
ID: s.ID,
},
}
return model.Delete()
}
// Get 获取单个消息模板
func (s *MessageTemplateService) Get() (*models.MessageTemplateResult, error) {
return models.GetMessageTemplateByID(s.ID)
}
// GetAll 获取消息模板列表
func (s *MessageTemplateService) GetAll() ([]models.MessageTemplateResult, error) {
templates, err := models.GetMessageTemplates(s.PageNum, s.PageSize, s.Text, s.getMaps())
if err != nil {
return nil, err
}
return templates, nil
}
// Count 获取消息模板总数
func (s *MessageTemplateService) Count() (int64, error) {
return models.GetMessageTemplatesTotal(s.Text, s.getMaps())
}
// ExistByID 检查模板是否存在
func (s *MessageTemplateService) ExistByID() (bool, error) {
return models.ExistMessageTemplateByID(s.ID)
}
// RenderTemplate 渲染模板(替换占位符)
func (s *MessageTemplateService) RenderTemplate(templateContent string, params map[string]string) string {
result := templateContent
for key, value := range params {
placeholder := "{{" + key + "}}"
result = strings.ReplaceAll(result, placeholder, value)
}
return result
}
// PreviewTemplate 预览模板效果
func (s *MessageTemplateService) PreviewTemplate(params map[string]string) (map[string]string, error) {
template, err := s.Get()
if err != nil {
return nil, err
}
result := make(map[string]string)
if template.TextTemplate != "" {
result["text"] = s.RenderTemplate(template.TextTemplate, params)
}
if template.HTMLTemplate != "" {
result["html"] = s.RenderTemplate(template.HTMLTemplate, params)
}
if template.MarkdownTemplate != "" {
result["markdown"] = s.RenderTemplate(template.MarkdownTemplate, params)
}
return result, nil
}
// validatePlaceholders 验证占位符格式
func (s *MessageTemplateService) validatePlaceholders() error {
if s.Placeholders == "" {
return nil
}
var placeholders []Placeholder
if err := json.Unmarshal([]byte(s.Placeholders), &placeholders); err != nil {
return errors.New("占位符格式错误,必须是有效的JSON数组")
}
for _, p := range placeholders {
if p.Key == "" {
return errors.New("占位符的key不能为空")
}
}
return nil
}
// getMaps 获取查询条件
func (s *MessageTemplateService) getMaps() map[string]interface{} {
maps := make(map[string]interface{})
if s.Status != "" {
maps["status"] = s.Status
}
return maps
}