admin_backend/model/mail.go
2026-04-22 16:44:37 +08:00

133 lines
4.6 KiB
Go

package model
import (
"backend/msg"
util "backend/util"
"fmt"
"log"
)
type Mail struct {
AppId int `json:"AppId"`
ServerId int `json:"ServerId"`
PageSize int `json:"PageSize"`
CurrentPage int `json:"CurrentPage"`
MailId int `json:"mail_id" db:"mail_id"`
Title string `json:"title" db:"title"`
SubTitle string `json:"subtitle" db:"subTitle"`
Content string `json:"content" db:"content"`
TitleEn string `json:"title_en" db:"title_en"`
SubTitleEn string `json:"subtitle_en" db:"subTitle_en"`
ContentEn string `json:"content_en" db:"content_en"`
TitlePtBr string `json:"title_ptbr" db:"title_ptbr"`
SubTitlePtBr string `json:"subtitle_ptbr" db:"subTitle_ptbr"`
ContentPtBr string `json:"content_ptbr" db:"content_ptbr"`
TitleEsLatam string `json:"title_es_latam" db:"title_es_latam"`
SubTitleEsLatam string `json:"subtitle_es_latam" db:"subtitle_es_latam"`
ContentEsLatam string `json:"content_es_latam" db:"content_es_latam"`
StartTime int64 `json:"start_time" db:"start_time"`
EndTime int64 `json:"end_time" db:"end_time"`
Items string `json:"items" db:"items"`
RegisterTime int64 `json:"register_time" db:"register_time"`
MailType int `json:"mail_type" db:"mail_type"`
SendType int `json:"send_type" db:"send_type"`
ToUids string `json:"to_uids" db:"to_uids"`
CreateTime int64 `json:"create_time" db:"create_time"`
MinLevel int `json:"min_level" db:"level"`
}
type Result struct {
Data interface{} `json:"data"`
Total int `json:"total"`
OperationList []string `json:"operationList,omitempty"`
}
func (m *Mail) MailList() (*Result, error) {
// do something
AppCfg, err := util.GetAppConfig(m.AppId)
if err != nil {
return nil, err
}
Db := util.MPool.GetMysqlDB(AppCfg, m.ServerId)
if Db == nil {
return nil, fmt.Errorf("failed to get mysql db")
}
defer Db.Close()
var mail []*Mail
err = Db.Select(&mail, "SELECT `mail_id`, `title`, `content`, `start_time`, `end_time`, `items`, `register_time`, `mail_type`,`send_type`, `to_uids`, `create_time`, `subTitle`, `subTitle_en`, `content_en`, `title_en`, `title_ptbr`,`subTitle_ptbr`, `content_ptbr`, `title_es_latam`, `subtitle_es_latam`, `content_es_latam` FROM system_mail_info order by mail_id desc limit ?, ?", (m.CurrentPage-1)*m.PageSize, m.PageSize)
if err != nil {
return nil, fmt.Errorf("failed to scan rows: %v", err)
}
var total int
err = Db.Get(&total, "SELECT COUNT(*) FROM system_mail_info")
if err != nil {
return nil, fmt.Errorf("failed to get total count: %v", err)
}
for _, v := range mail {
v.AppId = m.AppId
v.ServerId = m.ServerId
}
return &Result{
Data: mail,
Total: total,
}, nil
}
func (m *Mail) SendMail() error {
AppCfg, err := util.GetAppConfig(m.AppId)
if err != nil {
return err
}
Db := util.MPool.GetMysqlDB(AppCfg, m.ServerId)
if Db == nil {
return fmt.Errorf("failed to get mysql db")
}
defer Db.Close()
m.CreateTime = util.Now()
_, err = Db.Exec("INSERT INTO system_mail_info (`title`, `content`, `title_en`, `content_en`, `start_time`, `end_time`, `items`, `register_time`, `mail_type`, `send_type`, `to_uids`, `create_time`, `subTitle`, `subTitle_en`, `title_ptbr`,`content_ptbr`,`subTitle_ptbr`, `title_es_latam`, `subTitle_es_latam`, `content_es_latam`, `level`, `create_time`) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)", m.Title, m.Content, m.TitleEn, m.ContentEn, m.StartTime, m.EndTime, m.Items, m.RegisterTime, m.MailType, m.SendType, m.ToUids, m.CreateTime, m.SubTitle, m.SubTitleEn, m.TitlePtBr, m.ContentPtBr, m.SubTitlePtBr, m.TitleEsLatam, m.SubTitleEsLatam, m.ContentEsLatam, m.MinLevel, m.CreateTime)
if err != nil {
return fmt.Errorf("failed to insert mail: %v", err)
}
ServerList := util.GetServerInfo(m.AppId, 0)
for _, server := range ServerList {
go func(serverInfo util.ServerConfig) {
ws, err := util.GetWebsocket(m.AppId, server.ServerId)
if err != nil {
log.Printf("failed to get websocket: %v", err)
}
defer ws.Close()
req := &msg.ReqReloadServerMail{}
_, err = util.SendAdminMsg(ws, req)
if err != nil {
log.Printf("failed to send admin message: %v", err)
}
log.Printf("sent reload mail message to server %d", server.ServerId)
}(server)
}
return nil
}
func (m *Mail) DeleteMail() error {
AppCfg, err := util.GetAppConfig(m.AppId)
if err != nil {
return err
}
Db := util.MPool.GetMysqlDB(AppCfg, m.ServerId)
if Db == nil {
return fmt.Errorf("failed to get mysql db")
}
defer Db.Close()
_, err = Db.Exec("DELETE FROM system_mail_info WHERE `mail_id` = ?", m.MailId)
if err != nil {
return fmt.Errorf("failed to delete mail: %v", err)
}
return nil
}