Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
105 lines
2.4 KiB
Go
105 lines
2.4 KiB
Go
package configser
|
|
|
|
import (
|
|
"fmt"
|
|
"html/template"
|
|
"net/url"
|
|
"strings"
|
|
"videoweb/app/service/upstream"
|
|
"videoweb/pub/common/log"
|
|
|
|
"github.com/gin-gonic/gin"
|
|
)
|
|
|
|
const richtextListPath = "/api/app/config/richtext/list"
|
|
|
|
// RichTextPageVM 富文本页模板数据。
|
|
type RichTextPageVM struct {
|
|
Title string
|
|
Subtitle string
|
|
ContentHTML template.HTML
|
|
Found bool
|
|
}
|
|
|
|
// FetchRichTextList 查询富文本列表(ids / titles 逗号分隔)。
|
|
func FetchRichTextList(c *gin.Context, ids, titles string) ([]AppRichTextItemResp, error) {
|
|
params := url.Values{}
|
|
if s := strings.TrimSpace(ids); s != "" {
|
|
params.Set("ids", s)
|
|
}
|
|
if s := strings.TrimSpace(titles); s != "" {
|
|
params.Set("titles", s)
|
|
}
|
|
path := richtextListPath
|
|
if q := params.Encode(); q != "" {
|
|
path += "?" + q
|
|
}
|
|
|
|
var env APIEnvelope[AppRichTextListResp]
|
|
if err := upstream.GetPublicJSON(c, path, &env); err != nil {
|
|
return nil, err
|
|
}
|
|
if env.Code != 200 {
|
|
return nil, fmt.Errorf("richtext list code=%d msg=%s", env.Code, env.Msg)
|
|
}
|
|
return env.Data.List, nil
|
|
}
|
|
|
|
// FetchRichTextByTitle 按标题取第一条启用内容;失败返回空页 VM。
|
|
func FetchRichTextByTitle(c *gin.Context, title string) RichTextPageVM {
|
|
title = strings.TrimSpace(title)
|
|
vm := RichTextPageVM{Title: title}
|
|
if title == "" {
|
|
return vm
|
|
}
|
|
|
|
list, err := FetchRichTextList(c, "", title)
|
|
if err != nil {
|
|
log.Error("fetch richtext by title failed", log.E(err), log.Any("title", title))
|
|
return vm
|
|
}
|
|
|
|
item := matchRichTextByTitle(list, title)
|
|
if item == nil {
|
|
return vm
|
|
}
|
|
|
|
displayTitle := strings.TrimSpace(item.Desc)
|
|
if displayTitle == "" {
|
|
displayTitle = strings.TrimSpace(item.Title)
|
|
}
|
|
if displayTitle == "" {
|
|
displayTitle = title
|
|
}
|
|
|
|
vm.Found = true
|
|
vm.Title = displayTitle
|
|
vm.Subtitle = strings.TrimSpace(item.Desc)
|
|
if vm.Subtitle == displayTitle {
|
|
vm.Subtitle = ""
|
|
}
|
|
vm.ContentHTML = template.HTML(item.Content)
|
|
return vm
|
|
}
|
|
|
|
func matchRichTextByTitle(list []AppRichTextItemResp, title string) *AppRichTextItemResp {
|
|
if len(list) == 0 {
|
|
return nil
|
|
}
|
|
for i := range list {
|
|
if strings.TrimSpace(list[i].Title) == title || strings.TrimSpace(list[i].Desc) == title {
|
|
return &list[i]
|
|
}
|
|
}
|
|
return &list[0]
|
|
}
|
|
|
|
// RichTextHref 页脚导航跳转一律进入富文本页。
|
|
func RichTextHref(title string) string {
|
|
title = strings.TrimSpace(title)
|
|
if title == "" {
|
|
return "/richtext/"
|
|
}
|
|
return "/richtext/" + title + "/"
|
|
}
|