diff --git a/src/authorization/authorization.spec.ts b/src/authorization/authorization.spec.ts index d3e238c1a..83a079478 100644 --- a/src/authorization/authorization.spec.ts +++ b/src/authorization/authorization.spec.ts @@ -13,11 +13,11 @@ import listOrganizationRolesFixture from './fixtures/list-organization-roles.jso import permissionFixture from './fixtures/permission.json'; import listPermissionsFixture from './fixtures/list-permissions.json'; import authorizationResourceFixture from './fixtures/authorization-resource.json'; - +import listResourcesFixture from './fixtures/list-resources.json'; const workos = new WorkOS('sk_test_Sz3IQjepeSWaI4cMS4ms4sMuU'); const testOrgId = 'org_01HXYZ123ABC456DEF789ABC'; -const testOrgMembershipId = 'om_01HXYZ123ABC456DEF789ABC'; const testResourceId = 'authz_resource_01HXYZ123ABC456DEF789ABC'; +const testOrgMembershipId = 'om_01HXYZ123ABC456DEF789ABC'; describe('Authorization', () => { beforeEach(() => fetch.resetMocks()); @@ -675,21 +675,15 @@ describe('Authorization', () => { }); }); - it('creates an authorization resource with required fields only', async () => { - fetchOnce( - { - ...authorizationResourceFixture, - description: null, - parent_resource_id: null, - }, - { status: 201 }, - ); + it('creates an authorization resource with parentResourceId', async () => { + fetchOnce(authorizationResourceFixture, { status: 201 }); const resource = await workos.authorization.createResource({ organizationId: testOrgId, resourceTypeSlug: 'document', externalId: 'doc-456', name: 'Q4 Budget Report', + parentResourceId: 'resource_01HXYZ', }); expect(fetchBody()).toEqual({ @@ -697,28 +691,21 @@ describe('Authorization', () => { resource_type_slug: 'document', external_id: 'doc-456', name: 'Q4 Budget Report', + parent_resource_id: 'resource_01HXYZ', }); expect(resource).toMatchObject({ object: 'authorization_resource', id: testResourceId, externalId: 'doc-456', name: 'Q4 Budget Report', - description: null, resourceTypeSlug: 'document', - parentResourceId: null, createdAt: '2024-01-15T09:30:00.000Z', updatedAt: '2024-01-15T09:30:00.000Z', }); }); - it('creates an authorization resource with description but no parent resource', async () => { - fetchOnce( - { - ...authorizationResourceFixture, - parent_resource_id: null, - }, - { status: 201 }, - ); + it('creates an authorization resource with description and parentResourceId', async () => { + fetchOnce(authorizationResourceFixture, { status: 201 }); const resource = await workos.authorization.createResource({ organizationId: testOrgId, @@ -726,6 +713,7 @@ describe('Authorization', () => { externalId: 'doc-456', name: 'Q4 Budget Report', description: 'Financial report for Q4 2025', + parentResourceId: 'resource_01HXYZ', }); expect(fetchBody()).toEqual({ @@ -734,6 +722,7 @@ describe('Authorization', () => { external_id: 'doc-456', name: 'Q4 Budget Report', description: 'Financial report for Q4 2025', + parent_resource_id: 'resource_01HXYZ', }); expect(resource).toMatchObject({ object: 'authorization_resource', @@ -742,7 +731,6 @@ describe('Authorization', () => { name: 'Q4 Budget Report', description: 'Financial report for Q4 2025', resourceTypeSlug: 'document', - parentResourceId: null, createdAt: '2024-01-15T09:30:00.000Z', updatedAt: '2024-01-15T09:30:00.000Z', }); @@ -785,26 +773,20 @@ describe('Authorization', () => { }); }); - it('excludes description and parentResourceId when omitted', async () => { - fetchOnce( - { - ...authorizationResourceFixture, - description: null, - parent_resource_id: null, - }, - { status: 201 }, - ); + it('excludes description when omitted', async () => { + fetchOnce(authorizationResourceFixture, { status: 201 }); await workos.authorization.createResource({ organizationId: testOrgId, resourceTypeSlug: 'document', externalId: 'doc-456', name: 'Q4 Budget Report', + parentResourceId: 'resource_01HXYZ', }); const body = fetchBody(); expect(body).not.toHaveProperty('description'); - expect(body).not.toHaveProperty('parent_resource_id'); + expect(body).toHaveProperty('parent_resource_id', 'resource_01HXYZ'); }); it('sends null when description is explicitly set to null', async () => { @@ -822,33 +804,12 @@ describe('Authorization', () => { externalId: 'doc-456', name: 'Q4 Budget Report', description: null, + parentResourceId: 'resource_01HXYZ', }); const body = fetchBody(); expect(body).toHaveProperty('description', null); - expect(body).not.toHaveProperty('parent_resource_id'); - }); - - it('sends null when parentResourceId is explicitly set to null', async () => { - fetchOnce( - { - ...authorizationResourceFixture, - parent_resource_id: null, - }, - { status: 201 }, - ); - - await workos.authorization.createResource({ - organizationId: testOrgId, - resourceTypeSlug: 'document', - externalId: 'doc-456', - name: 'Q4 Budget Report', - parentResourceId: null, - }); - - const body = fetchBody(); - expect(body).toHaveProperty('parent_resource_id', null); - expect(body).not.toHaveProperty('description'); + expect(body).toHaveProperty('parent_resource_id', 'resource_01HXYZ'); }); it('creates a resource with parentResourceExternalId and parentResourceTypeSlug', async () => { @@ -880,26 +841,40 @@ describe('Authorization', () => { }); }); - it('excludes parentResourceExternalId and parentResourceTypeSlug when omitted', async () => { - fetchOnce( - { - ...authorizationResourceFixture, - parent_resource_id: null, - }, - { status: 201 }, - ); + it('excludes parentResourceExternalId and parentResourceTypeSlug when parentResourceId is used', async () => { + fetchOnce(authorizationResourceFixture, { status: 201 }); await workos.authorization.createResource({ organizationId: testOrgId, resourceTypeSlug: 'document', externalId: 'doc-456', name: 'Q4 Budget Report', + parentResourceId: 'resource_01HXYZ', }); const body = fetchBody(); + expect(body).toHaveProperty('parent_resource_id', 'resource_01HXYZ'); expect(body).not.toHaveProperty('parent_resource_external_id'); expect(body).not.toHaveProperty('parent_resource_type_slug'); }); + + it('excludes parentResourceId when parentResourceExternalId is used', async () => { + fetchOnce(authorizationResourceFixture, { status: 201 }); + + await workos.authorization.createResource({ + organizationId: testOrgId, + resourceTypeSlug: 'document', + externalId: 'doc-456', + name: 'Q4 Budget Report', + parentResourceExternalId: 'folder-123', + parentResourceTypeSlug: 'folder', + }); + + const body = fetchBody(); + expect(body).toHaveProperty('parent_resource_external_id', 'folder-123'); + expect(body).toHaveProperty('parent_resource_type_slug', 'folder'); + expect(body).not.toHaveProperty('parent_resource_id'); + }); }); describe('updateResource', () => { @@ -1009,6 +984,308 @@ describe('Authorization', () => { }); }); + describe('listResources', () => { + it('returns a paginated list of resources', async () => { + fetchOnce(listResourcesFixture); + + const { data, object, listMetadata } = + await workos.authorization.listResources(); + + expect(fetchURL()).toContain('/authorization/resources'); + expect(object).toEqual('list'); + expect(data).toHaveLength(2); + expect(data).toEqual( + expect.arrayContaining([ + expect.objectContaining({ + object: 'authorization_resource', + id: 'authz_resource_01HXYZ123ABC456DEF789ABC', + externalId: 'doc-12345678', + name: 'Q5 Budget Report', + resourceTypeSlug: 'document', + }), + expect.objectContaining({ + object: 'authorization_resource', + id: 'authz_resource_01HXYZ123ABC456DEF789DEF', + externalId: 'folder-123', + name: 'Finance Folder', + resourceTypeSlug: 'folder', + }), + ]), + ); + expect(listMetadata).toEqual({ + before: null, + after: 'authz_resource_01HXYZ123ABC456DEF789DEF', + }); + }); + + it('passes filter parameters as comma-separated strings', async () => { + fetchOnce(listResourcesFixture); + + await workos.authorization.listResources({ + organizationIds: ['org_01', 'org_02'], + resourceTypeSlugs: ['document', 'folder'], + }); + + expect(fetchSearchParams()).toEqual({ + organization_ids: 'org_01,org_02', + resource_type_slugs: 'document,folder', + }); + }); + + it('passes pagination parameters with after cursor', async () => { + fetchOnce(listResourcesFixture); + + await workos.authorization.listResources({ + limit: 10, + after: 'resource_01HXYZ123ABC456DEF789ABC', + order: 'desc', + }); + + expect(fetchSearchParams()).toEqual({ + limit: '10', + after: 'resource_01HXYZ123ABC456DEF789ABC', + order: 'desc', + }); + }); + + it('passes pagination parameters with before cursor', async () => { + fetchOnce(listResourcesFixture); + + await workos.authorization.listResources({ + limit: 10, + before: 'resource_01HXYZ123ABC456DEF789DEF', + order: 'asc', + }); + + expect(fetchSearchParams()).toEqual({ + limit: '10', + before: 'resource_01HXYZ123ABC456DEF789DEF', + order: 'asc', + }); + }); + + it('passes parent resource filters', async () => { + fetchOnce(listResourcesFixture); + + await workos.authorization.listResources({ + parentResourceId: 'resource_01HXYZ123ABC456DEF789XYZ', + }); + + expect(fetchSearchParams()).toEqual({ + parent_resource_id: 'resource_01HXYZ123ABC456DEF789XYZ', + }); + }); + + it('passes parent external ID filters', async () => { + fetchOnce(listResourcesFixture); + + await workos.authorization.listResources({ + parentResourceTypeSlug: 'folder', + parentExternalId: 'folder-123', + }); + + expect(fetchSearchParams()).toEqual({ + parent_resource_type_slug: 'folder', + parent_external_id: 'folder-123', + }); + }); + + it('passes search filter', async () => { + fetchOnce(listResourcesFixture); + + await workos.authorization.listResources({ + search: 'Budget', + }); + + expect(fetchSearchParams()).toEqual({ + search: 'Budget', + }); + }); + }); + + describe('getResourceByExternalId', () => { + it('gets a resource by organization, type, and external ID', async () => { + fetchOnce(authorizationResourceFixture); + + const resource = await workos.authorization.getResourceByExternalId({ + organizationId: testOrgId, + resourceTypeSlug: 'document', + externalId: 'doc-456', + }); + + expect(fetchURL()).toContain( + `/authorization/organizations/${testOrgId}/resources/document/doc-456`, + ); + expect(resource).toMatchObject({ + object: 'authorization_resource', + id: testResourceId, + externalId: 'doc-456', + name: 'Q4 Budget Report', + resourceTypeSlug: 'document', + organizationId: testOrgId, + createdAt: '2024-01-15T09:30:00.000Z', + updatedAt: '2024-01-15T09:30:00.000Z', + }); + }); + + it('handles resource without parent', async () => { + fetchOnce({ ...authorizationResourceFixture, parent_resource_id: null }); + + const resource = await workos.authorization.getResourceByExternalId({ + organizationId: testOrgId, + resourceTypeSlug: 'document', + externalId: 'doc-456', + }); + + expect(resource.parentResourceId).toBeNull(); + }); + + it('handles resource without description', async () => { + fetchOnce({ ...authorizationResourceFixture, description: null }); + + const resource = await workos.authorization.getResourceByExternalId({ + organizationId: testOrgId, + resourceTypeSlug: 'document', + externalId: 'doc-456', + }); + + expect(resource.description).toBeNull(); + }); + }); + + describe('updateResourceByExternalId', () => { + it('updates a resource by external ID', async () => { + const updatedResourceFixture = { + ...authorizationResourceFixture, + name: 'Updated Report Name', + description: 'Updated description', + }; + fetchOnce(updatedResourceFixture); + + const resource = await workos.authorization.updateResourceByExternalId({ + organizationId: testOrgId, + resourceTypeSlug: 'document', + externalId: 'doc-456', + name: 'Updated Report Name', + description: 'Updated description', + }); + + expect(fetchURL()).toContain( + `/authorization/organizations/${testOrgId}/resources/document/doc-456`, + ); + expect(fetchBody()).toEqual({ + name: 'Updated Report Name', + description: 'Updated description', + }); + expect(resource).toMatchObject({ + object: 'authorization_resource', + id: testResourceId, + externalId: 'doc-456', + name: 'Updated Report Name', + description: 'Updated description', + resourceTypeSlug: 'document', + organizationId: testOrgId, + }); + }); + + it('updates only name when description is omitted', async () => { + const updatedResourceFixture = { + ...authorizationResourceFixture, + name: 'New Name', + }; + fetchOnce(updatedResourceFixture); + + await workos.authorization.updateResourceByExternalId({ + organizationId: testOrgId, + resourceTypeSlug: 'document', + externalId: 'doc-456', + name: 'New Name', + }); + + const body = fetchBody(); + expect(body).toEqual({ name: 'New Name' }); + expect(body).not.toHaveProperty('description'); + }); + + it('updates only description when name is omitted', async () => { + const updatedResourceFixture = { + ...authorizationResourceFixture, + description: 'new description', + }; + fetchOnce(updatedResourceFixture); + + await workos.authorization.updateResourceByExternalId({ + organizationId: testOrgId, + resourceTypeSlug: 'document', + externalId: 'doc-456', + description: 'new description', + }); + + const body = fetchBody(); + expect(body).toEqual({ description: 'new description' }); + expect(body).not.toHaveProperty('name'); + }); + + it('returns unchanged resource when body is empty', async () => { + fetchOnce(authorizationResourceFixture); + + const resource = await workos.authorization.updateResourceByExternalId({ + organizationId: testOrgId, + resourceTypeSlug: 'document', + externalId: 'doc-456', + }); + + expect(fetchBody()).toEqual({}); + expect(resource).toMatchObject({ + object: 'authorization_resource', + id: testResourceId, + externalId: 'doc-456', + name: 'Q4 Budget Report', + description: 'Financial report for Q4 2025', + resourceTypeSlug: 'document', + organizationId: testOrgId, + createdAt: '2024-01-15T09:30:00.000Z', + updatedAt: '2024-01-15T09:30:00.000Z', + }); + }); + + it('clears description when set to null', async () => { + const updatedResourceFixture = { + ...authorizationResourceFixture, + description: null, + }; + fetchOnce(updatedResourceFixture); + + const resource = await workos.authorization.updateResourceByExternalId({ + organizationId: testOrgId, + resourceTypeSlug: 'document', + externalId: 'doc-456', + description: null, + }); + + expect(fetchBody()).toEqual({ description: null }); + expect(resource.description).toBeNull(); + }); + }); + + describe('deleteResourceByExternalId', () => { + it('deletes a resource by external ID', async () => { + fetchOnce({}, { status: 204 }); + const resourceTypeSlug = 'document'; + const externalId = 'externalId'; + + await workos.authorization.deleteResourceByExternalId({ + organizationId: testOrgId, + resourceTypeSlug: resourceTypeSlug, + externalId: externalId, + }); + + expect(fetchURL()).toContain( + `/authorization/organizations/${testOrgId}/resources/${resourceTypeSlug}/${externalId}`, + ); + }); + }); + describe('check', () => { it('returns authorized when permission is granted (by resource ID)', async () => { fetchOnce({ authorized: true }, { status: 200 }); diff --git a/src/authorization/authorization.ts b/src/authorization/authorization.ts index 798e12aaf..2d2f31302 100644 --- a/src/authorization/authorization.ts +++ b/src/authorization/authorization.ts @@ -29,6 +29,12 @@ import { ListPermissionsOptions, AuthorizationResource, AuthorizationResourceResponse, + AuthorizationResourceList, + AuthorizationResourceListResponse, + ListAuthorizationResourcesOptions, + GetAuthorizationResourceByExternalIdOptions, + UpdateAuthorizationResourceByExternalIdOptions, + DeleteAuthorizationResourceByExternalIdOptions, CreateAuthorizationResourceOptions, UpdateAuthorizationResourceOptions, AuthorizationCheckOptions, @@ -48,6 +54,8 @@ import { deserializeAuthorizationResource, serializeCreateResourceOptions, serializeUpdateResourceOptions, + serializeUpdateResourceByExternalIdOptions, + serializeListAuthorizationResourcesOptions, serializeAuthorizationCheckOptions, } from './serializers'; @@ -280,6 +288,57 @@ export class Authorization { await this.workos.delete(`/authorization/resources/${resourceId}`); } + async listResources( + options?: ListAuthorizationResourcesOptions, + ): Promise { + const { data } = await this.workos.get( + '/authorization/resources', + { + query: options + ? serializeListAuthorizationResourcesOptions(options) + : undefined, + }, + ); + return { + object: 'list', + data: data.data.map(deserializeAuthorizationResource), + listMetadata: { + before: data.list_metadata.before, + after: data.list_metadata.after, + }, + }; + } + + async getResourceByExternalId( + options: GetAuthorizationResourceByExternalIdOptions, + ): Promise { + const { organizationId, resourceTypeSlug, externalId } = options; + const { data } = await this.workos.get( + `/authorization/organizations/${organizationId}/resources/${resourceTypeSlug}/${externalId}`, + ); + return deserializeAuthorizationResource(data); + } + + async updateResourceByExternalId( + options: UpdateAuthorizationResourceByExternalIdOptions, + ): Promise { + const { organizationId, resourceTypeSlug, externalId } = options; + const { data } = await this.workos.patch( + `/authorization/organizations/${organizationId}/resources/${resourceTypeSlug}/${externalId}`, + serializeUpdateResourceByExternalIdOptions(options), + ); + return deserializeAuthorizationResource(data); + } + + async deleteResourceByExternalId( + options: DeleteAuthorizationResourceByExternalIdOptions, + ): Promise { + const { organizationId, resourceTypeSlug, externalId } = options; + await this.workos.delete( + `/authorization/organizations/${organizationId}/resources/${resourceTypeSlug}/${externalId}`, + ); + } + async check( options: AuthorizationCheckOptions, ): Promise { diff --git a/src/authorization/fixtures/list-resources.json b/src/authorization/fixtures/list-resources.json new file mode 100644 index 000000000..aa9d17066 --- /dev/null +++ b/src/authorization/fixtures/list-resources.json @@ -0,0 +1,33 @@ +{ + "object": "list", + "data": [ + { + "object": "authorization_resource", + "id": "authz_resource_01HXYZ123ABC456DEF789ABC", + "external_id": "doc-12345678", + "name": "Q5 Budget Report", + "description": "Financial report for Q5 2025", + "resource_type_slug": "document", + "organization_id": "org_01HXYZ123ABC456DEF789ABC", + "parent_resource_id": "authz_resource_01HXYZ123ABC456DEF789XYZ", + "created_at": "2024-01-15T09:30:00.000Z", + "updated_at": "2024-01-15T09:30:00.000Z" + }, + { + "object": "authorization_resource", + "id": "authz_resource_01HXYZ123ABC456DEF789DEF", + "external_id": "folder-123", + "name": "Finance Folder", + "description": null, + "resource_type_slug": "folder", + "organization_id": "org_01HXYZ123ABC456DEF789ABC", + "parent_resource_id": null, + "created_at": "2024-01-14T08:00:00.000Z", + "updated_at": "2024-01-14T08:00:00.000Z" + } + ], + "list_metadata": { + "before": null, + "after": "authz_resource_01HXYZ123ABC456DEF789DEF" + } +} diff --git a/src/authorization/interfaces/authorization-resource.interface.ts b/src/authorization/interfaces/authorization-resource.interface.ts index 3498ace54..cc75a5c80 100644 --- a/src/authorization/interfaces/authorization-resource.interface.ts +++ b/src/authorization/interfaces/authorization-resource.interface.ts @@ -24,17 +24,27 @@ export interface AuthorizationResourceResponse { updated_at: string; } -export interface CreateAuthorizationResourceOptions { +interface BaseCreateAuthorizationResourceOptions { externalId: string; name: string; description?: string | null; resourceTypeSlug: string; organizationId: string; - parentResourceId?: string | null; - parentResourceExternalId?: string | null; - parentResourceTypeSlug?: string | null; } +export interface CreateOptionsWithParentResourceId extends BaseCreateAuthorizationResourceOptions { + parentResourceId: string; +} + +export interface CreateOptionsWithParentExternalId extends BaseCreateAuthorizationResourceOptions { + parentResourceExternalId: string; + parentResourceTypeSlug: string; +} + +export type CreateAuthorizationResourceOptions = + | CreateOptionsWithParentResourceId + | CreateOptionsWithParentExternalId; + export interface SerializedCreateAuthorizationResourceOptions { external_id: string; name: string; @@ -56,3 +66,21 @@ export interface SerializedUpdateAuthorizationResourceOptions { name?: string; description?: string | null; } + +export interface AuthorizationResourceList { + object: 'list'; + data: AuthorizationResource[]; + listMetadata: { + before: string | null; + after: string | null; + }; +} + +export interface AuthorizationResourceListResponse { + object: 'list'; + data: AuthorizationResourceResponse[]; + list_metadata: { + before: string | null; + after: string | null; + }; +} diff --git a/src/authorization/interfaces/delete-authorization-resource-by-external-id-options.interface.ts b/src/authorization/interfaces/delete-authorization-resource-by-external-id-options.interface.ts new file mode 100644 index 000000000..d0e2d75c7 --- /dev/null +++ b/src/authorization/interfaces/delete-authorization-resource-by-external-id-options.interface.ts @@ -0,0 +1,5 @@ +export interface DeleteAuthorizationResourceByExternalIdOptions { + organizationId: string; + resourceTypeSlug: string; + externalId: string; +} diff --git a/src/authorization/interfaces/get-authorization-resource-by-external-id-options.interface.ts b/src/authorization/interfaces/get-authorization-resource-by-external-id-options.interface.ts new file mode 100644 index 000000000..7663c0395 --- /dev/null +++ b/src/authorization/interfaces/get-authorization-resource-by-external-id-options.interface.ts @@ -0,0 +1,5 @@ +export interface GetAuthorizationResourceByExternalIdOptions { + organizationId: string; + resourceTypeSlug: string; + externalId: string; +} diff --git a/src/authorization/interfaces/index.ts b/src/authorization/interfaces/index.ts index e18a7e50b..28d31ea12 100644 --- a/src/authorization/interfaces/index.ts +++ b/src/authorization/interfaces/index.ts @@ -14,4 +14,8 @@ export * from './create-permission-options.interface'; export * from './update-permission-options.interface'; export * from './list-permissions-options.interface'; export * from './authorization-resource.interface'; +export * from './list-authorization-resources-options.interface'; +export * from './get-authorization-resource-by-external-id-options.interface'; +export * from './update-authorization-resource-by-external-id-options.interface'; +export * from './delete-authorization-resource-by-external-id-options.interface'; export * from './authorization-resource-check.interface'; diff --git a/src/authorization/interfaces/list-authorization-resources-options.interface.ts b/src/authorization/interfaces/list-authorization-resources-options.interface.ts new file mode 100644 index 000000000..713a8dd21 --- /dev/null +++ b/src/authorization/interfaces/list-authorization-resources-options.interface.ts @@ -0,0 +1,23 @@ +import { PaginationOptions } from '../../common/interfaces/pagination-options.interface'; + +export interface ListAuthorizationResourcesOptions extends PaginationOptions { + organizationIds?: string[]; + resourceTypeSlugs?: string[]; + parentResourceId?: string; + parentResourceTypeSlug?: string; + parentExternalId?: string; + search?: string; +} + +export interface SerializedListAuthorizationResourcesOptions { + organization_ids?: string; + resource_type_slugs?: string; + parent_resource_id?: string; + parent_resource_type_slug?: string; + parent_external_id?: string; + search?: string; + limit?: number; + after?: string; + before?: string; + order?: 'asc' | 'desc'; +} diff --git a/src/authorization/interfaces/update-authorization-resource-by-external-id-options.interface.ts b/src/authorization/interfaces/update-authorization-resource-by-external-id-options.interface.ts new file mode 100644 index 000000000..b3320475a --- /dev/null +++ b/src/authorization/interfaces/update-authorization-resource-by-external-id-options.interface.ts @@ -0,0 +1,7 @@ +export interface UpdateAuthorizationResourceByExternalIdOptions { + organizationId: string; + resourceTypeSlug: string; + externalId: string; + name?: string; + description?: string | null; +} diff --git a/src/authorization/serializers/create-authorization-resource-options.serializer.ts b/src/authorization/serializers/create-authorization-resource-options.serializer.ts index e517fe690..c667f2c4f 100644 --- a/src/authorization/serializers/create-authorization-resource-options.serializer.ts +++ b/src/authorization/serializers/create-authorization-resource-options.serializer.ts @@ -13,13 +13,11 @@ export const serializeCreateResourceOptions = ( ...(options.description !== undefined && { description: options.description, }), - ...(options.parentResourceId !== undefined && { + ...('parentResourceId' in options && { parent_resource_id: options.parentResourceId, }), - ...(options.parentResourceExternalId !== undefined && { + ...('parentResourceExternalId' in options && { parent_resource_external_id: options.parentResourceExternalId, - }), - ...(options.parentResourceTypeSlug !== undefined && { parent_resource_type_slug: options.parentResourceTypeSlug, }), }); diff --git a/src/authorization/serializers/index.ts b/src/authorization/serializers/index.ts index 26a03a444..3a5bd0e75 100644 --- a/src/authorization/serializers/index.ts +++ b/src/authorization/serializers/index.ts @@ -10,4 +10,6 @@ export * from './update-permission-options.serializer'; export * from './authorization-resource.serializer'; export * from './create-authorization-resource-options.serializer'; export * from './update-authorization-resource-options.serializer'; +export * from './update-authorization-resource-by-external-id-options.serializer'; +export * from './list-authorization-resources-options.serializer'; export * from './authorization-check-options.serializer'; diff --git a/src/authorization/serializers/list-authorization-resources-options.serializer.ts b/src/authorization/serializers/list-authorization-resources-options.serializer.ts new file mode 100644 index 000000000..b8313348e --- /dev/null +++ b/src/authorization/serializers/list-authorization-resources-options.serializer.ts @@ -0,0 +1,29 @@ +import { + ListAuthorizationResourcesOptions, + SerializedListAuthorizationResourcesOptions, +} from '../interfaces/list-authorization-resources-options.interface'; + +export const serializeListAuthorizationResourcesOptions = ( + options: ListAuthorizationResourcesOptions, +): SerializedListAuthorizationResourcesOptions => ({ + ...(options.organizationIds && { + organization_ids: options.organizationIds.join(','), + }), + ...(options.resourceTypeSlugs && { + resource_type_slugs: options.resourceTypeSlugs.join(','), + }), + ...(options.parentResourceId && { + parent_resource_id: options.parentResourceId, + }), + ...(options.parentResourceTypeSlug && { + parent_resource_type_slug: options.parentResourceTypeSlug, + }), + ...(options.parentExternalId && { + parent_external_id: options.parentExternalId, + }), + ...(options.search && { search: options.search }), + ...(options.limit !== undefined && { limit: options.limit }), + ...(options.after && { after: options.after }), + ...(options.before && { before: options.before }), + ...(options.order && { order: options.order }), +}); diff --git a/src/authorization/serializers/update-authorization-resource-by-external-id-options.serializer.ts b/src/authorization/serializers/update-authorization-resource-by-external-id-options.serializer.ts new file mode 100644 index 000000000..906d79057 --- /dev/null +++ b/src/authorization/serializers/update-authorization-resource-by-external-id-options.serializer.ts @@ -0,0 +1,11 @@ +import { UpdateAuthorizationResourceByExternalIdOptions } from '../interfaces/update-authorization-resource-by-external-id-options.interface'; +import { SerializedUpdateAuthorizationResourceOptions } from '../interfaces/authorization-resource.interface'; + +export const serializeUpdateResourceByExternalIdOptions = ( + options: UpdateAuthorizationResourceByExternalIdOptions, +): SerializedUpdateAuthorizationResourceOptions => ({ + ...(options.name !== undefined && { name: options.name }), + ...(options.description !== undefined && { + description: options.description, + }), +});