From 0dd8f418086ab1e2be390422010c08b1bb9450f8 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Robert=20Sch=C3=A4fer?= Date: Fri, 30 May 2025 23:19:48 +0800 Subject: [PATCH] fix silly bug on upload --- .../src/graphql/resolvers/images/images.ts | 6 ++---- .../graphql/resolvers/images/imagesS3.spec.ts | 20 +++++++++++++++++++ .../src/graphql/resolvers/images/imagesS3.ts | 5 ++++- 3 files changed, 26 insertions(+), 5 deletions(-) diff --git a/backend/src/graphql/resolvers/images/images.ts b/backend/src/graphql/resolvers/images/images.ts index c3819edd4..fd420e1a3 100644 --- a/backend/src/graphql/resolvers/images/images.ts +++ b/backend/src/graphql/resolvers/images/images.ts @@ -44,16 +44,14 @@ export interface Images { resource: { id: string }, relationshipType: 'HERO_IMAGE' | 'AVATAR_IMAGE', opts?: DeleteImageOpts, - // eslint-disable-next-line @typescript-eslint/no-explicit-any - ) => Promise + ) => Promise mergeImage: ( resource: { id: string }, relationshipType: 'HERO_IMAGE' | 'AVATAR_IMAGE', imageInput: ImageInput | null | undefined, opts?: MergeImageOpts, - // eslint-disable-next-line @typescript-eslint/no-explicit-any - ) => Promise + ) => Promise } export const images = (config: Context['config']) => diff --git a/backend/src/graphql/resolvers/images/imagesS3.spec.ts b/backend/src/graphql/resolvers/images/imagesS3.spec.ts index 0cc31033f..3dc5316c5 100644 --- a/backend/src/graphql/resolvers/images/imagesS3.spec.ts +++ b/backend/src/graphql/resolvers/images/imagesS3.spec.ts @@ -324,6 +324,26 @@ describe('mergeImage', () => { }) }) }) + + describe('edge cases: `Location` is not a valid URL (e.g. hetzner object storage)', () => { + beforeEach(async () => { + uploadCallback = jest.fn( + () => + 'fsn1.your-objectstorage.com/ocelot-social-staging/original/f965ea15-1f6b-43aa-a535-927410e2585e-dsc02586.jpg', + ) + }) + + it('adds missing https:// protocol', async () => { + const result = await mergeImage(post, 'HERO_IMAGE', imageInput, { + uploadCallback, + deleteCallback, + }) + expect(result).toMatchObject({ + url: 'https://fsn1.your-objectstorage.com/ocelot-social-staging/original/f965ea15-1f6b-43aa-a535-927410e2585e-dsc02586.jpg', + }) + expect(new URL(result.url)).toBeDefined() + }) + }) }) }) diff --git a/backend/src/graphql/resolvers/images/imagesS3.ts b/backend/src/graphql/resolvers/images/imagesS3.ts index d51feea27..247cdc9c7 100644 --- a/backend/src/graphql/resolvers/images/imagesS3.ts +++ b/backend/src/graphql/resolvers/images/imagesS3.ts @@ -104,7 +104,10 @@ export const images = (config: S3Configured) => { const upload = await uploadPromise const { name, ext } = path.parse(upload.filename) const uniqueFilename = `${uuid()}-${slug(name)}${ext}` - const Location = await uploadCallback({ ...upload, uniqueFilename }) + let Location = await uploadCallback({ ...upload, uniqueFilename }) + if (!Location.startsWith('https://') && !Location.startsWith('http://')) { + Location = `https://${Location}` // assume https + } return Location }