Canvas: Prettier

Change-Id: I620dde109df0f29f0c85c6fe150e347d2c32a03e
diff --git a/apps/canvas/back/src/github.ts b/apps/canvas/back/src/github.ts
new file mode 100644
index 0000000..850185d
--- /dev/null
+++ b/apps/canvas/back/src/github.ts
@@ -0,0 +1,51 @@
+import axios from "axios";
+import { z } from "zod";
+
+export const GithubRepositorySchema = z.object({
+	id: z.number(),
+	name: z.string(),
+	full_name: z.string(),
+	html_url: z.string(),
+	ssh_url: z.string(),
+});
+
+export type GithubRepository = z.infer<typeof GithubRepositorySchema>;
+
+export class GithubClient {
+	private token: string;
+
+	constructor(token: string) {
+		this.token = token;
+	}
+
+	private getHeaders() {
+		return {
+			Authorization: `Bearer ${this.token}`,
+			Accept: "application/vnd.github.v3+json",
+		};
+	}
+
+	async getRepositories(): Promise<GithubRepository[]> {
+		const response = await axios.get("https://api.github.com/user/repos", {
+			headers: this.getHeaders(),
+		});
+		return z.array(GithubRepositorySchema).parse(response.data);
+	}
+
+	async addDeployKey(repoPath: string, key: string) {
+		const sshUrl = repoPath;
+		const repoOwnerAndName = sshUrl.replace("git@github.com:", "").replace(".git", "");
+
+		await axios.post(
+			`https://api.github.com/repos/${repoOwnerAndName}/keys`,
+			{
+				title: "dodo",
+				key: key,
+				read_only: true,
+			},
+			{
+				headers: this.getHeaders(),
+			},
+		);
+	}
+}