Skip to content

Commit cb1fb69

Browse files
committed
refactor: improve provider selection logic in DNSChallenge component and update column definition in ACMEUser view
1 parent f725462 commit cb1fb69

File tree

17 files changed

+172
-49
lines changed

17 files changed

+172
-49
lines changed

api/certificate/dns_credential.go

Lines changed: 38 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@ package certificate
22

33
import (
44
"net/http"
5+
"strings"
56

67
"github.com/0xJacky/Nginx-UI/internal/cert/dns"
78
"github.com/0xJacky/Nginx-UI/model"
@@ -23,28 +24,32 @@ func GetDnsCredential(c *gin.Context) {
2324
}
2425
type apiDnsCredential struct {
2526
model.Model
26-
Name string `json:"name"`
27-
Provider string `json:"provider"`
27+
Name string `json:"name"`
28+
Provider string `json:"provider"`
29+
ProviderCode string `json:"provider_code"`
2830
dns.Config
2931
}
3032
c.JSON(http.StatusOK, apiDnsCredential{
31-
Model: dnsCredential.Model,
32-
Name: dnsCredential.Name,
33-
Provider: dnsCredential.Provider,
34-
Config: *dnsCredential.Config,
33+
Model: dnsCredential.Model,
34+
Name: dnsCredential.Name,
35+
Provider: dnsCredential.Provider,
36+
ProviderCode: dnsCredential.ProviderCode,
37+
Config: *dnsCredential.Config,
3538
})
3639
}
3740

3841
func GetDnsCredentialList(c *gin.Context) {
3942
cosy.Core[model.DnsCredential](c).
43+
SetEqual("provider_code").
4044
SetEqual("provider").
4145
SetFussy("name").
4246
PagingList()
4347
}
4448

4549
type DnsCredentialManageJson struct {
46-
Name string `json:"name" binding:"required"`
47-
Provider string `json:"provider"`
50+
Name string `json:"name" binding:"required"`
51+
Provider string `json:"provider"`
52+
ProviderCode string `json:"provider_code"`
4853
dns.Config
4954
}
5055

@@ -54,11 +59,14 @@ func AddDnsCredential(c *gin.Context) {
5459
return
5560
}
5661

62+
providerCode := resolveProviderCode(json)
63+
json.Config.Code = providerCode
5764
json.Config.Name = json.Provider
5865
dnsCredential := model.DnsCredential{
59-
Name: json.Name,
60-
Config: &json.Config,
61-
Provider: json.Provider,
66+
Name: json.Name,
67+
Config: &json.Config,
68+
Provider: json.Provider,
69+
ProviderCode: providerCode,
6270
}
6371

6472
d := query.DnsCredential
@@ -89,10 +97,12 @@ func EditDnsCredential(c *gin.Context) {
8997
}
9098

9199
json.Config.Name = json.Provider
100+
json.Config.Code = resolveProviderCode(json)
92101
_, err = d.Where(d.ID.Eq(dnsCredential.ID)).Updates(&model.DnsCredential{
93-
Name: json.Name,
94-
Config: &json.Config,
95-
Provider: json.Provider,
102+
Name: json.Name,
103+
Config: &json.Config,
104+
Provider: json.Provider,
105+
ProviderCode: resolveProviderCode(json),
96106
})
97107

98108
if err != nil {
@@ -106,3 +116,17 @@ func EditDnsCredential(c *gin.Context) {
106116
func DeleteDnsCredential(c *gin.Context) {
107117
cosy.Core[model.DnsCredential](c).Destroy()
108118
}
119+
120+
func resolveProviderCode(payload DnsCredentialManageJson) string {
121+
if trimmed := normalizeProviderCode(payload.ProviderCode); trimmed != "" {
122+
return trimmed
123+
}
124+
if trimmed := normalizeProviderCode(payload.Code); trimmed != "" {
125+
return trimmed
126+
}
127+
return normalizeProviderCode(payload.Provider)
128+
}
129+
130+
func normalizeProviderCode(value string) string {
131+
return strings.TrimSpace(strings.ToLower(value))
132+
}

app/package.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
{
22
"name": "nginx-ui-app-next",
33
"type": "module",
4-
"version": "2.3.1",
4+
"version": "2.3.2",
55
"packageManager": "pnpm@10.24.0+sha512.01ff8ae71b4419903b65c60fb2dc9d34cf8bb6e06d03bde112ef38f7a34d6904c424ba66bea5cdcf12890230bf39f9580473140ed9c946fef328b6e5238a345a",
66
"scripts": {
77
"dev": "vite --host",

app/src/api/auto_cert.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -30,6 +30,7 @@ export interface AutoCertOptions {
3030
key_type: string
3131
acme_user_id?: number
3232
provider?: string
33+
provider_code?: string
3334
must_staple?: boolean
3435
lego_disable_cname_support?: boolean
3536
revoke_old?: boolean

app/src/api/dns.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@ export interface DNSDomain extends ModelBase {
1010
id: number
1111
name: string
1212
provider: string
13+
provider_code?: string
1314
}
1415
}
1516

app/src/api/dns_credential.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@ export interface DnsCredential extends ModelBase {
66
name: string
77
config?: DNSProvider
88
provider: string
9+
provider_code?: string
910
code: string
1011
configuration: DNSProvider['configuration']
1112
}

app/src/components/AutoCertForm/DNSChallenge.vue

Lines changed: 11 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -48,18 +48,20 @@ watch(current, () => {
4848
if (mounted.value) {
4949
data.value.code = undefined
5050
data.value.provider = undefined
51+
data.value.provider_code = undefined
5152
data.value.dns_credential_id = undefined
5253
}
5354
return
5455
}
5556
credentials.value = []
5657
data.value.code = current.value.code
57-
// Keep provider consistent with credential records (prefer provider/code over display name).
58-
data.value.provider = current.value.provider || current.value.code || current.value.name
58+
// Use display name for credential query; fall back to provider/code if missing.
59+
data.value.provider = current.value.name || current.value.provider || current.value.code
60+
data.value.provider_code = current.value.code
5961
if (mounted.value)
6062
data.value.dns_credential_id = undefined
6163
62-
dns_credential.getList({ provider: data.value.provider }).then(r => {
64+
dns_credential.getList({ provider_code: data.value.provider_code || current.value.code }).then(r => {
6365
r.data.forEach(v => {
6466
credentials.value?.push({
6567
value: v.id,
@@ -82,12 +84,14 @@ onMounted(async () => {
8284
if (idx > -1) {
8385
data.value.code = r.code
8486
data.value.provider = r.provider
87+
data.value.provider_code = r.provider_code || r.code
8588
providerIdx.value = idx
8689
}
8790
else {
8891
// provider not supported anymore; clear existing selection to keep form consistent
8992
data.value.code = undefined
9093
data.value.provider = undefined
94+
data.value.provider_code = undefined
9195
data.value.dns_credential_id = undefined
9296
providerIdx.value = undefined
9397
}
@@ -112,7 +116,10 @@ const options = computed<SelectProps['options']>(() => {
112116
})
113117
114118
function filterOption(input: string, option?: DefaultOptionType) {
115-
return option?.label.toLowerCase().includes(input.toLowerCase())
119+
const needle = input.toLowerCase()
120+
const label = option?.label?.toString().toLowerCase() ?? ''
121+
const value = option?.value?.toString().toLowerCase() ?? ''
122+
return label.includes(needle) || value.includes(needle)
116123
}
117124
</script>
118125

app/src/version.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1 +1 @@
1-
{"version":"2.3.1","build_id":1,"total_build":511}
1+
{"version":"2.3.2","build_id":1,"total_build":512}

app/src/views/certificate/ACMEUser.vue

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@ import acme_user from '@/api/acme_user'
88
99
const { message } = App.useApp()
1010
11-
const columns: StdTableColumn[] = [
11+
const columns: ComputedRef<StdTableColumn[]> = computed(() => [
1212
{
1313
title: () => $gettext('Name'),
1414
dataIndex: 'name',
@@ -42,7 +42,7 @@ const columns: StdTableColumn[] = [
4242
edit: {
4343
type: 'autoComplete',
4444
autoComplete: {
45-
placeholder: () => $gettext('Select or enter a CA directory URL'),
45+
placeholder: $gettext('Select or enter a CA directory URL'),
4646
allowClear: true,
4747
options: [
4848
{
@@ -132,7 +132,7 @@ const columns: StdTableColumn[] = [
132132
dataIndex: 'actions',
133133
fixed: 'right',
134134
},
135-
]
135+
])
136136
137137
function register(id: number, data: AcmeUser) {
138138
acme_user.register(id).then(r => {

app/src/views/dns/DNSCredential.vue

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -24,7 +24,7 @@ const columns: StdTableColumn[] = [{
2424
search: true,
2525
}, {
2626
title: () => $gettext('Provider'),
27-
dataIndex: 'provider',
27+
dataIndex: 'provider_code',
2828
customRender: ({ record }: CustomRenderArgs) => {
2929
return record.provider
3030
},
@@ -34,7 +34,7 @@ const columns: StdTableColumn[] = [{
3434
type: 'select',
3535
select: {
3636
remote: {
37-
valueKey: 'name',
37+
valueKey: 'code',
3838
labelKey: 'name',
3939
api: async () => {
4040
return {

app/src/views/dns/DNSDomainList.vue

Lines changed: 16 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -31,11 +31,12 @@ const credentialLoadingMap = reactive<Record<string, boolean>>({})
3131
const providerOptions = computed<SelectOptionList>(() => {
3232
const list: SelectOptionList = []
3333
dnsProviders.value.forEach(provider => {
34-
const label = provider.name ?? provider.provider ?? ''
35-
if (label) {
34+
const code = provider.code ?? provider.provider ?? ''
35+
const label = provider.name ?? provider.provider ?? code
36+
if (code) {
3637
list.push({
3738
label,
38-
value: label,
39+
value: code,
3940
})
4041
}
4142
})
@@ -57,20 +58,20 @@ function clearCredentialSelection(formData: DomainForm) {
5758
formData.dns_credential_id = undefined
5859
}
5960
60-
async function ensureCredentialOptions(provider: string) {
61-
if (!provider || credentialOptions[provider])
61+
async function ensureCredentialOptions(providerCode: string) {
62+
if (!providerCode || credentialOptions[providerCode])
6263
return
63-
credentialLoadingMap[provider] = true
64+
credentialLoadingMap[providerCode] = true
6465
try {
65-
const response = await dns_credential.getList({ provider })
66+
const response = await dns_credential.getList({ provider_code: providerCode })
6667
const list = response?.data ?? []
67-
credentialOptions[provider] = list.map(item => ({
68+
credentialOptions[providerCode] = list.map(item => ({
6869
label: item.name,
6970
value: item.id,
7071
}))
7172
}
7273
finally {
73-
credentialLoadingMap[provider] = false
74+
credentialLoadingMap[providerCode] = false
7475
}
7576
}
7677
@@ -90,6 +91,11 @@ function resolveProviderName(record: DomainForm) {
9091
?? ''
9192
}
9293
94+
function resolveProviderCode(record: DomainForm) {
95+
return record.dns_credential?.provider_code
96+
?? ''
97+
}
98+
9399
function resolveCredentialName(record: DomainForm) {
94100
return record.dns_credential?.name ?? '-'
95101
}
@@ -116,7 +122,7 @@ const columns: StdTableColumn[] = [{
116122
const formData = context.formData
117123
if (!formData.provider_initialized) {
118124
formData.selected_provider = context.mode === 'edit'
119-
? resolveProviderName(formData)
125+
? (resolveProviderCode(formData) || resolveProviderName(formData))
120126
: ''
121127
formData.provider_initialized = true
122128
}

0 commit comments

Comments
 (0)