caprover-lib
Version:
A library to communicate with CapRover instances
455 lines (377 loc) • 10.8 kB
text/typescript
import { ReadStream } from 'fs';
import HttpClient from './HttpClient';
import { IRegistryInfo } from '../models/IRegistryInfo';
import { ICaptainDefinition } from '../models/ICaptainDefinition';
import { IVersionInfo } from '../models/IVersionInfo';
import { IAppDef } from '../models/AppDef';
import IBuildLogs from '../models/IBuildLogs';
import Constants from '../utils/Constants';
export interface CaproverApiParams {
baseUrl: string;
password?: string;
debug?: boolean;
}
export class CaproverApi {
private authToken: string;
private http: HttpClient;
constructor({
baseUrl,
password = Constants.DEFAULT_PASSWORD,
debug = false,
}: CaproverApiParams) {
this.authToken = debug
? 'eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJkYXRhIjp7Im5hbWVzcGFjZSI6ImNhcHRhaW4iLCJ0b2tlblZlcnNpb24iOiI5NmRjM2U1MC00ZDk3LTRkNmItYTIzMS04MmNiZjY0ZTA2NTYifSwiaWF0IjoxNTQ1OTg0MDQwLCJleHAiOjE1ODE5ODQwNDB9.uGJyhb2JYsdw9toyMKX28bLVuB0PhnS2POwEjKpchww'
: '';
this.http = new HttpClient(baseUrl, this.authToken, () => {
return this.getAuthToken(password);
});
}
callApi(
path: string,
method: 'GET' | 'POST' /*| 'POST_DATA' Not used */,
data: any,
) {
const http = this.http;
return Promise.resolve().then(http.fetch(method, path, data));
}
destroy() {
this.http.destroy();
}
setAuthToken(authToken: string) {
this.authToken = authToken;
this.http.setAuthToken(authToken);
}
isLoggedIn() {
return !!this.authToken;
}
getAuthToken(password: string) {
const http = this.http;
let authTokenFetched = '';
return Promise.resolve() //
.then(http.fetch(http.POST, '/login', { password }))
.then((data) => {
authTokenFetched = data.token;
this.setAuthToken(authTokenFetched);
return authTokenFetched;
})
.then(function () {
return authTokenFetched;
});
}
getCaptainInfo() {
const http = this.http;
return Promise.resolve() //
.then(http.fetch(http.GET, '/user/system/info', {}));
}
updateRootDomain(rootDomain: string) {
const http = this.http;
return Promise.resolve() //
.then(
http.fetch(http.POST, '/user/system/changerootdomain', {
rootDomain,
}),
);
}
enableRootSsl(emailAddress: string) {
const http = this.http;
return Promise.resolve() //
.then(
http.fetch(http.POST, '/user/system/enablessl', {
emailAddress,
}),
);
}
forceSsl(isEnabled: boolean) {
const http = this.http;
return Promise.resolve() //
.then(http.fetch(http.POST, '/user/system/forcessl', { isEnabled }));
}
getAllApps() {
const http = this.http;
return Promise.resolve() //
.then(http.fetch(http.GET, '/user/apps/appDefinitions', {}));
}
fetchBuildLogs(appName: string): Promise<IBuildLogs> {
const http = this.http;
return Promise.resolve() //
.then(http.fetch(http.GET, '/user/apps/appData/' + appName, {}));
}
uploadAppData(appName: string, file: ReadStream, gitHash: string) {
const http = this.http;
return Promise.resolve() //
.then(
http.fetch(
http.POST_DATA,
'/user/apps/appData/' + appName + '?detached=1',
{ sourceFile: file, gitHash },
),
);
}
uploadCaptainDefinitionContent(
appName: string,
captainDefinition: ICaptainDefinition,
gitHash: string,
detached: boolean,
) {
const http = this.http;
return Promise.resolve() //
.then(
http.fetch(
http.POST,
'/user/apps/appData/' + appName + (detached ? '?detached=1' : ''),
{
captainDefinitionContent: JSON.stringify(captainDefinition),
gitHash,
},
),
);
}
updateConfigAndSave(appName: string, appDefinition: IAppDef) {
const instanceCount = appDefinition.instanceCount;
const envVars = appDefinition.envVars;
const notExposeAsWebApp = appDefinition.notExposeAsWebApp;
const forceSsl = appDefinition.forceSsl;
const volumes = appDefinition.volumes;
const ports = appDefinition.ports;
const nodeId = appDefinition.nodeId;
const appPushWebhook = appDefinition.appPushWebhook;
const customNginxConfig = appDefinition.customNginxConfig;
const preDeployFunction = appDefinition.preDeployFunction;
const http = this.http;
return Promise.resolve() //
.then(
http.fetch(http.POST, '/user/apps/appDefinitions/update', {
appName,
instanceCount,
notExposeAsWebApp,
forceSsl,
volumes,
ports,
customNginxConfig,
appPushWebhook,
nodeId,
preDeployFunction,
envVars,
}),
);
}
registerNewApp(appName: string, hasPersistentData: boolean) {
const http = this.http;
return Promise.resolve() //
.then(
http.fetch(http.POST, '/user/apps/appDefinitions/register', {
appName,
hasPersistentData,
}),
);
}
deleteApp(appName: string) {
const http = this.http;
return Promise.resolve() //
.then(
http.fetch(http.POST, '/user/apps/appDefinitions/delete', {
appName,
}),
);
}
enableSslForBaseDomain(appName: string) {
const http = this.http;
return Promise.resolve() //
.then(
http.fetch(http.POST, '/user/apps/appDefinitions/enablebasedomainssl', {
appName,
}),
);
}
attachNewCustomDomainToApp(appName: string, customDomain: string) {
const http = this.http;
return Promise.resolve() //
.then(
http.fetch(http.POST, '/user/apps/appDefinitions/customdomain', {
appName,
customDomain,
}),
);
}
enableSslForCustomDomain(appName: string, customDomain: string) {
const http = this.http;
return Promise.resolve() //
.then(
http.fetch(
http.POST,
'/user/apps/appDefinitions/enablecustomdomainssl',
{
appName,
customDomain,
},
),
);
}
removeCustomDomain(appName: string, customDomain: string) {
const http = this.http;
return Promise.resolve() //
.then(
http.fetch(http.POST, '/user/apps/appDefinitions/removecustomdomain', {
appName,
customDomain,
}),
);
}
getLoadBalancerInfo() {
const http = this.http;
return Promise.resolve() //
.then(http.fetch(http.GET, '/user/system/loadbalancerinfo', {}));
}
getNetDataInfo() {
const http = this.http;
return Promise.resolve() //
.then(http.fetch(http.GET, '/user/system/netdata', {}));
}
updateNetDataInfo(netDataInfo: any) {
const http = this.http;
return Promise.resolve() //
.then(http.fetch(http.POST, '/user/system/netdata', { netDataInfo }));
}
changePass(oldPassword: string, newPassword: string) {
const http = this.http;
return Promise.resolve() //
.then(
http.fetch(http.POST, '/user/changepassword', {
oldPassword,
newPassword,
}),
);
}
getVersionInfo(): Promise<IVersionInfo> {
const http = this.http;
return Promise.resolve() //
.then(http.fetch(http.GET, '/user/system/versioninfo', {}));
}
performUpdate(latestVersion: string) {
const http = this.http;
return Promise.resolve() //
.then(
http.fetch(http.POST, '/user/system/versioninfo', {
latestVersion,
}),
);
}
getNginxConfig() {
const http = this.http;
return Promise.resolve() //
.then(http.fetch(http.GET, '/user/system/nginxconfig', {}));
}
setNginxConfig(customBase: string, customCaptain: string) {
const http = this.http;
return Promise.resolve() //
.then(
http.fetch(http.POST, '/user/system/nginxconfig', {
baseConfig: { customValue: customBase },
captainConfig: { customValue: customCaptain },
}),
);
}
getUnusedImages(mostRecentLimit: number) {
const http = this.http;
return Promise.resolve() //
.then(
http.fetch(http.GET, '/user/apps/appDefinitions/unusedImages', {
mostRecentLimit: mostRecentLimit + '',
}),
);
}
deleteImages(imageIds: string[]) {
const http = this.http;
return Promise.resolve() //
.then(
http.fetch(http.POST, '/user/apps/appDefinitions/deleteImages', {
imageIds,
}),
);
}
getDockerRegistries() {
const http = this.http;
return Promise.resolve() //
.then(http.fetch(http.GET, '/user/registries', {}));
}
enableSelfHostedDockerRegistry() {
const http = this.http;
return Promise.resolve() //
.then(
http.fetch(
http.POST,
'/user/system/selfhostregistry/enableregistry',
{},
),
);
}
disableSelfHostedDockerRegistry() {
const http = this.http;
return Promise.resolve() //
.then(
http.fetch(
http.POST,
'/user/system/selfhostregistry/disableregistry',
{},
),
);
}
addDockerRegistry(dockerRegistry: IRegistryInfo) {
const http = this.http;
return Promise.resolve() //
.then(
http.fetch(http.POST, '/user/registries/insert', {
...dockerRegistry,
}),
);
}
updateDockerRegistry(dockerRegistry: IRegistryInfo) {
const http = this.http;
return Promise.resolve() //
.then(
http.fetch(http.POST, '/user/registries/update', {
...dockerRegistry,
}),
);
}
deleteDockerRegistry(registryId: string) {
const http = this.http;
return Promise.resolve() //
.then(
http.fetch(http.POST, '/user/registries/delete', {
registryId,
}),
);
}
setDefaultPushDockerRegistry(registryId: string) {
const http = this.http;
return Promise.resolve() //
.then(
http.fetch(http.POST, '/user/registries/setpush', {
registryId,
}),
);
}
getAllNodes() {
const http = this.http;
return Promise.resolve() //
.then(http.fetch(http.GET, '/user/system/nodes', {}));
}
addDockerNode(
nodeType: string,
privateKey: string,
remoteNodeIpAddress: string,
captainIpAddress: string,
) {
const http = this.http;
return Promise.resolve() //
.then(
http.fetch(http.POST, '/user/system/nodes', {
nodeType,
privateKey,
remoteNodeIpAddress,
captainIpAddress,
}),
);
}
}