diff --git a/internal/homepage/homepage.go b/internal/homepage/homepage.go index 6da2aed..9ad1d81 100644 --- a/internal/homepage/homepage.go +++ b/internal/homepage/homepage.go @@ -1,13 +1,16 @@ package homepage import ( + "encoding/json" + "strings" + + config "github.com/yusing/go-proxy/internal/config/types" "github.com/yusing/go-proxy/internal/utils" ) type ( - //nolint:recvcheck - Categories map[string]Category - Category []*Item + Homepage map[string]Category + Category []*Item ItemConfig struct { Show bool `json:"show"` @@ -17,18 +20,13 @@ type ( Description string `json:"description" aliases:"desc"` SortOrder int `json:"sort_order"` WidgetConfig map[string]any `json:"widget_config" aliases:"widget"` - URL string `json:"url"` // alias + domain } Item struct { *ItemConfig - Alias string `json:"alias"` // proxy alias - SourceType string `json:"source_type"` - AltURL string `json:"alt_url"` // original proxy target - Provider string `json:"provider"` - - IsUnset bool `json:"-"` + Alias string + Provider string } ) @@ -40,33 +38,38 @@ func init() { }) } -func NewItem(alias string) *Item { - return &Item{ - ItemConfig: &ItemConfig{ - Show: true, - }, - Alias: alias, - IsUnset: true, +func (cfg *ItemConfig) GetOverride(alias string) *ItemConfig { + return overrideConfigInstance.GetOverride(alias, cfg) +} + +func (item *Item) MarshalJSON() ([]byte, error) { + var url *string + if !strings.ContainsRune(item.Alias, '.') { + godoxyCfg := config.GetInstance().Value() + // use first domain as base domain + domains := godoxyCfg.MatchDomains + if len(domains) > 0 { + url = new(string) + *url = item.Alias + domains[0] + } + } else { + url = &item.Alias } + return json.Marshal(map[string]any{ + "show": item.Show, + "alias": item.Alias, + "provider": item.Provider, + "url": url, + "name": item.Name, + "icon": item.Icon, + "category": item.Category, + "description": item.Description, + "sort_order": item.SortOrder, + "widget_config": item.WidgetConfig, + }) } -func NewHomePageConfig() Categories { - return Categories(make(map[string]Category)) -} - -func (item *Item) IsEmpty() bool { - return item == nil || item.IsUnset || item.ItemConfig == nil -} - -func (item *Item) GetOverride() *Item { - return overrideConfigInstance.GetOverride(item) -} - -func (c *Categories) Clear() { - *c = make(Categories) -} - -func (c Categories) Add(item *Item) { +func (c Homepage) Add(item *Item) { if c[item.Category] == nil { c[item.Category] = make(Category, 0) } diff --git a/internal/homepage/homepage_test.go b/internal/homepage/homepage_test.go index 7bfc3a8..0a29d14 100644 --- a/internal/homepage/homepage_test.go +++ b/internal/homepage/homepage_test.go @@ -20,7 +20,7 @@ func TestOverrideItem(t *testing.T) { Category: "App", }, } - override := &ItemConfig{ + want := &ItemConfig{ Show: true, Name: "Bar", Category: "Test", @@ -30,7 +30,7 @@ func TestOverrideItem(t *testing.T) { }, } overrides := GetOverrideConfig() - overrides.OverrideItem(a.Alias, override) - overridden := a.GetOverride() - ExpectDeepEqual(t, overridden.ItemConfig, override) + overrides.OverrideItem(a.Alias, want) + got := a.GetOverride(a.Alias) + ExpectDeepEqual(t, got, want) } diff --git a/internal/homepage/icon_url.go b/internal/homepage/icon_url.go index f5265a4..f53060d 100644 --- a/internal/homepage/icon_url.go +++ b/internal/homepage/icon_url.go @@ -5,7 +5,7 @@ import ( "strings" "github.com/yusing/go-proxy/internal" - E "github.com/yusing/go-proxy/internal/error" + "github.com/yusing/go-proxy/internal/gperr" ) type ( @@ -31,7 +31,7 @@ const ( IconSourceSelfhSt ) -var ErrInvalidIconURL = E.New("invalid icon url") +var ErrInvalidIconURL = gperr.New("invalid icon url") func NewSelfhStIconURL(reference, format string) *IconURL { return &IconURL{ diff --git a/internal/homepage/override_config.go b/internal/homepage/override_config.go index d11d7e5..59e3c1d 100644 --- a/internal/homepage/override_config.go +++ b/internal/homepage/override_config.go @@ -64,24 +64,17 @@ func (c *OverrideConfig) OverrideItems(items map[string]*ItemConfig) { } } -func (c *OverrideConfig) GetOverride(item *Item) *Item { +func (c *OverrideConfig) GetOverride(alias string, item *ItemConfig) *ItemConfig { c.mu.RLock() defer c.mu.RUnlock() - itemOverride, hasOverride := c.ItemOverrides[item.Alias] + itemOverride, hasOverride := c.ItemOverrides[alias] if hasOverride { - clone := *item - clone.ItemConfig = itemOverride - clone.IsUnset = false - item = &clone + return itemOverride } - if show, ok := c.ItemVisibility[item.Alias]; ok { - if !hasOverride { - clone := *item - clone.Show = show - item = &clone - } else { - item.Show = show - } + if show, ok := c.ItemVisibility[alias]; ok { + clone := *item + clone.Show = show + return &clone } return item } @@ -92,7 +85,7 @@ func (c *OverrideConfig) SetCategoryOrder(key string, value int) { c.CategoryOrder[key] = value } -func (c *OverrideConfig) UnhideItems(keys ...string) { +func (c *OverrideConfig) UnhideItems(keys []string) { c.mu.Lock() defer c.mu.Unlock() for _, key := range keys { @@ -100,7 +93,7 @@ func (c *OverrideConfig) UnhideItems(keys ...string) { } } -func (c *OverrideConfig) HideItems(keys ...string) { +func (c *OverrideConfig) HideItems(keys []string) { c.mu.Lock() defer c.mu.Unlock() for _, key := range keys {