| 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; |
| } |
| } |