blob: 4fa8cfd529642cda1c494ddaa1e539472862b143 [file] [log] [blame]
import axios from "axios";
import { z } from "zod";
export const accessSchema = z.discriminatedUnion("type", [
z.object({
type: z.literal("https"),
name: z.string(),
address: z.string(),
agentName: z.string().optional(),
}),
z.object({
type: z.literal("ssh"),
name: z.string(),
host: z.string(),
port: z.number(),
}),
z.object({
type: z.literal("tcp"),
name: z.string(),
host: z.string(),
port: z.number(),
}),
z.object({
type: z.literal("udp"),
name: z.string(),
host: z.string(),
port: z.number(),
}),
z.object({
type: z.literal("postgresql"),
name: z.string(),
host: z.string(),
port: z.number(),
database: z.string(),
username: z.string(),
password: z.string(),
}),
z.object({
type: z.literal("mongodb"),
name: z.string(),
host: z.string(),
port: z.number(),
database: z.string(),
username: z.string(),
password: z.string(),
}),
]);
export const DeployResponseSchema = z.object({
id: z.string(),
deployKey: z.string(),
access: z.array(accessSchema),
envVars: z.array(z.object({ name: z.string(), value: z.string() })),
});
export type DeployResponse = z.infer<typeof DeployResponseSchema>;
export class AppManager {
private baseUrl: string;
constructor(baseUrl: string = "http://appmanager.hgrz-appmanager.svc.cluster.local") {
this.baseUrl = baseUrl;
}
async deploy(config: unknown): Promise<DeployResponse> {
const response = await axios.request({
url: `${this.baseUrl}/api/dodo-app`,
method: "post",
data: { config },
});
if (response.status !== 200) {
throw new Error(`Failed to deploy application: ${response.statusText}`);
}
const result = DeployResponseSchema.safeParse(response.data);
if (!result.success) {
throw new Error(`Invalid deploy response format: ${result.error.message}`);
}
return result.data;
}
async update(instanceId: string, config: unknown): Promise<DeployResponse> {
const response = await axios.request({
url: `${this.baseUrl}/api/dodo-app/${instanceId}`,
method: "put",
data: { config },
});
if (response.status !== 200) {
throw new Error(`Failed to update application: ${response.statusText}`);
}
const result = DeployResponseSchema.safeParse(response.data);
if (!result.success) {
throw new Error(`Invalid update response format: ${result.error.message}`);
}
return result.data;
}
async getStatus(instanceId: string): Promise<unknown> {
const response = await axios.request({
url: `${this.baseUrl}/api/instance/${instanceId}/status`,
method: "get",
});
if (response.status !== 200) {
throw new Error(`Failed to get application status: ${response.statusText}`);
}
return response.data;
}
async removeInstance(instanceId: string): Promise<boolean> {
const response = await axios.request({
url: `${this.baseUrl}/api/instance/${instanceId}/remove`,
method: "post",
});
return response.status === 200;
}
}