import multer from 'multer'; import path from 'path'; import fs from 'fs'; const uploadsBase = path.join(__dirname, '../../../uploads'); function storageFor(subdir: string) { return multer.diskStorage({ destination: (_req, _file, cb) => { const dir = path.join(uploadsBase, subdir); fs.mkdirSync(dir, { recursive: true }); cb(null, dir); }, filename: (_req, file, cb) => { const unique = `${Date.now()}-${Math.round(Math.random() * 1e6)}`; cb(null, unique + path.extname(file.originalname)); }, }); } const imageFilter: multer.Options['fileFilter'] = (_req, file, cb) => { const allowed = /jpeg|jpg|png|gif|webp/; cb(null, allowed.test(path.extname(file.originalname).toLowerCase()) && allowed.test(file.mimetype)); }; const pdfFilter: multer.Options['fileFilter'] = (_req, file, cb) => { cb(null, file.mimetype === 'application/pdf' || path.extname(file.originalname).toLowerCase() === '.pdf'); }; export const uploadHeadshot = multer({ storage: storageFor('headshots'), fileFilter: imageFilter, limits: { fileSize: 5 * 1024 * 1024 } }); export const uploadPhoto = multer({ storage: storageFor('photos'), fileFilter: imageFilter, limits: { fileSize: 10 * 1024 * 1024 } }); export const uploadLogo = multer({ storage: storageFor('sponsors'), fileFilter: imageFilter, limits: { fileSize: 5 * 1024 * 1024 } }); export const uploadMinutes = multer({ storage: storageFor('minutes'), fileFilter: pdfFilter, limits: { fileSize: 20 * 1024 * 1024 } });