diff --git a/src/modules/files/entity/interface.ts b/src/modules/files/entity/interface.ts index 6f44eb1..4df36db 100644 --- a/src/modules/files/entity/interface.ts +++ b/src/modules/files/entity/interface.ts @@ -1,3 +1,5 @@ +import { Resize } from '../../../pkg/sharp' + export interface RequestImage { url: string property: { @@ -24,12 +26,12 @@ export interface RequestPdf { seconds: number } -export interface RequestConvertImage { +export type RequestConvertImage = { url: string seconds: number quality: number convertTo: 'webp' | 'jpeg' -} +} & Resize export interface RequestReplaceDoc { url: string diff --git a/src/modules/files/entity/schema.ts b/src/modules/files/entity/schema.ts index e5fed33..31c575e 100644 --- a/src/modules/files/entity/schema.ts +++ b/src/modules/files/entity/schema.ts @@ -35,6 +35,17 @@ export const RequestConvertImage = Joi.object({ seconds: Joi.number().default(seconds).optional(), quality: Joi.number().min(1).max(100).optional().default(80), convertTo: Joi.string().valid('jpeg', 'webp').optional().default('webp'), + resize: Joi.boolean().optional().default(false), + width: Joi.number().when('resize', { + is: true, + then: Joi.required(), + otherwise: Joi.optional(), + }), + height: Joi.number().when('resize', { + is: true, + then: Joi.required(), + otherwise: Joi.optional(), + }), }) export const RequestReplaceDoc = Joi.object({ diff --git a/src/modules/files/usecase/usecase.ts b/src/modules/files/usecase/usecase.ts index 741c48a..db24e5b 100644 --- a/src/modules/files/usecase/usecase.ts +++ b/src/modules/files/usecase/usecase.ts @@ -13,7 +13,7 @@ import mime from 'mime-types' import axios from 'axios' import error from '../../../pkg/error' import statusCode from '../../../pkg/statusCode' -import Sharp from '../../../pkg/sharp' +import Sharp, { Resize } from '../../../pkg/sharp' import { RegexContentTypeDoc, RegexContentTypeImage, @@ -109,6 +109,9 @@ class Usecase { url, quality, convertTo, + resize, + height, + width, }: RequestConvertImage) { try { const { data, status, headers } = await axios.get(url, { @@ -122,11 +125,13 @@ class Usecase { statusCode.BAD_REQUEST, statusCode[statusCode.BAD_REQUEST] ) + const optionResize: Resize = { resize, height, width } const { source, meta } = await Sharp.Convert( data, convertTo, - quality + quality, + optionResize ) return { diff --git a/src/pkg/sharp.ts b/src/pkg/sharp.ts index ae1dd91..c36c2af 100644 --- a/src/pkg/sharp.ts +++ b/src/pkg/sharp.ts @@ -1,5 +1,11 @@ import sharp from 'sharp' +export type Resize = { + resize: boolean + height: number + width: number +} + class Sharp { constructor() {} @@ -14,9 +20,16 @@ class Sharp { public static async Convert( source: Buffer, convertTo: 'webp' | 'jpeg', - quality: number + quality: number, + resize?: Resize ) { - const sharpImage = sharp(source) + let sharpImage = sharp(source) + if (resize?.resize) + sharpImage = sharpImage.resize({ + height: resize.height, + width: resize.width, + fit: 'inside', + }) const { data, info } = await sharpImage[convertTo]({ quality, }).toBuffer({ resolveWithObject: true })