From 015592df5d6f643e2f01143b530b2419a60a5d4d Mon Sep 17 00:00:00 2001 From: Swaroop Akkineni Date: Tue, 14 Apr 2026 22:04:06 -0400 Subject: [PATCH 1/9] moar node sdk stuff --- src/authorization/authorization.spec.ts | 327 ++++++++++++++++++++---- src/authorization/authorization.ts | 223 +++++++++------- 2 files changed, 405 insertions(+), 145 deletions(-) diff --git a/src/authorization/authorization.spec.ts b/src/authorization/authorization.spec.ts index 2d700f31d..02a1e9665 100644 --- a/src/authorization/authorization.spec.ts +++ b/src/authorization/authorization.spec.ts @@ -568,13 +568,11 @@ describe('Authorization', () => { it('returns permissions', async () => { fetchOnce(listPermissionsFixture); - const { data, object, listMetadata } = - await workos.authorization.listPermissions(); + const result = await workos.authorization.listPermissions(); expect(fetchURL()).toContain('/authorization/permissions'); - expect(object).toEqual('list'); - expect(data).toHaveLength(2); - expect(data).toEqual( + expect(result.data).toHaveLength(2); + expect(result.data).toEqual( expect.arrayContaining([ expect.objectContaining({ object: 'permission', @@ -592,7 +590,7 @@ describe('Authorization', () => { }), ]), ); - expect(listMetadata).toEqual({ + expect(result.listMetadata).toEqual({ before: null, after: 'perm_01HXYZ123ABC456DEF789GHJ', }); @@ -613,6 +611,36 @@ describe('Authorization', () => { order: 'desc', }); }); + + it('defaults to desc order when order is not specified', async () => { + fetchOnce(listPermissionsFixture); + + await workos.authorization.listPermissions(); + + expect(fetchSearchParams()).toMatchObject({ + order: 'desc', + }); + }); + + it('passes order asc when explicitly set', async () => { + fetchOnce(listPermissionsFixture); + + await workos.authorization.listPermissions({ order: 'asc' }); + + expect(fetchSearchParams()).toMatchObject({ + order: 'asc', + }); + }); + + it('passes order desc when explicitly set', async () => { + fetchOnce(listPermissionsFixture); + + await workos.authorization.listPermissions({ order: 'desc' }); + + expect(fetchSearchParams()).toMatchObject({ + order: 'desc', + }); + }); }); describe('getPermission', () => { @@ -1146,13 +1174,11 @@ describe('Authorization', () => { it('returns a paginated list of resources', async () => { fetchOnce(listResourcesFixture); - const { data, object, listMetadata } = - await workos.authorization.listResources(); + const result = await workos.authorization.listResources(); expect(fetchURL()).toContain('/authorization/resources'); - expect(object).toEqual('list'); - expect(data).toHaveLength(2); - expect(data).toEqual( + expect(result.data).toHaveLength(2); + expect(result.data).toEqual( expect.arrayContaining([ expect.objectContaining({ object: 'authorization_resource', @@ -1170,7 +1196,7 @@ describe('Authorization', () => { }), ]), ); - expect(listMetadata).toEqual({ + expect(result.listMetadata).toEqual({ before: null, after: 'authz_resource_01HXYZ123ABC456DEF789DEF', }); @@ -1215,7 +1241,7 @@ describe('Authorization', () => { parentResourceId: 'resource_01HXYZ123ABC456DEF789XYZ', }); - expect(fetchSearchParams()).toEqual({ + expect(fetchSearchParams()).toMatchObject({ parent_resource_id: 'resource_01HXYZ123ABC456DEF789XYZ', }); }); @@ -1228,7 +1254,7 @@ describe('Authorization', () => { parentExternalId: 'folder-123', }); - expect(fetchSearchParams()).toEqual({ + expect(fetchSearchParams()).toMatchObject({ parent_resource_type_slug: 'folder', parent_external_id: 'folder-123', }); @@ -1241,10 +1267,40 @@ describe('Authorization', () => { search: 'Budget', }); - expect(fetchSearchParams()).toEqual({ + expect(fetchSearchParams()).toMatchObject({ search: 'Budget', }); }); + + it('defaults to desc order when order is not specified', async () => { + fetchOnce(listResourcesFixture); + + await workos.authorization.listResources(); + + expect(fetchSearchParams()).toMatchObject({ + order: 'desc', + }); + }); + + it('passes order asc when explicitly set', async () => { + fetchOnce(listResourcesFixture); + + await workos.authorization.listResources({ order: 'asc' }); + + expect(fetchSearchParams()).toMatchObject({ + order: 'asc', + }); + }); + + it('passes order desc when explicitly set', async () => { + fetchOnce(listResourcesFixture); + + await workos.authorization.listResources({ order: 'desc' }); + + expect(fetchSearchParams()).toMatchObject({ + order: 'desc', + }); + }); }); describe('getResourceByExternalId', () => { @@ -1578,17 +1634,15 @@ describe('Authorization', () => { it('lists role assignments for an organization membership', async () => { fetchOnce(listRoleAssignmentsFixture); - const { data, object, listMetadata } = - await workos.authorization.listRoleAssignments({ - organizationMembershipId: testOrgMembershipId, - }); + const result = await workos.authorization.listRoleAssignments({ + organizationMembershipId: testOrgMembershipId, + }); expect(fetchURL()).toContain( `/authorization/organization_memberships/${testOrgMembershipId}/role_assignments`, ); - expect(object).toEqual('list'); - expect(data).toHaveLength(1); - expect(data[0]).toMatchObject({ + expect(result.data).toHaveLength(1); + expect(result.data[0]).toMatchObject({ object: 'role_assignment', id: 'role_assignment_01HXYZ123ABC456DEF789ABC', role: { slug: 'editor' }, @@ -1600,7 +1654,7 @@ describe('Authorization', () => { createdAt: '2024-01-15T09:30:00.000Z', updatedAt: '2024-01-15T09:30:00.000Z', }); - expect(listMetadata).toEqual({ + expect(result.listMetadata).toEqual({ before: null, after: 'role_assignment_01HXYZ123ABC456DEF789ABC', }); @@ -1639,6 +1693,44 @@ describe('Authorization', () => { order: 'asc', }); }); + + it('defaults to desc order when order is not specified', async () => { + fetchOnce(listRoleAssignmentsFixture); + + await workos.authorization.listRoleAssignments({ + organizationMembershipId: testOrgMembershipId, + }); + + expect(fetchSearchParams()).toMatchObject({ + order: 'desc', + }); + }); + + it('passes order asc when explicitly set', async () => { + fetchOnce(listRoleAssignmentsFixture); + + await workos.authorization.listRoleAssignments({ + organizationMembershipId: testOrgMembershipId, + order: 'asc', + }); + + expect(fetchSearchParams()).toMatchObject({ + order: 'asc', + }); + }); + + it('passes order desc when explicitly set', async () => { + fetchOnce(listRoleAssignmentsFixture); + + await workos.authorization.listRoleAssignments({ + organizationMembershipId: testOrgMembershipId, + order: 'desc', + }); + + expect(fetchSearchParams()).toMatchObject({ + order: 'desc', + }); + }); }); describe('assignRole', () => { @@ -1811,12 +1903,11 @@ describe('Authorization', () => { it('lists resources with parentResourceId', async () => { fetchOnce(listResourcesFixture); - const { data, object, listMetadata } = - await workos.authorization.listResourcesForMembership({ - organizationMembershipId: testOrgMembershipId, - permissionSlug: 'document:read', - parentResourceId: testResourceId, - }); + const result = await workos.authorization.listResourcesForMembership({ + organizationMembershipId: testOrgMembershipId, + permissionSlug: 'document:read', + parentResourceId: testResourceId, + }); expect(fetchURL()).toContain( `/authorization/organization_memberships/${testOrgMembershipId}/resources`, @@ -1825,13 +1916,12 @@ describe('Authorization', () => { permission_slug: 'document:read', parent_resource_id: testResourceId, }); - expect(object).toEqual('list'); - expect(data).toHaveLength(2); - expect(data[0]).toMatchObject({ + expect(result.data).toHaveLength(2); + expect(result.data[0]).toMatchObject({ object: 'authorization_resource', id: 'authz_resource_01HXYZ123ABC456DEF789ABC', }); - expect(listMetadata).toEqual({ + expect(result.listMetadata).toEqual({ before: null, after: 'authz_resource_01HXYZ123ABC456DEF789DEF', }); @@ -1895,17 +1985,60 @@ describe('Authorization', () => { order: 'asc', }); }); + + it('defaults to desc order when order is not specified', async () => { + fetchOnce(listResourcesFixture); + + await workos.authorization.listResourcesForMembership({ + organizationMembershipId: testOrgMembershipId, + permissionSlug: 'document:read', + parentResourceId: testResourceId, + }); + + expect(fetchSearchParams()).toMatchObject({ + order: 'desc', + }); + }); + + it('passes order asc when explicitly set', async () => { + fetchOnce(listResourcesFixture); + + await workos.authorization.listResourcesForMembership({ + organizationMembershipId: testOrgMembershipId, + permissionSlug: 'document:read', + parentResourceId: testResourceId, + order: 'asc', + }); + + expect(fetchSearchParams()).toMatchObject({ + order: 'asc', + }); + }); + + it('passes order desc when explicitly set', async () => { + fetchOnce(listResourcesFixture); + + await workos.authorization.listResourcesForMembership({ + organizationMembershipId: testOrgMembershipId, + permissionSlug: 'document:read', + parentResourceId: testResourceId, + order: 'desc', + }); + + expect(fetchSearchParams()).toMatchObject({ + order: 'desc', + }); + }); }); describe('listMembershipsForResource', () => { it('lists organization memberships for a resource by internal ID', async () => { fetchOnce(listOrganizationMembershipsForResourceFixture); - const { data, object, listMetadata } = - await workos.authorization.listMembershipsForResource({ - resourceId: testResourceId, - permissionSlug: 'documents:read', - }); + const result = await workos.authorization.listMembershipsForResource({ + resourceId: testResourceId, + permissionSlug: 'documents:read', + }); expect(fetchURL()).toContain( `/authorization/resources/${testResourceId}/organization_memberships`, @@ -1913,9 +2046,8 @@ describe('Authorization', () => { expect(fetchSearchParams()).toMatchObject({ permission_slug: 'documents:read', }); - expect(object).toEqual('list'); - expect(data).toHaveLength(1); - expect(data[0]).toMatchObject({ + expect(result.data).toHaveLength(1); + expect(result.data[0]).toMatchObject({ object: 'organization_membership', id: 'om_01HXYZ123ABC456DEF789ABC', userId: 'user_01HXYZ123ABC456DEF789XYZ', @@ -1923,7 +2055,7 @@ describe('Authorization', () => { status: 'active', customAttributes: { department: 'Engineering', level: 'senior' }, }); - expect(listMetadata).toEqual({ + expect(result.listMetadata).toEqual({ before: null, after: 'om_01HXYZ123ABC456DEF789ABC', }); @@ -1937,15 +2069,13 @@ describe('Authorization', () => { }; fetchOnce(emptyFixture); - const { data, object, listMetadata } = - await workos.authorization.listMembershipsForResource({ - resourceId: testResourceId, - permissionSlug: 'documents:read', - }); + const result = await workos.authorization.listMembershipsForResource({ + resourceId: testResourceId, + permissionSlug: 'documents:read', + }); - expect(object).toEqual('list'); - expect(data).toHaveLength(0); - expect(listMetadata).toEqual({ before: null, after: null }); + expect(result.data).toHaveLength(0); + expect(result.listMetadata).toEqual({ before: null, after: null }); }); it('passes pagination parameters', async () => { @@ -2003,13 +2133,54 @@ describe('Authorization', () => { expect(data[0].customAttributes).toEqual({}); }); + + it('defaults to desc order when order is not specified', async () => { + fetchOnce(listOrganizationMembershipsForResourceFixture); + + await workos.authorization.listMembershipsForResource({ + resourceId: testResourceId, + permissionSlug: 'documents:read', + }); + + expect(fetchSearchParams()).toMatchObject({ + order: 'desc', + }); + }); + + it('passes order asc when explicitly set', async () => { + fetchOnce(listOrganizationMembershipsForResourceFixture); + + await workos.authorization.listMembershipsForResource({ + resourceId: testResourceId, + permissionSlug: 'documents:read', + order: 'asc', + }); + + expect(fetchSearchParams()).toMatchObject({ + order: 'asc', + }); + }); + + it('passes order desc when explicitly set', async () => { + fetchOnce(listOrganizationMembershipsForResourceFixture); + + await workos.authorization.listMembershipsForResource({ + resourceId: testResourceId, + permissionSlug: 'documents:read', + order: 'desc', + }); + + expect(fetchSearchParams()).toMatchObject({ + order: 'desc', + }); + }); }); describe('listMembershipsForResourceByExternalId', () => { it('lists organization memberships for a resource by external ID', async () => { fetchOnce(listOrganizationMembershipsForResourceFixture); - const { data, object, listMetadata } = + const result = await workos.authorization.listMembershipsForResourceByExternalId({ organizationId: testOrgId, resourceTypeSlug: 'document', @@ -2023,9 +2194,8 @@ describe('Authorization', () => { expect(fetchSearchParams()).toMatchObject({ permission_slug: 'documents:read', }); - expect(object).toEqual('list'); - expect(data).toHaveLength(1); - expect(data[0]).toMatchObject({ + expect(result.data).toHaveLength(1); + expect(result.data[0]).toMatchObject({ object: 'organization_membership', id: 'om_01HXYZ123ABC456DEF789ABC', userId: 'user_01HXYZ123ABC456DEF789XYZ', @@ -2033,7 +2203,7 @@ describe('Authorization', () => { status: 'active', customAttributes: { department: 'Engineering', level: 'senior' }, }); - expect(listMetadata).toEqual({ + expect(result.listMetadata).toEqual({ before: null, after: 'om_01HXYZ123ABC456DEF789ABC', }); @@ -2095,5 +2265,52 @@ describe('Authorization', () => { assignment: 'direct', }); }); + + it('defaults to desc order when order is not specified', async () => { + fetchOnce(listOrganizationMembershipsForResourceFixture); + + await workos.authorization.listMembershipsForResourceByExternalId({ + organizationId: testOrgId, + resourceTypeSlug: 'document', + externalId: 'doc-456', + permissionSlug: 'documents:read', + }); + + expect(fetchSearchParams()).toMatchObject({ + order: 'desc', + }); + }); + + it('passes order asc when explicitly set', async () => { + fetchOnce(listOrganizationMembershipsForResourceFixture); + + await workos.authorization.listMembershipsForResourceByExternalId({ + organizationId: testOrgId, + resourceTypeSlug: 'document', + externalId: 'doc-456', + permissionSlug: 'documents:read', + order: 'asc', + }); + + expect(fetchSearchParams()).toMatchObject({ + order: 'asc', + }); + }); + + it('passes order desc when explicitly set', async () => { + fetchOnce(listOrganizationMembershipsForResourceFixture); + + await workos.authorization.listMembershipsForResourceByExternalId({ + organizationId: testOrgId, + resourceTypeSlug: 'document', + externalId: 'doc-456', + permissionSlug: 'documents:read', + order: 'desc', + }); + + expect(fetchSearchParams()).toMatchObject({ + order: 'desc', + }); + }); }); }); diff --git a/src/authorization/authorization.ts b/src/authorization/authorization.ts index 534a31e71..7db31e536 100644 --- a/src/authorization/authorization.ts +++ b/src/authorization/authorization.ts @@ -1,4 +1,6 @@ import { WorkOS } from '../workos'; +import { AutoPaginatable } from '../common/utils/pagination'; +import { fetchAndDeserialize } from '../common/utils/fetch-and-deserialize'; import { Role, RoleList, @@ -22,15 +24,11 @@ import { RemoveOrganizationRolePermissionOptions, Permission, PermissionResponse, - PermissionList, - PermissionListResponse, CreatePermissionOptions, UpdatePermissionOptions, ListPermissionsOptions, AuthorizationResource, AuthorizationResourceResponse, - AuthorizationResourceList, - AuthorizationResourceListResponse, ListAuthorizationResourcesOptions, GetAuthorizationResourceByExternalIdOptions, UpdateAuthorizationResourceByExternalIdOptions, @@ -45,8 +43,6 @@ import { RemoveRoleAssignmentOptions, RemoveRoleOptions, RoleAssignment, - RoleAssignmentList, - RoleAssignmentListResponse, RoleAssignmentResponse, ListMembershipsForResourceByExternalIdOptions, ListMembershipsForResourceOptions, @@ -76,8 +72,8 @@ import { serializeListResourcesForMembershipOptions, } from './serializers'; import { - AuthorizationOrganizationMembershipList, - AuthorizationOrganizationMembershipListResponse, + AuthorizationOrganizationMembership, + AuthorizationOrganizationMembershipResponse, } from '../user-management/interfaces/organization-membership.interface'; import { deserializeAuthorizationOrganizationMembership } from '../user-management/serializers/organization-membership.serializer'; @@ -242,19 +238,23 @@ export class Authorization { async listPermissions( options?: ListPermissionsOptions, - ): Promise { - const { data } = await this.workos.get( - '/authorization/permissions', - { query: options }, + ): Promise> { + return new AutoPaginatable( + await fetchAndDeserialize( + this.workos, + '/authorization/permissions', + deserializePermission, + options, + ), + (params) => + fetchAndDeserialize( + this.workos, + '/authorization/permissions', + deserializePermission, + params, + ), + options, ); - return { - object: 'list', - data: data.data.map(deserializePermission), - listMetadata: { - before: data.list_metadata.before, - after: data.list_metadata.after, - }, - }; } async getPermission(slug: string): Promise { @@ -321,19 +321,31 @@ export class Authorization { async listResources( options: ListAuthorizationResourcesOptions = {}, - ): Promise { - const { data } = await this.workos.get( - '/authorization/resources', - { query: serializeListAuthorizationResourcesOptions(options) }, + ): Promise> { + const serializedOptions = + serializeListAuthorizationResourcesOptions(options); + return new AutoPaginatable( + await fetchAndDeserialize< + AuthorizationResourceResponse, + AuthorizationResource + >( + this.workos, + '/authorization/resources', + deserializeAuthorizationResource, + serializedOptions, + ), + (params) => + fetchAndDeserialize< + AuthorizationResourceResponse, + AuthorizationResource + >( + this.workos, + '/authorization/resources', + deserializeAuthorizationResource, + params, + ), + serializedOptions, ); - return { - object: 'list', - data: data.data.map(deserializeAuthorizationResource), - listMetadata: { - before: data.list_metadata.before, - after: data.list_metadata.after, - }, - }; } async getResourceByExternalId( @@ -385,20 +397,25 @@ export class Authorization { async listRoleAssignments( options: ListRoleAssignmentsOptions, - ): Promise { + ): Promise> { const { organizationMembershipId, ...queryOptions } = options; - const { data } = await this.workos.get( - `/authorization/organization_memberships/${organizationMembershipId}/role_assignments`, - { query: queryOptions }, + const endpoint = `/authorization/organization_memberships/${organizationMembershipId}/role_assignments`; + return new AutoPaginatable( + await fetchAndDeserialize( + this.workos, + endpoint, + deserializeRoleAssignment, + queryOptions, + ), + (params) => + fetchAndDeserialize( + this.workos, + endpoint, + deserializeRoleAssignment, + params, + ), + queryOptions, ); - return { - object: 'list', - data: data.data.map(deserializeRoleAssignment), - listMetadata: { - before: data.list_metadata.before, - after: data.list_metadata.after, - }, - }; } async assignRole(options: AssignRoleOptions): Promise { @@ -426,63 +443,89 @@ export class Authorization { async listResourcesForMembership( options: ListResourcesForMembershipOptions, - ): Promise { + ): Promise> { const { organizationMembershipId } = options; - const { data } = await this.workos.get( - `/authorization/organization_memberships/${organizationMembershipId}/resources`, - { - query: serializeListResourcesForMembershipOptions(options), - }, + const endpoint = `/authorization/organization_memberships/${organizationMembershipId}/resources`; + const serializedOptions = + serializeListResourcesForMembershipOptions(options); + return new AutoPaginatable( + await fetchAndDeserialize< + AuthorizationResourceResponse, + AuthorizationResource + >( + this.workos, + endpoint, + deserializeAuthorizationResource, + serializedOptions, + ), + (params) => + fetchAndDeserialize< + AuthorizationResourceResponse, + AuthorizationResource + >(this.workos, endpoint, deserializeAuthorizationResource, params), + serializedOptions, ); - return { - object: 'list', - data: data.data.map(deserializeAuthorizationResource), - listMetadata: { - before: data.list_metadata.before, - after: data.list_metadata.after, - }, - }; } async listMembershipsForResource( options: ListMembershipsForResourceOptions, - ): Promise { + ): Promise> { const { resourceId } = options; - const { data } = - await this.workos.get( - `/authorization/resources/${resourceId}/organization_memberships`, - { - query: serializeListMembershipsForResourceOptions(options), - }, - ); - return { - object: 'list', - data: data.data.map(deserializeAuthorizationOrganizationMembership), - listMetadata: { - before: data.list_metadata.before, - after: data.list_metadata.after, - }, - }; + const endpoint = `/authorization/resources/${resourceId}/organization_memberships`; + const serializedOptions = + serializeListMembershipsForResourceOptions(options); + return new AutoPaginatable( + await fetchAndDeserialize< + AuthorizationOrganizationMembershipResponse, + AuthorizationOrganizationMembership + >( + this.workos, + endpoint, + deserializeAuthorizationOrganizationMembership, + serializedOptions, + ), + (params) => + fetchAndDeserialize< + AuthorizationOrganizationMembershipResponse, + AuthorizationOrganizationMembership + >( + this.workos, + endpoint, + deserializeAuthorizationOrganizationMembership, + params, + ), + serializedOptions, + ); } async listMembershipsForResourceByExternalId( options: ListMembershipsForResourceByExternalIdOptions, - ): Promise { + ): Promise> { const { organizationId, resourceTypeSlug, externalId } = options; - const { data } = - await this.workos.get( - `/authorization/organizations/${organizationId}/resources/${resourceTypeSlug}/${externalId}/organization_memberships`, - { - query: serializeListMembershipsForResourceOptions(options), - }, - ); - return { - object: 'list', - data: data.data.map(deserializeAuthorizationOrganizationMembership), - listMetadata: { - before: data.list_metadata.before, - after: data.list_metadata.after, - }, - }; + const endpoint = `/authorization/organizations/${organizationId}/resources/${resourceTypeSlug}/${externalId}/organization_memberships`; + const serializedOptions = + serializeListMembershipsForResourceOptions(options); + return new AutoPaginatable( + await fetchAndDeserialize< + AuthorizationOrganizationMembershipResponse, + AuthorizationOrganizationMembership + >( + this.workos, + endpoint, + deserializeAuthorizationOrganizationMembership, + serializedOptions, + ), + (params) => + fetchAndDeserialize< + AuthorizationOrganizationMembershipResponse, + AuthorizationOrganizationMembership + >( + this.workos, + endpoint, + deserializeAuthorizationOrganizationMembership, + params, + ), + serializedOptions, + ); } } From b30f336020b48ac2fafcd9abb316ee5f5688c261 Mon Sep 17 00:00:00 2001 From: Swaroop Akkineni Date: Tue, 14 Apr 2026 22:26:14 -0400 Subject: [PATCH 2/9] cleanup --- src/authorization/authorization.spec.ts | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/src/authorization/authorization.spec.ts b/src/authorization/authorization.spec.ts index 02a1e9665..1252fa5da 100644 --- a/src/authorization/authorization.spec.ts +++ b/src/authorization/authorization.spec.ts @@ -1241,8 +1241,9 @@ describe('Authorization', () => { parentResourceId: 'resource_01HXYZ123ABC456DEF789XYZ', }); - expect(fetchSearchParams()).toMatchObject({ + expect(fetchSearchParams()).toEqual({ parent_resource_id: 'resource_01HXYZ123ABC456DEF789XYZ', + order: 'desc', }); }); @@ -1254,9 +1255,10 @@ describe('Authorization', () => { parentExternalId: 'folder-123', }); - expect(fetchSearchParams()).toMatchObject({ + expect(fetchSearchParams()).toEqual({ parent_resource_type_slug: 'folder', parent_external_id: 'folder-123', + order: 'desc', }); }); @@ -1267,8 +1269,9 @@ describe('Authorization', () => { search: 'Budget', }); - expect(fetchSearchParams()).toMatchObject({ + expect(fetchSearchParams()).toEqual({ search: 'Budget', + order: 'desc', }); }); From 7c6eeb8fb12e3f6e4b040ccd625527dc1318a1c1 Mon Sep 17 00:00:00 2001 From: Swaroop Akkineni Date: Tue, 14 Apr 2026 22:28:23 -0400 Subject: [PATCH 3/9] moar --- .../authorization-resource.interface.ts | 20 +------------------ .../interfaces/permission.interface.ts | 20 +------------------ .../interfaces/role-assignment.interface.ts | 20 +------------------ .../organization-membership.interface.ts | 20 +------------------ 4 files changed, 4 insertions(+), 76 deletions(-) diff --git a/src/authorization/interfaces/authorization-resource.interface.ts b/src/authorization/interfaces/authorization-resource.interface.ts index 51cfc6d0f..170a80bfe 100644 --- a/src/authorization/interfaces/authorization-resource.interface.ts +++ b/src/authorization/interfaces/authorization-resource.interface.ts @@ -66,22 +66,4 @@ export interface UpdateAuthorizationResourceOptions { 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; - }; -} +} \ No newline at end of file diff --git a/src/authorization/interfaces/permission.interface.ts b/src/authorization/interfaces/permission.interface.ts index 0af2b6da0..76b433fd4 100644 --- a/src/authorization/interfaces/permission.interface.ts +++ b/src/authorization/interfaces/permission.interface.ts @@ -20,22 +20,4 @@ export interface PermissionResponse { system: boolean; created_at: string; updated_at: string; -} - -export interface PermissionList { - object: 'list'; - data: Permission[]; - listMetadata: { - before: string | null; - after: string | null; - }; -} - -export interface PermissionListResponse { - object: 'list'; - data: PermissionResponse[]; - list_metadata: { - before: string | null; - after: string | null; - }; -} +} \ No newline at end of file diff --git a/src/authorization/interfaces/role-assignment.interface.ts b/src/authorization/interfaces/role-assignment.interface.ts index 83167ed9c..3d3bf0f57 100644 --- a/src/authorization/interfaces/role-assignment.interface.ts +++ b/src/authorization/interfaces/role-assignment.interface.ts @@ -30,22 +30,4 @@ export interface RoleAssignmentResponse { resource: RoleAssignmentResourceResponse; created_at: string; updated_at: string; -} - -export interface RoleAssignmentList { - object: 'list'; - data: RoleAssignment[]; - listMetadata: { - before: string | null; - after: string | null; - }; -} - -export interface RoleAssignmentListResponse { - object: 'list'; - data: RoleAssignmentResponse[]; - list_metadata: { - before: string | null; - after: string | null; - }; -} +} \ No newline at end of file diff --git a/src/user-management/interfaces/organization-membership.interface.ts b/src/user-management/interfaces/organization-membership.interface.ts index 287b3d5ca..d302b88d4 100644 --- a/src/user-management/interfaces/organization-membership.interface.ts +++ b/src/user-management/interfaces/organization-membership.interface.ts @@ -41,22 +41,4 @@ export interface OrganizationMembershipResponse extends BaseOrganizationMembersh } export type AuthorizationOrganizationMembershipResponse = - BaseOrganizationMembershipResponse; - -export interface AuthorizationOrganizationMembershipList { - object: 'list'; - data: AuthorizationOrganizationMembership[]; - listMetadata: { - before: string | null; - after: string | null; - }; -} - -export interface AuthorizationOrganizationMembershipListResponse { - object: 'list'; - data: AuthorizationOrganizationMembershipResponse[]; - list_metadata: { - before: string | null; - after: string | null; - }; -} + BaseOrganizationMembershipResponse; \ No newline at end of file From 43986b49997ae917fb9459f29c903cf3c7179f18 Mon Sep 17 00:00:00 2001 From: Swaroop Akkineni Date: Tue, 14 Apr 2026 22:33:35 -0400 Subject: [PATCH 4/9] cleanup --- .../interfaces/authorization-resource.interface.ts | 2 +- src/authorization/interfaces/permission.interface.ts | 2 +- src/authorization/interfaces/role-assignment.interface.ts | 2 +- .../interfaces/organization-membership.interface.ts | 3 ++- 4 files changed, 5 insertions(+), 4 deletions(-) diff --git a/src/authorization/interfaces/authorization-resource.interface.ts b/src/authorization/interfaces/authorization-resource.interface.ts index 170a80bfe..9af08050a 100644 --- a/src/authorization/interfaces/authorization-resource.interface.ts +++ b/src/authorization/interfaces/authorization-resource.interface.ts @@ -66,4 +66,4 @@ export interface UpdateAuthorizationResourceOptions { export interface SerializedUpdateAuthorizationResourceOptions { name?: string; description?: string | null; -} \ No newline at end of file +} diff --git a/src/authorization/interfaces/permission.interface.ts b/src/authorization/interfaces/permission.interface.ts index 76b433fd4..8c6774a78 100644 --- a/src/authorization/interfaces/permission.interface.ts +++ b/src/authorization/interfaces/permission.interface.ts @@ -20,4 +20,4 @@ export interface PermissionResponse { system: boolean; created_at: string; updated_at: string; -} \ No newline at end of file +} diff --git a/src/authorization/interfaces/role-assignment.interface.ts b/src/authorization/interfaces/role-assignment.interface.ts index 3d3bf0f57..1589b6813 100644 --- a/src/authorization/interfaces/role-assignment.interface.ts +++ b/src/authorization/interfaces/role-assignment.interface.ts @@ -30,4 +30,4 @@ export interface RoleAssignmentResponse { resource: RoleAssignmentResourceResponse; created_at: string; updated_at: string; -} \ No newline at end of file +} diff --git a/src/user-management/interfaces/organization-membership.interface.ts b/src/user-management/interfaces/organization-membership.interface.ts index d302b88d4..aec06e692 100644 --- a/src/user-management/interfaces/organization-membership.interface.ts +++ b/src/user-management/interfaces/organization-membership.interface.ts @@ -41,4 +41,5 @@ export interface OrganizationMembershipResponse extends BaseOrganizationMembersh } export type AuthorizationOrganizationMembershipResponse = - BaseOrganizationMembershipResponse; \ No newline at end of file + BaseOrganizationMembershipResponse; + \ No newline at end of file From e1e0ed43abff816a01602601e41e0b9eb87316c0 Mon Sep 17 00:00:00 2001 From: Swaroop Akkineni Date: Tue, 14 Apr 2026 22:34:40 -0400 Subject: [PATCH 5/9] cleanup --- .../interfaces/organization-membership.interface.ts | 1 - 1 file changed, 1 deletion(-) diff --git a/src/user-management/interfaces/organization-membership.interface.ts b/src/user-management/interfaces/organization-membership.interface.ts index aec06e692..7e1ad39a5 100644 --- a/src/user-management/interfaces/organization-membership.interface.ts +++ b/src/user-management/interfaces/organization-membership.interface.ts @@ -42,4 +42,3 @@ export interface OrganizationMembershipResponse extends BaseOrganizationMembersh export type AuthorizationOrganizationMembershipResponse = BaseOrganizationMembershipResponse; - \ No newline at end of file From 1c265277d91fd2afebc2d6d57223c186da567fd1 Mon Sep 17 00:00:00 2001 From: Swaroop Akkineni Date: Tue, 14 Apr 2026 23:01:22 -0400 Subject: [PATCH 6/9] adding back list assertion --- src/authorization/authorization.spec.ts | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/src/authorization/authorization.spec.ts b/src/authorization/authorization.spec.ts index 1252fa5da..4ec6e85c7 100644 --- a/src/authorization/authorization.spec.ts +++ b/src/authorization/authorization.spec.ts @@ -571,6 +571,7 @@ describe('Authorization', () => { const result = await workos.authorization.listPermissions(); expect(fetchURL()).toContain('/authorization/permissions'); + expect(result.object).toEqual('list'); expect(result.data).toHaveLength(2); expect(result.data).toEqual( expect.arrayContaining([ @@ -1177,6 +1178,7 @@ describe('Authorization', () => { const result = await workos.authorization.listResources(); expect(fetchURL()).toContain('/authorization/resources'); + expect(result.object).toEqual('list'); expect(result.data).toHaveLength(2); expect(result.data).toEqual( expect.arrayContaining([ @@ -1644,6 +1646,7 @@ describe('Authorization', () => { expect(fetchURL()).toContain( `/authorization/organization_memberships/${testOrgMembershipId}/role_assignments`, ); + expect(result.object).toEqual('list'); expect(result.data).toHaveLength(1); expect(result.data[0]).toMatchObject({ object: 'role_assignment', @@ -1919,6 +1922,7 @@ describe('Authorization', () => { permission_slug: 'document:read', parent_resource_id: testResourceId, }); + expect(result.object).toEqual('list'); expect(result.data).toHaveLength(2); expect(result.data[0]).toMatchObject({ object: 'authorization_resource', @@ -2049,6 +2053,7 @@ describe('Authorization', () => { expect(fetchSearchParams()).toMatchObject({ permission_slug: 'documents:read', }); + expect(result.object).toEqual('list'); expect(result.data).toHaveLength(1); expect(result.data[0]).toMatchObject({ object: 'organization_membership', @@ -2077,6 +2082,7 @@ describe('Authorization', () => { permissionSlug: 'documents:read', }); + expect(result.object).toEqual('list'); expect(result.data).toHaveLength(0); expect(result.listMetadata).toEqual({ before: null, after: null }); }); @@ -2197,6 +2203,7 @@ describe('Authorization', () => { expect(fetchSearchParams()).toMatchObject({ permission_slug: 'documents:read', }); + expect(result.object).toEqual('list'); expect(result.data).toHaveLength(1); expect(result.data[0]).toMatchObject({ object: 'organization_membership', From c1497e205189e6639eebf0ce2d88e693dd013d7d Mon Sep 17 00:00:00 2001 From: "Garen J. Torikian" Date: Fri, 17 Apr 2026 13:59:35 -0500 Subject: [PATCH 7/9] fix: Use consistent result variable style in listMembershipsForResource tests Co-Authored-By: Claude Opus 4.6 (1M context) --- src/authorization/authorization.spec.ts | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/authorization/authorization.spec.ts b/src/authorization/authorization.spec.ts index 4ec6e85c7..4b145b468 100644 --- a/src/authorization/authorization.spec.ts +++ b/src/authorization/authorization.spec.ts @@ -2135,12 +2135,12 @@ describe('Authorization', () => { }; fetchOnce(fixtureWithoutCustomAttrs); - const { data } = await workos.authorization.listMembershipsForResource({ + const result = await workos.authorization.listMembershipsForResource({ resourceId: testResourceId, permissionSlug: 'documents:read', }); - expect(data[0].customAttributes).toEqual({}); + expect(result.data[0].customAttributes).toEqual({}); }); it('defaults to desc order when order is not specified', async () => { From ab604687782fad96ec967671ddd0c65d51a7887b Mon Sep 17 00:00:00 2001 From: Aaron Tainter Date: Fri, 17 Apr 2026 12:38:04 -0700 Subject: [PATCH 8/9] Add listEffectivePermissions methods --- src/authorization/authorization.spec.ts | 178 ++++++++++++++++++ src/authorization/authorization.ts | 51 +++++ .../fixtures/list-effective-permissions.json | 31 +++ src/authorization/interfaces/index.ts | 2 + ...ssions-by-external-id-options.interface.ts | 9 + ...effective-permissions-options.interface.ts | 6 + src/authorization/serializers/index.ts | 1 + ...ffective-permissions-options.serializer.ts | 13 ++ 8 files changed, 291 insertions(+) create mode 100644 src/authorization/fixtures/list-effective-permissions.json create mode 100644 src/authorization/interfaces/list-effective-permissions-by-external-id-options.interface.ts create mode 100644 src/authorization/interfaces/list-effective-permissions-options.interface.ts create mode 100644 src/authorization/serializers/list-effective-permissions-options.serializer.ts diff --git a/src/authorization/authorization.spec.ts b/src/authorization/authorization.spec.ts index 4b145b468..49a7c469b 100644 --- a/src/authorization/authorization.spec.ts +++ b/src/authorization/authorization.spec.ts @@ -17,6 +17,7 @@ import listResourcesFixture from './fixtures/list-resources.json'; import roleAssignmentFixture from './fixtures/role-assignment.json'; import listRoleAssignmentsFixture from './fixtures/list-role-assignments.json'; import listOrganizationMembershipsForResourceFixture from './fixtures/list-organization-memberships-for-resource.json'; +import listEffectivePermissionsFixture from './fixtures/list-effective-permissions.json'; const workos = new WorkOS('sk_test_Sz3IQjepeSWaI4cMS4ms4sMuU'); const testOrgId = 'org_01HXYZ123ABC456DEF789ABC'; @@ -2323,4 +2324,181 @@ describe('Authorization', () => { }); }); }); + + describe('listEffectivePermissions', () => { + it('lists effective permissions for a membership on a resource', async () => { + fetchOnce(listEffectivePermissionsFixture); + + const result = await workos.authorization.listEffectivePermissions({ + organizationMembershipId: testOrgMembershipId, + resourceId: testResourceId, + }); + + expect(fetchURL()).toContain( + `/authorization/resources/${testResourceId}/organization_memberships/${testOrgMembershipId}/permissions`, + ); + expect(result.object).toEqual('list'); + expect(result.data).toHaveLength(2); + expect(result.data).toEqual( + expect.arrayContaining([ + expect.objectContaining({ + object: 'permission', + id: 'perm_01HXYZ123ABC456DEF789GHI', + slug: 'documents:read', + name: 'Read Documents', + resourceTypeSlug: 'document', + }), + expect.objectContaining({ + object: 'permission', + id: 'perm_01HXYZ123ABC456DEF789GHJ', + slug: 'documents:edit', + name: 'Edit Documents', + resourceTypeSlug: 'document', + }), + ]), + ); + expect(result.listMetadata).toEqual({ + before: null, + after: 'perm_01HXYZ123ABC456DEF789GHJ', + }); + }); + + it('passes pagination parameters', async () => { + fetchOnce(listEffectivePermissionsFixture); + + await workos.authorization.listEffectivePermissions({ + organizationMembershipId: testOrgMembershipId, + resourceId: testResourceId, + limit: 10, + after: 'perm_cursor123', + order: 'desc', + }); + + expect(fetchSearchParams()).toMatchObject({ + limit: '10', + after: 'perm_cursor123', + order: 'desc', + }); + }); + + it('passes before cursor for backward pagination', async () => { + fetchOnce(listEffectivePermissionsFixture); + + await workos.authorization.listEffectivePermissions({ + organizationMembershipId: testOrgMembershipId, + resourceId: testResourceId, + before: 'perm_cursor789', + order: 'asc', + }); + + expect(fetchSearchParams()).toMatchObject({ + before: 'perm_cursor789', + order: 'asc', + }); + }); + + it('defaults to desc order when order is not specified', async () => { + fetchOnce(listEffectivePermissionsFixture); + + await workos.authorization.listEffectivePermissions({ + organizationMembershipId: testOrgMembershipId, + resourceId: testResourceId, + }); + + expect(fetchSearchParams()).toMatchObject({ + order: 'desc', + }); + }); + }); + + describe('listEffectivePermissionsByExternalId', () => { + it('lists effective permissions for a membership on a resource by external ID', async () => { + fetchOnce(listEffectivePermissionsFixture); + + const result = + await workos.authorization.listEffectivePermissionsByExternalId({ + organizationMembershipId: testOrgMembershipId, + organizationId: testOrgId, + resourceTypeSlug: 'document', + externalId: 'doc-456', + }); + + expect(fetchURL()).toContain( + `/authorization/organizations/${testOrgId}/resources/document/doc-456/organization_memberships/${testOrgMembershipId}/permissions`, + ); + expect(result.object).toEqual('list'); + expect(result.data).toHaveLength(2); + expect(result.data).toEqual( + expect.arrayContaining([ + expect.objectContaining({ + object: 'permission', + slug: 'documents:read', + resourceTypeSlug: 'document', + }), + expect.objectContaining({ + object: 'permission', + slug: 'documents:edit', + resourceTypeSlug: 'document', + }), + ]), + ); + expect(result.listMetadata).toEqual({ + before: null, + after: 'perm_01HXYZ123ABC456DEF789GHJ', + }); + }); + + it('passes pagination parameters', async () => { + fetchOnce(listEffectivePermissionsFixture); + + await workos.authorization.listEffectivePermissionsByExternalId({ + organizationMembershipId: testOrgMembershipId, + organizationId: testOrgId, + resourceTypeSlug: 'document', + externalId: 'doc-456', + limit: 10, + after: 'perm_cursor123', + order: 'desc', + }); + + expect(fetchSearchParams()).toMatchObject({ + limit: '10', + after: 'perm_cursor123', + order: 'desc', + }); + }); + + it('passes before cursor for backward pagination', async () => { + fetchOnce(listEffectivePermissionsFixture); + + await workos.authorization.listEffectivePermissionsByExternalId({ + organizationMembershipId: testOrgMembershipId, + organizationId: testOrgId, + resourceTypeSlug: 'document', + externalId: 'doc-456', + before: 'perm_cursor789', + order: 'asc', + }); + + expect(fetchSearchParams()).toMatchObject({ + before: 'perm_cursor789', + order: 'asc', + }); + }); + + it('defaults to desc order when order is not specified', async () => { + fetchOnce(listEffectivePermissionsFixture); + + await workos.authorization.listEffectivePermissionsByExternalId({ + organizationMembershipId: testOrgMembershipId, + organizationId: testOrgId, + resourceTypeSlug: 'document', + externalId: 'doc-456', + }); + + expect(fetchSearchParams()).toMatchObject({ + order: 'desc', + }); + }); + }); }); diff --git a/src/authorization/authorization.ts b/src/authorization/authorization.ts index 7db31e536..bf3198710 100644 --- a/src/authorization/authorization.ts +++ b/src/authorization/authorization.ts @@ -47,6 +47,8 @@ import { ListMembershipsForResourceByExternalIdOptions, ListMembershipsForResourceOptions, ListResourcesForMembershipOptions, + ListEffectivePermissionsOptions, + ListEffectivePermissionsByExternalIdOptions, } from './interfaces'; import { deserializeEnvironmentRole, @@ -70,6 +72,7 @@ import { serializeRemoveRoleOptions, serializeListMembershipsForResourceOptions, serializeListResourcesForMembershipOptions, + serializeListEffectivePermissionsOptions, } from './serializers'; import { AuthorizationOrganizationMembership, @@ -528,4 +531,52 @@ export class Authorization { serializedOptions, ); } + + async listEffectivePermissions( + options: ListEffectivePermissionsOptions, + ): Promise> { + const { organizationMembershipId, resourceId } = options; + const endpoint = `/authorization/resources/${resourceId}/organization_memberships/${organizationMembershipId}/permissions`; + const serializedOptions = serializeListEffectivePermissionsOptions(options); + return new AutoPaginatable( + await fetchAndDeserialize( + this.workos, + endpoint, + deserializePermission, + serializedOptions, + ), + (params) => + fetchAndDeserialize( + this.workos, + endpoint, + deserializePermission, + params, + ), + serializedOptions, + ); + } + + async listEffectivePermissionsByExternalId( + options: ListEffectivePermissionsByExternalIdOptions, + ): Promise> { + const { organizationMembershipId, organizationId, resourceTypeSlug, externalId } = options; + const endpoint = `/authorization/organizations/${organizationId}/resources/${resourceTypeSlug}/${externalId}/organization_memberships/${organizationMembershipId}/permissions`; + const serializedOptions = serializeListEffectivePermissionsOptions(options); + return new AutoPaginatable( + await fetchAndDeserialize( + this.workos, + endpoint, + deserializePermission, + serializedOptions, + ), + (params) => + fetchAndDeserialize( + this.workos, + endpoint, + deserializePermission, + params, + ), + serializedOptions, + ); + } } diff --git a/src/authorization/fixtures/list-effective-permissions.json b/src/authorization/fixtures/list-effective-permissions.json new file mode 100644 index 000000000..f56dca244 --- /dev/null +++ b/src/authorization/fixtures/list-effective-permissions.json @@ -0,0 +1,31 @@ +{ + "object": "list", + "data": [ + { + "object": "permission", + "id": "perm_01HXYZ123ABC456DEF789GHI", + "slug": "documents:read", + "name": "Read Documents", + "description": "Allows reading documents", + "resource_type_slug": "document", + "system": false, + "created_at": "2024-01-15T08:00:00.000Z", + "updated_at": "2024-01-15T08:00:00.000Z" + }, + { + "object": "permission", + "id": "perm_01HXYZ123ABC456DEF789GHJ", + "slug": "documents:edit", + "name": "Edit Documents", + "description": "Allows editing documents", + "resource_type_slug": "document", + "system": false, + "created_at": "2024-01-15T09:00:00.000Z", + "updated_at": "2024-01-15T09:00:00.000Z" + } + ], + "list_metadata": { + "before": null, + "after": "perm_01HXYZ123ABC456DEF789GHJ" + } +} diff --git a/src/authorization/interfaces/index.ts b/src/authorization/interfaces/index.ts index a42183cd9..2a89427a6 100644 --- a/src/authorization/interfaces/index.ts +++ b/src/authorization/interfaces/index.ts @@ -28,3 +28,5 @@ export * from './list-role-assignments-options.interface'; export * from './assign-role-options.interface'; export * from './remove-role-options.interface'; export * from './remove-role-assignment-options.interface'; +export * from './list-effective-permissions-options.interface'; +export * from './list-effective-permissions-by-external-id-options.interface'; diff --git a/src/authorization/interfaces/list-effective-permissions-by-external-id-options.interface.ts b/src/authorization/interfaces/list-effective-permissions-by-external-id-options.interface.ts new file mode 100644 index 000000000..80a6dbe01 --- /dev/null +++ b/src/authorization/interfaces/list-effective-permissions-by-external-id-options.interface.ts @@ -0,0 +1,9 @@ +import { PaginationOptions } from '../../common/interfaces/pagination-options.interface'; + +export interface ListEffectivePermissionsByExternalIdOptions + extends PaginationOptions { + organizationMembershipId: string; + organizationId: string; + resourceTypeSlug: string; + externalId: string; +} diff --git a/src/authorization/interfaces/list-effective-permissions-options.interface.ts b/src/authorization/interfaces/list-effective-permissions-options.interface.ts new file mode 100644 index 000000000..583aaf719 --- /dev/null +++ b/src/authorization/interfaces/list-effective-permissions-options.interface.ts @@ -0,0 +1,6 @@ +import { PaginationOptions } from '../../common/interfaces/pagination-options.interface'; + +export interface ListEffectivePermissionsOptions extends PaginationOptions { + organizationMembershipId: string; + resourceId: string; +} diff --git a/src/authorization/serializers/index.ts b/src/authorization/serializers/index.ts index 8efbfd5e6..ed09c6570 100644 --- a/src/authorization/serializers/index.ts +++ b/src/authorization/serializers/index.ts @@ -18,3 +18,4 @@ export * from './list-memberships-for-resource-options.serializer'; export * from './role-assignment.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-effective-permissions-options.serializer.ts b/src/authorization/serializers/list-effective-permissions-options.serializer.ts new file mode 100644 index 000000000..15c2ae2e0 --- /dev/null +++ b/src/authorization/serializers/list-effective-permissions-options.serializer.ts @@ -0,0 +1,13 @@ +import { serializePaginationOptions } from '../../common/serializers'; +import { ListEffectivePermissionsOptions } from '../interfaces/list-effective-permissions-options.interface'; +import { ListEffectivePermissionsByExternalIdOptions } from '../interfaces/list-effective-permissions-by-external-id-options.interface'; + +type ListEffectivePermissionsQueryOptions = + | ListEffectivePermissionsOptions + | ListEffectivePermissionsByExternalIdOptions; + +export const serializeListEffectivePermissionsOptions = ( + options: ListEffectivePermissionsQueryOptions, +): Record => ({ + ...serializePaginationOptions(options), +}); From d249bf5d5b8472bc1cd12c3a06fd42803f30c616 Mon Sep 17 00:00:00 2001 From: Aaron Tainter Date: Fri, 17 Apr 2026 12:44:50 -0700 Subject: [PATCH 9/9] prettier --- src/authorization/authorization.ts | 7 ++++++- ...fective-permissions-by-external-id-options.interface.ts | 3 +-- 2 files changed, 7 insertions(+), 3 deletions(-) diff --git a/src/authorization/authorization.ts b/src/authorization/authorization.ts index bf3198710..fe394d610 100644 --- a/src/authorization/authorization.ts +++ b/src/authorization/authorization.ts @@ -559,7 +559,12 @@ export class Authorization { async listEffectivePermissionsByExternalId( options: ListEffectivePermissionsByExternalIdOptions, ): Promise> { - const { organizationMembershipId, organizationId, resourceTypeSlug, externalId } = options; + const { + organizationMembershipId, + organizationId, + resourceTypeSlug, + externalId, + } = options; const endpoint = `/authorization/organizations/${organizationId}/resources/${resourceTypeSlug}/${externalId}/organization_memberships/${organizationMembershipId}/permissions`; const serializedOptions = serializeListEffectivePermissionsOptions(options); return new AutoPaginatable( diff --git a/src/authorization/interfaces/list-effective-permissions-by-external-id-options.interface.ts b/src/authorization/interfaces/list-effective-permissions-by-external-id-options.interface.ts index 80a6dbe01..7bff1d6b9 100644 --- a/src/authorization/interfaces/list-effective-permissions-by-external-id-options.interface.ts +++ b/src/authorization/interfaces/list-effective-permissions-by-external-id-options.interface.ts @@ -1,7 +1,6 @@ import { PaginationOptions } from '../../common/interfaces/pagination-options.interface'; -export interface ListEffectivePermissionsByExternalIdOptions - extends PaginationOptions { +export interface ListEffectivePermissionsByExternalIdOptions extends PaginationOptions { organizationMembershipId: string; organizationId: string; resourceTypeSlug: string;