From 72ad45bffd5b13182ac00450ccc090fdb33ca77f Mon Sep 17 00:00:00 2001 From: jonatas Date: Thu, 20 Aug 2026 18:06:21 +0000 Subject: [PATCH 1/2] Add IT Contacts API Generate the ItContacts service from the OpenAPI spec and expose it as workos.itContacts, with list/create/delete/invite/revoke operations. Co-Authored-By: Devin AI <158243242+devin-ai-integration[bot]@users.noreply.github.com> --- .oagen-manifest.json | 26 +++- src/index.ts | 1 + .../fixtures/create-it-contact.json | 3 + .../fixtures/invite-it-contact.json | 3 + .../it-contact-list-list-metadata.json | 4 + src/it-contacts/fixtures/it-contact-list.json | 16 +++ src/it-contacts/fixtures/it-contact.json | 7 + .../create-it-contact-options.interface.ts | 8 ++ .../interfaces/create-it-contact.interface.ts | 10 ++ .../delete-it-contact-options.interface.ts | 8 ++ src/it-contacts/interfaces/index.ts | 11 ++ .../invite-it-contact-intents.interface.ts | 12 ++ .../invite-it-contact-options.interface.ts | 12 ++ .../interfaces/invite-it-contact.interface.ts | 12 ++ ...it-contact-list-list-metadata.interface.ts | 14 ++ .../interfaces/it-contact-list.interface.ts | 22 +++ .../interfaces/it-contact.interface.ts | 22 +++ .../list-it-contacts-options.interface.ts | 6 + .../revoke-it-contact-options.interface.ts | 8 ++ src/it-contacts/it-contacts.spec.ts | 111 +++++++++++++++ src/it-contacts/it-contacts.ts | 134 ++++++++++++++++++ .../create-it-contact.serializer.ts | 12 ++ src/it-contacts/serializers/index.ts | 7 + .../invite-it-contact.serializer.ts | 12 ++ ...t-contact-list-list-metadata.serializer.ts | 13 ++ .../serializers/it-contact-list.serializer.ts | 16 +++ .../serializers/it-contact.serializer.ts | 16 +++ src/workos.ts | 2 + 28 files changed, 527 insertions(+), 1 deletion(-) create mode 100644 src/it-contacts/fixtures/create-it-contact.json create mode 100644 src/it-contacts/fixtures/invite-it-contact.json create mode 100644 src/it-contacts/fixtures/it-contact-list-list-metadata.json create mode 100644 src/it-contacts/fixtures/it-contact-list.json create mode 100644 src/it-contacts/fixtures/it-contact.json create mode 100644 src/it-contacts/interfaces/create-it-contact-options.interface.ts create mode 100644 src/it-contacts/interfaces/create-it-contact.interface.ts create mode 100644 src/it-contacts/interfaces/delete-it-contact-options.interface.ts create mode 100644 src/it-contacts/interfaces/index.ts create mode 100644 src/it-contacts/interfaces/invite-it-contact-intents.interface.ts create mode 100644 src/it-contacts/interfaces/invite-it-contact-options.interface.ts create mode 100644 src/it-contacts/interfaces/invite-it-contact.interface.ts create mode 100644 src/it-contacts/interfaces/it-contact-list-list-metadata.interface.ts create mode 100644 src/it-contacts/interfaces/it-contact-list.interface.ts create mode 100644 src/it-contacts/interfaces/it-contact.interface.ts create mode 100644 src/it-contacts/interfaces/list-it-contacts-options.interface.ts create mode 100644 src/it-contacts/interfaces/revoke-it-contact-options.interface.ts create mode 100644 src/it-contacts/it-contacts.spec.ts create mode 100644 src/it-contacts/it-contacts.ts create mode 100644 src/it-contacts/serializers/create-it-contact.serializer.ts create mode 100644 src/it-contacts/serializers/index.ts create mode 100644 src/it-contacts/serializers/invite-it-contact.serializer.ts create mode 100644 src/it-contacts/serializers/it-contact-list-list-metadata.serializer.ts create mode 100644 src/it-contacts/serializers/it-contact-list.serializer.ts create mode 100644 src/it-contacts/serializers/it-contact.serializer.ts diff --git a/.oagen-manifest.json b/.oagen-manifest.json index f4f865519..2888b6c27 100644 --- a/.oagen-manifest.json +++ b/.oagen-manifest.json @@ -1,7 +1,6 @@ { "version": 2, "language": "node", - "generatedAt": "2026-06-16T18:02:10.415Z", "files": [ "src/api-keys/interfaces/create-validation-options.interface.ts", "src/api-keys/interfaces/delete-api-key-options.interface.ts", @@ -82,6 +81,31 @@ "src/groups/serializers/index.ts", "src/groups/serializers/update-group.serializer.ts", "src/groups/serializers/user-organization-membership-base-list-data.serializer.ts", + "src/it-contacts/fixtures/create-it-contact.json", + "src/it-contacts/fixtures/invite-it-contact.json", + "src/it-contacts/fixtures/it-contact-list-list-metadata.json", + "src/it-contacts/fixtures/it-contact-list.json", + "src/it-contacts/fixtures/it-contact.json", + "src/it-contacts/interfaces/create-it-contact-options.interface.ts", + "src/it-contacts/interfaces/create-it-contact.interface.ts", + "src/it-contacts/interfaces/delete-it-contact-options.interface.ts", + "src/it-contacts/interfaces/index.ts", + "src/it-contacts/interfaces/invite-it-contact-intents.interface.ts", + "src/it-contacts/interfaces/invite-it-contact-options.interface.ts", + "src/it-contacts/interfaces/invite-it-contact.interface.ts", + "src/it-contacts/interfaces/it-contact-list-list-metadata.interface.ts", + "src/it-contacts/interfaces/it-contact-list.interface.ts", + "src/it-contacts/interfaces/it-contact.interface.ts", + "src/it-contacts/interfaces/list-it-contacts-options.interface.ts", + "src/it-contacts/interfaces/revoke-it-contact-options.interface.ts", + "src/it-contacts/it-contacts.spec.ts", + "src/it-contacts/it-contacts.ts", + "src/it-contacts/serializers/create-it-contact.serializer.ts", + "src/it-contacts/serializers/index.ts", + "src/it-contacts/serializers/invite-it-contact.serializer.ts", + "src/it-contacts/serializers/it-contact-list-list-metadata.serializer.ts", + "src/it-contacts/serializers/it-contact-list.serializer.ts", + "src/it-contacts/serializers/it-contact.serializer.ts", "src/pipes/fixtures/connected-account.json", "src/pipes/fixtures/data-integration-access-token-response-access-token.json", "src/pipes/fixtures/data-integration-access-token-response.json", diff --git a/src/index.ts b/src/index.ts index f00652919..ba3f0ed99 100644 --- a/src/index.ts +++ b/src/index.ts @@ -24,6 +24,7 @@ export * from './events/interfaces'; export * from './feature-flags/interfaces'; export { FeatureFlagsRuntimeClient } from './feature-flags/runtime-client'; export * from './groups/interfaces'; +export * from './it-contacts/interfaces'; export * from './multi-factor-auth/interfaces'; export * from './organizations/interfaces'; export * from './organization-domains/interfaces'; diff --git a/src/it-contacts/fixtures/create-it-contact.json b/src/it-contacts/fixtures/create-it-contact.json new file mode 100644 index 000000000..6de60fb50 --- /dev/null +++ b/src/it-contacts/fixtures/create-it-contact.json @@ -0,0 +1,3 @@ +{ + "email": "it-contact@example.com" +} diff --git a/src/it-contacts/fixtures/invite-it-contact.json b/src/it-contacts/fixtures/invite-it-contact.json new file mode 100644 index 000000000..064cf985f --- /dev/null +++ b/src/it-contacts/fixtures/invite-it-contact.json @@ -0,0 +1,3 @@ +{ + "intents": ["sso", "directory_sync"] +} diff --git a/src/it-contacts/fixtures/it-contact-list-list-metadata.json b/src/it-contacts/fixtures/it-contact-list-list-metadata.json new file mode 100644 index 000000000..598b6c023 --- /dev/null +++ b/src/it-contacts/fixtures/it-contact-list-list-metadata.json @@ -0,0 +1,4 @@ +{ + "before": "it_contact_01HXYZ123456789ABCDEFGHIJ", + "after": "it_contact_01HXYZ987654321KJIHGFEDCBA" +} diff --git a/src/it-contacts/fixtures/it-contact-list.json b/src/it-contacts/fixtures/it-contact-list.json new file mode 100644 index 000000000..732bbe9a9 --- /dev/null +++ b/src/it-contacts/fixtures/it-contact-list.json @@ -0,0 +1,16 @@ +{ + "object": "list", + "data": [ + { + "object": "it_contact", + "id": "it_contact_01HXYZ123456789ABCDEFGHIJ", + "email": "it-contact@example.com", + "created_at": "2026-01-15T12:00:00.000Z", + "updated_at": "2026-01-15T12:00:00.000Z" + } + ], + "list_metadata": { + "before": "it_contact_01HXYZ123456789ABCDEFGHIJ", + "after": "it_contact_01HXYZ987654321KJIHGFEDCBA" + } +} diff --git a/src/it-contacts/fixtures/it-contact.json b/src/it-contacts/fixtures/it-contact.json new file mode 100644 index 000000000..f57597489 --- /dev/null +++ b/src/it-contacts/fixtures/it-contact.json @@ -0,0 +1,7 @@ +{ + "object": "it_contact", + "id": "it_contact_01HXYZ123456789ABCDEFGHIJ", + "email": "it-contact@example.com", + "created_at": "2026-01-15T12:00:00.000Z", + "updated_at": "2026-01-15T12:00:00.000Z" +} diff --git a/src/it-contacts/interfaces/create-it-contact-options.interface.ts b/src/it-contacts/interfaces/create-it-contact-options.interface.ts new file mode 100644 index 000000000..0d333c3a1 --- /dev/null +++ b/src/it-contacts/interfaces/create-it-contact-options.interface.ts @@ -0,0 +1,8 @@ +// This file is auto-generated by oagen. Do not edit. + +export interface CreateItContactOptions { + /** The ID of the organization. */ + organizationId: string; + /** The email address of the IT contact. */ + email: string; +} diff --git a/src/it-contacts/interfaces/create-it-contact.interface.ts b/src/it-contacts/interfaces/create-it-contact.interface.ts new file mode 100644 index 000000000..fc6382ac8 --- /dev/null +++ b/src/it-contacts/interfaces/create-it-contact.interface.ts @@ -0,0 +1,10 @@ +// This file is auto-generated by oagen. Do not edit. + +export interface CreateItContact { + /** The email address of the IT contact. */ + email: string; +} + +export interface CreateItContactResponse { + email: string; +} diff --git a/src/it-contacts/interfaces/delete-it-contact-options.interface.ts b/src/it-contacts/interfaces/delete-it-contact-options.interface.ts new file mode 100644 index 000000000..a0e7a84bf --- /dev/null +++ b/src/it-contacts/interfaces/delete-it-contact-options.interface.ts @@ -0,0 +1,8 @@ +// This file is auto-generated by oagen. Do not edit. + +export interface DeleteItContactOptions { + /** The ID of the organization. */ + organizationId: string; + /** The ID of the IT contact. */ + contactId: string; +} diff --git a/src/it-contacts/interfaces/index.ts b/src/it-contacts/interfaces/index.ts new file mode 100644 index 000000000..024cabb5c --- /dev/null +++ b/src/it-contacts/interfaces/index.ts @@ -0,0 +1,11 @@ +// This file is auto-generated by oagen. Do not edit. + +export * from './create-it-contact-options.interface'; +export * from './create-it-contact.interface'; +export * from './delete-it-contact-options.interface'; +export * from './invite-it-contact-intents.interface'; +export * from './invite-it-contact-options.interface'; +export * from './invite-it-contact.interface'; +export * from './it-contact.interface'; +export * from './list-it-contacts-options.interface'; +export * from './revoke-it-contact-options.interface'; diff --git a/src/it-contacts/interfaces/invite-it-contact-intents.interface.ts b/src/it-contacts/interfaces/invite-it-contact-intents.interface.ts new file mode 100644 index 000000000..c249af152 --- /dev/null +++ b/src/it-contacts/interfaces/invite-it-contact-intents.interface.ts @@ -0,0 +1,12 @@ +// This file is auto-generated by oagen. Do not edit. + +export const InviteItContactIntents = { + SSO: 'sso', + DirectorySync: 'directory_sync', + LogStreams: 'log_streams', + DomainVerification: 'domain_verification', + BringYourOwnKey: 'bring_your_own_key', +} as const; + +export type InviteItContactIntents = + (typeof InviteItContactIntents)[keyof typeof InviteItContactIntents]; diff --git a/src/it-contacts/interfaces/invite-it-contact-options.interface.ts b/src/it-contacts/interfaces/invite-it-contact-options.interface.ts new file mode 100644 index 000000000..29468b6fa --- /dev/null +++ b/src/it-contacts/interfaces/invite-it-contact-options.interface.ts @@ -0,0 +1,12 @@ +// This file is auto-generated by oagen. Do not edit. + +import type { InviteItContactIntents } from './invite-it-contact-intents.interface'; + +export interface InviteItContactOptions { + /** The ID of the organization. */ + organizationId: string; + /** The ID of the IT contact. */ + contactId: string; + /** The Admin Portal features that the IT contact can configure. */ + intents: InviteItContactIntents[]; +} diff --git a/src/it-contacts/interfaces/invite-it-contact.interface.ts b/src/it-contacts/interfaces/invite-it-contact.interface.ts new file mode 100644 index 000000000..a021d7379 --- /dev/null +++ b/src/it-contacts/interfaces/invite-it-contact.interface.ts @@ -0,0 +1,12 @@ +// This file is auto-generated by oagen. Do not edit. + +import type { InviteItContactIntents } from './invite-it-contact-intents.interface'; + +export interface InviteItContact { + /** The Admin Portal features that the IT contact can configure. */ + intents: InviteItContactIntents[]; +} + +export interface InviteItContactResponse { + intents: InviteItContactIntents[]; +} diff --git a/src/it-contacts/interfaces/it-contact-list-list-metadata.interface.ts b/src/it-contacts/interfaces/it-contact-list-list-metadata.interface.ts new file mode 100644 index 000000000..04d96c623 --- /dev/null +++ b/src/it-contacts/interfaces/it-contact-list-list-metadata.interface.ts @@ -0,0 +1,14 @@ +// This file is auto-generated by oagen. Do not edit. + +/** Pagination cursors for navigating between pages of results. */ +export interface ItContactListListMetadata { + /** An object ID that defines your place in the list. When the ID is not present, you are at the start of the list. */ + before: string | null; + /** An object ID that defines your place in the list. When the ID is not present, you are at the end of the list. */ + after: string | null; +} + +export interface ItContactListListMetadataResponse { + before: string | null; + after: string | null; +} diff --git a/src/it-contacts/interfaces/it-contact-list.interface.ts b/src/it-contacts/interfaces/it-contact-list.interface.ts new file mode 100644 index 000000000..346cee9ed --- /dev/null +++ b/src/it-contacts/interfaces/it-contact-list.interface.ts @@ -0,0 +1,22 @@ +// This file is auto-generated by oagen. Do not edit. + +import type { ItContact, ItContactResponse } from './it-contact.interface'; +import type { + ItContactListListMetadata, + ItContactListListMetadataResponse, +} from './it-contact-list-list-metadata.interface'; + +export interface ItContactList { + /** Indicates this is a list response. */ + object: 'list'; + /** The list of records for the current page. */ + data: ItContact[]; + /** Pagination cursors for navigating between pages of results. */ + listMetadata: ItContactListListMetadata; +} + +export interface ItContactListResponse { + object: 'list'; + data: ItContactResponse[]; + list_metadata: ItContactListListMetadataResponse; +} diff --git a/src/it-contacts/interfaces/it-contact.interface.ts b/src/it-contacts/interfaces/it-contact.interface.ts new file mode 100644 index 000000000..2f69bd382 --- /dev/null +++ b/src/it-contacts/interfaces/it-contact.interface.ts @@ -0,0 +1,22 @@ +// This file is auto-generated by oagen. Do not edit. + +export interface ItContact { + /** The IT Contact object. */ + object: 'it_contact'; + /** The unique ID of the IT Contact. */ + id: string; + /** The email address of the IT Contact. */ + email: string; + /** An ISO 8601 timestamp. */ + createdAt: Date; + /** An ISO 8601 timestamp. */ + updatedAt: Date; +} + +export interface ItContactResponse { + object: 'it_contact'; + id: string; + email: string; + created_at: string; + updated_at: string; +} diff --git a/src/it-contacts/interfaces/list-it-contacts-options.interface.ts b/src/it-contacts/interfaces/list-it-contacts-options.interface.ts new file mode 100644 index 000000000..01ac2757a --- /dev/null +++ b/src/it-contacts/interfaces/list-it-contacts-options.interface.ts @@ -0,0 +1,6 @@ +// This file is auto-generated by oagen. Do not edit. + +export interface ListItContactsOptions { + /** The ID of the organization. */ + organizationId: string; +} diff --git a/src/it-contacts/interfaces/revoke-it-contact-options.interface.ts b/src/it-contacts/interfaces/revoke-it-contact-options.interface.ts new file mode 100644 index 000000000..94e3e34b4 --- /dev/null +++ b/src/it-contacts/interfaces/revoke-it-contact-options.interface.ts @@ -0,0 +1,8 @@ +// This file is auto-generated by oagen. Do not edit. + +export interface RevokeItContactOptions { + /** The ID of the organization. */ + organizationId: string; + /** The ID of the IT contact. */ + contactId: string; +} diff --git a/src/it-contacts/it-contacts.spec.ts b/src/it-contacts/it-contacts.spec.ts new file mode 100644 index 000000000..ac6e48be1 --- /dev/null +++ b/src/it-contacts/it-contacts.spec.ts @@ -0,0 +1,111 @@ +// 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 itContactListFixture from './fixtures/it-contact-list.json'; +import itContactFixture from './fixtures/it-contact.json'; + +const workos = new WorkOS('sk_test_Sz3IQjepeSWaI4cMS4ms4sMuU'); + +describe('ItContacts', () => { + beforeEach(() => fetch.resetMocks()); + + describe('listItContacts', () => { + it('returns the expected result', async () => { + fetchOnce(itContactListFixture); + + const result = await workos.itContacts.listItContacts({ + organizationId: 'test_organizationId', + }); + + expect(fetchMethod()).toBe('GET'); + expect(new URL(String(fetchURL())).pathname).toBe( + '/organizations/test_organizationId/it_contacts', + ); + expect(result.object).toBe('list'); + }); + }); + + describe('createItContact', () => { + it('sends the correct request and returns result', async () => { + fetchOnce(itContactFixture); + + const result = await workos.itContacts.createItContact({ + organizationId: 'test_organizationId', + email: 'test@example.com', + }); + + expect(fetchMethod()).toBe('POST'); + expect(new URL(String(fetchURL())).pathname).toBe( + '/organizations/test_organizationId/it_contacts', + ); + expect(fetchBody()).toEqual( + expect.objectContaining({ email: 'test@example.com' }), + ); + expect(result.object).toBe('it_contact'); + expect(result.id).toBe('it_contact_01HXYZ123456789ABCDEFGHIJ'); + expect(result.email).toBe('it-contact@example.com'); + expect(result.createdAt.toISOString()).toBe('2026-01-15T12:00:00.000Z'); + expect(result.updatedAt.toISOString()).toBe('2026-01-15T12:00:00.000Z'); + }); + }); + + describe('deleteItContact', () => { + it('sends a DELETE request', async () => { + fetchOnce({}, { status: 204 }); + + await workos.itContacts.deleteItContact({ + organizationId: 'test_organizationId', + contactId: 'test_contactId', + }); + + expect(fetchMethod()).toBe('DELETE'); + expect(new URL(String(fetchURL())).pathname).toBe( + '/organizations/test_organizationId/it_contacts/test_contactId', + ); + }); + }); + + describe('inviteItContact', () => { + it('sends the request', async () => { + fetchOnce({}); + + await workos.itContacts.inviteItContact({ + organizationId: 'test_organizationId', + contactId: 'test_contactId', + intents: ['sso'], + }); + + expect(fetchMethod()).toBe('POST'); + expect(new URL(String(fetchURL())).pathname).toBe( + '/organizations/test_organizationId/it_contacts/test_contactId/invite', + ); + expect(fetchBody()).toEqual( + expect.objectContaining({ intents: ['sso'] }), + ); + }); + }); + + describe('revokeItContact', () => { + it('sends the request', async () => { + fetchOnce({}); + + await workos.itContacts.revokeItContact({ + organizationId: 'test_organizationId', + contactId: 'test_contactId', + }); + + expect(fetchMethod()).toBe('POST'); + expect(new URL(String(fetchURL())).pathname).toBe( + '/organizations/test_organizationId/it_contacts/test_contactId/revoke', + ); + }); + }); +}); diff --git a/src/it-contacts/it-contacts.ts b/src/it-contacts/it-contacts.ts new file mode 100644 index 000000000..f1866b946 --- /dev/null +++ b/src/it-contacts/it-contacts.ts @@ -0,0 +1,134 @@ +// This file is auto-generated by oagen. Do not edit. + +import type { WorkOS } from '../workos'; +import type { ListItContactsOptions } from './interfaces/list-it-contacts-options.interface'; +import type { CreateItContactOptions } from './interfaces/create-it-contact-options.interface'; +import type { DeleteItContactOptions } from './interfaces/delete-it-contact-options.interface'; +import type { InviteItContactOptions } from './interfaces/invite-it-contact-options.interface'; +import type { RevokeItContactOptions } from './interfaces/revoke-it-contact-options.interface'; +import type { + ItContactList, + ItContactListResponse, +} from './interfaces/it-contact-list.interface'; +import type { + ItContact, + ItContactResponse, +} from './interfaces/it-contact.interface'; +import type { CreateItContactResponse } from './interfaces/create-it-contact.interface'; +import type { InviteItContactResponse } from './interfaces/invite-it-contact.interface'; +import { deserializeItContactList } from './serializers/it-contact-list.serializer'; +import { deserializeItContact } from './serializers/it-contact.serializer'; +import { serializeCreateItContact } from './serializers/create-it-contact.serializer'; +import { serializeInviteItContact } from './serializers/invite-it-contact.serializer'; + +export class ItContacts { + constructor(private readonly workos: WorkOS) {} + + /** + * List IT contacts + * + * Get the IT contacts for an organization. + * @param options - The request options. + * @param options.organizationId - The ID of the organization. + * @example "org_01EHWNCE74X7JSDV0X3SZ3KJNY" + * @returns {Promise} + * @throws {AuthorizationException} 403 + * @throws {NotFoundException} 404 + */ + async listItContacts(options: ListItContactsOptions): Promise { + const { organizationId } = options; + const { data } = await this.workos.get( + `/organizations/${encodeURIComponent(organizationId)}/it_contacts`, + ); + return deserializeItContactList(data); + } + + /** + * Create an IT contact + * + * Add an IT contact to an organization. No Admin Portal invitation is sent, though the contact is notified if the organization has a connection certificate nearing expiry. + * @param options - The request options. + * @param options.organizationId - The ID of the organization. + * @example "org_01EHWNCE74X7JSDV0X3SZ3KJNY" + * @returns {Promise} + * @throws {AuthorizationException} 403 + * @throws {NotFoundException} 404 + * @throws {ConflictException} 409 + * @throws {UnprocessableEntityException} 422 + */ + async createItContact(options: CreateItContactOptions): Promise { + const { organizationId, ...payload } = options; + const { data } = await this.workos.post< + ItContactResponse, + CreateItContactResponse + >( + `/organizations/${encodeURIComponent(organizationId)}/it_contacts`, + serializeCreateItContact(payload), + ); + return deserializeItContact(data); + } + + /** + * Delete an IT contact + * + * Remove an IT contact from an organization and revoke the contact's active setup links. + * @param options - The request options. + * @param options.organizationId - The ID of the organization. + * @example "org_01EHWNCE74X7JSDV0X3SZ3KJNY" + * @param options.contactId - The ID of the IT contact. + * @example "it_contact_01HXYZ123456789ABCDEFGHIJ" + * @returns {Promise} + * @throws {AuthorizationException} 403 + * @throws {NotFoundException} 404 + */ + async deleteItContact(options: DeleteItContactOptions): Promise { + const { organizationId, contactId } = options; + await this.workos.delete( + `/organizations/${encodeURIComponent(organizationId)}/it_contacts/${encodeURIComponent(contactId)}`, + ); + } + + /** + * Invite an IT contact + * + * Create an Admin Portal setup link and email it to the IT contact. An organization can have at most one active invitation. + * @param options - The request options. + * @param options.organizationId - The ID of the organization. + * @example "org_01EHWNCE74X7JSDV0X3SZ3KJNY" + * @param options.contactId - The ID of the IT contact. + * @example "it_contact_01HXYZ123456789ABCDEFGHIJ" + * @returns {Promise} + * @throws {AuthorizationException} 403 + * @throws {NotFoundException} 404 + * @throws {ConflictException} 409 + * @throws {UnprocessableEntityException} 422 + */ + async inviteItContact(options: InviteItContactOptions): Promise { + const { organizationId, contactId, ...payload } = options; + await this.workos.post( + `/organizations/${encodeURIComponent(organizationId)}/it_contacts/${encodeURIComponent(contactId)}/invite`, + serializeInviteItContact(payload), + ); + } + + /** + * Revoke an IT contact's invitation + * + * Revoke the organization's active Admin Portal invitation. + * @param options - The request options. + * @param options.organizationId - The ID of the organization. + * @example "org_01EHWNCE74X7JSDV0X3SZ3KJNY" + * @param options.contactId - The ID of the IT contact. + * @example "it_contact_01HXYZ123456789ABCDEFGHIJ" + * @returns {Promise} + * @throws {AuthorizationException} 403 + * @throws {NotFoundException} 404 + */ + async revokeItContact(options: RevokeItContactOptions): Promise { + const { organizationId, contactId } = options; + await this.workos.post( + `/organizations/${encodeURIComponent(organizationId)}/it_contacts/${encodeURIComponent(contactId)}/revoke`, + {}, + ); + } +} diff --git a/src/it-contacts/serializers/create-it-contact.serializer.ts b/src/it-contacts/serializers/create-it-contact.serializer.ts new file mode 100644 index 000000000..699accfbe --- /dev/null +++ b/src/it-contacts/serializers/create-it-contact.serializer.ts @@ -0,0 +1,12 @@ +// This file is auto-generated by oagen. Do not edit. + +import type { + CreateItContact, + CreateItContactResponse, +} from '../interfaces/create-it-contact.interface'; + +export const serializeCreateItContact = ( + model: CreateItContact, +): CreateItContactResponse => ({ + email: model.email, +}); diff --git a/src/it-contacts/serializers/index.ts b/src/it-contacts/serializers/index.ts new file mode 100644 index 000000000..bb9f0415c --- /dev/null +++ b/src/it-contacts/serializers/index.ts @@ -0,0 +1,7 @@ +// This file is auto-generated by oagen. Do not edit. + +export * from './create-it-contact.serializer'; +export * from './invite-it-contact.serializer'; +export * from './it-contact.serializer'; +export * from './it-contact-list.serializer'; +export * from './it-contact-list-list-metadata.serializer'; diff --git a/src/it-contacts/serializers/invite-it-contact.serializer.ts b/src/it-contacts/serializers/invite-it-contact.serializer.ts new file mode 100644 index 000000000..cfd3e4e61 --- /dev/null +++ b/src/it-contacts/serializers/invite-it-contact.serializer.ts @@ -0,0 +1,12 @@ +// This file is auto-generated by oagen. Do not edit. + +import type { + InviteItContact, + InviteItContactResponse, +} from '../interfaces/invite-it-contact.interface'; + +export const serializeInviteItContact = ( + model: InviteItContact, +): InviteItContactResponse => ({ + intents: model.intents, +}); diff --git a/src/it-contacts/serializers/it-contact-list-list-metadata.serializer.ts b/src/it-contacts/serializers/it-contact-list-list-metadata.serializer.ts new file mode 100644 index 000000000..51acc87f3 --- /dev/null +++ b/src/it-contacts/serializers/it-contact-list-list-metadata.serializer.ts @@ -0,0 +1,13 @@ +// This file is auto-generated by oagen. Do not edit. + +import type { + ItContactListListMetadata, + ItContactListListMetadataResponse, +} from '../interfaces/it-contact-list-list-metadata.interface'; + +export const deserializeItContactListListMetadata = ( + response: ItContactListListMetadataResponse, +): ItContactListListMetadata => ({ + before: response.before ?? null, + after: response.after ?? null, +}); diff --git a/src/it-contacts/serializers/it-contact-list.serializer.ts b/src/it-contacts/serializers/it-contact-list.serializer.ts new file mode 100644 index 000000000..b0972d666 --- /dev/null +++ b/src/it-contacts/serializers/it-contact-list.serializer.ts @@ -0,0 +1,16 @@ +// This file is auto-generated by oagen. Do not edit. + +import type { + ItContactList, + ItContactListResponse, +} from '../interfaces/it-contact-list.interface'; +import { deserializeItContact } from './it-contact.serializer'; +import { deserializeItContactListListMetadata } from './it-contact-list-list-metadata.serializer'; + +export const deserializeItContactList = ( + response: ItContactListResponse, +): ItContactList => ({ + object: response.object, + data: response.data.map(deserializeItContact), + listMetadata: deserializeItContactListListMetadata(response.list_metadata), +}); diff --git a/src/it-contacts/serializers/it-contact.serializer.ts b/src/it-contacts/serializers/it-contact.serializer.ts new file mode 100644 index 000000000..3aa56f3dc --- /dev/null +++ b/src/it-contacts/serializers/it-contact.serializer.ts @@ -0,0 +1,16 @@ +// This file is auto-generated by oagen. Do not edit. + +import type { + ItContact, + ItContactResponse, +} from '../interfaces/it-contact.interface'; + +export const deserializeItContact = ( + response: ItContactResponse, +): ItContact => ({ + object: response.object, + id: response.id, + email: response.email, + createdAt: new Date(response.created_at), + updatedAt: new Date(response.updated_at), +}); diff --git a/src/workos.ts b/src/workos.ts index 6f5c12bb8..36cb4cee0 100644 --- a/src/workos.ts +++ b/src/workos.ts @@ -39,6 +39,7 @@ import { UserManagement } from './user-management/user-management'; import { BadRequestException } from './common/exceptions/bad-request.exception'; import { FeatureFlags } from './feature-flags/feature-flags'; import { Groups } from './groups/groups'; +import { ItContacts } from './it-contacts/it-contacts'; import { HttpClient, HttpClientError } from './common/net/http-client'; import { SubtleCryptoProvider } from './common/crypto/subtle-crypto-provider'; @@ -79,6 +80,7 @@ export class WorkOS { readonly events = new Events(this); readonly featureFlags = new FeatureFlags(this); readonly groups = new Groups(this); + readonly itContacts = new ItContacts(this); readonly multiFactorAuth = new MultiFactorAuth(this); readonly organizations = new Organizations(this); readonly organizationDomains = new OrganizationDomains(this); From 8ffa06932d6b9de2e44ce341bd8d90be24e38e2c Mon Sep 17 00:00:00 2001 From: jonatas Date: Mon, 24 Aug 2026 13:21:51 +0000 Subject: [PATCH 2/2] Move IT contacts onto the Organizations service Co-Authored-By: Devin AI <158243242+devin-ai-integration[bot]@users.noreply.github.com> --- .oagen-manifest.json | 26 +--- src/index.ts | 1 - .../fixtures/create-it-contact.json | 3 - .../fixtures/invite-it-contact.json | 3 - .../it-contact-list-list-metadata.json | 4 - .../create-it-contact-options.interface.ts | 8 -- .../interfaces/create-it-contact.interface.ts | 10 -- .../delete-it-contact-options.interface.ts | 8 -- src/it-contacts/interfaces/index.ts | 11 -- .../invite-it-contact-intents.interface.ts | 12 -- .../invite-it-contact-options.interface.ts | 12 -- .../interfaces/invite-it-contact.interface.ts | 12 -- ...it-contact-list-list-metadata.interface.ts | 14 -- .../interfaces/it-contact-list.interface.ts | 22 --- .../list-it-contacts-options.interface.ts | 6 - .../revoke-it-contact-options.interface.ts | 8 -- src/it-contacts/it-contacts.spec.ts | 111 --------------- src/it-contacts/it-contacts.ts | 134 ------------------ .../create-it-contact.serializer.ts | 12 -- src/it-contacts/serializers/index.ts | 7 - .../invite-it-contact.serializer.ts | 12 -- ...t-contact-list-list-metadata.serializer.ts | 13 -- .../serializers/it-contact-list.serializer.ts | 16 --- .../serializers/it-contact.serializer.ts | 16 --- .../fixtures/it-contact.json | 0 .../fixtures/list-it-contacts.json} | 4 +- src/organizations/interfaces/index.ts | 2 + .../it-contact-options.interface.ts | 53 +++++++ .../interfaces/it-contact.interface.ts | 10 +- src/organizations/organizations.spec.ts | 103 +++++++++++++- src/organizations/organizations.ts | 120 ++++++++++++++++ src/organizations/serializers/index.ts | 2 + .../it-contact-options.serializer.ts | 18 +++ .../serializers/it-contact.serializer.ts | 11 ++ src/workos.ts | 2 - 35 files changed, 315 insertions(+), 491 deletions(-) delete mode 100644 src/it-contacts/fixtures/create-it-contact.json delete mode 100644 src/it-contacts/fixtures/invite-it-contact.json delete mode 100644 src/it-contacts/fixtures/it-contact-list-list-metadata.json delete mode 100644 src/it-contacts/interfaces/create-it-contact-options.interface.ts delete mode 100644 src/it-contacts/interfaces/create-it-contact.interface.ts delete mode 100644 src/it-contacts/interfaces/delete-it-contact-options.interface.ts delete mode 100644 src/it-contacts/interfaces/index.ts delete mode 100644 src/it-contacts/interfaces/invite-it-contact-intents.interface.ts delete mode 100644 src/it-contacts/interfaces/invite-it-contact-options.interface.ts delete mode 100644 src/it-contacts/interfaces/invite-it-contact.interface.ts delete mode 100644 src/it-contacts/interfaces/it-contact-list-list-metadata.interface.ts delete mode 100644 src/it-contacts/interfaces/it-contact-list.interface.ts delete mode 100644 src/it-contacts/interfaces/list-it-contacts-options.interface.ts delete mode 100644 src/it-contacts/interfaces/revoke-it-contact-options.interface.ts delete mode 100644 src/it-contacts/it-contacts.spec.ts delete mode 100644 src/it-contacts/it-contacts.ts delete mode 100644 src/it-contacts/serializers/create-it-contact.serializer.ts delete mode 100644 src/it-contacts/serializers/index.ts delete mode 100644 src/it-contacts/serializers/invite-it-contact.serializer.ts delete mode 100644 src/it-contacts/serializers/it-contact-list-list-metadata.serializer.ts delete mode 100644 src/it-contacts/serializers/it-contact-list.serializer.ts delete mode 100644 src/it-contacts/serializers/it-contact.serializer.ts rename src/{it-contacts => organizations}/fixtures/it-contact.json (100%) rename src/{it-contacts/fixtures/it-contact-list.json => organizations/fixtures/list-it-contacts.json} (73%) create mode 100644 src/organizations/interfaces/it-contact-options.interface.ts rename src/{it-contacts => organizations}/interfaces/it-contact.interface.ts (66%) create mode 100644 src/organizations/serializers/it-contact-options.serializer.ts create mode 100644 src/organizations/serializers/it-contact.serializer.ts diff --git a/.oagen-manifest.json b/.oagen-manifest.json index 2888b6c27..f4f865519 100644 --- a/.oagen-manifest.json +++ b/.oagen-manifest.json @@ -1,6 +1,7 @@ { "version": 2, "language": "node", + "generatedAt": "2026-06-16T18:02:10.415Z", "files": [ "src/api-keys/interfaces/create-validation-options.interface.ts", "src/api-keys/interfaces/delete-api-key-options.interface.ts", @@ -81,31 +82,6 @@ "src/groups/serializers/index.ts", "src/groups/serializers/update-group.serializer.ts", "src/groups/serializers/user-organization-membership-base-list-data.serializer.ts", - "src/it-contacts/fixtures/create-it-contact.json", - "src/it-contacts/fixtures/invite-it-contact.json", - "src/it-contacts/fixtures/it-contact-list-list-metadata.json", - "src/it-contacts/fixtures/it-contact-list.json", - "src/it-contacts/fixtures/it-contact.json", - "src/it-contacts/interfaces/create-it-contact-options.interface.ts", - "src/it-contacts/interfaces/create-it-contact.interface.ts", - "src/it-contacts/interfaces/delete-it-contact-options.interface.ts", - "src/it-contacts/interfaces/index.ts", - "src/it-contacts/interfaces/invite-it-contact-intents.interface.ts", - "src/it-contacts/interfaces/invite-it-contact-options.interface.ts", - "src/it-contacts/interfaces/invite-it-contact.interface.ts", - "src/it-contacts/interfaces/it-contact-list-list-metadata.interface.ts", - "src/it-contacts/interfaces/it-contact-list.interface.ts", - "src/it-contacts/interfaces/it-contact.interface.ts", - "src/it-contacts/interfaces/list-it-contacts-options.interface.ts", - "src/it-contacts/interfaces/revoke-it-contact-options.interface.ts", - "src/it-contacts/it-contacts.spec.ts", - "src/it-contacts/it-contacts.ts", - "src/it-contacts/serializers/create-it-contact.serializer.ts", - "src/it-contacts/serializers/index.ts", - "src/it-contacts/serializers/invite-it-contact.serializer.ts", - "src/it-contacts/serializers/it-contact-list-list-metadata.serializer.ts", - "src/it-contacts/serializers/it-contact-list.serializer.ts", - "src/it-contacts/serializers/it-contact.serializer.ts", "src/pipes/fixtures/connected-account.json", "src/pipes/fixtures/data-integration-access-token-response-access-token.json", "src/pipes/fixtures/data-integration-access-token-response.json", diff --git a/src/index.ts b/src/index.ts index ba3f0ed99..f00652919 100644 --- a/src/index.ts +++ b/src/index.ts @@ -24,7 +24,6 @@ export * from './events/interfaces'; export * from './feature-flags/interfaces'; export { FeatureFlagsRuntimeClient } from './feature-flags/runtime-client'; export * from './groups/interfaces'; -export * from './it-contacts/interfaces'; export * from './multi-factor-auth/interfaces'; export * from './organizations/interfaces'; export * from './organization-domains/interfaces'; diff --git a/src/it-contacts/fixtures/create-it-contact.json b/src/it-contacts/fixtures/create-it-contact.json deleted file mode 100644 index 6de60fb50..000000000 --- a/src/it-contacts/fixtures/create-it-contact.json +++ /dev/null @@ -1,3 +0,0 @@ -{ - "email": "it-contact@example.com" -} diff --git a/src/it-contacts/fixtures/invite-it-contact.json b/src/it-contacts/fixtures/invite-it-contact.json deleted file mode 100644 index 064cf985f..000000000 --- a/src/it-contacts/fixtures/invite-it-contact.json +++ /dev/null @@ -1,3 +0,0 @@ -{ - "intents": ["sso", "directory_sync"] -} diff --git a/src/it-contacts/fixtures/it-contact-list-list-metadata.json b/src/it-contacts/fixtures/it-contact-list-list-metadata.json deleted file mode 100644 index 598b6c023..000000000 --- a/src/it-contacts/fixtures/it-contact-list-list-metadata.json +++ /dev/null @@ -1,4 +0,0 @@ -{ - "before": "it_contact_01HXYZ123456789ABCDEFGHIJ", - "after": "it_contact_01HXYZ987654321KJIHGFEDCBA" -} diff --git a/src/it-contacts/interfaces/create-it-contact-options.interface.ts b/src/it-contacts/interfaces/create-it-contact-options.interface.ts deleted file mode 100644 index 0d333c3a1..000000000 --- a/src/it-contacts/interfaces/create-it-contact-options.interface.ts +++ /dev/null @@ -1,8 +0,0 @@ -// This file is auto-generated by oagen. Do not edit. - -export interface CreateItContactOptions { - /** The ID of the organization. */ - organizationId: string; - /** The email address of the IT contact. */ - email: string; -} diff --git a/src/it-contacts/interfaces/create-it-contact.interface.ts b/src/it-contacts/interfaces/create-it-contact.interface.ts deleted file mode 100644 index fc6382ac8..000000000 --- a/src/it-contacts/interfaces/create-it-contact.interface.ts +++ /dev/null @@ -1,10 +0,0 @@ -// This file is auto-generated by oagen. Do not edit. - -export interface CreateItContact { - /** The email address of the IT contact. */ - email: string; -} - -export interface CreateItContactResponse { - email: string; -} diff --git a/src/it-contacts/interfaces/delete-it-contact-options.interface.ts b/src/it-contacts/interfaces/delete-it-contact-options.interface.ts deleted file mode 100644 index a0e7a84bf..000000000 --- a/src/it-contacts/interfaces/delete-it-contact-options.interface.ts +++ /dev/null @@ -1,8 +0,0 @@ -// This file is auto-generated by oagen. Do not edit. - -export interface DeleteItContactOptions { - /** The ID of the organization. */ - organizationId: string; - /** The ID of the IT contact. */ - contactId: string; -} diff --git a/src/it-contacts/interfaces/index.ts b/src/it-contacts/interfaces/index.ts deleted file mode 100644 index 024cabb5c..000000000 --- a/src/it-contacts/interfaces/index.ts +++ /dev/null @@ -1,11 +0,0 @@ -// This file is auto-generated by oagen. Do not edit. - -export * from './create-it-contact-options.interface'; -export * from './create-it-contact.interface'; -export * from './delete-it-contact-options.interface'; -export * from './invite-it-contact-intents.interface'; -export * from './invite-it-contact-options.interface'; -export * from './invite-it-contact.interface'; -export * from './it-contact.interface'; -export * from './list-it-contacts-options.interface'; -export * from './revoke-it-contact-options.interface'; diff --git a/src/it-contacts/interfaces/invite-it-contact-intents.interface.ts b/src/it-contacts/interfaces/invite-it-contact-intents.interface.ts deleted file mode 100644 index c249af152..000000000 --- a/src/it-contacts/interfaces/invite-it-contact-intents.interface.ts +++ /dev/null @@ -1,12 +0,0 @@ -// This file is auto-generated by oagen. Do not edit. - -export const InviteItContactIntents = { - SSO: 'sso', - DirectorySync: 'directory_sync', - LogStreams: 'log_streams', - DomainVerification: 'domain_verification', - BringYourOwnKey: 'bring_your_own_key', -} as const; - -export type InviteItContactIntents = - (typeof InviteItContactIntents)[keyof typeof InviteItContactIntents]; diff --git a/src/it-contacts/interfaces/invite-it-contact-options.interface.ts b/src/it-contacts/interfaces/invite-it-contact-options.interface.ts deleted file mode 100644 index 29468b6fa..000000000 --- a/src/it-contacts/interfaces/invite-it-contact-options.interface.ts +++ /dev/null @@ -1,12 +0,0 @@ -// This file is auto-generated by oagen. Do not edit. - -import type { InviteItContactIntents } from './invite-it-contact-intents.interface'; - -export interface InviteItContactOptions { - /** The ID of the organization. */ - organizationId: string; - /** The ID of the IT contact. */ - contactId: string; - /** The Admin Portal features that the IT contact can configure. */ - intents: InviteItContactIntents[]; -} diff --git a/src/it-contacts/interfaces/invite-it-contact.interface.ts b/src/it-contacts/interfaces/invite-it-contact.interface.ts deleted file mode 100644 index a021d7379..000000000 --- a/src/it-contacts/interfaces/invite-it-contact.interface.ts +++ /dev/null @@ -1,12 +0,0 @@ -// This file is auto-generated by oagen. Do not edit. - -import type { InviteItContactIntents } from './invite-it-contact-intents.interface'; - -export interface InviteItContact { - /** The Admin Portal features that the IT contact can configure. */ - intents: InviteItContactIntents[]; -} - -export interface InviteItContactResponse { - intents: InviteItContactIntents[]; -} diff --git a/src/it-contacts/interfaces/it-contact-list-list-metadata.interface.ts b/src/it-contacts/interfaces/it-contact-list-list-metadata.interface.ts deleted file mode 100644 index 04d96c623..000000000 --- a/src/it-contacts/interfaces/it-contact-list-list-metadata.interface.ts +++ /dev/null @@ -1,14 +0,0 @@ -// This file is auto-generated by oagen. Do not edit. - -/** Pagination cursors for navigating between pages of results. */ -export interface ItContactListListMetadata { - /** An object ID that defines your place in the list. When the ID is not present, you are at the start of the list. */ - before: string | null; - /** An object ID that defines your place in the list. When the ID is not present, you are at the end of the list. */ - after: string | null; -} - -export interface ItContactListListMetadataResponse { - before: string | null; - after: string | null; -} diff --git a/src/it-contacts/interfaces/it-contact-list.interface.ts b/src/it-contacts/interfaces/it-contact-list.interface.ts deleted file mode 100644 index 346cee9ed..000000000 --- a/src/it-contacts/interfaces/it-contact-list.interface.ts +++ /dev/null @@ -1,22 +0,0 @@ -// This file is auto-generated by oagen. Do not edit. - -import type { ItContact, ItContactResponse } from './it-contact.interface'; -import type { - ItContactListListMetadata, - ItContactListListMetadataResponse, -} from './it-contact-list-list-metadata.interface'; - -export interface ItContactList { - /** Indicates this is a list response. */ - object: 'list'; - /** The list of records for the current page. */ - data: ItContact[]; - /** Pagination cursors for navigating between pages of results. */ - listMetadata: ItContactListListMetadata; -} - -export interface ItContactListResponse { - object: 'list'; - data: ItContactResponse[]; - list_metadata: ItContactListListMetadataResponse; -} diff --git a/src/it-contacts/interfaces/list-it-contacts-options.interface.ts b/src/it-contacts/interfaces/list-it-contacts-options.interface.ts deleted file mode 100644 index 01ac2757a..000000000 --- a/src/it-contacts/interfaces/list-it-contacts-options.interface.ts +++ /dev/null @@ -1,6 +0,0 @@ -// This file is auto-generated by oagen. Do not edit. - -export interface ListItContactsOptions { - /** The ID of the organization. */ - organizationId: string; -} diff --git a/src/it-contacts/interfaces/revoke-it-contact-options.interface.ts b/src/it-contacts/interfaces/revoke-it-contact-options.interface.ts deleted file mode 100644 index 94e3e34b4..000000000 --- a/src/it-contacts/interfaces/revoke-it-contact-options.interface.ts +++ /dev/null @@ -1,8 +0,0 @@ -// This file is auto-generated by oagen. Do not edit. - -export interface RevokeItContactOptions { - /** The ID of the organization. */ - organizationId: string; - /** The ID of the IT contact. */ - contactId: string; -} diff --git a/src/it-contacts/it-contacts.spec.ts b/src/it-contacts/it-contacts.spec.ts deleted file mode 100644 index ac6e48be1..000000000 --- a/src/it-contacts/it-contacts.spec.ts +++ /dev/null @@ -1,111 +0,0 @@ -// 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 itContactListFixture from './fixtures/it-contact-list.json'; -import itContactFixture from './fixtures/it-contact.json'; - -const workos = new WorkOS('sk_test_Sz3IQjepeSWaI4cMS4ms4sMuU'); - -describe('ItContacts', () => { - beforeEach(() => fetch.resetMocks()); - - describe('listItContacts', () => { - it('returns the expected result', async () => { - fetchOnce(itContactListFixture); - - const result = await workos.itContacts.listItContacts({ - organizationId: 'test_organizationId', - }); - - expect(fetchMethod()).toBe('GET'); - expect(new URL(String(fetchURL())).pathname).toBe( - '/organizations/test_organizationId/it_contacts', - ); - expect(result.object).toBe('list'); - }); - }); - - describe('createItContact', () => { - it('sends the correct request and returns result', async () => { - fetchOnce(itContactFixture); - - const result = await workos.itContacts.createItContact({ - organizationId: 'test_organizationId', - email: 'test@example.com', - }); - - expect(fetchMethod()).toBe('POST'); - expect(new URL(String(fetchURL())).pathname).toBe( - '/organizations/test_organizationId/it_contacts', - ); - expect(fetchBody()).toEqual( - expect.objectContaining({ email: 'test@example.com' }), - ); - expect(result.object).toBe('it_contact'); - expect(result.id).toBe('it_contact_01HXYZ123456789ABCDEFGHIJ'); - expect(result.email).toBe('it-contact@example.com'); - expect(result.createdAt.toISOString()).toBe('2026-01-15T12:00:00.000Z'); - expect(result.updatedAt.toISOString()).toBe('2026-01-15T12:00:00.000Z'); - }); - }); - - describe('deleteItContact', () => { - it('sends a DELETE request', async () => { - fetchOnce({}, { status: 204 }); - - await workos.itContacts.deleteItContact({ - organizationId: 'test_organizationId', - contactId: 'test_contactId', - }); - - expect(fetchMethod()).toBe('DELETE'); - expect(new URL(String(fetchURL())).pathname).toBe( - '/organizations/test_organizationId/it_contacts/test_contactId', - ); - }); - }); - - describe('inviteItContact', () => { - it('sends the request', async () => { - fetchOnce({}); - - await workos.itContacts.inviteItContact({ - organizationId: 'test_organizationId', - contactId: 'test_contactId', - intents: ['sso'], - }); - - expect(fetchMethod()).toBe('POST'); - expect(new URL(String(fetchURL())).pathname).toBe( - '/organizations/test_organizationId/it_contacts/test_contactId/invite', - ); - expect(fetchBody()).toEqual( - expect.objectContaining({ intents: ['sso'] }), - ); - }); - }); - - describe('revokeItContact', () => { - it('sends the request', async () => { - fetchOnce({}); - - await workos.itContacts.revokeItContact({ - organizationId: 'test_organizationId', - contactId: 'test_contactId', - }); - - expect(fetchMethod()).toBe('POST'); - expect(new URL(String(fetchURL())).pathname).toBe( - '/organizations/test_organizationId/it_contacts/test_contactId/revoke', - ); - }); - }); -}); diff --git a/src/it-contacts/it-contacts.ts b/src/it-contacts/it-contacts.ts deleted file mode 100644 index f1866b946..000000000 --- a/src/it-contacts/it-contacts.ts +++ /dev/null @@ -1,134 +0,0 @@ -// This file is auto-generated by oagen. Do not edit. - -import type { WorkOS } from '../workos'; -import type { ListItContactsOptions } from './interfaces/list-it-contacts-options.interface'; -import type { CreateItContactOptions } from './interfaces/create-it-contact-options.interface'; -import type { DeleteItContactOptions } from './interfaces/delete-it-contact-options.interface'; -import type { InviteItContactOptions } from './interfaces/invite-it-contact-options.interface'; -import type { RevokeItContactOptions } from './interfaces/revoke-it-contact-options.interface'; -import type { - ItContactList, - ItContactListResponse, -} from './interfaces/it-contact-list.interface'; -import type { - ItContact, - ItContactResponse, -} from './interfaces/it-contact.interface'; -import type { CreateItContactResponse } from './interfaces/create-it-contact.interface'; -import type { InviteItContactResponse } from './interfaces/invite-it-contact.interface'; -import { deserializeItContactList } from './serializers/it-contact-list.serializer'; -import { deserializeItContact } from './serializers/it-contact.serializer'; -import { serializeCreateItContact } from './serializers/create-it-contact.serializer'; -import { serializeInviteItContact } from './serializers/invite-it-contact.serializer'; - -export class ItContacts { - constructor(private readonly workos: WorkOS) {} - - /** - * List IT contacts - * - * Get the IT contacts for an organization. - * @param options - The request options. - * @param options.organizationId - The ID of the organization. - * @example "org_01EHWNCE74X7JSDV0X3SZ3KJNY" - * @returns {Promise} - * @throws {AuthorizationException} 403 - * @throws {NotFoundException} 404 - */ - async listItContacts(options: ListItContactsOptions): Promise { - const { organizationId } = options; - const { data } = await this.workos.get( - `/organizations/${encodeURIComponent(organizationId)}/it_contacts`, - ); - return deserializeItContactList(data); - } - - /** - * Create an IT contact - * - * Add an IT contact to an organization. No Admin Portal invitation is sent, though the contact is notified if the organization has a connection certificate nearing expiry. - * @param options - The request options. - * @param options.organizationId - The ID of the organization. - * @example "org_01EHWNCE74X7JSDV0X3SZ3KJNY" - * @returns {Promise} - * @throws {AuthorizationException} 403 - * @throws {NotFoundException} 404 - * @throws {ConflictException} 409 - * @throws {UnprocessableEntityException} 422 - */ - async createItContact(options: CreateItContactOptions): Promise { - const { organizationId, ...payload } = options; - const { data } = await this.workos.post< - ItContactResponse, - CreateItContactResponse - >( - `/organizations/${encodeURIComponent(organizationId)}/it_contacts`, - serializeCreateItContact(payload), - ); - return deserializeItContact(data); - } - - /** - * Delete an IT contact - * - * Remove an IT contact from an organization and revoke the contact's active setup links. - * @param options - The request options. - * @param options.organizationId - The ID of the organization. - * @example "org_01EHWNCE74X7JSDV0X3SZ3KJNY" - * @param options.contactId - The ID of the IT contact. - * @example "it_contact_01HXYZ123456789ABCDEFGHIJ" - * @returns {Promise} - * @throws {AuthorizationException} 403 - * @throws {NotFoundException} 404 - */ - async deleteItContact(options: DeleteItContactOptions): Promise { - const { organizationId, contactId } = options; - await this.workos.delete( - `/organizations/${encodeURIComponent(organizationId)}/it_contacts/${encodeURIComponent(contactId)}`, - ); - } - - /** - * Invite an IT contact - * - * Create an Admin Portal setup link and email it to the IT contact. An organization can have at most one active invitation. - * @param options - The request options. - * @param options.organizationId - The ID of the organization. - * @example "org_01EHWNCE74X7JSDV0X3SZ3KJNY" - * @param options.contactId - The ID of the IT contact. - * @example "it_contact_01HXYZ123456789ABCDEFGHIJ" - * @returns {Promise} - * @throws {AuthorizationException} 403 - * @throws {NotFoundException} 404 - * @throws {ConflictException} 409 - * @throws {UnprocessableEntityException} 422 - */ - async inviteItContact(options: InviteItContactOptions): Promise { - const { organizationId, contactId, ...payload } = options; - await this.workos.post( - `/organizations/${encodeURIComponent(organizationId)}/it_contacts/${encodeURIComponent(contactId)}/invite`, - serializeInviteItContact(payload), - ); - } - - /** - * Revoke an IT contact's invitation - * - * Revoke the organization's active Admin Portal invitation. - * @param options - The request options. - * @param options.organizationId - The ID of the organization. - * @example "org_01EHWNCE74X7JSDV0X3SZ3KJNY" - * @param options.contactId - The ID of the IT contact. - * @example "it_contact_01HXYZ123456789ABCDEFGHIJ" - * @returns {Promise} - * @throws {AuthorizationException} 403 - * @throws {NotFoundException} 404 - */ - async revokeItContact(options: RevokeItContactOptions): Promise { - const { organizationId, contactId } = options; - await this.workos.post( - `/organizations/${encodeURIComponent(organizationId)}/it_contacts/${encodeURIComponent(contactId)}/revoke`, - {}, - ); - } -} diff --git a/src/it-contacts/serializers/create-it-contact.serializer.ts b/src/it-contacts/serializers/create-it-contact.serializer.ts deleted file mode 100644 index 699accfbe..000000000 --- a/src/it-contacts/serializers/create-it-contact.serializer.ts +++ /dev/null @@ -1,12 +0,0 @@ -// This file is auto-generated by oagen. Do not edit. - -import type { - CreateItContact, - CreateItContactResponse, -} from '../interfaces/create-it-contact.interface'; - -export const serializeCreateItContact = ( - model: CreateItContact, -): CreateItContactResponse => ({ - email: model.email, -}); diff --git a/src/it-contacts/serializers/index.ts b/src/it-contacts/serializers/index.ts deleted file mode 100644 index bb9f0415c..000000000 --- a/src/it-contacts/serializers/index.ts +++ /dev/null @@ -1,7 +0,0 @@ -// This file is auto-generated by oagen. Do not edit. - -export * from './create-it-contact.serializer'; -export * from './invite-it-contact.serializer'; -export * from './it-contact.serializer'; -export * from './it-contact-list.serializer'; -export * from './it-contact-list-list-metadata.serializer'; diff --git a/src/it-contacts/serializers/invite-it-contact.serializer.ts b/src/it-contacts/serializers/invite-it-contact.serializer.ts deleted file mode 100644 index cfd3e4e61..000000000 --- a/src/it-contacts/serializers/invite-it-contact.serializer.ts +++ /dev/null @@ -1,12 +0,0 @@ -// This file is auto-generated by oagen. Do not edit. - -import type { - InviteItContact, - InviteItContactResponse, -} from '../interfaces/invite-it-contact.interface'; - -export const serializeInviteItContact = ( - model: InviteItContact, -): InviteItContactResponse => ({ - intents: model.intents, -}); diff --git a/src/it-contacts/serializers/it-contact-list-list-metadata.serializer.ts b/src/it-contacts/serializers/it-contact-list-list-metadata.serializer.ts deleted file mode 100644 index 51acc87f3..000000000 --- a/src/it-contacts/serializers/it-contact-list-list-metadata.serializer.ts +++ /dev/null @@ -1,13 +0,0 @@ -// This file is auto-generated by oagen. Do not edit. - -import type { - ItContactListListMetadata, - ItContactListListMetadataResponse, -} from '../interfaces/it-contact-list-list-metadata.interface'; - -export const deserializeItContactListListMetadata = ( - response: ItContactListListMetadataResponse, -): ItContactListListMetadata => ({ - before: response.before ?? null, - after: response.after ?? null, -}); diff --git a/src/it-contacts/serializers/it-contact-list.serializer.ts b/src/it-contacts/serializers/it-contact-list.serializer.ts deleted file mode 100644 index b0972d666..000000000 --- a/src/it-contacts/serializers/it-contact-list.serializer.ts +++ /dev/null @@ -1,16 +0,0 @@ -// This file is auto-generated by oagen. Do not edit. - -import type { - ItContactList, - ItContactListResponse, -} from '../interfaces/it-contact-list.interface'; -import { deserializeItContact } from './it-contact.serializer'; -import { deserializeItContactListListMetadata } from './it-contact-list-list-metadata.serializer'; - -export const deserializeItContactList = ( - response: ItContactListResponse, -): ItContactList => ({ - object: response.object, - data: response.data.map(deserializeItContact), - listMetadata: deserializeItContactListListMetadata(response.list_metadata), -}); diff --git a/src/it-contacts/serializers/it-contact.serializer.ts b/src/it-contacts/serializers/it-contact.serializer.ts deleted file mode 100644 index 3aa56f3dc..000000000 --- a/src/it-contacts/serializers/it-contact.serializer.ts +++ /dev/null @@ -1,16 +0,0 @@ -// This file is auto-generated by oagen. Do not edit. - -import type { - ItContact, - ItContactResponse, -} from '../interfaces/it-contact.interface'; - -export const deserializeItContact = ( - response: ItContactResponse, -): ItContact => ({ - object: response.object, - id: response.id, - email: response.email, - createdAt: new Date(response.created_at), - updatedAt: new Date(response.updated_at), -}); diff --git a/src/it-contacts/fixtures/it-contact.json b/src/organizations/fixtures/it-contact.json similarity index 100% rename from src/it-contacts/fixtures/it-contact.json rename to src/organizations/fixtures/it-contact.json diff --git a/src/it-contacts/fixtures/it-contact-list.json b/src/organizations/fixtures/list-it-contacts.json similarity index 73% rename from src/it-contacts/fixtures/it-contact-list.json rename to src/organizations/fixtures/list-it-contacts.json index 732bbe9a9..ede8fe74c 100644 --- a/src/it-contacts/fixtures/it-contact-list.json +++ b/src/organizations/fixtures/list-it-contacts.json @@ -10,7 +10,7 @@ } ], "list_metadata": { - "before": "it_contact_01HXYZ123456789ABCDEFGHIJ", - "after": "it_contact_01HXYZ987654321KJIHGFEDCBA" + "before": null, + "after": null } } diff --git a/src/organizations/interfaces/index.ts b/src/organizations/interfaces/index.ts index d44e49367..f18875e59 100644 --- a/src/organizations/interfaces/index.ts +++ b/src/organizations/interfaces/index.ts @@ -1,5 +1,7 @@ export * from './create-organization-options.interface'; export * from './domain-data.interface'; +export * from './it-contact-options.interface'; +export * from './it-contact.interface'; export * from './list-organization-feature-flags-options.interface'; export * from './list-organizations-options.interface'; export * from './organization.interface'; diff --git a/src/organizations/interfaces/it-contact-options.interface.ts b/src/organizations/interfaces/it-contact-options.interface.ts new file mode 100644 index 000000000..98fb9df2b --- /dev/null +++ b/src/organizations/interfaces/it-contact-options.interface.ts @@ -0,0 +1,53 @@ +export const ItContactIntent = { + SSO: 'sso', + DirectorySync: 'directory_sync', + LogStreams: 'log_streams', + DomainVerification: 'domain_verification', + BringYourOwnKey: 'bring_your_own_key', +} as const; + +export type ItContactIntent = + (typeof ItContactIntent)[keyof typeof ItContactIntent]; + +export interface ListItContactsOptions { + /** Unique identifier of the Organization. */ + organizationId: string; +} + +export interface CreateItContactOptions { + /** Unique identifier of the Organization. */ + organizationId: string; + /** The email address of the IT Contact. */ + email: string; +} + +export interface SerializedCreateItContactOptions { + email: string; +} + +export interface DeleteItContactOptions { + /** Unique identifier of the Organization. */ + organizationId: string; + /** Unique identifier of the IT Contact. */ + contactId: string; +} + +export interface InviteItContactOptions { + /** Unique identifier of the Organization. */ + organizationId: string; + /** Unique identifier of the IT Contact. */ + contactId: string; + /** The Admin Portal features that the IT Contact can configure. */ + intents: ItContactIntent[]; +} + +export interface SerializedInviteItContactOptions { + intents: ItContactIntent[]; +} + +export interface RevokeItContactOptions { + /** Unique identifier of the Organization. */ + organizationId: string; + /** Unique identifier of the IT Contact. */ + contactId: string; +} diff --git a/src/it-contacts/interfaces/it-contact.interface.ts b/src/organizations/interfaces/it-contact.interface.ts similarity index 66% rename from src/it-contacts/interfaces/it-contact.interface.ts rename to src/organizations/interfaces/it-contact.interface.ts index 2f69bd382..5b9e0f43a 100644 --- a/src/it-contacts/interfaces/it-contact.interface.ts +++ b/src/organizations/interfaces/it-contact.interface.ts @@ -1,16 +1,14 @@ -// This file is auto-generated by oagen. Do not edit. - export interface ItContact { - /** The IT Contact object. */ + /** Distinguishes the IT Contact object. */ object: 'it_contact'; - /** The unique ID of the IT Contact. */ + /** Unique identifier of the IT Contact. */ id: string; /** The email address of the IT Contact. */ email: string; /** An ISO 8601 timestamp. */ - createdAt: Date; + createdAt: string; /** An ISO 8601 timestamp. */ - updatedAt: Date; + updatedAt: string; } export interface ItContactResponse { diff --git a/src/organizations/organizations.spec.ts b/src/organizations/organizations.spec.ts index 1014611ae..cda48deba 100644 --- a/src/organizations/organizations.spec.ts +++ b/src/organizations/organizations.spec.ts @@ -5,17 +5,20 @@ import { fetchSearchParams, fetchHeaders, fetchBody, + fetchMethod, } from '../common/utils/test-utils'; import { WorkOS } from '../workos'; import clearStripeCustomerId from './fixtures/clear-stripe-customer-id.json'; import createOrganizationInvalid from './fixtures/create-organization-invalid.json'; import createOrganization from './fixtures/create-organization.json'; import getOrganization from './fixtures/get-organization.json'; +import itContact from './fixtures/it-contact.json'; +import listItContacts from './fixtures/list-it-contacts.json'; import listOrganizationsFixture from './fixtures/list-organizations.json'; import updateOrganization from './fixtures/update-organization.json'; import setStripeCustomerId from './fixtures/set-stripe-customer-id.json'; import setStripeCustomerIdDisabled from './fixtures/set-stripe-customer-id-disabled.json'; -import { DomainDataState } from './interfaces'; +import { DomainDataState, ItContactIntent } from './interfaces'; const workos = new WorkOS('sk_test_Sz3IQjepeSWaI4cMS4ms4sMuU'); @@ -363,4 +366,102 @@ describe('Organizations', () => { }); }); }); + + describe('IT Contacts', () => { + describe('listItContacts', () => { + it('returns the organization’s IT contacts', async () => { + fetchOnce(listItContacts); + + const { data, listMetadata } = + await workos.organizations.listItContacts({ + organizationId: 'org_01EHT88Z8J8795GZNQ4ZP1J81T', + }); + + expect(fetchMethod()).toBe('GET'); + expect(fetchURL()).toContain( + '/organizations/org_01EHT88Z8J8795GZNQ4ZP1J81T/it_contacts', + ); + + expect(data).toEqual([ + { + object: 'it_contact', + id: 'it_contact_01HXYZ123456789ABCDEFGHIJ', + email: 'it-contact@example.com', + createdAt: '2026-01-15T12:00:00.000Z', + updatedAt: '2026-01-15T12:00:00.000Z', + }, + ]); + expect(listMetadata).toEqual({ before: null, after: null }); + }); + }); + + describe('createItContact', () => { + it('creates an IT contact', async () => { + fetchOnce(itContact); + + const subject = await workos.organizations.createItContact({ + organizationId: 'org_01EHT88Z8J8795GZNQ4ZP1J81T', + email: 'it-contact@example.com', + }); + + expect(fetchMethod()).toBe('POST'); + expect(fetchURL()).toContain( + '/organizations/org_01EHT88Z8J8795GZNQ4ZP1J81T/it_contacts', + ); + expect(fetchBody()).toEqual({ email: 'it-contact@example.com' }); + + expect(subject.id).toBe('it_contact_01HXYZ123456789ABCDEFGHIJ'); + }); + }); + + describe('deleteItContact', () => { + it('deletes an IT contact', async () => { + fetchOnce({}, { status: 204 }); + + await workos.organizations.deleteItContact({ + organizationId: 'org_01EHT88Z8J8795GZNQ4ZP1J81T', + contactId: 'it_contact_01HXYZ123456789ABCDEFGHIJ', + }); + + expect(fetchMethod()).toBe('DELETE'); + expect(fetchURL()).toContain( + '/organizations/org_01EHT88Z8J8795GZNQ4ZP1J81T/it_contacts/it_contact_01HXYZ123456789ABCDEFGHIJ', + ); + }); + }); + + describe('inviteItContact', () => { + it('invites an IT contact', async () => { + fetchOnce({}, { status: 204 }); + + await workos.organizations.inviteItContact({ + organizationId: 'org_01EHT88Z8J8795GZNQ4ZP1J81T', + contactId: 'it_contact_01HXYZ123456789ABCDEFGHIJ', + intents: [ItContactIntent.SSO, ItContactIntent.DirectorySync], + }); + + expect(fetchMethod()).toBe('POST'); + expect(fetchURL()).toContain( + '/organizations/org_01EHT88Z8J8795GZNQ4ZP1J81T/it_contacts/it_contact_01HXYZ123456789ABCDEFGHIJ/invite', + ); + expect(fetchBody()).toEqual({ intents: ['sso', 'directory_sync'] }); + }); + }); + + describe('revokeItContact', () => { + it('revokes an IT contact’s invitation', async () => { + fetchOnce({}, { status: 204 }); + + await workos.organizations.revokeItContact({ + organizationId: 'org_01EHT88Z8J8795GZNQ4ZP1J81T', + contactId: 'it_contact_01HXYZ123456789ABCDEFGHIJ', + }); + + expect(fetchMethod()).toBe('POST'); + expect(fetchURL()).toContain( + '/organizations/org_01EHT88Z8J8795GZNQ4ZP1J81T/it_contacts/it_contact_01HXYZ123456789ABCDEFGHIJ/revoke', + ); + }); + }); + }); }); diff --git a/src/organizations/organizations.ts b/src/organizations/organizations.ts index 4f2053471..dc67c46e3 100644 --- a/src/organizations/organizations.ts +++ b/src/organizations/organizations.ts @@ -1,16 +1,27 @@ import { AutoPaginatable } from '../common/utils/pagination'; import { WorkOS } from '../workos'; +import { List, ListResponse } from '../common/interfaces'; import { + CreateItContactOptions, CreateOrganizationOptions, CreateOrganizationRequestOptions, + DeleteItContactOptions, + InviteItContactOptions, + ItContact, + ItContactResponse, + ListItContactsOptions, ListOrganizationsOptions, Organization, OrganizationResponse, + RevokeItContactOptions, UpdateOrganizationOptions, } from './interfaces'; import { + deserializeItContact, deserializeOrganization, + serializeCreateItContactOptions, serializeCreateOrganizationOptions, + serializeInviteItContactOptions, serializeUpdateOrganizationOptions, } from './serializers'; @@ -151,4 +162,113 @@ export class Organizations { return deserializeOrganization(data); } + + /** + * List IT Contacts + * + * Get the IT Contacts for an Organization. + * @param options - Object containing the Organization ID. + * @returns {Promise>} + * @throws {AuthorizationException} 403 + * @throws {NotFoundException} 404 + */ + async listItContacts( + options: ListItContactsOptions, + ): Promise> { + const { organizationId } = options; + + const { data } = await this.workos.get>( + `/organizations/${organizationId}/it_contacts`, + ); + + return { + object: data.object, + data: data.data.map(deserializeItContact), + listMetadata: { + before: data.list_metadata.before, + after: data.list_metadata.after, + }, + }; + } + + /** + * Create an IT Contact + * + * Add an IT Contact to an Organization. No Admin Portal invitation is sent, + * though the contact is notified if the Organization has a connection + * certificate nearing expiry. + * @param options - Object containing the Organization ID and the email address. + * @returns {Promise} + * @throws {AuthorizationException} 403 + * @throws {NotFoundException} 404 + * @throws {ConflictException} 409 + * @throws {UnprocessableEntityException} 422 + */ + async createItContact(options: CreateItContactOptions): Promise { + const { organizationId, ...payload } = options; + + const { data } = await this.workos.post( + `/organizations/${organizationId}/it_contacts`, + serializeCreateItContactOptions(payload), + ); + + return deserializeItContact(data); + } + + /** + * Delete an IT Contact + * + * Remove an IT Contact from an Organization and revoke the contact's active + * setup links. + * @param options - Object containing the Organization ID and the IT Contact ID. + * @returns {Promise} + * @throws {AuthorizationException} 403 + * @throws {NotFoundException} 404 + */ + async deleteItContact(options: DeleteItContactOptions): Promise { + const { organizationId, contactId } = options; + + await this.workos.delete( + `/organizations/${organizationId}/it_contacts/${contactId}`, + ); + } + + /** + * Invite an IT Contact + * + * Create an Admin Portal setup link and email it to the IT Contact. An + * Organization can have at most one active invitation. + * @param options - Object containing the Organization ID, the IT Contact ID and the intents. + * @returns {Promise} + * @throws {AuthorizationException} 403 + * @throws {NotFoundException} 404 + * @throws {ConflictException} 409 + * @throws {UnprocessableEntityException} 422 + */ + async inviteItContact(options: InviteItContactOptions): Promise { + const { organizationId, contactId, ...payload } = options; + + await this.workos.post( + `/organizations/${organizationId}/it_contacts/${contactId}/invite`, + serializeInviteItContactOptions(payload), + ); + } + + /** + * Revoke an IT Contact's invitation + * + * Revoke the Organization's active Admin Portal invitation. + * @param options - Object containing the Organization ID and the IT Contact ID. + * @returns {Promise} + * @throws {AuthorizationException} 403 + * @throws {NotFoundException} 404 + */ + async revokeItContact(options: RevokeItContactOptions): Promise { + const { organizationId, contactId } = options; + + await this.workos.post( + `/organizations/${organizationId}/it_contacts/${contactId}/revoke`, + {}, + ); + } } diff --git a/src/organizations/serializers/index.ts b/src/organizations/serializers/index.ts index c53e493c4..a7837f4c1 100644 --- a/src/organizations/serializers/index.ts +++ b/src/organizations/serializers/index.ts @@ -1,3 +1,5 @@ export * from './create-organization-options.serializer'; +export * from './it-contact-options.serializer'; +export * from './it-contact.serializer'; export * from './organization.serializer'; export * from './update-organization-options.serializer'; diff --git a/src/organizations/serializers/it-contact-options.serializer.ts b/src/organizations/serializers/it-contact-options.serializer.ts new file mode 100644 index 000000000..bf237c38a --- /dev/null +++ b/src/organizations/serializers/it-contact-options.serializer.ts @@ -0,0 +1,18 @@ +import { + CreateItContactOptions, + InviteItContactOptions, + SerializedCreateItContactOptions, + SerializedInviteItContactOptions, +} from '../interfaces'; + +export const serializeCreateItContactOptions = ( + options: Omit, +): SerializedCreateItContactOptions => ({ + email: options.email, +}); + +export const serializeInviteItContactOptions = ( + options: Omit, +): SerializedInviteItContactOptions => ({ + intents: options.intents, +}); diff --git a/src/organizations/serializers/it-contact.serializer.ts b/src/organizations/serializers/it-contact.serializer.ts new file mode 100644 index 000000000..b7f763b4e --- /dev/null +++ b/src/organizations/serializers/it-contact.serializer.ts @@ -0,0 +1,11 @@ +import { ItContact, ItContactResponse } from '../interfaces'; + +export const deserializeItContact = ( + itContact: ItContactResponse, +): ItContact => ({ + object: itContact.object, + id: itContact.id, + email: itContact.email, + createdAt: itContact.created_at, + updatedAt: itContact.updated_at, +}); diff --git a/src/workos.ts b/src/workos.ts index 36cb4cee0..6f5c12bb8 100644 --- a/src/workos.ts +++ b/src/workos.ts @@ -39,7 +39,6 @@ import { UserManagement } from './user-management/user-management'; import { BadRequestException } from './common/exceptions/bad-request.exception'; import { FeatureFlags } from './feature-flags/feature-flags'; import { Groups } from './groups/groups'; -import { ItContacts } from './it-contacts/it-contacts'; import { HttpClient, HttpClientError } from './common/net/http-client'; import { SubtleCryptoProvider } from './common/crypto/subtle-crypto-provider'; @@ -80,7 +79,6 @@ export class WorkOS { readonly events = new Events(this); readonly featureFlags = new FeatureFlags(this); readonly groups = new Groups(this); - readonly itContacts = new ItContacts(this); readonly multiFactorAuth = new MultiFactorAuth(this); readonly organizations = new Organizations(this); readonly organizationDomains = new OrganizationDomains(this);