2026-06-01 15:31:25 +08:00
|
|
|
package handlers
|
|
|
|
|
|
|
|
|
|
import (
|
2026-06-06 17:22:01 +08:00
|
|
|
"platform/pkg/env"
|
2026-06-01 15:31:25 +08:00
|
|
|
"platform/web/auth"
|
|
|
|
|
"platform/web/core"
|
|
|
|
|
g "platform/web/globals"
|
|
|
|
|
s "platform/web/services"
|
2026-06-06 17:22:01 +08:00
|
|
|
"strings"
|
2026-06-01 15:31:25 +08:00
|
|
|
|
|
|
|
|
"github.com/gofiber/fiber/v2"
|
|
|
|
|
)
|
|
|
|
|
|
|
|
|
|
func NavArticle(c *fiber.Ctx) error {
|
|
|
|
|
_, err := auth.GetAuthCtx(c).PermitOfficialClient()
|
|
|
|
|
if err != nil {
|
|
|
|
|
return err
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
list, err := s.Article.Nav()
|
|
|
|
|
if err != nil {
|
|
|
|
|
return err
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
return c.JSON(list)
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
func GetArticle(c *fiber.Ctx) error {
|
|
|
|
|
_, err := auth.GetAuthCtx(c).PermitOfficialClient()
|
|
|
|
|
if err != nil {
|
|
|
|
|
return err
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
var req core.IdReq
|
|
|
|
|
if err := g.Validator.ParseBody(c, &req); err != nil {
|
|
|
|
|
return err
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
article, err := s.Article.GetPublic(req.Id)
|
|
|
|
|
if err != nil {
|
|
|
|
|
return err
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
return c.JSON(article)
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
func PageArticleByAdmin(c *fiber.Ctx) error {
|
|
|
|
|
_, err := auth.GetAuthCtx(c).PermitAdmin(core.ScopeArticleRead)
|
|
|
|
|
if err != nil {
|
|
|
|
|
return err
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
var req s.PageArticleReq
|
|
|
|
|
if err := g.Validator.ParseBody(c, &req); err != nil {
|
|
|
|
|
return err
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
list, total, err := s.Article.Page(&req)
|
|
|
|
|
if err != nil {
|
|
|
|
|
return err
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
return c.JSON(core.PageResp{
|
|
|
|
|
Total: int(total),
|
|
|
|
|
Page: req.GetPage(),
|
|
|
|
|
Size: req.GetSize(),
|
|
|
|
|
List: list,
|
|
|
|
|
})
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
func GetArticleByAdmin(c *fiber.Ctx) error {
|
|
|
|
|
_, err := auth.GetAuthCtx(c).PermitAdmin(core.ScopeArticleRead)
|
|
|
|
|
if err != nil {
|
|
|
|
|
return err
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
var req core.IdReq
|
|
|
|
|
if err := g.Validator.ParseBody(c, &req); err != nil {
|
|
|
|
|
return err
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
article, err := s.Article.GetByAdmin(req.Id)
|
|
|
|
|
if err != nil {
|
|
|
|
|
return err
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
return c.JSON(article)
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
func CreateArticle(c *fiber.Ctx) error {
|
|
|
|
|
_, err := auth.GetAuthCtx(c).PermitAdmin(core.ScopeArticleWrite)
|
|
|
|
|
if err != nil {
|
|
|
|
|
return err
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
var req s.CreateArticleData
|
|
|
|
|
if err := g.Validator.ParseBody(c, &req); err != nil {
|
|
|
|
|
return err
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
return s.Article.Create(req)
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
func UpdateArticle(c *fiber.Ctx) error {
|
|
|
|
|
_, err := auth.GetAuthCtx(c).PermitAdmin(core.ScopeArticleWrite)
|
|
|
|
|
if err != nil {
|
|
|
|
|
return err
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
var req s.UpdateArticleData
|
|
|
|
|
if err := g.Validator.ParseBody(c, &req); err != nil {
|
|
|
|
|
return err
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
return s.Article.Update(req)
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
func DeleteArticle(c *fiber.Ctx) error {
|
|
|
|
|
_, err := auth.GetAuthCtx(c).PermitAdmin(core.ScopeArticleWrite)
|
|
|
|
|
if err != nil {
|
|
|
|
|
return err
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
var req core.IdReq
|
|
|
|
|
if err := g.Validator.ParseBody(c, &req); err != nil {
|
|
|
|
|
return err
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
return s.Article.Delete(req.Id)
|
|
|
|
|
}
|
2026-06-06 17:22:01 +08:00
|
|
|
|
|
|
|
|
func UploadArticleImage(c *fiber.Ctx) error {
|
|
|
|
|
_, err := auth.GetAuthCtx(c).PermitAdmin(core.ScopeArticleWrite)
|
|
|
|
|
if err != nil {
|
|
|
|
|
return err
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
fileHeader, err := c.FormFile("file")
|
|
|
|
|
if err != nil {
|
|
|
|
|
return fiber.NewError(fiber.StatusBadRequest, "缺少上传文件 file")
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
result, err := s.Article.UploadImage(fileHeader, articleUploadBaseURL(c))
|
|
|
|
|
if err != nil {
|
|
|
|
|
return err
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
return c.JSON(result)
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
func articleUploadBaseURL(c *fiber.Ctx) string {
|
|
|
|
|
if env.UploadPublicBaseURL != "" {
|
|
|
|
|
return strings.TrimRight(env.UploadPublicBaseURL, "/")
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
scheme := c.Protocol()
|
|
|
|
|
if forwardedProto := c.Get("X-Forwarded-Proto"); forwardedProto != "" {
|
|
|
|
|
scheme = strings.TrimSpace(strings.Split(forwardedProto, ",")[0])
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
host := c.Get(fiber.HeaderHost)
|
|
|
|
|
if forwardedHost := c.Get("X-Forwarded-Host"); forwardedHost != "" {
|
|
|
|
|
host = strings.TrimSpace(strings.Split(forwardedHost, ",")[0])
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if host == "" {
|
|
|
|
|
return ""
|
|
|
|
|
}
|
|
|
|
|
return scheme + "://" + host
|
|
|
|
|
}
|