MediaService: Improve error handling and logging

Add debug logging to `saveFile` method and throw the proper errors when problems with the mime type are encountered

Signed-off-by: David Mehren <git@herrmehren.de>
This commit is contained in:
David Mehren 2020-10-17 18:50:53 +02:00
parent 219a3bcb5f
commit 0cc9c6b347
No known key found for this signature in database
GPG key ID: 185982BA4C42B7C3

View file

@ -3,6 +3,8 @@ import { ModuleRef } from '@nestjs/core';
import { InjectRepository } from '@nestjs/typeorm'; import { InjectRepository } from '@nestjs/typeorm';
import * as FileType from 'file-type'; import * as FileType from 'file-type';
import { Repository } from 'typeorm'; import { Repository } from 'typeorm';
import { ClientError } from '../errors/errors';
import { ConsoleLoggerService } from '../logger/console-logger.service';
import { NotesService } from '../notes/notes.service'; import { NotesService } from '../notes/notes.service';
import { UsersService } from '../users/users.service'; import { UsersService } from '../users/users.service';
import { BackendType } from './backends/backend-type.enum'; import { BackendType } from './backends/backend-type.enum';
@ -13,22 +15,34 @@ import { MulterFile } from './multer-file.interface';
@Injectable() @Injectable()
export class MediaService { export class MediaService {
constructor( constructor(
private readonly logger: ConsoleLoggerService,
@InjectRepository(MediaUpload) @InjectRepository(MediaUpload)
private mediaUploadRepository: Repository<MediaUpload>, private mediaUploadRepository: Repository<MediaUpload>,
private notesService: NotesService, private notesService: NotesService,
private usersService: UsersService, private usersService: UsersService,
private moduleRef: ModuleRef, private moduleRef: ModuleRef,
) {} ) {
this.logger.setContext(MediaService.name);
}
private static isAllowedMimeType(mimeType: string): boolean {
//TODO: Which mimetypes are allowed?
return true;
}
public async saveFile(file: MulterFile, username: string, noteId: string) { public async saveFile(file: MulterFile, username: string, noteId: string) {
this.logger.debug(
`Saving '${file.originalname}' for note '${noteId}' and user '${username}'`,
'saveFile',
);
const note = await this.notesService.getNoteByIdOrAlias(noteId); const note = await this.notesService.getNoteByIdOrAlias(noteId);
const user = await this.usersService.getUserByUsername(username); const user = await this.usersService.getUserByUsername(username);
const fileTypeResult = await FileType.fromBuffer(file.buffer); const fileTypeResult = await FileType.fromBuffer(file.buffer);
if (!fileTypeResult) { if (!fileTypeResult) {
throw new Error('Could not detect file type.'); throw new ClientError('Could not detect file type.');
} }
if (!MediaService.isAllowedMimeType(fileTypeResult.mime)) { if (!MediaService.isAllowedMimeType(fileTypeResult.mime)) {
throw new Error('MIME type not allowed'); throw new ClientError('MIME type not allowed.');
} }
//TODO: Choose backend according to config //TODO: Choose backend according to config
const mediaUpload = MediaUpload.create( const mediaUpload = MediaUpload.create(
@ -37,6 +51,7 @@ export class MediaService {
fileTypeResult.ext, fileTypeResult.ext,
BackendType.FILEYSTEM, BackendType.FILEYSTEM,
); );
this.logger.debug(`Generated filename: '${mediaUpload.id}'`, 'saveFile');
const backend = this.moduleRef.get(FilesystemBackend); const backend = this.moduleRef.get(FilesystemBackend);
const [url, backendData] = await backend.saveFile( const [url, backendData] = await backend.saveFile(
file.buffer, file.buffer,
@ -46,9 +61,4 @@ export class MediaService {
await this.mediaUploadRepository.save(mediaUpload); await this.mediaUploadRepository.save(mediaUpload);
return url; return url;
} }
private static isAllowedMimeType(mimeType: string): boolean {
//TODO: Which mimetypes are allowed?
return true;
}
} }