Skip to content

Commit 64973e7

Browse files
committed
feat(backend): also publish webhooks to operators if primary recipient is tenant
1 parent 8800d72 commit 64973e7

File tree

3 files changed

+91
-27
lines changed

3 files changed

+91
-27
lines changed

packages/backend/src/tenants/service.test.ts

Lines changed: 0 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -146,7 +146,6 @@ describe('Tenant Service', (): void => {
146146
expect(tenantSettings.length).toBeGreaterThan(0)
147147
})
148148

149-
<<<<<<< HEAD
150149
test('can create a tenant with a setting', async () => {
151150
const walletAddressUrl = 'https://example.com'
152151
const createOptions = {
@@ -176,8 +175,6 @@ describe('Tenant Service', (): void => {
176175
expect(tenantSetting[0].value).toEqual(walletAddressUrl)
177176
})
178177

179-
=======
180-
>>>>>>> 1fa35ba66 (chore: fix some rebasing issues)
181178
test('tenant creation rolls back if auth tenant create fails', async (): Promise<void> => {
182179
const createOptions = {
183180
apiSecret: 'test-api-secret',

packages/backend/src/webhook/service.test.ts

Lines changed: 49 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -33,6 +33,7 @@ import {
3333
import { createOutgoingPayment } from '../tests/outgoingPayment'
3434
import { TenantSetting, TenantSettingKeys } from '../tenants/settings/model'
3535
import { faker } from '@faker-js/faker'
36+
import { createTenant } from '../tests/tenant'
3637

3738
const nock = (global as unknown as { nock: typeof import('nock') }).nock
3839

@@ -565,5 +566,53 @@ describe('Webhook Service', (): void => {
565566

566567
scope.done()
567568
})
569+
570+
test('Also sends webhook to operator if tenant is primary recipient', async (): Promise<void> => {
571+
const tenant = await createTenant(deps)
572+
const tenantWebhookUrl = faker.internet.url()
573+
await TenantSetting.query(knex).insertAndFetch({
574+
tenantId: tenant.id,
575+
key: TenantSettingKeys.WEBHOOK_URL.name,
576+
value: tenantWebhookUrl
577+
})
578+
579+
const operatorWebhookUrl = faker.internet.url()
580+
await TenantSetting.query(knex).insertAndFetch({
581+
tenantId: Config.operatorTenantId,
582+
key: TenantSettingKeys.WEBHOOK_URL.name,
583+
value: operatorWebhookUrl
584+
})
585+
586+
const tenantedEvent = await WebhookEvent.query(knex).patchAndFetchById(
587+
event.id,
588+
{
589+
tenantId: tenant.id
590+
}
591+
)
592+
593+
const tenantScope = mockWebhookServer(
594+
200,
595+
tenantedEvent,
596+
new URL(tenantWebhookUrl)
597+
)
598+
const operatorScope = mockWebhookServer(
599+
200,
600+
tenantedEvent,
601+
new URL(operatorWebhookUrl)
602+
)
603+
await expect(webhookService.processNext()).resolves.toEqual(
604+
tenantedEvent.id
605+
)
606+
await expect(
607+
webhookService.getEvent(tenantedEvent.id)
608+
).resolves.toMatchObject({
609+
attempts: 1,
610+
statusCode: 200,
611+
processAt: null
612+
})
613+
614+
tenantScope.done()
615+
operatorScope.done()
616+
})
568617
})
569618
})

packages/backend/src/webhook/service.ts

Lines changed: 42 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -164,7 +164,31 @@ async function processNextWebhookEvent(
164164
})
165165
const formattedSettings = formatSettings(settings)
166166

167-
await sendWebhookEvent(deps, event, formattedSettings)
167+
// await sendWebhookEvent(deps, event, formattedSettings)
168+
169+
// if (event.tenantId !== deps_.config.operatorTenantId) {
170+
// const operatorSettings = await deps_.tenantSettingService.get({
171+
// tenantId: deps_.config.operatorTenantId
172+
// })
173+
// const formattedOperatorSettings = formatSettings(operatorSettings)
174+
// await sendWebhookEvent(deps, event, formattedOperatorSettings)
175+
// }
176+
177+
if (event.tenantId !== deps_.config.operatorTenantId) {
178+
const operatorSettings = await deps_.tenantSettingService.get({
179+
tenantId: deps_.config.operatorTenantId
180+
})
181+
const formattedOperatorSettings = formatSettings(operatorSettings)
182+
await sendWebhookEvent(
183+
deps,
184+
event,
185+
formattedSettings,
186+
formattedOperatorSettings
187+
)
188+
} else {
189+
await sendWebhookEvent(deps, event, formattedSettings)
190+
}
191+
168192
span.end()
169193
return event.id
170194
})
@@ -180,11 +204,8 @@ type WebhookHeaders = {
180204
async function sendWebhookEvent(
181205
deps: ServiceDependencies,
182206
event: WebhookEvent,
183-
<<<<<<< HEAD
184-
settings: Partial<FormattedTenantSettings>
185-
=======
186-
settings?: Partial<FormattedTenantSettings>
187-
>>>>>>> 1245e0341 (feat(backend): tenanted webhooks)
207+
settings: Partial<FormattedTenantSettings>,
208+
operatorSettings?: Partial<FormattedTenantSettings>
188209
): Promise<void> {
189210
try {
190211
const requestHeaders: WebhookHeaders = {
@@ -205,27 +226,24 @@ async function sendWebhookEvent(
205226
)
206227
}
207228

208-
<<<<<<< HEAD
209-
await axios.post(settings?.webhookUrl ?? deps.config.webhookUrl, body, {
210-
timeout: Number(settings?.webhookTimeout)
211-
? Number(settings?.webhookTimeout)
212-
: deps.config.webhookTimeout,
213-
headers: requestHeaders,
214-
validateStatus: (status) => status === 200
215-
})
216-
=======
217-
await axios.post(
218-
settings?.webhookUrl?.value ?? deps.config.webhookUrl,
219-
body,
220-
{
221-
timeout: settings?.webhookTimeout?.value
222-
? Number(settings?.webhookTimeout?.value)
229+
await Promise.all([
230+
axios.post(settings?.webhookUrl ?? deps.config.webhookUrl, body, {
231+
timeout: settings?.webhookTimeout
232+
? Number(settings?.webhookTimeout)
223233
: deps.config.webhookTimeout,
224234
headers: requestHeaders,
225235
validateStatus: (status) => status === 200
226-
}
227-
)
228-
>>>>>>> 1245e0341 (feat(backend): tenanted webhooks)
236+
}),
237+
operatorSettings?.webhookUrl
238+
? axios.post(operatorSettings?.webhookUrl, body, {
239+
timeout: operatorSettings?.webhookTimeout
240+
? Number(operatorSettings?.webhookTimeout)
241+
: deps.config.webhookTimeout,
242+
headers: requestHeaders,
243+
validateStatus: (status) => status === 200
244+
})
245+
: null
246+
])
229247

230248
await event.$query(deps.knex).patch({
231249
attempts: event.attempts + 1,

0 commit comments

Comments
 (0)