Skip to content

Commit 38f34aa

Browse files
committed
feat: support multiple providers
1 parent b8f4457 commit 38f34aa

File tree

5 files changed

+68
-18
lines changed

5 files changed

+68
-18
lines changed

internal/server/controllers/basic_info.go

Lines changed: 54 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -10,26 +10,33 @@ import (
1010
)
1111

1212
type BasicInfo struct {
13-
Version string `json:"version"`
14-
StartTime int64 `json:"start_time"`
15-
DomainNum int `json:"domain_num"`
16-
SubDomainNum int `json:"sub_domain_num"`
17-
Domains []settings.Domain `json:"domains"`
18-
PublicIP string `json:"public_ip"`
19-
IPMode string `json:"ip_mode"`
20-
Provider string `json:"provider"`
13+
Version string `json:"version"`
14+
StartTime int64 `json:"start_time"`
15+
DomainNum int `json:"domain_num"`
16+
SubDomainNum int `json:"sub_domain_num"`
17+
Domains []settings.Domain `json:"domains"`
18+
PublicIP string `json:"public_ip"`
19+
IPMode string `json:"ip_mode"`
20+
Provider string `json:"provider"`
21+
IsMultiProvider bool `json:"is_multi_provider"`
22+
Providers []string `json:"providers"`
2123
}
2224

2325
func (c *Controller) GetBasicInfo(ctx *fiber.Ctx) error {
26+
isMultiProvider := c.config.IsMultiProvider()
27+
providers := c.getProviders()
28+
2429
return ctx.JSON(BasicInfo{
25-
Version: utils.Version,
26-
StartTime: utils.StartTime,
27-
DomainNum: c.getDomains(),
28-
SubDomainNum: c.GetSubDomains(),
29-
Domains: c.config.Domains,
30-
PublicIP: lib.GetIPHelperInstance(c.config).GetCurrentIP(),
31-
IPMode: strings.ToUpper(c.config.IPType),
32-
Provider: c.config.Provider,
30+
Version: utils.Version,
31+
StartTime: utils.StartTime,
32+
DomainNum: c.getDomains(),
33+
SubDomainNum: c.GetSubDomains(),
34+
Domains: c.config.Domains,
35+
PublicIP: lib.GetIPHelperInstance(c.config).GetCurrentIP(),
36+
IPMode: strings.ToUpper(c.config.IPType),
37+
Provider: c.config.Provider,
38+
IsMultiProvider: isMultiProvider,
39+
Providers: providers,
3340
})
3441
}
3542

@@ -47,3 +54,34 @@ func (c *Controller) GetSubDomains() int {
4754

4855
return count
4956
}
57+
58+
func (c *Controller) getProviders() []string {
59+
providersSet := make(map[string]bool)
60+
61+
// Add global provider if specified (legacy single provider mode)
62+
if c.config.Provider != "" {
63+
providersSet[c.config.Provider] = true
64+
}
65+
66+
// Add providers from multi-provider configuration
67+
if c.config.Providers != nil {
68+
for providerName := range c.config.Providers {
69+
providersSet[providerName] = true
70+
}
71+
}
72+
73+
// Add providers from domains (for mixed configuration)
74+
for _, domain := range c.config.Domains {
75+
if domain.Provider != "" {
76+
providersSet[domain.Provider] = true
77+
}
78+
}
79+
80+
// Convert set to slice
81+
providers := make([]string, 0, len(providersSet))
82+
for provider := range providersSet {
83+
providers = append(providers, provider)
84+
}
85+
86+
return providers
87+
}

web/api/domain.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@ import { get_api_server } from '@/api/env';
33
export interface Domain {
44
domain_name: string;
55
sub_domains: string[];
6+
provider?: string;
67
}
78

89
export async function get_domains(credentials: string): Promise<Domain[]> {

web/api/info.ts

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,8 @@ export interface Info {
1010
public_ip: string;
1111
ip_mode: string;
1212
provider: string;
13+
is_multi_provider: boolean;
14+
providers: string[];
1315
}
1416

1517
export async function get_info(credentials: string): Promise<Info> {

web/components/domain-card.tsx

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -33,6 +33,9 @@ export const DomainCard = (props: DomainControlProps) => {
3333
<div className="card-body">
3434
<h2 className="card-title">
3535
{props.domain.domain_name}
36+
{props.domain.provider && (
37+
<div className="badge badge-secondary">{props.domain.provider}</div>
38+
)}
3639
</h2>
3740
<div className="flex flex-wrap justify-start gap-2">
3841
{

web/components/stat.tsx

Lines changed: 8 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -81,8 +81,14 @@ export const Stat = () => {
8181
<GearIcon />
8282
</div>
8383
<div className="stat-title">Provider</div>
84-
<div className="stat-value text-error">{info ? info.provider : 'N/A'}</div>
85-
<div className="stat-desc">Provider configured</div>
84+
<div className="stat-value text-error">
85+
{info ? (
86+
info.provider && (!info.providers || info.providers.length === 0) ? info.provider : 'Multiple'
87+
) : 'N/A'}
88+
</div>
89+
<div className="stat-desc">
90+
{info && info.provider && (!info.providers || info.providers.length === 0) ? 'Provider configured' : 'Multiple providers configured'}
91+
</div>
8692
</div>
8793
</div>
8894
<span className="text-xl font-semibold text-neutral-500 ml-1 mb-1 mt-5">Domain Info</span>

0 commit comments

Comments
 (0)