fix: fixed spr metadata being used as a file while it's a field

This commit is contained in:
mrjvs
2025-09-19 20:45:01 +02:00
parent 3099a9cf3a
commit 840ccc2598
2 changed files with 48 additions and 34 deletions

View File

@@ -0,0 +1,43 @@
import { unlink } from 'fs/promises';
import formidable from 'formidable';
import RequestException from '@/request-exception';
import type { File } from 'formidable';
import type { Request, Response } from 'express';
export type MultipartOutput = {
fields: Record<string, string>;
files: Record<string, File>;
};
export async function parseMultipart(request: Request, response: Response): Promise<MultipartOutput> {
const form = formidable({
multiples: false
});
const [fields, files] = await form.parse(request).catch((err: Error) => {
throw new RequestException(err.message, 400);
});
const fileEntries = Object.entries(files);
const fileEntriesUnified = fileEntries.map(v => [v[0], (v[1] ?? [])[0]] as const);
const fileOutput = Object.fromEntries(fileEntriesUnified);
const fieldEntries = Object.entries(fields);
const fieldEntriesUnified = fieldEntries.map(v => [v[0], (v[1] ?? [])[0]] as const);
const fieldOutput = Object.fromEntries(fieldEntriesUnified);
const cleanup = async (): Promise<void> => {
await Promise.allSettled(
Object.values(fileOutput).map(file =>
unlink(file.filepath).catch(() => { /* Ignore cleanup errors */ })
)
);
};
response.once('finish', cleanup);
response.once('close', cleanup);
return {
fields: fieldOutput,
files: fileOutput
};
}