diff --git a/src/appdb.js b/src/appdb.js index 30a97f4dc..2e992f4e1 100644 --- a/src/appdb.js +++ b/src/appdb.js @@ -2,7 +2,6 @@ exports = module.exports = { get: get, - getByContainerId: getByContainerId, add: add, exists: exists, del: del, @@ -38,8 +37,7 @@ var assert = require('assert'), util = require('util'); var APPS_FIELDS_PREFIXED = [ 'apps.id', 'apps.appStoreId', 'apps.installationState', 'apps.errorJson', 'apps.runState', - 'apps.health', 'apps.containerId', 'apps.manifestJson', 'subdomains.subdomain AS location', 'subdomains.domain', - 'apps.accessRestrictionJson', 'apps.memoryLimit', 'apps.cpuShares', + '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', @@ -125,20 +123,22 @@ function postProcess(result) { result.taskId = result.taskId ? String(result.taskId) : null; } +// 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 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` + + ` 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` + + ` LEFT JOIN (${MOUNTS_QUERY}) AS q4 on q4.id = apps.id`; + function get(id, callback) { assert.strictEqual(typeof id, 'string'); assert.strictEqual(typeof callback, 'function'); - database.query('SELECT ' + APPS_FIELDS_PREFIXED + ',' - + 'GROUP_CONCAT(CAST(appPortBindings.hostPort AS CHAR(6))) AS hostPorts, GROUP_CONCAT(appPortBindings.environmentVariable) AS environmentVariables, GROUP_CONCAT(appPortBindings.type) AS portTypes, ' - + 'JSON_ARRAYAGG(appEnvVars.name) AS envNames, JSON_ARRAYAGG(appEnvVars.value) AS envValues,' - + 'JSON_ARRAYAGG(appMounts.volumeId) AS volumeIds, JSON_ARRAYAGG(appMounts.readOnly) AS volumeReadOnlys ' - + ' FROM apps' - + ' LEFT OUTER JOIN appPortBindings ON apps.id = appPortBindings.appId' - + ' LEFT OUTER JOIN appEnvVars ON apps.id = appEnvVars.appId' - + ' LEFT OUTER JOIN subdomains ON apps.id = subdomains.appId AND subdomains.type = ?' - + ' LEFT OUTER JOIN appMounts ON apps.id = appMounts.appId' - + ' WHERE apps.id = ? GROUP BY apps.id', [ exports.SUBDOMAIN_TYPE_PRIMARY, id ], function (error, result) { + database.query(`${APPS_QUERY} WHERE apps.id = ?`, [ id ], function (error, result) { if (error) return callback(new BoxError(BoxError.DATABASE_ERROR, error)); if (result.length === 0) return callback(new BoxError(BoxError.NOT_FOUND, 'App not found')); @@ -154,47 +154,10 @@ function get(id, callback) { }); } -function getByContainerId(containerId, callback) { - assert.strictEqual(typeof containerId, 'string'); - assert.strictEqual(typeof callback, 'function'); - - database.query('SELECT ' + APPS_FIELDS_PREFIXED + ',' - + 'GROUP_CONCAT(CAST(appPortBindings.hostPort AS CHAR(6))) AS hostPorts, GROUP_CONCAT(appPortBindings.environmentVariable) AS environmentVariables, GROUP_CONCAT(appPortBindings.type) AS portTypes,' - + 'JSON_ARRAYAGG(appEnvVars.name) AS envNames, JSON_ARRAYAGG(appEnvVars.value) AS envValues,' - + 'JSON_ARRAYAGG(appMounts.volumeId) AS volumeIds, JSON_ARRAYAGG(appMounts.readOnly) AS volumeReadOnlys ' - + ' FROM apps' - + ' LEFT OUTER JOIN appPortBindings ON apps.id = appPortBindings.appId' - + ' LEFT OUTER JOIN appEnvVars ON apps.id = appEnvVars.appId' - + ' LEFT OUTER JOIN subdomains ON apps.id = subdomains.appId AND subdomains.type = ?' - + ' LEFT OUTER JOIN appMounts ON apps.id = appMounts.appId' - + ' WHERE containerId = ? GROUP BY apps.id', [ exports.SUBDOMAIN_TYPE_PRIMARY, containerId ], function (error, result) { - 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)); - - result[0].alternateDomains = alternateDomains; - postProcess(result[0]); - - callback(null, result[0]); - }); - }); -} - function getAll(callback) { assert.strictEqual(typeof callback, 'function'); - database.query('SELECT ' + APPS_FIELDS_PREFIXED + ',' - + 'GROUP_CONCAT(CAST(appPortBindings.hostPort AS CHAR(6))) AS hostPorts, GROUP_CONCAT(appPortBindings.environmentVariable) AS environmentVariables, GROUP_CONCAT(appPortBindings.type) AS portTypes,' - + 'JSON_ARRAYAGG(appEnvVars.name) AS envNames, JSON_ARRAYAGG(appEnvVars.value) AS envValues,' - + 'JSON_ARRAYAGG(appMounts.volumeId) AS volumeIds, JSON_ARRAYAGG(appMounts.readOnly) AS volumeReadOnlys ' - + ' FROM apps' - + ' LEFT OUTER JOIN appPortBindings ON apps.id = appPortBindings.appId' - + ' LEFT OUTER JOIN appEnvVars ON apps.id = appEnvVars.appId' - + ' LEFT OUTER JOIN subdomains ON apps.id = subdomains.appId AND subdomains.type = ?' - + ' LEFT OUTER JOIN appMounts ON apps.id = appMounts.appId' - + ' GROUP BY apps.id ORDER BY apps.id', [ exports.SUBDOMAIN_TYPE_PRIMARY ], function (error, results) { + 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) { diff --git a/src/apps.js b/src/apps.js index 8bc05b116..8073dfa1f 100644 --- a/src/apps.js +++ b/src/apps.js @@ -6,7 +6,6 @@ exports = module.exports = { removeRestrictedFields, get, - getByContainerId, getByIpAddress, getByFqdn, getAll, @@ -508,24 +507,6 @@ function get(appId, callback) { }); } -function getByContainerId(containerId, callback) { - assert.strictEqual(typeof containerId, 'string'); - assert.strictEqual(typeof callback, 'function'); - - getDomainObjectMap(function (error, domainObjectMap) { - if (error) return callback(error); - - appdb.getByContainerId(containerId, function (error, app) { - if (error && error.reason === BoxError.NOT_FOUND) return callback(new BoxError(BoxError.NOT_FOUND, 'No such app')); - if (error) return callback(error); - - postProcess(app, domainObjectMap); - - callback(null, app); - }); - }); -} - // returns the app associated with this IP (app or scheduler) function getByIpAddress(ip, callback) { assert.strictEqual(typeof ip, 'string');