mirror of
https://github.com/yusing/godoxy.git
synced 2025-05-20 12:42:34 +02:00
improved homepage config implementation
This commit is contained in:
parent
648fd23a57
commit
9936b3af5b
3 changed files with 69 additions and 48 deletions
|
@ -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
|
||||
|
|
|
@ -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))
|
||||
}
|
||||
|
|
|
@ -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()
|
||||
|
|
Loading…
Add table
Reference in a new issue