diff --git a/src/authorization/authorization.spec.ts b/src/authorization/authorization.spec.ts index 51a675de4..90f3055d4 100644 --- a/src/authorization/authorization.spec.ts +++ b/src/authorization/authorization.spec.ts @@ -1739,6 +1739,47 @@ describe('Authorization', () => { order: 'desc', }); }); + + it('filters by resource id', async () => { + fetchOnce(listRoleAssignmentsFixture); + + await workos.authorization.listRoleAssignments({ + organizationMembershipId: testOrgMembershipId, + resourceId: testResourceId, + }); + + expect(fetchSearchParams()).toMatchObject({ + resource_id: testResourceId, + }); + }); + + it('filters by resource external id and resource type slug', async () => { + fetchOnce(listRoleAssignmentsFixture); + + await workos.authorization.listRoleAssignments({ + organizationMembershipId: testOrgMembershipId, + resourceExternalId: 'doc-456', + resourceTypeSlug: 'document', + }); + + expect(fetchSearchParams()).toMatchObject({ + resource_external_id: 'doc-456', + resource_type_slug: 'document', + }); + }); + + it('filters by resource type slug only', async () => { + fetchOnce(listRoleAssignmentsFixture); + + await workos.authorization.listRoleAssignments({ + organizationMembershipId: testOrgMembershipId, + resourceTypeSlug: 'document', + }); + + expect(fetchSearchParams()).toMatchObject({ + resource_type_slug: 'document', + }); + }); }); describe('listRoleAssignmentsForResource', () => { @@ -1818,6 +1859,19 @@ describe('Authorization', () => { order: 'desc', }); }); + + it('filters by role slug', async () => { + fetchOnce(listRoleAssignmentsFixture); + + await workos.authorization.listRoleAssignmentsForResource({ + resourceId: testResourceId, + roleSlug: 'editor', + }); + + expect(fetchSearchParams()).toMatchObject({ + role_slug: 'editor', + }); + }); }); describe('listResourceRoleAssignments', () => { @@ -1903,6 +1957,21 @@ describe('Authorization', () => { order: 'desc', }); }); + + it('filters by role slug', async () => { + fetchOnce(listRoleAssignmentsFixture); + + await workos.authorization.listResourceRoleAssignments({ + organizationId: testOrgId, + resourceTypeSlug: 'document', + externalId: 'doc-456', + roleSlug: 'editor', + }); + + expect(fetchSearchParams()).toMatchObject({ + role_slug: 'editor', + }); + }); }); describe('assignRole', () => { diff --git a/src/authorization/authorization.ts b/src/authorization/authorization.ts index 882908191..545ae217f 100644 --- a/src/authorization/authorization.ts +++ b/src/authorization/authorization.ts @@ -75,6 +75,8 @@ import { serializeListMembershipsForResourceOptions, serializeListResourcesForMembershipOptions, serializeListEffectivePermissionsOptions, + serializeListRoleAssignmentsOptions, + serializeListRoleAssignmentsForResourceOptions, } from './serializers'; import { AuthorizationOrganizationMembership, @@ -857,12 +859,13 @@ export class Authorization { ): Promise> { const { organizationMembershipId, ...queryOptions } = options; const endpoint = `/authorization/organization_memberships/${organizationMembershipId}/role_assignments`; + const serializedOptions = serializeListRoleAssignmentsOptions(queryOptions); return new AutoPaginatable( await fetchAndDeserialize( this.workos, endpoint, deserializeRoleAssignment, - queryOptions, + serializedOptions, ), (params) => fetchAndDeserialize( @@ -871,7 +874,7 @@ export class Authorization { deserializeRoleAssignment, params, ), - queryOptions, + serializedOptions, ); } @@ -894,12 +897,14 @@ export class Authorization { ): Promise> { const { resourceId, ...queryOptions } = options; const endpoint = `/authorization/resources/${resourceId}/role_assignments`; + const serializedOptions = + serializeListRoleAssignmentsForResourceOptions(queryOptions); return new AutoPaginatable( await fetchAndDeserialize( this.workos, endpoint, deserializeRoleAssignment, - queryOptions, + serializedOptions, ), (params) => fetchAndDeserialize( @@ -908,7 +913,7 @@ export class Authorization { deserializeRoleAssignment, params, ), - queryOptions, + serializedOptions, ); } @@ -942,12 +947,14 @@ export class Authorization { const { organizationId, resourceTypeSlug, externalId, ...queryOptions } = options; const endpoint = `/authorization/organizations/${organizationId}/resources/${resourceTypeSlug}/${externalId}/role_assignments`; + const serializedOptions = + serializeListRoleAssignmentsForResourceOptions(queryOptions); return new AutoPaginatable( await fetchAndDeserialize( this.workos, endpoint, deserializeRoleAssignment, - queryOptions, + serializedOptions, ), (params) => fetchAndDeserialize( @@ -956,7 +963,7 @@ export class Authorization { deserializeRoleAssignment, params, ), - queryOptions, + serializedOptions, ); } diff --git a/src/authorization/interfaces/list-role-assignments-for-resource-by-external-id-options.interface.ts b/src/authorization/interfaces/list-role-assignments-for-resource-by-external-id-options.interface.ts index 9d0ca13c2..7f7b943e6 100644 --- a/src/authorization/interfaces/list-role-assignments-for-resource-by-external-id-options.interface.ts +++ b/src/authorization/interfaces/list-role-assignments-for-resource-by-external-id-options.interface.ts @@ -4,4 +4,6 @@ export interface ListRoleAssignmentsForResourceByExternalIdOptions extends Pagin organizationId: string; resourceTypeSlug: string; externalId: string; + /** Filter role assignments to only those that grant this role. */ + roleSlug?: string; } diff --git a/src/authorization/interfaces/list-role-assignments-for-resource-options.interface.ts b/src/authorization/interfaces/list-role-assignments-for-resource-options.interface.ts index 5b21ba99e..943bfe7a1 100644 --- a/src/authorization/interfaces/list-role-assignments-for-resource-options.interface.ts +++ b/src/authorization/interfaces/list-role-assignments-for-resource-options.interface.ts @@ -2,4 +2,10 @@ import { PaginationOptions } from '../../common/interfaces/pagination-options.in export interface ListRoleAssignmentsForResourceOptions extends PaginationOptions { resourceId: string; + /** Filter role assignments to only those that grant this role. */ + roleSlug?: string; +} + +export interface SerializedListRoleAssignmentsForResourceOptions extends PaginationOptions { + role_slug?: string; } diff --git a/src/authorization/interfaces/list-role-assignments-options.interface.ts b/src/authorization/interfaces/list-role-assignments-options.interface.ts index fd28b798b..91266489e 100644 --- a/src/authorization/interfaces/list-role-assignments-options.interface.ts +++ b/src/authorization/interfaces/list-role-assignments-options.interface.ts @@ -1,4 +1,17 @@ import { PaginationOptions } from '../../common/interfaces/pagination-options.interface'; + export interface ListRoleAssignmentsOptions extends PaginationOptions { organizationMembershipId: string; + /** Filter role assignments to only those granted on the resource with this ID. */ + resourceId?: string; + /** Filter role assignments to only those granted on the resource with this external ID. Can be used on its own or combined with `resourceTypeSlug`. */ + resourceExternalId?: string; + /** Filter role assignments to only those granted on resources of this type. Can be used on its own or combined with `resourceExternalId`. */ + resourceTypeSlug?: string; +} + +export interface SerializedListRoleAssignmentsOptions extends PaginationOptions { + resource_id?: string; + resource_external_id?: string; + resource_type_slug?: string; } diff --git a/src/authorization/serializers/index.ts b/src/authorization/serializers/index.ts index ed09c6570..68571380e 100644 --- a/src/authorization/serializers/index.ts +++ b/src/authorization/serializers/index.ts @@ -16,6 +16,8 @@ export * from './authorization-check-options.serializer'; export * from './list-resources-for-membership-options.serializer'; export * from './list-memberships-for-resource-options.serializer'; export * from './role-assignment.serializer'; +export * from './list-role-assignments-options.serializer'; +export * from './list-role-assignments-for-resource-options.serializer'; export * from './assign-role-options.serializer'; export * from './remove-role-options.serializer'; export * from './list-effective-permissions-options.serializer'; diff --git a/src/authorization/serializers/list-role-assignments-for-resource-options.serializer.ts b/src/authorization/serializers/list-role-assignments-for-resource-options.serializer.ts new file mode 100644 index 000000000..ab9a9d005 --- /dev/null +++ b/src/authorization/serializers/list-role-assignments-for-resource-options.serializer.ts @@ -0,0 +1,14 @@ +import { PaginationOptions } from '../../common/interfaces/pagination-options.interface'; +import { serializePaginationOptions } from '../../common/serializers'; +import { SerializedListRoleAssignmentsForResourceOptions } from '../interfaces/list-role-assignments-for-resource-options.interface'; + +interface ListRoleAssignmentsForResourceQueryOptions extends PaginationOptions { + roleSlug?: string; +} + +export const serializeListRoleAssignmentsForResourceOptions = ( + options: ListRoleAssignmentsForResourceQueryOptions, +): SerializedListRoleAssignmentsForResourceOptions => ({ + ...(options.roleSlug && { role_slug: options.roleSlug }), + ...serializePaginationOptions(options), +}); diff --git a/src/authorization/serializers/list-role-assignments-options.serializer.ts b/src/authorization/serializers/list-role-assignments-options.serializer.ts new file mode 100644 index 000000000..658517929 --- /dev/null +++ b/src/authorization/serializers/list-role-assignments-options.serializer.ts @@ -0,0 +1,18 @@ +import { serializePaginationOptions } from '../../common/serializers'; +import { + ListRoleAssignmentsOptions, + SerializedListRoleAssignmentsOptions, +} from '../interfaces/list-role-assignments-options.interface'; + +export const serializeListRoleAssignmentsOptions = ( + options: Omit, +): SerializedListRoleAssignmentsOptions => ({ + ...(options.resourceId && { resource_id: options.resourceId }), + ...(options.resourceExternalId && { + resource_external_id: options.resourceExternalId, + }), + ...(options.resourceTypeSlug && { + resource_type_slug: options.resourceTypeSlug, + }), + ...serializePaginationOptions(options), +});