From 9936b3af5b3e1587c7b7eaca7f9267226338aacb Mon Sep 17 00:00:00 2001 From: yusing Date: Fri, 24 Jan 2025 05:11:35 +0800 Subject: [PATCH] improved homepage config implementation --- internal/api/v1/homepage_overrides.go | 81 ++++++++++++++++++--------- internal/homepage/icon_url.go | 1 + internal/homepage/override_config.go | 35 ++++-------- 3 files changed, 69 insertions(+), 48 deletions(-) diff --git a/internal/api/v1/homepage_overrides.go b/internal/api/v1/homepage_overrides.go index 6a51a45..0d570fb 100644 --- a/internal/api/v1/homepage_overrides.go +++ b/internal/api/v1/homepage_overrides.go @@ -1,56 +1,87 @@ package v1 import ( + "encoding/json" + "io" "net/http" - "strconv" + "github.com/yusing/go-proxy/internal/api/v1/utils" "github.com/yusing/go-proxy/internal/homepage" - "github.com/yusing/go-proxy/internal/utils" - "github.com/yusing/go-proxy/internal/utils/strutils" ) const ( HomepageOverrideItem = "item" + HomepageOverrideItemsBatch = "items_batch" HomepageOverrideCategoryOrder = "category_order" - HomepageOverrideCategoryName = "category_name" HomepageOverrideItemVisible = "item_visible" ) +type ( + HomepageOverrideItemParams struct { + Which string `json:"which"` + Value homepage.ItemConfig `json:"value"` + } + HomepageOverrideItemsBatchParams struct { + Value map[string]*homepage.ItemConfig `json:"value"` + } + HomepageOverrideCategoryOrderParams struct { + Which string `json:"which"` + Value int `json:"value"` + } + HomepageOverrideItemVisibleParams struct { + Which []string `json:"which"` + Value bool `json:"value"` + } +) + func SetHomePageOverrides(w http.ResponseWriter, r *http.Request) { - what, which, value := r.FormValue("what"), r.FormValue("which"), r.FormValue("value") - if what == "" || which == "" { + what := r.FormValue("what") + if what == "" { http.Error(w, "missing what or which", http.StatusBadRequest) return } - if value == "" { - http.Error(w, "missing value", http.StatusBadRequest) + + data, err := io.ReadAll(r.Body) + if err != nil { + utils.RespondError(w, err, http.StatusBadRequest) return } + r.Body.Close() + overrides := homepage.GetOverrideConfig() switch what { case HomepageOverrideItem: - var override homepage.ItemConfig - if err := utils.DeserializeJSON([]byte(value), &override); err != nil { - http.Error(w, err.Error(), http.StatusBadRequest) + var params HomepageOverrideItemParams + if err := json.Unmarshal(data, ¶ms); err != nil { + utils.RespondError(w, err, http.StatusBadRequest) return } - overrides.OverrideItem(which, &override) + overrides.OverrideItem(params.Which, ¶ms.Value) + case HomepageOverrideItemsBatch: + var params HomepageOverrideItemsBatchParams + if err := json.Unmarshal(data, ¶ms); err != nil { + utils.RespondError(w, err, http.StatusBadRequest) + return + } + overrides.OverrideItems(params.Value) case HomepageOverrideItemVisible: // POST /v1/item_visible [a,b,c], false => hide a, b, c - keys := strutils.CommaSeperatedList(which) - if strutils.ParseBool(value) { - overrides.UnhideItems(keys...) - } else { - overrides.HideItems(keys...) - } - case HomepageOverrideCategoryName: - overrides.SetCategoryNameOverride(which, value) - case HomepageOverrideCategoryOrder: - v, err := strconv.Atoi(value) - if err != nil { - http.Error(w, "invalid integer", http.StatusBadRequest) + var params HomepageOverrideItemVisibleParams + if err := json.Unmarshal(data, ¶ms); err != nil { + utils.RespondError(w, err, http.StatusBadRequest) return } - overrides.SetCategoryOrder(which, v) + if params.Value { + overrides.UnhideItems(params.Which...) + } else { + overrides.HideItems(params.Which...) + } + case HomepageOverrideCategoryOrder: + var params HomepageOverrideCategoryOrderParams + if err := json.Unmarshal(data, ¶ms); err != nil { + utils.RespondError(w, err, http.StatusBadRequest) + return + } + overrides.SetCategoryOrder(params.Which, params.Value) default: http.Error(w, "invalid what", http.StatusBadRequest) return diff --git a/internal/homepage/icon_url.go b/internal/homepage/icon_url.go index 0ba7c12..f5265a4 100644 --- a/internal/homepage/icon_url.go +++ b/internal/homepage/icon_url.go @@ -158,6 +158,7 @@ func (u *IconURL) MarshalText() ([]byte, error) { return []byte(u.String()), nil } +// UnmarshalText implements encoding.TextUnmarshaler. func (u *IconURL) UnmarshalText(data []byte) error { return u.Parse(string(data)) } diff --git a/internal/homepage/override_config.go b/internal/homepage/override_config.go index bcf7db9..4d10717 100644 --- a/internal/homepage/override_config.go +++ b/internal/homepage/override_config.go @@ -11,8 +11,7 @@ import ( type OverrideConfig struct { ItemOverrides map[string]*ItemConfig `json:"item_overrides"` - DisplayOrder map[string]int `json:"display_order"` // TODO: implement this - CategoryName map[string]string `json:"category_name"` + DisplayOrder map[string]int `json:"display_order"` // TODO: implement this CategoryOrder map[string]int `json:"category_order"` // TODO: implement this ItemVisibility map[string]bool `json:"item_visibility"` mu sync.RWMutex @@ -31,7 +30,6 @@ func InitOverridesConfig() { overrideConfigInstance = &OverrideConfig{ ItemOverrides: make(map[string]*ItemConfig), DisplayOrder: make(map[string]int), - CategoryName: make(map[string]string), CategoryOrder: make(map[string]int), ItemVisibility: make(map[string]bool), } @@ -65,29 +63,26 @@ func (c *OverrideConfig) OverrideItem(alias string, override *ItemConfig) { c.ItemOverrides[alias] = override } +func (c *OverrideConfig) OverrideItems(items map[string]*ItemConfig) { + c.mu.Lock() + defer c.mu.Unlock() + for key, value := range items { + c.ItemOverrides[key] = value + } +} + func (c *OverrideConfig) GetOverride(item *Item) *Item { - orig := item c.mu.RLock() defer c.mu.RUnlock() - itemOverride, ok := c.ItemOverrides[item.Alias] - if !ok { - if catOverride, ok := c.CategoryName[item.Category]; ok { - clone := *item - clone.Category = catOverride - clone.IsUnset = false - item = &clone - } - } else { + itemOverride, hasOverride := c.ItemOverrides[item.Alias] + if hasOverride { clone := *item clone.ItemConfig = itemOverride clone.IsUnset = false - if catOverride, ok := c.CategoryName[clone.Category]; ok { - clone.Category = catOverride - } item = &clone } if show, ok := c.ItemVisibility[item.Alias]; ok { - if item == orig { + if !hasOverride { clone := *item clone.Show = show item = &clone @@ -98,12 +93,6 @@ func (c *OverrideConfig) GetOverride(item *Item) *Item { return item } -func (c *OverrideConfig) SetCategoryNameOverride(key, value string) { - c.mu.Lock() - defer c.mu.Unlock() - c.CategoryName[key] = value -} - func (c *OverrideConfig) SetCategoryOrder(key string, value int) { c.mu.Lock() defer c.mu.Unlock()