From 94f8b76a03e47d07e78fb42c005ed12952f1ed5f Mon Sep 17 00:00:00 2001 From: Matt Ciaccio Date: Fri, 24 Apr 2026 12:56:47 +0200 Subject: [PATCH] feat(events): register yacht, company, membership, reservation webhook events --- src/lib/services/webhook-event-map.ts | 28 +++++++++++++ tests/unit/webhook-event-map.test.ts | 60 ++++++++++++++++++++++++++- 2 files changed, 86 insertions(+), 2 deletions(-) diff --git a/src/lib/services/webhook-event-map.ts b/src/lib/services/webhook-event-map.ts index 7074a77..e3cbfce 100644 --- a/src/lib/services/webhook-event-map.ts +++ b/src/lib/services/webhook-event-map.ts @@ -24,6 +24,20 @@ export const WEBHOOK_EVENTS = [ 'invoice.paid', 'invoice.overdue', 'registration.new', + 'yacht.created', + 'yacht.updated', + 'yacht.ownership_transferred', + 'yacht.archived', + 'company.created', + 'company.updated', + 'company.archived', + 'company_membership.added', + 'company_membership.updated', + 'company_membership.ended', + 'berth_reservation.created', + 'berth_reservation.activated', + 'berth_reservation.ended', + 'berth_reservation.cancelled', ] as const; export type WebhookEvent = (typeof WEBHOOK_EVENTS)[number]; @@ -50,4 +64,18 @@ export const INTERNAL_TO_WEBHOOK_MAP: Record = { 'invoice:paid': 'invoice.paid', 'invoice:overdue': 'invoice.overdue', 'registration:new': 'registration.new', + 'yacht:created': 'yacht.created', + 'yacht:updated': 'yacht.updated', + 'yacht:ownership_transferred': 'yacht.ownership_transferred', + 'yacht:archived': 'yacht.archived', + 'company:created': 'company.created', + 'company:updated': 'company.updated', + 'company:archived': 'company.archived', + 'company_membership:added': 'company_membership.added', + 'company_membership:updated': 'company_membership.updated', + 'company_membership:ended': 'company_membership.ended', + 'berth_reservation:created': 'berth_reservation.created', + 'berth_reservation:activated': 'berth_reservation.activated', + 'berth_reservation:ended': 'berth_reservation.ended', + 'berth_reservation:cancelled': 'berth_reservation.cancelled', }; diff --git a/tests/unit/webhook-event-map.test.ts b/tests/unit/webhook-event-map.test.ts index 7fdf241..eaa2c5b 100644 --- a/tests/unit/webhook-event-map.test.ts +++ b/tests/unit/webhook-event-map.test.ts @@ -5,7 +5,10 @@ describe('INTERNAL_TO_WEBHOOK_MAP', () => { it('every internal event key maps to a value present in WEBHOOK_EVENTS', () => { const validEvents = new Set(WEBHOOK_EVENTS); for (const [internalKey, webhookEvent] of Object.entries(INTERNAL_TO_WEBHOOK_MAP)) { - expect(validEvents.has(webhookEvent), `"${internalKey}" maps to unknown event "${webhookEvent}"`).toBe(true); + expect( + validEvents.has(webhookEvent), + `"${internalKey}" maps to unknown event "${webhookEvent}"`, + ).toBe(true); } }); @@ -43,7 +46,9 @@ describe('WEBHOOK_EVENTS', () => { it('contains all values present in INTERNAL_TO_WEBHOOK_MAP', () => { const eventsSet = new Set(WEBHOOK_EVENTS); for (const webhookEvent of Object.values(INTERNAL_TO_WEBHOOK_MAP)) { - expect(eventsSet.has(webhookEvent), `"${webhookEvent}" missing from WEBHOOK_EVENTS`).toBe(true); + expect(eventsSet.has(webhookEvent), `"${webhookEvent}" missing from WEBHOOK_EVENTS`).toBe( + true, + ); } }); @@ -71,3 +76,54 @@ describe('WEBHOOK_EVENTS', () => { expect(unique.size).toBe(WEBHOOK_EVENTS.length); }); }); + +describe('new resource events (yachts, companies, memberships, reservations)', () => { + it('includes all yacht events in the catalog', () => { + const events = new Set(WEBHOOK_EVENTS); + ['yacht.created', 'yacht.updated', 'yacht.ownership_transferred', 'yacht.archived'].forEach( + (e) => { + expect(events.has(e), `missing ${e}`).toBe(true); + }, + ); + }); + + it('includes all company events', () => { + const events = new Set(WEBHOOK_EVENTS); + ['company.created', 'company.updated', 'company.archived'].forEach((e) => { + expect(events.has(e)).toBe(true); + }); + }); + + it('includes all membership events', () => { + const events = new Set(WEBHOOK_EVENTS); + ['company_membership.added', 'company_membership.updated', 'company_membership.ended'].forEach( + (e) => { + expect(events.has(e)).toBe(true); + }, + ); + }); + + it('includes all berth reservation lifecycle events', () => { + const events = new Set(WEBHOOK_EVENTS); + [ + 'berth_reservation.created', + 'berth_reservation.activated', + 'berth_reservation.ended', + 'berth_reservation.cancelled', + ].forEach((e) => { + expect(events.has(e)).toBe(true); + }); + }); + + it('yacht:ownership_transferred maps to yacht.ownership_transferred', () => { + expect(INTERNAL_TO_WEBHOOK_MAP['yacht:ownership_transferred']).toBe( + 'yacht.ownership_transferred', + ); + }); + + it('berth_reservation:activated maps to berth_reservation.activated', () => { + expect(INTERNAL_TO_WEBHOOK_MAP['berth_reservation:activated']).toBe( + 'berth_reservation.activated', + ); + }); +});