Files
platform/web/handlers/article.go

171 lines
3.2 KiB
Go
Raw Normal View History

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
}