From 264069abb063b49367a12d60340e7bdab539e75e Mon Sep 17 00:00:00 2001 From: Guillaume Weber <gweber@takima.fr> Date: Thu, 19 May 2022 15:00:13 +0200 Subject: [PATCH] refactor(mission): more refactor --- .../deadlock-extension/src/core/controller.ts | 34 +++++---- .../src/core/mission/mission.ts | 74 ++++++------------- .../src/core/mission/missionDevContainer.ts | 4 +- .../src/core/mission/missionDocker.ts | 0 .../src/core/mission/missionOpenInEditor.ts | 11 +++ .../src/core/mission/missionResources.ts | 7 -- .../src/core/mission/missionUserChallenge.ts | 6 +- 7 files changed, 57 insertions(+), 79 deletions(-) delete mode 100644 deadlock-plugins/deadlock-extension/src/core/mission/missionDocker.ts create mode 100644 deadlock-plugins/deadlock-extension/src/core/mission/missionOpenInEditor.ts delete mode 100644 deadlock-plugins/deadlock-extension/src/core/mission/missionResources.ts diff --git a/deadlock-plugins/deadlock-extension/src/core/controller.ts b/deadlock-plugins/deadlock-extension/src/core/controller.ts index 8a876b33..bb8b9dc8 100644 --- a/deadlock-plugins/deadlock-extension/src/core/controller.ts +++ b/deadlock-plugins/deadlock-extension/src/core/controller.ts @@ -8,11 +8,12 @@ import QuickSetupView from '../view/quickSetupView'; import { CHOOSE_MISSION_WORKDIR_COMMAND, CommandHandler, OPEN_URL_IN_BROWSER_COMMAND } from './commandHandler'; import ExtensionStore from './extensionStore'; import KeycloakOAuth2DeviceFlowConnection from './keycloakOAuth2DeviceFlowConnection'; -import Mission from './mission/mission'; import ApiService from './api.service'; import SshKeyManager from './sshKeyManager'; import { GiteaPublicProperties } from '../model/giteaPublicProperties.model'; import { User } from '../model/user.model'; +import { openEditorInFolder } from './mission/missionOpenInEditor'; +import { Mission } from './mission/mission'; export default class Controller { public connection: KeycloakOAuth2DeviceFlowConnection; @@ -88,8 +89,11 @@ export default class Controller { } public async clear() { + console.log('CLEAR'); await this.extensionStore.clear(); + console.log('CLEAR2'); this.quickSetupView.isAlreadyConnected = false; + console.log('CLEAR3'); } public async createSshKeyPairIfNotExist() { @@ -127,20 +131,20 @@ export default class Controller { const user: User = await this.callApiService.getUser(); const giteaPublicProperties: GiteaPublicProperties = await this.callApiService.getGiteaPublicProperties(); - const mission = new Mission( - { - missionId: missionId, - missionVersion: missionVersion, - }, - user, - giteaPublicProperties, - ); - vscode.window.showInformationMessage( - 'opening inside folder ' + this.extensionStore.getMissionWorkdir()! + '/' + missionId, - ); - await mission.setup(); - - await mission.openEditorInFolder(); + const mission = new Mission( + `${ExtensionStore.getInstance().getMissionWorkdir()}/${missionId}`, + missionId, + missionVersion, + giteaPublicProperties, + ); + + vscode.window.showInformationMessage( + 'opening inside folder ' + this.extensionStore.getMissionWorkdir()! + '/' + missionId, + ); + + await mission.setup(user); + + openEditorInFolder(`${mission.directory}/.config`); vscode.commands.executeCommand(OPEN_QUICK_SETUP_COMMAND.cmd); } diff --git a/deadlock-plugins/deadlock-extension/src/core/mission/mission.ts b/deadlock-plugins/deadlock-extension/src/core/mission/mission.ts index dc1808af..bd236bec 100644 --- a/deadlock-plugins/deadlock-extension/src/core/mission/mission.ts +++ b/deadlock-plugins/deadlock-extension/src/core/mission/mission.ts @@ -1,64 +1,34 @@ -import { exec as _exec } from 'child_process'; import * as fs from 'fs'; -import * as util from 'util'; -import * as vscode from 'vscode'; -import { error as err, log } from '../../recorder/utils'; -import ExtensionStore from '../extensionStore'; -import { userSshKeyFolderPath } from '../config'; import { GiteaPublicProperties } from '../../model/giteaPublicProperties.model'; -import { User, UserChallengeJson } from '../../model/user.model'; -import { createDevContainerFile } from './missionDevContainer'; +import { User } from '../../model/user.model'; import { DockerfileSpecific, Base, VSCodespecific, LifecycleScripts } from './devContainer'; -import { MissionResource } from './missionResources'; +import { createDevContainerFile } from './missionDevContainer'; import { createUserChallengeJsonFile } from './missionUserChallenge'; -/** - * {@link https://nodejs.org/api/child_process.html#child_process_child_process_exec_command_options_callback} - */ -const exec = util.promisify(_exec); - -export default class Mission { - private readonly hostBaseWorkDir: string; - private readonly hostMissionDir: string; - private readonly hostMissionDevcontainerDir: string; - private readonly hostMissionMountDir: string; - private readonly userMissionConfigPath: string; - private readonly user: User; - private readonly giteaPublicProperties: GiteaPublicProperties; - private readonly missionRessource: MissionResource; +export class Mission { + readonly directory: string; + readonly id: string; + readonly version: string; + readonly giteaProperties: GiteaPublicProperties; - constructor( - private params: { missionId: string; missionVersion: string }, - user: User, - giteaPublicProperties: GiteaPublicProperties, - ) { - const { missionId, missionVersion } = params; - this.hostBaseWorkDir = ExtensionStore.getInstance().getMissionWorkdir() ?? ''; - this.hostMissionDir = `${this.hostBaseWorkDir}/${missionId}`; - this.userMissionConfigPath = `${this.hostMissionDir}/.config`; - this.hostMissionDevcontainerDir = `${this.hostMissionDir}/.devcontainer`; - this.hostMissionMountDir = `${this.hostMissionDir}/mounted`; - this.user = user; - this.giteaPublicProperties = giteaPublicProperties; - this.missionRessource = new MissionResource(this.hostMissionDir, missionId, missionVersion); + constructor(directory: string, id: string, version: string, giteaProperties: GiteaPublicProperties) { + this.directory = directory; + this.id = id; + this.version = version; + this.giteaProperties = giteaProperties; } - public async setup(options?: Partial<DockerfileSpecific & Base & VSCodespecific & LifecycleScripts>) { - await fs.promises.mkdir(this.hostMissionDevcontainerDir, { recursive: true }); - await fs.promises.mkdir(this.hostMissionMountDir, { recursive: true }); - await fs.promises.mkdir(this.userMissionConfigPath, { recursive: true }); - await createDevContainerFile(this.missionRessource, options); - await createUserChallengeJsonFile(this.user, this.missionRessource, this.giteaPublicProperties); + public async setup(user: User, options?: Partial<DockerfileSpecific & Base & VSCodespecific & LifecycleScripts>) { + await this.createDirectories([ + `${this.directory}/.config`, + `${this.directory}/.devcontainer`, + `${this.directory}/mounted`, + ]); + await createDevContainerFile(this, options); + await createUserChallengeJsonFile(user, this, this.giteaProperties); } - public async openEditorInFolder(arbitraryPath?: string) { - if (arbitraryPath) { - return vscode.commands.executeCommand('remote-containers.openFolder', vscode.Uri.file(arbitraryPath)); - } - if (!fs.existsSync(this.hostMissionDir)) { - log('WARN missing path ', this.hostMissionDir); - await fs.promises.mkdir(this.hostMissionDir, { recursive: true }); - } - await vscode.commands.executeCommand('remote-containers.openFolder', vscode.Uri.file(this.hostMissionDir)); + private createDirectories(directoryPaths: string[]) { + return Promise.all(directoryPaths.map((directoryPath) => fs.promises.mkdir(directoryPath, { recursive: true }))); } } diff --git a/deadlock-plugins/deadlock-extension/src/core/mission/missionDevContainer.ts b/deadlock-plugins/deadlock-extension/src/core/mission/missionDevContainer.ts index 37403ba5..aff81465 100644 --- a/deadlock-plugins/deadlock-extension/src/core/mission/missionDevContainer.ts +++ b/deadlock-plugins/deadlock-extension/src/core/mission/missionDevContainer.ts @@ -2,12 +2,12 @@ import { userSshKeyFolderPath } from '../config'; import ExtensionStore from '../extensionStore'; import { Base, DockerfileSpecific, LifecycleScripts, VSCodespecific } from './devContainer'; import * as fs from 'fs'; -import { MissionResource } from './missionResources'; +import { Mission } from './mission'; const DOCKER_IMAGE_URL = 'registry.takima.io/deadlock/deadlock-challenges'; export function createDevContainerFile( - mission: MissionResource, + mission: Mission, options?: Partial<DockerfileSpecific & Base & VSCodespecific & LifecycleScripts>, ) { const hostBaseWorkDir = ExtensionStore.getInstance().getMissionWorkdir() ?? ''; diff --git a/deadlock-plugins/deadlock-extension/src/core/mission/missionDocker.ts b/deadlock-plugins/deadlock-extension/src/core/mission/missionDocker.ts deleted file mode 100644 index e69de29b..00000000 diff --git a/deadlock-plugins/deadlock-extension/src/core/mission/missionOpenInEditor.ts b/deadlock-plugins/deadlock-extension/src/core/mission/missionOpenInEditor.ts new file mode 100644 index 00000000..4c3f8367 --- /dev/null +++ b/deadlock-plugins/deadlock-extension/src/core/mission/missionOpenInEditor.ts @@ -0,0 +1,11 @@ +import * as fs from 'fs'; +import { error as err, log } from '../../recorder/utils'; +import * as vscode from 'vscode'; + +export async function openEditorInFolder(folderPath: string) { + if (!fs.existsSync(folderPath)) { + log('WARN missing path ', folderPath); + await fs.promises.mkdir(folderPath, { recursive: true }); + } + await vscode.commands.executeCommand('remote-containers.openFolder', vscode.Uri.file(folderPath)); +} diff --git a/deadlock-plugins/deadlock-extension/src/core/mission/missionResources.ts b/deadlock-plugins/deadlock-extension/src/core/mission/missionResources.ts deleted file mode 100644 index 7196429d..00000000 --- a/deadlock-plugins/deadlock-extension/src/core/mission/missionResources.ts +++ /dev/null @@ -1,7 +0,0 @@ -export class MissionResource { - constructor(public missionDir: string, public id: string, public version: string) { - this.missionDir = missionDir; - this.id = id; - this.version = version; - } -} diff --git a/deadlock-plugins/deadlock-extension/src/core/mission/missionUserChallenge.ts b/deadlock-plugins/deadlock-extension/src/core/mission/missionUserChallenge.ts index 13166798..aa98cfbb 100644 --- a/deadlock-plugins/deadlock-extension/src/core/mission/missionUserChallenge.ts +++ b/deadlock-plugins/deadlock-extension/src/core/mission/missionUserChallenge.ts @@ -1,15 +1,15 @@ import { User, UserChallengeJson } from '../../model/user.model'; import * as fs from 'fs'; import { GiteaPublicProperties } from '../../model/giteaPublicProperties.model'; -import { MissionResource } from './missionResources'; +import { Mission } from './mission'; export function createUserChallengeJsonFile( user: User, - mission: MissionResource, + mission: Mission, giteaPublicProperties: GiteaPublicProperties, ) { return fs.promises.writeFile( - `${mission.missionDir}/.config/user-challenge.json`, + `${mission.directory}/.config/user-challenge.json`, (() => { const userChallengeJson: UserChallengeJson = { giteaHost: giteaPublicProperties.sshHost, -- GitLab