fix: handle multer upload in middleware (long pooling only)

This commit is contained in:
Mohamed Marrouchi 2025-02-03 18:20:38 +01:00
parent 1288eb87cf
commit e8f031da02

View File

@ -8,7 +8,7 @@
import { BadRequestException, Injectable } from '@nestjs/common';
import { EventEmitter2, OnEvent } from '@nestjs/event-emitter';
import { Request, Response } from 'express';
import { NextFunction, Request, Response } from 'express';
import multer, { diskStorage, memoryStorage } from 'multer';
import { Socket } from 'socket.io';
import { v4 as uuidv4 } from 'uuid';
@ -616,49 +616,19 @@ export default abstract class BaseWebChannelHandler<
*/
async handleWebUpload(
req: Request,
res: Response,
_res: Response,
): Promise<Attachment | null | undefined> {
try {
const upload = multer({
limits: {
fileSize: config.parameters.maxUploadSize,
},
storage: (() => {
if (config.parameters.storageMode === 'memory') {
return memoryStorage();
} else {
return diskStorage({});
}
})(),
}).single('file'); // 'file' is the field name in the form
const multerUpload = new Promise<Express.Multer.File | null>(
(resolve, reject) => {
upload(req as Request, res as Response, async (err?: any) => {
if (err) {
this.logger.error('Unable to store uploaded file', err);
reject(new Error('Unable to upload file!'));
}
if (req.file) {
resolve(req.file);
}
});
},
);
const file = await multerUpload;
// Check if any file is provided
if (!file) {
if (!req.file) {
this.logger.debug('No files provided');
return null;
}
return await this.attachmentService.store(file, {
name: file.originalname,
size: file.size,
type: file.mimetype,
return await this.attachmentService.store(req.file, {
name: req.file.originalname,
size: req.file.size,
type: req.file.mimetype,
resourceRef: AttachmentResourceRef.MessageAttachment,
access: AttachmentAccess.Private,
createdByRef: AttachmentCreatedByRef.Subscriber,
@ -1330,4 +1300,35 @@ export default abstract class BaseWebChannelHandler<
return !!message;
}
}
/**
* Web channel middleware to handle multipart uploads (Long Pooling only)
* @param req Express Request
* @param res Express Response
* @param next Callback function
*/
async middleware(req: Request, res: Response, next: NextFunction) {
if (
!this.isSocketRequest(req) &&
req.headers['content-type']?.includes('multipart/form-data')
) {
const upload = multer({
limits: {
fileSize: config.parameters.maxUploadSize,
},
storage: (() => {
if (config.parameters.storageMode === 'memory') {
return memoryStorage();
} else {
return diskStorage({});
}
})(),
}).single('file'); // 'file' is the field name in the form
upload(req, res, next);
} else {
// Do nothing
next();
}
}
}