diff --git a/backend/src/common/interfaces/media.interface.ts b/backend/src/common/interfaces/media.interface.ts index 0f5e548..e043a0b 100644 --- a/backend/src/common/interfaces/media.interface.ts +++ b/backend/src/common/interfaces/media.interface.ts @@ -17,6 +17,7 @@ export interface IMediaService { processImage( buffer: Buffer, format?: "webp" | "avif", + resize?: { width?: number; height?: number }, ): Promise; processVideo( buffer: Buffer, diff --git a/backend/src/media/media.service.ts b/backend/src/media/media.service.ts index ca26c08..2e225e3 100644 --- a/backend/src/media/media.service.ts +++ b/backend/src/media/media.service.ts @@ -83,8 +83,9 @@ export class MediaService implements IMediaService { async processImage( buffer: Buffer, format: "webp" | "avif" = "webp", + resize?: { width?: number; height?: number }, ): Promise { - return this.imageProcessor.process(buffer, { format }); + return this.imageProcessor.process(buffer, { format, resize }); } async processVideo( diff --git a/backend/src/media/strategies/image-processor.strategy.ts b/backend/src/media/strategies/image-processor.strategy.ts index 49f8acf..a9ac4db 100644 --- a/backend/src/media/strategies/image-processor.strategy.ts +++ b/backend/src/media/strategies/image-processor.strategy.ts @@ -13,11 +13,22 @@ export class ImageProcessorStrategy implements IMediaProcessorStrategy { async process( buffer: Buffer, - options: { format: "webp" | "avif" } = { format: "webp" }, + options: { + format: "webp" | "avif"; + resize?: { width?: number; height?: number }; + } = { format: "webp" }, ): Promise { try { - const { format } = options; + const { format, resize } = options; let pipeline = sharp(buffer); + + if (resize) { + pipeline = pipeline.resize(resize.width, resize.height, { + fit: "cover", + position: "center", + }); + } + const metadata = await pipeline.metadata(); if (format === "webp") {