diff --git a/.changeset/tough-taxis-care.md b/.changeset/tough-taxis-care.md new file mode 100644 index 00000000000..93b2f08d298 --- /dev/null +++ b/.changeset/tough-taxis-care.md @@ -0,0 +1,5 @@ +--- +'@clerk/backend': minor +--- + +Add `createBulk()` method to `WaitlistEntryAPI` for bulk creating waitlist entries diff --git a/packages/backend/src/api/__tests__/factory.test.ts b/packages/backend/src/api/__tests__/factory.test.ts index 337581f52cb..03086f91640 100644 --- a/packages/backend/src/api/__tests__/factory.test.ts +++ b/packages/backend/src/api/__tests__/factory.test.ts @@ -465,4 +465,71 @@ describe('api.client', () => { expect(response.id).toBe('mt_test'); }); }); + + describe('WaitlistEntry', () => { + it('executes a successful backend API request to bulk create waitlist entries', async () => { + const emailAddresses = ['foo@bar.com', 'bar@foo.com']; + const ids = ['wle_123', 'wle_456']; + const createdAt = 1700000000; + const updatedAt = 1700000100; + + server.use( + http.post( + `https://api.clerk.test/v1/waitlist_entries/bulk`, + validateHeaders(async ({ request }) => { + const body = await request.json(); + expect(body).toEqual([ + { email_address: emailAddresses[0] }, + { email_address: emailAddresses[1], notify: true }, + ]); + + return HttpResponse.json([ + { + object: 'waitlist_entry', + id: ids[0], + email_address: emailAddresses[0], + status: 'pending', + is_locked: false, + created_at: createdAt, + updated_at: updatedAt, + invitation: null, + }, + { + object: 'waitlist_entry', + id: ids[1], + email_address: emailAddresses[1], + status: 'pending', + is_locked: false, + created_at: createdAt, + updated_at: updatedAt, + invitation: null, + }, + ]); + }), + ), + ); + + const response = await apiClient.waitlistEntries.createBulk([ + { emailAddress: emailAddresses[0] }, + { emailAddress: emailAddresses[1], notify: true }, + ]); + + expect(response).toHaveLength(2); + expect(response[0].id).toBe(ids[0]); + expect(response[0].emailAddress).toBe(emailAddresses[0]); + expect(response[0].status).toBe('pending'); + expect(response[0].isLocked).toBe(false); + expect(response[0].createdAt).toBe(createdAt); + expect(response[0].updatedAt).toBe(updatedAt); + expect(response[0].invitation).toBe(null); + + expect(response[1].id).toBe(ids[1]); + expect(response[1].emailAddress).toBe(emailAddresses[1]); + expect(response[1].status).toBe('pending'); + expect(response[1].isLocked).toBe(false); + expect(response[1].createdAt).toBe(createdAt); + expect(response[1].updatedAt).toBe(updatedAt); + expect(response[1].invitation).toBe(null); + }); + }); }); diff --git a/packages/backend/src/api/endpoints/WaitlistEntryApi.ts b/packages/backend/src/api/endpoints/WaitlistEntryApi.ts index 7dc7b7d3f24..b5f4602cde6 100644 --- a/packages/backend/src/api/endpoints/WaitlistEntryApi.ts +++ b/packages/backend/src/api/endpoints/WaitlistEntryApi.ts @@ -24,6 +24,8 @@ type WaitlistEntryCreateParams = { notify?: boolean; }; +type WaitlistEntryBulkCreateParams = Array; + type WaitlistEntryInviteParams = { /** * When true, do not error if an invitation already exists. Default: false. @@ -56,6 +58,18 @@ export class WaitlistEntryAPI extends AbstractAPI { }); } + /** + * Bulk create waitlist entries. + * @param params An array of parameters for creating waitlist entries. + */ + public async createBulk(params: WaitlistEntryBulkCreateParams) { + return this.request({ + method: 'POST', + path: joinPaths(basePath, 'bulk'), + bodyParams: params, + }); + } + /** * Invite a waitlist entry. * @param id The waitlist entry ID.