From 77ad2616707b5cf97eb441e12276e06213d96432 Mon Sep 17 00:00:00 2001 From: nyne Date: Thu, 28 Aug 2025 10:38:55 +0800 Subject: [PATCH] Add api for pinned resources --- server/api/config.go | 8 +++++++- server/api/resource.go | 16 ++++++++++++++++ server/config/config.go | 37 ++++++++++++++++++++++++++++++++++--- server/service/resource.go | 14 ++++++++++++++ 4 files changed, 71 insertions(+), 4 deletions(-) diff --git a/server/api/config.go b/server/api/config.go index 430c44f..ff2479d 100644 --- a/server/api/config.go +++ b/server/api/config.go @@ -48,7 +48,13 @@ func setServerConfig(c fiber.Ctx) error { return model.NewRequestError("Invalid request parameters") } - config.SetConfig(sc) + if err := config.SetConfig(sc); err != nil { + return model.NewInternalServerError("Failed to save configuration") + } + + if err := sc.Validate(); err != nil { + return model.NewRequestError(err.Error()) + } return c.JSON(model.Response[any]{ Success: true, diff --git a/server/api/resource.go b/server/api/resource.go index bc86034..2cb4dfa 100644 --- a/server/api/resource.go +++ b/server/api/resource.go @@ -267,6 +267,21 @@ func handleGetRandomResource(c fiber.Ctx) error { }) } +func handleGetPinnedResources(c fiber.Ctx) error { + views, err := service.GetPinnedResources() + if err != nil { + return err + } + if views == nil { + views = []model.ResourceView{} + } + return c.Status(fiber.StatusOK).JSON(model.Response[[]model.ResourceView]{ + Success: true, + Data: views, + Message: "Pinned resources retrieved successfully", + }) +} + func AddResourceRoutes(api fiber.Router) { resource := api.Group("/resource") { @@ -279,5 +294,6 @@ func AddResourceRoutes(api fiber.Router) { resource.Get("/tag/:tag", handleListResourcesWithTag) resource.Get("/user/:username", handleGetResourcesWithUser) resource.Post("/:id", handleUpdateResource) + resource.Get("/pinned", handleGetPinnedResources) } } diff --git a/server/config/config.go b/server/config/config.go index 4b2ef6c..c40f16c 100644 --- a/server/config/config.go +++ b/server/config/config.go @@ -2,6 +2,7 @@ package config import ( "encoding/json" + "errors" "nysoure/server/utils" "os" "path/filepath" @@ -34,6 +35,30 @@ type ServerConfig struct { MaxNormalUserUploadSizeInMB int `json:"max_normal_user_upload_size_in_mb"` // Prompt for upload page UploadPrompt string `json:"upload_prompt"` + // PinnedResources is a list of resource IDs that are pinned to the top of the page. + PinnedResources []uint `json:"pinned_resources"` +} + +func (c *ServerConfig) Validate() error { + if c.MaxUploadingSizeInMB <= 0 { + return errors.New("MaxUploadingSizeInMB must be positive") + } + if c.MaxFileSizeInMB <= 0 { + return errors.New("MaxFileSizeInMB must be positive") + } + if c.MaxDownloadsPerDayForSingleIP <= 0 { + return errors.New("MaxDownloadsPerDayForSingleIP must be positive") + } + if c.ServerName == "" { + return errors.New("ServerName must not be empty") + } + if c.ServerDescription == "" { + return errors.New("ServerDescription must not be empty") + } + if len(c.PinnedResources) > 8 { + return errors.New("PinnedResources must not exceed 8 items") + } + return nil } func init() { @@ -51,6 +76,7 @@ func init() { AllowNormalUserUpload: true, MaxNormalUserUploadSizeInMB: 16, UploadPrompt: "You can upload your files here.", + PinnedResources: []uint{}, } } else { data, err := os.ReadFile(p) @@ -68,16 +94,17 @@ func GetConfig() ServerConfig { return *config } -func SetConfig(newConfig ServerConfig) { +func SetConfig(newConfig ServerConfig) error { config = &newConfig data, err := json.MarshalIndent(config, "", " ") if err != nil { - panic(err) + return err } p := filepath.Join(utils.GetStoragePath(), "config.json") if err := os.WriteFile(p, data, 0644); err != nil { - panic(err) + return err } + return nil } func MaxUploadingSize() int64 { @@ -127,3 +154,7 @@ func MaxNormalUserUploadSize() int64 { func UploadPrompt() string { return config.UploadPrompt } + +func PinnedResources() []uint { + return config.PinnedResources +} diff --git a/server/service/resource.go b/server/service/resource.go index a84980f..9bc26d2 100644 --- a/server/service/resource.go +++ b/server/service/resource.go @@ -2,6 +2,7 @@ package service import ( "net/url" + "nysoure/server/config" "nysoure/server/dao" "nysoure/server/model" "strconv" @@ -286,3 +287,16 @@ func RandomResource(host string) (*model.ResourceDetailView, error) { } return &v, nil } + +func GetPinnedResources() ([]model.ResourceView, error) { + ids := config.PinnedResources() + var views []model.ResourceView + for _, id := range ids { + r, err := dao.GetResourceByID(id) + if err != nil { + continue + } + views = append(views, r.ToView()) + } + return views, nil +}