diff --git a/deadlock-plugins/deadlock-extension/src/core/controller.ts b/deadlock-plugins/deadlock-extension/src/core/controller.ts index 8a876b338555b9d2e6f0a0bebcc5060b6aaad5d3..bb8b9dc8c08aab3fd421d2c9c8c0319ea40fffc7 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 dc1808af35e68af50ece12803ae0a9ba0fc1d119..bd236bec81753342bc7b594fa82239fd9b5783af 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 37403ba5a04af97494906c0453e5c3818ecc4c69..aff814655d451ca5e1b61e74d943706d38f06b33 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 e69de29bb2d1d6434b8b29ae775ad8c2e48c5391..0000000000000000000000000000000000000000 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 0000000000000000000000000000000000000000..4c3f8367bc3f0fd3cf886830815ff52a43a77d03 --- /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 7196429d9554c1f32a7957e16f96b30258c983ac..0000000000000000000000000000000000000000 --- 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 13166798da2d7c09d2d17b7177f4d0dc6cce0616..aa98cfbbec7d13447978c9b9230c6e2d11bbc7da 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,