Canvas: Rework Deployment/Gateways tab

Change-Id: I938262b9a6ba2af060531e7dcdf91ddd66721385
diff --git a/apps/canvas/back/src/app_manager.ts b/apps/canvas/back/src/app_manager.ts
index 2f62ddd..803192c 100644
--- a/apps/canvas/back/src/app_manager.ts
+++ b/apps/canvas/back/src/app_manager.ts
@@ -1,9 +1,54 @@
 import axios from "axios";
 import { z } from "zod";
 
+const accessSchema = z.discriminatedUnion("type", [
+	z.object({
+		type: z.literal("https"),
+		name: z.string(),
+		address: z.string(),
+	}),
+	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),
 });
 
 export type DeployResponse = z.infer<typeof DeployResponseSchema>;
@@ -24,6 +69,7 @@
 		if (response.status !== 200) {
 			throw new Error(`Failed to deploy application: ${response.statusText}`);
 		}
+		console.log(response.data);
 		const result = DeployResponseSchema.safeParse(response.data);
 		if (!result.success) {
 			throw new Error(`Invalid deploy response format: ${result.error.message}`);
@@ -31,13 +77,20 @@
 		return result.data;
 	}
 
-	async update(instanceId: string, config: unknown): Promise<boolean> {
+	async update(instanceId: string, config: unknown): Promise<DeployResponse> {
 		const response = await axios.request({
 			url: `${this.baseUrl}/api/dodo-app/${instanceId}`,
 			method: "put",
 			data: { config },
 		});
-		return response.status === 200;
+		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> {