Skip to content

Commit fd5ea3e

Browse files
fix(billing): cast outbox payloads for JSONB operators (#6928)
1 parent ab66ce9 commit fd5ea3e

4 files changed

Lines changed: 22 additions & 4 deletions

File tree

apps/sim/lib/billing/enterprise-provisioning.test.ts

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -650,6 +650,16 @@ describe('Enterprise workspace-move progress', () => {
650650
failedCount: 1,
651651
failed: [],
652652
})
653+
654+
const renderedJoin = JSON.stringify(dbChainMockFns.innerJoin.mock.calls[0]?.[0])
655+
expect(renderedJoin).toContain("::jsonb -> 'sourceOperationIds'")
656+
expect(renderedJoin).toContain('jsonb_typeof')
657+
658+
const renderedFilters = dbChainMockFns.where.mock.calls
659+
.map(([condition]) => JSON.stringify(condition))
660+
.join('\n')
661+
expect(renderedFilters).toContain("::jsonb -> 'sourceOperationIds'")
662+
expect(renderedFilters).toContain('?|')
653663
})
654664

655665
it('rejects provisioning lookups larger than one admin page', async () => {

apps/sim/lib/billing/enterprise-provisioning.ts

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1365,8 +1365,8 @@ async function getEnterpriseFollowUpProgress(
13651365
const arrayOperationIdExpression = sql<string>`source_operations.operation_id`
13661366
const sourceOperationRows = sql`lateral jsonb_array_elements_text(
13671367
case
1368-
when jsonb_typeof(${outboxEvent.payload} -> 'sourceOperationIds') = 'array'
1369-
then ${outboxEvent.payload} -> 'sourceOperationIds'
1368+
when jsonb_typeof(${outboxEvent.payload}::jsonb -> 'sourceOperationIds') = 'array'
1369+
then ${outboxEvent.payload}::jsonb -> 'sourceOperationIds'
13701370
else '[]'::jsonb
13711371
end
13721372
) as source_operations(operation_id)`
@@ -1391,7 +1391,7 @@ async function getEnterpriseFollowUpProgress(
13911391
.where(
13921392
and(
13931393
eq(outboxEvent.eventType, MIGRATED_INVITATION_EMAIL_EVENT_TYPE),
1394-
sql`coalesce(${outboxEvent.payload} -> 'sourceOperationIds', '[]'::jsonb) ?| array[${sql.join(
1394+
sql`coalesce(${outboxEvent.payload}::jsonb -> 'sourceOperationIds', '[]'::jsonb) ?| array[${sql.join(
13951395
uniqueOperationIds.map((operationId) => sql`${operationId}`),
13961396
sql`, `
13971397
)}]::text[]`

apps/sim/lib/core/outbox/service.test.ts

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -29,6 +29,7 @@ import {
2929
enqueueOrReschedulePendingOutboxEvent,
3030
enqueueOutboxEvent,
3131
enqueueOutboxEvents,
32+
outboxEventHasSourceOperationId,
3233
outboxPayloadHasSourceOperationId,
3334
processOutboxEvents,
3435
} from './service'
@@ -123,6 +124,13 @@ describe('enqueueOutboxEvent', () => {
123124
})
124125

125126
describe('outbox parent-operation correlation', () => {
127+
it('casts JSON payloads before applying JSONB containment operators', () => {
128+
const query = JSON.stringify(outboxEventHasSourceOperationId('operation-1'))
129+
130+
expect(query).toContain("::jsonb -> 'sourceOperationIds'")
131+
expect(query).toContain('@> jsonb_build_array')
132+
})
133+
126134
it('retains both scalar and coalesced parent operation identities', () => {
127135
expect(
128136
outboxPayloadHasSourceOperationId({ sourceOperationId: 'operation-1' }, 'operation-1')

apps/sim/lib/core/outbox/service.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -329,7 +329,7 @@ export async function addOutboxEventSourceOperationId(
329329
export function outboxEventHasSourceOperationId(operationId: string) {
330330
return sql<boolean>`(
331331
${outboxEvent.payload} ->> 'sourceOperationId' = ${operationId}
332-
or coalesce(${outboxEvent.payload} -> 'sourceOperationIds', '[]'::jsonb)
332+
or coalesce(${outboxEvent.payload}::jsonb -> 'sourceOperationIds', '[]'::jsonb)
333333
@> jsonb_build_array(${operationId}::text)
334334
)`
335335
}

0 commit comments

Comments
 (0)