import { LivechatVisitors, LivechatRooms } from '@rocket.chat/models'; import { API } from '../..'; import { FileUpload } from '../../../lib/media/file-upload'; import { fileUploadIsValidContentType } from '../../../lib/utils/restrictions'; import { sendFileLivechatMessage } from '../../../meteor-methods/omnichannel/sendFileLivechatMessage'; import { settings } from '../../../settings'; import { MultipartUploadHandler } from '../../lib/MultipartUploadHandler'; API.v1.addRoute('livechat/upload/:rid', { async post() { if (!this.request.headers.get('x-visitor-token')) { return API.v1.forbidden(); } const canUpload = settings.get('Livechat_fileupload_enabled') && settings.get('FileUpload_Enabled'); if (!canUpload) { return API.v1.failure({ reason: 'error-file-upload-disabled', }); } const visitorToken = this.request.headers.get('x-visitor-token'); const visitor = await LivechatVisitors.getVisitorByToken(visitorToken as string, {}); if (!visitor) { return API.v1.forbidden(); } const room = await LivechatRooms.findOneOpenByRoomIdAndVisitorToken(this.urlParams.rid, visitorToken as string); if (!room) { return API.v1.forbidden(); } const maxFileSize = settings.get('FileUpload_MaxFileSize') || 104857600; const { file, fields } = await MultipartUploadHandler.parseRequest(this.request, { field: 'file', maxSize: maxFileSize > -1 ? maxFileSize : undefined, }); if (!file) { return API.v1.failure({ reason: 'error-no-file-uploaded', }); } if (!fileUploadIsValidContentType(file.mimetype)) { return API.v1.failure({ reason: 'error-type-not-allowed', }); } const fileStore = FileUpload.getStore('Uploads'); const details = { name: file.filename, size: file.size, type: file.mimetype, rid: this.urlParams.rid, visitorToken, }; const uploadedFile = await fileStore.insert(details, file.tempFilePath); if (!uploadedFile) { return API.v1.failure('Invalid file'); } uploadedFile.description = fields.description; delete fields.description; return API.v1.success(await sendFileLivechatMessage({ roomId: this.urlParams.rid, visitorToken, file: uploadedFile, msgData: fields })); }, });