Canvas: Logs tab

Change-Id: Iddf52dbce6fb2090f095cecb04bafcb50c47e4a7
diff --git a/apps/canvas/back/src/index.ts b/apps/canvas/back/src/index.ts
index 0a35dfe..c934a9b 100644
--- a/apps/canvas/back/src/index.ts
+++ b/apps/canvas/back/src/index.ts
@@ -9,6 +9,7 @@
 
 // Map to store worker addresses by project ID
 const workers = new Map<number, string[]>();
+const logs = new Map<number, Map<string, string>>();
 
 const handleProjectCreate: express.Handler = async (req, resp) => {
 	try {
@@ -347,6 +348,9 @@
 			return;
 		}
 
+		const projectLogs = logs.get(projectId) || new Map();
+		const services = Array.from(projectLogs.keys());
+
 		resp.status(200);
 		resp.write(
 			JSON.stringify({
@@ -366,6 +370,7 @@
 						domain: "p.v1.dodo.cloud",
 					},
 				],
+				services,
 			}),
 		);
 	} catch (error) {
@@ -377,8 +382,40 @@
 	}
 };
 
+const handleServiceLogs: express.Handler = async (req, resp) => {
+	try {
+		const projectId = Number(req.params["projectId"]);
+		const service = req.params["service"];
+
+		const projectLogs = logs.get(projectId);
+		if (!projectLogs) {
+			resp.status(404);
+			resp.write(JSON.stringify({ error: "No logs found for this project" }));
+			return;
+		}
+
+		const serviceLog = projectLogs.get(service);
+		if (!serviceLog) {
+			resp.status(404);
+			resp.write(JSON.stringify({ error: "No logs found for this service" }));
+			return;
+		}
+
+		resp.status(200);
+		resp.write(JSON.stringify({ logs: serviceLog }));
+	} catch (e) {
+		console.log(e);
+		resp.status(500);
+		resp.write(JSON.stringify({ error: "Failed to get service logs" }));
+	} finally {
+		resp.end();
+	}
+};
+
 const WorkerSchema = z.object({
+	service: z.string(),
 	address: z.string().url(),
+	logs: z.optional(z.string()),
 });
 
 const handleRegisterWorker: express.Handler = async (req, resp) => {
@@ -386,7 +423,6 @@
 		const projectId = Number(req.params["projectId"]);
 
 		const result = WorkerSchema.safeParse(req.body);
-		console.log(result);
 		if (!result.success) {
 			resp.status(400);
 			resp.write(
@@ -398,7 +434,8 @@
 			return;
 		}
 
-		const { address } = result.data;
+		console.log(result);
+		const { service, address, logs: log } = result.data;
 
 		// Get existing workers or initialize empty array
 		const projectWorkers = workers.get(projectId) || [];
@@ -409,12 +446,15 @@
 		}
 
 		workers.set(projectId, projectWorkers);
-
+		if (log) {
+			const svcLogs: Map<string, string> = logs.get(projectId) || new Map();
+			svcLogs.set(service, log);
+			logs.set(projectId, svcLogs);
+		}
 		resp.status(200);
 		resp.write(
 			JSON.stringify({
 				success: true,
-				workers: projectWorkers,
 			}),
 		);
 	} catch (e) {
@@ -475,6 +515,7 @@
 	app.get("/api/project/:projectId/env", handleEnv);
 	app.post("/api/project/:projectId/workers", handleRegisterWorker);
 	app.post("/api/project/:projectId/reload", handleReload);
+	app.get("/api/project/:projectId/logs/:service", handleServiceLogs);
 	app.use("/", express.static("../front/dist"));
 	app.listen(env.DODO_PORT_WEB, () => {
 		console.log("started");