From 9212620053368bae70457b23440cdb836cf9f55f Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Micha=C3=ABl=20Minelli?= <michael@minelli.me>
Date: Wed, 28 Jun 2023 21:54:26 +0200
Subject: [PATCH] Add GitlabHelper

---
 ExpressAPI/src/helpers/GitlabHelper.ts | 71 ++++++++++++++++++++++++++
 1 file changed, 71 insertions(+)
 create mode 100644 ExpressAPI/src/helpers/GitlabHelper.ts

diff --git a/ExpressAPI/src/helpers/GitlabHelper.ts b/ExpressAPI/src/helpers/GitlabHelper.ts
new file mode 100644
index 0000000..a314515
--- /dev/null
+++ b/ExpressAPI/src/helpers/GitlabHelper.ts
@@ -0,0 +1,71 @@
+import axios             from 'axios';
+import Config            from '../config/Config';
+import GitlabRepository  from '../shared/types/Gitlab/GitlabRepository';
+import GitlabAccessLevel from '../shared/types/Gitlab/GitlabAccessLevel';
+import GitlabMember      from '../shared/types/Gitlab/GitlabMember';
+
+
+enum GitlabRoutes {
+    REPOSITORY_GET         = '/projects/{{id}}',
+    REPOSITORY_CREATE      = '/projects',
+    REPOSITORY_MEMBER_ADD  = '/projects/{{id}}/members',
+    REPOSITORY_MEMBERS_GET = '/projects/{{id}}/members/all'
+}
+
+
+class GitlabHelper {
+    private static _instance: GitlabHelper;
+
+    private constructor() { }
+
+    public static get instance(): GitlabHelper {
+        if ( !GitlabHelper._instance ) {
+            GitlabHelper._instance = new GitlabHelper();
+        }
+
+        return GitlabHelper._instance;
+    }
+
+    private getApiUrl(route: GitlabRoutes): string {
+        return `${ Config.gitlab.apiURL }${ route }`;
+    }
+
+    async createRepository(name: string, description: string, visibility: string, initializeWithReadme: boolean, namespace: number, sharedRunnersEnabled: boolean, wikiEnabled: boolean, import_url: string): Promise<GitlabRepository> {
+        const response = await axios.post<GitlabRepository>(this.getApiUrl(GitlabRoutes.REPOSITORY_CREATE), {
+            name                  : name,
+            description           : description,
+            import_url            : import_url,
+            initialize_with_readme: initializeWithReadme,
+            namespace_id          : namespace,
+            shared_runners_enabled: sharedRunnersEnabled,
+            visibility            : visibility,
+            wiki_enabled          : wikiEnabled
+        });
+
+        return response.data;
+    }
+
+    async getRepository(idOrNamespace: string): Promise<GitlabRepository> {
+        const response = await axios.get<GitlabRepository>(this.getApiUrl(GitlabRoutes.REPOSITORY_GET).replace('{{id}}', encodeURIComponent(idOrNamespace)));
+
+        return response.data;
+    }
+
+    async getRepositoryMembers(idOrNamespace: string): Promise<Array<GitlabMember>> {
+        const response = await axios.get<Array<GitlabMember>>(this.getApiUrl(GitlabRoutes.REPOSITORY_MEMBERS_GET).replace('{{id}}', encodeURIComponent(idOrNamespace)));
+
+        return response.data;
+    }
+
+    async addRepositoryMember(repoId: number, userId: number, accessLevel: GitlabAccessLevel): Promise<GitlabMember> {
+        const response = await axios.post<GitlabMember>(this.getApiUrl(GitlabRoutes.REPOSITORY_MEMBER_ADD).replace('{{id}}', String(repoId)), {
+            user_id     : userId,
+            access_level: accessLevel
+        });
+
+        return response.data;
+    }
+}
+
+
+export default GitlabHelper.instance;
-- 
GitLab