Files
godoxy-yusing/internal/homepage/override_config.go

131 lines
3.3 KiB
Go

package homepage
import (
"maps"
"sync"
"github.com/yusing/godoxy/internal/common"
"github.com/yusing/godoxy/internal/jsonstore"
)
type OverrideConfig struct {
ItemOverrides map[string]ItemConfig `json:"item_overrides"`
DisplayOrder map[string]int `json:"display_order"`
CategoryOrder map[string]int `json:"category_order"`
AllSortOrder map[string]int `json:"all_sort_order"`
FavSortOrder map[string]int `json:"fav_sort_order"`
ItemClicks map[string]int `json:"item_clicks"`
ItemVisibility map[string]bool `json:"item_visibility"`
ItemFavorite map[string]bool `json:"item_favorite"`
mu sync.RWMutex
}
var overrideConfigInstance = jsonstore.Object[*OverrideConfig](common.NamespaceHomepageOverrides)
func GetOverrideConfig() *OverrideConfig {
return overrideConfigInstance
}
func (c *OverrideConfig) Initialize() {
c.ItemOverrides = make(map[string]ItemConfig)
c.DisplayOrder = make(map[string]int)
c.CategoryOrder = make(map[string]int)
c.AllSortOrder = make(map[string]int)
c.FavSortOrder = make(map[string]int)
c.ItemClicks = make(map[string]int)
c.ItemVisibility = make(map[string]bool)
c.ItemFavorite = make(map[string]bool)
}
func (c *OverrideConfig) OverrideItem(alias string, override ItemConfig) {
c.mu.Lock()
defer c.mu.Unlock()
c.ItemOverrides[alias] = override
}
func (c *OverrideConfig) OverrideItems(items map[string]ItemConfig) {
c.mu.Lock()
defer c.mu.Unlock()
maps.Copy(c.ItemOverrides, items)
}
func (c *OverrideConfig) GetOverride(item Item) Item {
c.mu.RLock()
defer c.mu.RUnlock()
if overrides, hasOverride := c.ItemOverrides[item.Alias]; hasOverride {
overrides.URL = item.URL // NOTE: we don't want to override the URL
item.ItemConfig = overrides
}
if show, ok := c.ItemVisibility[item.Alias]; ok {
item.Show = show
}
if fav, ok := c.ItemFavorite[item.Alias]; ok {
item.Favorite = fav
}
if displayOrder, ok := c.DisplayOrder[item.Alias]; ok {
item.SortOrder = displayOrder
}
if allSortOrder, ok := c.AllSortOrder[item.Alias]; ok {
item.AllSortOrder = allSortOrder
}
if favSortOrder, ok := c.FavSortOrder[item.Alias]; ok {
item.FavSortOrder = favSortOrder
}
if clicks, ok := c.ItemClicks[item.Alias]; ok {
item.Clicks = clicks
}
if item.Category == "" {
item.Category = CategoryOthers
}
return item
}
func (c *OverrideConfig) SetSortOrder(key string, value int) {
c.mu.Lock()
defer c.mu.Unlock()
c.DisplayOrder[key] = value
}
func (c *OverrideConfig) SetAllSortOrder(key string, value int) {
c.mu.Lock()
defer c.mu.Unlock()
c.AllSortOrder[key] = value
}
func (c *OverrideConfig) SetFavSortOrder(key string, value int) {
c.mu.Lock()
defer c.mu.Unlock()
c.FavSortOrder[key] = value
}
func (c *OverrideConfig) SetItemsVisibility(keys []string, value bool) {
c.mu.Lock()
defer c.mu.Unlock()
for _, key := range keys {
c.ItemVisibility[key] = value
}
}
func (c *OverrideConfig) SetItemsFavorite(keys []string, value bool) {
c.mu.Lock()
defer c.mu.Unlock()
for _, key := range keys {
c.ItemFavorite[key] = value
}
}
func (c *OverrideConfig) SetCategoryOrder(key string, value int) {
c.mu.Lock()
defer c.mu.Unlock()
c.CategoryOrder[key] = value
}
func (c *OverrideConfig) IncrementItemClicks(key string) {
c.mu.Lock()
defer c.mu.Unlock()
c.ItemClicks[key]++
}