Restore scoped formatting

This commit is contained in:
Kasra Bigdeli
2026-07-18 22:31:53 -07:00
parent b94a34ce86
commit ab46c51d66
@@ -1,336 +1,346 @@
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 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<string> = {};
Logger.d(`Deleting app started: ${appName}`)
const volumesToDelete: IHashMapGeneric<string> = {}
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