Files
nl-blogs/server/handlers/ppt_template.go
2026-07-14 09:37:13 +08:00

226 lines
5.2 KiB
Go

package handlers
import (
"errors"
"fmt"
"strings"
"github.com/gin-gonic/gin"
"github.com/niangaodev/art-code/models"
"github.com/niangaodev/art-code/repositories"
"github.com/niangaodev/art-code/utils"
)
func pptTemplatePayloads(list []models.PptTemplate) ([]models.PptTemplatePayload, error) {
out := make([]models.PptTemplatePayload, 0, len(list))
for i := range list {
p, err := repositories.ToPptTemplatePayload(&list[i])
if err != nil {
return nil, err
}
out = append(out, p)
}
return out, nil
}
// GetPptTemplates 公开:获取启用的 PPT 模板
func GetPptTemplates(c *gin.Context) {
list, err := repositories.GetActivePptTemplates()
if err != nil {
utils.ServerError(c, err)
return
}
payloads, err := pptTemplatePayloads(list)
if err != nil {
utils.ServerError(c, err)
return
}
if payloads == nil {
payloads = []models.PptTemplatePayload{}
}
utils.Success(c, payloads)
}
// GetDefaultPptTemplate 公开:获取系统默认模板
func GetDefaultPptTemplate(c *gin.Context) {
t, err := repositories.GetSystemPptTemplate()
if err != nil {
utils.Error(c, 404, "Default template not found")
return
}
payload, err := repositories.ToPptTemplatePayload(t)
if err != nil {
utils.ServerError(c, err)
return
}
utils.Success(c, payload)
}
// AdminGetPptTemplates 管理:获取全部模板
func AdminGetPptTemplates(c *gin.Context) {
list, err := repositories.GetAllPptTemplates()
if err != nil {
utils.ServerError(c, err)
return
}
payloads, err := pptTemplatePayloads(list)
if err != nil {
utils.ServerError(c, err)
return
}
if payloads == nil {
payloads = []models.PptTemplatePayload{}
}
utils.Success(c, payloads)
}
// AdminCreatePptTemplate 管理:创建模板
func AdminCreatePptTemplate(c *gin.Context) {
var req models.PptTemplatePayload
if err := c.ShouldBindJSON(&req); err != nil {
utils.Error(c, 400, "Invalid request")
return
}
req.Name = strings.TrimSpace(req.Name)
req.Slug = strings.TrimSpace(req.Slug)
if req.Name == "" || req.Slug == "" {
utils.Error(c, 400, "Name and slug are required")
return
}
if req.Slug == repositories.DefaultPptTemplateSlug {
utils.Error(c, 400, "Slug 'default' is reserved for system template")
return
}
configJSON, err := repositories.SerializePptTemplateConfig(req.Config)
if err != nil {
utils.Error(c, 400, "Invalid config JSON")
return
}
t := models.PptTemplate{
Name: req.Name,
Slug: req.Slug,
Description: strings.TrimSpace(req.Description),
Config: configJSON,
IsSystem: false,
IsDefault: req.IsDefault,
SortOrder: req.SortOrder,
IsActive: req.IsActive,
}
if err := repositories.CreatePptTemplate(&t); err != nil {
utils.ServerError(c, err)
return
}
if t.IsDefault {
_ = repositories.ClearDefaultPptTemplatesExcept(t.ID)
}
payload, err := repositories.ToPptTemplatePayload(&t)
if err != nil {
utils.ServerError(c, err)
return
}
utils.SuccessWithMsg(c, "PPT template created", payload)
}
// AdminUpdatePptTemplate 管理:更新模板
func AdminUpdatePptTemplate(c *gin.Context) {
idStr := c.Param("id")
var id uint
if _, err := fmt.Sscanf(idStr, "%d", &id); err != nil {
utils.Error(c, 400, "Invalid ID")
return
}
existing, err := repositories.GetPptTemplateByID(id)
if err != nil {
utils.Error(c, 404, "Template not found")
return
}
var req models.PptTemplatePayload
if err := c.ShouldBindJSON(&req); err != nil {
utils.Error(c, 400, "Invalid request")
return
}
req.Name = strings.TrimSpace(req.Name)
if req.Name == "" {
utils.Error(c, 400, "Name is required")
return
}
configJSON, err := repositories.SerializePptTemplateConfig(req.Config)
if err != nil {
utils.Error(c, 400, "Invalid config JSON")
return
}
t := *existing
t.Name = req.Name
t.Description = strings.TrimSpace(req.Description)
t.Config = configJSON
t.SortOrder = req.SortOrder
if existing.IsSystem {
t.Slug = repositories.DefaultPptTemplateSlug
t.IsSystem = true
t.IsActive = true
t.IsDefault = req.IsDefault
} else {
req.Slug = strings.TrimSpace(req.Slug)
if req.Slug == "" {
utils.Error(c, 400, "Slug is required")
return
}
if req.Slug == repositories.DefaultPptTemplateSlug {
utils.Error(c, 400, "Slug 'default' is reserved")
return
}
t.Slug = req.Slug
t.IsDefault = req.IsDefault
t.IsActive = req.IsActive
}
if err := repositories.UpdatePptTemplate(&t); err != nil {
utils.ServerError(c, err)
return
}
if t.IsDefault {
_ = repositories.ClearDefaultPptTemplatesExcept(t.ID)
}
payload, err := repositories.ToPptTemplatePayload(&t)
if err != nil {
utils.ServerError(c, err)
return
}
utils.SuccessWithMsg(c, "PPT template updated", payload)
}
// AdminDeletePptTemplate 管理:删除模板
func AdminDeletePptTemplate(c *gin.Context) {
idStr := c.Param("id")
var id uint
if _, err := fmt.Sscanf(idStr, "%d", &id); err != nil {
utils.Error(c, 400, "Invalid ID")
return
}
if err := repositories.DeletePptTemplate(id); err != nil {
if errors.Is(err, repositories.ErrPptTemplateSystemDelete) {
utils.Error(c, 400, "System default template cannot be deleted")
return
}
utils.ServerError(c, err)
return
}
utils.SuccessWithMsg(c, "PPT template deleted", nil)
}