From 3da16baeaec9a8a89f85c6924087e688422be376 Mon Sep 17 00:00:00 2001 From: David Mehren Date: Sat, 17 Oct 2020 16:24:30 +0200 Subject: [PATCH] FilesystemBackend: Implement `deleteFile` and `getFileURL`. We use `fs.unlink` instead of `fs.rm`, as the latter is only available in the fsPromises API since Node 14.14 Signed-off-by: David Mehren --- src/media/backends/filesystem-backend.ts | 33 +++++++++++++++++------- src/media/media.module.ts | 11 ++++++-- src/media/media.service.ts | 4 ++- 3 files changed, 35 insertions(+), 13 deletions(-) diff --git a/src/media/backends/filesystem-backend.ts b/src/media/backends/filesystem-backend.ts index 37cb440dd..88c8f7fce 100644 --- a/src/media/backends/filesystem-backend.ts +++ b/src/media/backends/filesystem-backend.ts @@ -1,26 +1,39 @@ -import { MediaBackend } from '../media-backend.interface'; -import { BackendData } from '../media-upload.entity'; +import { Injectable } from '@nestjs/common'; import { promises as fs } from 'fs'; import { join } from 'path'; +import { ConsoleLoggerService } from '../../logger/console-logger.service'; +import { MediaBackend } from '../media-backend.interface'; +import { BackendData } from '../media-upload.entity'; +@Injectable() export class FilesystemBackend implements MediaBackend { + constructor(private readonly logger: ConsoleLoggerService) { + this.logger.setContext(FilesystemBackend.name); + } + async saveFile( buffer: Buffer, fileName: string, ): Promise<[string, BackendData]> { - // TODO: Get uploads directory from config - const uploadDirectory = './uploads'; - // TODO: Add server address to url - const filePath = join(uploadDirectory, fileName); + const filePath = FilesystemBackend.getFilePath(fileName); + this.logger.debug(`Writing file to: ${filePath}`, 'saveFile'); await fs.writeFile(filePath, buffer, null); return ['/' + filePath, null]; } - deleteFile(fileName: string, backendData: BackendData): Promise { - return Promise.resolve(undefined); + async deleteFile(fileName: string, backendData: BackendData): Promise { + return fs.unlink(FilesystemBackend.getFilePath(fileName)); } - getFileURL(fileNam: string, backendData: BackendData): Promise { - return Promise.resolve(''); + getFileURL(fileName: string, backendData: BackendData): Promise { + const filePath = FilesystemBackend.getFilePath(fileName); + // TODO: Add server address to url + return Promise.resolve('/' + filePath); + } + + private static getFilePath(fileName: string): string { + // TODO: Get uploads directory from config + const uploadDirectory = './uploads'; + return join(uploadDirectory, fileName); } } diff --git a/src/media/media.module.ts b/src/media/media.module.ts index f791218e4..d24cb2bcb 100644 --- a/src/media/media.module.ts +++ b/src/media/media.module.ts @@ -1,13 +1,20 @@ import { Module } from '@nestjs/common'; import { TypeOrmModule } from '@nestjs/typeorm'; +import { LoggerModule } from '../logger/logger.module'; import { NotesModule } from '../notes/notes.module'; import { UsersModule } from '../users/users.module'; +import { FilesystemBackend } from './backends/filesystem-backend'; import { MediaUpload } from './media-upload.entity'; import { MediaService } from './media.service'; @Module({ - imports: [TypeOrmModule.forFeature([MediaUpload]), NotesModule, UsersModule], - providers: [MediaService], + imports: [ + TypeOrmModule.forFeature([MediaUpload]), + NotesModule, + UsersModule, + LoggerModule, + ], + providers: [MediaService, FilesystemBackend], exports: [MediaService], }) export class MediaModule {} diff --git a/src/media/media.service.ts b/src/media/media.service.ts index c8dfa2c3e..3beec6f42 100644 --- a/src/media/media.service.ts +++ b/src/media/media.service.ts @@ -1,4 +1,5 @@ import { Injectable } from '@nestjs/common'; +import { ModuleRef } from '@nestjs/core'; import { InjectRepository } from '@nestjs/typeorm'; import * as FileType from 'file-type'; import { Repository } from 'typeorm'; @@ -16,6 +17,7 @@ export class MediaService { private mediaUploadRepository: Repository, private notesService: NotesService, private usersService: UsersService, + private moduleRef: ModuleRef, ) {} public async saveFile(file: MulterFile, username: string, noteId: string) { @@ -35,7 +37,7 @@ export class MediaService { fileTypeResult.ext, BackendType.FILEYSTEM, ); - const backend = new FilesystemBackend(); + const backend = this.moduleRef.get(FilesystemBackend); const [url, backendData] = await backend.saveFile( file.buffer, mediaUpload.id,