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