From ad2219dd433113b12c8b1b98b7b464ec00c17d05 Mon Sep 17 00:00:00 2001 From: Girish Ramakrishnan Date: Mon, 18 Jan 2021 15:27:42 -0800 Subject: [PATCH] merge subdomain query into main query --- src/appdb.js | 65 +++++++++++++++++++--------------------------------- 1 file changed, 24 insertions(+), 41 deletions(-) diff --git a/src/appdb.js b/src/appdb.js index 6352491f4..0a3f27072 100644 --- a/src/appdb.js +++ b/src/appdb.js @@ -37,16 +37,14 @@ var assert = require('assert'), safe = require('safetydance'), util = require('util'); -var APPS_FIELDS_PREFIXED = [ 'apps.id', 'apps.appStoreId', 'apps.installationState', 'apps.errorJson', 'apps.runState', +const APPS_FIELDS_PREFIXED = [ 'apps.id', 'apps.appStoreId', 'apps.installationState', 'apps.errorJson', 'apps.runState', 'apps.health', 'apps.containerId', 'apps.manifestJson', 'apps.accessRestrictionJson', 'apps.memoryLimit', 'apps.cpuShares', 'apps.label', 'apps.tagsJson', 'apps.taskId', 'apps.reverseProxyConfigJson', 'apps.servicesConfigJson', 'apps.sso', 'apps.debugModeJson', 'apps.enableBackup', 'apps.proxyAuth', 'apps.containerIp', 'apps.creationTime', 'apps.updateTime', 'apps.mailboxName', 'apps.mailboxDomain', 'apps.enableAutomaticUpdate', 'apps.dataDir', 'apps.ts', 'apps.healthTime' ].join(','); -var PORT_BINDINGS_FIELDS = [ 'hostPort', 'type', 'environmentVariable', 'appId' ].join(','); - -const SUBDOMAIN_FIELDS = [ 'appId', 'domain', 'subdomain', 'type' ].join(','); +const PORT_BINDINGS_FIELDS = [ 'hostPort', 'type', 'environmentVariable', 'appId' ].join(','); function postProcess(result) { assert.strictEqual(typeof result, 'object'); @@ -97,11 +95,20 @@ function postProcess(result) { result.servicesConfig = safe.JSON.parse(result.servicesConfigJson) || {}; delete result.servicesConfigJson; - result.alternateDomains = result.alternateDomains || []; - result.alternateDomains.forEach(function (d) { - delete d.appId; - delete d.type; - }); + let subdomains = JSON.parse(result.subdomains), domains = JSON.parse(result.domains), subdomainTypes = JSON.parse(result.subdomainTypes); + delete result.subdomains; + delete result.domains; + delete result.subdomainTypes; + + result.alternateDomains = []; + for (let i = 0; i < subdomainTypes.length; i++) { + if (subdomainTypes[i] === exports.SUBDOMAIN_TYPE_PRIMARY) { + result.location = subdomains[i]; + result.domain = domains[i]; + } else { + result.alternateDomains.push({ domain: domains[i], subdomain: subdomains[i] }); + } + } let envNames = JSON.parse(result.envNames), envValues = JSON.parse(result.envValues); delete result.envNames; @@ -127,9 +134,9 @@ function postProcess(result) { // each query simply join apps table with another table by id. we then join the full result together const PB_QUERY = 'SELECT id, GROUP_CONCAT(CAST(appPortBindings.hostPort AS CHAR(6))) AS hostPorts, GROUP_CONCAT(appPortBindings.environmentVariable) AS environmentVariables, GROUP_CONCAT(appPortBindings.type) AS portTypes FROM apps LEFT JOIN appPortBindings ON apps.id = appPortBindings.appId GROUP BY apps.id'; const ENV_QUERY = 'SELECT id, JSON_ARRAYAGG(appEnvVars.name) AS envNames, JSON_ARRAYAGG(appEnvVars.value) AS envValues FROM apps LEFT JOIN appEnvVars ON apps.id = appEnvVars.appId GROUP BY apps.id'; -const SUBDOMAIN_QUERY = `SELECT id, subdomains.subdomain AS location, subdomains.domain AS domain FROM apps LEFT JOIN subdomains ON apps.id = subdomains.appId AND subdomains.type = '${exports.SUBDOMAIN_TYPE_PRIMARY}' GROUP BY apps.id`; +const SUBDOMAIN_QUERY = 'SELECT id, JSON_ARRAYAGG(subdomains.subdomain) AS subdomains, JSON_ARRAYAGG(subdomains.domain) AS domains, JSON_ARRAYAGG(subdomains.type) AS subdomainTypes FROM apps LEFT JOIN subdomains ON apps.id = subdomains.appId GROUP BY apps.id'; const MOUNTS_QUERY = 'SELECT id, JSON_ARRAYAGG(appMounts.volumeId) AS volumeIds, JSON_ARRAYAGG(appMounts.readOnly) AS volumeReadOnlys FROM apps LEFT JOIN appMounts ON apps.id = appMounts.appId GROUP BY apps.id'; -const APPS_QUERY = `SELECT ${APPS_FIELDS_PREFIXED}, hostPorts, environmentVariables, portTypes, envNames, envValues, location, domain, volumeIds, volumeReadOnlys FROM apps` +const APPS_QUERY = `SELECT ${APPS_FIELDS_PREFIXED}, hostPorts, environmentVariables, portTypes, envNames, envValues, subdomains, domains, subdomainTypes, volumeIds, volumeReadOnlys FROM apps` + ` LEFT JOIN (${PB_QUERY}) AS q1 on q1.id = apps.id` + ` LEFT JOIN (${ENV_QUERY}) AS q2 on q2.id = apps.id` + ` LEFT JOIN (${SUBDOMAIN_QUERY}) AS q3 on q3.id = apps.id` @@ -143,15 +150,9 @@ function get(id, callback) { if (error) return callback(new BoxError(BoxError.DATABASE_ERROR, error)); if (result.length === 0) return callback(new BoxError(BoxError.NOT_FOUND, 'App not found')); - database.query('SELECT ' + SUBDOMAIN_FIELDS + ' FROM subdomains WHERE appId = ? AND type = ?', [ id, exports.SUBDOMAIN_TYPE_REDIRECT ], function (error, alternateDomains) { - if (error) return callback(new BoxError(BoxError.DATABASE_ERROR, error)); + postProcess(result[0]); - result[0].alternateDomains = alternateDomains; - - postProcess(result[0]); - - callback(null, result[0]); - }); + callback(null, result[0]); }); } @@ -163,15 +164,9 @@ function getByIpAddress(ip, callback) { if (error) return callback(new BoxError(BoxError.DATABASE_ERROR, error)); if (result.length === 0) return callback(new BoxError(BoxError.NOT_FOUND, 'App not found')); - database.query('SELECT ' + SUBDOMAIN_FIELDS + ' FROM subdomains WHERE appId = ? AND type = ?', [ result[0].id, exports.SUBDOMAIN_TYPE_REDIRECT ], function (error, alternateDomains) { - if (error) return callback(new BoxError(BoxError.DATABASE_ERROR, error)); + postProcess(result[0]); - result[0].alternateDomains = alternateDomains; - - postProcess(result[0]); - - callback(null, result[0]); - }); + callback(null, result[0]); }); } @@ -181,21 +176,9 @@ function getAll(callback) { database.query(`${APPS_QUERY} ORDER BY apps.id`, [ ], function (error, results) { if (error) return callback(new BoxError(BoxError.DATABASE_ERROR, error)); - database.query('SELECT ' + SUBDOMAIN_FIELDS + ' FROM subdomains WHERE type = ?', [ exports.SUBDOMAIN_TYPE_REDIRECT ], function (error, alternateDomains) { - if (error) return callback(new BoxError(BoxError.DATABASE_ERROR, error)); + results.forEach(postProcess); - alternateDomains.forEach(function (d) { - var domain = results.find(function (a) { return d.appId === a.id; }); - if (!domain) return; - - domain.alternateDomains = domain.alternateDomains || []; - domain.alternateDomains.push(d); - }); - - results.forEach(postProcess); - - callback(null, results); - }); + callback(null, results); }); }