diff --git a/internal/api/v1/homepage_overrides.go b/internal/api/v1/homepage_overrides.go index 48e0d4c8..6a51a457 100644 --- a/internal/api/v1/homepage_overrides.go +++ b/internal/api/v1/homepage_overrides.go @@ -6,12 +6,14 @@ import ( "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" HomepageOverrideCategoryOrder = "category_order" HomepageOverrideCategoryName = "category_name" + HomepageOverrideItemVisible = "item_visible" ) func SetHomePageOverrides(w http.ResponseWriter, r *http.Request) { @@ -33,6 +35,13 @@ func SetHomePageOverrides(w http.ResponseWriter, r *http.Request) { return } overrides.OverrideItem(which, &override) + 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: diff --git a/internal/homepage/override_config.go b/internal/homepage/override_config.go index 8da06a84..bcf7db9c 100644 --- a/internal/homepage/override_config.go +++ b/internal/homepage/override_config.go @@ -10,11 +10,12 @@ 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"` - CategoryOrder map[string]int `json:"category_order"` // TODO: implement this - mu sync.RWMutex + ItemOverrides map[string]*ItemConfig `json:"item_overrides"` + DisplayOrder map[string]int `json:"display_order"` // TODO: implement this + CategoryName map[string]string `json:"category_name"` + CategoryOrder map[string]int `json:"category_order"` // TODO: implement this + ItemVisibility map[string]bool `json:"item_visibility"` + mu sync.RWMutex } var overrideConfigInstance *OverrideConfig @@ -28,10 +29,11 @@ func must(b []byte, err error) []byte { func InitOverridesConfig() { overrideConfigInstance = &OverrideConfig{ - ItemOverrides: make(map[string]*ItemConfig), - DisplayOrder: make(map[string]int), - CategoryName: make(map[string]string), - CategoryOrder: make(map[string]int), + 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), } err := utils.LoadJSONIfExist(common.HomepageJSONConfigPath, overrideConfigInstance) if err != nil { @@ -64,6 +66,7 @@ func (c *OverrideConfig) OverrideItem(alias string, override *ItemConfig) { } func (c *OverrideConfig) GetOverride(item *Item) *Item { + orig := item c.mu.RLock() defer c.mu.RUnlock() itemOverride, ok := c.ItemOverrides[item.Alias] @@ -72,9 +75,8 @@ func (c *OverrideConfig) GetOverride(item *Item) *Item { clone := *item clone.Category = catOverride clone.IsUnset = false - return &clone + item = &clone } - return item } else { clone := *item clone.ItemConfig = itemOverride @@ -82,8 +84,18 @@ func (c *OverrideConfig) GetOverride(item *Item) *Item { if catOverride, ok := c.CategoryName[clone.Category]; ok { clone.Category = catOverride } - return &clone + item = &clone } + if show, ok := c.ItemVisibility[item.Alias]; ok { + if item == orig { + clone := *item + clone.Show = show + item = &clone + } else { + item.Show = show + } + } + return item } func (c *OverrideConfig) SetCategoryNameOverride(key, value string) { @@ -97,3 +109,19 @@ func (c *OverrideConfig) SetCategoryOrder(key string, value int) { defer c.mu.Unlock() c.CategoryOrder[key] = value } + +func (c *OverrideConfig) UnhideItems(keys ...string) { + c.mu.Lock() + defer c.mu.Unlock() + for _, key := range keys { + c.ItemVisibility[key] = true + } +} + +func (c *OverrideConfig) HideItems(keys ...string) { + c.mu.Lock() + defer c.mu.Unlock() + for _, key := range keys { + c.ItemVisibility[key] = false + } +}