@@ -9,6 +9,43 @@ interface MulterRequest extends Request {
99 file ?: Express . Multer . File ;
1010}
1111
12+ const createFilesStorage = ( ) => {
13+ // Ensure the directory exists
14+ const filesResourcesDir = config . resources . filesDirectoryPath ( ) ;
15+ if ( ! fs . existsSync ( filesResourcesDir ) ) {
16+ fs . mkdirSync ( filesResourcesDir , { recursive : true } ) ;
17+ }
18+
19+ const filesStorage = multer . diskStorage ( {
20+ destination : ( req , file , cb ) => {
21+ cb ( null , `${ filesResourcesDir } /` ) ;
22+ } ,
23+ filename : ( req , file , cb ) => {
24+ const ext = path . extname ( file . originalname ) ;
25+ const id = randomUUID ( ) ;
26+ cb ( null , id + ext ) ;
27+ }
28+ } ) ;
29+
30+ return multer ( {
31+ storage : filesStorage ,
32+ limits : {
33+ fileSize : config . resources . fileMaxSize ( )
34+ } ,
35+ fileFilter : ( req , file , cb ) => {
36+ const allowedTypes = / p d f | d o c x | d o c s / ;
37+ const extname = allowedTypes . test ( path . extname ( file . originalname ) . toLowerCase ( ) ) ;
38+ const mimetype = allowedTypes . test ( file . mimetype ) ;
39+
40+ if ( extname && mimetype ) {
41+ return cb ( null , true ) ;
42+ } else {
43+ return cb ( new TypeError ( `Invalid file type. Only images are allowed: ${ allowedTypes } ` ) ) ;
44+ }
45+ }
46+ } ) ;
47+ } ;
48+
1249const createImagesStorage = ( ) => {
1350 // Ensure the directory exists
1451 const imagesResourcesDir = config . resources . imagesDirectoryPath ( ) ;
@@ -103,6 +140,26 @@ const uploadImage = (req: MulterRequest): Promise<string> => {
103140 } ) ;
104141} ;
105142
143+ const uploadFile = ( req : MulterRequest ) : Promise < string > => {
144+ return new Promise < string > ( ( resolve , reject ) => {
145+ createFilesStorage ( ) . single ( 'file' ) ( req , { } as any , ( error ) => {
146+ if ( error ) {
147+ if ( error instanceof multer . MulterError || error instanceof TypeError ) {
148+ return reject ( error ) ;
149+ } else if ( ! req . file ) {
150+ return reject ( new TypeError ( 'No file uploaded.' ) ) ;
151+ } else {
152+ return reject ( new Error ( 'Internal Server Error' ) ) ;
153+ }
154+ }
155+ if ( ! req . file ) {
156+ return reject ( new TypeError ( 'No file uploaded.' ) ) ;
157+ }
158+ resolve ( req . file . filename ) ;
159+ } ) ;
160+ } ) ;
161+ } ;
162+
106163const uploadResume = ( req : MulterRequest ) : Promise < string > => {
107164 return new Promise < string > ( ( resolve , reject ) => {
108165 createResumesStorage ( ) . single ( 'file' ) ( req , { } as any , ( error ) => {
@@ -151,4 +208,4 @@ const resumeExists = (filename: string): boolean => {
151208} ;
152209
153210
154- export { uploadImage , uploadResume , getResumeBuffer , resumeExists } ;
211+ export { uploadImage , uploadResume , getResumeBuffer , resumeExists , uploadFile } ;
0 commit comments