diff --git a/src/routes/links.ts b/src/routes/links.ts index 01ebd71..05a6ad4 100644 --- a/src/routes/links.ts +++ b/src/routes/links.ts @@ -53,6 +53,7 @@ export async function resolveLinkTemplateId( const createLinkSchema = z.object({ userId: z.string().uuid().optional(), templateId: z.string().uuid().optional(), + templateSlug: z.string().optional(), originalUrl: z.string().url().optional(), title: z.string().optional(), description: z.string().optional(), @@ -219,7 +220,7 @@ export async function linkRoutes(fastify: FastifyInstance) { } const originalUrl = data.originalUrl || 'https://angkorlifes.com'; - const resolvedTemplateId = await resolveLinkTemplateId(data.templateId, null); + const resolvedTemplateId = await resolveLinkTemplateId(data.templateId, data.templateSlug); const result = await db.query( `INSERT INTO links ( diff --git a/src/routes/sdk.event.test.ts b/src/routes/sdk.event.test.ts index 51bffe5..05ff406 100644 --- a/src/routes/sdk.event.test.ts +++ b/src/routes/sdk.event.test.ts @@ -46,6 +46,9 @@ describe('POST /api/sdk/v1/links', () => { }); it('accepts payloads without originalUrl and derives a fallback destination', async () => { + mockQuery.mockResolvedValueOnce({ + rows: [{ id: 'default-template-id' }], + }); mockQuery.mockResolvedValueOnce({ rows: [{ id: LINK_ID, @@ -70,7 +73,7 @@ describe('POST /api/sdk/v1/links', () => { originalUrl: 'https://example.com/emoji/detail', }); - const insertCall = mockQuery.mock.calls[0]; + const insertCall = mockQuery.mock.calls[1]; expect(insertCall[0]).toMatch(/INSERT INTO links/); expect(insertCall[1][3]).toBe('https://example.com/emoji/detail'); diff --git a/src/routes/sdk.ts b/src/routes/sdk.ts index 7d0bd27..27e7880 100644 --- a/src/routes/sdk.ts +++ b/src/routes/sdk.ts @@ -60,6 +60,7 @@ export async function sdkRoutes(fastify: FastifyInstance) { attributionWindowHours: z.number().int().min(1).max(2160).optional(), expiresAt: z.string().datetime().optional(), templateId: z.string().uuid().optional(), + templateSlug: z.string().optional(), userId: z.string().uuid().optional(), }); @@ -67,7 +68,7 @@ export async function sdkRoutes(fastify: FastifyInstance) { const originalUrl = body.originalUrl || 'https://angkorlifes.com'; const shortCode = body.customCode || 'sdk-link'; - const resolvedTemplateId = await resolveLinkTemplateId(body.templateId, null); + const resolvedTemplateId = await resolveLinkTemplateId(body.templateId, body.templateSlug); const result = await db.query( `INSERT INTO links (