Canvas: Import modal

Change-Id: I22928007c5b81d93be2eed2d133fed4d73e1703f
diff --git a/apps/canvas/back/src/index.ts b/apps/canvas/back/src/index.ts
index daeded2..a2e8b31 100644
--- a/apps/canvas/back/src/index.ts
+++ b/apps/canvas/back/src/index.ts
@@ -772,38 +772,50 @@
 		resp.status(400).send({ error: "GitHub token not configured" });
 		return;
 	}
-	let deployKey: string | null = project.deployKey;
-	let deployKeyPublic: string | null = project.deployKeyPublic;
-	if (!deployKeyPublic) {
-		[deployKeyPublic, deployKey] = await generateKey(tmp.dirSync().name);
-		await db.project.update({
-			where: { id: projectId },
-			data: {
-				deployKeyPublic: deployKeyPublic,
-				deployKey: deployKey,
-			},
+	let tmpDir: tmp.DirResult | null = null;
+	try {
+		let deployKey: string | null = project.deployKey;
+		let deployKeyPublic: string | null = project.deployKeyPublic;
+		if (!deployKeyPublic) {
+			[deployKeyPublic, deployKey] = await generateKey(tmp.dirSync().name);
+			await db.project.update({
+				where: { id: projectId },
+				data: {
+					deployKeyPublic: deployKeyPublic,
+					deployKey: deployKey,
+				},
+			});
+		}
+		const github = new GithubClient(project.githubToken);
+		const result = analyzeRepoReqSchema.safeParse(req.body);
+		if (!result.success) {
+			resp.status(400).send({ error: "Invalid request data" });
+			return;
+		}
+		const { address } = result.data;
+		tmpDir = tmp.dirSync({
+			unsafeCleanup: true,
 		});
+		await github.addDeployKey(address, deployKeyPublic);
+		await fs.promises.writeFile(path.join(tmpDir.name, "key"), deployKey!, {
+			mode: 0o600,
+		});
+		shell.exec(
+			`GIT_SSH_COMMAND='ssh -i ${tmpDir.name}/key -o IdentitiesOnly=yes' git clone ${address} ${tmpDir.name}/code`,
+		);
+		const fsc = new RealFileSystem(`${tmpDir.name}/code`);
+		const analyzer = new NodeJSAnalyzer();
+		const info = await analyzer.analyze(fsc, "/");
+		resp.status(200).send([info]);
+	} catch (e) {
+		console.error(e);
+		resp.status(500).send({ error: "Failed to analyze repository" });
+	} finally {
+		if (tmpDir) {
+			tmpDir.removeCallback();
+		}
+		resp.end();
 	}
-	const github = new GithubClient(project.githubToken);
-	const result = analyzeRepoReqSchema.safeParse(req.body);
-	if (!result.success) {
-		resp.status(400).send({ error: "Invalid request data" });
-		return;
-	}
-	const { address } = result.data;
-	const tmpDir = tmp.dirSync();
-	await github.addDeployKey(address, deployKeyPublic);
-	await fs.promises.writeFile(path.join(tmpDir.name, "key"), deployKey!, {
-		mode: 0o600,
-	});
-	shell.exec(
-		`GIT_SSH_COMMAND='ssh -i ${tmpDir.name}/key -o IdentitiesOnly=yes' git clone ${address} ${tmpDir.name}/code`,
-	);
-	const fsc = new RealFileSystem(`${tmpDir.name}/code`);
-	const analyzer = new NodeJSAnalyzer();
-	const info = await analyzer.analyze(fsc, "/");
-	console.log(info);
-	resp.status(200).send([info]);
 };
 
 const auth = (req: express.Request, resp: express.Response, next: express.NextFunction) => {