From d457c08b12c43e8272f97816fa0559032d7456d1 Mon Sep 17 00:00:00 2001 From: Zakaria Date: Sat, 24 Oct 2026 01:23:56 -0400 Subject: [PATCH] feat(api): show the verification code in the SES mailbox --- packages/api/src/adapter-aws/AwsSesAdapter.test.ts | 13 +++++++++++++ packages/api/src/adapter-aws/AwsSesAdapter.ts | 8 ++++++++ packages/api/src/cloud-spi/emailSchema.ts | 1 + 3 files changed, 22 insertions(+) diff --git a/packages/api/src/adapter-aws/AwsSesAdapter.test.ts b/packages/api/src/adapter-aws/AwsSesAdapter.test.ts index 076e1e3..5a97d5f 100644 --- a/packages/api/src/adapter-aws/AwsSesAdapter.test.ts +++ b/packages/api/src/adapter-aws/AwsSesAdapter.test.ts @@ -46,6 +46,19 @@ describe('AwsSesAdapter', () => { })]) }) + test('picks out the code from verification emails', async () => { + const adapter = new AwsSesAdapter('http://floci.test', async () => jsonResponse({ + messages: [ + {Id: 'cognito', Subject: 'Your verification code', Body: {text_part: 'Your verification code is 869472.'}}, + {Id: 'html', Subject: 'Reset', Body: {html_part: '

Your confirmation code is: 4410

'}}, + {Id: 'plain', Subject: 'Invoice', Body: {text_part: 'Order 123456 shipped.'}}, + ], + })) + + const codes = (await adapter.list()).map((resource) => resource.metadata.code) + expect(codes).toEqual(['869472', '4410', null]) + }) + test('filters messages by subject, sender, and recipients', async () => { const adapter = new AwsSesAdapter('http://floci.test', async () => jsonResponse({ messages: [ diff --git a/packages/api/src/adapter-aws/AwsSesAdapter.ts b/packages/api/src/adapter-aws/AwsSesAdapter.ts index d9ef553..385502b 100644 --- a/packages/api/src/adapter-aws/AwsSesAdapter.ts +++ b/packages/api/src/adapter-aws/AwsSesAdapter.ts @@ -125,10 +125,18 @@ function messageToResource(message: FlociSesMessage): CloudResource { htmlBody: message.Body?.html_part ?? null, rawData: message.RawData ?? null, messageType: raw ? 'raw' : 'simple', + code: findCode(message.Body?.text_part ?? message.Body?.html_part), }, } } +// Matches the wording of Cognito's default and most custom messages: "Your verification code is 123456." +const CODE_PATTERN = /\bcode\s+is:?\s*(?:<[^>]+>\s*)*(\d{4,8})\b/i + +function findCode(body: string | null | undefined): string | null { + return body?.match(CODE_PATTERN)?.[1] ?? null +} + function filterBySearch(resources: CloudResource[], search?: string): CloudResource[] { const normalized = search?.trim().toLowerCase() if (!normalized) return resources diff --git a/packages/api/src/cloud-spi/emailSchema.ts b/packages/api/src/cloud-spi/emailSchema.ts index 70d295b..3ff273a 100644 --- a/packages/api/src/cloud-spi/emailSchema.ts +++ b/packages/api/src/cloud-spi/emailSchema.ts @@ -4,6 +4,7 @@ const emailColumns: TableColumnSchema[] = [ {name: 'name', label: 'Subject'}, {name: 'source', label: 'From', path: 'metadata.source', format: 'code'}, {name: 'to', label: 'To', path: 'metadata.toAddresses', format: 'list'}, + {name: 'code', label: 'Code', path: 'metadata.code', format: 'code'}, {name: 'messageType', label: 'Type', path: 'metadata.messageType', format: 'badge'}, {name: 'createdAt', label: 'Captured At', format: 'datetime'}, ] -- 2.52.0