From 5e37d41195073f51544a51d7bdd069a9b09b9cd0 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Micha=C3=ABl=20Minelli?= <michael@minelli.me>
Date: Tue, 25 Jul 2023 11:51:42 +0200
Subject: [PATCH] CheckAccesses => Move to independent function

---
 .../commander/enonce/EnonceCreateCommand.ts   | 12 +--------
 .../exercice/ExerciceCreateCommand.ts         | 12 +--------
 NodeApp/src/helpers/AccessesHelper.ts         | 27 +++++++++++++++++++
 NodeApp/src/managers/SessionManager.ts        | 20 +++++++-------
 4 files changed, 38 insertions(+), 33 deletions(-)
 create mode 100644 NodeApp/src/helpers/AccessesHelper.ts

diff --git a/NodeApp/src/commander/enonce/EnonceCreateCommand.ts b/NodeApp/src/commander/enonce/EnonceCreateCommand.ts
index 2ea03fb..ea285bd 100644
--- a/NodeApp/src/commander/enonce/EnonceCreateCommand.ts
+++ b/NodeApp/src/commander/enonce/EnonceCreateCommand.ts
@@ -22,16 +22,6 @@ class EnonceCreateCommand extends CommanderCommand {
         .action(this.commandAction.bind(this));
     }
 
-    private async checkAccesses(): Promise<boolean> {
-        let sessionResult = await SessionManager.testSession(true, [ 'teachingStaff' ]);
-
-        if ( !sessionResult || !sessionResult.teachingStaff ) {
-            return false;
-        }
-
-        return (await GitlabManager.testToken(true)).every(result => result);
-    }
-
     protected async commandAction(options: any): Promise<void> {
         let members!: Array<GitlabUser> | false;
         let templateIdOrNamespace: string | null = null;
@@ -40,7 +30,7 @@ class EnonceCreateCommand extends CommanderCommand {
         {
             console.log(chalk.cyan('Please wait while we verify and retrieve data...'));
 
-            if ( !await this.checkAccesses() ) {
+            if ( !await AccessesHelper.checkTeachingStaff() ) {
                 return;
             }
 
diff --git a/NodeApp/src/commander/exercice/ExerciceCreateCommand.ts b/NodeApp/src/commander/exercice/ExerciceCreateCommand.ts
index 015b780..d05767e 100644
--- a/NodeApp/src/commander/exercice/ExerciceCreateCommand.ts
+++ b/NodeApp/src/commander/exercice/ExerciceCreateCommand.ts
@@ -21,16 +21,6 @@ class ExerciceCreateCommand extends CommanderCommand {
         .action(this.commandAction.bind(this));
     }
 
-    private async checkAccesses(): Promise<boolean> {
-        let sessionResult = await SessionManager.testSession(true, [ 'student' ]);
-
-        if ( !sessionResult ) {
-            return false;
-        }
-
-        return (await GitlabManager.testToken(true)).every(result => result);
-    }
-
     protected async commandAction(options: any): Promise<void> {
         let members!: Array<GitlabUser> | false;
         let enonce!: Enonce | undefined;
@@ -39,7 +29,7 @@ class ExerciceCreateCommand extends CommanderCommand {
         {
             console.log(chalk.cyan('Please wait while we verify and retrieve data...'));
 
-            if ( !await this.checkAccesses() ) {
+            if ( !await AccessesHelper.checkStudent() ) {
                 return;
             }
 
diff --git a/NodeApp/src/helpers/AccessesHelper.ts b/NodeApp/src/helpers/AccessesHelper.ts
new file mode 100644
index 0000000..0327ed2
--- /dev/null
+++ b/NodeApp/src/helpers/AccessesHelper.ts
@@ -0,0 +1,27 @@
+import SessionManager from '../managers/SessionManager';
+import GitlabManager  from '../managers/GitlabManager';
+
+
+class AccessesHelper {
+    async checkStudent(): Promise<boolean> {
+        let sessionResult = await SessionManager.testSession(true, [ 'student' ]);
+
+        if ( !sessionResult ) {
+            return false;
+        }
+
+        return (await GitlabManager.testToken(true)).every(result => result);
+    }
+    
+    async checkTeachingStaff(): Promise<boolean> {
+        let sessionResult = await SessionManager.testSession(true, [ 'teachingStaff' ]);
+
+        if ( !sessionResult || !sessionResult.teachingStaff ) {
+            return false;
+        }
+
+        return (await GitlabManager.testToken(true)).every(result => result);
+    }
+};
+
+export default new AccessesHelper();
\ No newline at end of file
diff --git a/NodeApp/src/managers/SessionManager.ts b/NodeApp/src/managers/SessionManager.ts
index aa1420a..ccf34ef 100644
--- a/NodeApp/src/managers/SessionManager.ts
+++ b/NodeApp/src/managers/SessionManager.ts
@@ -70,17 +70,15 @@ class SessionManager {
         this.token = '';
     }
 
-    checkPermissions(verbose: boolean = true, indent: number = 8, ...checkPermissions: Array<string>): Permissions {
+    checkPermissions(verbose: boolean = true, indent: number = 8, checkPermissions: Array<string> | null = []): Permissions {
         const hasPermission = (permissionPredicate: () => boolean, verboseText: string): boolean => {
-            const spinner: ora.Ora = ora({
-                                             text  : verboseText,
-                                             indent: indent
-                                         });
-
             let isAllowed: boolean = this.profile.id !== -1 && permissionPredicate();
 
             if ( verbose ) {
-                spinner.start();
+                const spinner: ora.Ora = ora({
+                                                 text  : verboseText,
+                                                 indent: indent
+                                             }).start();
                 isAllowed ? spinner.succeed() : spinner.fail();
             }
 
@@ -88,13 +86,13 @@ class SessionManager {
         };
 
         return {
-            teachingStaff: checkPermissions.length == 0 || checkPermissions.includes('teachingStaff') ? hasPermission(() => this.profile.isTeachingStaff, 'Teaching staff permissions') : false,
-            student      : checkPermissions.length == 0 || checkPermissions.includes('student') ? hasPermission(() => true, 'Student permissions') : false
+            teachingStaff: checkPermissions && (checkPermissions.length == 0 || checkPermissions.includes('teachingStaff')) ? hasPermission(() => this.profile.isTeachingStaff, 'Teaching staff permissions') : false,
+            student      : checkPermissions && (checkPermissions.length == 0 || checkPermissions.includes('student')) ? hasPermission(() => true, 'Student permissions') : false
         };
     }
 
 
-    async testSession(verbose: boolean = true, checkPermissions: Array<string> = []): Promise<false | Permissions> {
+    async testSession(verbose: boolean = true, checkPermissions: Array<string> | null = []): Promise<false | Permissions> {
         if ( verbose ) {
             ora('Checking Dojo session: ').start().info();
         }
@@ -123,7 +121,7 @@ class SessionManager {
             return false;
         }
 
-        return this.checkPermissions(verbose, 8, ...checkPermissions);
+        return this.checkPermissions(verbose, 8, checkPermissions);
     }
 }
 
-- 
GitLab