From 3c36818f2ab385730306f3d46594403e749a5c12 Mon Sep 17 00:00:00 2001
From: "@mazikiou" <mazikiou@takima.fr>
Date: Fri, 1 Jul 2022 18:27:24 +0200
Subject: [PATCH] fix: get_user_mission

---
 .../src/core/api.service.ts                   |  2 +-
 .../deadlock-extension/src/core/controller.ts |  2 +-
 .../deadlock-extension/src/core/gitMission.ts | 10 +--
 .../src/core/mission/missionDevContainer.ts   |  4 +-
 .../{userChallenge.ts => userMission.ts}      |  8 ++-
 .../deadlock-extension/src/core/userConfig.ts | 69 +++----------------
 .../src/core/utils/mission.utils.ts           |  4 +-
 .../deadlock-extension/src/extension.ts       |  2 +-
 .../src/recorder/recorder.ts                  |  3 +-
 .../src/view/briefingView.ts                  | 53 ++------------
 .../src/view/startedMissionsView.ts           |  6 +-
 11 files changed, 38 insertions(+), 125 deletions(-)
 rename deadlock-plugins/deadlock-extension/src/core/mission/model/{userChallenge.ts => userMission.ts} (76%)

diff --git a/deadlock-plugins/deadlock-extension/src/core/api.service.ts b/deadlock-plugins/deadlock-extension/src/core/api.service.ts
index 3e1aa50c..116dfceb 100644
--- a/deadlock-plugins/deadlock-extension/src/core/api.service.ts
+++ b/deadlock-plugins/deadlock-extension/src/core/api.service.ts
@@ -7,7 +7,7 @@ import Controller from './controller';
 import ExtensionStore from './extensionStore';
 import KeycloakOAuth2DeviceFlowConnection from './keycloakOAuth2DeviceFlowConnection';
 import { MissionUser } from './mission/model/missionUser';
-import { User } from './mission/model/userChallenge';
+import { User } from './mission/model/userMission';
 
 export default class ApiService {
   private axiosInstance: AxiosInstance;
diff --git a/deadlock-plugins/deadlock-extension/src/core/controller.ts b/deadlock-plugins/deadlock-extension/src/core/controller.ts
index 5fc0a303..eb8f402a 100644
--- a/deadlock-plugins/deadlock-extension/src/core/controller.ts
+++ b/deadlock-plugins/deadlock-extension/src/core/controller.ts
@@ -13,7 +13,7 @@ import { createSshKeyFiles } from './sshKeyManager';
 import { emptyDirectories, removeFilesOrDirectories } from '../recorder/utils/workdir';
 import { missionWorkdir, userSshKeyFolderPath } from './config';
 import { hasStatusNumber } from './utils/typeguards';
-import { User } from './mission/model/userChallenge';
+import { User } from './mission/model/userMission';
 import { existsSync, mkdirSync, writeFileSync } from 'fs';
 import { extract } from 'tar';
 import { parse } from 'yaml';
diff --git a/deadlock-plugins/deadlock-extension/src/core/gitMission.ts b/deadlock-plugins/deadlock-extension/src/core/gitMission.ts
index 91bc7b5d..d80bf521 100644
--- a/deadlock-plugins/deadlock-extension/src/core/gitMission.ts
+++ b/deadlock-plugins/deadlock-extension/src/core/gitMission.ts
@@ -41,7 +41,7 @@ export default class GitMission {
     try {
       await exec(`ssh-add /tmp/.ssh/id_rsa`);
       await exec(
-        `eval "$(ssh-agent -s)" && ssh-keyscan -p ${this.userConfig.getGiteaSshPort()} -H ${this.userConfig.getGiteaHost()} >> ~/.ssh/known_hosts`,
+        `eval "$(ssh-agent -s)" && ssh-keyscan -p ${this.userConfig.userConfigJson.giteaSshPort} -H ${this.userConfig.userConfigJson.giteaHost} >> ~/.ssh/known_hosts`,
       );
     } catch (err) {
       this.log(err);
@@ -58,7 +58,7 @@ export default class GitMission {
   }
 
   get author() {
-    return this.userConfig.getUsername();
+    return this.userConfig.userConfigJson.username;
   }
 
   async init() {
@@ -76,10 +76,10 @@ export default class GitMission {
       const remotePath = this.getRemotePath();
 
       await this.git.addRemote(defaultRemote, remotePath);
-      await this.git.addConfig('user.email', this.userConfig.getCurrentUserDetails().email, false, 'local');
+      await this.git.addConfig('user.email', this.userConfig.userConfigJson.email, false, 'local');
       await this.git.addConfig(
         'user.name',
-        `${this.userConfig.getCurrentUserDetails().lastName} ${this.userConfig.getCurrentUserDetails().firstName}`,
+        `${this.userConfig.userConfigJson.currentUserDetails.lastName} ${this.userConfig.userConfigJson.currentUserDetails.firstName}`,
         false,
         'local',
       );
@@ -92,7 +92,7 @@ export default class GitMission {
   }
 
   private getRemotePath() {
-    return `ssh://git@${this.userConfig.getGiteaHost()}:${this.userConfig.getGiteaSshPort()}/${this.userConfig.getRemoteGitUsername()}/${this.userConfig.getMissionId()}`;
+    return `ssh://git@${this.userConfig.userConfigJson.giteaHost}:${this.userConfig.userConfigJson.giteaSshPort}/${this.userConfig.userConfigJson.remoteGitUsername}/${this.userConfig.userConfigJson.missionId}`;
   }
 
   async readRemote() {
diff --git a/deadlock-plugins/deadlock-extension/src/core/mission/missionDevContainer.ts b/deadlock-plugins/deadlock-extension/src/core/mission/missionDevContainer.ts
index 4d155c96..f1959c94 100644
--- a/deadlock-plugins/deadlock-extension/src/core/mission/missionDevContainer.ts
+++ b/deadlock-plugins/deadlock-extension/src/core/mission/missionDevContainer.ts
@@ -7,7 +7,7 @@ import { existsSync, copyFileSync } from 'fs';
 import { join } from 'path';
 
 import assert = require('assert');
-import UserChallenge, { User } from './model/userChallenge';
+import UserMission, { User } from './model/userMission';
 import { REGISTRY_MISSION_URL } from '../../config';
 import { getReviewedStudentWorkdirPath } from '../utils/mission.utils';
 
@@ -94,7 +94,7 @@ export class MissionDevContainer {
     return writeFile(
       `${this.dirs.config}/user-challenge.json`,
       (() => {
-        const userChallengeJson: UserChallenge = {
+        const userChallengeJson: UserMission = {
           giteaHost: this.giteaProperties.sshHost,
           giteaSshPort: this.giteaProperties.sshPort,
           username: this.user.id.split('-').join(''),
diff --git a/deadlock-plugins/deadlock-extension/src/core/mission/model/userChallenge.ts b/deadlock-plugins/deadlock-extension/src/core/mission/model/userMission.ts
similarity index 76%
rename from deadlock-plugins/deadlock-extension/src/core/mission/model/userChallenge.ts
rename to deadlock-plugins/deadlock-extension/src/core/mission/model/userMission.ts
index cd1a92fc..7917a776 100644
--- a/deadlock-plugins/deadlock-extension/src/core/mission/model/userChallenge.ts
+++ b/deadlock-plugins/deadlock-extension/src/core/mission/model/userMission.ts
@@ -1,4 +1,4 @@
-interface UserChallenge {
+interface UserMission {
   giteaHost: string;
   giteaSshPort: number;
   username: string;
@@ -11,7 +11,7 @@ interface UserChallenge {
   remoteUserDetails: UserDetails;
 }
 
-export default UserChallenge;
+export default UserMission;
 
 export interface UserDetails {
   id: string;
@@ -30,3 +30,7 @@ export interface User {
   id: string;
   details: UserDetails;
 }
+
+export function isReviewingStudent(userMission: UserMission) {
+  return userMission.currentUserId !== userMission.remoteUserDetails.id;
+}
diff --git a/deadlock-plugins/deadlock-extension/src/core/userConfig.ts b/deadlock-plugins/deadlock-extension/src/core/userConfig.ts
index 39a5f8b2..30f70576 100644
--- a/deadlock-plugins/deadlock-extension/src/core/userConfig.ts
+++ b/deadlock-plugins/deadlock-extension/src/core/userConfig.ts
@@ -17,69 +17,22 @@
 import { Uri, workspace } from 'vscode';
 import { recorderError as error } from '../recorder/utils/log';
 import { USER_CHALLENGE_PATH } from './config';
-import { UserDetails } from './mission/model/userChallenge';
+import UserMission from './mission/model/userMission';
 
 export default class UserConfig {
-  private userConfigJson: any | undefined;
+  private _userConfigJson?: UserMission;
 
-  getPaths(): Map<number, string> {
-    return this.userConfigJson?.paths;
-  }
-
-  getHost(): string {
-    return this.userConfigJson?.host;
-  }
-  getGiteaHost(): string {
-    return this.userConfigJson?.giteaHost;
-  }
-
-  getGiteaSshPort(): number {
-    return this.userConfigJson?.giteaSshPort;
-  }
-
-  getUsername(): string {
-    return this.userConfigJson?.username;
-  }
-
-  getRemoteGitUsername(): string {
-    return this.userConfigJson?.remoteGitUsername;
-  }
-
-  getMissionId(): string {
-    return this.userConfigJson?.missionId;
-  }
-
-  getEmail(): string {
-    return this.userConfigJson?.email;
-  }
-
-  isProfessor(): boolean {
-    return this.userConfigJson?.professor;
-  }
-
-  getCurrentUserDetails(): UserDetails {
-    return this.userConfigJson?.currentUserDetails;
-  }
-
-  getRemoteUserDetails(): UserDetails {
-    return this.userConfigJson?.remoteUserDetails;
-  }
-
-  async loadText(): Promise<string> {
-    const textDocument = await workspace.openTextDocument(Uri.parse(USER_CHALLENGE_PATH));
-    return Promise.resolve(textDocument.getText());
-  }
-
-  public async init() {
+  async init() {
     try {
-      const userConfig = await this.loadText();
-
-      this.userConfigJson = JSON.parse(userConfig);
-      return Promise.resolve();
+      const textDocument = await workspace.openTextDocument(Uri.parse(USER_CHALLENGE_PATH));
+      this._userConfigJson = JSON.parse(textDocument.getText());
     } catch (e) {
-      error('Cannot load userConfig');
-      error(e);
-      return Promise.reject();
+      error(`Error loading user config: ${e}`);
+      throw e;
     }
   }
+
+  get userConfigJson(): UserMission {
+    return this._userConfigJson!;
+  }
 }
diff --git a/deadlock-plugins/deadlock-extension/src/core/utils/mission.utils.ts b/deadlock-plugins/deadlock-extension/src/core/utils/mission.utils.ts
index d279e45f..edb8400d 100644
--- a/deadlock-plugins/deadlock-extension/src/core/utils/mission.utils.ts
+++ b/deadlock-plugins/deadlock-extension/src/core/utils/mission.utils.ts
@@ -1,14 +1,14 @@
 import { PathLike, readFileSync } from 'fs';
 import { join } from 'path';
 import { missionWorkdir, USER_CHALLENGE_PATH } from '../config';
-import UserChallenge from '../mission/model/userChallenge';
+import UserMission from '../mission/model/userMission';
 import isDocker from './isdocker';
 
 export function getReviewedStudentWorkdirPath(userId: string): string {
   return join(missionWorkdir, 'students', `${userId}`);
 }
 
-export function getUserChallenge(userId: string, missionid: string, isReviewing = false): UserChallenge {
+export function getUserChallenge(userId: string, missionid: string, isReviewing = false): UserMission {
   let path: number | PathLike;
   if (isDocker()) {
     path = USER_CHALLENGE_PATH;
diff --git a/deadlock-plugins/deadlock-extension/src/extension.ts b/deadlock-plugins/deadlock-extension/src/extension.ts
index a4f51b35..4a2b288c 100644
--- a/deadlock-plugins/deadlock-extension/src/extension.ts
+++ b/deadlock-plugins/deadlock-extension/src/extension.ts
@@ -53,6 +53,6 @@ export async function activate(context: ExtensionContext) {
       error(JSON.stringify(e));
       window.showErrorMessage("Le recorder n'a pas pu être lancé");
     }
-    runTimer(userConfig.getCurrentUserDetails().id, userConfig.getMissionId(), context);
+    runTimer(userConfig.userConfigJson.currentUserId, userConfig.userConfigJson.missionId, context);
   }
 }
diff --git a/deadlock-plugins/deadlock-extension/src/recorder/recorder.ts b/deadlock-plugins/deadlock-extension/src/recorder/recorder.ts
index 0d9d69ef..262354ac 100644
--- a/deadlock-plugins/deadlock-extension/src/recorder/recorder.ts
+++ b/deadlock-plugins/deadlock-extension/src/recorder/recorder.ts
@@ -8,6 +8,7 @@ import UserConfig from '../core/userConfig';
 import AutomaticSave from './services/automatic-save';
 import { clearFilesExceptGit, copyProjectSources, renameTempToUserGitFiles } from './utils/workdir';
 import aquirePermissions from './utils/permission';
+import { isReviewingStudent } from '../core/mission/model/userMission';
 
 export default class Recorder {
   private _gitMission?: GitMission;
@@ -31,7 +32,7 @@ export default class Recorder {
   }
 
   async setupProject(userConfig: UserConfig, gitMission?: GitMission) {
-    if (!userConfig.isProfessor()) {
+    if (!isReviewingStudent(userConfig.userConfigJson)) {
       await copyProjectSources(PROJECT_SRC_PATH, PROJECT_DEADLOCK_DESKTOP_PATH, ['.git/']);
 
       if (gitMission) {
diff --git a/deadlock-plugins/deadlock-extension/src/view/briefingView.ts b/deadlock-plugins/deadlock-extension/src/view/briefingView.ts
index af1a24ef..9d8b40c2 100644
--- a/deadlock-plugins/deadlock-extension/src/view/briefingView.ts
+++ b/deadlock-plugins/deadlock-extension/src/view/briefingView.ts
@@ -3,7 +3,8 @@ import { marked } from 'marked';
 import { join } from 'path';
 import { setInterval } from 'timers';
 import { Uri, workspace } from 'vscode';
-import { BRIEFING_FILE_NAME, DOCS_PATH, ENV_FILE_PATH, SERVICES_PATHS_PATH } from '../core/config';
+import { BRIEFING_FILE_NAME, DOCS_PATH } from '../core/config';
+import { isReviewingStudent } from '../core/mission/model/userMission';
 import isDocker from '../core/utils/isdocker';
 import { userConfig } from '../extension';
 import { openBriefingCommand } from '../theia/command';
@@ -68,14 +69,10 @@ export default class BriefingView extends WebviewBase {
   render() {
     let output = '';
 
-    if (userConfig.isProfessor()) {
+    if (isReviewingStudent(userConfig.userConfigJson)) {
       output += `
         <h2>Professeur</h2>
-        Bonjour ${userConfig.getCurrentUserDetails().lastName} ${
-        userConfig.getCurrentUserDetails().firstName
-      } vous êtes actuellement entrain de relire le code de <b>${userConfig.getRemoteUserDetails().lastName} ${
-        userConfig.getRemoteUserDetails().firstName
-      }</b>.<br />
+        Bonjour ${userConfig.userConfigJson.currentUserDetails.lastName} ${userConfig.userConfigJson.currentUserDetails.firstName} vous êtes actuellement entrain de relire le code de <b>${userConfig.userConfigJson.currentUserDetails.lastName} ${userConfig.userConfigJson.currentUserDetails.firstName}</b>.<br />
         Vous pouvez consulter chaque exécution de son code dans l'onglet à gauche de GitLens. Chaque commit sur <b>master</b> représente une exécution.
         <br />
       `;
@@ -91,48 +88,6 @@ export default class BriefingView extends WebviewBase {
 
     output += '<br/>';
 
-    if (userConfig.getUsername()) {
-      output += this.renderUserMissionConfig();
-    } else {
-      output += 'Loading help..';
-    }
-
     return output;
   }
-
-  private renderUserMissionConfig() {
-    let adresses = '';
-
-    let pathsLength = 0;
-    const paths = userConfig.getPaths();
-    for (const key in paths) {
-      if (key !== '3000') {
-        pathsLength++;
-        const path = paths[key];
-        if (userConfig.getHost() === 'localhost') {
-          adresses += `<li>${key} binded on <a href="http://${userConfig.getHost()}:${path}">${path}</a></li>`;
-        } else {
-          adresses += `<li>${key} binded on <a href="https://${path}.${userConfig.getHost()}">${path}</a></li>`;
-        }
-      }
-    }
-
-    if (pathsLength > 0) {
-      return `<h3>Configuration</h3>
-      You have the following adresses availables for your mission : <ul>${adresses}</ul>
-      </br>
-      You also have access to these paths from:
-      <ul>
-        <li>
-        environment variables (file <b>${ENV_FILE_PATH}</b> already exported)
-        </li>
-        <li>
-        JSON file <b>${SERVICES_PATHS_PATH}</b>
-        </li>
-      </ul>
-      </br>`;
-    }
-
-    return '';
-  }
 }
diff --git a/deadlock-plugins/deadlock-extension/src/view/startedMissionsView.ts b/deadlock-plugins/deadlock-extension/src/view/startedMissionsView.ts
index aaff928f..c0354e5a 100644
--- a/deadlock-plugins/deadlock-extension/src/view/startedMissionsView.ts
+++ b/deadlock-plugins/deadlock-extension/src/view/startedMissionsView.ts
@@ -3,10 +3,10 @@ import { existsSync, readdirSync, readFileSync } from 'fs';
 import { join } from 'path';
 import { ExtensionContext, Webview, WebviewView, WebviewViewProvider } from 'vscode';
 import Controller from '../core/controller';
-import UserChallenge from '../core/mission/model/userChallenge';
 import { extensionWarn } from '../recorder/utils/log';
 import { getUri } from './webviewBase';
 import { missionWorkdir } from '../core/config';
+import UserMission from '../core/mission/model/userMission';
 export default class StartedMissionsView implements WebviewViewProvider {
   private readonly controller: Controller;
   constructor(private context: ExtensionContext) {
@@ -27,7 +27,7 @@ export default class StartedMissionsView implements WebviewViewProvider {
     switch (message.command) {
       case 'openMission': {
         const path = join(missionWorkdir, message.mission, '.config', 'user-challenge.json');
-        const userChallenge: UserChallenge = JSON.parse(readFileSync(path, 'utf8'));
+        const userChallenge: UserMission = JSON.parse(readFileSync(path, 'utf8'));
         Controller.getInstance().launchMission(userChallenge.missionId, userChallenge.missionVersion);
         return;
       }
@@ -53,7 +53,7 @@ export default class StartedMissionsView implements WebviewViewProvider {
       readdirSync(missionWorkdir).forEach((mission) => {
         if (existsSync(join(missionWorkdir, mission, '.config', 'user-challenge.json'))) {
           try {
-            const userChallenge: UserChallenge = JSON.parse(
+            const userChallenge: UserMission = JSON.parse(
               readFileSync(join(missionWorkdir, mission, '.config', 'user-challenge.json'), 'utf8'),
             );
             missionsHtml += `<vscode-button onclick="openMission('${userChallenge.missionId}')" class="item" appearance="primary">${userChallenge.missionId}</vscode-button>`;
-- 
GitLab