diff --git a/dashboard/src/components/AppInstallDialog.vue b/dashboard/src/components/AppInstallDialog.vue index ab1406e1e..c20379721 100644 --- a/dashboard/src/components/AppInstallDialog.vue +++ b/dashboard/src/components/AppInstallDialog.vue @@ -8,6 +8,7 @@ import AccessControl from './AccessControl.vue'; import PortBindings from './PortBindings.vue'; import AppsModel from '../models/AppsModel.js'; import DashboardModel from '../models/DashboardModel.js'; +import DomainsModel from '../models/DomainsModel.js'; import { PROXY_APP_ID, ACL_OPTIONS } from '../constants.js'; const STEP = Object.freeze({ @@ -16,6 +17,7 @@ const STEP = Object.freeze({ }); const appsModel = AppsModel.create(); +const domainsModel = DomainsModel.create(); const dashboardModel = DashboardModel.create(); const subscriptionRequiredDialog = inject('subscriptionRequiredDialog'); @@ -74,22 +76,48 @@ const tcpPorts = ref({}); const udpPorts = ref({}); const secondaryDomains = ref({}); const upstreamUri = ref(''); +const needsOverwriteDns = ref(false); function onDomainChange() { const tmp = domains.value.find(d => d.domain === domain.value); domainProvider.value = tmp ? tmp.provider : ''; } -async function submit() { +async function onSubmit(overwriteDns) { formError.value = {}; busy.value = true; + const checkForDomains = [{ + domain: domain.value, + subdomain: location.value, + }]; + + for (const d in secondaryDomains.value) checkForDomains.push({ domain: secondaryDomains.value[d].domain, subdomain: secondaryDomains.value[d].value }); + + for (const d of checkForDomains) { + const [error, result] = await domainsModel.checkRecords(d.domain, d.subdomain); + if (error) { + formError.value.location = error.body ? error.body.message : 'Internal error'; + busy.value = false; + return console.error(error); + } + + if (result.needsOverwrite && !overwriteDns) { + busy.value = false; + needsOverwriteDns.value = true; + formError.value.dnsExists = `DNS record for ${d.subdomain}.${d.domain} already exists`; + return; + } + } + const config = { subdomain: location.value, domain: domain.value, accessRestriction: accessRestrictionOption.value === ACL_OPTIONS.ANY ? null : (accessRestrictionOption.value === ACL_OPTIONS.NOSSO ? null : accessRestrictionAcl.value) }; + if (overwriteDns) config.overwriteDns = true; + if (manifest.value.optionalSso) config.sso = accessRestrictionOption.value !== ACL_OPTIONS.NOSSO; const finalPorts = {}; @@ -103,8 +131,7 @@ async function submit() { } config.ports = finalPorts; - const finalSecondaryDomains = {}; - for (var p in secondaryDomains.value) { + const finalSecondaryDomains = {}; for (const p in secondaryDomains.value) { finalSecondaryDomains[p] = { subdomain: secondaryDomains.value[p].value, domain: secondaryDomains.value[p].domain @@ -176,6 +203,7 @@ defineExpose({ accessRestrictionAcl.value = { users: [], groups: [] }; domainProvider.value = ''; upstreamUri.value = ''; + needsOverwriteDns.value = ''; domainList.forEach(d => { d.label = '.' + d.domain; @@ -244,9 +272,10 @@ defineExpose({
-
{{ formError.generic }}
+
{{ formError.generic }}
+
{{ formError.dnsExists }}
-
+
@@ -257,7 +286,7 @@ defineExpose({
-
{{ formError.location }}
+
{{ formError.location }}
@@ -278,7 +307,8 @@ defineExpose({
- + +