mirror of
https://github.com/yusing/godoxy.git
synced 2025-05-20 20:52:33 +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
|
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, ¶ms); 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, ¶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
|
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, ¶ms); 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, ¶ms); 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
|
||||||
|
|
|
@ -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))
|
||||||
}
|
}
|
||||||
|
|
|
@ -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()
|
||||||
|
|
Loading…
Add table
Reference in a new issue