From 6da5ea9394d6657d9c43860ba9213710505125c7 Mon Sep 17 00:00:00 2001 From: Chase Naples Date: Tue, 16 Sep 2025 08:27:04 -0400 Subject: [PATCH] storage-resize-images: prevent double-triggering by recognizing resizedImage flag as string or boolean\n\n- filters: treat metadata.resizedImage === true or "true" as already-resized\n- upload: set resizedImage metadata to string "true" for consistency\n- tests: cover boolean variant in metadata checks\n\nFixes #932 --- .../functions/__tests__/filters.test.ts | 3 ++- storage-resize-images/functions/src/filters.ts | 9 ++++++++- storage-resize-images/functions/src/resize-image.ts | 4 +++- 3 files changed, 13 insertions(+), 3 deletions(-) diff --git a/storage-resize-images/functions/__tests__/filters.test.ts b/storage-resize-images/functions/__tests__/filters.test.ts index 8db9b27f0..778354cf1 100644 --- a/storage-resize-images/functions/__tests__/filters.test.ts +++ b/storage-resize-images/functions/__tests__/filters.test.ts @@ -99,7 +99,8 @@ describe("shouldResize function", () => { describe("Metadata Checks", () => { test.each([ - ["already resized", { resizedImage: "true" }, logs.imageAlreadyResized], + ["already resized (string)", { resizedImage: "true" }, logs.imageAlreadyResized], + ["already resized (boolean)", { resizedImage: true }, logs.imageAlreadyResized], [ "resizing failed previously", { resizeFailed: true }, diff --git a/storage-resize-images/functions/src/filters.ts b/storage-resize-images/functions/src/filters.ts index 0f1487f4e..8deef799c 100644 --- a/storage-resize-images/functions/src/filters.ts +++ b/storage-resize-images/functions/src/filters.ts @@ -50,7 +50,14 @@ export function shouldResize(object: ObjectMetadata): boolean { return false; } - if (object.metadata && object.metadata.resizedImage === "true") { + // Skip if this is a resized image we created previously. Some uploads may + // store custom metadata as a boolean (true) rather than string "true", + // so handle both to ensure idempotence. + if ( + object.metadata && + (object.metadata.resizedImage === "true" || + (object.metadata as any).resizedImage === true) + ) { logs.imageAlreadyResized(); return false; } diff --git a/storage-resize-images/functions/src/resize-image.ts b/storage-resize-images/functions/src/resize-image.ts index 4be3b0834..29f8969c4 100644 --- a/storage-resize-images/functions/src/resize-image.ts +++ b/storage-resize-images/functions/src/resize-image.ts @@ -190,7 +190,9 @@ export const constructMetadata = ( contentType: imageContentType, metadata: objectMetadata.metadata ? { ...objectMetadata.metadata } : {}, }; - metadata.metadata.resizedImage = true; + // Mark resized images so the function can skip re-processing on finalize. + // Use string "true" for consistency with existing checks and metadata conventions. + metadata.metadata.resizedImage = "true"; if (config.cacheControlHeader) { metadata.cacheControl = config.cacheControlHeader; } else {