From bda8b5839319ae685387a5adc3a71e5580c32f56 Mon Sep 17 00:00:00 2001 From: Mario HOTAJ <mhotaj@takima.fr> Date: Thu, 16 Jun 2022 12:04:07 +0000 Subject: [PATCH] Feat: professor access repository --- .../src/core/api.service.ts | 28 +++++++++++++------ .../deadlock-extension/src/core/controller.ts | 21 +++++++++++--- .../src/core/extensionStore.ts | 2 ++ .../src/core/mission/missionDevContainer.ts | 27 ++++++++++++------ .../src/recorder/utils/workdir.ts | 8 ++++++ 5 files changed, 66 insertions(+), 20 deletions(-) diff --git a/deadlock-plugins/deadlock-extension/src/core/api.service.ts b/deadlock-plugins/deadlock-extension/src/core/api.service.ts index 4bbdee73..7087949b 100644 --- a/deadlock-plugins/deadlock-extension/src/core/api.service.ts +++ b/deadlock-plugins/deadlock-extension/src/core/api.service.ts @@ -113,17 +113,29 @@ export default class ApiService { } } - getGiteaPublicProperties(): Promise<GiteaPublicProperties> { - return this.axiosInstance.get<GiteaPublicProperties>(`gitea`).then((res) => res.data); + async getGiteaPublicProperties(): Promise<GiteaPublicProperties> { + const res = await this.axiosInstance.get<GiteaPublicProperties>(`gitea`); + return res.data; } - getUserSshKey(): Promise<SshKeyPair> { - return this.axiosInstance.put<SshKeyPair>(`users/gitea/keypair`).then((res) => res.data); + async getUserSshKey(): Promise<SshKeyPair> { + const res = await this.axiosInstance.put<SshKeyPair>(`users/gitea/keypair`); + return res.data; } - getUser(): Promise<User> { - return this.axiosInstance.get<User>(`auth`).then((res) => { - return res.data; - }); + async getCurrentUser(): Promise<User> { + const res = await this.axiosInstance.get<User>(`auth`); + return res.data; + } + + async getUser(userId: string | null): Promise<User> { + if (!userId) return this.getCurrentUser(); + const res = await this.axiosInstance.get<User>(`users/${userId}`); + return res.data; + } + + async getAccessToRepository(userId: string, missionId: string): Promise<any> { + const res = await this.axiosInstance.get<any>(`users/${userId}/missions/${missionId}/repositoryAccess`); + return res.data; } } diff --git a/deadlock-plugins/deadlock-extension/src/core/controller.ts b/deadlock-plugins/deadlock-extension/src/core/controller.ts index 14597460..68c852a6 100644 --- a/deadlock-plugins/deadlock-extension/src/core/controller.ts +++ b/deadlock-plugins/deadlock-extension/src/core/controller.ts @@ -46,6 +46,7 @@ export default class Controller { // TODO: Should we follow eslint no-case-declarations ? const missionId = queryParams.get('missionId'); const missionVersion = queryParams.get('missionVersion'); + const userId = queryParams.get('userId'); log('Opening link', uri); switch (action) { @@ -53,7 +54,7 @@ export default class Controller { if (!missionId || !missionVersion) { window.showErrorMessage('Identifiant ou version de la mission incorrect'); } else { - that.launchMission(missionId, missionVersion); + that.launchMission(missionId, missionVersion, userId); } break; @@ -111,7 +112,7 @@ export default class Controller { commands.executeCommand(openUrlInBrowserCommand.cmd, Uri.parse(url)); } - public async launchMission(missionId: string, missionVersion: string) { + public async launchMission(missionId: string, missionVersion: string, userId: string | null) { window.showInformationMessage(`vous lancez la mission ${missionId}`); const hadMissionWorkdir = this.extensionStore.getMissionWorkdir() !== undefined; if (!hadMissionWorkdir) { @@ -128,10 +129,22 @@ export default class Controller { const mission = new Mission(missionId, missionVersion); const missionsWorkdir = this.extensionStore.getMissionWorkdir() ?? ''; - const user: User = await this.apiService.getUser(); + + const currentUser = await this.apiService.getCurrentUser(); + + const user: User = await this.apiService.getUser(userId); + + const response: any = this.apiService.getAccessToRepository(user.id, mission.id); + const giteaPublicProperties: GiteaPublicProperties = await this.apiService.getGiteaPublicProperties(); - const missionDevcontainer = new MissionDevContainer(missionsWorkdir, user, mission, giteaPublicProperties); + const missionDevcontainer = new MissionDevContainer( + missionsWorkdir, + user, + currentUser, + mission, + giteaPublicProperties, + ); window.showInformationMessage( 'opening inside folder ' + this.extensionStore.getMissionWorkdir()! + '/' + missionId, diff --git a/deadlock-plugins/deadlock-extension/src/core/extensionStore.ts b/deadlock-plugins/deadlock-extension/src/core/extensionStore.ts index 9759b5e1..ce92b124 100644 --- a/deadlock-plugins/deadlock-extension/src/core/extensionStore.ts +++ b/deadlock-plugins/deadlock-extension/src/core/extensionStore.ts @@ -1,5 +1,6 @@ import { ExtensionContext, Memento, SecretStorage, window } from 'vscode'; import { extensionLog as log } from '../recorder/utils/log'; +import { removeFiles } from '../recorder/utils/workdir'; export type GlobalStorageType = Memento & { setKeysForSync(keys: readonly string[]): void }; @@ -22,6 +23,7 @@ export default class ExtensionStore { } if (await this.secretStorage.get(StoreKey.AccessTokenKey)) this.secretStorage.delete(StoreKey.AccessTokenKey); if (await this.secretStorage.get(StoreKey.RefreshTokenKey)) this.secretStorage.delete(StoreKey.RefreshTokenKey); + await removeFiles(`${process.env.HOME}/.deadlock/.ssh/id_rsa`, `${process.env.HOME}/.deadlock/.ssh/id_rsa.pub`); } public static getInstance(context?: ExtensionContext): ExtensionStore { diff --git a/deadlock-plugins/deadlock-extension/src/core/mission/missionDevContainer.ts b/deadlock-plugins/deadlock-extension/src/core/mission/missionDevContainer.ts index 7de285ac..4ff26fba 100644 --- a/deadlock-plugins/deadlock-extension/src/core/mission/missionDevContainer.ts +++ b/deadlock-plugins/deadlock-extension/src/core/mission/missionDevContainer.ts @@ -19,19 +19,26 @@ export class MissionDevContainer { private readonly dockerImageUrl = 'registry.takima.io/deadlock/deadlock-challenges'; private readonly remoteGiteaWorkDir = `/workdir`; - private readonly dirs = { - missionWorkdir: `${this.missionsWorkdir}/${this.mission.id}`, - config: `${this.missionsWorkdir}/${this.mission.id}/.config`, - devcontainer: `${this.missionsWorkdir}/${this.mission.id}/.devcontainer`, - mounted: `${this.missionsWorkdir}/${this.mission.id}/mounted`, - }; + private readonly dirs: { missionWorkdir: string; config: string; devcontainer: string; mounted: string }; constructor( private readonly missionsWorkdir: string, private readonly user: User, + private readonly currentUser: User, private readonly mission: Mission, private readonly giteaProperties: GiteaPublicProperties, - ) {} + ) { + let prefix = `${this.missionsWorkdir}`; + if (this.isReviewingStudent()) { + prefix += `/students/${this.user.details.lastName}_${this.user.details.firstName}-${this.user.id}`; + } + this.dirs = { + missionWorkdir: `${prefix}/${this.mission.id}`, + config: `${prefix}/${this.mission.id}/.config`, + devcontainer: `${prefix}/${this.mission.id}/.devcontainer`, + mounted: `${prefix}/${this.mission.id}/mounted`, + }; + } async open() { if (!this.isInit) { @@ -51,6 +58,10 @@ export class MissionDevContainer { await this.createUserChallengeJsonFile(); } + private isReviewingStudent() { + return this.currentUser.id !== this.user.id; + } + private createUserChallengeJsonFile() { return writeFile( `${this.dirs.config}/user-challenge.json`, @@ -62,7 +73,7 @@ export class MissionDevContainer { email: `${this.user.id.split('-').join('')}@deadlock.io`, missionId: this.mission.id, remoteGitUsername: this.user.id.split('-').join(''), - currentUserDetails: this.user.details, + currentUserDetails: this.currentUser ? this.currentUser.details : this.user.details, remoteUserDetails: this.user.details, }; return JSON.stringify(userChallengeJson, null, 2); diff --git a/deadlock-plugins/deadlock-extension/src/recorder/utils/workdir.ts b/deadlock-plugins/deadlock-extension/src/recorder/utils/workdir.ts index c7de234a..f528864d 100644 --- a/deadlock-plugins/deadlock-extension/src/recorder/utils/workdir.ts +++ b/deadlock-plugins/deadlock-extension/src/recorder/utils/workdir.ts @@ -81,3 +81,11 @@ export function copyGitUserFiles(srcPath: string, destPath: string, userId: stri copyFolderIfExistsSync(join(srcPath, '.git'), join(destPath, `user-git-${userId}`)); copyFileIfExistsSync(join(srcPath, '.gitignore'), join(destPath, `user-gitignore-${userId}`)); } + +export async function removeFiles(...paths: string[]) { + for (const path of paths) { + if (existsSync(path)) { + await unlink(path); + } + } +} -- GitLab