improved homepage config implementation

This commit is contained in:
yusing 2025-01-24 05:11:35 +08:00
parent 648fd23a57
commit 9936b3af5b
3 changed files with 69 additions and 48 deletions

View file

@ -1,56 +1,87 @@
package v1 package v1
import ( import (
"encoding/json"
"io"
"net/http" "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/homepage"
"github.com/yusing/go-proxy/internal/utils"
"github.com/yusing/go-proxy/internal/utils/strutils"
) )
const ( const (
HomepageOverrideItem = "item" HomepageOverrideItem = "item"
HomepageOverrideItemsBatch = "items_batch"
HomepageOverrideCategoryOrder = "category_order" HomepageOverrideCategoryOrder = "category_order"
HomepageOverrideCategoryName = "category_name"
HomepageOverrideItemVisible = "item_visible" 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) { func SetHomePageOverrides(w http.ResponseWriter, r *http.Request) {
what, which, value := r.FormValue("what"), r.FormValue("which"), r.FormValue("value") what := r.FormValue("what")
if what == "" || which == "" { if what == "" {
http.Error(w, "missing what or which", http.StatusBadRequest) http.Error(w, "missing what or which", http.StatusBadRequest)
return 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 return
} }
r.Body.Close()
overrides := homepage.GetOverrideConfig() overrides := homepage.GetOverrideConfig()
switch what { switch what {
case HomepageOverrideItem: case HomepageOverrideItem:
var override homepage.ItemConfig var params HomepageOverrideItemParams
if err := utils.DeserializeJSON([]byte(value), &override); err != nil { if err := json.Unmarshal(data, &params); err != nil {
http.Error(w, err.Error(), http.StatusBadRequest) utils.RespondError(w, err, http.StatusBadRequest)
return return
} }
overrides.OverrideItem(which, &override) overrides.OverrideItem(params.Which, &params.Value)
case HomepageOverrideItemsBatch:
var params HomepageOverrideItemsBatchParams
if err := json.Unmarshal(data, &params); 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 case HomepageOverrideItemVisible: // POST /v1/item_visible [a,b,c], false => hide a, b, c
keys := strutils.CommaSeperatedList(which) var params HomepageOverrideItemVisibleParams
if strutils.ParseBool(value) { if err := json.Unmarshal(data, &params); err != nil {
overrides.UnhideItems(keys...) utils.RespondError(w, err, http.StatusBadRequest)
} 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)
return 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, &params); err != nil {
utils.RespondError(w, err, http.StatusBadRequest)
return
}
overrides.SetCategoryOrder(params.Which, params.Value)
default: default:
http.Error(w, "invalid what", http.StatusBadRequest) http.Error(w, "invalid what", http.StatusBadRequest)
return return

View file

@ -158,6 +158,7 @@ func (u *IconURL) MarshalText() ([]byte, error) {
return []byte(u.String()), nil return []byte(u.String()), nil
} }
// UnmarshalText implements encoding.TextUnmarshaler.
func (u *IconURL) UnmarshalText(data []byte) error { func (u *IconURL) UnmarshalText(data []byte) error {
return u.Parse(string(data)) return u.Parse(string(data))
} }

View file

@ -12,7 +12,6 @@ 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"`
CategoryOrder map[string]int `json:"category_order"` // TODO: implement this CategoryOrder map[string]int `json:"category_order"` // TODO: implement this
ItemVisibility map[string]bool `json:"item_visibility"` ItemVisibility map[string]bool `json:"item_visibility"`
mu sync.RWMutex mu sync.RWMutex
@ -31,7 +30,6 @@ 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),
CategoryOrder: make(map[string]int), CategoryOrder: make(map[string]int),
ItemVisibility: make(map[string]bool), ItemVisibility: make(map[string]bool),
} }
@ -65,29 +63,26 @@ func (c *OverrideConfig) OverrideItem(alias string, override *ItemConfig) {
c.ItemOverrides[alias] = override 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 { 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, hasOverride := c.ItemOverrides[item.Alias]
if !ok { if hasOverride {
if catOverride, ok := c.CategoryName[item.Category]; ok {
clone := *item
clone.Category = catOverride
clone.IsUnset = false
item = &clone
}
} else {
clone := *item clone := *item
clone.ItemConfig = itemOverride clone.ItemConfig = itemOverride
clone.IsUnset = false clone.IsUnset = false
if catOverride, ok := c.CategoryName[clone.Category]; ok {
clone.Category = catOverride
}
item = &clone item = &clone
} }
if show, ok := c.ItemVisibility[item.Alias]; ok { if show, ok := c.ItemVisibility[item.Alias]; ok {
if item == orig { if !hasOverride {
clone := *item clone := *item
clone.Show = show clone.Show = show
item = &clone item = &clone
@ -98,12 +93,6 @@ func (c *OverrideConfig) GetOverride(item *Item) *Item {
return 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) { func (c *OverrideConfig) SetCategoryOrder(key string, value int) {
c.mu.Lock() c.mu.Lock()
defer c.mu.Unlock() defer c.mu.Unlock()