refactor(core): Create controller for binary data (no-changelog) (#7363)

This PR adds a controller for binary data + integration tests.
This commit is contained in:
Iván Ovejero
2023-10-06 16:21:13 +02:00
committed by GitHub
parent 63e11e4be9
commit 34bda535e6
9 changed files with 217 additions and 53 deletions

View File

@@ -0,0 +1,54 @@
import { Service } from 'typedi';
import express from 'express';
import { BinaryDataService, FileNotFoundError, isValidNonDefaultMode } from 'n8n-core';
import { Get, RestController } from '@/decorators';
import { BinaryDataRequest } from '@/requests';
@RestController('/binary-data')
@Service()
export class BinaryDataController {
constructor(private readonly binaryDataService: BinaryDataService) {}
@Get('/')
async get(req: BinaryDataRequest, res: express.Response) {
const { id: binaryDataId, action } = req.query;
if (!binaryDataId) {
return res.status(400).end('Missing binary data ID');
}
if (!binaryDataId.includes(':')) {
return res.status(400).end('Missing binary data mode');
}
const [mode] = binaryDataId.split(':');
if (!isValidNonDefaultMode(mode)) {
return res.status(400).end('Invalid binary data mode');
}
let { fileName, mimeType } = req.query;
try {
if (!fileName || !mimeType) {
try {
const metadata = await this.binaryDataService.getMetadata(binaryDataId);
fileName = metadata.fileName;
mimeType = metadata.mimeType;
res.setHeader('Content-Length', metadata.fileSize);
} catch {}
}
if (mimeType) res.setHeader('Content-Type', mimeType);
if (action === 'download') {
res.setHeader('Content-Disposition', `attachment; filename="${fileName}"`);
}
return await this.binaryDataService.getAsStream(binaryDataId);
} catch (error) {
if (error instanceof FileNotFoundError) return res.writeHead(404).end();
else throw error;
}
}
}