From 184385ce3ffc57f19f6683ec7aca2883d0cf09d8 Mon Sep 17 00:00:00 2001 From: "kelly.nguyen" <kelly.nguyen@etu.hesge.ch> Date: Sat, 27 Jul 2024 18:23:00 +0200 Subject: [PATCH] add git clone to cmd export --- .../subcommands/UserCreateResumeCommand.ts | 78 +++++++++++++++---- NodeApp/src/managers/GitlabManager.ts | 38 +++++++++ NodeApp/src/sharedByClients | 2 +- 3 files changed, 100 insertions(+), 18 deletions(-) diff --git a/NodeApp/src/commander/user/subcommands/UserCreateResumeCommand.ts b/NodeApp/src/commander/user/subcommands/UserCreateResumeCommand.ts index 1ef4b67..d2c326b 100644 --- a/NodeApp/src/commander/user/subcommands/UserCreateResumeCommand.ts +++ b/NodeApp/src/commander/user/subcommands/UserCreateResumeCommand.ts @@ -5,22 +5,26 @@ import SessionManager from "../../../managers/SessionManager"; import ora from "ora"; import fs from 'fs'; import path from 'path'; +import TextStyle from "../../../types/TextStyle"; +import GitlabManager from "../../../managers/GitlabManager"; +import User from "../../../sharedByClients/models/User"; + +// type CommandOptions = { name: string } +// type CommandOptions = { name: string, template?: string, members_id?: Array<number>, members_username?: Array<string>, clone?: string | boolean } class UserCreateResumeCommand extends CommanderCommand { protected commandName : string = 'resume'; protected defineCommand(): void { this.command - .description('list all the user') + .description('export the portfolio of an user') .argument('<userId>', 'id of the user') .argument('<pathFile>', 'path of the file') + // .option('-n, --name <name>', 'name of the assignment') .action(this.commandAction.bind(this)); + // .action((options) => this.commandAction(options)); } - - private sleep(ms: number): Promise<void> { - return new Promise(resolve => setTimeout(resolve, ms)); - } - + // protected async commandAction(options: { name: string }): Promise<void> { protected async commandAction(userId : string, pathFile : string): Promise<void> { // check privileges console.log(chalk.cyan('Please wait while we are exporting the resume...')); @@ -45,28 +49,60 @@ class UserCreateResumeCommand extends CommanderCommand { return; } - const portfolioCreated = await DojoBackendManager.createPortfolio(userId); + // START LIGHT EXPORT + // const portfolioCreated = await DojoBackendManager.createPortfolio(userId); + + // if (!portfolioCreated) { + // resumeSpinner.fail('Failed to create portfolio'); + // return; + // } - if (!portfolioCreated) { + // await this.sleep(2000); + // END LIGHT EXPORT + + // START COMPLET EXPORT + const userDataAssignment : User = await DojoBackendManager.getUserAssignments(userId); + const userDataExercise : User = await DojoBackendManager.getUserExercises(userId); + + if (!userDataAssignment) { resumeSpinner.fail('Failed to create portfolio'); return; } + if (!userDataExercise) { + resumeSpinner.fail('Failed to create portfolio'); + return; + } + const pathAssignments = userDataAssignment.gitlabUsername + '/assignments' + const pathExercises = userDataAssignment.gitlabUsername + '/exercises' + + userDataAssignment.assignments?.forEach(el => { + this.cloneRepository(pathAssignments, el.gitlabCreationInfo.ssh_url_to_repo, el.name); + }); + + userDataExercise.exercises?.forEach(el => { + this.cloneRepository(pathExercises, el.gitlabCreationInfo.ssh_url_to_repo, el.name); + }); + + // END COMPLET EXPORT + resumeSpinner.succeed('File downloaded and saved successfully.'); + + // this.downloadFile(userId, pathFile).then(() => { + // resumeSpinner.succeed('File downloaded and saved successfully.'); + // }).catch((error) => { + // resumeSpinner.fail(`Error download : ${error}`); + // }); - await this.sleep(2000); - this.downloadFile(userId, pathFile).then(() => { - // console.log('File downloaded and saved successfully.'); - resumeSpinner.succeed('File downloaded and saved successfully.'); - }).catch((error) => { - // console.error('Error:', error); - resumeSpinner.fail(`Error download : ${error}`); - }); } catch (error) { - // console.error('Error during export process:', error); + console.log(error); resumeSpinner.fail('Error during export process'); } } + private sleep(ms: number): Promise<void> { + return new Promise(resolve => setTimeout(resolve, ms)); + } + private async downloadFile(id : string, pathFile : string) { try { const response = await DojoBackendManager.createZip(id); @@ -84,6 +120,14 @@ class UserCreateResumeCommand extends CommanderCommand { console.error('Error downloading file:', error); } } + + private async cloneRepository(clonePath : string, url : string, folderName : string) { + if ( clonePath ) { + console.log(TextStyle.BLOCK('Please wait while we are cloning the repository...\n')); + + await GitlabManager.cloneRepositoryExport(clonePath, url, folderName, true, 0); + } + } } export default new UserCreateResumeCommand(); \ No newline at end of file diff --git a/NodeApp/src/managers/GitlabManager.ts b/NodeApp/src/managers/GitlabManager.ts index bbcd648..86e258e 100644 --- a/NodeApp/src/managers/GitlabManager.ts +++ b/NodeApp/src/managers/GitlabManager.ts @@ -210,6 +210,44 @@ class GitlabManager extends SharedGitlabManager { } } } + + public async cloneRepositoryExport(clonePath: string | boolean, repositorySshUrl: string, folderName?: string, verbose: boolean = false, verboseIndent: number = 0) { + let path = '/tmp/'; + if ( typeof clonePath === 'string' ) { + path = path + clonePath; + + fs.mkdirSync(path, { recursive: true }); + } + + let cloningSpinner!: ora.Ora; + if ( verbose ) { + cloningSpinner = ora({ + text : 'Cloning the repository...', + indent: verboseIndent + }).start(); + } + + try { + await new Promise<void>((resolve, reject) => { + const gitClone = spawn(`git clone ${ repositorySshUrl } "${ folderName?.replace(' ', '_') ?? '' }"`, { + cwd : path, + shell: true + }); + + gitClone.on('exit', code => { + code !== null && code === 0 ? resolve() : reject(); + }); + }); + + if ( verbose ) { + cloningSpinner.succeed('Repository cloned'); + } + } catch ( error ) { + if ( verbose ) { + cloningSpinner.fail('Error while cloning the repository'); + } + } + } } diff --git a/NodeApp/src/sharedByClients b/NodeApp/src/sharedByClients index 0b209c3..73bc34d 160000 --- a/NodeApp/src/sharedByClients +++ b/NodeApp/src/sharedByClients @@ -1 +1 @@ -Subproject commit 0b209c36d0aad3a032c9bbe632207dc61a2a6cf8 +Subproject commit 73bc34d30e3a247464e5529d6bbe24d741271842 -- GitLab