diff --git a/src/routes/user/apps/appdefinition/AppDefinitionRouter.ts b/src/routes/user/apps/appdefinition/AppDefinitionRouter.ts index 069d5ee..256b081 100644 --- a/src/routes/user/apps/appdefinition/AppDefinitionRouter.ts +++ b/src/routes/user/apps/appdefinition/AppDefinitionRouter.ts @@ -1,348 +1,336 @@ -import express = require('express') -import ApiStatusCodes from '../../../../api/ApiStatusCodes' -import BaseApi from '../../../../api/BaseApi' +npm warn Unknown env config "http-proxy". This will stop working in the next major version of npm. +import express = require("express"); +import ApiStatusCodes from "../../../../api/ApiStatusCodes"; +import BaseApi from "../../../../api/BaseApi"; import { - getAllAppDefinitions, - registerAppDefinition, - updateAppDefinition, -} from '../../../../handlers/users/apps/appdefinition/AppDefinitionHandler' -import InjectionExtractor from '../../../../injection/InjectionExtractor' -import { AppDeployTokenConfig } from '../../../../models/AppDefinition' -import { IHashMapGeneric } from '../../../../models/ICacheGeneric' -import CaptainManager from '../../../../user/system/CaptainManager' -import Logger from '../../../../utils/Logger' -import Utils from '../../../../utils/Utils' + getAllAppDefinitions, + registerAppDefinition, + updateAppDefinition, +} from "../../../../handlers/users/apps/appdefinition/AppDefinitionHandler"; +import InjectionExtractor from "../../../../injection/InjectionExtractor"; +import { AppDeployTokenConfig } from "../../../../models/AppDefinition"; +import { IHashMapGeneric } from "../../../../models/ICacheGeneric"; +import CaptainManager from "../../../../user/system/CaptainManager"; +import Logger from "../../../../utils/Logger"; +import Utils from "../../../../utils/Utils"; -const router = express.Router() +const router = express.Router(); // unused images -router.get('/unusedImages', function (req, res, next) { - return Promise.resolve() - .then(function () { - const mostRecentLimit = Number(req.query.mostRecentLimit || '0') - return CaptainManager.get() - .getDiskCleanupManager() - .getUnusedImages(mostRecentLimit) - }) - .then(function (unusedImages) { - const baseApi = new BaseApi( - ApiStatusCodes.STATUS_OK, - 'Unused images retrieved.' - ) - baseApi.data = {} - baseApi.data.unusedImages = unusedImages +router.get("/unusedImages", function (req, res, next) { + return Promise.resolve() + .then(function () { + const mostRecentLimit = Number(req.query.mostRecentLimit || "0"); + return CaptainManager.get() + .getDiskCleanupManager() + .getUnusedImages(mostRecentLimit); + }) + .then(function (unusedImages) { + const baseApi = new BaseApi( + ApiStatusCodes.STATUS_OK, + "Unused images retrieved.", + ); + baseApi.data = {}; + baseApi.data.unusedImages = unusedImages; - res.send(baseApi) - }) - .catch(ApiStatusCodes.createCatcher(res)) -}) + res.send(baseApi); + }) + .catch(ApiStatusCodes.createCatcher(res)); +}); // delete images -router.post('/deleteImages', function (req, res, next) { - const imageIds = req.body.imageIds || [] +router.post("/deleteImages", function (req, res, next) { + const imageIds = req.body.imageIds || []; - return Promise.resolve() - .then(function () { - return CaptainManager.get() - .getDiskCleanupManager() - .deleteImages(imageIds) - }) - .then(function () { - const baseApi = new BaseApi( - ApiStatusCodes.STATUS_OK, - 'Images Deleted.' - ) - res.send(baseApi) - }) - .catch(ApiStatusCodes.createCatcher(res)) -}) + return Promise.resolve() + .then(function () { + return CaptainManager.get() + .getDiskCleanupManager() + .deleteImages(imageIds); + }) + .then(function () { + const baseApi = new BaseApi(ApiStatusCodes.STATUS_OK, "Images Deleted."); + res.send(baseApi); + }) + .catch(ApiStatusCodes.createCatcher(res)); +}); // Get All App Definitions -router.get('/', function (req, res, next) { - const dataStore = - InjectionExtractor.extractUserFromInjected(res).user.dataStore - const serviceManager = - InjectionExtractor.extractUserFromInjected(res).user.serviceManager +router.get("/", function (req, res, next) { + const dataStore = + InjectionExtractor.extractUserFromInjected(res).user.dataStore; + const serviceManager = + InjectionExtractor.extractUserFromInjected(res).user.serviceManager; - return getAllAppDefinitions(dataStore, serviceManager) - .then(function (result) { - const baseApi = new BaseApi( - ApiStatusCodes.STATUS_OK, - result.message - ) - baseApi.data = result.data - res.send(baseApi) - }) - .catch(ApiStatusCodes.createCatcher(res)) -}) + return getAllAppDefinitions(dataStore, serviceManager) + .then(function (result) { + const baseApi = new BaseApi(ApiStatusCodes.STATUS_OK, result.message); + baseApi.data = result.data; + res.send(baseApi); + }) + .catch(ApiStatusCodes.createCatcher(res)); +}); -router.post('/enablebasedomainssl/', function (req, res, next) { - const serviceManager = - InjectionExtractor.extractUserFromInjected(res).user.serviceManager +router.post("/enablebasedomainssl/", function (req, res, next) { + const serviceManager = + InjectionExtractor.extractUserFromInjected(res).user.serviceManager; - const appName = req.body.appName + const appName = req.body.appName; - return Promise.resolve() - .then(function () { - return serviceManager.enableSslForApp(appName) - }) - .then(function () { - const msg = `General SSL is enabled for: ${appName}` - Logger.d(msg) - res.send(new BaseApi(ApiStatusCodes.STATUS_OK, msg)) - }) - .catch(ApiStatusCodes.createCatcher(res)) -}) + return Promise.resolve() + .then(function () { + return serviceManager.enableSslForApp(appName); + }) + .then(function () { + const msg = `General SSL is enabled for: ${appName}`; + Logger.d(msg); + res.send(new BaseApi(ApiStatusCodes.STATUS_OK, msg)); + }) + .catch(ApiStatusCodes.createCatcher(res)); +}); -router.post('/customdomain/', function (req, res, next) { - const serviceManager = - InjectionExtractor.extractUserFromInjected(res).user.serviceManager +router.post("/customdomain/", function (req, res, next) { + const serviceManager = + InjectionExtractor.extractUserFromInjected(res).user.serviceManager; - const appName = req.body.appName - const customDomain = (req.body.customDomain || '').toLowerCase().trim() + const appName = req.body.appName; + const customDomain = (req.body.customDomain || "").toLowerCase().trim(); - // verify customdomain.com going through the default NGINX - // Add customdomain.com to app in Data Store + // verify customdomain.com going through the default NGINX + // Add customdomain.com to app in Data Store - return Promise.resolve() - .then(function () { - return serviceManager.addCustomDomain(appName, customDomain) - }) - .then(function () { - const msg = `Custom domain is enabled for: ${appName} at ${customDomain}` - Logger.d(msg) - res.send(new BaseApi(ApiStatusCodes.STATUS_OK, msg)) - }) - .catch(ApiStatusCodes.createCatcher(res)) -}) + return Promise.resolve() + .then(function () { + return serviceManager.addCustomDomain(appName, customDomain); + }) + .then(function () { + const msg = `Custom domain is enabled for: ${appName} at ${customDomain}`; + Logger.d(msg); + res.send(new BaseApi(ApiStatusCodes.STATUS_OK, msg)); + }) + .catch(ApiStatusCodes.createCatcher(res)); +}); -router.post('/removecustomdomain/', function (req, res, next) { - const serviceManager = - InjectionExtractor.extractUserFromInjected(res).user.serviceManager +router.post("/removecustomdomain/", function (req, res, next) { + const serviceManager = + InjectionExtractor.extractUserFromInjected(res).user.serviceManager; - const appName = req.body.appName - const customDomain = (req.body.customDomain || '').toLowerCase() + const appName = req.body.appName; + const customDomain = (req.body.customDomain || "").toLowerCase(); - return Promise.resolve() - .then(function () { - return serviceManager.removeCustomDomain(appName, customDomain) - }) - .then(function () { - const msg = `Custom domain is removed for: ${appName} at ${customDomain}` - Logger.d(msg) - res.send(new BaseApi(ApiStatusCodes.STATUS_OK, msg)) - }) - .catch(ApiStatusCodes.createCatcher(res)) -}) + return Promise.resolve() + .then(function () { + return serviceManager.removeCustomDomain(appName, customDomain); + }) + .then(function () { + const msg = `Custom domain is removed for: ${appName} at ${customDomain}`; + Logger.d(msg); + res.send(new BaseApi(ApiStatusCodes.STATUS_OK, msg)); + }) + .catch(ApiStatusCodes.createCatcher(res)); +}); -router.post('/enablecustomdomainssl/', function (req, res, next) { - const serviceManager = - InjectionExtractor.extractUserFromInjected(res).user.serviceManager +router.post("/enablecustomdomainssl/", function (req, res, next) { + const serviceManager = + InjectionExtractor.extractUserFromInjected(res).user.serviceManager; - const appName = req.body.appName - const customDomain = (req.body.customDomain || '').toLowerCase() + const appName = req.body.appName; + const customDomain = (req.body.customDomain || "").toLowerCase(); - // Check if customdomain is already associated with app. If not, error out. - // Verify customdomain.com is served from /customdomain.com/ + // Check if customdomain is already associated with app. If not, error out. + // Verify customdomain.com is served from /customdomain.com/ - return Promise.resolve() - .then(function () { - return serviceManager.enableCustomDomainSsl(appName, customDomain) - }) - .then(function () { - const msg = `Custom domain SSL is enabled for: ${appName} at ${customDomain} ` - Logger.d(msg) - res.send(new BaseApi(ApiStatusCodes.STATUS_OK, msg)) - }) - .catch(ApiStatusCodes.createCatcher(res)) -}) + return Promise.resolve() + .then(function () { + return serviceManager.enableCustomDomainSsl(appName, customDomain); + }) + .then(function () { + const msg = `Custom domain SSL is enabled for: ${appName} at ${customDomain} `; + Logger.d(msg); + res.send(new BaseApi(ApiStatusCodes.STATUS_OK, msg)); + }) + .catch(ApiStatusCodes.createCatcher(res)); +}); -router.post('/register/', function (req, res, next) { - const dataStore = - InjectionExtractor.extractUserFromInjected(res).user.dataStore - const serviceManager = - InjectionExtractor.extractUserFromInjected(res).user.serviceManager +router.post("/register/", function (req, res, next) { + const dataStore = + InjectionExtractor.extractUserFromInjected(res).user.dataStore; + const serviceManager = + InjectionExtractor.extractUserFromInjected(res).user.serviceManager; - const appName = req.body.appName as string - const projectId = `${req.body.projectId || ''}` - const hasPersistentData = !!req.body.hasPersistentData - const isDetachedBuild = !!req.query.detached + const appName = req.body.appName as string; + const projectId = `${req.body.projectId || ""}`; + const hasPersistentData = !!req.body.hasPersistentData; + const isDetachedBuild = !!req.query.detached; - return registerAppDefinition( - { appName, projectId, hasPersistentData, isDetachedBuild }, - dataStore, - serviceManager - ) - .then(function (result) { - res.send(new BaseApi(ApiStatusCodes.STATUS_OK, result.message)) - }) - .catch(ApiStatusCodes.createCatcher(res)) -}) + return registerAppDefinition( + { appName, projectId, hasPersistentData, isDetachedBuild }, + dataStore, + serviceManager, + ) + .then(function (result) { + res.send(new BaseApi(ApiStatusCodes.STATUS_OK, result.message)); + }) + .catch(ApiStatusCodes.createCatcher(res)); +}); -router.post('/delete/', function (req, res, next) { - const serviceManager = - InjectionExtractor.extractUserFromInjected(res).user.serviceManager - const dataStore = - InjectionExtractor.extractUserFromInjected(res).user.dataStore +router.post("/delete/", function (req, res, next) { + const serviceManager = + InjectionExtractor.extractUserFromInjected(res).user.serviceManager; + const dataStore = + InjectionExtractor.extractUserFromInjected(res).user.dataStore; - const appName: string = req.body.appName - const volumes: string[] = req.body.volumes || [] - const appNames: string[] = req.body.appNames || [] - const appsToDelete: string[] = appNames.length ? appNames : [appName] + const appName: string = req.body.appName; + const volumes: string[] = req.body.volumes || []; + const appNames: string[] = req.body.appNames || []; + const appsToDelete: string[] = appNames.length ? appNames : [appName]; - Logger.d(`Deleting app started: ${appName}`) - const volumesToDelete: IHashMapGeneric = {} + Logger.d(`Deleting app started: ${appName}`); + const volumesToDelete: IHashMapGeneric = {}; - return Promise.resolve() - .then(function () { - if (appNames.length > 0 && appName) { - throw ApiStatusCodes.createError( - ApiStatusCodes.ILLEGAL_OPERATION, - 'Either appName or appNames should be provided' - ) - } - }) - .then(function () { - return dataStore.getAppsDataStore().getAppDefinitions() - }) - .then(function (apps) { - appsToDelete.forEach((appNameToDelete) => { - const app = apps[appNameToDelete] - if (!app) { - return - } + return Promise.resolve() + .then(function () { + if (appNames.length > 0 && appName) { + throw ApiStatusCodes.createError( + ApiStatusCodes.ILLEGAL_OPERATION, + "Either appName or appNames should be provided", + ); + } + }) + .then(function () { + return dataStore.getAppsDataStore().getAppDefinitions(); + }) + .then(function (apps) { + appsToDelete.forEach((appNameToDelete) => { + const app = apps[appNameToDelete]; + if (!app) { + return; + } - const volumesForApp = app.volumes || [] - volumesForApp.forEach((volume) => { - const volumeName = volume.volumeName - if (!volumeName || volumes.indexOf(volumeName) < 0) { - return - } + const volumesForApp = app.volumes || []; + volumesForApp.forEach((volume) => { + const volumeName = volume.volumeName; + if (!volumeName || volumes.indexOf(volumeName) < 0) { + return; + } - const physicalVolumeName = dataStore - .getAppsDataStore() - .getVolumeName( - volumeName, - !!app.isLegacyAppName - ) - volumesToDelete[physicalVolumeName] = volumeName - }) - }) - }) - .then(function () { - return serviceManager.removeApps(appsToDelete) - }) - .then(function () { - return Utils.getDelayedPromise(volumes.length ? 12000 : 0) - }) - .then(function () { - return serviceManager.removeVolsSafe(volumesToDelete) - }) - .then(function (failedVolsToRemoved) { - Logger.d(`Successfully deleted: ${appsToDelete.join(', ')}`) + const physicalVolumeName = dataStore + .getAppsDataStore() + .getVolumeName(volumeName, !!app.isLegacyAppName); + volumesToDelete[physicalVolumeName] = volumeName; + }); + }); + }) + .then(function () { + return serviceManager.removeApps(appsToDelete); + }) + .then(function () { + return Utils.getDelayedPromise(volumes.length ? 12000 : 0); + }) + .then(function () { + return serviceManager.removeVolsSafe(volumesToDelete); + }) + .then(function (failedVolsToRemoved) { + Logger.d(`Successfully deleted: ${appsToDelete.join(", ")}`); - if (failedVolsToRemoved.length) { - const returnVal = new BaseApi( - ApiStatusCodes.STATUS_OK_PARTIALLY, - `App is deleted. Some volumes were not safe to delete. Delete skipped for: ${failedVolsToRemoved.join( - ' , ' - )}` - ) - returnVal.data = { volumesFailedToDelete: failedVolsToRemoved } - res.send(returnVal) - } else { - res.send( - new BaseApi(ApiStatusCodes.STATUS_OK, 'App is deleted') - ) - } - }) - .catch(ApiStatusCodes.createCatcher(res)) -}) + if (failedVolsToRemoved.length) { + const returnVal = new BaseApi( + ApiStatusCodes.STATUS_OK_PARTIALLY, + `App is deleted. Some volumes were not safe to delete. Delete skipped for: ${failedVolsToRemoved.join( + " , ", + )}`, + ); + returnVal.data = { volumesFailedToDelete: failedVolsToRemoved }; + res.send(returnVal); + } else { + res.send(new BaseApi(ApiStatusCodes.STATUS_OK, "App is deleted")); + } + }) + .catch(ApiStatusCodes.createCatcher(res)); +}); -router.post('/rename/', function (req, res, next) { - const serviceManager = - InjectionExtractor.extractUserFromInjected(res).user.serviceManager +router.post("/rename/", function (req, res, next) { + const serviceManager = + InjectionExtractor.extractUserFromInjected(res).user.serviceManager; - const oldAppName = req.body.oldAppName + '' - const newAppName = req.body.newAppName + '' + const oldAppName = req.body.oldAppName + ""; + const newAppName = req.body.newAppName + ""; - Logger.d(`Renaming app started: From ${oldAppName} To ${newAppName} `) + Logger.d(`Renaming app started: From ${oldAppName} To ${newAppName} `); - return Promise.resolve() - .then(function () { - return serviceManager.renameApp(oldAppName, newAppName) - }) - .then(function () { - Logger.d('AppName is renamed') - res.send( - new BaseApi(ApiStatusCodes.STATUS_OK, 'AppName is renamed') - ) - }) - .catch(ApiStatusCodes.createCatcher(res)) -}) + return Promise.resolve() + .then(function () { + return serviceManager.renameApp(oldAppName, newAppName); + }) + .then(function () { + Logger.d("AppName is renamed"); + res.send(new BaseApi(ApiStatusCodes.STATUS_OK, "AppName is renamed")); + }) + .catch(ApiStatusCodes.createCatcher(res)); +}); // Update app configs -router.post('/update/', function (req, res, next) { - const serviceManager = - InjectionExtractor.extractUserFromInjected(res).user.serviceManager +router.post("/update/", function (req, res, next) { + const serviceManager = + InjectionExtractor.extractUserFromInjected(res).user.serviceManager; - const appName = req.body.appName - const projectId = req.body.projectId - const nodeId = req.body.nodeId - const captainDefinitionRelativeFilePath = - req.body.captainDefinitionRelativeFilePath - const notExposeAsWebApp = req.body.notExposeAsWebApp - const tags = req.body.tags - const customNginxConfig = req.body.customNginxConfig - const forceSsl = req.body.forceSsl - const websocketSupport = req.body.websocketSupport - const repoInfo = req.body.appPushWebhook - ? req.body.appPushWebhook.repoInfo - : undefined - const envVars = req.body.envVars - const volumes = req.body.volumes - const ports = req.body.ports - const instanceCount = req.body.instanceCount - const redirectDomain = req.body.redirectDomain - const preDeployFunction = req.body.preDeployFunction - const serviceUpdateOverride = req.body.serviceUpdateOverride - const containerHttpPort = req.body.containerHttpPort - const httpAuth = req.body.httpAuth - const appDeployTokenConfig = req.body.appDeployTokenConfig as - | AppDeployTokenConfig - | undefined - const description = req.body.description + const appName = req.body.appName; + const projectId = req.body.projectId; + const nodeId = req.body.nodeId; + const captainDefinitionRelativeFilePath = + req.body.captainDefinitionRelativeFilePath; + const notExposeAsWebApp = req.body.notExposeAsWebApp; + const tags = req.body.tags; + const customNginxConfig = req.body.customNginxConfig; + const forceSsl = req.body.forceSsl; + const websocketSupport = req.body.websocketSupport; + const repoInfo = req.body.appPushWebhook + ? req.body.appPushWebhook.repoInfo + : undefined; + const envVars = req.body.envVars; + const volumes = req.body.volumes; + const ports = req.body.ports; + const instanceCount = req.body.instanceCount; + const redirectDomain = req.body.redirectDomain; + const preDeployFunction = req.body.preDeployFunction; + const serviceUpdateOverride = req.body.serviceUpdateOverride; + const containerHttpPort = req.body.containerHttpPort; + const httpAuth = req.body.httpAuth; + const appDeployTokenConfig = req.body.appDeployTokenConfig as + | AppDeployTokenConfig + | undefined; + const description = req.body.description; - return updateAppDefinition( - { - appName, - projectId, - description, - instanceCount, - captainDefinitionRelativeFilePath, - envVars, - volumes, - tags, - nodeId, - notExposeAsWebApp, - containerHttpPort, - httpAuth, - forceSsl, - ports, - repoInfo, - customNginxConfig, - redirectDomain, - preDeployFunction, - serviceUpdateOverride, - websocketSupport, - appDeployTokenConfig, - }, - serviceManager - ) - .then(function (result) { - res.send(new BaseApi(ApiStatusCodes.STATUS_OK, result.message)) - }) - .catch(ApiStatusCodes.createCatcher(res)) -}) + return updateAppDefinition( + { + appName, + projectId, + description, + instanceCount, + captainDefinitionRelativeFilePath, + envVars, + volumes, + tags, + nodeId, + notExposeAsWebApp, + containerHttpPort, + httpAuth, + forceSsl, + ports, + repoInfo, + customNginxConfig, + redirectDomain, + preDeployFunction, + serviceUpdateOverride, + websocketSupport, + appDeployTokenConfig, + }, + serviceManager, + ) + .then(function (result) { + res.send(new BaseApi(ApiStatusCodes.STATUS_OK, result.message)); + }) + .catch(ApiStatusCodes.createCatcher(res)); +}); -export default router +export default router;