diff --git a/.oagen-manifest.json b/.oagen-manifest.json index f8a5578ef..81dfc2bf1 100644 --- a/.oagen-manifest.json +++ b/.oagen-manifest.json @@ -3,6 +3,35 @@ "language": "node", "generatedAt": "2026-05-19T16:22:01.987Z", "files": [ + "src/radar/fixtures/radar-list-entry-already-present-response.json", + "src/radar/fixtures/radar-standalone-assess-request.json", + "src/radar/fixtures/radar-standalone-delete-radar-list-entry-request.json", + "src/radar/fixtures/radar-standalone-response.json", + "src/radar/fixtures/radar-standalone-update-radar-attempt-request.json", + "src/radar/fixtures/radar-standalone-update-radar-list-request.json", + "src/radar/interfaces/index.ts", + "src/radar/interfaces/radar-list-action.interface.ts", + "src/radar/interfaces/radar-list-entry-already-present-response.interface.ts", + "src/radar/interfaces/radar-standalone-assess-request-action.interface.ts", + "src/radar/interfaces/radar-standalone-assess-request-auth-method.interface.ts", + "src/radar/interfaces/radar-standalone-assess-request.interface.ts", + "src/radar/interfaces/radar-standalone-delete-radar-list-entry-request.interface.ts", + "src/radar/interfaces/radar-standalone-response-blocklist-type.interface.ts", + "src/radar/interfaces/radar-standalone-response-control.interface.ts", + "src/radar/interfaces/radar-standalone-response-verdict.interface.ts", + "src/radar/interfaces/radar-standalone-response.interface.ts", + "src/radar/interfaces/radar-standalone-update-radar-attempt-request.interface.ts", + "src/radar/interfaces/radar-standalone-update-radar-list-request.interface.ts", + "src/radar/interfaces/radar-type.interface.ts", + "src/radar/radar.spec.ts", + "src/radar/radar.ts", + "src/radar/serializers/index.ts", + "src/radar/serializers/radar-list-entry-already-present-response.serializer.ts", + "src/radar/serializers/radar-standalone-assess-request.serializer.ts", + "src/radar/serializers/radar-standalone-delete-radar-list-entry-request.serializer.ts", + "src/radar/serializers/radar-standalone-response.serializer.ts", + "src/radar/serializers/radar-standalone-update-radar-attempt-request.serializer.ts", + "src/radar/serializers/radar-standalone-update-radar-list-request.serializer.ts", "src/webhooks/fixtures/create-webhook-endpoint.json", "src/webhooks/fixtures/list-webhook-endpoint.json", "src/webhooks/fixtures/update-webhook-endpoint.json", diff --git a/src/index.ts b/src/index.ts index 5deb8e91a..7201ea24e 100644 --- a/src/index.ts +++ b/src/index.ts @@ -28,6 +28,7 @@ export * from './organization-domains/interfaces'; export * from './passwordless/interfaces'; export * from './pipes/interfaces'; export * from './admin-portal/interfaces'; +export * from './radar/interfaces'; export * from './roles/interfaces'; export * from './sso/interfaces'; export * from './user-management/interfaces'; diff --git a/src/radar/fixtures/radar-list-entry-already-present-response.json b/src/radar/fixtures/radar-list-entry-already-present-response.json new file mode 100644 index 000000000..d20390c36 --- /dev/null +++ b/src/radar/fixtures/radar-list-entry-already-present-response.json @@ -0,0 +1,3 @@ +{ + "message": "Entry already present in list" +} diff --git a/src/radar/fixtures/radar-standalone-assess-request.json b/src/radar/fixtures/radar-standalone-assess-request.json new file mode 100644 index 000000000..710b53122 --- /dev/null +++ b/src/radar/fixtures/radar-standalone-assess-request.json @@ -0,0 +1,7 @@ +{ + "ip_address": "49.78.240.97", + "user_agent": "Mozilla/5.0", + "email": "user@example.com", + "auth_method": "Password", + "action": "sign-in" +} diff --git a/src/radar/fixtures/radar-standalone-delete-radar-list-entry-request.json b/src/radar/fixtures/radar-standalone-delete-radar-list-entry-request.json new file mode 100644 index 000000000..a123eb26f --- /dev/null +++ b/src/radar/fixtures/radar-standalone-delete-radar-list-entry-request.json @@ -0,0 +1,3 @@ +{ + "entry": "198.51.100.42" +} diff --git a/src/radar/fixtures/radar-standalone-response.json b/src/radar/fixtures/radar-standalone-response.json new file mode 100644 index 000000000..1670848e1 --- /dev/null +++ b/src/radar/fixtures/radar-standalone-response.json @@ -0,0 +1,7 @@ +{ + "verdict": "block", + "reason": "Detected enabled Radar control", + "attempt_id": "radar_att_01HZBC6N1EB1ZY7KG32X", + "control": "bot_detection", + "blocklist_type": "ip_address" +} diff --git a/src/radar/fixtures/radar-standalone-update-radar-attempt-request.json b/src/radar/fixtures/radar-standalone-update-radar-attempt-request.json new file mode 100644 index 000000000..b9598708a --- /dev/null +++ b/src/radar/fixtures/radar-standalone-update-radar-attempt-request.json @@ -0,0 +1,4 @@ +{ + "challenge_status": "success", + "attempt_status": "success" +} diff --git a/src/radar/fixtures/radar-standalone-update-radar-list-request.json b/src/radar/fixtures/radar-standalone-update-radar-list-request.json new file mode 100644 index 000000000..a123eb26f --- /dev/null +++ b/src/radar/fixtures/radar-standalone-update-radar-list-request.json @@ -0,0 +1,3 @@ +{ + "entry": "198.51.100.42" +} diff --git a/src/radar/interfaces/index.ts b/src/radar/interfaces/index.ts new file mode 100644 index 000000000..b310cc625 --- /dev/null +++ b/src/radar/interfaces/index.ts @@ -0,0 +1,15 @@ +// This file is auto-generated by oagen. Do not edit. + +export * from './radar-list-action.interface'; +export * from './radar-list-entry-already-present-response.interface'; +export * from './radar-standalone-assess-request-action.interface'; +export * from './radar-standalone-assess-request-auth-method.interface'; +export * from './radar-standalone-assess-request.interface'; +export * from './radar-standalone-delete-radar-list-entry-request.interface'; +export * from './radar-standalone-response-blocklist-type.interface'; +export * from './radar-standalone-response-control.interface'; +export * from './radar-standalone-response-verdict.interface'; +export * from './radar-standalone-response.interface'; +export * from './radar-standalone-update-radar-attempt-request.interface'; +export * from './radar-standalone-update-radar-list-request.interface'; +export * from './radar-type.interface'; diff --git a/src/radar/interfaces/radar-list-action.interface.ts b/src/radar/interfaces/radar-list-action.interface.ts new file mode 100644 index 000000000..3538c9fdc --- /dev/null +++ b/src/radar/interfaces/radar-list-action.interface.ts @@ -0,0 +1,9 @@ +// This file is auto-generated by oagen. Do not edit. + +export const RadarListAction = { + Block: 'block', + Allow: 'allow', +} as const; + +export type RadarListAction = + (typeof RadarListAction)[keyof typeof RadarListAction]; diff --git a/src/radar/interfaces/radar-list-entry-already-present-response.interface.ts b/src/radar/interfaces/radar-list-entry-already-present-response.interface.ts new file mode 100644 index 000000000..06bdba196 --- /dev/null +++ b/src/radar/interfaces/radar-list-entry-already-present-response.interface.ts @@ -0,0 +1,10 @@ +// This file is auto-generated by oagen. Do not edit. + +export interface RadarListEntryAlreadyPresentResponse { + /** A message indicating the entry already exists. */ + message: string; +} + +export interface RadarListEntryAlreadyPresentResponseWire { + message: string; +} diff --git a/src/radar/interfaces/radar-standalone-assess-request-action.interface.ts b/src/radar/interfaces/radar-standalone-assess-request-action.interface.ts new file mode 100644 index 000000000..3f51c47c6 --- /dev/null +++ b/src/radar/interfaces/radar-standalone-assess-request-action.interface.ts @@ -0,0 +1,9 @@ +// This file is auto-generated by oagen. Do not edit. + +export const RadarStandaloneAssessRequestAction = { + SignUp: 'sign-up', + SignIn: 'sign-in', +} as const; + +export type RadarStandaloneAssessRequestAction = + (typeof RadarStandaloneAssessRequestAction)[keyof typeof RadarStandaloneAssessRequestAction]; diff --git a/src/radar/interfaces/radar-standalone-assess-request-auth-method.interface.ts b/src/radar/interfaces/radar-standalone-assess-request-auth-method.interface.ts new file mode 100644 index 000000000..8de38e2d0 --- /dev/null +++ b/src/radar/interfaces/radar-standalone-assess-request-auth-method.interface.ts @@ -0,0 +1,15 @@ +// This file is auto-generated by oagen. Do not edit. + +export const RadarStandaloneAssessRequestAuthMethod = { + Password: 'Password', + Passkey: 'Passkey', + Authenticator: 'Authenticator', + SmsOtp: 'SMS_OTP', + EmailOtp: 'Email_OTP', + Social: 'Social', + SSO: 'SSO', + Other: 'Other', +} as const; + +export type RadarStandaloneAssessRequestAuthMethod = + (typeof RadarStandaloneAssessRequestAuthMethod)[keyof typeof RadarStandaloneAssessRequestAuthMethod]; diff --git a/src/radar/interfaces/radar-standalone-assess-request.interface.ts b/src/radar/interfaces/radar-standalone-assess-request.interface.ts new file mode 100644 index 000000000..5aac67cbf --- /dev/null +++ b/src/radar/interfaces/radar-standalone-assess-request.interface.ts @@ -0,0 +1,25 @@ +// This file is auto-generated by oagen. Do not edit. + +import type { RadarStandaloneAssessRequestAuthMethod } from './radar-standalone-assess-request-auth-method.interface'; +import type { RadarStandaloneAssessRequestAction } from './radar-standalone-assess-request-action.interface'; + +export interface RadarStandaloneAssessRequest { + /** The IP address of the request to assess. */ + ipAddress: string; + /** The user agent string of the request to assess. */ + userAgent: string; + /** The email address of the user making the request. */ + email: string; + /** The authentication method being used. */ + authMethod: RadarStandaloneAssessRequestAuthMethod; + /** The action being performed. */ + action: RadarStandaloneAssessRequestAction; +} + +export interface RadarStandaloneAssessRequestResponse { + ip_address: string; + user_agent: string; + email: string; + auth_method: RadarStandaloneAssessRequestAuthMethod; + action: RadarStandaloneAssessRequestAction; +} diff --git a/src/radar/interfaces/radar-standalone-delete-radar-list-entry-request.interface.ts b/src/radar/interfaces/radar-standalone-delete-radar-list-entry-request.interface.ts new file mode 100644 index 000000000..fa1a29641 --- /dev/null +++ b/src/radar/interfaces/radar-standalone-delete-radar-list-entry-request.interface.ts @@ -0,0 +1,10 @@ +// This file is auto-generated by oagen. Do not edit. + +export interface RadarStandaloneDeleteRadarListEntryRequest { + /** The value to remove from the list. Must match an existing entry. */ + entry: string; +} + +export interface RadarStandaloneDeleteRadarListEntryRequestResponse { + entry: string; +} diff --git a/src/radar/interfaces/radar-standalone-response-blocklist-type.interface.ts b/src/radar/interfaces/radar-standalone-response-blocklist-type.interface.ts new file mode 100644 index 000000000..b1ce8ba2c --- /dev/null +++ b/src/radar/interfaces/radar-standalone-response-blocklist-type.interface.ts @@ -0,0 +1,14 @@ +// This file is auto-generated by oagen. Do not edit. + +export const RadarStandaloneResponseBlocklistType = { + IpAddress: 'ip_address', + Domain: 'domain', + Email: 'email', + Device: 'device', + UserAgent: 'user_agent', + DeviceFingerprint: 'device_fingerprint', + Country: 'country', +} as const; + +export type RadarStandaloneResponseBlocklistType = + (typeof RadarStandaloneResponseBlocklistType)[keyof typeof RadarStandaloneResponseBlocklistType]; diff --git a/src/radar/interfaces/radar-standalone-response-control.interface.ts b/src/radar/interfaces/radar-standalone-response-control.interface.ts new file mode 100644 index 000000000..e611e6117 --- /dev/null +++ b/src/radar/interfaces/radar-standalone-response-control.interface.ts @@ -0,0 +1,15 @@ +// This file is auto-generated by oagen. Do not edit. + +export const RadarStandaloneResponseControl = { + BotDetection: 'bot_detection', + BruteForceAttack: 'brute_force_attack', + DomainSignUpRateLimit: 'domain_sign_up_rate_limit', + ImpossibleTravel: 'impossible_travel', + RepeatSignUp: 'repeat_sign_up', + StaleAccount: 'stale_account', + UnrecognizedDevice: 'unrecognized_device', + Restriction: 'restriction', +} as const; + +export type RadarStandaloneResponseControl = + (typeof RadarStandaloneResponseControl)[keyof typeof RadarStandaloneResponseControl]; diff --git a/src/radar/interfaces/radar-standalone-response-verdict.interface.ts b/src/radar/interfaces/radar-standalone-response-verdict.interface.ts new file mode 100644 index 000000000..07c51f135 --- /dev/null +++ b/src/radar/interfaces/radar-standalone-response-verdict.interface.ts @@ -0,0 +1,10 @@ +// This file is auto-generated by oagen. Do not edit. + +export const RadarStandaloneResponseVerdict = { + Allow: 'allow', + Block: 'block', + Challenge: 'challenge', +} as const; + +export type RadarStandaloneResponseVerdict = + (typeof RadarStandaloneResponseVerdict)[keyof typeof RadarStandaloneResponseVerdict]; diff --git a/src/radar/interfaces/radar-standalone-response.interface.ts b/src/radar/interfaces/radar-standalone-response.interface.ts new file mode 100644 index 000000000..bd7993023 --- /dev/null +++ b/src/radar/interfaces/radar-standalone-response.interface.ts @@ -0,0 +1,26 @@ +// This file is auto-generated by oagen. Do not edit. + +import type { RadarStandaloneResponseVerdict } from './radar-standalone-response-verdict.interface'; +import type { RadarStandaloneResponseControl } from './radar-standalone-response-control.interface'; +import type { RadarStandaloneResponseBlocklistType } from './radar-standalone-response-blocklist-type.interface'; + +export interface RadarStandaloneResponse { + /** The verdict of the risk assessment. */ + verdict: RadarStandaloneResponseVerdict; + /** A human-readable reason for the verdict. */ + reason: string; + /** Unique identifier of the authentication attempt. */ + attemptId: string; + /** The Radar control that triggered the verdict. Only present if the verdict is `block` or `challenge`. */ + control?: RadarStandaloneResponseControl; + /** The type of blocklist entry that triggered the verdict. Only present if the control is `restriction`. */ + blocklistType?: RadarStandaloneResponseBlocklistType; +} + +export interface RadarStandaloneResponseWire { + verdict: RadarStandaloneResponseVerdict; + reason: string; + attempt_id: string; + control?: RadarStandaloneResponseControl; + blocklist_type?: RadarStandaloneResponseBlocklistType; +} diff --git a/src/radar/interfaces/radar-standalone-update-radar-attempt-request.interface.ts b/src/radar/interfaces/radar-standalone-update-radar-attempt-request.interface.ts new file mode 100644 index 000000000..815829f74 --- /dev/null +++ b/src/radar/interfaces/radar-standalone-update-radar-attempt-request.interface.ts @@ -0,0 +1,13 @@ +// This file is auto-generated by oagen. Do not edit. + +export interface RadarStandaloneUpdateRadarAttemptRequest { + /** Set to `"success"` to mark the challenge as completed. */ + challengeStatus?: 'success'; + /** Set to `"success"` to mark the authentication attempt as successful. */ + attemptStatus?: 'success'; +} + +export interface RadarStandaloneUpdateRadarAttemptRequestResponse { + challenge_status?: 'success'; + attempt_status?: 'success'; +} diff --git a/src/radar/interfaces/radar-standalone-update-radar-list-request.interface.ts b/src/radar/interfaces/radar-standalone-update-radar-list-request.interface.ts new file mode 100644 index 000000000..7abe700f0 --- /dev/null +++ b/src/radar/interfaces/radar-standalone-update-radar-list-request.interface.ts @@ -0,0 +1,10 @@ +// This file is auto-generated by oagen. Do not edit. + +export interface RadarStandaloneUpdateRadarListRequest { + /** The value to add to the list. Must match the format of the list type (e.g. a valid IP address for `ip_address`, a valid email for `email`). */ + entry: string; +} + +export interface RadarStandaloneUpdateRadarListRequestResponse { + entry: string; +} diff --git a/src/radar/interfaces/radar-type.interface.ts b/src/radar/interfaces/radar-type.interface.ts new file mode 100644 index 000000000..b7758819e --- /dev/null +++ b/src/radar/interfaces/radar-type.interface.ts @@ -0,0 +1,13 @@ +// This file is auto-generated by oagen. Do not edit. + +export const RadarType = { + IpAddress: 'ip_address', + Domain: 'domain', + Email: 'email', + Device: 'device', + UserAgent: 'user_agent', + DeviceFingerprint: 'device_fingerprint', + Country: 'country', +} as const; + +export type RadarType = (typeof RadarType)[keyof typeof RadarType]; diff --git a/src/radar/radar.spec.ts b/src/radar/radar.spec.ts new file mode 100644 index 000000000..d0298804e --- /dev/null +++ b/src/radar/radar.spec.ts @@ -0,0 +1,107 @@ +// This file is auto-generated by oagen. Do not edit. + +import fetch from 'jest-fetch-mock'; +import { + fetchOnce, + fetchURL, + fetchMethod, + fetchBody, +} from '../common/utils/test-utils'; +import { WorkOS } from '../workos'; + +import radarStandaloneResponseFixture from './fixtures/radar-standalone-response.json'; +import radarListEntryAlreadyPresentResponseFixture from './fixtures/radar-list-entry-already-present-response.json'; + +const workos = new WorkOS('sk_test_Sz3IQjepeSWaI4cMS4ms4sMuU'); + +describe('Radar', () => { + beforeEach(() => fetch.resetMocks()); + + describe('createAttempt', () => { + it('sends the correct request and returns result', async () => { + fetchOnce(radarStandaloneResponseFixture); + + const result = await workos.radar.createAttempt({ + ipAddress: 'test_ip_address', + userAgent: 'test_user_agent', + email: 'test@example.com', + authMethod: 'Password', + action: 'sign-up', + }); + + expect(fetchMethod()).toBe('POST'); + expect(new URL(String(fetchURL())).pathname).toBe('/radar/attempts'); + expect(fetchBody()).toEqual( + expect.objectContaining({ + ip_address: 'test_ip_address', + user_agent: 'test_user_agent', + email: 'test@example.com', + auth_method: 'Password', + action: 'sign-up', + }), + ); + expect(result.verdict).toBe('block'); + expect(result.reason).toBe('Detected enabled Radar control'); + expect(result.attemptId).toBe('radar_att_01HZBC6N1EB1ZY7KG32X'); + }); + }); + + describe('updateAttempt', () => { + it('sends the request', async () => { + fetchOnce({}); + + await workos.radar.updateAttempt('test_id', { + challengeStatus: 'success', + attemptStatus: 'success', + }); + + expect(fetchMethod()).toBe('PUT'); + expect(new URL(String(fetchURL())).pathname).toBe( + '/radar/attempts/test_id', + ); + expect(fetchBody()).toEqual( + expect.objectContaining({ + challenge_status: 'success', + attempt_status: 'success', + }), + ); + }); + }); + + describe('addListEntry', () => { + it('sends the correct request and returns result', async () => { + fetchOnce(radarListEntryAlreadyPresentResponseFixture); + + const result = await workos.radar.addListEntry('ip_address', 'block', { + entry: 'test_entry', + }); + + expect(fetchMethod()).toBe('POST'); + expect(new URL(String(fetchURL())).pathname).toBe( + '/radar/lists/ip_address/block', + ); + expect(fetchBody()).toEqual( + expect.objectContaining({ entry: 'test_entry' }), + ); + expect(result.message).toBe('Entry already present in list'); + }); + }); + + describe('removeListEntry', () => { + it('sends a DELETE request', async () => { + fetchOnce({}, { status: 204 }); + + await workos.radar.removeListEntry('ip_address', 'block', { + entry: 'test_entry', + }); + + expect(fetchMethod()).toBe('DELETE'); + expect(new URL(String(fetchURL())).pathname).toBe( + '/radar/lists/ip_address/block', + ); + expect(fetchBody()).toEqual( + expect.objectContaining({ entry: 'test_entry' }), + ); + }); + }); +}); diff --git a/src/radar/radar.ts b/src/radar/radar.ts new file mode 100644 index 000000000..bac27e952 --- /dev/null +++ b/src/radar/radar.ts @@ -0,0 +1,132 @@ +// This file is auto-generated by oagen. Do not edit. + +import type { WorkOS } from '../workos'; +import type { + RadarStandaloneResponse, + RadarStandaloneResponseWire, +} from './interfaces/radar-standalone-response.interface'; +import type { + RadarListEntryAlreadyPresentResponse, + RadarListEntryAlreadyPresentResponseWire, +} from './interfaces/radar-list-entry-already-present-response.interface'; +import type { + RadarStandaloneAssessRequest, + RadarStandaloneAssessRequestResponse, +} from './interfaces/radar-standalone-assess-request.interface'; +import type { + RadarStandaloneUpdateRadarAttemptRequest, + RadarStandaloneUpdateRadarAttemptRequestResponse, +} from './interfaces/radar-standalone-update-radar-attempt-request.interface'; +import type { + RadarStandaloneUpdateRadarListRequest, + RadarStandaloneUpdateRadarListRequestResponse, +} from './interfaces/radar-standalone-update-radar-list-request.interface'; +import type { + RadarStandaloneDeleteRadarListEntryRequest, + RadarStandaloneDeleteRadarListEntryRequestResponse, +} from './interfaces/radar-standalone-delete-radar-list-entry-request.interface'; +import { deserializeRadarStandaloneResponse } from './serializers/radar-standalone-response.serializer'; +import { deserializeRadarListEntryAlreadyPresentResponse } from './serializers/radar-list-entry-already-present-response.serializer'; +import { serializeRadarStandaloneAssessRequest } from './serializers/radar-standalone-assess-request.serializer'; +import { serializeRadarStandaloneUpdateRadarAttemptRequest } from './serializers/radar-standalone-update-radar-attempt-request.serializer'; +import { serializeRadarStandaloneUpdateRadarListRequest } from './serializers/radar-standalone-update-radar-list-request.serializer'; +import { serializeRadarStandaloneDeleteRadarListEntryRequest } from './serializers/radar-standalone-delete-radar-list-entry-request.serializer'; +import type { RadarType } from './interfaces/radar-type.interface'; +import type { RadarListAction } from './interfaces/radar-list-action.interface'; + +export class Radar { + constructor(private readonly workos: WorkOS) {} + + /** + * Create an attempt + * + * Assess a request for risk using the Radar engine and receive a verdict. + * @param payload - Object containing ipAddress, userAgent, email, authMethod, action. + * @returns {Promise} + * @throws {BadRequestException} 400 + */ + async createAttempt( + payload: RadarStandaloneAssessRequest, + ): Promise { + const { data } = await this.workos.post< + RadarStandaloneResponseWire, + RadarStandaloneAssessRequestResponse + >('/radar/attempts', serializeRadarStandaloneAssessRequest(payload)); + return deserializeRadarStandaloneResponse(data); + } + + /** + * Update a Radar attempt + * + * You may optionally inform Radar that an authentication attempt or challenge was successful using this endpoint. Some Radar controls depend on tracking recent successful attempts, such as impossible travel. + * @param id - The unique identifier of the Radar attempt to update. + * @example "radar_att_01HZBC6N1EB1ZY7KG32X" + * @param payload - The request body. + * @returns {Promise} + * @throws {BadRequestException} 400 + * @throws {NotFoundException} 404 + */ + async updateAttempt( + id: string, + payload: RadarStandaloneUpdateRadarAttemptRequest, + ): Promise { + await this.workos.put< + void, + RadarStandaloneUpdateRadarAttemptRequestResponse + >( + `/radar/attempts/${encodeURIComponent(id)}`, + serializeRadarStandaloneUpdateRadarAttemptRequest(payload), + ); + } + + /** + * Add an entry to a Radar list + * + * Add an entry to a Radar list. + * @param type - The type of the Radar list (e.g. ip_address, domain, email). + * @example "ip_address" + * @param action - The list action indicating whether to add the entry to the allow or block list. + * @example "block" + * @param payload - Object containing entry. + * @returns {Promise} + * @throws {BadRequestException} 400 + */ + async addListEntry( + type: RadarType, + action: RadarListAction, + payload: RadarStandaloneUpdateRadarListRequest, + ): Promise { + const { data } = await this.workos.post< + RadarListEntryAlreadyPresentResponseWire, + RadarStandaloneUpdateRadarListRequestResponse + >( + `/radar/lists/${encodeURIComponent(type)}/${encodeURIComponent(action)}`, + serializeRadarStandaloneUpdateRadarListRequest(payload), + ); + return deserializeRadarListEntryAlreadyPresentResponse(data); + } + + /** + * Remove an entry from a Radar list + * + * Remove an entry from a Radar list. + * @param type - The type of the Radar list (e.g. ip_address, domain, email). + * @example "ip_address" + * @param action - The list action indicating whether to remove the entry from the allow or block list. + * @example "block" + * @param payload - Object containing entry. + * @returns {Promise} + * @throws {BadRequestException} 400 + * @throws {NotFoundException} 404 + */ + async removeListEntry( + type: RadarType, + action: RadarListAction, + payload: RadarStandaloneDeleteRadarListEntryRequest, + ): Promise { + await this.workos.deleteWithBody( + `/radar/lists/${encodeURIComponent(type)}/${encodeURIComponent(action)}`, + serializeRadarStandaloneDeleteRadarListEntryRequest(payload), + ); + } +} diff --git a/src/radar/serializers/index.ts b/src/radar/serializers/index.ts new file mode 100644 index 000000000..b48706631 --- /dev/null +++ b/src/radar/serializers/index.ts @@ -0,0 +1,8 @@ +// This file is auto-generated by oagen. Do not edit. + +export * from './radar-list-entry-already-present-response.serializer'; +export * from './radar-standalone-assess-request.serializer'; +export * from './radar-standalone-delete-radar-list-entry-request.serializer'; +export * from './radar-standalone-response.serializer'; +export * from './radar-standalone-update-radar-attempt-request.serializer'; +export * from './radar-standalone-update-radar-list-request.serializer'; diff --git a/src/radar/serializers/radar-list-entry-already-present-response.serializer.ts b/src/radar/serializers/radar-list-entry-already-present-response.serializer.ts new file mode 100644 index 000000000..48eaf29aa --- /dev/null +++ b/src/radar/serializers/radar-list-entry-already-present-response.serializer.ts @@ -0,0 +1,18 @@ +// This file is auto-generated by oagen. Do not edit. + +import type { + RadarListEntryAlreadyPresentResponse, + RadarListEntryAlreadyPresentResponseWire, +} from '../interfaces/radar-list-entry-already-present-response.interface'; + +export const deserializeRadarListEntryAlreadyPresentResponse = ( + response: RadarListEntryAlreadyPresentResponseWire, +): RadarListEntryAlreadyPresentResponse => ({ + message: response.message, +}); + +export const serializeRadarListEntryAlreadyPresentResponse = ( + model: RadarListEntryAlreadyPresentResponse, +): RadarListEntryAlreadyPresentResponseWire => ({ + message: model.message, +}); diff --git a/src/radar/serializers/radar-standalone-assess-request.serializer.ts b/src/radar/serializers/radar-standalone-assess-request.serializer.ts new file mode 100644 index 000000000..491d8e687 --- /dev/null +++ b/src/radar/serializers/radar-standalone-assess-request.serializer.ts @@ -0,0 +1,16 @@ +// This file is auto-generated by oagen. Do not edit. + +import type { + RadarStandaloneAssessRequest, + RadarStandaloneAssessRequestResponse, +} from '../interfaces/radar-standalone-assess-request.interface'; + +export const serializeRadarStandaloneAssessRequest = ( + model: RadarStandaloneAssessRequest, +): RadarStandaloneAssessRequestResponse => ({ + ip_address: model.ipAddress, + user_agent: model.userAgent, + email: model.email, + auth_method: model.authMethod, + action: model.action, +}); diff --git a/src/radar/serializers/radar-standalone-delete-radar-list-entry-request.serializer.ts b/src/radar/serializers/radar-standalone-delete-radar-list-entry-request.serializer.ts new file mode 100644 index 000000000..f03d19344 --- /dev/null +++ b/src/radar/serializers/radar-standalone-delete-radar-list-entry-request.serializer.ts @@ -0,0 +1,12 @@ +// This file is auto-generated by oagen. Do not edit. + +import type { + RadarStandaloneDeleteRadarListEntryRequest, + RadarStandaloneDeleteRadarListEntryRequestResponse, +} from '../interfaces/radar-standalone-delete-radar-list-entry-request.interface'; + +export const serializeRadarStandaloneDeleteRadarListEntryRequest = ( + model: RadarStandaloneDeleteRadarListEntryRequest, +): RadarStandaloneDeleteRadarListEntryRequestResponse => ({ + entry: model.entry, +}); diff --git a/src/radar/serializers/radar-standalone-response.serializer.ts b/src/radar/serializers/radar-standalone-response.serializer.ts new file mode 100644 index 000000000..f53a56728 --- /dev/null +++ b/src/radar/serializers/radar-standalone-response.serializer.ts @@ -0,0 +1,26 @@ +// This file is auto-generated by oagen. Do not edit. + +import type { + RadarStandaloneResponse, + RadarStandaloneResponseWire, +} from '../interfaces/radar-standalone-response.interface'; + +export const deserializeRadarStandaloneResponse = ( + response: RadarStandaloneResponseWire, +): RadarStandaloneResponse => ({ + verdict: response.verdict, + reason: response.reason, + attemptId: response.attempt_id, + control: response.control, + blocklistType: response.blocklist_type, +}); + +export const serializeRadarStandaloneResponse = ( + model: RadarStandaloneResponse, +): RadarStandaloneResponseWire => ({ + verdict: model.verdict, + reason: model.reason, + attempt_id: model.attemptId, + control: model.control, + blocklist_type: model.blocklistType, +}); diff --git a/src/radar/serializers/radar-standalone-update-radar-attempt-request.serializer.ts b/src/radar/serializers/radar-standalone-update-radar-attempt-request.serializer.ts new file mode 100644 index 000000000..1344a0bce --- /dev/null +++ b/src/radar/serializers/radar-standalone-update-radar-attempt-request.serializer.ts @@ -0,0 +1,13 @@ +// This file is auto-generated by oagen. Do not edit. + +import type { + RadarStandaloneUpdateRadarAttemptRequest, + RadarStandaloneUpdateRadarAttemptRequestResponse, +} from '../interfaces/radar-standalone-update-radar-attempt-request.interface'; + +export const serializeRadarStandaloneUpdateRadarAttemptRequest = ( + model: RadarStandaloneUpdateRadarAttemptRequest, +): RadarStandaloneUpdateRadarAttemptRequestResponse => ({ + challenge_status: model.challengeStatus, + attempt_status: model.attemptStatus, +}); diff --git a/src/radar/serializers/radar-standalone-update-radar-list-request.serializer.ts b/src/radar/serializers/radar-standalone-update-radar-list-request.serializer.ts new file mode 100644 index 000000000..37148c9da --- /dev/null +++ b/src/radar/serializers/radar-standalone-update-radar-list-request.serializer.ts @@ -0,0 +1,12 @@ +// This file is auto-generated by oagen. Do not edit. + +import type { + RadarStandaloneUpdateRadarListRequest, + RadarStandaloneUpdateRadarListRequestResponse, +} from '../interfaces/radar-standalone-update-radar-list-request.interface'; + +export const serializeRadarStandaloneUpdateRadarListRequest = ( + model: RadarStandaloneUpdateRadarListRequest, +): RadarStandaloneUpdateRadarListRequestResponse => ({ + entry: model.entry, +}); diff --git a/src/webhooks/interfaces/create-webhook-endpoint-events.interface.ts b/src/webhooks/interfaces/create-webhook-endpoint-events.interface.ts index 1127d7544..138539523 100644 --- a/src/webhooks/interfaces/create-webhook-endpoint-events.interface.ts +++ b/src/webhooks/interfaces/create-webhook-endpoint-events.interface.ts @@ -76,6 +76,10 @@ export const CreateWebhookEndpointEvents = { PermissionCreated: 'permission.created', PermissionDeleted: 'permission.deleted', PermissionUpdated: 'permission.updated', + PipesConnectedAccountConnected: 'pipes.connected_account.connected', + PipesConnectedAccountDisconnected: 'pipes.connected_account.disconnected', + PipesConnectedAccountReauthorizationNeeded: + 'pipes.connected_account.reauthorization_needed', SessionCreated: 'session.created', SessionRevoked: 'session.revoked', WaitlistUserApproved: 'waitlist_user.approved', diff --git a/src/webhooks/interfaces/update-webhook-endpoint-events.interface.ts b/src/webhooks/interfaces/update-webhook-endpoint-events.interface.ts index 743bd0c69..5f99b45b6 100644 --- a/src/webhooks/interfaces/update-webhook-endpoint-events.interface.ts +++ b/src/webhooks/interfaces/update-webhook-endpoint-events.interface.ts @@ -76,6 +76,10 @@ export const UpdateWebhookEndpointEvents = { PermissionCreated: 'permission.created', PermissionDeleted: 'permission.deleted', PermissionUpdated: 'permission.updated', + PipesConnectedAccountConnected: 'pipes.connected_account.connected', + PipesConnectedAccountDisconnected: 'pipes.connected_account.disconnected', + PipesConnectedAccountReauthorizationNeeded: + 'pipes.connected_account.reauthorization_needed', SessionCreated: 'session.created', SessionRevoked: 'session.revoked', WaitlistUserApproved: 'waitlist_user.approved', diff --git a/src/workos.ts b/src/workos.ts index 4378b4f07..a04a6fd81 100644 --- a/src/workos.ts +++ b/src/workos.ts @@ -27,6 +27,7 @@ import { Organizations } from './organizations/organizations'; import { OrganizationDomains } from './organization-domains/organization-domains'; import { Passwordless } from './passwordless/passwordless'; import { Pipes } from './pipes/pipes'; +import { Radar } from './radar/radar'; import { AdminPortal } from './admin-portal/admin-portal'; import { SSO } from './sso/sso'; import { Webhooks } from './webhooks/webhooks'; @@ -80,6 +81,7 @@ export class WorkOS { readonly organizationDomains = new OrganizationDomains(this); readonly passwordless = new Passwordless(this); readonly pipes = new Pipes(this); + readonly radar = new Radar(this); readonly adminPortal = new AdminPortal(this); readonly sso = new SSO(this); readonly userManagement: UserManagement;