import 'dotenv/config.js'
import { MulterModule, FileFieldsInterceptor, FilesInterceptor, FileInterceptor } from '@nestjs/platform-express'
import { mimeTypeSupport } from '@helpers/helper.mimeType'
import aws from 'aws-sdk'
import { Request } from 'express'
import multer from 'multer'
import multerS3 from 'multer-s3'
import fs from 'fs'
aws.config.update({
accessKeyId: process.env.AWS_ACCESS_KEY_ID,
secretAccessKey: process.env.AWS_ACCESS_KEY
})
export class Multer {
static typeModule = MulterModule
static register = MulterModule.register
static fields = FileFieldsInterceptor
static array = FilesInterceptor
static single = FileInterceptor
static diskStorage: multer.StorageEngine = multer.diskStorage({
destination(_: Request, file: Express.Multer.File, done: any) {
let linux: string = `${process.env.IMG_DIR}`
let window: string = process.env.TEMP || ''
if (!file) {
done(new Error('Uploading file failed'), null)
} else {
if (process.platform === 'win32') {
if (fs.existsSync(window)) {
done(null, window)
} else {
done(new Error('No such file directory').message, null)
}
} else {
if (fs.existsSync(linux)) {
done(null, linux)
} else {
done(new Error('No such file directory').message, null)
}
}
}
},
filename(_req: Request, file: Express.Multer.File, done: any) {
if (!file) done(new Error('Get file upload failed'), null)
const fileName: string = `${Date.now().toString()} - ${file.originalname}`
done(null, fileName)
}
})
static awsStorage: multer.StorageEngine = multerS3({
s3: new aws.S3(),
bucket: process.env.AWS_BUCKET_NAME,
contentType: multerS3.AUTO_CONTENT_TYPE,
serverSideEncryption: 'AES256',
metadata(_req: Request, file: Express.Multer.File, done: any) {
if (!file) done(new Error('Get file upload failed'), null)
done(null, file)
},
key(_req: Request, file: Express.Multer.File, done: any) {
done(null, Date.now().toString())
}
})
static fileFilter(_req: Request, file: Express.Multer.File, done: any) {
if (!mimeTypeSupport(file.mimetype)) throw new TypeError('mimetype not supported')
if (file.size >= 5242880) throw new TypeError('maximum file or image size must be 5 MB or under 5 MB')
const fileName: string = `${Date.now().toString()} - ${file.originalname}`
done(null, fileName)
}
}
// use like this
// @Role('customers')
@UseGuards(JsonWebToken.JwtAuthentication)
@Version('1')
@Post(':action')
@UseInterceptors(
Multer.fields(
[
{ name: 'ktp_photo', maxCount: 1 },
{ name: 'selfie_photo', maxCount: 1 }
],
{
storage: Multer.diskStorage,
fileFilter: Multer.fileFilter
}
)
)
async signatureHandlers(
@Res() res: Response,
@Req() req: Request,
@Body() body: any,
@UploadedFiles() files: { ktp_photo: Express.Multer.File[]; selfie_photo: Express.Multer.File[]; document?: Express.Multer.File[] }
): Promise<OutgoingMessage> {
try {
const serviceResponse: APIResponse = await this.service.signatureHandlers(body, files)
return res.status(serviceResponse.stat_code).json(serviceResponse)
} catch (e: any) {
return res.status(e.stat_code).json(e)
}
}
}
// custom libs multer
import 'dotenv/config.js'
import { MulterModule, FileFieldsInterceptor, FilesInterceptor, FileInterceptor } from '@nestjs/platform-express'
import { mimeTypeSupport } from '@helpers/helper.mimeType'
import aws from 'aws-sdk'
import { Request } from 'express'
import multer from 'multer'
import multerS3 from 'multer-s3'
import fs from 'fs'
aws.config.update({
accessKeyId: process.env.AWS_ACCESS_KEY_ID,
secretAccessKey: process.env.AWS_ACCESS_KEY
})
export class Multer {
static typeModule = MulterModule
static register = MulterModule.register
static fields = FileFieldsInterceptor
static array = FilesInterceptor
static single = FileInterceptor
static diskStorage: multer.StorageEngine = multer.diskStorage({
destination(_: Request, file: Express.Multer.File, done: any) {
let linux: string = `${process.env.IMG_DIR}`
let window: string = process.env.TEMP || ''
if (!file) {
done(new Error('Uploading file failed'), null)
} else {
if (process.platform === 'win32') {
if (fs.existsSync(window)) {
done(null, window)
} else {
done(new Error('No such file directory').message, null)
}
} else {
if (fs.existsSync(linux)) {
done(null, linux)
} else {
done(new Error('No such file directory').message, null)
}
}
}
},
filename(_req: Request, file: Express.Multer.File, done: any) {
if (!file) done(new Error('Get file upload failed'), null)
const fileName: string = `${Date.now().toString()} - ${file.originalname}`
done(null, fileName)
}
})
static awsStorage: multer.StorageEngine = multerS3({
s3: new aws.S3(),
bucket: process.env.AWS_BUCKET_NAME,
contentType: multerS3.AUTO_CONTENT_TYPE,
serverSideEncryption: 'AES256',
key(_req: Request, file: Express.Multer.File, done: any) {
const fileName: string = `${Date.now().toString()} - ${file.originalname}`
done(null, fileName)
}
})
static fileFilter(_req: Request, file: Express.Multer.File, done: any) {
if (!mimeTypeSupport(file.mimetype)) throw new TypeError('mimetype not supported')
if (file.size >= 5242880) throw new TypeError('maximum file or image size must be 5 MB or under 5 MB')
const fileName: string = `${Date.now().toString()} - ${file.originalname}`
done(null, fileName)
}
}