diff --git a/.changeset/auto-bump-magicbell-1737958016.md b/.changeset/auto-bump-magicbell-1737958016.md new file mode 100644 index 000000000..5edbf8d09 --- /dev/null +++ b/.changeset/auto-bump-magicbell-1737958016.md @@ -0,0 +1,5 @@ +--- +'magicbell': minor +--- + +Automatic minor version bump for changes in `magicbell`. diff --git a/.changeset/auto-bump-project-client-1737958016.md b/.changeset/auto-bump-project-client-1737958016.md new file mode 100644 index 000000000..7586d441a --- /dev/null +++ b/.changeset/auto-bump-project-client-1737958016.md @@ -0,0 +1,5 @@ +--- +'@magicbell/project-client': minor +--- + +Automatic minor version bump for changes in `@magicbell/project-client`. diff --git a/.changeset/auto-bump-user-client-1737958016.md b/.changeset/auto-bump-user-client-1737958016.md new file mode 100644 index 000000000..8b4ab1af4 --- /dev/null +++ b/.changeset/auto-bump-user-client-1737958016.md @@ -0,0 +1,5 @@ +--- +'@magicbell/user-client': minor +--- + +Automatic minor version bump for changes in `@magicbell/user-client`. diff --git a/packages/magicbell/src/schemas/users/notifications.ts b/packages/magicbell/src/schemas/users/notifications.ts index cf3f763e2..accc5a39c 100644 --- a/packages/magicbell/src/schemas/users/notifications.ts +++ b/packages/magicbell/src/schemas/users/notifications.ts @@ -106,8 +106,8 @@ export const ListUsersNotificationsResponseSchema = { properties: { user: { - nullable: false, type: 'object', + nullable: false, additionalProperties: false, properties: { diff --git a/packages/project-client/README.md b/packages/project-client/README.md index f18ce6b0c..ade4e52e2 100644 --- a/packages/project-client/README.md +++ b/packages/project-client/README.md @@ -11,7 +11,7 @@ Welcome to the Client SDK documentation. This guide will help you get started wi ## About the API -OpenAPI 3.1.0 Specification for MagicBell API. +OpenAPI 3.0.3 Specification for MagicBell API. ## Table of Contents @@ -83,7 +83,7 @@ import { Client } from '@magicbell/project-client'; }); const { data } = await client.broadcasts.listBroadcasts({ - pageSize: 8, + pageSize: 2, pageAfter: 'page[after]', pageBefore: 'page[before]', }); @@ -120,7 +120,6 @@ The SDK includes several models that represent the data structures used in API r | :------------------------------------------------------------------------------------------- | :---------- | | [ArrayOfBroadcasts](documentation/models/ArrayOfBroadcasts.md) | | | [Broadcast](documentation/models/Broadcast.md) | | -| [ProjectDeliveryConfig](documentation/models/ProjectDeliveryConfig.md) | | | [CategoryDeliveryConfig](documentation/models/CategoryDeliveryConfig.md) | | | [ArrayOfMetadataApnsTokens](documentation/models/ArrayOfMetadataApnsTokens.md) | | | [MetadataApnsToken](documentation/models/MetadataApnsToken.md) | | diff --git a/packages/project-client/documentation/models/CategoryDeliveryConfig.md b/packages/project-client/documentation/models/CategoryDeliveryConfig.md index 00f791470..4c135f14f 100644 --- a/packages/project-client/documentation/models/CategoryDeliveryConfig.md +++ b/packages/project-client/documentation/models/CategoryDeliveryConfig.md @@ -4,23 +4,23 @@ | Name | Type | Required | Description | | :------- | :------------------------------- | :------- | :---------- | -| category | string | ✅ | | | channels | CategoryDeliveryConfigChannels[] | ✅ | | +| key | string | ✅ | | | disabled | boolean | ❌ | | # CategoryDeliveryConfigChannels **Properties** -| Name | Type | Required | Description | -| :------- | :--------------- | :------- | :---------- | -| channel | ChannelsChannel2 | ✅ | | -| delay | number | ❌ | | -| disabled | boolean | ❌ | | -| if | string | ❌ | | -| priority | number | ❌ | | +| Name | Type | Required | Description | +| :------- | :------ | :------- | :---------- | +| channel | Channel | ✅ | | +| delay | number | ❌ | | +| disabled | boolean | ❌ | | +| if | string | ❌ | | +| priority | number | ❌ | | -# ChannelsChannel2 +# Channel **Properties** diff --git a/packages/project-client/documentation/models/ProjectDeliveryConfig.md b/packages/project-client/documentation/models/ProjectDeliveryConfig.md deleted file mode 100644 index 523735188..000000000 --- a/packages/project-client/documentation/models/ProjectDeliveryConfig.md +++ /dev/null @@ -1,33 +0,0 @@ -# ProjectDeliveryConfig - -**Properties** - -| Name | Type | Required | Description | -| :------- | :------------------------------ | :------- | :---------- | -| channels | ProjectDeliveryConfigChannels[] | ✅ | | - -# ProjectDeliveryConfigChannels - -**Properties** - -| Name | Type | Required | Description | -| :------- | :--------------- | :------- | :-------------------------------------------------------------------------------- | -| channel | ChannelsChannel1 | ✅ | | -| delay | number | ❌ | Delay (in seconds) since the last step, before the message is sent to the channel | -| disabled | boolean | ❌ | | -| if | string | ❌ | | -| priority | number | ❌ | | - -# ChannelsChannel1 - -**Properties** - -| Name | Type | Required | Description | -| :---------- | :----- | :------- | :------------ | -| IN_APP | string | ✅ | "in_app" | -| SLACK | string | ✅ | "slack" | -| WEB_PUSH | string | ✅ | "web_push" | -| MOBILE_PUSH | string | ✅ | "mobile_push" | -| TEAMS | string | ✅ | "teams" | -| EMAIL | string | ✅ | "email" | -| SMS | string | ✅ | "sms" | diff --git a/packages/project-client/documentation/models/SesConfig.md b/packages/project-client/documentation/models/SesConfig.md index 6c84da4f6..b7de68960 100644 --- a/packages/project-client/documentation/models/SesConfig.md +++ b/packages/project-client/documentation/models/SesConfig.md @@ -2,13 +2,12 @@ **Properties** -| Name | Type | Required | Description | -| :-------- | :------------ | :------- | :----------------------------------------------- | -| keyId | string | ✅ | AWS Access Key ID | -| region | string | ✅ | AWS Region | -| secretKey | string | ✅ | AWS Secret Key | -| endpoint | string | ❌ | HTTP endpoint to send requests to (testing only) | -| from | SesConfigFrom | ❌ | | +| Name | Type | Required | Description | +| :-------- | :------------ | :------- | :---------------- | +| keyId | string | ✅ | AWS Access Key ID | +| region | string | ✅ | AWS Region | +| secretKey | string | ✅ | AWS Secret Key | +| from | SesConfigFrom | ❌ | | # SesConfigFrom diff --git a/packages/project-client/documentation/services/BroadcastsService.md b/packages/project-client/documentation/services/BroadcastsService.md index f320be344..469eaf612 100644 --- a/packages/project-client/documentation/services/BroadcastsService.md +++ b/packages/project-client/documentation/services/BroadcastsService.md @@ -38,7 +38,7 @@ import { Client } from '@magicbell/project-client'; }); const { data } = await client.broadcasts.listBroadcasts({ - pageSize: 8, + pageSize: 2, pageAfter: 'page[after]', pageBefore: 'page[before]', }); @@ -141,8 +141,8 @@ import { Broadcast, Client } from '@magicbell/project-client'; const statusStatus = StatusStatus.ENQUEUED; const summary: Summary = { - failures: 2, - total: 9, + failures: 9, + total: 6, }; const broadcastStatus: BroadcastStatus = { diff --git a/packages/project-client/documentation/services/ChannelsService.md b/packages/project-client/documentation/services/ChannelsService.md index 47171220a..5c72528eb 100644 --- a/packages/project-client/documentation/services/ChannelsService.md +++ b/packages/project-client/documentation/services/ChannelsService.md @@ -6,7 +6,6 @@ A list of all methods in the `ChannelsService` service. Click on the method name | :---------------------------------------------------------------- | :----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | | [getProjectDeliveryconfig](#getprojectdeliveryconfig) | | | [saveProjectDeliveryconfig](#saveprojectdeliveryconfig) | | -| [saveCategoriesDeliveryconfig](#savecategoriesdeliveryconfig) | | | [getMobilePushApnsUserTokens](#getmobilepushapnsusertokens) | Lists all mobile_push tokens associated with a specific user. This endpoint is available to project administrators and returns a paginated list of tokens, including both active and revoked tokens. | | [getMobilePushApnsUserToken](#getmobilepushapnsusertoken) | Retrieves a specific mobile_push token by its ID for a given user. This endpoint is available to project administrators and requires project-level authentication. Use this to inspect token details including its status, creation date, and associated metadata. | | [discardMobilePushApnsUserToken](#discardmobilepushapnsusertoken) | Revokes a specific user's mobile_push token. This endpoint is available to project administrators and permanently invalidates the specified token. Once revoked, the token can no longer be used to access channel features. This action cannot be undone. | @@ -31,9 +30,15 @@ A list of all methods in the `ChannelsService` service. Click on the method name - HTTP Method: `GET` - Endpoint: `/channels/deliveryconfig` +**Parameters** + +| Name | Type | Required | Description | +| :--- | :----- | :------- | :---------- | +| key | string | ❌ | | + **Return Type** -`ProjectDeliveryConfig` +`CategoryDeliveryConfig` **Example Usage Code Snippet** @@ -45,7 +50,9 @@ import { Client } from '@magicbell/project-client'; token: 'YOUR_TOKEN', }); - const { data } = await client.channels.getProjectDeliveryconfig(); + const { data } = await client.channels.getProjectDeliveryconfig({ + key: 'key', + }); console.log(data); })(); @@ -58,51 +65,6 @@ import { Client } from '@magicbell/project-client'; **Parameters** -| Name | Type | Required | Description | -| :--- | :---------------------------------------------------------- | :------- | :---------------- | -| body | [ProjectDeliveryConfig](../models/ProjectDeliveryConfig.md) | ❌ | The request body. | - -**Return Type** - -`ProjectDeliveryConfig` - -**Example Usage Code Snippet** - -```typescript -import { Client, ProjectDeliveryConfig } from '@magicbell/project-client'; - -(async () => { - const client = new Client({ - token: 'YOUR_TOKEN', - }); - - const channelsChannel1 = ChannelsChannel1.IN_APP; - - const projectDeliveryConfigChannels: ProjectDeliveryConfigChannels = { - channel: channelsChannel1, - delay: 8, - disabled: true, - if: 'if', - priority: 3, - }; - - const projectDeliveryConfig: ProjectDeliveryConfig = { - channels: [projectDeliveryConfigChannels], - }; - - const { data } = await client.channels.saveProjectDeliveryconfig(projectDeliveryConfig); - - console.log(data); -})(); -``` - -## saveCategoriesDeliveryconfig - -- HTTP Method: `POST` -- Endpoint: `/channels/deliveryconfig/categories` - -**Parameters** - | Name | Type | Required | Description | | :--- | :------------------------------------------------------------ | :------- | :---------------- | | body | [CategoryDeliveryConfig](../models/CategoryDeliveryConfig.md) | ❌ | The request body. | @@ -121,23 +83,23 @@ import { CategoryDeliveryConfig, Client } from '@magicbell/project-client'; token: 'YOUR_TOKEN', }); - const channelsChannel2 = ChannelsChannel2.IN_APP; + const channel = Channel.IN_APP; const categoryDeliveryConfigChannels: CategoryDeliveryConfigChannels = { - channel: channelsChannel2, - delay: 6, + channel: channel, + delay: 1, disabled: true, if: 'if', - priority: 1, + priority: 2, }; const categoryDeliveryConfig: CategoryDeliveryConfig = { - category: 'category', channels: [categoryDeliveryConfigChannels], disabled: true, + key: 'key', }; - const { data } = await client.channels.saveCategoriesDeliveryconfig(categoryDeliveryConfig); + const { data } = await client.channels.saveProjectDeliveryconfig(categoryDeliveryConfig); console.log(data); })(); @@ -174,7 +136,7 @@ import { Client } from '@magicbell/project-client'; }); const { data } = await client.channels.getMobilePushApnsUserTokens('user_id', { - pageSize: 3, + pageSize: 4, pageAfter: 'page[after]', pageBefore: 'page[before]', }); @@ -282,7 +244,7 @@ import { Client } from '@magicbell/project-client'; }); const { data } = await client.channels.getMobilePushExpoUserTokens('user_id', { - pageSize: 6, + pageSize: 9, pageAfter: 'page[after]', pageBefore: 'page[before]', }); @@ -390,7 +352,7 @@ import { Client } from '@magicbell/project-client'; }); const { data } = await client.channels.getMobilePushFcmUserTokens('user_id', { - pageSize: 4, + pageSize: 8, pageAfter: 'page[after]', pageBefore: 'page[before]', }); @@ -498,7 +460,7 @@ import { Client } from '@magicbell/project-client'; }); const { data } = await client.channels.getSlackUserTokens('user_id', { - pageSize: 8, + pageSize: 2, pageAfter: 'page[after]', pageBefore: 'page[before]', }); @@ -606,7 +568,7 @@ import { Client } from '@magicbell/project-client'; }); const { data } = await client.channels.getTeamsUserTokens('user_id', { - pageSize: 8, + pageSize: 6, pageAfter: 'page[after]', pageBefore: 'page[before]', }); @@ -714,7 +676,7 @@ import { Client } from '@magicbell/project-client'; }); const { data } = await client.channels.getWebPushUserTokens('user_id', { - pageSize: 4, + pageSize: 8, pageAfter: 'page[after]', pageBefore: 'page[before]', }); diff --git a/packages/project-client/documentation/services/IntegrationsService.md b/packages/project-client/documentation/services/IntegrationsService.md index 4723f48ab..7509376ee 100644 --- a/packages/project-client/documentation/services/IntegrationsService.md +++ b/packages/project-client/documentation/services/IntegrationsService.md @@ -96,7 +96,7 @@ import { Client } from '@magicbell/project-client'; }); const { data } = await client.integrations.listIntegrations({ - pageSize: 3, + pageSize: 5, pageAfter: 'page[after]', pageBefore: 'page[before]', }); @@ -165,13 +165,13 @@ const payloadVersion = PayloadVersion._1; const apnsConfig: ApnsConfig = { appId: "app_id", badge: badge, - certificate: "----- BEGIN PRIVATE KEY---------- -42qmz9= ----- END PRIVATE KEY- + certificate: " BEGIN PRIVATE KEY---- +F+xV4X= +- END PRIVATE KEYYYY-- ", - keyId: "mollit dol", + keyId: "reprehende", payloadVersion: payloadVersion, - teamId: "enimmollit" + teamId: "doloreirur" }; const { data } = await client.integrations.saveApnsIntegration( @@ -527,10 +527,9 @@ const fcmConfig: FcmConfig = { clientEmail: "client_email", clientId: "client_id", clientX509CertUrl: "client_x509_cert_url", - privateKey: "BEGINNQX-------- -B+JvPM/f7Ms== -------ENDEPJVIYYY----- -", + privateKey: "BEGINFRD-------- +jGM +-------ENDAV LVGUL----------", privateKeyId: "private_key_id", projectId: "project_id", tokenUri: "token_uri", @@ -774,7 +773,7 @@ import { Client, InboxConfig } from '@magicbell/project-client'; const banner: Banner = { backgroundColor: 'backgroundColor', - backgroundOpacity: 4.92, + backgroundOpacity: 2.38, fontSize: 'fontSize', textColor: 'textColor', }; @@ -1362,7 +1361,6 @@ import { Client, SesConfig } from '@magicbell/project-client'; }; const sesConfig: SesConfig = { - endpoint: 'endpoint', from: sesConfigFrom, keyId: 'key_id', region: 'region', @@ -1482,10 +1480,10 @@ import { Client, SlackConfig } from '@magicbell/project-client'; }); const slackConfig: SlackConfig = { - appId: 'QTEIRE', - clientId: '7201.6182620', - clientSecret: 'ex dolore ametauteDuis culpaquis', - signingSecret: 'eu ex animmollit sunt consequat ', + appId: 'JJ3IB53', + clientId: '18420.629853175', + clientSecret: 'eudolore amet nullaanim et autel', + signingSecret: 'minim ea fugiat in enimculpa dol', }; const { data } = await client.integrations.saveSlackIntegration(slackConfig); @@ -1836,7 +1834,7 @@ import { Client, TwilioConfig } from '@magicbell/project-client'; accountSid: 'account_sid', apiKey: 'api_key', apiSecret: 'api_secret', - from: '+0528138710599', + from: '+608', region: twilioConfigRegion, }; diff --git a/packages/project-client/documentation/services/JwtService.md b/packages/project-client/documentation/services/JwtService.md index 58dfd3b4e..eb3b16f22 100644 --- a/packages/project-client/documentation/services/JwtService.md +++ b/packages/project-client/documentation/services/JwtService.md @@ -41,7 +41,7 @@ import { Client } from '@magicbell/project-client'; }); const { data } = await client.jwt.fetchProjectTokens({ - pageSize: 5, + pageSize: 9, pageAfter: 'page[after]', pageBefore: 'page[before]', }); @@ -78,7 +78,7 @@ import { Client, CreateProjectTokenRequest } from '@magicbell/project-client'; }); const createProjectTokenRequest: CreateProjectTokenRequest = { - expiry: 8, + expiry: 6, name: 'name', }; @@ -150,7 +150,7 @@ import { Client, CreateUserTokenRequest } from '@magicbell/project-client'; const createUserTokenRequest: CreateUserTokenRequest = { email: 'email', - expiry: 8, + expiry: 10, externalId: 'external_id', name: 'name', }; diff --git a/packages/project-client/src/http/client.ts b/packages/project-client/src/http/client.ts index 597626168..186cf2a22 100644 --- a/packages/project-client/src/http/client.ts +++ b/packages/project-client/src/http/client.ts @@ -21,15 +21,15 @@ export class HttpClient { this.requestHandlerChain.addHandler(new TerminatingHandler()); } - call(request: Request): Promise> { + call(request: Request): Promise> { return this.requestHandlerChain.callChain(request); } - async *stream(request: Request): AsyncGenerator> { + async *stream(request: Request): AsyncGenerator> { yield* this.requestHandlerChain.streamChain(request); } - public async callPaginated(request: Request): Promise> { + public async callPaginated(request: Request): Promise> { const response = await this.call(request as any); if (!response.data) { @@ -50,7 +50,7 @@ export class HttpClient { this.config = config; } - private getPage(request: Request, data: FullResponse): Page { + private getPage(request: Request, data: FullResponse): Page { if (!request.pagination) { throw new Error('getPage called for request without pagination property'); } diff --git a/packages/project-client/src/http/handlers/auth-handler.ts b/packages/project-client/src/http/handlers/auth-handler.ts index 8fcf99d64..c338e8325 100644 --- a/packages/project-client/src/http/handlers/auth-handler.ts +++ b/packages/project-client/src/http/handlers/auth-handler.ts @@ -5,27 +5,27 @@ import { HttpResponse, RequestHandler } from '../types.js'; export class AuthHandler implements RequestHandler { next?: RequestHandler; - public async handle(request: Request): Promise> { + public async handle(request: Request): Promise> { const requestWithAuth = this.addAccessTokenHeader(request); if (!this.next) { throw new Error(`No next handler set in ${AuthHandler.name}`); } - return this.next.handle(requestWithAuth); + return this.next.handle(requestWithAuth); } - public async *stream(request: Request): AsyncGenerator> { + public async *stream(request: Request): AsyncGenerator> { const requestWithAuth = this.addAccessTokenHeader(request); if (!this.next) { throw new Error(`No next handler set in ${AuthHandler.name}`); } - yield* this.next.stream(requestWithAuth); + yield* this.next.stream(requestWithAuth); } - private addAccessTokenHeader(request: Request): Request { + private addAccessTokenHeader(request: Request): Request { const { token } = request.config; if (!token) { return request; diff --git a/packages/project-client/src/http/handlers/handler-chain.ts b/packages/project-client/src/http/handlers/handler-chain.ts index 7f55f13db..e794dac84 100644 --- a/packages/project-client/src/http/handlers/handler-chain.ts +++ b/packages/project-client/src/http/handlers/handler-chain.ts @@ -12,19 +12,19 @@ export class RequestHandlerChain { this.handlers.push(handler); } - async callChain(request: Request): Promise> { + async callChain(request: Request): Promise> { if (!this.handlers.length) { throw new Error('No handlers added to the chain'); } - return this.handlers[0].handle(request); + return this.handlers[0].handle(request); } - async *streamChain(request: Request): AsyncGenerator> { + async *streamChain(request: Request): AsyncGenerator> { if (!this.handlers.length) { throw new Error('No handlers added to the chain'); } - yield* this.handlers[0].stream(request); + yield* this.handlers[0].stream(request); } } diff --git a/packages/project-client/src/http/handlers/hook-handler.ts b/packages/project-client/src/http/handlers/hook-handler.ts index 0850a72c1..d7a1429e2 100644 --- a/packages/project-client/src/http/handlers/hook-handler.ts +++ b/packages/project-client/src/http/handlers/hook-handler.ts @@ -8,7 +8,7 @@ export class HookHandler implements RequestHandler { constructor(private readonly hook: Hook) {} - async handle(request: Request): Promise> { + async handle(request: Request): Promise> { if (!this.next) { throw new Error('No next handler set in hook handler.'); } @@ -19,7 +19,7 @@ export class HookHandler implements RequestHandler { const nextRequest = await hook.beforeRequest(request, hookParams); - const response = await this.next.handle(nextRequest); + const response = await this.next.handle(nextRequest); if (response.metadata.status < 400) { return await hook.afterResponse(nextRequest, response, hookParams); @@ -28,7 +28,7 @@ export class HookHandler implements RequestHandler { throw await hook.onError(nextRequest, response, hookParams); } - async *stream(request: Request): AsyncGenerator> { + async *stream(request: Request): AsyncGenerator> { if (!this.next) { throw new Error('No next handler set in hook handler.'); } @@ -39,7 +39,7 @@ export class HookHandler implements RequestHandler { const nextRequest = await hook.beforeRequest(request, hookParams); - const stream = this.next.stream(nextRequest); + const stream = this.next.stream(nextRequest); for await (const response of stream) { if (response.metadata.status < 400) { @@ -50,7 +50,7 @@ export class HookHandler implements RequestHandler { } } - private getHookParams(_request: Request): Map { + private getHookParams(_request: Request): Map { const hookParams: Map = new Map(); return hookParams; } diff --git a/packages/project-client/src/http/handlers/request-validation-handler.ts b/packages/project-client/src/http/handlers/request-validation-handler.ts index b35511fa9..6dc0056d5 100644 --- a/packages/project-client/src/http/handlers/request-validation-handler.ts +++ b/packages/project-client/src/http/handlers/request-validation-handler.ts @@ -4,27 +4,27 @@ import { ContentType, HttpResponse, RequestHandler } from '../types.js'; export class RequestValidationHandler implements RequestHandler { next?: RequestHandler; - async handle(request: Request): Promise> { + async handle(request: Request): Promise> { if (!this.next) { throw new Error('No next handler set in ContentTypeHandler.'); } this.validateRequest(request); - return this.next.handle(request); + return this.next.handle(request); } - async *stream(request: Request): AsyncGenerator> { + async *stream(request: Request): AsyncGenerator> { if (!this.next) { throw new Error('No next handler set in ContentTypeHandler.'); } this.validateRequest(request); - yield* this.next.stream(request); + yield* this.next.stream(request); } - validateRequest(request: Request): void { + validateRequest(request: Request): void { if (request.requestContentType === ContentType.Json) { request.body = JSON.stringify(request.requestSchema?.parse(request.body)); } else if ( @@ -42,7 +42,7 @@ export class RequestValidationHandler implements RequestHandler { } } - toFormUrlEncoded(request: Request): string { + toFormUrlEncoded(request: Request): string { if (request.body === undefined) { return ''; } diff --git a/packages/project-client/src/http/handlers/response-validation-handler.ts b/packages/project-client/src/http/handlers/response-validation-handler.ts index d1fa7370a..eec00a539 100644 --- a/packages/project-client/src/http/handlers/response-validation-handler.ts +++ b/packages/project-client/src/http/handlers/response-validation-handler.ts @@ -1,24 +1,25 @@ import { ZodUndefined } from 'zod'; -import { Request } from '../transport/request.js'; +import { Request, ResponseDefinition } from '../transport/request.js'; import { ContentType, HttpResponse, RequestHandler } from '../types.js'; +import { ResponseMatcher } from '../utils/response-matcher.js'; export class ResponseValidationHandler implements RequestHandler { next?: RequestHandler; - async handle(request: Request): Promise> { - const response = await this.next!.handle(request); + async handle(request: Request): Promise> { + const response = await this.next!.handle(request); - return this.decodeBody(request, response); + return this.decodeBody(request, response); } - async *stream(request: Request): AsyncGenerator> { - const stream = this.next!.stream(request); + async *stream(request: Request): AsyncGenerator> { + const stream = this.next!.stream(request); for await (const response of stream) { - const responseChunks = this.splitByDataChunks(response); + const responseChunks = this.splitByDataChunks(response); for (const chunk of responseChunks) { - yield this.decodeBody(request, chunk); + yield this.decodeBody(request, chunk); } } } @@ -39,70 +40,91 @@ export class ResponseValidationHandler implements RequestHandler { })); } - private decodeBody(request: Request, response: HttpResponse): HttpResponse { - if (!this.hasContent(request, response)) { - return response; - } - - if (request.responseContentType === ContentType.Binary || request.responseContentType === ContentType.Image) { - return this.decodeFile(request, response); - } + private decodeBody(request: Request, response: HttpResponse): HttpResponse { + const responseMatcher = new ResponseMatcher(request.responses); + const responseDefinition = responseMatcher.getResponseDefinition(response); - if (request.responseContentType === ContentType.MultipartFormData) { - return this.decodeMultipartFormData(request, response); + if (!responseDefinition || !this.hasContent(responseDefinition, response)) { + return response; } - if (request.responseContentType === ContentType.Text || request.responseContentType === ContentType.Xml) { - return this.decodeText(request, response); - } + const contentType = responseDefinition.contentType; + const contentTypeHandlers: { + [key: string]: (req: Request, resDef: ResponseDefinition, res: HttpResponse) => HttpResponse; + } = { + [ContentType.Binary]: this.decodeFile, + [ContentType.Image]: this.decodeFile, + [ContentType.MultipartFormData]: this.decodeMultipartFormData, + [ContentType.Text]: this.decodeText, + [ContentType.Xml]: this.decodeText, + [ContentType.FormUrlEncoded]: this.decodeFormUrlEncoded, + [ContentType.EventStream]: this.decodeEventStream, + }; - if (request.responseContentType === ContentType.FormUrlEncoded) { - return this.decodeFormUrlEncoded(request, response); + if (contentTypeHandlers[contentType]) { + return contentTypeHandlers[contentType].call(this, request, responseDefinition, response); } - if ( - request.responseContentType === ContentType.EventStream || - response.metadata.headers['content-type'].includes('text/event-stream') - ) { - return this.decodeEventStream(request, response); + if (response.metadata.headers['content-type']?.includes('text/event-stream')) { + return this.decodeEventStream(request, responseDefinition, response); } - return this.decodeJson(request, response); + return this.decodeJson(request, responseDefinition, response); } - private decodeFile(request: Request, response: HttpResponse): HttpResponse { + private decodeFile( + request: Request, + responseDefinition: ResponseDefinition, + response: HttpResponse, + ): HttpResponse { return { ...response, - data: this.validate(request, response.raw), + data: this.validate(request, responseDefinition, response.raw), }; } - private decodeMultipartFormData(request: Request, response: HttpResponse): HttpResponse { + private decodeMultipartFormData( + request: Request, + responseDefinition: ResponseDefinition, + response: HttpResponse, + ): HttpResponse { const formData = this.fromFormData(response.raw); return { ...response, - data: this.validate(request, formData), + data: this.validate(request, responseDefinition, formData), }; } - private decodeText(request: Request, response: HttpResponse): HttpResponse { + private decodeText( + request: Request, + responseDefinition: ResponseDefinition, + response: HttpResponse, + ): HttpResponse { const decodedBody = new TextDecoder().decode(response.raw); return { ...response, - data: this.validate(request, decodedBody), + data: this.validate(request, responseDefinition, decodedBody), }; } - private decodeFormUrlEncoded(request: Request, response: HttpResponse): HttpResponse { + private decodeFormUrlEncoded( + request: Request, + responseDefinition: ResponseDefinition, + response: HttpResponse, + ): HttpResponse { const decodedBody = new TextDecoder().decode(response.raw); const urlEncoded = this.fromUrlEncoded(decodedBody); return { ...response, - data: this.validate(request, urlEncoded), + data: this.validate(request, responseDefinition, urlEncoded), }; } - private decodeEventStream(request: Request, response: HttpResponse): HttpResponse { + private decodeEventStream( + request: Request, + responseDefinition: ResponseDefinition, + response: HttpResponse, + ): HttpResponse { let decodedBody = new TextDecoder().decode(response.raw); if (decodedBody.startsWith('data: ')) { decodedBody = decodedBody.substring(6); @@ -111,29 +133,35 @@ export class ResponseValidationHandler implements RequestHandler { const json = JSON.parse(decodedBody); return { ...response, - data: this.validate(request, json), + data: this.validate(request, responseDefinition, json), }; } - private decodeJson(request: Request, response: HttpResponse): HttpResponse { + private decodeJson( + request: Request, + responseDefinition: ResponseDefinition, + response: HttpResponse, + ): HttpResponse { const decodedBody = new TextDecoder().decode(response.raw); const json = JSON.parse(decodedBody); return { ...response, - data: this.validate(request, json), + data: this.validate(request, responseDefinition, json), }; } - private validate(request: Request, data: any): T { + private validate(request: Request, response: ResponseDefinition, data: any): T { if (request.validation?.responseValidation) { - return request.responseSchema.parse(data); + return response.schema.parse(data); } return data; } - private hasContent(request: Request, response: HttpResponse): boolean { + private hasContent(responseDefinition: ResponseDefinition, response: HttpResponse): boolean { return ( - !!request.responseSchema && !(request.responseSchema instanceof ZodUndefined) && response.metadata.status !== 204 + !!responseDefinition.schema && + !(responseDefinition.schema instanceof ZodUndefined) && + response.metadata.status !== 204 ); } diff --git a/packages/project-client/src/http/handlers/retry-handler.ts b/packages/project-client/src/http/handlers/retry-handler.ts index e9ac00351..bfe4adc94 100644 --- a/packages/project-client/src/http/handlers/retry-handler.ts +++ b/packages/project-client/src/http/handlers/retry-handler.ts @@ -5,14 +5,14 @@ import { HttpResponse, RequestHandler } from '../types.js'; export class RetryHandler implements RequestHandler { next?: RequestHandler; - async handle(request: Request): Promise> { + async handle(request: Request): Promise> { if (!this.next) { throw new Error('No next handler set in retry handler.'); } for (let attempt = 1; attempt <= request.retry.attempts; attempt++) { try { - return await this.next.handle(request); + return await this.next.handle(request); } catch (error: any) { if (!this.shouldRetry(error) || attempt === request.retry.attempts) { throw error; @@ -24,14 +24,14 @@ export class RetryHandler implements RequestHandler { throw new Error('Error retrying request.'); } - async *stream(request: Request): AsyncGenerator> { + async *stream(request: Request): AsyncGenerator> { if (!this.next) { throw new Error('No next handler set in retry handler.'); } for (let attempt = 1; attempt <= request.retry.attempts; attempt++) { try { - yield* this.next.stream(request); + yield* this.next.stream(request); return; } catch (error: any) { if (!this.shouldRetry(error) || attempt === request.retry.attempts) { diff --git a/packages/project-client/src/http/handlers/terminating-handler.ts b/packages/project-client/src/http/handlers/terminating-handler.ts index 43c7b77af..4225d9646 100644 --- a/packages/project-client/src/http/handlers/terminating-handler.ts +++ b/packages/project-client/src/http/handlers/terminating-handler.ts @@ -4,11 +4,11 @@ import { RequestFetchAdapter } from '../transport/request-fetch-adapter.js'; import { HttpResponse, RequestHandler } from '../types.js'; export class TerminatingHandler implements RequestHandler { - async handle(request: Request): Promise> { - return new RequestFetchAdapter(request).send(); + async handle(request: Request): Promise> { + return new RequestFetchAdapter(request).send(); } - async *stream(request: Request): AsyncGenerator> { - yield* new RequestFetchAdapter(request).stream(); + async *stream(request: Request): AsyncGenerator> { + yield* new RequestFetchAdapter(request).stream(); } } diff --git a/packages/project-client/src/http/transport/request-builder.ts b/packages/project-client/src/http/transport/request-builder.ts index e315a6096..0ba603923 100644 --- a/packages/project-client/src/http/transport/request-builder.ts +++ b/packages/project-client/src/http/transport/request-builder.ts @@ -3,10 +3,16 @@ import z, { ZodType } from 'zod'; import { Environment } from '../environment.js'; import { SerializationStyle } from '../serialization/base-serializer.js'; import { ContentType, HttpMethod, RequestConfig, RetryOptions, SdkConfig, ValidationOptions } from '../types.js'; -import { CreateRequestParameters, Request, RequestPagination, RequestParameter } from './request.js'; +import { + CreateRequestParameters, + Request, + RequestPagination, + RequestParameter, + ResponseDefinition, +} from './request.js'; -export class RequestBuilder { - private params: CreateRequestParameters; +export class RequestBuilder { + private params: CreateRequestParameters; constructor() { this.params = { @@ -14,10 +20,9 @@ export class RequestBuilder { method: 'GET', path: '', config: {}, - responseSchema: z.any(), + responses: [], requestSchema: z.any(), requestContentType: ContentType.Json, - responseContentType: ContentType.Json, retry: { attempts: 3, delayMs: 150, @@ -31,7 +36,7 @@ export class RequestBuilder { }; } - setRetryAttempts(sdkConfig?: SdkConfig, requestConfig?: RequestConfig): RequestBuilder { + setRetryAttempts(sdkConfig?: SdkConfig, requestConfig?: RequestConfig): RequestBuilder { if (requestConfig?.retry?.attempts !== undefined) { this.params.retry.attempts = requestConfig.retry.attempts; } else if (sdkConfig?.retry?.attempts !== undefined) { @@ -41,7 +46,7 @@ export class RequestBuilder { return this; } - setRetryDelayMs(sdkConfig?: SdkConfig, requestConfig?: RequestConfig): RequestBuilder { + setRetryDelayMs(sdkConfig?: SdkConfig, requestConfig?: RequestConfig): RequestBuilder { if (requestConfig?.retry?.delayMs !== undefined) { this.params.retry.delayMs = requestConfig.retry.delayMs; } else if (sdkConfig?.retry?.delayMs !== undefined) { @@ -51,7 +56,7 @@ export class RequestBuilder { return this; } - setResponseValidation(sdkConfig: SdkConfig, requestConfig?: RequestConfig): RequestBuilder { + setResponseValidation(sdkConfig: SdkConfig, requestConfig?: RequestConfig): RequestBuilder { if (requestConfig?.validation?.responseValidation !== undefined) { this.params.validation.responseValidation = requestConfig.validation.responseValidation; } else if (sdkConfig?.validation?.responseValidation !== undefined) { @@ -61,7 +66,7 @@ export class RequestBuilder { return this; } - setBaseUrl(sdkConfig: SdkConfig): RequestBuilder { + setBaseUrl(sdkConfig: SdkConfig): RequestBuilder { if (sdkConfig?.baseUrl !== undefined) { this.params.baseUrl = sdkConfig.baseUrl; } @@ -69,54 +74,49 @@ export class RequestBuilder { return this; } - setMethod(method: HttpMethod): RequestBuilder { + setMethod(method: HttpMethod): RequestBuilder { this.params.method = method; return this; } - setPath(path: string): RequestBuilder { + setPath(path: string): RequestBuilder { this.params.path = path; return this; } - setConfig(config: SdkConfig): RequestBuilder { + setConfig(config: SdkConfig): RequestBuilder { this.params.config = config; return this; } - setRequestContentType(contentType: ContentType): RequestBuilder { + setRequestContentType(contentType: ContentType): RequestBuilder { this.params.requestContentType = contentType; return this; } - setResponseContentType(contentType: ContentType): RequestBuilder { - this.params.responseContentType = contentType; - return this; - } - - setRequestSchema(requestSchema: ZodType): RequestBuilder { + setRequestSchema(requestSchema: ZodType): RequestBuilder { this.params.requestSchema = requestSchema; return this; } - setResponseSchema(responseSchema: ZodType): RequestBuilder { - this.params.responseSchema = responseSchema; + setPagination(pagination: RequestPagination): RequestBuilder { + this.params.pagination = pagination; return this; } - setPagination(pagination: RequestPagination): RequestBuilder { - this.params.pagination = pagination; + addResponse(response: ResponseDefinition): RequestBuilder { + this.params.responses.push(response); return this; } - addBody(body?: any): RequestBuilder { + addBody(body?: any): RequestBuilder { if (body !== undefined) { this.params.body = body; } return this; } - addPathParam(param: Partial): RequestBuilder { + addPathParam(param: Partial): RequestBuilder { if (param.value === undefined || param.key === undefined) { return this; } @@ -134,7 +134,7 @@ export class RequestBuilder { return this; } - addQueryParam(param: Partial): RequestBuilder { + addQueryParam(param: Partial): RequestBuilder { if (param.value === undefined || param.key === undefined) { return this; } @@ -152,7 +152,7 @@ export class RequestBuilder { return this; } - addHeaderParam(param: Partial): RequestBuilder { + addHeaderParam(param: Partial): RequestBuilder { if (param.value === undefined || param.key === undefined) { return this; } @@ -170,7 +170,7 @@ export class RequestBuilder { return this; } - public build(): Request { - return new Request(this.params); + public build(): Request { + return new Request(this.params); } } diff --git a/packages/project-client/src/http/transport/request-fetch-adapter.ts b/packages/project-client/src/http/transport/request-fetch-adapter.ts index 30f04f80e..36498f300 100644 --- a/packages/project-client/src/http/transport/request-fetch-adapter.ts +++ b/packages/project-client/src/http/transport/request-fetch-adapter.ts @@ -1,5 +1,6 @@ import { HttpError } from '../error.js'; import { HttpMetadata, HttpMethod, HttpResponse } from '../types.js'; +import { LineDecoder } from '../utils/line-decoder.js'; import { Request } from './request.js'; interface HttpAdapter { @@ -10,7 +11,7 @@ interface HttpAdapter { export class RequestFetchAdapter implements HttpAdapter { private requestInit: RequestInit = {}; - constructor(private request: Request) { + constructor(private request: Request) { this.setMethod(request.method); this.setHeaders(request.getHeaders()); this.setBody(request.body); @@ -53,15 +54,26 @@ export class RequestFetchAdapter implements HttpAdapter { } const reader = response.body.getReader(); + const lineDecoder = new LineDecoder(); while (true) { const { done, value } = await reader.read(); if (done) { break; } + + for (const line of lineDecoder.splitLines(value)) { + yield { + metadata, + raw: line, + }; + } + } + + for (const line of lineDecoder.flush()) { yield { metadata, - raw: value, + raw: line, }; } } diff --git a/packages/project-client/src/http/transport/request.ts b/packages/project-client/src/http/transport/request.ts index a523ff59c..e5c892f8b 100644 --- a/packages/project-client/src/http/transport/request.ts +++ b/packages/project-client/src/http/transport/request.ts @@ -7,7 +7,13 @@ import { PathSerializer } from '../serialization/path-serializer.js'; import { QuerySerializer } from '../serialization/query-serializer.js'; import { ContentType, HttpMethod, RetryOptions, SdkConfig, ValidationOptions } from '../types.js'; -export interface CreateRequestParameters { +export interface ResponseDefinition { + schema: ZodType; + contentType: ContentType; + status: number; +} + +export interface CreateRequestParameters { baseUrl: string; method: HttpMethod; body?: any; @@ -16,10 +22,9 @@ export interface CreateRequestParameters { pathParams: Map; path: string; config: SdkConfig; - responseSchema: ZodType; + responses: ResponseDefinition[]; requestSchema: ZodType; requestContentType: ContentType; - responseContentType: ContentType; validation: ValidationOptions; retry: RetryOptions; pagination?: RequestPagination; @@ -41,7 +46,7 @@ export interface RequestPagination { pageSchema?: ZodType; } -export class Request { +export class Request { public baseUrl = ''; public headers: Map = new Map(); @@ -58,14 +63,12 @@ export class Request { public config: SdkConfig; - public responseSchema: ZodType; + public responses: ResponseDefinition[]; public requestSchema: ZodType; public requestContentType: ContentType; - public responseContentType: ContentType; - public validation: ValidationOptions = {} as any; public retry: RetryOptions = {} as any; @@ -74,7 +77,7 @@ export class Request { private readonly pathPattern: string; - constructor(params: CreateRequestParameters) { + constructor(params: CreateRequestParameters) { this.baseUrl = params.baseUrl; this.method = params.method; this.pathPattern = params.path; @@ -84,10 +87,9 @@ export class Request { this.pathParams = params.pathParams; this.headers = params.headers; this.queryParams = params.queryParams; - this.responseSchema = params.responseSchema; + this.responses = params.responses; this.requestSchema = params.requestSchema; this.requestContentType = params.requestContentType; - this.responseContentType = params.responseContentType; this.retry = params.retry; this.validation = params.validation; this.pagination = params.pagination; @@ -171,11 +173,13 @@ export class Request { public constructFullUrl(): string { const queryString = new QuerySerializer().serialize(this.queryParams); const path = this.constructPath(); - return `${this.baseUrl}${path}${queryString}`; + const baseUrl = this.baseUrl; + + return `${baseUrl}${path}${queryString}`; } - public copy(overrides?: Partial>) { - const createRequestParams: CreateRequestParameters = { + public copy(overrides?: Partial) { + const createRequestParams: CreateRequestParameters = { baseUrl: overrides?.baseUrl ?? this.baseUrl, method: overrides?.method ?? this.method, path: overrides?.path ?? this.path, @@ -184,14 +188,13 @@ export class Request { pathParams: overrides?.pathParams ?? this.pathParams, queryParams: overrides?.queryParams ?? this.queryParams, headers: overrides?.headers ?? this.headers, - responseSchema: overrides?.responseSchema ?? this.responseSchema, + responses: overrides?.responses ?? this.responses, requestSchema: overrides?.requestSchema ?? this.requestSchema, requestContentType: overrides?.requestContentType ?? this.requestContentType, - responseContentType: overrides?.responseContentType ?? this.responseContentType, retry: overrides?.retry ?? this.retry, validation: overrides?.validation ?? this.validation, }; - return new Request({ + return new Request({ ...createRequestParams, ...overrides, }); @@ -205,7 +208,7 @@ export class Request { return new HeaderSerializer().serialize(this.headers); } - public nextPage() { + public nextPage(): void { if (!this.pagination) { return; } @@ -230,15 +233,15 @@ export class Request { private getAllParams(): RequestParameter[] { const allParams: RequestParameter[] = []; - this.headers.forEach((val, key) => { + this.headers.forEach((val, _) => { allParams.push(val); }); - this.queryParams.forEach((val, key) => { + this.queryParams.forEach((val, _) => { allParams.push(val); }); - this.pathParams.forEach((val, key) => { + this.pathParams.forEach((val, _) => { allParams.push(val); }); diff --git a/packages/project-client/src/http/transport/transport-hook-adapter.ts b/packages/project-client/src/http/transport/transport-hook-adapter.ts index d256295d5..c2b07cef0 100644 --- a/packages/project-client/src/http/transport/transport-hook-adapter.ts +++ b/packages/project-client/src/http/transport/transport-hook-adapter.ts @@ -7,7 +7,7 @@ import { Request, RequestParameter } from './request.js'; export class TransportHookAdapter { private hook: CustomHook = new CustomHook(); - public async beforeRequest(request: Request, params: Map): Promise> { + public async beforeRequest(request: Request, params: Map): Promise { const hookRequest = this.requestToHookRequest(request); const newRequest = await this.hook.beforeRequest(hookRequest, params); @@ -26,7 +26,7 @@ export class TransportHookAdapter { } public async afterResponse( - request: Request, + request: Request, response: HttpResponse, params: Map, ): Promise> { @@ -34,16 +34,12 @@ export class TransportHookAdapter { return this.hook.afterResponse(hookRequest, response, params); } - public async onError( - request: Request, - response: HttpResponse, - params: Map, - ): Promise { + public async onError(request: Request, response: HttpResponse, params: Map): Promise { const hookRequest = this.requestToHookRequest(request); return this.hook.onError(hookRequest, response, params); } - private requestToHookRequest(request: Request): HttpRequest { + private requestToHookRequest(request: Request): HttpRequest { const hookHeaders: Map = new Map(); request.headers.forEach((header, key) => { hookHeaders.set(key, header.value); diff --git a/packages/project-client/src/http/types.ts b/packages/project-client/src/http/types.ts index fb17dafc7..5fc1ccbc1 100644 --- a/packages/project-client/src/http/types.ts +++ b/packages/project-client/src/http/types.ts @@ -29,8 +29,8 @@ export interface HttpResponse { export interface RequestHandler { next?: RequestHandler; - handle(request: Request): Promise>; - stream(request: Request): AsyncGenerator>; + handle(request: Request): Promise>; + stream(request: Request): AsyncGenerator>; } export enum ContentType { @@ -44,6 +44,7 @@ export enum ContentType { Text = 'text', MultipartFormData = 'multipartFormData', EventStream = 'eventStream', + NoContent = 'noContent', } export interface Options { diff --git a/packages/project-client/src/http/utils/line-decoder.ts b/packages/project-client/src/http/utils/line-decoder.ts new file mode 100644 index 000000000..822414b87 --- /dev/null +++ b/packages/project-client/src/http/utils/line-decoder.ts @@ -0,0 +1,35 @@ +export class LineDecoder { + private lineBuffer = ''; + private decoder = new TextDecoder(); + private encoder = new TextEncoder(); + + /** + * Splits the given chunk into lines. + * Stores incomplete lines in a buffer and returns them when the next chunk arrives. + */ + public splitLines(chunk: Uint8Array): Uint8Array[] { + this.lineBuffer += this.decoder.decode(chunk); + + let lineEndIndex; + const lines: Uint8Array[] = []; + while ((lineEndIndex = this.lineBuffer.indexOf('\n')) >= 0) { + const line = this.lineBuffer.slice(0, lineEndIndex + 1); // Include the newline character + this.lineBuffer = this.lineBuffer.slice(lineEndIndex + 1); + if (line.length > 1) { + lines.push(this.encoder.encode(line)); + } + } + + return lines; + } + + /** Returns the remaining lines in the buffer. */ + public flush(): Uint8Array[] { + if (this.lineBuffer.length === 0) { + return []; + } + const lines = [this.encoder.encode(this.lineBuffer)]; + this.lineBuffer = ''; + return lines; + } +} diff --git a/packages/project-client/src/http/utils/response-matcher.ts b/packages/project-client/src/http/utils/response-matcher.ts new file mode 100644 index 000000000..70af48c92 --- /dev/null +++ b/packages/project-client/src/http/utils/response-matcher.ts @@ -0,0 +1,56 @@ +import { ResponseDefinition } from '../transport/request.js'; +import { ContentType, HttpResponse } from '../types.js'; + +export class ResponseMatcher { + constructor(private responses: ResponseDefinition[]) {} + + public getResponseDefinition(response: HttpResponse): ResponseDefinition | undefined { + const rawContentType = response.metadata.headers['content-type']?.toLocaleLowerCase() || ''; + const contentType = this.getContentTypeDefinition(rawContentType); + const statusCode = response.metadata.status; + + if (!this.responses.length) { + return; + } + + if (this.responses.length === 1) { + return this.responses[0]; + } + + return this.responses.find((response) => { + return response.contentType === contentType && response.status === statusCode; + }); + } + + private getContentTypeDefinition(contentType: string): ContentType { + if (contentType.startsWith('application/') && contentType.includes('xml')) { + return ContentType.Xml; + } + + if (contentType.toLowerCase() === 'application/x-www-form-urlencoded') { + return ContentType.FormUrlEncoded; + } + + if (contentType.toLowerCase() === 'text/event-stream') { + return ContentType.EventStream; + } + + if (contentType.toLowerCase().startsWith('text/')) { + return ContentType.Text; + } + + if (contentType.toLowerCase().startsWith('image/')) { + return ContentType.Image; + } + + if (contentType.toLowerCase() === 'application/octet-stream') { + return ContentType.Binary; + } + + if (contentType.toLowerCase() === 'application/json') { + return ContentType.Json; + } + + return ContentType.Json; + } +} diff --git a/packages/project-client/src/services/broadcasts/broadcasts.ts b/packages/project-client/src/services/broadcasts/broadcasts.ts index 0c570b37b..a67cf2010 100644 --- a/packages/project-client/src/services/broadcasts/broadcasts.ts +++ b/packages/project-client/src/services/broadcasts/broadcasts.ts @@ -20,15 +20,18 @@ export class BroadcastsService extends BaseService { params?: ListBroadcastsParams, requestConfig?: RequestConfig, ): Promise> { - const request = new RequestBuilder() + const request = new RequestBuilder() .setBaseUrl(this.config) .setConfig(this.config) .setMethod('GET') .setPath('/broadcasts') .setRequestSchema(z.any()) - .setResponseSchema(arrayOfBroadcastsResponse) .setRequestContentType(ContentType.Json) - .setResponseContentType(ContentType.Json) + .addResponse({ + schema: arrayOfBroadcastsResponse, + contentType: ContentType.Json, + status: 200, + }) .setRetryAttempts(this.config, requestConfig) .setRetryDelayMs(this.config, requestConfig) .setResponseValidation(this.config, requestConfig) @@ -53,15 +56,18 @@ export class BroadcastsService extends BaseService { * @returns {Promise>} Created */ async createBroadcast(body: Broadcast, requestConfig?: RequestConfig): Promise> { - const request = new RequestBuilder() + const request = new RequestBuilder() .setBaseUrl(this.config) .setConfig(this.config) .setMethod('POST') .setPath('/broadcasts') .setRequestSchema(broadcastRequest) - .setResponseSchema(broadcastResponse) .setRequestContentType(ContentType.Json) - .setResponseContentType(ContentType.Json) + .addResponse({ + schema: broadcastResponse, + contentType: ContentType.Json, + status: 201, + }) .setRetryAttempts(this.config, requestConfig) .setRetryDelayMs(this.config, requestConfig) .setResponseValidation(this.config, requestConfig) @@ -77,15 +83,18 @@ export class BroadcastsService extends BaseService { * @returns {Promise>} OK */ async fetchBroadcast(broadcastId: string, requestConfig?: RequestConfig): Promise> { - const request = new RequestBuilder() + const request = new RequestBuilder() .setBaseUrl(this.config) .setConfig(this.config) .setMethod('GET') .setPath('/broadcasts/{broadcast_id}') .setRequestSchema(z.any()) - .setResponseSchema(broadcastResponse) .setRequestContentType(ContentType.Json) - .setResponseContentType(ContentType.Json) + .addResponse({ + schema: broadcastResponse, + contentType: ContentType.Json, + status: 200, + }) .setRetryAttempts(this.config, requestConfig) .setRetryDelayMs(this.config, requestConfig) .setResponseValidation(this.config, requestConfig) diff --git a/packages/project-client/src/services/channels/channels.ts b/packages/project-client/src/services/channels/channels.ts index 3c628e0ec..8be081198 100644 --- a/packages/project-client/src/services/channels/channels.ts +++ b/packages/project-client/src/services/channels/channels.ts @@ -37,15 +37,11 @@ import { MetadataFcmToken, metadataFcmTokenResponse } from './models/metadata-fc import { MetadataSlackToken, metadataSlackTokenResponse } from './models/metadata-slack-token.js'; import { MetadataTeamsToken, metadataTeamsTokenResponse } from './models/metadata-teams-token.js'; import { MetadataWebPushToken, metadataWebPushTokenResponse } from './models/metadata-web-push-token.js'; -import { - ProjectDeliveryConfig, - projectDeliveryConfigRequest, - projectDeliveryConfigResponse, -} from './models/project-delivery-config.js'; import { GetMobilePushApnsUserTokensParams, GetMobilePushExpoUserTokensParams, GetMobilePushFcmUserTokensParams, + GetProjectDeliveryconfigParams, GetSlackUserTokensParams, GetTeamsUserTokensParams, GetWebPushUserTokensParams, @@ -54,68 +50,56 @@ import { export class ChannelsService extends BaseService { /** * - * @returns {Promise>} OK + * @param {string} [key] - + * @returns {Promise>} OK */ - async getProjectDeliveryconfig(requestConfig?: RequestConfig): Promise> { - const request = new RequestBuilder() + async getProjectDeliveryconfig( + params?: GetProjectDeliveryconfigParams, + requestConfig?: RequestConfig, + ): Promise> { + const request = new RequestBuilder() .setBaseUrl(this.config) .setConfig(this.config) .setMethod('GET') .setPath('/channels/deliveryconfig') .setRequestSchema(z.any()) - .setResponseSchema(projectDeliveryConfigResponse) .setRequestContentType(ContentType.Json) - .setResponseContentType(ContentType.Json) + .addResponse({ + schema: categoryDeliveryConfigResponse, + contentType: ContentType.Json, + status: 200, + }) .setRetryAttempts(this.config, requestConfig) .setRetryDelayMs(this.config, requestConfig) .setResponseValidation(this.config, requestConfig) + .addQueryParam({ + key: 'key', + value: params?.key, + }) .build(); - return this.client.call(request); + return this.client.call(request); } /** * - * @returns {Promise>} OK + * @returns {Promise>} OK */ async saveProjectDeliveryconfig( - body: ProjectDeliveryConfig, - requestConfig?: RequestConfig, - ): Promise> { - const request = new RequestBuilder() - .setBaseUrl(this.config) - .setConfig(this.config) - .setMethod('PUT') - .setPath('/channels/deliveryconfig') - .setRequestSchema(projectDeliveryConfigRequest) - .setResponseSchema(projectDeliveryConfigResponse) - .setRequestContentType(ContentType.Json) - .setResponseContentType(ContentType.Json) - .setRetryAttempts(this.config, requestConfig) - .setRetryDelayMs(this.config, requestConfig) - .setResponseValidation(this.config, requestConfig) - .addHeaderParam({ key: 'Content-Type', value: 'application/json' }) - .addBody(body) - .build(); - return this.client.call(request); - } - - /** - * - * @returns {Promise>} Created - */ - async saveCategoriesDeliveryconfig( body: CategoryDeliveryConfig, requestConfig?: RequestConfig, ): Promise> { - const request = new RequestBuilder() + const request = new RequestBuilder() .setBaseUrl(this.config) .setConfig(this.config) - .setMethod('POST') - .setPath('/channels/deliveryconfig/categories') + .setMethod('PUT') + .setPath('/channels/deliveryconfig') .setRequestSchema(categoryDeliveryConfigRequest) - .setResponseSchema(categoryDeliveryConfigResponse) .setRequestContentType(ContentType.Json) - .setResponseContentType(ContentType.Json) + .addResponse({ + schema: categoryDeliveryConfigResponse, + contentType: ContentType.Json, + status: 200, + }) .setRetryAttempts(this.config, requestConfig) .setRetryDelayMs(this.config, requestConfig) .setResponseValidation(this.config, requestConfig) @@ -138,15 +122,18 @@ export class ChannelsService extends BaseService { params?: GetMobilePushApnsUserTokensParams, requestConfig?: RequestConfig, ): Promise> { - const request = new RequestBuilder() + const request = new RequestBuilder() .setBaseUrl(this.config) .setConfig(this.config) .setMethod('GET') .setPath('/users/{user_id}/channels/mobile_push/apns/tokens') .setRequestSchema(z.any()) - .setResponseSchema(arrayOfMetadataApnsTokensResponse) .setRequestContentType(ContentType.Json) - .setResponseContentType(ContentType.Json) + .addResponse({ + schema: arrayOfMetadataApnsTokensResponse, + contentType: ContentType.Json, + status: 200, + }) .setRetryAttempts(this.config, requestConfig) .setRetryDelayMs(this.config, requestConfig) .setResponseValidation(this.config, requestConfig) @@ -181,15 +168,18 @@ export class ChannelsService extends BaseService { tokenId: string, requestConfig?: RequestConfig, ): Promise> { - const request = new RequestBuilder() + const request = new RequestBuilder() .setBaseUrl(this.config) .setConfig(this.config) .setMethod('GET') .setPath('/users/{user_id}/channels/mobile_push/apns/tokens/{token_id}') .setRequestSchema(z.any()) - .setResponseSchema(metadataApnsTokenResponse) .setRequestContentType(ContentType.Json) - .setResponseContentType(ContentType.Json) + .addResponse({ + schema: metadataApnsTokenResponse, + contentType: ContentType.Json, + status: 200, + }) .setRetryAttempts(this.config, requestConfig) .setRetryDelayMs(this.config, requestConfig) .setResponseValidation(this.config, requestConfig) @@ -216,15 +206,18 @@ export class ChannelsService extends BaseService { tokenId: string, requestConfig?: RequestConfig, ): Promise> { - const request = new RequestBuilder() + const request = new RequestBuilder() .setBaseUrl(this.config) .setConfig(this.config) .setMethod('DELETE') .setPath('/users/{user_id}/channels/mobile_push/apns/tokens/{token_id}') .setRequestSchema(z.any()) - .setResponseSchema(discardResultResponse) .setRequestContentType(ContentType.Json) - .setResponseContentType(ContentType.Json) + .addResponse({ + schema: discardResultResponse, + contentType: ContentType.Json, + status: 200, + }) .setRetryAttempts(this.config, requestConfig) .setRetryDelayMs(this.config, requestConfig) .setResponseValidation(this.config, requestConfig) @@ -253,15 +246,18 @@ export class ChannelsService extends BaseService { params?: GetMobilePushExpoUserTokensParams, requestConfig?: RequestConfig, ): Promise> { - const request = new RequestBuilder() + const request = new RequestBuilder() .setBaseUrl(this.config) .setConfig(this.config) .setMethod('GET') .setPath('/users/{user_id}/channels/mobile_push/expo/tokens') .setRequestSchema(z.any()) - .setResponseSchema(arrayOfMetadataExpoTokensResponse) .setRequestContentType(ContentType.Json) - .setResponseContentType(ContentType.Json) + .addResponse({ + schema: arrayOfMetadataExpoTokensResponse, + contentType: ContentType.Json, + status: 200, + }) .setRetryAttempts(this.config, requestConfig) .setRetryDelayMs(this.config, requestConfig) .setResponseValidation(this.config, requestConfig) @@ -296,15 +292,18 @@ export class ChannelsService extends BaseService { tokenId: string, requestConfig?: RequestConfig, ): Promise> { - const request = new RequestBuilder() + const request = new RequestBuilder() .setBaseUrl(this.config) .setConfig(this.config) .setMethod('GET') .setPath('/users/{user_id}/channels/mobile_push/expo/tokens/{token_id}') .setRequestSchema(z.any()) - .setResponseSchema(metadataExpoTokenResponse) .setRequestContentType(ContentType.Json) - .setResponseContentType(ContentType.Json) + .addResponse({ + schema: metadataExpoTokenResponse, + contentType: ContentType.Json, + status: 200, + }) .setRetryAttempts(this.config, requestConfig) .setRetryDelayMs(this.config, requestConfig) .setResponseValidation(this.config, requestConfig) @@ -331,15 +330,18 @@ export class ChannelsService extends BaseService { tokenId: string, requestConfig?: RequestConfig, ): Promise> { - const request = new RequestBuilder() + const request = new RequestBuilder() .setBaseUrl(this.config) .setConfig(this.config) .setMethod('DELETE') .setPath('/users/{user_id}/channels/mobile_push/expo/tokens/{token_id}') .setRequestSchema(z.any()) - .setResponseSchema(discardResultResponse) .setRequestContentType(ContentType.Json) - .setResponseContentType(ContentType.Json) + .addResponse({ + schema: discardResultResponse, + contentType: ContentType.Json, + status: 200, + }) .setRetryAttempts(this.config, requestConfig) .setRetryDelayMs(this.config, requestConfig) .setResponseValidation(this.config, requestConfig) @@ -368,15 +370,18 @@ export class ChannelsService extends BaseService { params?: GetMobilePushFcmUserTokensParams, requestConfig?: RequestConfig, ): Promise> { - const request = new RequestBuilder() + const request = new RequestBuilder() .setBaseUrl(this.config) .setConfig(this.config) .setMethod('GET') .setPath('/users/{user_id}/channels/mobile_push/fcm/tokens') .setRequestSchema(z.any()) - .setResponseSchema(arrayOfMetadataFcmTokensResponse) .setRequestContentType(ContentType.Json) - .setResponseContentType(ContentType.Json) + .addResponse({ + schema: arrayOfMetadataFcmTokensResponse, + contentType: ContentType.Json, + status: 200, + }) .setRetryAttempts(this.config, requestConfig) .setRetryDelayMs(this.config, requestConfig) .setResponseValidation(this.config, requestConfig) @@ -411,15 +416,18 @@ export class ChannelsService extends BaseService { tokenId: string, requestConfig?: RequestConfig, ): Promise> { - const request = new RequestBuilder() + const request = new RequestBuilder() .setBaseUrl(this.config) .setConfig(this.config) .setMethod('GET') .setPath('/users/{user_id}/channels/mobile_push/fcm/tokens/{token_id}') .setRequestSchema(z.any()) - .setResponseSchema(metadataFcmTokenResponse) .setRequestContentType(ContentType.Json) - .setResponseContentType(ContentType.Json) + .addResponse({ + schema: metadataFcmTokenResponse, + contentType: ContentType.Json, + status: 200, + }) .setRetryAttempts(this.config, requestConfig) .setRetryDelayMs(this.config, requestConfig) .setResponseValidation(this.config, requestConfig) @@ -446,15 +454,18 @@ export class ChannelsService extends BaseService { tokenId: string, requestConfig?: RequestConfig, ): Promise> { - const request = new RequestBuilder() + const request = new RequestBuilder() .setBaseUrl(this.config) .setConfig(this.config) .setMethod('DELETE') .setPath('/users/{user_id}/channels/mobile_push/fcm/tokens/{token_id}') .setRequestSchema(z.any()) - .setResponseSchema(discardResultResponse) .setRequestContentType(ContentType.Json) - .setResponseContentType(ContentType.Json) + .addResponse({ + schema: discardResultResponse, + contentType: ContentType.Json, + status: 200, + }) .setRetryAttempts(this.config, requestConfig) .setRetryDelayMs(this.config, requestConfig) .setResponseValidation(this.config, requestConfig) @@ -483,15 +494,18 @@ export class ChannelsService extends BaseService { params?: GetSlackUserTokensParams, requestConfig?: RequestConfig, ): Promise> { - const request = new RequestBuilder() + const request = new RequestBuilder() .setBaseUrl(this.config) .setConfig(this.config) .setMethod('GET') .setPath('/users/{user_id}/channels/slack/tokens') .setRequestSchema(z.any()) - .setResponseSchema(arrayOfMetadataSlackTokensResponse) .setRequestContentType(ContentType.Json) - .setResponseContentType(ContentType.Json) + .addResponse({ + schema: arrayOfMetadataSlackTokensResponse, + contentType: ContentType.Json, + status: 200, + }) .setRetryAttempts(this.config, requestConfig) .setRetryDelayMs(this.config, requestConfig) .setResponseValidation(this.config, requestConfig) @@ -526,15 +540,18 @@ export class ChannelsService extends BaseService { tokenId: string, requestConfig?: RequestConfig, ): Promise> { - const request = new RequestBuilder() + const request = new RequestBuilder() .setBaseUrl(this.config) .setConfig(this.config) .setMethod('GET') .setPath('/users/{user_id}/channels/slack/tokens/{token_id}') .setRequestSchema(z.any()) - .setResponseSchema(metadataSlackTokenResponse) .setRequestContentType(ContentType.Json) - .setResponseContentType(ContentType.Json) + .addResponse({ + schema: metadataSlackTokenResponse, + contentType: ContentType.Json, + status: 200, + }) .setRetryAttempts(this.config, requestConfig) .setRetryDelayMs(this.config, requestConfig) .setResponseValidation(this.config, requestConfig) @@ -561,15 +578,18 @@ export class ChannelsService extends BaseService { tokenId: string, requestConfig?: RequestConfig, ): Promise> { - const request = new RequestBuilder() + const request = new RequestBuilder() .setBaseUrl(this.config) .setConfig(this.config) .setMethod('DELETE') .setPath('/users/{user_id}/channels/slack/tokens/{token_id}') .setRequestSchema(z.any()) - .setResponseSchema(discardResultResponse) .setRequestContentType(ContentType.Json) - .setResponseContentType(ContentType.Json) + .addResponse({ + schema: discardResultResponse, + contentType: ContentType.Json, + status: 200, + }) .setRetryAttempts(this.config, requestConfig) .setRetryDelayMs(this.config, requestConfig) .setResponseValidation(this.config, requestConfig) @@ -598,15 +618,18 @@ export class ChannelsService extends BaseService { params?: GetTeamsUserTokensParams, requestConfig?: RequestConfig, ): Promise> { - const request = new RequestBuilder() + const request = new RequestBuilder() .setBaseUrl(this.config) .setConfig(this.config) .setMethod('GET') .setPath('/users/{user_id}/channels/teams/tokens') .setRequestSchema(z.any()) - .setResponseSchema(arrayOfMetadataTeamsTokensResponse) .setRequestContentType(ContentType.Json) - .setResponseContentType(ContentType.Json) + .addResponse({ + schema: arrayOfMetadataTeamsTokensResponse, + contentType: ContentType.Json, + status: 200, + }) .setRetryAttempts(this.config, requestConfig) .setRetryDelayMs(this.config, requestConfig) .setResponseValidation(this.config, requestConfig) @@ -641,15 +664,18 @@ export class ChannelsService extends BaseService { tokenId: string, requestConfig?: RequestConfig, ): Promise> { - const request = new RequestBuilder() + const request = new RequestBuilder() .setBaseUrl(this.config) .setConfig(this.config) .setMethod('GET') .setPath('/users/{user_id}/channels/teams/tokens/{token_id}') .setRequestSchema(z.any()) - .setResponseSchema(metadataTeamsTokenResponse) .setRequestContentType(ContentType.Json) - .setResponseContentType(ContentType.Json) + .addResponse({ + schema: metadataTeamsTokenResponse, + contentType: ContentType.Json, + status: 200, + }) .setRetryAttempts(this.config, requestConfig) .setRetryDelayMs(this.config, requestConfig) .setResponseValidation(this.config, requestConfig) @@ -676,15 +702,18 @@ export class ChannelsService extends BaseService { tokenId: string, requestConfig?: RequestConfig, ): Promise> { - const request = new RequestBuilder() + const request = new RequestBuilder() .setBaseUrl(this.config) .setConfig(this.config) .setMethod('DELETE') .setPath('/users/{user_id}/channels/teams/tokens/{token_id}') .setRequestSchema(z.any()) - .setResponseSchema(discardResultResponse) .setRequestContentType(ContentType.Json) - .setResponseContentType(ContentType.Json) + .addResponse({ + schema: discardResultResponse, + contentType: ContentType.Json, + status: 200, + }) .setRetryAttempts(this.config, requestConfig) .setRetryDelayMs(this.config, requestConfig) .setResponseValidation(this.config, requestConfig) @@ -713,15 +742,18 @@ export class ChannelsService extends BaseService { params?: GetWebPushUserTokensParams, requestConfig?: RequestConfig, ): Promise> { - const request = new RequestBuilder() + const request = new RequestBuilder() .setBaseUrl(this.config) .setConfig(this.config) .setMethod('GET') .setPath('/users/{user_id}/channels/web_push/tokens') .setRequestSchema(z.any()) - .setResponseSchema(arrayOfMetadataWebPushTokensResponse) .setRequestContentType(ContentType.Json) - .setResponseContentType(ContentType.Json) + .addResponse({ + schema: arrayOfMetadataWebPushTokensResponse, + contentType: ContentType.Json, + status: 200, + }) .setRetryAttempts(this.config, requestConfig) .setRetryDelayMs(this.config, requestConfig) .setResponseValidation(this.config, requestConfig) @@ -756,15 +788,18 @@ export class ChannelsService extends BaseService { tokenId: string, requestConfig?: RequestConfig, ): Promise> { - const request = new RequestBuilder() + const request = new RequestBuilder() .setBaseUrl(this.config) .setConfig(this.config) .setMethod('GET') .setPath('/users/{user_id}/channels/web_push/tokens/{token_id}') .setRequestSchema(z.any()) - .setResponseSchema(metadataWebPushTokenResponse) .setRequestContentType(ContentType.Json) - .setResponseContentType(ContentType.Json) + .addResponse({ + schema: metadataWebPushTokenResponse, + contentType: ContentType.Json, + status: 200, + }) .setRetryAttempts(this.config, requestConfig) .setRetryDelayMs(this.config, requestConfig) .setResponseValidation(this.config, requestConfig) @@ -791,15 +826,18 @@ export class ChannelsService extends BaseService { tokenId: string, requestConfig?: RequestConfig, ): Promise> { - const request = new RequestBuilder() + const request = new RequestBuilder() .setBaseUrl(this.config) .setConfig(this.config) .setMethod('DELETE') .setPath('/users/{user_id}/channels/web_push/tokens/{token_id}') .setRequestSchema(z.any()) - .setResponseSchema(discardResultResponse) .setRequestContentType(ContentType.Json) - .setResponseContentType(ContentType.Json) + .addResponse({ + schema: discardResultResponse, + contentType: ContentType.Json, + status: 200, + }) .setRetryAttempts(this.config, requestConfig) .setRetryDelayMs(this.config, requestConfig) .setResponseValidation(this.config, requestConfig) diff --git a/packages/project-client/src/services/channels/models/category-delivery-config-channels.ts b/packages/project-client/src/services/channels/models/category-delivery-config-channels.ts index a6828038e..96f3ef487 100644 --- a/packages/project-client/src/services/channels/models/category-delivery-config-channels.ts +++ b/packages/project-client/src/services/channels/models/category-delivery-config-channels.ts @@ -16,7 +16,7 @@ export const categoryDeliveryConfigChannels = z.lazy(() => { /** * * @typedef {CategoryDeliveryConfigChannels} categoryDeliveryConfigChannels - * @property {ChannelsChannel2} + * @property {Channel} * @property {number} * @property {boolean} * @property {string} diff --git a/packages/project-client/src/services/channels/models/category-delivery-config.ts b/packages/project-client/src/services/channels/models/category-delivery-config.ts index b3404b1d9..7bc8cd28f 100644 --- a/packages/project-client/src/services/channels/models/category-delivery-config.ts +++ b/packages/project-client/src/services/channels/models/category-delivery-config.ts @@ -11,21 +11,21 @@ import { */ export const categoryDeliveryConfig = z.lazy(() => { return z.object({ - category: z - .string() - .min(3) - .regex(/^[a-zA-Z0-9_]+$/), channels: z.array(categoryDeliveryConfigChannels), disabled: z.boolean().optional(), + key: z + .string() + .min(3) + .regex(/^[A-Za-z0-9_\.\-:]+$/), }); }); /** * * @typedef {CategoryDeliveryConfig} categoryDeliveryConfig - * @property {string} * @property {CategoryDeliveryConfigChannels[]} * @property {boolean} + * @property {string} */ export type CategoryDeliveryConfig = z.infer; @@ -36,17 +36,17 @@ export type CategoryDeliveryConfig = z.infer; export const categoryDeliveryConfigResponse = z.lazy(() => { return z .object({ - category: z - .string() - .min(3) - .regex(/^[a-zA-Z0-9_]+$/), channels: z.array(categoryDeliveryConfigChannelsResponse), disabled: z.boolean().optional(), + key: z + .string() + .min(3) + .regex(/^[A-Za-z0-9_\.\-:]+$/), }) .transform((data) => ({ - category: data['category'], channels: data['channels'], disabled: data['disabled'], + key: data['key'], })); }); @@ -57,13 +57,13 @@ export const categoryDeliveryConfigResponse = z.lazy(() => { export const categoryDeliveryConfigRequest = z.lazy(() => { return z .object({ - category: z.string().nullish(), channels: z.array(categoryDeliveryConfigChannelsRequest).nullish(), disabled: z.boolean().nullish(), + key: z.string().nullish(), }) .transform((data) => ({ - category: data['category'], channels: data['channels'], disabled: data['disabled'], + key: data['key'], })); }); diff --git a/packages/project-client/src/services/channels/models/channels-channel-2.ts b/packages/project-client/src/services/channels/models/channel.ts similarity index 83% rename from packages/project-client/src/services/channels/models/channels-channel-2.ts rename to packages/project-client/src/services/channels/models/channel.ts index 05181fcaa..5adfc9eff 100644 --- a/packages/project-client/src/services/channels/models/channels-channel-2.ts +++ b/packages/project-client/src/services/channels/models/channel.ts @@ -1,6 +1,6 @@ import { z } from 'zod'; -export enum ChannelsChannel2 { +export enum Channel { IN_APP = 'in_app', SLACK = 'slack', WEB_PUSH = 'web_push', diff --git a/packages/project-client/src/services/channels/models/channels-channel-1.ts b/packages/project-client/src/services/channels/models/channels-channel-1.ts deleted file mode 100644 index 1d85ea00c..000000000 --- a/packages/project-client/src/services/channels/models/channels-channel-1.ts +++ /dev/null @@ -1,11 +0,0 @@ -import { z } from 'zod'; - -export enum ChannelsChannel1 { - IN_APP = 'in_app', - SLACK = 'slack', - WEB_PUSH = 'web_push', - MOBILE_PUSH = 'mobile_push', - TEAMS = 'teams', - EMAIL = 'email', - SMS = 'sms', -} diff --git a/packages/project-client/src/services/channels/models/index.ts b/packages/project-client/src/services/channels/models/index.ts index 0413abdf5..889f00ce4 100644 --- a/packages/project-client/src/services/channels/models/index.ts +++ b/packages/project-client/src/services/channels/models/index.ts @@ -8,8 +8,7 @@ export type { ArrayOfMetadataTeamsTokens } from './array-of-metadata-teams-token export type { ArrayOfMetadataWebPushTokens } from './array-of-metadata-web-push-tokens.js'; export type { CategoryDeliveryConfig } from './category-delivery-config.js'; export type { CategoryDeliveryConfigChannels } from './category-delivery-config-channels.js'; -export { ChannelsChannel1 } from './channels-channel-1.js'; -export { ChannelsChannel2 } from './channels-channel-2.js'; +export { Channel } from './channel.js'; export type { DiscardResult } from './discard-result.js'; export type { ExpoToken } from './expo-token.js'; export type { FcmToken } from './fcm-token.js'; @@ -22,8 +21,6 @@ export type { MetadataSlackToken } from './metadata-slack-token.js'; export type { MetadataTeamsToken } from './metadata-teams-token.js'; export type { MetadataWebPushToken } from './metadata-web-push-token.js'; export type { Oauth } from './oauth.js'; -export type { ProjectDeliveryConfig } from './project-delivery-config.js'; -export type { ProjectDeliveryConfigChannels } from './project-delivery-config-channels.js'; export type { SlackToken } from './slack-token.js'; export type { SlackTokenWebhook } from './slack-token-webhook.js'; export type { TeamsToken } from './teams-token.js'; diff --git a/packages/project-client/src/services/channels/models/project-delivery-config-channels.ts b/packages/project-client/src/services/channels/models/project-delivery-config-channels.ts deleted file mode 100644 index f71c4a93e..000000000 --- a/packages/project-client/src/services/channels/models/project-delivery-config-channels.ts +++ /dev/null @@ -1,69 +0,0 @@ -import { z } from 'zod'; - -/** - * The shape of the model inside the application code - what the users use - */ -export const projectDeliveryConfigChannels = z.lazy(() => { - return z.object({ - channel: z.string(), - delay: z.number().gte(0).optional(), - disabled: z.boolean().optional(), - if: z.string().optional(), - priority: z.number().gte(0).optional(), - }); -}); - -/** - * - * @typedef {ProjectDeliveryConfigChannels} projectDeliveryConfigChannels - * @property {ChannelsChannel1} - * @property {number} - Delay (in seconds) since the last step, before the message is sent to the channel - * @property {boolean} - * @property {string} - * @property {number} - */ -export type ProjectDeliveryConfigChannels = z.infer; - -/** - * The shape of the model mapping from the api schema into the application shape. - * Is equal to application shape if all property names match the api schema - */ -export const projectDeliveryConfigChannelsResponse = z.lazy(() => { - return z - .object({ - channel: z.string(), - delay: z.number().gte(0).optional(), - disabled: z.boolean().optional(), - if: z.string().optional(), - priority: z.number().gte(0).optional(), - }) - .transform((data) => ({ - channel: data['channel'], - delay: data['delay'], - disabled: data['disabled'], - if: data['if'], - priority: data['priority'], - })); -}); - -/** - * The shape of the model mapping from the application shape into the api schema. - * Is equal to application shape if all property names match the api schema - */ -export const projectDeliveryConfigChannelsRequest = z.lazy(() => { - return z - .object({ - channel: z.string().nullish(), - delay: z.number().nullish(), - disabled: z.boolean().nullish(), - if: z.string().nullish(), - priority: z.number().nullish(), - }) - .transform((data) => ({ - channel: data['channel'], - delay: data['delay'], - disabled: data['disabled'], - if: data['if'], - priority: data['priority'], - })); -}); diff --git a/packages/project-client/src/services/channels/models/project-delivery-config.ts b/packages/project-client/src/services/channels/models/project-delivery-config.ts deleted file mode 100644 index cbc9edd97..000000000 --- a/packages/project-client/src/services/channels/models/project-delivery-config.ts +++ /dev/null @@ -1,47 +0,0 @@ -import { z } from 'zod'; - -import { - projectDeliveryConfigChannels, - projectDeliveryConfigChannelsRequest, - projectDeliveryConfigChannelsResponse, -} from './project-delivery-config-channels.js'; - -/** - * The shape of the model inside the application code - what the users use - */ -export const projectDeliveryConfig = z.lazy(() => { - return z.object({ - channels: z.array(projectDeliveryConfigChannels), - }); -}); - -/** - * - * @typedef {ProjectDeliveryConfig} projectDeliveryConfig - * @property {ProjectDeliveryConfigChannels[]} - */ -export type ProjectDeliveryConfig = z.infer; - -/** - * The shape of the model mapping from the api schema into the application shape. - * Is equal to application shape if all property names match the api schema - */ -export const projectDeliveryConfigResponse = z.lazy(() => { - return z - .object({ - channels: z.array(projectDeliveryConfigChannelsResponse), - }) - .transform((data) => ({ - channels: data['channels'], - })); -}); - -/** - * The shape of the model mapping from the application shape into the api schema. - * Is equal to application shape if all property names match the api schema - */ -export const projectDeliveryConfigRequest = z.lazy(() => { - return z.object({ channels: z.array(projectDeliveryConfigChannelsRequest).nullish() }).transform((data) => ({ - channels: data['channels'], - })); -}); diff --git a/packages/project-client/src/services/channels/request-params.ts b/packages/project-client/src/services/channels/request-params.ts index 6a4259f14..969af2022 100644 --- a/packages/project-client/src/services/channels/request-params.ts +++ b/packages/project-client/src/services/channels/request-params.ts @@ -1,3 +1,7 @@ +export interface GetProjectDeliveryconfigParams { + key?: string; +} + export interface GetMobilePushApnsUserTokensParams { pageSize?: number; pageAfter?: string; diff --git a/packages/project-client/src/services/events/events.ts b/packages/project-client/src/services/events/events.ts index 9a198fb35..3a0edaae4 100644 --- a/packages/project-client/src/services/events/events.ts +++ b/packages/project-client/src/services/events/events.ts @@ -16,15 +16,18 @@ export class EventsService extends BaseService { * @returns {Promise>} OK */ async getEvents(params?: GetEventsParams, requestConfig?: RequestConfig): Promise> { - const request = new RequestBuilder() + const request = new RequestBuilder() .setBaseUrl(this.config) .setConfig(this.config) .setMethod('GET') .setPath('/events') .setRequestSchema(z.any()) - .setResponseSchema(arrayOfEventsResponse) .setRequestContentType(ContentType.Json) - .setResponseContentType(ContentType.Json) + .addResponse({ + schema: arrayOfEventsResponse, + contentType: ContentType.Json, + status: 200, + }) .setRetryAttempts(this.config, requestConfig) .setRetryDelayMs(this.config, requestConfig) .setResponseValidation(this.config, requestConfig) diff --git a/packages/project-client/src/services/integrations/integrations.ts b/packages/project-client/src/services/integrations/integrations.ts index 7dedb6cdb..f8a89525a 100644 --- a/packages/project-client/src/services/integrations/integrations.ts +++ b/packages/project-client/src/services/integrations/integrations.ts @@ -78,15 +78,18 @@ export class IntegrationsService extends BaseService { params?: ListIntegrationsParams, requestConfig?: RequestConfig, ): Promise> { - const request = new RequestBuilder() + const request = new RequestBuilder() .setBaseUrl(this.config) .setConfig(this.config) .setMethod('GET') .setPath('/integrations') .setRequestSchema(z.any()) - .setResponseSchema(arrayOfIntegrationObjectsResponse) .setRequestContentType(ContentType.Json) - .setResponseContentType(ContentType.Json) + .addResponse({ + schema: arrayOfIntegrationObjectsResponse, + contentType: ContentType.Json, + status: 200, + }) .setRetryAttempts(this.config, requestConfig) .setRetryDelayMs(this.config, requestConfig) .setResponseValidation(this.config, requestConfig) @@ -111,15 +114,18 @@ export class IntegrationsService extends BaseService { * @returns {Promise>} OK */ async getApnsIntegration(requestConfig?: RequestConfig): Promise> { - const request = new RequestBuilder() + const request = new RequestBuilder() .setBaseUrl(this.config) .setConfig(this.config) .setMethod('GET') .setPath('/integrations/apns') .setRequestSchema(z.any()) - .setResponseSchema(arrayOfApnsConfigObjectsResponse) .setRequestContentType(ContentType.Json) - .setResponseContentType(ContentType.Json) + .addResponse({ + schema: arrayOfApnsConfigObjectsResponse, + contentType: ContentType.Json, + status: 200, + }) .setRetryAttempts(this.config, requestConfig) .setRetryDelayMs(this.config, requestConfig) .setResponseValidation(this.config, requestConfig) @@ -132,15 +138,18 @@ export class IntegrationsService extends BaseService { * @returns {Promise>} OK */ async saveApnsIntegration(body: ApnsConfig, requestConfig?: RequestConfig): Promise> { - const request = new RequestBuilder() + const request = new RequestBuilder() .setBaseUrl(this.config) .setConfig(this.config) .setMethod('PUT') .setPath('/integrations/apns') .setRequestSchema(apnsConfigRequest) - .setResponseSchema(apnsConfigResponse) .setRequestContentType(ContentType.Json) - .setResponseContentType(ContentType.Json) + .addResponse({ + schema: apnsConfigResponse, + contentType: ContentType.Json, + status: 200, + }) .setRetryAttempts(this.config, requestConfig) .setRetryDelayMs(this.config, requestConfig) .setResponseValidation(this.config, requestConfig) @@ -154,21 +163,24 @@ export class IntegrationsService extends BaseService { * Removes a apns integration configuration from the project. This will disable the integration's functionality within the project. * @returns {Promise>} No Content */ - async deleteApnsIntegration(requestConfig?: RequestConfig): Promise> { - const request = new RequestBuilder() + async deleteApnsIntegration(requestConfig?: RequestConfig): Promise> { + const request = new RequestBuilder() .setBaseUrl(this.config) .setConfig(this.config) .setMethod('DELETE') .setPath('/integrations/apns') .setRequestSchema(z.any()) - .setResponseSchema(z.undefined()) .setRequestContentType(ContentType.Json) - .setResponseContentType(ContentType.Json) + .addResponse({ + schema: z.undefined(), + contentType: ContentType.NoContent, + status: 204, + }) .setRetryAttempts(this.config, requestConfig) .setRetryDelayMs(this.config, requestConfig) .setResponseValidation(this.config, requestConfig) .build(); - return this.client.call(request); + return this.client.call(request); } /** @@ -176,16 +188,19 @@ export class IntegrationsService extends BaseService { * @param {string} id - * @returns {Promise>} No Content */ - async deleteApnsIntegrationById(id: string, requestConfig?: RequestConfig): Promise> { - const request = new RequestBuilder() + async deleteApnsIntegrationById(id: string, requestConfig?: RequestConfig): Promise> { + const request = new RequestBuilder() .setBaseUrl(this.config) .setConfig(this.config) .setMethod('DELETE') .setPath('/integrations/apns/{id}') .setRequestSchema(z.any()) - .setResponseSchema(z.undefined()) .setRequestContentType(ContentType.Json) - .setResponseContentType(ContentType.Json) + .addResponse({ + schema: z.undefined(), + contentType: ContentType.NoContent, + status: 204, + }) .setRetryAttempts(this.config, requestConfig) .setRetryDelayMs(this.config, requestConfig) .setResponseValidation(this.config, requestConfig) @@ -194,7 +209,7 @@ export class IntegrationsService extends BaseService { value: id, }) .build(); - return this.client.call(request); + return this.client.call(request); } /** @@ -202,15 +217,18 @@ export class IntegrationsService extends BaseService { * @returns {Promise>} OK */ async getAwssnsIntegration(requestConfig?: RequestConfig): Promise> { - const request = new RequestBuilder() + const request = new RequestBuilder() .setBaseUrl(this.config) .setConfig(this.config) .setMethod('GET') .setPath('/integrations/awssns') .setRequestSchema(z.any()) - .setResponseSchema(arrayOfAwssnsConfigObjectsResponse) .setRequestContentType(ContentType.Json) - .setResponseContentType(ContentType.Json) + .addResponse({ + schema: arrayOfAwssnsConfigObjectsResponse, + contentType: ContentType.Json, + status: 200, + }) .setRetryAttempts(this.config, requestConfig) .setRetryDelayMs(this.config, requestConfig) .setResponseValidation(this.config, requestConfig) @@ -223,15 +241,18 @@ export class IntegrationsService extends BaseService { * @returns {Promise>} OK */ async saveAwssnsIntegration(body: AwssnsConfig, requestConfig?: RequestConfig): Promise> { - const request = new RequestBuilder() + const request = new RequestBuilder() .setBaseUrl(this.config) .setConfig(this.config) .setMethod('PUT') .setPath('/integrations/awssns') .setRequestSchema(awssnsConfigRequest) - .setResponseSchema(awssnsConfigResponse) .setRequestContentType(ContentType.Json) - .setResponseContentType(ContentType.Json) + .addResponse({ + schema: awssnsConfigResponse, + contentType: ContentType.Json, + status: 200, + }) .setRetryAttempts(this.config, requestConfig) .setRetryDelayMs(this.config, requestConfig) .setResponseValidation(this.config, requestConfig) @@ -245,21 +266,24 @@ export class IntegrationsService extends BaseService { * Removes a awssns integration configuration from the project. This will disable the integration's functionality within the project. * @returns {Promise>} No Content */ - async deleteAwssnsIntegration(requestConfig?: RequestConfig): Promise> { - const request = new RequestBuilder() + async deleteAwssnsIntegration(requestConfig?: RequestConfig): Promise> { + const request = new RequestBuilder() .setBaseUrl(this.config) .setConfig(this.config) .setMethod('DELETE') .setPath('/integrations/awssns') .setRequestSchema(z.any()) - .setResponseSchema(z.undefined()) .setRequestContentType(ContentType.Json) - .setResponseContentType(ContentType.Json) + .addResponse({ + schema: z.undefined(), + contentType: ContentType.NoContent, + status: 204, + }) .setRetryAttempts(this.config, requestConfig) .setRetryDelayMs(this.config, requestConfig) .setResponseValidation(this.config, requestConfig) .build(); - return this.client.call(request); + return this.client.call(request); } /** @@ -267,16 +291,19 @@ export class IntegrationsService extends BaseService { * @param {string} id - * @returns {Promise>} No Content */ - async deleteAwssnsIntegrationById(id: string, requestConfig?: RequestConfig): Promise> { - const request = new RequestBuilder() + async deleteAwssnsIntegrationById(id: string, requestConfig?: RequestConfig): Promise> { + const request = new RequestBuilder() .setBaseUrl(this.config) .setConfig(this.config) .setMethod('DELETE') .setPath('/integrations/awssns/{id}') .setRequestSchema(z.any()) - .setResponseSchema(z.undefined()) .setRequestContentType(ContentType.Json) - .setResponseContentType(ContentType.Json) + .addResponse({ + schema: z.undefined(), + contentType: ContentType.NoContent, + status: 204, + }) .setRetryAttempts(this.config, requestConfig) .setRetryDelayMs(this.config, requestConfig) .setResponseValidation(this.config, requestConfig) @@ -285,7 +312,7 @@ export class IntegrationsService extends BaseService { value: id, }) .build(); - return this.client.call(request); + return this.client.call(request); } /** @@ -293,15 +320,18 @@ export class IntegrationsService extends BaseService { * @returns {Promise>} OK */ async getExpoIntegration(requestConfig?: RequestConfig): Promise> { - const request = new RequestBuilder() + const request = new RequestBuilder() .setBaseUrl(this.config) .setConfig(this.config) .setMethod('GET') .setPath('/integrations/expo') .setRequestSchema(z.any()) - .setResponseSchema(arrayOfExpoConfigObjectsResponse) .setRequestContentType(ContentType.Json) - .setResponseContentType(ContentType.Json) + .addResponse({ + schema: arrayOfExpoConfigObjectsResponse, + contentType: ContentType.Json, + status: 200, + }) .setRetryAttempts(this.config, requestConfig) .setRetryDelayMs(this.config, requestConfig) .setResponseValidation(this.config, requestConfig) @@ -314,15 +344,18 @@ export class IntegrationsService extends BaseService { * @returns {Promise>} OK */ async saveExpoIntegration(body: ExpoConfig, requestConfig?: RequestConfig): Promise> { - const request = new RequestBuilder() + const request = new RequestBuilder() .setBaseUrl(this.config) .setConfig(this.config) .setMethod('PUT') .setPath('/integrations/expo') .setRequestSchema(expoConfigRequest) - .setResponseSchema(expoConfigResponse) .setRequestContentType(ContentType.Json) - .setResponseContentType(ContentType.Json) + .addResponse({ + schema: expoConfigResponse, + contentType: ContentType.Json, + status: 200, + }) .setRetryAttempts(this.config, requestConfig) .setRetryDelayMs(this.config, requestConfig) .setResponseValidation(this.config, requestConfig) @@ -336,21 +369,24 @@ export class IntegrationsService extends BaseService { * Removes a expo integration configuration from the project. This will disable the integration's functionality within the project. * @returns {Promise>} No Content */ - async deleteExpoIntegration(requestConfig?: RequestConfig): Promise> { - const request = new RequestBuilder() + async deleteExpoIntegration(requestConfig?: RequestConfig): Promise> { + const request = new RequestBuilder() .setBaseUrl(this.config) .setConfig(this.config) .setMethod('DELETE') .setPath('/integrations/expo') .setRequestSchema(z.any()) - .setResponseSchema(z.undefined()) .setRequestContentType(ContentType.Json) - .setResponseContentType(ContentType.Json) + .addResponse({ + schema: z.undefined(), + contentType: ContentType.NoContent, + status: 204, + }) .setRetryAttempts(this.config, requestConfig) .setRetryDelayMs(this.config, requestConfig) .setResponseValidation(this.config, requestConfig) .build(); - return this.client.call(request); + return this.client.call(request); } /** @@ -358,16 +394,19 @@ export class IntegrationsService extends BaseService { * @param {string} id - * @returns {Promise>} No Content */ - async deleteExpoIntegrationById(id: string, requestConfig?: RequestConfig): Promise> { - const request = new RequestBuilder() + async deleteExpoIntegrationById(id: string, requestConfig?: RequestConfig): Promise> { + const request = new RequestBuilder() .setBaseUrl(this.config) .setConfig(this.config) .setMethod('DELETE') .setPath('/integrations/expo/{id}') .setRequestSchema(z.any()) - .setResponseSchema(z.undefined()) .setRequestContentType(ContentType.Json) - .setResponseContentType(ContentType.Json) + .addResponse({ + schema: z.undefined(), + contentType: ContentType.NoContent, + status: 204, + }) .setRetryAttempts(this.config, requestConfig) .setRetryDelayMs(this.config, requestConfig) .setResponseValidation(this.config, requestConfig) @@ -376,7 +415,7 @@ export class IntegrationsService extends BaseService { value: id, }) .build(); - return this.client.call(request); + return this.client.call(request); } /** @@ -384,15 +423,18 @@ export class IntegrationsService extends BaseService { * @returns {Promise>} OK */ async getFcmIntegration(requestConfig?: RequestConfig): Promise> { - const request = new RequestBuilder() + const request = new RequestBuilder() .setBaseUrl(this.config) .setConfig(this.config) .setMethod('GET') .setPath('/integrations/fcm') .setRequestSchema(z.any()) - .setResponseSchema(arrayOfFcmConfigObjectsResponse) .setRequestContentType(ContentType.Json) - .setResponseContentType(ContentType.Json) + .addResponse({ + schema: arrayOfFcmConfigObjectsResponse, + contentType: ContentType.Json, + status: 200, + }) .setRetryAttempts(this.config, requestConfig) .setRetryDelayMs(this.config, requestConfig) .setResponseValidation(this.config, requestConfig) @@ -405,15 +447,18 @@ export class IntegrationsService extends BaseService { * @returns {Promise>} OK */ async saveFcmIntegration(body: FcmConfig, requestConfig?: RequestConfig): Promise> { - const request = new RequestBuilder() + const request = new RequestBuilder() .setBaseUrl(this.config) .setConfig(this.config) .setMethod('PUT') .setPath('/integrations/fcm') .setRequestSchema(fcmConfigRequest) - .setResponseSchema(fcmConfigResponse) .setRequestContentType(ContentType.Json) - .setResponseContentType(ContentType.Json) + .addResponse({ + schema: fcmConfigResponse, + contentType: ContentType.Json, + status: 200, + }) .setRetryAttempts(this.config, requestConfig) .setRetryDelayMs(this.config, requestConfig) .setResponseValidation(this.config, requestConfig) @@ -427,21 +472,24 @@ export class IntegrationsService extends BaseService { * Removes a fcm integration configuration from the project. This will disable the integration's functionality within the project. * @returns {Promise>} No Content */ - async deleteFcmIntegration(requestConfig?: RequestConfig): Promise> { - const request = new RequestBuilder() + async deleteFcmIntegration(requestConfig?: RequestConfig): Promise> { + const request = new RequestBuilder() .setBaseUrl(this.config) .setConfig(this.config) .setMethod('DELETE') .setPath('/integrations/fcm') .setRequestSchema(z.any()) - .setResponseSchema(z.undefined()) .setRequestContentType(ContentType.Json) - .setResponseContentType(ContentType.Json) + .addResponse({ + schema: z.undefined(), + contentType: ContentType.NoContent, + status: 204, + }) .setRetryAttempts(this.config, requestConfig) .setRetryDelayMs(this.config, requestConfig) .setResponseValidation(this.config, requestConfig) .build(); - return this.client.call(request); + return this.client.call(request); } /** @@ -449,16 +497,19 @@ export class IntegrationsService extends BaseService { * @param {string} id - * @returns {Promise>} No Content */ - async deleteFcmIntegrationById(id: string, requestConfig?: RequestConfig): Promise> { - const request = new RequestBuilder() + async deleteFcmIntegrationById(id: string, requestConfig?: RequestConfig): Promise> { + const request = new RequestBuilder() .setBaseUrl(this.config) .setConfig(this.config) .setMethod('DELETE') .setPath('/integrations/fcm/{id}') .setRequestSchema(z.any()) - .setResponseSchema(z.undefined()) .setRequestContentType(ContentType.Json) - .setResponseContentType(ContentType.Json) + .addResponse({ + schema: z.undefined(), + contentType: ContentType.NoContent, + status: 204, + }) .setRetryAttempts(this.config, requestConfig) .setRetryDelayMs(this.config, requestConfig) .setResponseValidation(this.config, requestConfig) @@ -467,7 +518,7 @@ export class IntegrationsService extends BaseService { value: id, }) .build(); - return this.client.call(request); + return this.client.call(request); } /** @@ -475,15 +526,18 @@ export class IntegrationsService extends BaseService { * @returns {Promise>} OK */ async getGithubIntegration(requestConfig?: RequestConfig): Promise> { - const request = new RequestBuilder() + const request = new RequestBuilder() .setBaseUrl(this.config) .setConfig(this.config) .setMethod('GET') .setPath('/integrations/github') .setRequestSchema(z.any()) - .setResponseSchema(arrayOfGithubConfigObjectsResponse) .setRequestContentType(ContentType.Json) - .setResponseContentType(ContentType.Json) + .addResponse({ + schema: arrayOfGithubConfigObjectsResponse, + contentType: ContentType.Json, + status: 200, + }) .setRetryAttempts(this.config, requestConfig) .setRetryDelayMs(this.config, requestConfig) .setResponseValidation(this.config, requestConfig) @@ -496,15 +550,18 @@ export class IntegrationsService extends BaseService { * @returns {Promise>} OK */ async saveGithubIntegration(body: GithubConfig, requestConfig?: RequestConfig): Promise> { - const request = new RequestBuilder() + const request = new RequestBuilder() .setBaseUrl(this.config) .setConfig(this.config) .setMethod('PUT') .setPath('/integrations/github') .setRequestSchema(githubConfigRequest) - .setResponseSchema(githubConfigResponse) .setRequestContentType(ContentType.Json) - .setResponseContentType(ContentType.Json) + .addResponse({ + schema: githubConfigResponse, + contentType: ContentType.Json, + status: 200, + }) .setRetryAttempts(this.config, requestConfig) .setRetryDelayMs(this.config, requestConfig) .setResponseValidation(this.config, requestConfig) @@ -518,21 +575,24 @@ export class IntegrationsService extends BaseService { * Removes a github integration configuration from the project. This will disable the integration's functionality within the project. * @returns {Promise>} No Content */ - async deleteGithubIntegration(requestConfig?: RequestConfig): Promise> { - const request = new RequestBuilder() + async deleteGithubIntegration(requestConfig?: RequestConfig): Promise> { + const request = new RequestBuilder() .setBaseUrl(this.config) .setConfig(this.config) .setMethod('DELETE') .setPath('/integrations/github') .setRequestSchema(z.any()) - .setResponseSchema(z.undefined()) .setRequestContentType(ContentType.Json) - .setResponseContentType(ContentType.Json) + .addResponse({ + schema: z.undefined(), + contentType: ContentType.NoContent, + status: 204, + }) .setRetryAttempts(this.config, requestConfig) .setRetryDelayMs(this.config, requestConfig) .setResponseValidation(this.config, requestConfig) .build(); - return this.client.call(request); + return this.client.call(request); } /** @@ -540,16 +600,19 @@ export class IntegrationsService extends BaseService { * @param {string} id - * @returns {Promise>} No Content */ - async deleteGithubIntegrationById(id: string, requestConfig?: RequestConfig): Promise> { - const request = new RequestBuilder() + async deleteGithubIntegrationById(id: string, requestConfig?: RequestConfig): Promise> { + const request = new RequestBuilder() .setBaseUrl(this.config) .setConfig(this.config) .setMethod('DELETE') .setPath('/integrations/github/{id}') .setRequestSchema(z.any()) - .setResponseSchema(z.undefined()) .setRequestContentType(ContentType.Json) - .setResponseContentType(ContentType.Json) + .addResponse({ + schema: z.undefined(), + contentType: ContentType.NoContent, + status: 204, + }) .setRetryAttempts(this.config, requestConfig) .setRetryDelayMs(this.config, requestConfig) .setResponseValidation(this.config, requestConfig) @@ -558,7 +621,7 @@ export class IntegrationsService extends BaseService { value: id, }) .build(); - return this.client.call(request); + return this.client.call(request); } /** @@ -566,15 +629,18 @@ export class IntegrationsService extends BaseService { * @returns {Promise>} OK */ async getInboxIntegration(requestConfig?: RequestConfig): Promise> { - const request = new RequestBuilder() + const request = new RequestBuilder() .setBaseUrl(this.config) .setConfig(this.config) .setMethod('GET') .setPath('/integrations/inbox') .setRequestSchema(z.any()) - .setResponseSchema(arrayOfInboxConfigObjectsResponse) .setRequestContentType(ContentType.Json) - .setResponseContentType(ContentType.Json) + .addResponse({ + schema: arrayOfInboxConfigObjectsResponse, + contentType: ContentType.Json, + status: 200, + }) .setRetryAttempts(this.config, requestConfig) .setRetryDelayMs(this.config, requestConfig) .setResponseValidation(this.config, requestConfig) @@ -587,15 +653,18 @@ export class IntegrationsService extends BaseService { * @returns {Promise>} OK */ async saveInboxIntegration(body: InboxConfig, requestConfig?: RequestConfig): Promise> { - const request = new RequestBuilder() + const request = new RequestBuilder() .setBaseUrl(this.config) .setConfig(this.config) .setMethod('PUT') .setPath('/integrations/inbox') .setRequestSchema(inboxConfigRequest) - .setResponseSchema(inboxConfigResponse) .setRequestContentType(ContentType.Json) - .setResponseContentType(ContentType.Json) + .addResponse({ + schema: inboxConfigResponse, + contentType: ContentType.Json, + status: 200, + }) .setRetryAttempts(this.config, requestConfig) .setRetryDelayMs(this.config, requestConfig) .setResponseValidation(this.config, requestConfig) @@ -609,21 +678,24 @@ export class IntegrationsService extends BaseService { * Removes a inbox integration configuration from the project. This will disable the integration's functionality within the project. * @returns {Promise>} No Content */ - async deleteInboxIntegration(requestConfig?: RequestConfig): Promise> { - const request = new RequestBuilder() + async deleteInboxIntegration(requestConfig?: RequestConfig): Promise> { + const request = new RequestBuilder() .setBaseUrl(this.config) .setConfig(this.config) .setMethod('DELETE') .setPath('/integrations/inbox') .setRequestSchema(z.any()) - .setResponseSchema(z.undefined()) .setRequestContentType(ContentType.Json) - .setResponseContentType(ContentType.Json) + .addResponse({ + schema: z.undefined(), + contentType: ContentType.NoContent, + status: 204, + }) .setRetryAttempts(this.config, requestConfig) .setRetryDelayMs(this.config, requestConfig) .setResponseValidation(this.config, requestConfig) .build(); - return this.client.call(request); + return this.client.call(request); } /** @@ -631,16 +703,19 @@ export class IntegrationsService extends BaseService { * @param {string} id - * @returns {Promise>} No Content */ - async deleteInboxIntegrationById(id: string, requestConfig?: RequestConfig): Promise> { - const request = new RequestBuilder() + async deleteInboxIntegrationById(id: string, requestConfig?: RequestConfig): Promise> { + const request = new RequestBuilder() .setBaseUrl(this.config) .setConfig(this.config) .setMethod('DELETE') .setPath('/integrations/inbox/{id}') .setRequestSchema(z.any()) - .setResponseSchema(z.undefined()) .setRequestContentType(ContentType.Json) - .setResponseContentType(ContentType.Json) + .addResponse({ + schema: z.undefined(), + contentType: ContentType.NoContent, + status: 204, + }) .setRetryAttempts(this.config, requestConfig) .setRetryDelayMs(this.config, requestConfig) .setResponseValidation(this.config, requestConfig) @@ -649,7 +724,7 @@ export class IntegrationsService extends BaseService { value: id, }) .build(); - return this.client.call(request); + return this.client.call(request); } /** @@ -657,15 +732,18 @@ export class IntegrationsService extends BaseService { * @returns {Promise>} OK */ async getMailgunIntegration(requestConfig?: RequestConfig): Promise> { - const request = new RequestBuilder() + const request = new RequestBuilder() .setBaseUrl(this.config) .setConfig(this.config) .setMethod('GET') .setPath('/integrations/mailgun') .setRequestSchema(z.any()) - .setResponseSchema(arrayOfMailgunConfigObjectsResponse) .setRequestContentType(ContentType.Json) - .setResponseContentType(ContentType.Json) + .addResponse({ + schema: arrayOfMailgunConfigObjectsResponse, + contentType: ContentType.Json, + status: 200, + }) .setRetryAttempts(this.config, requestConfig) .setRetryDelayMs(this.config, requestConfig) .setResponseValidation(this.config, requestConfig) @@ -681,15 +759,18 @@ export class IntegrationsService extends BaseService { body: MailgunConfig, requestConfig?: RequestConfig, ): Promise> { - const request = new RequestBuilder() + const request = new RequestBuilder() .setBaseUrl(this.config) .setConfig(this.config) .setMethod('PUT') .setPath('/integrations/mailgun') .setRequestSchema(mailgunConfigRequest) - .setResponseSchema(mailgunConfigResponse) .setRequestContentType(ContentType.Json) - .setResponseContentType(ContentType.Json) + .addResponse({ + schema: mailgunConfigResponse, + contentType: ContentType.Json, + status: 200, + }) .setRetryAttempts(this.config, requestConfig) .setRetryDelayMs(this.config, requestConfig) .setResponseValidation(this.config, requestConfig) @@ -703,21 +784,24 @@ export class IntegrationsService extends BaseService { * Removes a mailgun integration configuration from the project. This will disable the integration's functionality within the project. * @returns {Promise>} No Content */ - async deleteMailgunIntegration(requestConfig?: RequestConfig): Promise> { - const request = new RequestBuilder() + async deleteMailgunIntegration(requestConfig?: RequestConfig): Promise> { + const request = new RequestBuilder() .setBaseUrl(this.config) .setConfig(this.config) .setMethod('DELETE') .setPath('/integrations/mailgun') .setRequestSchema(z.any()) - .setResponseSchema(z.undefined()) .setRequestContentType(ContentType.Json) - .setResponseContentType(ContentType.Json) + .addResponse({ + schema: z.undefined(), + contentType: ContentType.NoContent, + status: 204, + }) .setRetryAttempts(this.config, requestConfig) .setRetryDelayMs(this.config, requestConfig) .setResponseValidation(this.config, requestConfig) .build(); - return this.client.call(request); + return this.client.call(request); } /** @@ -725,16 +809,19 @@ export class IntegrationsService extends BaseService { * @param {string} id - * @returns {Promise>} No Content */ - async deleteMailgunIntegrationById(id: string, requestConfig?: RequestConfig): Promise> { - const request = new RequestBuilder() + async deleteMailgunIntegrationById(id: string, requestConfig?: RequestConfig): Promise> { + const request = new RequestBuilder() .setBaseUrl(this.config) .setConfig(this.config) .setMethod('DELETE') .setPath('/integrations/mailgun/{id}') .setRequestSchema(z.any()) - .setResponseSchema(z.undefined()) .setRequestContentType(ContentType.Json) - .setResponseContentType(ContentType.Json) + .addResponse({ + schema: z.undefined(), + contentType: ContentType.NoContent, + status: 204, + }) .setRetryAttempts(this.config, requestConfig) .setRetryDelayMs(this.config, requestConfig) .setResponseValidation(this.config, requestConfig) @@ -743,7 +830,7 @@ export class IntegrationsService extends BaseService { value: id, }) .build(); - return this.client.call(request); + return this.client.call(request); } /** @@ -751,15 +838,18 @@ export class IntegrationsService extends BaseService { * @returns {Promise>} OK */ async getPingEmailIntegration(requestConfig?: RequestConfig): Promise> { - const request = new RequestBuilder() + const request = new RequestBuilder() .setBaseUrl(this.config) .setConfig(this.config) .setMethod('GET') .setPath('/integrations/ping_email') .setRequestSchema(z.any()) - .setResponseSchema(arrayOfPingConfigObjectsResponse) .setRequestContentType(ContentType.Json) - .setResponseContentType(ContentType.Json) + .addResponse({ + schema: arrayOfPingConfigObjectsResponse, + contentType: ContentType.Json, + status: 200, + }) .setRetryAttempts(this.config, requestConfig) .setRetryDelayMs(this.config, requestConfig) .setResponseValidation(this.config, requestConfig) @@ -772,15 +862,18 @@ export class IntegrationsService extends BaseService { * @returns {Promise>} OK */ async savePingEmailIntegration(body: PingConfig, requestConfig?: RequestConfig): Promise> { - const request = new RequestBuilder() + const request = new RequestBuilder() .setBaseUrl(this.config) .setConfig(this.config) .setMethod('PUT') .setPath('/integrations/ping_email') .setRequestSchema(pingConfigRequest) - .setResponseSchema(pingConfigResponse) .setRequestContentType(ContentType.Json) - .setResponseContentType(ContentType.Json) + .addResponse({ + schema: pingConfigResponse, + contentType: ContentType.Json, + status: 200, + }) .setRetryAttempts(this.config, requestConfig) .setRetryDelayMs(this.config, requestConfig) .setResponseValidation(this.config, requestConfig) @@ -794,21 +887,24 @@ export class IntegrationsService extends BaseService { * Removes a ping_email integration configuration from the project. This will disable the integration's functionality within the project. * @returns {Promise>} No Content */ - async deletePingEmailIntegration(requestConfig?: RequestConfig): Promise> { - const request = new RequestBuilder() + async deletePingEmailIntegration(requestConfig?: RequestConfig): Promise> { + const request = new RequestBuilder() .setBaseUrl(this.config) .setConfig(this.config) .setMethod('DELETE') .setPath('/integrations/ping_email') .setRequestSchema(z.any()) - .setResponseSchema(z.undefined()) .setRequestContentType(ContentType.Json) - .setResponseContentType(ContentType.Json) + .addResponse({ + schema: z.undefined(), + contentType: ContentType.NoContent, + status: 204, + }) .setRetryAttempts(this.config, requestConfig) .setRetryDelayMs(this.config, requestConfig) .setResponseValidation(this.config, requestConfig) .build(); - return this.client.call(request); + return this.client.call(request); } /** @@ -816,16 +912,19 @@ export class IntegrationsService extends BaseService { * @param {string} id - * @returns {Promise>} No Content */ - async deletePingEmailIntegrationById(id: string, requestConfig?: RequestConfig): Promise> { - const request = new RequestBuilder() + async deletePingEmailIntegrationById(id: string, requestConfig?: RequestConfig): Promise> { + const request = new RequestBuilder() .setBaseUrl(this.config) .setConfig(this.config) .setMethod('DELETE') .setPath('/integrations/ping_email/{id}') .setRequestSchema(z.any()) - .setResponseSchema(z.undefined()) .setRequestContentType(ContentType.Json) - .setResponseContentType(ContentType.Json) + .addResponse({ + schema: z.undefined(), + contentType: ContentType.NoContent, + status: 204, + }) .setRetryAttempts(this.config, requestConfig) .setRetryDelayMs(this.config, requestConfig) .setResponseValidation(this.config, requestConfig) @@ -834,7 +933,7 @@ export class IntegrationsService extends BaseService { value: id, }) .build(); - return this.client.call(request); + return this.client.call(request); } /** @@ -842,15 +941,18 @@ export class IntegrationsService extends BaseService { * @returns {Promise>} OK */ async getSendgridIntegration(requestConfig?: RequestConfig): Promise> { - const request = new RequestBuilder() + const request = new RequestBuilder() .setBaseUrl(this.config) .setConfig(this.config) .setMethod('GET') .setPath('/integrations/sendgrid') .setRequestSchema(z.any()) - .setResponseSchema(arrayOfSendgridConfigObjectsResponse) .setRequestContentType(ContentType.Json) - .setResponseContentType(ContentType.Json) + .addResponse({ + schema: arrayOfSendgridConfigObjectsResponse, + contentType: ContentType.Json, + status: 200, + }) .setRetryAttempts(this.config, requestConfig) .setRetryDelayMs(this.config, requestConfig) .setResponseValidation(this.config, requestConfig) @@ -866,15 +968,18 @@ export class IntegrationsService extends BaseService { body: SendgridConfig, requestConfig?: RequestConfig, ): Promise> { - const request = new RequestBuilder() + const request = new RequestBuilder() .setBaseUrl(this.config) .setConfig(this.config) .setMethod('PUT') .setPath('/integrations/sendgrid') .setRequestSchema(sendgridConfigRequest) - .setResponseSchema(sendgridConfigResponse) .setRequestContentType(ContentType.Json) - .setResponseContentType(ContentType.Json) + .addResponse({ + schema: sendgridConfigResponse, + contentType: ContentType.Json, + status: 200, + }) .setRetryAttempts(this.config, requestConfig) .setRetryDelayMs(this.config, requestConfig) .setResponseValidation(this.config, requestConfig) @@ -888,21 +993,24 @@ export class IntegrationsService extends BaseService { * Removes a sendgrid integration configuration from the project. This will disable the integration's functionality within the project. * @returns {Promise>} No Content */ - async deleteSendgridIntegration(requestConfig?: RequestConfig): Promise> { - const request = new RequestBuilder() + async deleteSendgridIntegration(requestConfig?: RequestConfig): Promise> { + const request = new RequestBuilder() .setBaseUrl(this.config) .setConfig(this.config) .setMethod('DELETE') .setPath('/integrations/sendgrid') .setRequestSchema(z.any()) - .setResponseSchema(z.undefined()) .setRequestContentType(ContentType.Json) - .setResponseContentType(ContentType.Json) + .addResponse({ + schema: z.undefined(), + contentType: ContentType.NoContent, + status: 204, + }) .setRetryAttempts(this.config, requestConfig) .setRetryDelayMs(this.config, requestConfig) .setResponseValidation(this.config, requestConfig) .build(); - return this.client.call(request); + return this.client.call(request); } /** @@ -910,16 +1018,19 @@ export class IntegrationsService extends BaseService { * @param {string} id - * @returns {Promise>} No Content */ - async deleteSendgridIntegrationById(id: string, requestConfig?: RequestConfig): Promise> { - const request = new RequestBuilder() + async deleteSendgridIntegrationById(id: string, requestConfig?: RequestConfig): Promise> { + const request = new RequestBuilder() .setBaseUrl(this.config) .setConfig(this.config) .setMethod('DELETE') .setPath('/integrations/sendgrid/{id}') .setRequestSchema(z.any()) - .setResponseSchema(z.undefined()) .setRequestContentType(ContentType.Json) - .setResponseContentType(ContentType.Json) + .addResponse({ + schema: z.undefined(), + contentType: ContentType.NoContent, + status: 204, + }) .setRetryAttempts(this.config, requestConfig) .setRetryDelayMs(this.config, requestConfig) .setResponseValidation(this.config, requestConfig) @@ -928,7 +1039,7 @@ export class IntegrationsService extends BaseService { value: id, }) .build(); - return this.client.call(request); + return this.client.call(request); } /** @@ -936,15 +1047,18 @@ export class IntegrationsService extends BaseService { * @returns {Promise>} OK */ async getSesIntegration(requestConfig?: RequestConfig): Promise> { - const request = new RequestBuilder() + const request = new RequestBuilder() .setBaseUrl(this.config) .setConfig(this.config) .setMethod('GET') .setPath('/integrations/ses') .setRequestSchema(z.any()) - .setResponseSchema(arrayOfSesConfigObjectsResponse) .setRequestContentType(ContentType.Json) - .setResponseContentType(ContentType.Json) + .addResponse({ + schema: arrayOfSesConfigObjectsResponse, + contentType: ContentType.Json, + status: 200, + }) .setRetryAttempts(this.config, requestConfig) .setRetryDelayMs(this.config, requestConfig) .setResponseValidation(this.config, requestConfig) @@ -957,15 +1071,18 @@ export class IntegrationsService extends BaseService { * @returns {Promise>} OK */ async saveSesIntegration(body: SesConfig, requestConfig?: RequestConfig): Promise> { - const request = new RequestBuilder() + const request = new RequestBuilder() .setBaseUrl(this.config) .setConfig(this.config) .setMethod('PUT') .setPath('/integrations/ses') .setRequestSchema(sesConfigRequest) - .setResponseSchema(sesConfigResponse) .setRequestContentType(ContentType.Json) - .setResponseContentType(ContentType.Json) + .addResponse({ + schema: sesConfigResponse, + contentType: ContentType.Json, + status: 200, + }) .setRetryAttempts(this.config, requestConfig) .setRetryDelayMs(this.config, requestConfig) .setResponseValidation(this.config, requestConfig) @@ -979,21 +1096,24 @@ export class IntegrationsService extends BaseService { * Removes a ses integration configuration from the project. This will disable the integration's functionality within the project. * @returns {Promise>} No Content */ - async deleteSesIntegration(requestConfig?: RequestConfig): Promise> { - const request = new RequestBuilder() + async deleteSesIntegration(requestConfig?: RequestConfig): Promise> { + const request = new RequestBuilder() .setBaseUrl(this.config) .setConfig(this.config) .setMethod('DELETE') .setPath('/integrations/ses') .setRequestSchema(z.any()) - .setResponseSchema(z.undefined()) .setRequestContentType(ContentType.Json) - .setResponseContentType(ContentType.Json) + .addResponse({ + schema: z.undefined(), + contentType: ContentType.NoContent, + status: 204, + }) .setRetryAttempts(this.config, requestConfig) .setRetryDelayMs(this.config, requestConfig) .setResponseValidation(this.config, requestConfig) .build(); - return this.client.call(request); + return this.client.call(request); } /** @@ -1001,16 +1121,19 @@ export class IntegrationsService extends BaseService { * @param {string} id - * @returns {Promise>} No Content */ - async deleteSesIntegrationById(id: string, requestConfig?: RequestConfig): Promise> { - const request = new RequestBuilder() + async deleteSesIntegrationById(id: string, requestConfig?: RequestConfig): Promise> { + const request = new RequestBuilder() .setBaseUrl(this.config) .setConfig(this.config) .setMethod('DELETE') .setPath('/integrations/ses/{id}') .setRequestSchema(z.any()) - .setResponseSchema(z.undefined()) .setRequestContentType(ContentType.Json) - .setResponseContentType(ContentType.Json) + .addResponse({ + schema: z.undefined(), + contentType: ContentType.NoContent, + status: 204, + }) .setRetryAttempts(this.config, requestConfig) .setRetryDelayMs(this.config, requestConfig) .setResponseValidation(this.config, requestConfig) @@ -1019,7 +1142,7 @@ export class IntegrationsService extends BaseService { value: id, }) .build(); - return this.client.call(request); + return this.client.call(request); } /** @@ -1027,15 +1150,18 @@ export class IntegrationsService extends BaseService { * @returns {Promise>} OK */ async getSlackIntegration(requestConfig?: RequestConfig): Promise> { - const request = new RequestBuilder() + const request = new RequestBuilder() .setBaseUrl(this.config) .setConfig(this.config) .setMethod('GET') .setPath('/integrations/slack') .setRequestSchema(z.any()) - .setResponseSchema(arrayOfSlackConfigObjectsResponse) .setRequestContentType(ContentType.Json) - .setResponseContentType(ContentType.Json) + .addResponse({ + schema: arrayOfSlackConfigObjectsResponse, + contentType: ContentType.Json, + status: 200, + }) .setRetryAttempts(this.config, requestConfig) .setRetryDelayMs(this.config, requestConfig) .setResponseValidation(this.config, requestConfig) @@ -1048,15 +1174,18 @@ export class IntegrationsService extends BaseService { * @returns {Promise>} OK */ async saveSlackIntegration(body: SlackConfig, requestConfig?: RequestConfig): Promise> { - const request = new RequestBuilder() + const request = new RequestBuilder() .setBaseUrl(this.config) .setConfig(this.config) .setMethod('PUT') .setPath('/integrations/slack') .setRequestSchema(slackConfigRequest) - .setResponseSchema(slackConfigResponse) .setRequestContentType(ContentType.Json) - .setResponseContentType(ContentType.Json) + .addResponse({ + schema: slackConfigResponse, + contentType: ContentType.Json, + status: 200, + }) .setRetryAttempts(this.config, requestConfig) .setRetryDelayMs(this.config, requestConfig) .setResponseValidation(this.config, requestConfig) @@ -1070,21 +1199,24 @@ export class IntegrationsService extends BaseService { * Removes a slack integration configuration from the project. This will disable the integration's functionality within the project. * @returns {Promise>} No Content */ - async deleteSlackIntegration(requestConfig?: RequestConfig): Promise> { - const request = new RequestBuilder() + async deleteSlackIntegration(requestConfig?: RequestConfig): Promise> { + const request = new RequestBuilder() .setBaseUrl(this.config) .setConfig(this.config) .setMethod('DELETE') .setPath('/integrations/slack') .setRequestSchema(z.any()) - .setResponseSchema(z.undefined()) .setRequestContentType(ContentType.Json) - .setResponseContentType(ContentType.Json) + .addResponse({ + schema: z.undefined(), + contentType: ContentType.NoContent, + status: 204, + }) .setRetryAttempts(this.config, requestConfig) .setRetryDelayMs(this.config, requestConfig) .setResponseValidation(this.config, requestConfig) .build(); - return this.client.call(request); + return this.client.call(request); } /** @@ -1092,16 +1224,19 @@ export class IntegrationsService extends BaseService { * @param {string} id - * @returns {Promise>} No Content */ - async deleteSlackIntegrationById(id: string, requestConfig?: RequestConfig): Promise> { - const request = new RequestBuilder() + async deleteSlackIntegrationById(id: string, requestConfig?: RequestConfig): Promise> { + const request = new RequestBuilder() .setBaseUrl(this.config) .setConfig(this.config) .setMethod('DELETE') .setPath('/integrations/slack/{id}') .setRequestSchema(z.any()) - .setResponseSchema(z.undefined()) .setRequestContentType(ContentType.Json) - .setResponseContentType(ContentType.Json) + .addResponse({ + schema: z.undefined(), + contentType: ContentType.NoContent, + status: 204, + }) .setRetryAttempts(this.config, requestConfig) .setRetryDelayMs(this.config, requestConfig) .setResponseValidation(this.config, requestConfig) @@ -1110,7 +1245,7 @@ export class IntegrationsService extends BaseService { value: id, }) .build(); - return this.client.call(request); + return this.client.call(request); } /** @@ -1118,15 +1253,18 @@ export class IntegrationsService extends BaseService { * @returns {Promise>} OK */ async getStripeIntegration(requestConfig?: RequestConfig): Promise> { - const request = new RequestBuilder() + const request = new RequestBuilder() .setBaseUrl(this.config) .setConfig(this.config) .setMethod('GET') .setPath('/integrations/stripe') .setRequestSchema(z.any()) - .setResponseSchema(arrayOfStripeConfigObjectsResponse) .setRequestContentType(ContentType.Json) - .setResponseContentType(ContentType.Json) + .addResponse({ + schema: arrayOfStripeConfigObjectsResponse, + contentType: ContentType.Json, + status: 200, + }) .setRetryAttempts(this.config, requestConfig) .setRetryDelayMs(this.config, requestConfig) .setResponseValidation(this.config, requestConfig) @@ -1139,15 +1277,18 @@ export class IntegrationsService extends BaseService { * @returns {Promise>} OK */ async saveStripeIntegration(body: StripeConfig, requestConfig?: RequestConfig): Promise> { - const request = new RequestBuilder() + const request = new RequestBuilder() .setBaseUrl(this.config) .setConfig(this.config) .setMethod('PUT') .setPath('/integrations/stripe') .setRequestSchema(stripeConfigRequest) - .setResponseSchema(stripeConfigResponse) .setRequestContentType(ContentType.Json) - .setResponseContentType(ContentType.Json) + .addResponse({ + schema: stripeConfigResponse, + contentType: ContentType.Json, + status: 200, + }) .setRetryAttempts(this.config, requestConfig) .setRetryDelayMs(this.config, requestConfig) .setResponseValidation(this.config, requestConfig) @@ -1161,21 +1302,24 @@ export class IntegrationsService extends BaseService { * Removes a stripe integration configuration from the project. This will disable the integration's functionality within the project. * @returns {Promise>} No Content */ - async deleteStripeIntegration(requestConfig?: RequestConfig): Promise> { - const request = new RequestBuilder() + async deleteStripeIntegration(requestConfig?: RequestConfig): Promise> { + const request = new RequestBuilder() .setBaseUrl(this.config) .setConfig(this.config) .setMethod('DELETE') .setPath('/integrations/stripe') .setRequestSchema(z.any()) - .setResponseSchema(z.undefined()) .setRequestContentType(ContentType.Json) - .setResponseContentType(ContentType.Json) + .addResponse({ + schema: z.undefined(), + contentType: ContentType.NoContent, + status: 204, + }) .setRetryAttempts(this.config, requestConfig) .setRetryDelayMs(this.config, requestConfig) .setResponseValidation(this.config, requestConfig) .build(); - return this.client.call(request); + return this.client.call(request); } /** @@ -1183,16 +1327,19 @@ export class IntegrationsService extends BaseService { * @param {string} id - * @returns {Promise>} No Content */ - async deleteStripeIntegrationById(id: string, requestConfig?: RequestConfig): Promise> { - const request = new RequestBuilder() + async deleteStripeIntegrationById(id: string, requestConfig?: RequestConfig): Promise> { + const request = new RequestBuilder() .setBaseUrl(this.config) .setConfig(this.config) .setMethod('DELETE') .setPath('/integrations/stripe/{id}') .setRequestSchema(z.any()) - .setResponseSchema(z.undefined()) .setRequestContentType(ContentType.Json) - .setResponseContentType(ContentType.Json) + .addResponse({ + schema: z.undefined(), + contentType: ContentType.NoContent, + status: 204, + }) .setRetryAttempts(this.config, requestConfig) .setRetryDelayMs(this.config, requestConfig) .setResponseValidation(this.config, requestConfig) @@ -1201,7 +1348,7 @@ export class IntegrationsService extends BaseService { value: id, }) .build(); - return this.client.call(request); + return this.client.call(request); } /** @@ -1209,15 +1356,18 @@ export class IntegrationsService extends BaseService { * @returns {Promise>} OK */ async getTemplatesIntegration(requestConfig?: RequestConfig): Promise> { - const request = new RequestBuilder() + const request = new RequestBuilder() .setBaseUrl(this.config) .setConfig(this.config) .setMethod('GET') .setPath('/integrations/templates') .setRequestSchema(z.any()) - .setResponseSchema(arrayOfTemplatesConfigObjectsResponse) .setRequestContentType(ContentType.Json) - .setResponseContentType(ContentType.Json) + .addResponse({ + schema: arrayOfTemplatesConfigObjectsResponse, + contentType: ContentType.Json, + status: 200, + }) .setRetryAttempts(this.config, requestConfig) .setRetryDelayMs(this.config, requestConfig) .setResponseValidation(this.config, requestConfig) @@ -1230,15 +1380,18 @@ export class IntegrationsService extends BaseService { * @returns {Promise>} OK */ async saveTemplatesIntegration(body: any, requestConfig?: RequestConfig): Promise> { - const request = new RequestBuilder() + const request = new RequestBuilder() .setBaseUrl(this.config) .setConfig(this.config) .setMethod('PUT') .setPath('/integrations/templates') .setRequestSchema(z.any()) - .setResponseSchema(z.any()) .setRequestContentType(ContentType.Json) - .setResponseContentType(ContentType.Json) + .addResponse({ + schema: z.any(), + contentType: ContentType.Json, + status: 200, + }) .setRetryAttempts(this.config, requestConfig) .setRetryDelayMs(this.config, requestConfig) .setResponseValidation(this.config, requestConfig) @@ -1252,21 +1405,24 @@ export class IntegrationsService extends BaseService { * Removes a templates integration configuration from the project. This will disable the integration's functionality within the project. * @returns {Promise>} No Content */ - async deleteTemplatesIntegration(requestConfig?: RequestConfig): Promise> { - const request = new RequestBuilder() + async deleteTemplatesIntegration(requestConfig?: RequestConfig): Promise> { + const request = new RequestBuilder() .setBaseUrl(this.config) .setConfig(this.config) .setMethod('DELETE') .setPath('/integrations/templates') .setRequestSchema(z.any()) - .setResponseSchema(z.undefined()) .setRequestContentType(ContentType.Json) - .setResponseContentType(ContentType.Json) + .addResponse({ + schema: z.undefined(), + contentType: ContentType.NoContent, + status: 204, + }) .setRetryAttempts(this.config, requestConfig) .setRetryDelayMs(this.config, requestConfig) .setResponseValidation(this.config, requestConfig) .build(); - return this.client.call(request); + return this.client.call(request); } /** @@ -1274,16 +1430,19 @@ export class IntegrationsService extends BaseService { * @param {string} id - * @returns {Promise>} No Content */ - async deleteTemplatesIntegrationById(id: string, requestConfig?: RequestConfig): Promise> { - const request = new RequestBuilder() + async deleteTemplatesIntegrationById(id: string, requestConfig?: RequestConfig): Promise> { + const request = new RequestBuilder() .setBaseUrl(this.config) .setConfig(this.config) .setMethod('DELETE') .setPath('/integrations/templates/{id}') .setRequestSchema(z.any()) - .setResponseSchema(z.undefined()) .setRequestContentType(ContentType.Json) - .setResponseContentType(ContentType.Json) + .addResponse({ + schema: z.undefined(), + contentType: ContentType.NoContent, + status: 204, + }) .setRetryAttempts(this.config, requestConfig) .setRetryDelayMs(this.config, requestConfig) .setResponseValidation(this.config, requestConfig) @@ -1292,7 +1451,7 @@ export class IntegrationsService extends BaseService { value: id, }) .build(); - return this.client.call(request); + return this.client.call(request); } /** @@ -1300,15 +1459,18 @@ export class IntegrationsService extends BaseService { * @returns {Promise>} OK */ async getTwilioIntegration(requestConfig?: RequestConfig): Promise> { - const request = new RequestBuilder() + const request = new RequestBuilder() .setBaseUrl(this.config) .setConfig(this.config) .setMethod('GET') .setPath('/integrations/twilio') .setRequestSchema(z.any()) - .setResponseSchema(arrayOfTwilioConfigObjectsResponse) .setRequestContentType(ContentType.Json) - .setResponseContentType(ContentType.Json) + .addResponse({ + schema: arrayOfTwilioConfigObjectsResponse, + contentType: ContentType.Json, + status: 200, + }) .setRetryAttempts(this.config, requestConfig) .setRetryDelayMs(this.config, requestConfig) .setResponseValidation(this.config, requestConfig) @@ -1321,15 +1483,18 @@ export class IntegrationsService extends BaseService { * @returns {Promise>} OK */ async saveTwilioIntegration(body: TwilioConfig, requestConfig?: RequestConfig): Promise> { - const request = new RequestBuilder() + const request = new RequestBuilder() .setBaseUrl(this.config) .setConfig(this.config) .setMethod('PUT') .setPath('/integrations/twilio') .setRequestSchema(twilioConfigRequest) - .setResponseSchema(twilioConfigResponse) .setRequestContentType(ContentType.Json) - .setResponseContentType(ContentType.Json) + .addResponse({ + schema: twilioConfigResponse, + contentType: ContentType.Json, + status: 200, + }) .setRetryAttempts(this.config, requestConfig) .setRetryDelayMs(this.config, requestConfig) .setResponseValidation(this.config, requestConfig) @@ -1343,21 +1508,24 @@ export class IntegrationsService extends BaseService { * Removes a twilio integration configuration from the project. This will disable the integration's functionality within the project. * @returns {Promise>} No Content */ - async deleteTwilioIntegration(requestConfig?: RequestConfig): Promise> { - const request = new RequestBuilder() + async deleteTwilioIntegration(requestConfig?: RequestConfig): Promise> { + const request = new RequestBuilder() .setBaseUrl(this.config) .setConfig(this.config) .setMethod('DELETE') .setPath('/integrations/twilio') .setRequestSchema(z.any()) - .setResponseSchema(z.undefined()) .setRequestContentType(ContentType.Json) - .setResponseContentType(ContentType.Json) + .addResponse({ + schema: z.undefined(), + contentType: ContentType.NoContent, + status: 204, + }) .setRetryAttempts(this.config, requestConfig) .setRetryDelayMs(this.config, requestConfig) .setResponseValidation(this.config, requestConfig) .build(); - return this.client.call(request); + return this.client.call(request); } /** @@ -1365,16 +1533,19 @@ export class IntegrationsService extends BaseService { * @param {string} id - * @returns {Promise>} No Content */ - async deleteTwilioIntegrationById(id: string, requestConfig?: RequestConfig): Promise> { - const request = new RequestBuilder() + async deleteTwilioIntegrationById(id: string, requestConfig?: RequestConfig): Promise> { + const request = new RequestBuilder() .setBaseUrl(this.config) .setConfig(this.config) .setMethod('DELETE') .setPath('/integrations/twilio/{id}') .setRequestSchema(z.any()) - .setResponseSchema(z.undefined()) .setRequestContentType(ContentType.Json) - .setResponseContentType(ContentType.Json) + .addResponse({ + schema: z.undefined(), + contentType: ContentType.NoContent, + status: 204, + }) .setRetryAttempts(this.config, requestConfig) .setRetryDelayMs(this.config, requestConfig) .setResponseValidation(this.config, requestConfig) @@ -1383,7 +1554,7 @@ export class IntegrationsService extends BaseService { value: id, }) .build(); - return this.client.call(request); + return this.client.call(request); } /** @@ -1391,15 +1562,18 @@ export class IntegrationsService extends BaseService { * @returns {Promise>} OK */ async getWebPushIntegration(requestConfig?: RequestConfig): Promise> { - const request = new RequestBuilder() + const request = new RequestBuilder() .setBaseUrl(this.config) .setConfig(this.config) .setMethod('GET') .setPath('/integrations/web_push') .setRequestSchema(z.any()) - .setResponseSchema(arrayOfWebpushConfigObjectsResponse) .setRequestContentType(ContentType.Json) - .setResponseContentType(ContentType.Json) + .addResponse({ + schema: arrayOfWebpushConfigObjectsResponse, + contentType: ContentType.Json, + status: 200, + }) .setRetryAttempts(this.config, requestConfig) .setRetryDelayMs(this.config, requestConfig) .setResponseValidation(this.config, requestConfig) @@ -1415,15 +1589,18 @@ export class IntegrationsService extends BaseService { body: WebpushConfig, requestConfig?: RequestConfig, ): Promise> { - const request = new RequestBuilder() + const request = new RequestBuilder() .setBaseUrl(this.config) .setConfig(this.config) .setMethod('PUT') .setPath('/integrations/web_push') .setRequestSchema(webpushConfigRequest) - .setResponseSchema(webpushConfigResponse) .setRequestContentType(ContentType.Json) - .setResponseContentType(ContentType.Json) + .addResponse({ + schema: webpushConfigResponse, + contentType: ContentType.Json, + status: 200, + }) .setRetryAttempts(this.config, requestConfig) .setRetryDelayMs(this.config, requestConfig) .setResponseValidation(this.config, requestConfig) @@ -1437,21 +1614,24 @@ export class IntegrationsService extends BaseService { * Removes a web_push integration configuration from the project. This will disable the integration's functionality within the project. * @returns {Promise>} No Content */ - async deleteWebPushIntegration(requestConfig?: RequestConfig): Promise> { - const request = new RequestBuilder() + async deleteWebPushIntegration(requestConfig?: RequestConfig): Promise> { + const request = new RequestBuilder() .setBaseUrl(this.config) .setConfig(this.config) .setMethod('DELETE') .setPath('/integrations/web_push') .setRequestSchema(z.any()) - .setResponseSchema(z.undefined()) .setRequestContentType(ContentType.Json) - .setResponseContentType(ContentType.Json) + .addResponse({ + schema: z.undefined(), + contentType: ContentType.NoContent, + status: 204, + }) .setRetryAttempts(this.config, requestConfig) .setRetryDelayMs(this.config, requestConfig) .setResponseValidation(this.config, requestConfig) .build(); - return this.client.call(request); + return this.client.call(request); } /** @@ -1459,16 +1639,19 @@ export class IntegrationsService extends BaseService { * @param {string} id - * @returns {Promise>} No Content */ - async deleteWebPushIntegrationById(id: string, requestConfig?: RequestConfig): Promise> { - const request = new RequestBuilder() + async deleteWebPushIntegrationById(id: string, requestConfig?: RequestConfig): Promise> { + const request = new RequestBuilder() .setBaseUrl(this.config) .setConfig(this.config) .setMethod('DELETE') .setPath('/integrations/web_push/{id}') .setRequestSchema(z.any()) - .setResponseSchema(z.undefined()) .setRequestContentType(ContentType.Json) - .setResponseContentType(ContentType.Json) + .addResponse({ + schema: z.undefined(), + contentType: ContentType.NoContent, + status: 204, + }) .setRetryAttempts(this.config, requestConfig) .setRetryDelayMs(this.config, requestConfig) .setResponseValidation(this.config, requestConfig) @@ -1477,6 +1660,6 @@ export class IntegrationsService extends BaseService { value: id, }) .build(); - return this.client.call(request); + return this.client.call(request); } } diff --git a/packages/project-client/src/services/integrations/models/ses-config.ts b/packages/project-client/src/services/integrations/models/ses-config.ts index efd40082c..bf6a83d37 100644 --- a/packages/project-client/src/services/integrations/models/ses-config.ts +++ b/packages/project-client/src/services/integrations/models/ses-config.ts @@ -7,7 +7,6 @@ import { sesConfigFrom, sesConfigFromRequest, sesConfigFromResponse } from './se */ export const sesConfig = z.lazy(() => { return z.object({ - endpoint: z.string().min(1).optional(), from: sesConfigFrom.optional(), keyId: z.string().min(1), region: z.string().min(1), @@ -18,7 +17,6 @@ export const sesConfig = z.lazy(() => { /** * * @typedef {SesConfig} sesConfig - * @property {string} - HTTP endpoint to send requests to (testing only) * @property {SesConfigFrom} * @property {string} - AWS Access Key ID * @property {string} - AWS Region @@ -33,14 +31,12 @@ export type SesConfig = z.infer; export const sesConfigResponse = z.lazy(() => { return z .object({ - endpoint: z.string().min(1).optional(), from: sesConfigFromResponse.optional(), key_id: z.string().min(1), region: z.string().min(1), secret_key: z.string().min(1), }) .transform((data) => ({ - endpoint: data['endpoint'], from: data['from'], keyId: data['key_id'], region: data['region'], @@ -55,14 +51,12 @@ export const sesConfigResponse = z.lazy(() => { export const sesConfigRequest = z.lazy(() => { return z .object({ - endpoint: z.string().nullish(), from: sesConfigFromRequest.nullish(), keyId: z.string().nullish(), region: z.string().nullish(), secretKey: z.string().nullish(), }) .transform((data) => ({ - endpoint: data['endpoint'], from: data['from'], key_id: data['keyId'], region: data['region'], diff --git a/packages/project-client/src/services/jwt/jwt.ts b/packages/project-client/src/services/jwt/jwt.ts index c9dcf58ef..403409674 100644 --- a/packages/project-client/src/services/jwt/jwt.ts +++ b/packages/project-client/src/services/jwt/jwt.ts @@ -26,15 +26,18 @@ export class JwtService extends BaseService { params?: FetchProjectTokensParams, requestConfig?: RequestConfig, ): Promise> { - const request = new RequestBuilder() + const request = new RequestBuilder() .setBaseUrl(this.config) .setConfig(this.config) .setMethod('GET') .setPath('/jwt/project') .setRequestSchema(z.any()) - .setResponseSchema(arrayOfFetchTokensResponseTokensResponse) .setRequestContentType(ContentType.Json) - .setResponseContentType(ContentType.Json) + .addResponse({ + schema: arrayOfFetchTokensResponseTokensResponse, + contentType: ContentType.Json, + status: 200, + }) .setRetryAttempts(this.config, requestConfig) .setRetryDelayMs(this.config, requestConfig) .setResponseValidation(this.config, requestConfig) @@ -62,15 +65,18 @@ export class JwtService extends BaseService { body: CreateProjectTokenRequest, requestConfig?: RequestConfig, ): Promise> { - const request = new RequestBuilder() + const request = new RequestBuilder() .setBaseUrl(this.config) .setConfig(this.config) .setMethod('POST') .setPath('/jwt/project') .setRequestSchema(createProjectTokenRequestRequest) - .setResponseSchema(accessTokenResponse) .setRequestContentType(ContentType.Json) - .setResponseContentType(ContentType.Json) + .addResponse({ + schema: accessTokenResponse, + contentType: ContentType.Json, + status: 201, + }) .setRetryAttempts(this.config, requestConfig) .setRetryDelayMs(this.config, requestConfig) .setResponseValidation(this.config, requestConfig) @@ -86,15 +92,18 @@ export class JwtService extends BaseService { * @returns {Promise>} OK */ async discardProjectJwt(tokenId: string, requestConfig?: RequestConfig): Promise> { - const request = new RequestBuilder() + const request = new RequestBuilder() .setBaseUrl(this.config) .setConfig(this.config) .setMethod('DELETE') .setPath('/jwt/project/{token_id}') .setRequestSchema(z.any()) - .setResponseSchema(discardTokenResponseResponse) .setRequestContentType(ContentType.Json) - .setResponseContentType(ContentType.Json) + .addResponse({ + schema: discardTokenResponseResponse, + contentType: ContentType.Json, + status: 200, + }) .setRetryAttempts(this.config, requestConfig) .setRetryDelayMs(this.config, requestConfig) .setResponseValidation(this.config, requestConfig) @@ -111,15 +120,18 @@ export class JwtService extends BaseService { * @returns {Promise>} Created */ async createUserJwt(body: CreateUserTokenRequest, requestConfig?: RequestConfig): Promise> { - const request = new RequestBuilder() + const request = new RequestBuilder() .setBaseUrl(this.config) .setConfig(this.config) .setMethod('POST') .setPath('/jwt/user') .setRequestSchema(createUserTokenRequestRequest) - .setResponseSchema(accessTokenResponse) .setRequestContentType(ContentType.Json) - .setResponseContentType(ContentType.Json) + .addResponse({ + schema: accessTokenResponse, + contentType: ContentType.Json, + status: 201, + }) .setRetryAttempts(this.config, requestConfig) .setRetryDelayMs(this.config, requestConfig) .setResponseValidation(this.config, requestConfig) @@ -135,15 +147,18 @@ export class JwtService extends BaseService { * @returns {Promise>} OK */ async discardUserJwt(tokenId: string, requestConfig?: RequestConfig): Promise> { - const request = new RequestBuilder() + const request = new RequestBuilder() .setBaseUrl(this.config) .setConfig(this.config) .setMethod('DELETE') .setPath('/jwt/user/{token_id}') .setRequestSchema(z.any()) - .setResponseSchema(discardTokenResponseResponse) .setRequestContentType(ContentType.Json) - .setResponseContentType(ContentType.Json) + .addResponse({ + schema: discardTokenResponseResponse, + contentType: ContentType.Json, + status: 200, + }) .setRetryAttempts(this.config, requestConfig) .setRetryDelayMs(this.config, requestConfig) .setResponseValidation(this.config, requestConfig) @@ -168,15 +183,18 @@ export class JwtService extends BaseService { params?: FetchUserTokensParams, requestConfig?: RequestConfig, ): Promise> { - const request = new RequestBuilder() + const request = new RequestBuilder() .setBaseUrl(this.config) .setConfig(this.config) .setMethod('GET') .setPath('/jwt/user/{user_id}') .setRequestSchema(z.any()) - .setResponseSchema(arrayOfFetchTokensResponseTokensResponse) .setRequestContentType(ContentType.Json) - .setResponseContentType(ContentType.Json) + .addResponse({ + schema: arrayOfFetchTokensResponseTokensResponse, + contentType: ContentType.Json, + status: 200, + }) .setRetryAttempts(this.config, requestConfig) .setRetryDelayMs(this.config, requestConfig) .setResponseValidation(this.config, requestConfig) diff --git a/packages/user-client/README.md b/packages/user-client/README.md index f0e0c69db..2f67d4cb1 100644 --- a/packages/user-client/README.md +++ b/packages/user-client/README.md @@ -11,7 +11,7 @@ Welcome to the Client SDK documentation. This guide will help you get started wi ## About the API -OpenAPI 3.1.0 Specification for MagicBell API. +OpenAPI 3.0.3 Specification for MagicBell API. ## Table of Contents @@ -83,7 +83,7 @@ import { Client } from '@magicbell/user-client'; }); const { data } = await client.channels.getMobilePushApnsTokens({ - pageSize: 6, + pageSize: 4, pageAfter: 'page[after]', pageBefore: 'page[before]', }); diff --git a/packages/user-client/documentation/services/ChannelsService.md b/packages/user-client/documentation/services/ChannelsService.md index a7b181d97..a9a072322 100644 --- a/packages/user-client/documentation/services/ChannelsService.md +++ b/packages/user-client/documentation/services/ChannelsService.md @@ -59,7 +59,7 @@ import { Client } from '@magicbell/user-client'; }); const { data } = await client.channels.getMobilePushApnsTokens({ - pageSize: 6, + pageSize: 4, pageAfter: 'page[after]', pageBefore: 'page[before]', }); @@ -99,7 +99,7 @@ import { ApnsToken, Client } from '@magicbell/user-client'; const apnsToken: ApnsToken = { appId: 'app_id', - deviceToken: 'voluptate paria', + deviceToken: 'irurelabore qui', installationId: apnsTokenInstallationId, }; @@ -205,7 +205,7 @@ import { Client } from '@magicbell/user-client'; }); const { data } = await client.channels.getMobilePushExpoTokens({ - pageSize: 6, + pageSize: 4, pageAfter: 'page[after]', pageBefore: 'page[before]', }); @@ -347,7 +347,7 @@ import { Client } from '@magicbell/user-client'; }); const { data } = await client.channels.getMobilePushFcmTokens({ - pageSize: 10, + pageSize: 123, pageAfter: 'page[after]', pageBefore: 'page[before]', }); @@ -386,7 +386,7 @@ import { Client, FcmToken } from '@magicbell/user-client'; const fcmTokenInstallationId = FcmTokenInstallationId.DEVELOPMENT; const fcmToken: FcmToken = { - deviceToken: 'eiusmod esse ni', + deviceToken: 'consequat sed c', installationId: fcmTokenInstallationId, }; @@ -492,7 +492,7 @@ import { Client } from '@magicbell/user-client'; }); const { data } = await client.channels.getSlackTokens({ - pageSize: 2, + pageSize: 4, pageAfter: 'page[after]', pageBefore: 'page[before]', }); @@ -645,7 +645,7 @@ import { Client } from '@magicbell/user-client'; }); const { data } = await client.channels.getTeamsTokens({ - pageSize: 2, + pageSize: 123, pageAfter: 'page[after]', pageBefore: 'page[before]', }); @@ -791,7 +791,7 @@ import { Client } from '@magicbell/user-client'; }); const { data } = await client.channels.getWebPushTokens({ - pageSize: 5, + pageSize: 4, pageAfter: 'page[after]', pageBefore: 'page[before]', }); diff --git a/packages/user-client/documentation/services/IntegrationsService.md b/packages/user-client/documentation/services/IntegrationsService.md index 2e151e4fc..40ac2fbf7 100644 --- a/packages/user-client/documentation/services/IntegrationsService.md +++ b/packages/user-client/documentation/services/IntegrationsService.md @@ -46,7 +46,7 @@ import { Client, InboxConfig } from '@magicbell/user-client'; const banner: Banner = { backgroundColor: 'backgroundColor', - backgroundOpacity: 9.57, + backgroundOpacity: 9.3, fontSize: 'fontSize', textColor: 'textColor', }; @@ -214,7 +214,7 @@ import { Client, SlackInstallation } from '@magicbell/user-client'; const authedUser: AuthedUser = { accessToken: 'access_token', - expiresIn: 7, + expiresIn: 10, id: 'id', refreshToken: 'refresh_token', scope: 'scope', @@ -243,8 +243,8 @@ import { Client, SlackInstallation } from '@magicbell/user-client'; authedUser: authedUser, botUserId: 'bot_user_id', enterprise: enterprise, - expiresIn: 10, - id: 'YDW09447', + expiresIn: 3, + id: 'F', incomingWebhook: incomingWebhook, isEnterpriseInstall: true, refreshToken: 'refresh_token', diff --git a/packages/user-client/src/http/client.ts b/packages/user-client/src/http/client.ts index 597626168..186cf2a22 100644 --- a/packages/user-client/src/http/client.ts +++ b/packages/user-client/src/http/client.ts @@ -21,15 +21,15 @@ export class HttpClient { this.requestHandlerChain.addHandler(new TerminatingHandler()); } - call(request: Request): Promise> { + call(request: Request): Promise> { return this.requestHandlerChain.callChain(request); } - async *stream(request: Request): AsyncGenerator> { + async *stream(request: Request): AsyncGenerator> { yield* this.requestHandlerChain.streamChain(request); } - public async callPaginated(request: Request): Promise> { + public async callPaginated(request: Request): Promise> { const response = await this.call(request as any); if (!response.data) { @@ -50,7 +50,7 @@ export class HttpClient { this.config = config; } - private getPage(request: Request, data: FullResponse): Page { + private getPage(request: Request, data: FullResponse): Page { if (!request.pagination) { throw new Error('getPage called for request without pagination property'); } diff --git a/packages/user-client/src/http/handlers/auth-handler.ts b/packages/user-client/src/http/handlers/auth-handler.ts index 8fcf99d64..c338e8325 100644 --- a/packages/user-client/src/http/handlers/auth-handler.ts +++ b/packages/user-client/src/http/handlers/auth-handler.ts @@ -5,27 +5,27 @@ import { HttpResponse, RequestHandler } from '../types.js'; export class AuthHandler implements RequestHandler { next?: RequestHandler; - public async handle(request: Request): Promise> { + public async handle(request: Request): Promise> { const requestWithAuth = this.addAccessTokenHeader(request); if (!this.next) { throw new Error(`No next handler set in ${AuthHandler.name}`); } - return this.next.handle(requestWithAuth); + return this.next.handle(requestWithAuth); } - public async *stream(request: Request): AsyncGenerator> { + public async *stream(request: Request): AsyncGenerator> { const requestWithAuth = this.addAccessTokenHeader(request); if (!this.next) { throw new Error(`No next handler set in ${AuthHandler.name}`); } - yield* this.next.stream(requestWithAuth); + yield* this.next.stream(requestWithAuth); } - private addAccessTokenHeader(request: Request): Request { + private addAccessTokenHeader(request: Request): Request { const { token } = request.config; if (!token) { return request; diff --git a/packages/user-client/src/http/handlers/handler-chain.ts b/packages/user-client/src/http/handlers/handler-chain.ts index 7f55f13db..e794dac84 100644 --- a/packages/user-client/src/http/handlers/handler-chain.ts +++ b/packages/user-client/src/http/handlers/handler-chain.ts @@ -12,19 +12,19 @@ export class RequestHandlerChain { this.handlers.push(handler); } - async callChain(request: Request): Promise> { + async callChain(request: Request): Promise> { if (!this.handlers.length) { throw new Error('No handlers added to the chain'); } - return this.handlers[0].handle(request); + return this.handlers[0].handle(request); } - async *streamChain(request: Request): AsyncGenerator> { + async *streamChain(request: Request): AsyncGenerator> { if (!this.handlers.length) { throw new Error('No handlers added to the chain'); } - yield* this.handlers[0].stream(request); + yield* this.handlers[0].stream(request); } } diff --git a/packages/user-client/src/http/handlers/hook-handler.ts b/packages/user-client/src/http/handlers/hook-handler.ts index 0850a72c1..d7a1429e2 100644 --- a/packages/user-client/src/http/handlers/hook-handler.ts +++ b/packages/user-client/src/http/handlers/hook-handler.ts @@ -8,7 +8,7 @@ export class HookHandler implements RequestHandler { constructor(private readonly hook: Hook) {} - async handle(request: Request): Promise> { + async handle(request: Request): Promise> { if (!this.next) { throw new Error('No next handler set in hook handler.'); } @@ -19,7 +19,7 @@ export class HookHandler implements RequestHandler { const nextRequest = await hook.beforeRequest(request, hookParams); - const response = await this.next.handle(nextRequest); + const response = await this.next.handle(nextRequest); if (response.metadata.status < 400) { return await hook.afterResponse(nextRequest, response, hookParams); @@ -28,7 +28,7 @@ export class HookHandler implements RequestHandler { throw await hook.onError(nextRequest, response, hookParams); } - async *stream(request: Request): AsyncGenerator> { + async *stream(request: Request): AsyncGenerator> { if (!this.next) { throw new Error('No next handler set in hook handler.'); } @@ -39,7 +39,7 @@ export class HookHandler implements RequestHandler { const nextRequest = await hook.beforeRequest(request, hookParams); - const stream = this.next.stream(nextRequest); + const stream = this.next.stream(nextRequest); for await (const response of stream) { if (response.metadata.status < 400) { @@ -50,7 +50,7 @@ export class HookHandler implements RequestHandler { } } - private getHookParams(_request: Request): Map { + private getHookParams(_request: Request): Map { const hookParams: Map = new Map(); return hookParams; } diff --git a/packages/user-client/src/http/handlers/request-validation-handler.ts b/packages/user-client/src/http/handlers/request-validation-handler.ts index b35511fa9..6dc0056d5 100644 --- a/packages/user-client/src/http/handlers/request-validation-handler.ts +++ b/packages/user-client/src/http/handlers/request-validation-handler.ts @@ -4,27 +4,27 @@ import { ContentType, HttpResponse, RequestHandler } from '../types.js'; export class RequestValidationHandler implements RequestHandler { next?: RequestHandler; - async handle(request: Request): Promise> { + async handle(request: Request): Promise> { if (!this.next) { throw new Error('No next handler set in ContentTypeHandler.'); } this.validateRequest(request); - return this.next.handle(request); + return this.next.handle(request); } - async *stream(request: Request): AsyncGenerator> { + async *stream(request: Request): AsyncGenerator> { if (!this.next) { throw new Error('No next handler set in ContentTypeHandler.'); } this.validateRequest(request); - yield* this.next.stream(request); + yield* this.next.stream(request); } - validateRequest(request: Request): void { + validateRequest(request: Request): void { if (request.requestContentType === ContentType.Json) { request.body = JSON.stringify(request.requestSchema?.parse(request.body)); } else if ( @@ -42,7 +42,7 @@ export class RequestValidationHandler implements RequestHandler { } } - toFormUrlEncoded(request: Request): string { + toFormUrlEncoded(request: Request): string { if (request.body === undefined) { return ''; } diff --git a/packages/user-client/src/http/handlers/response-validation-handler.ts b/packages/user-client/src/http/handlers/response-validation-handler.ts index d1fa7370a..eec00a539 100644 --- a/packages/user-client/src/http/handlers/response-validation-handler.ts +++ b/packages/user-client/src/http/handlers/response-validation-handler.ts @@ -1,24 +1,25 @@ import { ZodUndefined } from 'zod'; -import { Request } from '../transport/request.js'; +import { Request, ResponseDefinition } from '../transport/request.js'; import { ContentType, HttpResponse, RequestHandler } from '../types.js'; +import { ResponseMatcher } from '../utils/response-matcher.js'; export class ResponseValidationHandler implements RequestHandler { next?: RequestHandler; - async handle(request: Request): Promise> { - const response = await this.next!.handle(request); + async handle(request: Request): Promise> { + const response = await this.next!.handle(request); - return this.decodeBody(request, response); + return this.decodeBody(request, response); } - async *stream(request: Request): AsyncGenerator> { - const stream = this.next!.stream(request); + async *stream(request: Request): AsyncGenerator> { + const stream = this.next!.stream(request); for await (const response of stream) { - const responseChunks = this.splitByDataChunks(response); + const responseChunks = this.splitByDataChunks(response); for (const chunk of responseChunks) { - yield this.decodeBody(request, chunk); + yield this.decodeBody(request, chunk); } } } @@ -39,70 +40,91 @@ export class ResponseValidationHandler implements RequestHandler { })); } - private decodeBody(request: Request, response: HttpResponse): HttpResponse { - if (!this.hasContent(request, response)) { - return response; - } - - if (request.responseContentType === ContentType.Binary || request.responseContentType === ContentType.Image) { - return this.decodeFile(request, response); - } + private decodeBody(request: Request, response: HttpResponse): HttpResponse { + const responseMatcher = new ResponseMatcher(request.responses); + const responseDefinition = responseMatcher.getResponseDefinition(response); - if (request.responseContentType === ContentType.MultipartFormData) { - return this.decodeMultipartFormData(request, response); + if (!responseDefinition || !this.hasContent(responseDefinition, response)) { + return response; } - if (request.responseContentType === ContentType.Text || request.responseContentType === ContentType.Xml) { - return this.decodeText(request, response); - } + const contentType = responseDefinition.contentType; + const contentTypeHandlers: { + [key: string]: (req: Request, resDef: ResponseDefinition, res: HttpResponse) => HttpResponse; + } = { + [ContentType.Binary]: this.decodeFile, + [ContentType.Image]: this.decodeFile, + [ContentType.MultipartFormData]: this.decodeMultipartFormData, + [ContentType.Text]: this.decodeText, + [ContentType.Xml]: this.decodeText, + [ContentType.FormUrlEncoded]: this.decodeFormUrlEncoded, + [ContentType.EventStream]: this.decodeEventStream, + }; - if (request.responseContentType === ContentType.FormUrlEncoded) { - return this.decodeFormUrlEncoded(request, response); + if (contentTypeHandlers[contentType]) { + return contentTypeHandlers[contentType].call(this, request, responseDefinition, response); } - if ( - request.responseContentType === ContentType.EventStream || - response.metadata.headers['content-type'].includes('text/event-stream') - ) { - return this.decodeEventStream(request, response); + if (response.metadata.headers['content-type']?.includes('text/event-stream')) { + return this.decodeEventStream(request, responseDefinition, response); } - return this.decodeJson(request, response); + return this.decodeJson(request, responseDefinition, response); } - private decodeFile(request: Request, response: HttpResponse): HttpResponse { + private decodeFile( + request: Request, + responseDefinition: ResponseDefinition, + response: HttpResponse, + ): HttpResponse { return { ...response, - data: this.validate(request, response.raw), + data: this.validate(request, responseDefinition, response.raw), }; } - private decodeMultipartFormData(request: Request, response: HttpResponse): HttpResponse { + private decodeMultipartFormData( + request: Request, + responseDefinition: ResponseDefinition, + response: HttpResponse, + ): HttpResponse { const formData = this.fromFormData(response.raw); return { ...response, - data: this.validate(request, formData), + data: this.validate(request, responseDefinition, formData), }; } - private decodeText(request: Request, response: HttpResponse): HttpResponse { + private decodeText( + request: Request, + responseDefinition: ResponseDefinition, + response: HttpResponse, + ): HttpResponse { const decodedBody = new TextDecoder().decode(response.raw); return { ...response, - data: this.validate(request, decodedBody), + data: this.validate(request, responseDefinition, decodedBody), }; } - private decodeFormUrlEncoded(request: Request, response: HttpResponse): HttpResponse { + private decodeFormUrlEncoded( + request: Request, + responseDefinition: ResponseDefinition, + response: HttpResponse, + ): HttpResponse { const decodedBody = new TextDecoder().decode(response.raw); const urlEncoded = this.fromUrlEncoded(decodedBody); return { ...response, - data: this.validate(request, urlEncoded), + data: this.validate(request, responseDefinition, urlEncoded), }; } - private decodeEventStream(request: Request, response: HttpResponse): HttpResponse { + private decodeEventStream( + request: Request, + responseDefinition: ResponseDefinition, + response: HttpResponse, + ): HttpResponse { let decodedBody = new TextDecoder().decode(response.raw); if (decodedBody.startsWith('data: ')) { decodedBody = decodedBody.substring(6); @@ -111,29 +133,35 @@ export class ResponseValidationHandler implements RequestHandler { const json = JSON.parse(decodedBody); return { ...response, - data: this.validate(request, json), + data: this.validate(request, responseDefinition, json), }; } - private decodeJson(request: Request, response: HttpResponse): HttpResponse { + private decodeJson( + request: Request, + responseDefinition: ResponseDefinition, + response: HttpResponse, + ): HttpResponse { const decodedBody = new TextDecoder().decode(response.raw); const json = JSON.parse(decodedBody); return { ...response, - data: this.validate(request, json), + data: this.validate(request, responseDefinition, json), }; } - private validate(request: Request, data: any): T { + private validate(request: Request, response: ResponseDefinition, data: any): T { if (request.validation?.responseValidation) { - return request.responseSchema.parse(data); + return response.schema.parse(data); } return data; } - private hasContent(request: Request, response: HttpResponse): boolean { + private hasContent(responseDefinition: ResponseDefinition, response: HttpResponse): boolean { return ( - !!request.responseSchema && !(request.responseSchema instanceof ZodUndefined) && response.metadata.status !== 204 + !!responseDefinition.schema && + !(responseDefinition.schema instanceof ZodUndefined) && + response.metadata.status !== 204 ); } diff --git a/packages/user-client/src/http/handlers/retry-handler.ts b/packages/user-client/src/http/handlers/retry-handler.ts index e9ac00351..bfe4adc94 100644 --- a/packages/user-client/src/http/handlers/retry-handler.ts +++ b/packages/user-client/src/http/handlers/retry-handler.ts @@ -5,14 +5,14 @@ import { HttpResponse, RequestHandler } from '../types.js'; export class RetryHandler implements RequestHandler { next?: RequestHandler; - async handle(request: Request): Promise> { + async handle(request: Request): Promise> { if (!this.next) { throw new Error('No next handler set in retry handler.'); } for (let attempt = 1; attempt <= request.retry.attempts; attempt++) { try { - return await this.next.handle(request); + return await this.next.handle(request); } catch (error: any) { if (!this.shouldRetry(error) || attempt === request.retry.attempts) { throw error; @@ -24,14 +24,14 @@ export class RetryHandler implements RequestHandler { throw new Error('Error retrying request.'); } - async *stream(request: Request): AsyncGenerator> { + async *stream(request: Request): AsyncGenerator> { if (!this.next) { throw new Error('No next handler set in retry handler.'); } for (let attempt = 1; attempt <= request.retry.attempts; attempt++) { try { - yield* this.next.stream(request); + yield* this.next.stream(request); return; } catch (error: any) { if (!this.shouldRetry(error) || attempt === request.retry.attempts) { diff --git a/packages/user-client/src/http/handlers/terminating-handler.ts b/packages/user-client/src/http/handlers/terminating-handler.ts index 43c7b77af..4225d9646 100644 --- a/packages/user-client/src/http/handlers/terminating-handler.ts +++ b/packages/user-client/src/http/handlers/terminating-handler.ts @@ -4,11 +4,11 @@ import { RequestFetchAdapter } from '../transport/request-fetch-adapter.js'; import { HttpResponse, RequestHandler } from '../types.js'; export class TerminatingHandler implements RequestHandler { - async handle(request: Request): Promise> { - return new RequestFetchAdapter(request).send(); + async handle(request: Request): Promise> { + return new RequestFetchAdapter(request).send(); } - async *stream(request: Request): AsyncGenerator> { - yield* new RequestFetchAdapter(request).stream(); + async *stream(request: Request): AsyncGenerator> { + yield* new RequestFetchAdapter(request).stream(); } } diff --git a/packages/user-client/src/http/transport/request-builder.ts b/packages/user-client/src/http/transport/request-builder.ts index e315a6096..0ba603923 100644 --- a/packages/user-client/src/http/transport/request-builder.ts +++ b/packages/user-client/src/http/transport/request-builder.ts @@ -3,10 +3,16 @@ import z, { ZodType } from 'zod'; import { Environment } from '../environment.js'; import { SerializationStyle } from '../serialization/base-serializer.js'; import { ContentType, HttpMethod, RequestConfig, RetryOptions, SdkConfig, ValidationOptions } from '../types.js'; -import { CreateRequestParameters, Request, RequestPagination, RequestParameter } from './request.js'; +import { + CreateRequestParameters, + Request, + RequestPagination, + RequestParameter, + ResponseDefinition, +} from './request.js'; -export class RequestBuilder { - private params: CreateRequestParameters; +export class RequestBuilder { + private params: CreateRequestParameters; constructor() { this.params = { @@ -14,10 +20,9 @@ export class RequestBuilder { method: 'GET', path: '', config: {}, - responseSchema: z.any(), + responses: [], requestSchema: z.any(), requestContentType: ContentType.Json, - responseContentType: ContentType.Json, retry: { attempts: 3, delayMs: 150, @@ -31,7 +36,7 @@ export class RequestBuilder { }; } - setRetryAttempts(sdkConfig?: SdkConfig, requestConfig?: RequestConfig): RequestBuilder { + setRetryAttempts(sdkConfig?: SdkConfig, requestConfig?: RequestConfig): RequestBuilder { if (requestConfig?.retry?.attempts !== undefined) { this.params.retry.attempts = requestConfig.retry.attempts; } else if (sdkConfig?.retry?.attempts !== undefined) { @@ -41,7 +46,7 @@ export class RequestBuilder { return this; } - setRetryDelayMs(sdkConfig?: SdkConfig, requestConfig?: RequestConfig): RequestBuilder { + setRetryDelayMs(sdkConfig?: SdkConfig, requestConfig?: RequestConfig): RequestBuilder { if (requestConfig?.retry?.delayMs !== undefined) { this.params.retry.delayMs = requestConfig.retry.delayMs; } else if (sdkConfig?.retry?.delayMs !== undefined) { @@ -51,7 +56,7 @@ export class RequestBuilder { return this; } - setResponseValidation(sdkConfig: SdkConfig, requestConfig?: RequestConfig): RequestBuilder { + setResponseValidation(sdkConfig: SdkConfig, requestConfig?: RequestConfig): RequestBuilder { if (requestConfig?.validation?.responseValidation !== undefined) { this.params.validation.responseValidation = requestConfig.validation.responseValidation; } else if (sdkConfig?.validation?.responseValidation !== undefined) { @@ -61,7 +66,7 @@ export class RequestBuilder { return this; } - setBaseUrl(sdkConfig: SdkConfig): RequestBuilder { + setBaseUrl(sdkConfig: SdkConfig): RequestBuilder { if (sdkConfig?.baseUrl !== undefined) { this.params.baseUrl = sdkConfig.baseUrl; } @@ -69,54 +74,49 @@ export class RequestBuilder { return this; } - setMethod(method: HttpMethod): RequestBuilder { + setMethod(method: HttpMethod): RequestBuilder { this.params.method = method; return this; } - setPath(path: string): RequestBuilder { + setPath(path: string): RequestBuilder { this.params.path = path; return this; } - setConfig(config: SdkConfig): RequestBuilder { + setConfig(config: SdkConfig): RequestBuilder { this.params.config = config; return this; } - setRequestContentType(contentType: ContentType): RequestBuilder { + setRequestContentType(contentType: ContentType): RequestBuilder { this.params.requestContentType = contentType; return this; } - setResponseContentType(contentType: ContentType): RequestBuilder { - this.params.responseContentType = contentType; - return this; - } - - setRequestSchema(requestSchema: ZodType): RequestBuilder { + setRequestSchema(requestSchema: ZodType): RequestBuilder { this.params.requestSchema = requestSchema; return this; } - setResponseSchema(responseSchema: ZodType): RequestBuilder { - this.params.responseSchema = responseSchema; + setPagination(pagination: RequestPagination): RequestBuilder { + this.params.pagination = pagination; return this; } - setPagination(pagination: RequestPagination): RequestBuilder { - this.params.pagination = pagination; + addResponse(response: ResponseDefinition): RequestBuilder { + this.params.responses.push(response); return this; } - addBody(body?: any): RequestBuilder { + addBody(body?: any): RequestBuilder { if (body !== undefined) { this.params.body = body; } return this; } - addPathParam(param: Partial): RequestBuilder { + addPathParam(param: Partial): RequestBuilder { if (param.value === undefined || param.key === undefined) { return this; } @@ -134,7 +134,7 @@ export class RequestBuilder { return this; } - addQueryParam(param: Partial): RequestBuilder { + addQueryParam(param: Partial): RequestBuilder { if (param.value === undefined || param.key === undefined) { return this; } @@ -152,7 +152,7 @@ export class RequestBuilder { return this; } - addHeaderParam(param: Partial): RequestBuilder { + addHeaderParam(param: Partial): RequestBuilder { if (param.value === undefined || param.key === undefined) { return this; } @@ -170,7 +170,7 @@ export class RequestBuilder { return this; } - public build(): Request { - return new Request(this.params); + public build(): Request { + return new Request(this.params); } } diff --git a/packages/user-client/src/http/transport/request-fetch-adapter.ts b/packages/user-client/src/http/transport/request-fetch-adapter.ts index 30f04f80e..36498f300 100644 --- a/packages/user-client/src/http/transport/request-fetch-adapter.ts +++ b/packages/user-client/src/http/transport/request-fetch-adapter.ts @@ -1,5 +1,6 @@ import { HttpError } from '../error.js'; import { HttpMetadata, HttpMethod, HttpResponse } from '../types.js'; +import { LineDecoder } from '../utils/line-decoder.js'; import { Request } from './request.js'; interface HttpAdapter { @@ -10,7 +11,7 @@ interface HttpAdapter { export class RequestFetchAdapter implements HttpAdapter { private requestInit: RequestInit = {}; - constructor(private request: Request) { + constructor(private request: Request) { this.setMethod(request.method); this.setHeaders(request.getHeaders()); this.setBody(request.body); @@ -53,15 +54,26 @@ export class RequestFetchAdapter implements HttpAdapter { } const reader = response.body.getReader(); + const lineDecoder = new LineDecoder(); while (true) { const { done, value } = await reader.read(); if (done) { break; } + + for (const line of lineDecoder.splitLines(value)) { + yield { + metadata, + raw: line, + }; + } + } + + for (const line of lineDecoder.flush()) { yield { metadata, - raw: value, + raw: line, }; } } diff --git a/packages/user-client/src/http/transport/request.ts b/packages/user-client/src/http/transport/request.ts index a523ff59c..e5c892f8b 100644 --- a/packages/user-client/src/http/transport/request.ts +++ b/packages/user-client/src/http/transport/request.ts @@ -7,7 +7,13 @@ import { PathSerializer } from '../serialization/path-serializer.js'; import { QuerySerializer } from '../serialization/query-serializer.js'; import { ContentType, HttpMethod, RetryOptions, SdkConfig, ValidationOptions } from '../types.js'; -export interface CreateRequestParameters { +export interface ResponseDefinition { + schema: ZodType; + contentType: ContentType; + status: number; +} + +export interface CreateRequestParameters { baseUrl: string; method: HttpMethod; body?: any; @@ -16,10 +22,9 @@ export interface CreateRequestParameters { pathParams: Map; path: string; config: SdkConfig; - responseSchema: ZodType; + responses: ResponseDefinition[]; requestSchema: ZodType; requestContentType: ContentType; - responseContentType: ContentType; validation: ValidationOptions; retry: RetryOptions; pagination?: RequestPagination; @@ -41,7 +46,7 @@ export interface RequestPagination { pageSchema?: ZodType; } -export class Request { +export class Request { public baseUrl = ''; public headers: Map = new Map(); @@ -58,14 +63,12 @@ export class Request { public config: SdkConfig; - public responseSchema: ZodType; + public responses: ResponseDefinition[]; public requestSchema: ZodType; public requestContentType: ContentType; - public responseContentType: ContentType; - public validation: ValidationOptions = {} as any; public retry: RetryOptions = {} as any; @@ -74,7 +77,7 @@ export class Request { private readonly pathPattern: string; - constructor(params: CreateRequestParameters) { + constructor(params: CreateRequestParameters) { this.baseUrl = params.baseUrl; this.method = params.method; this.pathPattern = params.path; @@ -84,10 +87,9 @@ export class Request { this.pathParams = params.pathParams; this.headers = params.headers; this.queryParams = params.queryParams; - this.responseSchema = params.responseSchema; + this.responses = params.responses; this.requestSchema = params.requestSchema; this.requestContentType = params.requestContentType; - this.responseContentType = params.responseContentType; this.retry = params.retry; this.validation = params.validation; this.pagination = params.pagination; @@ -171,11 +173,13 @@ export class Request { public constructFullUrl(): string { const queryString = new QuerySerializer().serialize(this.queryParams); const path = this.constructPath(); - return `${this.baseUrl}${path}${queryString}`; + const baseUrl = this.baseUrl; + + return `${baseUrl}${path}${queryString}`; } - public copy(overrides?: Partial>) { - const createRequestParams: CreateRequestParameters = { + public copy(overrides?: Partial) { + const createRequestParams: CreateRequestParameters = { baseUrl: overrides?.baseUrl ?? this.baseUrl, method: overrides?.method ?? this.method, path: overrides?.path ?? this.path, @@ -184,14 +188,13 @@ export class Request { pathParams: overrides?.pathParams ?? this.pathParams, queryParams: overrides?.queryParams ?? this.queryParams, headers: overrides?.headers ?? this.headers, - responseSchema: overrides?.responseSchema ?? this.responseSchema, + responses: overrides?.responses ?? this.responses, requestSchema: overrides?.requestSchema ?? this.requestSchema, requestContentType: overrides?.requestContentType ?? this.requestContentType, - responseContentType: overrides?.responseContentType ?? this.responseContentType, retry: overrides?.retry ?? this.retry, validation: overrides?.validation ?? this.validation, }; - return new Request({ + return new Request({ ...createRequestParams, ...overrides, }); @@ -205,7 +208,7 @@ export class Request { return new HeaderSerializer().serialize(this.headers); } - public nextPage() { + public nextPage(): void { if (!this.pagination) { return; } @@ -230,15 +233,15 @@ export class Request { private getAllParams(): RequestParameter[] { const allParams: RequestParameter[] = []; - this.headers.forEach((val, key) => { + this.headers.forEach((val, _) => { allParams.push(val); }); - this.queryParams.forEach((val, key) => { + this.queryParams.forEach((val, _) => { allParams.push(val); }); - this.pathParams.forEach((val, key) => { + this.pathParams.forEach((val, _) => { allParams.push(val); }); diff --git a/packages/user-client/src/http/transport/transport-hook-adapter.ts b/packages/user-client/src/http/transport/transport-hook-adapter.ts index d256295d5..c2b07cef0 100644 --- a/packages/user-client/src/http/transport/transport-hook-adapter.ts +++ b/packages/user-client/src/http/transport/transport-hook-adapter.ts @@ -7,7 +7,7 @@ import { Request, RequestParameter } from './request.js'; export class TransportHookAdapter { private hook: CustomHook = new CustomHook(); - public async beforeRequest(request: Request, params: Map): Promise> { + public async beforeRequest(request: Request, params: Map): Promise { const hookRequest = this.requestToHookRequest(request); const newRequest = await this.hook.beforeRequest(hookRequest, params); @@ -26,7 +26,7 @@ export class TransportHookAdapter { } public async afterResponse( - request: Request, + request: Request, response: HttpResponse, params: Map, ): Promise> { @@ -34,16 +34,12 @@ export class TransportHookAdapter { return this.hook.afterResponse(hookRequest, response, params); } - public async onError( - request: Request, - response: HttpResponse, - params: Map, - ): Promise { + public async onError(request: Request, response: HttpResponse, params: Map): Promise { const hookRequest = this.requestToHookRequest(request); return this.hook.onError(hookRequest, response, params); } - private requestToHookRequest(request: Request): HttpRequest { + private requestToHookRequest(request: Request): HttpRequest { const hookHeaders: Map = new Map(); request.headers.forEach((header, key) => { hookHeaders.set(key, header.value); diff --git a/packages/user-client/src/http/types.ts b/packages/user-client/src/http/types.ts index fb17dafc7..5fc1ccbc1 100644 --- a/packages/user-client/src/http/types.ts +++ b/packages/user-client/src/http/types.ts @@ -29,8 +29,8 @@ export interface HttpResponse { export interface RequestHandler { next?: RequestHandler; - handle(request: Request): Promise>; - stream(request: Request): AsyncGenerator>; + handle(request: Request): Promise>; + stream(request: Request): AsyncGenerator>; } export enum ContentType { @@ -44,6 +44,7 @@ export enum ContentType { Text = 'text', MultipartFormData = 'multipartFormData', EventStream = 'eventStream', + NoContent = 'noContent', } export interface Options { diff --git a/packages/user-client/src/http/utils/line-decoder.ts b/packages/user-client/src/http/utils/line-decoder.ts new file mode 100644 index 000000000..822414b87 --- /dev/null +++ b/packages/user-client/src/http/utils/line-decoder.ts @@ -0,0 +1,35 @@ +export class LineDecoder { + private lineBuffer = ''; + private decoder = new TextDecoder(); + private encoder = new TextEncoder(); + + /** + * Splits the given chunk into lines. + * Stores incomplete lines in a buffer and returns them when the next chunk arrives. + */ + public splitLines(chunk: Uint8Array): Uint8Array[] { + this.lineBuffer += this.decoder.decode(chunk); + + let lineEndIndex; + const lines: Uint8Array[] = []; + while ((lineEndIndex = this.lineBuffer.indexOf('\n')) >= 0) { + const line = this.lineBuffer.slice(0, lineEndIndex + 1); // Include the newline character + this.lineBuffer = this.lineBuffer.slice(lineEndIndex + 1); + if (line.length > 1) { + lines.push(this.encoder.encode(line)); + } + } + + return lines; + } + + /** Returns the remaining lines in the buffer. */ + public flush(): Uint8Array[] { + if (this.lineBuffer.length === 0) { + return []; + } + const lines = [this.encoder.encode(this.lineBuffer)]; + this.lineBuffer = ''; + return lines; + } +} diff --git a/packages/user-client/src/http/utils/response-matcher.ts b/packages/user-client/src/http/utils/response-matcher.ts new file mode 100644 index 000000000..70af48c92 --- /dev/null +++ b/packages/user-client/src/http/utils/response-matcher.ts @@ -0,0 +1,56 @@ +import { ResponseDefinition } from '../transport/request.js'; +import { ContentType, HttpResponse } from '../types.js'; + +export class ResponseMatcher { + constructor(private responses: ResponseDefinition[]) {} + + public getResponseDefinition(response: HttpResponse): ResponseDefinition | undefined { + const rawContentType = response.metadata.headers['content-type']?.toLocaleLowerCase() || ''; + const contentType = this.getContentTypeDefinition(rawContentType); + const statusCode = response.metadata.status; + + if (!this.responses.length) { + return; + } + + if (this.responses.length === 1) { + return this.responses[0]; + } + + return this.responses.find((response) => { + return response.contentType === contentType && response.status === statusCode; + }); + } + + private getContentTypeDefinition(contentType: string): ContentType { + if (contentType.startsWith('application/') && contentType.includes('xml')) { + return ContentType.Xml; + } + + if (contentType.toLowerCase() === 'application/x-www-form-urlencoded') { + return ContentType.FormUrlEncoded; + } + + if (contentType.toLowerCase() === 'text/event-stream') { + return ContentType.EventStream; + } + + if (contentType.toLowerCase().startsWith('text/')) { + return ContentType.Text; + } + + if (contentType.toLowerCase().startsWith('image/')) { + return ContentType.Image; + } + + if (contentType.toLowerCase() === 'application/octet-stream') { + return ContentType.Binary; + } + + if (contentType.toLowerCase() === 'application/json') { + return ContentType.Json; + } + + return ContentType.Json; + } +} diff --git a/packages/user-client/src/services/channels/channels.ts b/packages/user-client/src/services/channels/channels.ts index b12a0d92c..d8e2a5601 100644 --- a/packages/user-client/src/services/channels/channels.ts +++ b/packages/user-client/src/services/channels/channels.ts @@ -59,15 +59,18 @@ export class ChannelsService extends BaseService { params?: GetMobilePushApnsTokensParams, requestConfig?: RequestConfig, ): Promise> { - const request = new RequestBuilder() + const request = new RequestBuilder() .setBaseUrl(this.config) .setConfig(this.config) .setMethod('GET') .setPath('/channels/mobile_push/apns/tokens') .setRequestSchema(z.any()) - .setResponseSchema(arrayOfMetadataApnsTokensResponse) .setRequestContentType(ContentType.Json) - .setResponseContentType(ContentType.Json) + .addResponse({ + schema: arrayOfMetadataApnsTokensResponse, + contentType: ContentType.Json, + status: 200, + }) .setRetryAttempts(this.config, requestConfig) .setRetryDelayMs(this.config, requestConfig) .setResponseValidation(this.config, requestConfig) @@ -92,15 +95,18 @@ export class ChannelsService extends BaseService { * @returns {Promise>} Created */ async saveMobilePushApnsToken(body: ApnsToken, requestConfig?: RequestConfig): Promise> { - const request = new RequestBuilder() + const request = new RequestBuilder() .setBaseUrl(this.config) .setConfig(this.config) .setMethod('POST') .setPath('/channels/mobile_push/apns/tokens') .setRequestSchema(apnsTokenRequest) - .setResponseSchema(apnsTokenResponse) .setRequestContentType(ContentType.Json) - .setResponseContentType(ContentType.Json) + .addResponse({ + schema: apnsTokenResponse, + contentType: ContentType.Json, + status: 201, + }) .setRetryAttempts(this.config, requestConfig) .setRetryDelayMs(this.config, requestConfig) .setResponseValidation(this.config, requestConfig) @@ -119,15 +125,18 @@ export class ChannelsService extends BaseService { tokenId: string, requestConfig?: RequestConfig, ): Promise> { - const request = new RequestBuilder() + const request = new RequestBuilder() .setBaseUrl(this.config) .setConfig(this.config) .setMethod('GET') .setPath('/channels/mobile_push/apns/tokens/{token_id}') .setRequestSchema(z.any()) - .setResponseSchema(metadataApnsTokenResponse) .setRequestContentType(ContentType.Json) - .setResponseContentType(ContentType.Json) + .addResponse({ + schema: metadataApnsTokenResponse, + contentType: ContentType.Json, + status: 200, + }) .setRetryAttempts(this.config, requestConfig) .setRetryDelayMs(this.config, requestConfig) .setResponseValidation(this.config, requestConfig) @@ -148,15 +157,18 @@ export class ChannelsService extends BaseService { tokenId: string, requestConfig?: RequestConfig, ): Promise> { - const request = new RequestBuilder() + const request = new RequestBuilder() .setBaseUrl(this.config) .setConfig(this.config) .setMethod('DELETE') .setPath('/channels/mobile_push/apns/tokens/{token_id}') .setRequestSchema(z.any()) - .setResponseSchema(discardResultResponse) .setRequestContentType(ContentType.Json) - .setResponseContentType(ContentType.Json) + .addResponse({ + schema: discardResultResponse, + contentType: ContentType.Json, + status: 200, + }) .setRetryAttempts(this.config, requestConfig) .setRetryDelayMs(this.config, requestConfig) .setResponseValidation(this.config, requestConfig) @@ -179,15 +191,18 @@ export class ChannelsService extends BaseService { params?: GetMobilePushExpoTokensParams, requestConfig?: RequestConfig, ): Promise> { - const request = new RequestBuilder() + const request = new RequestBuilder() .setBaseUrl(this.config) .setConfig(this.config) .setMethod('GET') .setPath('/channels/mobile_push/expo/tokens') .setRequestSchema(z.any()) - .setResponseSchema(arrayOfMetadataExpoTokensResponse) .setRequestContentType(ContentType.Json) - .setResponseContentType(ContentType.Json) + .addResponse({ + schema: arrayOfMetadataExpoTokensResponse, + contentType: ContentType.Json, + status: 200, + }) .setRetryAttempts(this.config, requestConfig) .setRetryDelayMs(this.config, requestConfig) .setResponseValidation(this.config, requestConfig) @@ -212,15 +227,18 @@ export class ChannelsService extends BaseService { * @returns {Promise>} Created */ async saveMobilePushExpoToken(body: ExpoToken, requestConfig?: RequestConfig): Promise> { - const request = new RequestBuilder() + const request = new RequestBuilder() .setBaseUrl(this.config) .setConfig(this.config) .setMethod('POST') .setPath('/channels/mobile_push/expo/tokens') .setRequestSchema(expoTokenRequest) - .setResponseSchema(expoTokenResponse) .setRequestContentType(ContentType.Json) - .setResponseContentType(ContentType.Json) + .addResponse({ + schema: expoTokenResponse, + contentType: ContentType.Json, + status: 201, + }) .setRetryAttempts(this.config, requestConfig) .setRetryDelayMs(this.config, requestConfig) .setResponseValidation(this.config, requestConfig) @@ -239,15 +257,18 @@ export class ChannelsService extends BaseService { tokenId: string, requestConfig?: RequestConfig, ): Promise> { - const request = new RequestBuilder() + const request = new RequestBuilder() .setBaseUrl(this.config) .setConfig(this.config) .setMethod('GET') .setPath('/channels/mobile_push/expo/tokens/{token_id}') .setRequestSchema(z.any()) - .setResponseSchema(metadataExpoTokenResponse) .setRequestContentType(ContentType.Json) - .setResponseContentType(ContentType.Json) + .addResponse({ + schema: metadataExpoTokenResponse, + contentType: ContentType.Json, + status: 200, + }) .setRetryAttempts(this.config, requestConfig) .setRetryDelayMs(this.config, requestConfig) .setResponseValidation(this.config, requestConfig) @@ -268,15 +289,18 @@ export class ChannelsService extends BaseService { tokenId: string, requestConfig?: RequestConfig, ): Promise> { - const request = new RequestBuilder() + const request = new RequestBuilder() .setBaseUrl(this.config) .setConfig(this.config) .setMethod('DELETE') .setPath('/channels/mobile_push/expo/tokens/{token_id}') .setRequestSchema(z.any()) - .setResponseSchema(discardResultResponse) .setRequestContentType(ContentType.Json) - .setResponseContentType(ContentType.Json) + .addResponse({ + schema: discardResultResponse, + contentType: ContentType.Json, + status: 200, + }) .setRetryAttempts(this.config, requestConfig) .setRetryDelayMs(this.config, requestConfig) .setResponseValidation(this.config, requestConfig) @@ -299,15 +323,18 @@ export class ChannelsService extends BaseService { params?: GetMobilePushFcmTokensParams, requestConfig?: RequestConfig, ): Promise> { - const request = new RequestBuilder() + const request = new RequestBuilder() .setBaseUrl(this.config) .setConfig(this.config) .setMethod('GET') .setPath('/channels/mobile_push/fcm/tokens') .setRequestSchema(z.any()) - .setResponseSchema(arrayOfMetadataFcmTokensResponse) .setRequestContentType(ContentType.Json) - .setResponseContentType(ContentType.Json) + .addResponse({ + schema: arrayOfMetadataFcmTokensResponse, + contentType: ContentType.Json, + status: 200, + }) .setRetryAttempts(this.config, requestConfig) .setRetryDelayMs(this.config, requestConfig) .setResponseValidation(this.config, requestConfig) @@ -332,15 +359,18 @@ export class ChannelsService extends BaseService { * @returns {Promise>} Created */ async saveMobilePushFcmToken(body: FcmToken, requestConfig?: RequestConfig): Promise> { - const request = new RequestBuilder() + const request = new RequestBuilder() .setBaseUrl(this.config) .setConfig(this.config) .setMethod('POST') .setPath('/channels/mobile_push/fcm/tokens') .setRequestSchema(fcmTokenRequest) - .setResponseSchema(fcmTokenResponse) .setRequestContentType(ContentType.Json) - .setResponseContentType(ContentType.Json) + .addResponse({ + schema: fcmTokenResponse, + contentType: ContentType.Json, + status: 201, + }) .setRetryAttempts(this.config, requestConfig) .setRetryDelayMs(this.config, requestConfig) .setResponseValidation(this.config, requestConfig) @@ -356,15 +386,18 @@ export class ChannelsService extends BaseService { * @returns {Promise>} OK */ async getMobilePushFcmToken(tokenId: string, requestConfig?: RequestConfig): Promise> { - const request = new RequestBuilder() + const request = new RequestBuilder() .setBaseUrl(this.config) .setConfig(this.config) .setMethod('GET') .setPath('/channels/mobile_push/fcm/tokens/{token_id}') .setRequestSchema(z.any()) - .setResponseSchema(metadataFcmTokenResponse) .setRequestContentType(ContentType.Json) - .setResponseContentType(ContentType.Json) + .addResponse({ + schema: metadataFcmTokenResponse, + contentType: ContentType.Json, + status: 200, + }) .setRetryAttempts(this.config, requestConfig) .setRetryDelayMs(this.config, requestConfig) .setResponseValidation(this.config, requestConfig) @@ -385,15 +418,18 @@ export class ChannelsService extends BaseService { tokenId: string, requestConfig?: RequestConfig, ): Promise> { - const request = new RequestBuilder() + const request = new RequestBuilder() .setBaseUrl(this.config) .setConfig(this.config) .setMethod('DELETE') .setPath('/channels/mobile_push/fcm/tokens/{token_id}') .setRequestSchema(z.any()) - .setResponseSchema(discardResultResponse) .setRequestContentType(ContentType.Json) - .setResponseContentType(ContentType.Json) + .addResponse({ + schema: discardResultResponse, + contentType: ContentType.Json, + status: 200, + }) .setRetryAttempts(this.config, requestConfig) .setRetryDelayMs(this.config, requestConfig) .setResponseValidation(this.config, requestConfig) @@ -416,15 +452,18 @@ export class ChannelsService extends BaseService { params?: GetSlackTokensParams, requestConfig?: RequestConfig, ): Promise> { - const request = new RequestBuilder() + const request = new RequestBuilder() .setBaseUrl(this.config) .setConfig(this.config) .setMethod('GET') .setPath('/channels/slack/tokens') .setRequestSchema(z.any()) - .setResponseSchema(arrayOfMetadataSlackTokensResponse) .setRequestContentType(ContentType.Json) - .setResponseContentType(ContentType.Json) + .addResponse({ + schema: arrayOfMetadataSlackTokensResponse, + contentType: ContentType.Json, + status: 200, + }) .setRetryAttempts(this.config, requestConfig) .setRetryDelayMs(this.config, requestConfig) .setResponseValidation(this.config, requestConfig) @@ -449,15 +488,18 @@ export class ChannelsService extends BaseService { * @returns {Promise>} Created */ async saveSlackToken(body: SlackToken, requestConfig?: RequestConfig): Promise> { - const request = new RequestBuilder() + const request = new RequestBuilder() .setBaseUrl(this.config) .setConfig(this.config) .setMethod('POST') .setPath('/channels/slack/tokens') .setRequestSchema(slackTokenRequest) - .setResponseSchema(slackTokenResponse) .setRequestContentType(ContentType.Json) - .setResponseContentType(ContentType.Json) + .addResponse({ + schema: slackTokenResponse, + contentType: ContentType.Json, + status: 201, + }) .setRetryAttempts(this.config, requestConfig) .setRetryDelayMs(this.config, requestConfig) .setResponseValidation(this.config, requestConfig) @@ -473,15 +515,18 @@ export class ChannelsService extends BaseService { * @returns {Promise>} OK */ async getSlackToken(tokenId: string, requestConfig?: RequestConfig): Promise> { - const request = new RequestBuilder() + const request = new RequestBuilder() .setBaseUrl(this.config) .setConfig(this.config) .setMethod('GET') .setPath('/channels/slack/tokens/{token_id}') .setRequestSchema(z.any()) - .setResponseSchema(metadataSlackTokenResponse) .setRequestContentType(ContentType.Json) - .setResponseContentType(ContentType.Json) + .addResponse({ + schema: metadataSlackTokenResponse, + contentType: ContentType.Json, + status: 200, + }) .setRetryAttempts(this.config, requestConfig) .setRetryDelayMs(this.config, requestConfig) .setResponseValidation(this.config, requestConfig) @@ -499,15 +544,18 @@ export class ChannelsService extends BaseService { * @returns {Promise>} OK */ async discardSlackToken(tokenId: string, requestConfig?: RequestConfig): Promise> { - const request = new RequestBuilder() + const request = new RequestBuilder() .setBaseUrl(this.config) .setConfig(this.config) .setMethod('DELETE') .setPath('/channels/slack/tokens/{token_id}') .setRequestSchema(z.any()) - .setResponseSchema(discardResultResponse) .setRequestContentType(ContentType.Json) - .setResponseContentType(ContentType.Json) + .addResponse({ + schema: discardResultResponse, + contentType: ContentType.Json, + status: 200, + }) .setRetryAttempts(this.config, requestConfig) .setRetryDelayMs(this.config, requestConfig) .setResponseValidation(this.config, requestConfig) @@ -530,15 +578,18 @@ export class ChannelsService extends BaseService { params?: GetTeamsTokensParams, requestConfig?: RequestConfig, ): Promise> { - const request = new RequestBuilder() + const request = new RequestBuilder() .setBaseUrl(this.config) .setConfig(this.config) .setMethod('GET') .setPath('/channels/teams/tokens') .setRequestSchema(z.any()) - .setResponseSchema(arrayOfMetadataTeamsTokensResponse) .setRequestContentType(ContentType.Json) - .setResponseContentType(ContentType.Json) + .addResponse({ + schema: arrayOfMetadataTeamsTokensResponse, + contentType: ContentType.Json, + status: 200, + }) .setRetryAttempts(this.config, requestConfig) .setRetryDelayMs(this.config, requestConfig) .setResponseValidation(this.config, requestConfig) @@ -563,15 +614,18 @@ export class ChannelsService extends BaseService { * @returns {Promise>} Created */ async saveTeamsToken(body: TeamsToken, requestConfig?: RequestConfig): Promise> { - const request = new RequestBuilder() + const request = new RequestBuilder() .setBaseUrl(this.config) .setConfig(this.config) .setMethod('POST') .setPath('/channels/teams/tokens') .setRequestSchema(teamsTokenRequest) - .setResponseSchema(teamsTokenResponse) .setRequestContentType(ContentType.Json) - .setResponseContentType(ContentType.Json) + .addResponse({ + schema: teamsTokenResponse, + contentType: ContentType.Json, + status: 201, + }) .setRetryAttempts(this.config, requestConfig) .setRetryDelayMs(this.config, requestConfig) .setResponseValidation(this.config, requestConfig) @@ -587,15 +641,18 @@ export class ChannelsService extends BaseService { * @returns {Promise>} OK */ async getTeamsToken(tokenId: string, requestConfig?: RequestConfig): Promise> { - const request = new RequestBuilder() + const request = new RequestBuilder() .setBaseUrl(this.config) .setConfig(this.config) .setMethod('GET') .setPath('/channels/teams/tokens/{token_id}') .setRequestSchema(z.any()) - .setResponseSchema(metadataTeamsTokenResponse) .setRequestContentType(ContentType.Json) - .setResponseContentType(ContentType.Json) + .addResponse({ + schema: metadataTeamsTokenResponse, + contentType: ContentType.Json, + status: 200, + }) .setRetryAttempts(this.config, requestConfig) .setRetryDelayMs(this.config, requestConfig) .setResponseValidation(this.config, requestConfig) @@ -613,15 +670,18 @@ export class ChannelsService extends BaseService { * @returns {Promise>} OK */ async discardTeamsToken(tokenId: string, requestConfig?: RequestConfig): Promise> { - const request = new RequestBuilder() + const request = new RequestBuilder() .setBaseUrl(this.config) .setConfig(this.config) .setMethod('DELETE') .setPath('/channels/teams/tokens/{token_id}') .setRequestSchema(z.any()) - .setResponseSchema(discardResultResponse) .setRequestContentType(ContentType.Json) - .setResponseContentType(ContentType.Json) + .addResponse({ + schema: discardResultResponse, + contentType: ContentType.Json, + status: 200, + }) .setRetryAttempts(this.config, requestConfig) .setRetryDelayMs(this.config, requestConfig) .setResponseValidation(this.config, requestConfig) @@ -644,15 +704,18 @@ export class ChannelsService extends BaseService { params?: GetWebPushTokensParams, requestConfig?: RequestConfig, ): Promise> { - const request = new RequestBuilder() + const request = new RequestBuilder() .setBaseUrl(this.config) .setConfig(this.config) .setMethod('GET') .setPath('/channels/web_push/tokens') .setRequestSchema(z.any()) - .setResponseSchema(arrayOfMetadataWebPushTokensResponse) .setRequestContentType(ContentType.Json) - .setResponseContentType(ContentType.Json) + .addResponse({ + schema: arrayOfMetadataWebPushTokensResponse, + contentType: ContentType.Json, + status: 200, + }) .setRetryAttempts(this.config, requestConfig) .setRetryDelayMs(this.config, requestConfig) .setResponseValidation(this.config, requestConfig) @@ -677,15 +740,18 @@ export class ChannelsService extends BaseService { * @returns {Promise>} Created */ async saveWebPushToken(body: WebPushToken, requestConfig?: RequestConfig): Promise> { - const request = new RequestBuilder() + const request = new RequestBuilder() .setBaseUrl(this.config) .setConfig(this.config) .setMethod('POST') .setPath('/channels/web_push/tokens') .setRequestSchema(webPushTokenRequest) - .setResponseSchema(webPushTokenResponse) .setRequestContentType(ContentType.Json) - .setResponseContentType(ContentType.Json) + .addResponse({ + schema: webPushTokenResponse, + contentType: ContentType.Json, + status: 201, + }) .setRetryAttempts(this.config, requestConfig) .setRetryDelayMs(this.config, requestConfig) .setResponseValidation(this.config, requestConfig) @@ -701,15 +767,18 @@ export class ChannelsService extends BaseService { * @returns {Promise>} OK */ async getWebPushToken(tokenId: string, requestConfig?: RequestConfig): Promise> { - const request = new RequestBuilder() + const request = new RequestBuilder() .setBaseUrl(this.config) .setConfig(this.config) .setMethod('GET') .setPath('/channels/web_push/tokens/{token_id}') .setRequestSchema(z.any()) - .setResponseSchema(metadataWebPushTokenResponse) .setRequestContentType(ContentType.Json) - .setResponseContentType(ContentType.Json) + .addResponse({ + schema: metadataWebPushTokenResponse, + contentType: ContentType.Json, + status: 200, + }) .setRetryAttempts(this.config, requestConfig) .setRetryDelayMs(this.config, requestConfig) .setResponseValidation(this.config, requestConfig) @@ -727,15 +796,18 @@ export class ChannelsService extends BaseService { * @returns {Promise>} OK */ async discardWebPushToken(tokenId: string, requestConfig?: RequestConfig): Promise> { - const request = new RequestBuilder() + const request = new RequestBuilder() .setBaseUrl(this.config) .setConfig(this.config) .setMethod('DELETE') .setPath('/channels/web_push/tokens/{token_id}') .setRequestSchema(z.any()) - .setResponseSchema(discardResultResponse) .setRequestContentType(ContentType.Json) - .setResponseContentType(ContentType.Json) + .addResponse({ + schema: discardResultResponse, + contentType: ContentType.Json, + status: 200, + }) .setRetryAttempts(this.config, requestConfig) .setRetryDelayMs(this.config, requestConfig) .setResponseValidation(this.config, requestConfig) diff --git a/packages/user-client/src/services/integrations/integrations.ts b/packages/user-client/src/services/integrations/integrations.ts index 99175542c..2793bcaaf 100644 --- a/packages/user-client/src/services/integrations/integrations.ts +++ b/packages/user-client/src/services/integrations/integrations.ts @@ -32,15 +32,18 @@ export class IntegrationsService extends BaseService { * @returns {Promise>} Created */ async saveInboxInstallation(body: InboxConfig, requestConfig?: RequestConfig): Promise> { - const request = new RequestBuilder() + const request = new RequestBuilder() .setBaseUrl(this.config) .setConfig(this.config) .setMethod('POST') .setPath('/integrations/inbox/installations') .setRequestSchema(inboxConfigRequest) - .setResponseSchema(inboxConfigResponse) .setRequestContentType(ContentType.Json) - .setResponseContentType(ContentType.Json) + .addResponse({ + schema: inboxConfigResponse, + contentType: ContentType.Json, + status: 201, + }) .setRetryAttempts(this.config, requestConfig) .setRetryDelayMs(this.config, requestConfig) .setResponseValidation(this.config, requestConfig) @@ -55,15 +58,18 @@ export class IntegrationsService extends BaseService { * @returns {Promise>} Created */ async startInboxInstallation(requestConfig?: RequestConfig): Promise> { - const request = new RequestBuilder() + const request = new RequestBuilder() .setBaseUrl(this.config) .setConfig(this.config) .setMethod('POST') .setPath('/integrations/inbox/installations/start') .setRequestSchema(z.any()) - .setResponseSchema(inboxConfigResponse) .setRequestContentType(ContentType.Json) - .setResponseContentType(ContentType.Json) + .addResponse({ + schema: inboxConfigResponse, + contentType: ContentType.Json, + status: 201, + }) .setRetryAttempts(this.config, requestConfig) .setRetryDelayMs(this.config, requestConfig) .setResponseValidation(this.config, requestConfig) @@ -79,15 +85,18 @@ export class IntegrationsService extends BaseService { body: SlackInstallation, requestConfig?: RequestConfig, ): Promise> { - const request = new RequestBuilder() + const request = new RequestBuilder() .setBaseUrl(this.config) .setConfig(this.config) .setMethod('POST') .setPath('/integrations/slack/installations') .setRequestSchema(slackInstallationRequest) - .setResponseSchema(slackInstallationResponse) .setRequestContentType(ContentType.Json) - .setResponseContentType(ContentType.Json) + .addResponse({ + schema: slackInstallationResponse, + contentType: ContentType.Json, + status: 201, + }) .setRetryAttempts(this.config, requestConfig) .setRetryDelayMs(this.config, requestConfig) .setResponseValidation(this.config, requestConfig) @@ -105,15 +114,18 @@ export class IntegrationsService extends BaseService { body: SlackFinishInstallResponse, requestConfig?: RequestConfig, ): Promise> { - const request = new RequestBuilder() + const request = new RequestBuilder() .setBaseUrl(this.config) .setConfig(this.config) .setMethod('POST') .setPath('/integrations/slack/installations/finish') .setRequestSchema(slackFinishInstallResponseRequest) - .setResponseSchema(slackInstallationResponse) .setRequestContentType(ContentType.Json) - .setResponseContentType(ContentType.Json) + .addResponse({ + schema: slackInstallationResponse, + contentType: ContentType.Json, + status: 201, + }) .setRetryAttempts(this.config, requestConfig) .setRetryDelayMs(this.config, requestConfig) .setResponseValidation(this.config, requestConfig) @@ -131,15 +143,18 @@ export class IntegrationsService extends BaseService { body: SlackStartInstall, requestConfig?: RequestConfig, ): Promise> { - const request = new RequestBuilder() + const request = new RequestBuilder() .setBaseUrl(this.config) .setConfig(this.config) .setMethod('POST') .setPath('/integrations/slack/installations/start') .setRequestSchema(slackStartInstallRequest) - .setResponseSchema(slackStartInstallResponseContentResponse) .setRequestContentType(ContentType.Json) - .setResponseContentType(ContentType.Json) + .addResponse({ + schema: slackStartInstallResponseContentResponse, + contentType: ContentType.Json, + status: 201, + }) .setRetryAttempts(this.config, requestConfig) .setRetryDelayMs(this.config, requestConfig) .setResponseValidation(this.config, requestConfig) @@ -157,15 +172,18 @@ export class IntegrationsService extends BaseService { body: TemplatesInstallation, requestConfig?: RequestConfig, ): Promise> { - const request = new RequestBuilder() + const request = new RequestBuilder() .setBaseUrl(this.config) .setConfig(this.config) .setMethod('POST') .setPath('/integrations/templates/installations') .setRequestSchema(templatesInstallationRequest) - .setResponseSchema(templatesInstallationResponse) .setRequestContentType(ContentType.Json) - .setResponseContentType(ContentType.Json) + .addResponse({ + schema: templatesInstallationResponse, + contentType: ContentType.Json, + status: 201, + }) .setRetryAttempts(this.config, requestConfig) .setRetryDelayMs(this.config, requestConfig) .setResponseValidation(this.config, requestConfig) @@ -183,15 +201,18 @@ export class IntegrationsService extends BaseService { body: WebPushToken, requestConfig?: RequestConfig, ): Promise> { - const request = new RequestBuilder() + const request = new RequestBuilder() .setBaseUrl(this.config) .setConfig(this.config) .setMethod('POST') .setPath('/integrations/web_push/installations') .setRequestSchema(webPushTokenRequest) - .setResponseSchema(webPushTokenResponse) .setRequestContentType(ContentType.Json) - .setResponseContentType(ContentType.Json) + .addResponse({ + schema: webPushTokenResponse, + contentType: ContentType.Json, + status: 201, + }) .setRetryAttempts(this.config, requestConfig) .setRetryDelayMs(this.config, requestConfig) .setResponseValidation(this.config, requestConfig) @@ -208,15 +229,18 @@ export class IntegrationsService extends BaseService { async startWebPushInstallation( requestConfig?: RequestConfig, ): Promise> { - const request = new RequestBuilder() + const request = new RequestBuilder() .setBaseUrl(this.config) .setConfig(this.config) .setMethod('POST') .setPath('/integrations/web_push/installations/start') .setRequestSchema(z.any()) - .setResponseSchema(webPushStartInstallationResponseResponse) .setRequestContentType(ContentType.Json) - .setResponseContentType(ContentType.Json) + .addResponse({ + schema: webPushStartInstallationResponseResponse, + contentType: ContentType.Json, + status: 201, + }) .setRetryAttempts(this.config, requestConfig) .setRetryDelayMs(this.config, requestConfig) .setResponseValidation(this.config, requestConfig)