From 1d62fd6f6a03cfa062cf02a788a3a6ff927cfa60 Mon Sep 17 00:00:00 2001 From: Aaron Tainter Date: Wed, 13 May 2026 11:21:20 -0700 Subject: [PATCH 1/2] Add resource and role_slug filter params to list role assignments --- src/authorization/authorization.spec.ts | 69 +++++++++++++++++++ src/authorization/authorization.ts | 19 +++-- ...source-by-external-id-options.interface.ts | 5 +- ...ignments-for-resource-options.interface.ts | 7 ++ ...list-role-assignments-options.interface.ts | 13 ++++ src/authorization/serializers/index.ts | 2 + ...gnments-for-resource-options.serializer.ts | 14 ++++ ...ist-role-assignments-options.serializer.ts | 18 +++++ 8 files changed, 140 insertions(+), 7 deletions(-) create mode 100644 src/authorization/serializers/list-role-assignments-for-resource-options.serializer.ts create mode 100644 src/authorization/serializers/list-role-assignments-options.serializer.ts 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..c3874ee27 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 @@ -1,7 +1,10 @@ import { PaginationOptions } from '../../common/interfaces/pagination-options.interface'; -export interface ListRoleAssignmentsForResourceByExternalIdOptions extends PaginationOptions { +export interface ListRoleAssignmentsForResourceByExternalIdOptions + extends PaginationOptions { 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..69f3a04d1 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,11 @@ 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), +}); From cbf4114b04de3194e548bca07fa8b4c9109500d4 Mon Sep 17 00:00:00 2001 From: Aaron Tainter Date: Wed, 13 May 2026 11:25:19 -0700 Subject: [PATCH 2/2] Prettier --- ...ssignments-for-resource-by-external-id-options.interface.ts | 3 +-- .../list-role-assignments-for-resource-options.interface.ts | 3 +-- 2 files changed, 2 insertions(+), 4 deletions(-) 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 c3874ee27..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 @@ -1,7 +1,6 @@ import { PaginationOptions } from '../../common/interfaces/pagination-options.interface'; -export interface ListRoleAssignmentsForResourceByExternalIdOptions - extends PaginationOptions { +export interface ListRoleAssignmentsForResourceByExternalIdOptions extends PaginationOptions { organizationId: string; resourceTypeSlug: string; externalId: 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 69f3a04d1..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 @@ -6,7 +6,6 @@ export interface ListRoleAssignmentsForResourceOptions extends PaginationOptions roleSlug?: string; } -export interface SerializedListRoleAssignmentsForResourceOptions - extends PaginationOptions { +export interface SerializedListRoleAssignmentsForResourceOptions extends PaginationOptions { role_slug?: string; }