updated implementation of (un)hiding items

This commit is contained in:
yusing 2025-01-23 12:52:15 +08:00
parent 37a166731d
commit b9882f8985
2 changed files with 49 additions and 12 deletions

View file

@ -6,12 +6,14 @@ import (
"github.com/yusing/go-proxy/internal/homepage" "github.com/yusing/go-proxy/internal/homepage"
"github.com/yusing/go-proxy/internal/utils" "github.com/yusing/go-proxy/internal/utils"
"github.com/yusing/go-proxy/internal/utils/strutils"
) )
const ( const (
HomepageOverrideItem = "item" HomepageOverrideItem = "item"
HomepageOverrideCategoryOrder = "category_order" HomepageOverrideCategoryOrder = "category_order"
HomepageOverrideCategoryName = "category_name" HomepageOverrideCategoryName = "category_name"
HomepageOverrideItemVisible = "item_visible"
) )
func SetHomePageOverrides(w http.ResponseWriter, r *http.Request) { func SetHomePageOverrides(w http.ResponseWriter, r *http.Request) {
@ -33,6 +35,13 @@ func SetHomePageOverrides(w http.ResponseWriter, r *http.Request) {
return return
} }
overrides.OverrideItem(which, &override) 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: case HomepageOverrideCategoryName:
overrides.SetCategoryNameOverride(which, value) overrides.SetCategoryNameOverride(which, value)
case HomepageOverrideCategoryOrder: case HomepageOverrideCategoryOrder:

View file

@ -10,11 +10,12 @@ import (
) )
type OverrideConfig struct { type OverrideConfig struct {
ItemOverrides map[string]*ItemConfig `json:"item_overrides"` ItemOverrides map[string]*ItemConfig `json:"item_overrides"`
DisplayOrder map[string]int `json:"display_order"` // TODO: implement this DisplayOrder map[string]int `json:"display_order"` // TODO: implement this
CategoryName map[string]string `json:"category_name"` CategoryName map[string]string `json:"category_name"`
CategoryOrder map[string]int `json:"category_order"` // TODO: implement this CategoryOrder map[string]int `json:"category_order"` // TODO: implement this
mu sync.RWMutex ItemVisibility map[string]bool `json:"item_visibility"`
mu sync.RWMutex
} }
var overrideConfigInstance *OverrideConfig var overrideConfigInstance *OverrideConfig
@ -28,10 +29,11 @@ func must(b []byte, err error) []byte {
func InitOverridesConfig() { func InitOverridesConfig() {
overrideConfigInstance = &OverrideConfig{ overrideConfigInstance = &OverrideConfig{
ItemOverrides: make(map[string]*ItemConfig), ItemOverrides: make(map[string]*ItemConfig),
DisplayOrder: make(map[string]int), DisplayOrder: make(map[string]int),
CategoryName: make(map[string]string), CategoryName: make(map[string]string),
CategoryOrder: make(map[string]int), CategoryOrder: make(map[string]int),
ItemVisibility: make(map[string]bool),
} }
err := utils.LoadJSONIfExist(common.HomepageJSONConfigPath, overrideConfigInstance) err := utils.LoadJSONIfExist(common.HomepageJSONConfigPath, overrideConfigInstance)
if err != nil { if err != nil {
@ -64,6 +66,7 @@ func (c *OverrideConfig) OverrideItem(alias string, override *ItemConfig) {
} }
func (c *OverrideConfig) GetOverride(item *Item) *Item { func (c *OverrideConfig) GetOverride(item *Item) *Item {
orig := item
c.mu.RLock() c.mu.RLock()
defer c.mu.RUnlock() defer c.mu.RUnlock()
itemOverride, ok := c.ItemOverrides[item.Alias] itemOverride, ok := c.ItemOverrides[item.Alias]
@ -72,9 +75,8 @@ func (c *OverrideConfig) GetOverride(item *Item) *Item {
clone := *item clone := *item
clone.Category = catOverride clone.Category = catOverride
clone.IsUnset = false clone.IsUnset = false
return &clone item = &clone
} }
return item
} else { } else {
clone := *item clone := *item
clone.ItemConfig = itemOverride clone.ItemConfig = itemOverride
@ -82,8 +84,18 @@ func (c *OverrideConfig) GetOverride(item *Item) *Item {
if catOverride, ok := c.CategoryName[clone.Category]; ok { if catOverride, ok := c.CategoryName[clone.Category]; ok {
clone.Category = catOverride 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) { func (c *OverrideConfig) SetCategoryNameOverride(key, value string) {
@ -97,3 +109,19 @@ func (c *OverrideConfig) SetCategoryOrder(key string, value int) {
defer c.mu.Unlock() defer c.mu.Unlock()
c.CategoryOrder[key] = value 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
}
}