From 33ee9dded985b31ea03d63b8a7be93ede116c0f5 Mon Sep 17 00:00:00 2001 From: maxiR143 Date: Mon, 2 Mar 2026 21:15:02 -0600 Subject: [PATCH 1/2] feat: add support for custom SQS endpoint --- src/api/integrations/event/sqs/sqs.controller.ts | 6 ++++-- src/config/env.config.ts | 2 ++ 2 files changed, 6 insertions(+), 2 deletions(-) diff --git a/src/api/integrations/event/sqs/sqs.controller.ts b/src/api/integrations/event/sqs/sqs.controller.ts index 2b0398ef2..4bfb0a709 100644 --- a/src/api/integrations/event/sqs/sqs.controller.ts +++ b/src/api/integrations/event/sqs/sqs.controller.ts @@ -28,8 +28,8 @@ export class SqsController extends EventController implements EventControllerInt accessKeyId: awsConfig.ACCESS_KEY_ID, secretAccessKey: awsConfig.SECRET_ACCESS_KEY, }, - region: awsConfig.REGION, + endpoint: awsConfig.ENDPOINT || undefined, }); this.logger.info('SQS initialized'); @@ -126,7 +126,9 @@ export class SqsController extends EventController implements EventControllerInt ? 'singlequeue' : `${event.replace('.', '_').toLowerCase()}`; const queueName = `${prefixName}_${eventFormatted}.fifo`; - const sqsUrl = `https://sqs.${sqsConfig.REGION}.amazonaws.com/${sqsConfig.ACCOUNT_ID}/${queueName}`; + const sqsUrl = sqsConfig.ENDPOINT + ? `${sqsConfig.ENDPOINT.replace(/\/$/, '')}/${sqsConfig.ACCOUNT_ID}/${queueName}` + : `https://sqs.${sqsConfig.REGION}.amazonaws.com/${sqsConfig.ACCOUNT_ID}/${queueName}`; const message = { ...(extra ?? {}), diff --git a/src/config/env.config.ts b/src/config/env.config.ts index 7c4e382e7..3c4e6b7c2 100644 --- a/src/config/env.config.ts +++ b/src/config/env.config.ts @@ -121,6 +121,7 @@ export type Sqs = { SECRET_ACCESS_KEY: string; ACCOUNT_ID: string; REGION: string; + ENDPOINT: string; MAX_PAYLOAD_SIZE: number; EVENTS: { APPLICATION_STARTUP: boolean; @@ -585,6 +586,7 @@ export class ConfigService { SECRET_ACCESS_KEY: process.env.SQS_SECRET_ACCESS_KEY || '', ACCOUNT_ID: process.env.SQS_ACCOUNT_ID || '', REGION: process.env.SQS_REGION || '', + ENDPOINT: process.env.SQS_ENDPOINT || '', MAX_PAYLOAD_SIZE: Number.parseInt(process.env.SQS_MAX_PAYLOAD_SIZE ?? '1048576'), EVENTS: { APPLICATION_STARTUP: process.env?.SQS_GLOBAL_APPLICATION_STARTUP === 'true', From 4b8f4584b86c8e1b33cfaadb793d17745a40b317 Mon Sep 17 00:00:00 2001 From: maxiR143 Date: Mon, 2 Mar 2026 21:37:33 -0600 Subject: [PATCH 2/2] make SQS endpoint optional and centralice qeue URL construction logic --- .../integrations/event/sqs/sqs.controller.ts | 17 +++++++++++++---- src/config/env.config.ts | 4 ++-- 2 files changed, 15 insertions(+), 6 deletions(-) diff --git a/src/api/integrations/event/sqs/sqs.controller.ts b/src/api/integrations/event/sqs/sqs.controller.ts index 4bfb0a709..12b3ce2d7 100644 --- a/src/api/integrations/event/sqs/sqs.controller.ts +++ b/src/api/integrations/event/sqs/sqs.controller.ts @@ -29,7 +29,7 @@ export class SqsController extends EventController implements EventControllerInt secretAccessKey: awsConfig.SECRET_ACCESS_KEY, }, region: awsConfig.REGION, - endpoint: awsConfig.ENDPOINT || undefined, + endpoint: awsConfig.ENDPOINT, }); this.logger.info('SQS initialized'); @@ -126,9 +126,7 @@ export class SqsController extends EventController implements EventControllerInt ? 'singlequeue' : `${event.replace('.', '_').toLowerCase()}`; const queueName = `${prefixName}_${eventFormatted}.fifo`; - const sqsUrl = sqsConfig.ENDPOINT - ? `${sqsConfig.ENDPOINT.replace(/\/$/, '')}/${sqsConfig.ACCOUNT_ID}/${queueName}` - : `https://sqs.${sqsConfig.REGION}.amazonaws.com/${sqsConfig.ACCOUNT_ID}/${queueName}`; + const sqsUrl = this.getQueueUrl(sqsConfig, queueName); const message = { ...(extra ?? {}), @@ -304,4 +302,15 @@ export class SqsController extends EventController implements EventControllerInt this.logger.error(`Error listing queues for ${prefixName}: ${err.message}`); } } + + private getQueueUrl(sqsConfig: Sqs, queueName: string): string { + if (sqsConfig.ENDPOINT) { + const endpoint = sqsConfig.ENDPOINT.replace(/\/+$/, ''); + if (endpoint.endsWith(sqsConfig.ACCOUNT_ID)) { + return `${endpoint}/${queueName}`; + } + return `${endpoint}/${sqsConfig.ACCOUNT_ID}/${queueName}`; + } + return `https://sqs.${sqsConfig.REGION}.amazonaws.com/${sqsConfig.ACCOUNT_ID}/${queueName}`; + } } diff --git a/src/config/env.config.ts b/src/config/env.config.ts index 3c4e6b7c2..f19c3640d 100644 --- a/src/config/env.config.ts +++ b/src/config/env.config.ts @@ -121,7 +121,7 @@ export type Sqs = { SECRET_ACCESS_KEY: string; ACCOUNT_ID: string; REGION: string; - ENDPOINT: string; + ENDPOINT?: string; MAX_PAYLOAD_SIZE: number; EVENTS: { APPLICATION_STARTUP: boolean; @@ -586,7 +586,7 @@ export class ConfigService { SECRET_ACCESS_KEY: process.env.SQS_SECRET_ACCESS_KEY || '', ACCOUNT_ID: process.env.SQS_ACCOUNT_ID || '', REGION: process.env.SQS_REGION || '', - ENDPOINT: process.env.SQS_ENDPOINT || '', + ENDPOINT: process.env.SQS_ENDPOINT || undefined, MAX_PAYLOAD_SIZE: Number.parseInt(process.env.SQS_MAX_PAYLOAD_SIZE ?? '1048576'), EVENTS: { APPLICATION_STARTUP: process.env?.SQS_GLOBAL_APPLICATION_STARTUP === 'true',