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(),
+ },
+ );
+ }
+}