package handlers import ( "platform/pkg/env" "platform/web/auth" "platform/web/core" g "platform/web/globals" s "platform/web/services" "strings" "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) } 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 }