diff --git a/src/drive/drive.controller.ts b/src/drive/drive.controller.ts index e48c72c..d3a349e 100644 --- a/src/drive/drive.controller.ts +++ b/src/drive/drive.controller.ts @@ -69,6 +69,15 @@ export class DriveController { return this.driveService.deleteFile(user.memberCode, FileDto); } + @Post('move/:driveId/:folderId/:fileId') + moveFile( + @GetUser() user: User, + @Param() FileDto, + @Body('newFolderId') newFolderId: string + ) { + return this.driveService.moveFile(user.memberCode, FileDto, newFolderId); + } + @Post('share/:driveId/:folderId/:fileId') shareFile( @GetUser() user: User, diff --git a/src/drive/drive.service.ts b/src/drive/drive.service.ts index e5eadd5..6a5fcf3 100644 --- a/src/drive/drive.service.ts +++ b/src/drive/drive.service.ts @@ -329,6 +329,66 @@ export class DriveService { return; } + async moveFile(usercode: number, fileDto: FileDto, newFolderId: string) { + const {driveId: inputDriveId, folderId: oldFolderId} = fileDto; + if (oldFolderId === newFolderId) { + throw new ConflictException('Same directory'); + } + // driveId check + const drive = await this.driveRepository.getDriveByUsercode(usercode); + if (!drive) { + throw new NotFoundException('Drive not found'); + } + const driveId = drive.id.toString('hex'); + if (inputDriveId !== driveId) { + throw new BadRequestException(`Drive doesn't match`); + } + + // file check + const file = await this.fileRepository.getFileByFileDto(fileDto); + if (!file) { + throw new NotFoundException('File not found'); + } + const fileName = file.fileName.toString('hex'); + + let oldDirInfo: {folderId: Buffer, folderName: string}[] = []; + let newDirInfo: {folderId: Buffer, folderName: string}[] = []; + let oldDir = ''; + let newDir = ''; + + // folder check + if (oldFolderId !== 'root') { + oldDirInfo = await this.folderRepository.getDir({driveId, folderId: oldFolderId}); + if (!oldDirInfo.length) { + throw new NotFoundException('Folder not found'); + } + oldDir = oldDirInfo.map(e => { + return e.folderId.toString('hex'); + }).join('/'); + } + if (newFolderId !== 'root') { + newDirInfo = await this.folderRepository.getDir({driveId, folderId: newFolderId}); + if (!newDirInfo.length) { + throw new NotFoundException('Folder not found'); + } + newDir = newDirInfo.map(e => { + return e.folderId.toString('hex'); + }).join('/'); + } + + const oldFilePath = `${storagePath}/${driveId}/${oldFolderId === 'root'? '': oldDir+'/'}${fileName}`; + const newFilePath = `${storagePath}/${driveId}/${newFolderId === 'root'? '': newDir+'/'}${fileName}`; + try { + await Promise.all([ + await this.fileRepository.moveFile(fileDto, newFolderId), + await fs.promises.rename(oldFilePath, newFilePath) + ]); + } catch(error) { + console.error(error); + throw new InternalServerErrorException('Failed to move folder'); + } + } + async shareFile(usercode: number, fileDto: FileDto, share: boolean) { const {driveId: inputDriveId} = fileDto; // driveId check @@ -455,7 +515,7 @@ export class DriveService { this.folderRepository.getDir(folderDto), this.folderRepository.getDir({driveId, folderId: newFolderId}) ]); - if (!newDirInfo) { + if (!newDirInfo.length) { throw new NotFoundException('Folder not found'); } newDir = newDirInfo.map(e => { @@ -464,7 +524,7 @@ export class DriveService { } else { oldDirInfo = await this.folderRepository.getDir(folderDto); } - if (!oldDirInfo) { + if (!oldDirInfo.length) { throw new NotFoundException('Folder not found'); } oldDir = oldDirInfo.map(e => { diff --git a/src/drive/repository/file.repository.ts b/src/drive/repository/file.repository.ts index dd851be..7bc3927 100644 --- a/src/drive/repository/file.repository.ts +++ b/src/drive/repository/file.repository.ts @@ -130,4 +130,22 @@ export class FileRepository extends Repository { throw new InternalServerErrorException(); } } + + async moveFile( + fileDto: FileDto, + newFolderId: string + ):Promise { + const {driveId, folderId} = fileDto; + try { + this.update({ + driveId: new Buffer(driveId, 'hex'), + folderId: new Buffer(folderId, 'hex') + }, { + folderId: newFolderId === 'root'? null: new Buffer(newFolderId, 'hex') + }) + } catch (error) { + console.error(error); + throw new InternalServerErrorException(); + } + } } \ No newline at end of file diff --git a/views/pages/home.ejs b/views/pages/home.ejs index f2fadb2..27875fe 100644 --- a/views/pages/home.ejs +++ b/views/pages/home.ejs @@ -13,7 +13,7 @@

BSM Cloud

-

아주 환상적인 클라우드 서비스

+

아주 환상적인 파일 공유 서비스