Skip to content

Commit b2d65e3

Browse files
feat(uploads): make MIME type map extensible via config.uploads.mimeTypes (#3407)
Merge config.uploads.mimeTypes at runtime inside createFromBuffer so downstream projects can add custom MIME types without forking the service. Add unit test covering a custom mimeType extension (text/html -> .html).
1 parent 3337568 commit b2d65e3

2 files changed

Lines changed: 17 additions & 1 deletion

File tree

modules/uploads/services/uploads.service.js

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -94,7 +94,7 @@ const createFromBuffer = async (buffer, contentType, kind, metadata = {}) => {
9494
throw new AppError(`Upload: buffer size ${buffer.length} exceeds limit ${kindConfig.limits.fileSize}`, { code: 'SERVICE_ERROR', status: 422 });
9595
}
9696

97-
const ext = MIME_TO_EXT[contentType] || 'bin';
97+
const ext = { ...MIME_TO_EXT, ...(config.uploads?.mimeTypes ?? {}) }[contentType] || 'bin';
9898
const filename = `${crypto.randomBytes(32).toString('hex')}.${ext}`;
9999

100100
const result = await gridfs.createFromBuffer(buffer, filename, contentType, { ...metadata, kind, contentType });

modules/uploads/tests/uploads.createFromBuffer.unit.tests.js

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -159,6 +159,22 @@ describe('Uploads createFromBuffer unit tests:', () => {
159159
expect(mockGridfs.createFromBuffer).toHaveBeenCalledTimes(1);
160160
});
161161

162+
test('should use custom mimeType extension from config.uploads.mimeTypes', async () => {
163+
mockConfig.uploads.mimeTypes = { 'text/html': 'html' };
164+
mockConfig.uploads.report = {
165+
kind: 'report',
166+
formats: ['text/html'],
167+
limits: { fileSize: 1 * 1024 * 1024 },
168+
};
169+
mockGridfs.createFromBuffer.mockResolvedValue({ ...fakeFile, contentType: 'text/html' });
170+
171+
const buffer = Buffer.alloc(512);
172+
await UploadsService.createFromBuffer(buffer, 'text/html', 'report', { user: '507f1f77bcf86cd799439011' });
173+
174+
const [, filename] = mockGridfs.createFromBuffer.mock.calls[0];
175+
expect(filename).toMatch(/^[a-f0-9]{64}\.html$/);
176+
});
177+
162178
test('should throw error when kind has no formats configured', async () => {
163179
// Adding 'broken' kind at runtime — service reads config dynamically via module reference
164180
mockConfig.uploads.broken = { kind: 'broken', limits: { fileSize: 1024 } };

0 commit comments

Comments
 (0)