mirror of
https://github.com/hedgedoc/hedgedoc.git
synced 2025-05-29 14:25:38 -04:00

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 <git@herrmehren.de>
54 lines
1.9 KiB
TypeScript
54 lines
1.9 KiB
TypeScript
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';
|
|
import { NotesService } from '../notes/notes.service';
|
|
import { UsersService } from '../users/users.service';
|
|
import { BackendType } from './backends/backend-type.enum';
|
|
import { FilesystemBackend } from './backends/filesystem-backend';
|
|
import { MediaUpload } from './media-upload.entity';
|
|
import { MulterFile } from './multer-file.interface';
|
|
|
|
@Injectable()
|
|
export class MediaService {
|
|
constructor(
|
|
@InjectRepository(MediaUpload)
|
|
private mediaUploadRepository: Repository<MediaUpload>,
|
|
private notesService: NotesService,
|
|
private usersService: UsersService,
|
|
private moduleRef: ModuleRef,
|
|
) {}
|
|
|
|
public async saveFile(file: MulterFile, username: string, noteId: string) {
|
|
const note = await this.notesService.getNoteByIdOrAlias(noteId);
|
|
const user = await this.usersService.getUserByUsername(username);
|
|
const fileTypeResult = await FileType.fromBuffer(file.buffer);
|
|
if (!fileTypeResult) {
|
|
throw new Error('Could not detect file type.');
|
|
}
|
|
if (!MediaService.isAllowedMimeType(fileTypeResult.mime)) {
|
|
throw new Error('MIME type not allowed');
|
|
}
|
|
//TODO: Choose backend according to config
|
|
const mediaUpload = MediaUpload.create(
|
|
note,
|
|
user,
|
|
fileTypeResult.ext,
|
|
BackendType.FILEYSTEM,
|
|
);
|
|
const backend = this.moduleRef.get(FilesystemBackend);
|
|
const [url, backendData] = await backend.saveFile(
|
|
file.buffer,
|
|
mediaUpload.id,
|
|
);
|
|
mediaUpload.backendData = backendData;
|
|
await this.mediaUploadRepository.save(mediaUpload);
|
|
return url;
|
|
}
|
|
|
|
private static isAllowedMimeType(mimeType: string): boolean {
|
|
//TODO: Which mimetypes are allowed?
|
|
return true;
|
|
}
|
|
}
|