Files
yunzerwebsiteallinone/go/controllers/platform_sitereminder.go
T
2026-09-15 10:44:31 +08:00

368 lines
10 KiB
Go
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
package controllers
import (
"encoding/json"
"fmt"
"io"
"strconv"
"strings"
"server/pkg/jwtutil"
"server/services"
beego "github.com/beego/beego/v2/server/web"
)
type PlatformSiteReminderController struct {
beego.Controller
}
func (c *PlatformSiteReminderController) platformClaims() (*jwtutil.Claims, error) {
auth := c.Ctx.Request.Header.Get("Authorization")
if auth == "" {
return nil, fmt.Errorf("未登录")
}
parts := strings.SplitN(auth, " ", 2)
if len(parts) != 2 || parts[0] != "Bearer" {
return nil, fmt.Errorf("认证信息格式错误")
}
claims, err := jwtutil.ParseToken(parts[1])
if err != nil {
return nil, fmt.Errorf("无效的token")
}
if claims.UserType != "platform" {
return nil, fmt.Errorf("无权访问")
}
return claims, nil
}
// mergeReminderTargetIDs 合并多选目标ID与旧版单值入参。
// 旧版:role → target_role_id,tenant → target_tenant_id;多选参数优先。
func mergeReminderTargetIDs(targetType string, targetIDs []uint64, legacyRoleID, legacyTenantID uint64) []uint64 {
ids := make([]uint64, 0, len(targetIDs)+1)
for _, id := range targetIDs {
if id > 0 {
ids = append(ids, id)
}
}
if len(ids) == 0 {
switch targetType {
case "role":
if legacyRoleID > 0 {
ids = append(ids, legacyRoleID)
}
case "tenant":
if legacyTenantID > 0 {
ids = append(ids, legacyTenantID)
}
}
}
return ids
}
func (c *PlatformSiteReminderController) jsonErr(httpStatus, bizCode int, msg string) {
c.Ctx.Output.SetStatus(httpStatus)
c.Data["json"] = map[string]interface{}{"code": bizCode, "msg": msg}
_ = c.ServeJSON()
}
// GetConfig GET /platform/sitereminder/config
func (c *PlatformSiteReminderController) GetConfig() {
if _, err := c.platformClaims(); err != nil {
c.jsonErr(401, 401, err.Error())
return
}
cfg, err := services.GetSiteReminderConfig()
if err != nil {
c.jsonErr(500, 500, "获取配置失败: "+err.Error())
return
}
c.Data["json"] = map[string]interface{}{"code": 200, "msg": "success", "data": cfg}
_ = c.ServeJSON()
}
// SaveConfig POST /platform/sitereminder/config
func (c *PlatformSiteReminderController) SaveConfig() {
if _, err := c.platformClaims(); err != nil {
c.jsonErr(401, 401, err.Error())
return
}
raw, err := io.ReadAll(c.Ctx.Request.Body)
if err != nil {
c.jsonErr(400, 400, "参数错误")
return
}
var p struct {
RetentionDays int `json:"retention_days"`
AutoRead int8 `json:"auto_read"`
}
if err := json.Unmarshal(raw, &p); err != nil {
c.jsonErr(400, 400, "参数错误")
return
}
if err := services.SaveSiteReminderConfig(p.RetentionDays, p.AutoRead); err != nil {
c.jsonErr(500, 500, "保存配置失败: "+err.Error())
return
}
c.Data["json"] = map[string]interface{}{"code": 200, "msg": "保存成功"}
_ = c.ServeJSON()
}
// Send POST /platform/sitereminder/send
func (c *PlatformSiteReminderController) Send() {
claims, err := c.platformClaims()
if err != nil {
c.jsonErr(401, 401, err.Error())
return
}
raw, err := io.ReadAll(c.Ctx.Request.Body)
if err != nil {
c.jsonErr(400, 400, "参数错误")
return
}
var p struct {
Title string `json:"title"`
Content string `json:"content"`
TargetType string `json:"target_type"` // all, platform, tenant_all, tenant_role, tenant, tenant_user
TargetIDs []uint64 `json:"target_ids"`
TargetRoleID uint64 `json:"target_role_id"` // 兼容旧入参
TargetTenantID uint64 `json:"target_tenant_id"` // 兼容旧入参
}
if err := json.Unmarshal(raw, &p); err != nil {
c.jsonErr(400, 400, "参数错误")
return
}
p.Title = strings.TrimSpace(p.Title)
p.Content = strings.TrimSpace(p.Content)
if p.Title == "" || p.Content == "" {
c.jsonErr(400, 400, "标题与内容不能为空")
return
}
if p.TargetType == "" {
c.jsonErr(400, 400, "发送目标类型不能为空")
return
}
targetIDs := mergeReminderTargetIDs(p.TargetType, p.TargetIDs, p.TargetRoleID, p.TargetTenantID)
err = services.SendSiteReminder(p.Title, p.Content, uint64(claims.UserID), "platform", p.TargetType, targetIDs)
if err != nil {
c.jsonErr(500, 500, "发送失败: "+err.Error())
return
}
c.Data["json"] = map[string]interface{}{"code": 200, "msg": "发送成功"}
_ = c.ServeJSON()
}
// GetMyList GET /platform/sitereminder/myList
func (c *PlatformSiteReminderController) GetMyList() {
claims, err := c.platformClaims()
if err != nil {
c.jsonErr(401, 401, err.Error())
return
}
page, _ := c.GetInt("page", 1)
pageSize, _ := c.GetInt("pageSize", 10)
var isRead *int8
if isReadStr := c.GetString("isRead"); isReadStr != "" {
if val, err := strconv.Atoi(isReadStr); err == nil {
v := int8(val)
isRead = &v
}
}
list, total, err := services.ListReminders(uint64(claims.UserID), "platform", page, pageSize, isRead)
if err != nil {
c.jsonErr(500, 500, "获取消息列表失败: "+err.Error())
return
}
c.Data["json"] = map[string]interface{}{
"code": 200,
"msg": "success",
"data": map[string]interface{}{
"list": list,
"total": total,
},
}
_ = c.ServeJSON()
}
// MarkRead POST /platform/sitereminder/read
func (c *PlatformSiteReminderController) MarkRead() {
claims, err := c.platformClaims()
if err != nil {
c.jsonErr(401, 401, err.Error())
return
}
raw, err := io.ReadAll(c.Ctx.Request.Body)
if err != nil {
c.jsonErr(400, 400, "参数错误")
return
}
var p struct {
ID uint64 `json:"id"`
}
if err := json.Unmarshal(raw, &p); err != nil {
c.jsonErr(400, 400, "参数错误")
return
}
err = services.MarkReminderRead(p.ID, uint64(claims.UserID), "platform")
if err != nil {
c.jsonErr(500, 500, "操作失败: "+err.Error())
return
}
c.Data["json"] = map[string]interface{}{"code": 200, "msg": "success"}
_ = c.ServeJSON()
}
// MarkAllRead POST /platform/sitereminder/readall
func (c *PlatformSiteReminderController) MarkAllRead() {
claims, err := c.platformClaims()
if err != nil {
c.jsonErr(401, 401, err.Error())
return
}
err = services.MarkAllRemindersRead(uint64(claims.UserID), "platform")
if err != nil {
c.jsonErr(500, 500, "操作失败: "+err.Error())
return
}
c.Data["json"] = map[string]interface{}{"code": 200, "msg": "success"}
_ = c.ServeJSON()
}
// Delete POST /platform/sitereminder/delete
func (c *PlatformSiteReminderController) Delete() {
claims, err := c.platformClaims()
if err != nil {
c.jsonErr(401, 401, err.Error())
return
}
raw, err := io.ReadAll(c.Ctx.Request.Body)
if err != nil {
c.jsonErr(400, 400, "参数错误")
return
}
var p struct {
ID uint64 `json:"id"`
}
if err := json.Unmarshal(raw, &p); err != nil {
c.jsonErr(400, 400, "参数错误")
return
}
err = services.DeleteReminder(p.ID, uint64(claims.UserID), "platform")
if err != nil {
c.jsonErr(500, 500, "删除失败: "+err.Error())
return
}
c.Data["json"] = map[string]interface{}{"code": 200, "msg": "success"}
_ = c.ServeJSON()
}
// GetSentList GET /platform/sitereminder/sentList
func (c *PlatformSiteReminderController) GetSentList() {
claims, err := c.platformClaims()
if err != nil {
c.jsonErr(401, 401, err.Error())
return
}
page, _ := c.GetInt("page", 1)
pageSize, _ := c.GetInt("pageSize", 10)
list, total, err := services.ListSentReminders(uint64(claims.UserID), page, pageSize)
if err != nil {
c.jsonErr(500, 500, "获取发送列表失败: "+err.Error())
return
}
c.Data["json"] = map[string]interface{}{
"code": 200,
"msg": "success",
"data": map[string]interface{}{
"list": list,
"total": total,
},
}
_ = c.ServeJSON()
}
// UpdateSent POST /platform/sitereminder/updateSent
func (c *PlatformSiteReminderController) UpdateSent() {
if _, err := c.platformClaims(); err != nil {
c.jsonErr(401, 401, err.Error())
return
}
raw, err := io.ReadAll(c.Ctx.Request.Body)
if err != nil {
c.jsonErr(400, 400, "参数错误")
return
}
var p struct {
BatchID string `json:"batch_id"`
Title string `json:"title"`
Content string `json:"content"`
TargetType string `json:"target_type"` // all, platform, tenant_all, tenant_role, tenant, tenant_user
TargetIDs []uint64 `json:"target_ids"`
TargetRoleID uint64 `json:"target_role_id"` // 兼容旧入参
TargetTenantID uint64 `json:"target_tenant_id"` // 兼容旧入参
}
if err := json.Unmarshal(raw, &p); err != nil {
c.jsonErr(400, 400, "参数错误")
return
}
p.Title = strings.TrimSpace(p.Title)
p.Content = strings.TrimSpace(p.Content)
if p.BatchID == "" || p.Title == "" || p.Content == "" {
c.jsonErr(400, 400, "批次号、标题与内容不能为空")
return
}
if p.TargetType == "" {
c.jsonErr(400, 400, "发送目标类型不能为空")
return
}
targetIDs := mergeReminderTargetIDs(p.TargetType, p.TargetIDs, p.TargetRoleID, p.TargetTenantID)
err = services.UpdateSentReminder(p.BatchID, p.Title, p.Content, p.TargetType, targetIDs)
if err != nil {
c.jsonErr(500, 500, "修改失败: "+err.Error())
return
}
c.Data["json"] = map[string]interface{}{"code": 200, "msg": "修改成功"}
_ = c.ServeJSON()
}
// DeleteSentBatch POST /platform/sitereminder/deleteSent
func (c *PlatformSiteReminderController) DeleteSentBatch() {
if _, err := c.platformClaims(); err != nil {
c.jsonErr(401, 401, err.Error())
return
}
raw, err := io.ReadAll(c.Ctx.Request.Body)
if err != nil {
c.jsonErr(400, 400, "参数错误")
return
}
var p struct {
BatchID string `json:"batch_id"`
}
if err := json.Unmarshal(raw, &p); err != nil {
c.jsonErr(400, 400, "参数错误")
return
}
if p.BatchID == "" {
c.jsonErr(400, 400, "批次号不能为空")
return
}
err = services.DeleteSentReminderBatch(p.BatchID)
if err != nil {
c.jsonErr(500, 500, "删除失败: "+err.Error())
return
}
c.Data["json"] = map[string]interface{}{"code": 200, "msg": "删除成功"}
_ = c.ServeJSON()
}