From 47d6fcb6a0eebc7b0de81dfa3309528a1ff0d64f Mon Sep 17 00:00:00 2001 From: Mathis HERRIOT <197931332+0x485254@users.noreply.github.com> Date: Wed, 14 Jan 2026 21:44:00 +0100 Subject: [PATCH] feat(media): add image resizing support for `processImage` Extend the `processImage` method to support optional resizing with `width` and `height` parameters. Update processing pipeline to handle resizing while maintaining existing format processing for `webp` and `avif`. --- backend/src/common/interfaces/media.interface.ts | 1 + backend/src/media/media.service.ts | 3 ++- .../media/strategies/image-processor.strategy.ts | 15 +++++++++++++-- 3 files changed, 16 insertions(+), 3 deletions(-) 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") {