From 26f4bb86f74f1bf3f1a0828a80529239e5f0755e Mon Sep 17 00:00:00 2001 From: tanya732 Date: Mon, 21 Jul 2025 15:11:40 +0530 Subject: [PATCH 1/2] Feat: Added support for Customize Device Remembrance --- src/management/__generated/index.ts | 2 + src/management/__generated/managers/index.ts | 1 + .../managers/risk-assessments-manager.ts | 109 ++++++++++++++++++ src/management/__generated/models/index.ts | 60 ++++++++++ 4 files changed, 172 insertions(+) create mode 100644 src/management/__generated/managers/risk-assessments-manager.ts diff --git a/src/management/__generated/index.ts b/src/management/__generated/index.ts index d18f11e09..4768d53a1 100644 --- a/src/management/__generated/index.ts +++ b/src/management/__generated/index.ts @@ -28,6 +28,7 @@ import { PromptsManager, RefreshTokensManager, ResourceServersManager, + RiskAssessmentsManager, RolesManager, RulesManager, RulesConfigsManager, @@ -71,6 +72,7 @@ export abstract class ManagementClientBase { public readonly prompts = new PromptsManager(this.configuration); public readonly refreshTokens = new RefreshTokensManager(this.configuration); public readonly resourceServers = new ResourceServersManager(this.configuration); + public readonly riskAssessments = new RiskAssessmentsManager(this.configuration); public readonly roles = new RolesManager(this.configuration); public readonly rules = new RulesManager(this.configuration); public readonly rulesConfigs = new RulesConfigsManager(this.configuration); diff --git a/src/management/__generated/managers/index.ts b/src/management/__generated/managers/index.ts index a8623cb22..b356857d1 100644 --- a/src/management/__generated/managers/index.ts +++ b/src/management/__generated/managers/index.ts @@ -24,6 +24,7 @@ export * from './organizations-manager.js'; export * from './prompts-manager.js'; export * from './refresh-tokens-manager.js'; export * from './resource-servers-manager.js'; +export * from './risk-assessments-manager.js'; export * from './roles-manager.js'; export * from './rules-manager.js'; export * from './rules-configs-manager.js'; diff --git a/src/management/__generated/managers/risk-assessments-manager.ts b/src/management/__generated/managers/risk-assessments-manager.ts new file mode 100644 index 000000000..7a080647a --- /dev/null +++ b/src/management/__generated/managers/risk-assessments-manager.ts @@ -0,0 +1,109 @@ +import * as runtime from '../../../lib/runtime.js'; +import type { InitOverride, ApiResponse } from '../../../lib/runtime.js'; +import type { + GetRiskAssessmentsSettingsNewDeviceResponseContent, + GetRiskAssessmentsSettingsResponseContent, + UpdateRiskAssessmentsSettingsNewDeviceRequestContent, + UpdateRiskAssessmentsSettingsNewDeviceResponseContent, + UpdateRiskAssessmentsSettingsRequestContent, + UpdateRiskAssessmentsSettingsResponseContent, +} from '../models/index.js'; + +const { BaseAPI } = runtime; + +/** + * + */ +export class RiskAssessmentsManager extends BaseAPI { + /** + * Gets the risk assessment settings for the new device assessor + * + * @throws {RequiredError} + */ + async getNewDeviceSettings( + initOverrides?: InitOverride + ): Promise> { + const response = await this.request( + { + path: `/risk-assessments/settings/new-device`, + method: 'GET', + }, + initOverrides + ); + + return runtime.JSONApiResponse.fromResponse(response); + } + + /** + * Gets the tenant settings for risk assessments + * Get risk assessment settings + * + * @throws {RequiredError} + */ + async getSettings( + initOverrides?: InitOverride + ): Promise> { + const response = await this.request( + { + path: `/risk-assessments/settings`, + method: 'GET', + }, + initOverrides + ); + + return runtime.JSONApiResponse.fromResponse(response); + } + + /** + * Updates the risk assessment settings for the new device assessor + * + * @throws {RequiredError} + */ + async updateNewDeviceSettings( + bodyParameters: UpdateRiskAssessmentsSettingsNewDeviceRequestContent, + initOverrides?: InitOverride + ): Promise> { + const headerParameters: runtime.HTTPHeaders = {}; + + headerParameters['Content-Type'] = 'application/json'; + + const response = await this.request( + { + path: `/risk-assessments/settings/new-device`, + method: 'PATCH', + headers: headerParameters, + body: bodyParameters, + }, + initOverrides + ); + + return runtime.JSONApiResponse.fromResponse(response); + } + + /** + * Updates the tenant settings for risk assessments + * Updates risk assessment settings + * + * @throws {RequiredError} + */ + async updateSettings( + bodyParameters: UpdateRiskAssessmentsSettingsRequestContent, + initOverrides?: InitOverride + ): Promise> { + const headerParameters: runtime.HTTPHeaders = {}; + + headerParameters['Content-Type'] = 'application/json'; + + const response = await this.request( + { + path: `/risk-assessments/settings`, + method: 'PATCH', + headers: headerParameters, + body: bodyParameters, + }, + initOverrides + ); + + return runtime.JSONApiResponse.fromResponse(response); + } +} diff --git a/src/management/__generated/models/index.ts b/src/management/__generated/models/index.ts index 0a47f140b..e908741da 100644 --- a/src/management/__generated/models/index.ts +++ b/src/management/__generated/models/index.ts @@ -8391,6 +8391,26 @@ export interface GetResourceServers200ResponseOneOf { */ resource_servers: Array; } +/** + * + */ +export interface GetRiskAssessmentsSettingsNewDeviceResponseContent { + /** + * Length of time to remember devices for, in days. + * + */ + remember_for: number; +} +/** + * + */ +export interface GetRiskAssessmentsSettingsResponseContent { + /** + * Whether or not risk assessment is enabled. + * + */ + enabled: boolean; +} /** * */ @@ -17762,6 +17782,46 @@ export const UpdatePhoneProviderRequestNameEnum = { export type UpdatePhoneProviderRequestNameEnum = (typeof UpdatePhoneProviderRequestNameEnum)[keyof typeof UpdatePhoneProviderRequestNameEnum]; +/** + * + */ +export interface UpdateRiskAssessmentsSettingsNewDeviceRequestContent { + /** + * Length of time to remember devices for, in days. + * + */ + remember_for: number; +} +/** + * + */ +export interface UpdateRiskAssessmentsSettingsNewDeviceResponseContent { + /** + * Length of time to remember devices for, in days. + * + */ + remember_for: number; +} +/** + * + */ +export interface UpdateRiskAssessmentsSettingsRequestContent { + /** + * Whether or not risk assessment is enabled. + * + */ + enabled: boolean; +} +/** + * + */ +export interface UpdateRiskAssessmentsSettingsResponseContent { + /** + * Whether or not risk assessment is enabled. + * + */ + enabled: boolean; +} /** * */ From fe63ccfb0e2e7860507c39e7fedca9214f0cbf6b Mon Sep 17 00:00:00 2001 From: tanya732 Date: Mon, 28 Jul 2025 15:07:51 +0530 Subject: [PATCH 2/2] Added test cases --- .../__generated/managers/users-manager.ts | 34 +++++++++++ src/management/__generated/models/index.ts | 34 +++++++++++ .../risk-assessments-manager.test.ts | 56 +++++++++++++++++++ test/management/users.test.ts | 52 +++++++++++++++++ 4 files changed, 176 insertions(+) create mode 100644 test/management/risk-assessments-manager.test.ts diff --git a/src/management/__generated/managers/users-manager.ts b/src/management/__generated/managers/users-manager.ts index 142647eed..03ab9dbf4 100644 --- a/src/management/__generated/managers/users-manager.ts +++ b/src/management/__generated/managers/users-manager.ts @@ -1,6 +1,7 @@ import * as runtime from '../../../lib/runtime.js'; import type { InitOverride, ApiResponse } from '../../../lib/runtime.js'; import type { + ClearAssessorsRequestContent, DeletePermissionsRequest, DeleteUserIdentityByUserId200ResponseInner, DeleteUserRolesRequest, @@ -64,6 +65,7 @@ import type { PatchAuthenticationMethodsByAuthenticationMethodIdOperationRequest, PatchUsersByIdRequest, PostAuthenticationMethodsOperationRequest, + PostClearAssessorsRequest, PostIdentitiesOperationRequest, PostInvalidateRememberBrowserRequest, PostPermissionsOperationRequest, @@ -1069,6 +1071,38 @@ export class UsersManager extends BaseAPI { return runtime.JSONApiResponse.fromResponse(response); } + /** + * Clear risk assessment assessors for a specific user + * + * @throws {RequiredError} + */ + async clearRiskAssessors( + requestParameters: PostClearAssessorsRequest, + bodyParameters: ClearAssessorsRequestContent, + initOverrides?: InitOverride + ): Promise> { + runtime.validateRequiredRequestParams(requestParameters, ['id']); + + const headerParameters: runtime.HTTPHeaders = {}; + + headerParameters['Content-Type'] = 'application/json'; + + const response = await this.request( + { + path: `/users/{id}/risk-assessments/clear`.replace( + '{id}', + encodeURIComponent(String(requestParameters.id)) + ), + method: 'POST', + headers: headerParameters, + body: bodyParameters, + }, + initOverrides + ); + + return runtime.VoidApiResponse.fromResponse(response); + } + /** * Link two user accounts together forming a primary and secondary relationship. On successful linking, the endpoint returns the new array of the primary account identities. * diff --git a/src/management/__generated/models/index.ts b/src/management/__generated/models/index.ts index 398d7f2bb..ea7b66649 100644 --- a/src/management/__generated/models/index.ts +++ b/src/management/__generated/models/index.ts @@ -8,6 +8,15 @@ export interface ActionsDraftUpdate { */ update_draft?: boolean; } + +/** + * + */ +export const AssessorsTypeEnum = { + new_device: 'new-device', +} as const; +export type AssessorsTypeEnum = (typeof AssessorsTypeEnum)[keyof typeof AssessorsTypeEnum]; + /** * Certificate information. This object is relevant only for Custom Domains with Auth0-Managed Certificates. */ @@ -50,6 +59,21 @@ export const CertificateCertificateAuthorityEnum = { export type CertificateCertificateAuthorityEnum = (typeof CertificateCertificateAuthorityEnum)[keyof typeof CertificateCertificateAuthorityEnum]; +/** + * + */ +export interface ClearAssessorsRequestContent { + /** + * The name of the connection containing the user whose assessors should be cleared. + * + */ + connection: string; + /** + * List of assessors to clear. + * + */ + assessors: Array; +} /** * */ @@ -23062,6 +23086,16 @@ export interface PostAuthenticationMethodsOperationRequest { */ id: string; } +/** + * + */ +export interface PostClearAssessorsRequest { + /** + * ID of the user to clear assessors for. + * + */ + id: string; +} /** * */ diff --git a/test/management/risk-assessments-manager.test.ts b/test/management/risk-assessments-manager.test.ts new file mode 100644 index 000000000..0b63c08f1 --- /dev/null +++ b/test/management/risk-assessments-manager.test.ts @@ -0,0 +1,56 @@ +import { + RiskAssessmentsManager, + ManagementClient, + UpdateRiskAssessmentsSettingsRequestContent, + UpdateRiskAssessmentsSettingsNewDeviceRequestContent, +} from '../../src/index.js'; + +import { checkMethod } from './tests.util.js'; + +const DOMAIN = `tenant.auth0.com`; +const token = 'TOKEN'; + +describe('RiskAssessmentsManager', () => { + const riskAssessmentsManager: RiskAssessmentsManager = new ManagementClient({ + domain: DOMAIN, + token, + }).riskAssessments; + + describe('getSetting', () => { + const operation = riskAssessmentsManager.getSettings(); + const uri = `/risk-assessments/settings`; + const method = 'get'; + + checkMethod({ operation, uri, method }); + }); + + describe('updateSettings', () => { + const requestBody: UpdateRiskAssessmentsSettingsRequestContent = { + enabled: true, + }; + const operation = riskAssessmentsManager.updateSettings(requestBody); + const uri = `/risk-assessments/settings`; + const method = 'patch'; + + checkMethod({ operation, uri, method }); + }); + + describe('getNewDeviceSettings', () => { + const operation = riskAssessmentsManager.getNewDeviceSettings(); + const uri = `/risk-assessments/settings/new-device`; + const method = 'get'; + + checkMethod({ operation, uri, method }); + }); + + describe('updateNewDeviceSettings', () => { + const requestParameters: UpdateRiskAssessmentsSettingsNewDeviceRequestContent = { + remember_for: 10, + }; + const operation = riskAssessmentsManager.updateNewDeviceSettings(requestParameters); + const uri = `/risk-assessments/settings/new-device`; + const method = 'patch'; + + checkMethod({ operation, uri, method }); + }); +}); diff --git a/test/management/users.test.ts b/test/management/users.test.ts index 1fb6071d1..5cb75e47d 100644 --- a/test/management/users.test.ts +++ b/test/management/users.test.ts @@ -10,6 +10,7 @@ import { DeleteMultifactorByProviderProviderEnum, ManagementClient, RequiredError, + ClearAssessorsRequestContent, } from '../../src/index.js'; describe('UsersManager', () => { @@ -1675,4 +1676,55 @@ describe('UsersManager', () => { expect(request.isDone()).toBe(true); }); }); + describe('#clearRiskAssessors', () => { + const data = { + id: 'USER_ID', + }; + + const body: ClearAssessorsRequestContent = { + connection: 'CONNECTION_ID', + assessors: ['new-device'], + }; + + let scope: nock.Scope; + + beforeEach(() => { + scope = nock(API_URL).post(`/users/${data.id}/risk-assessments/clear`).reply(200, {}); + }); + + it('should return a promise if no callback is given', (done) => { + expect(usersManager.clearRiskAssessors(data, body).then(() => done())).toBeInstanceOf( + Promise + ); + }); + + it('should pass any errors to the promise catch handler', async () => { + nock.cleanAll(); + + nock(API_URL).post(`/users/${data.id}/risk-assessments/clear`).reply(500, {}); + + try { + await usersManager.clearRiskAssessors(data, body); + } catch (err) { + expect(err).toBeDefined(); + } + }); + + it('should perform a POST request to /api/v2/users/:id/risk-assessments/clear', async () => { + await usersManager.clearRiskAssessors(data, body); + expect(scope.isDone()).toBe(true); + }); + + it('should include the token in the Authorization header', async () => { + nock.cleanAll(); + + const request = nock(API_URL) + .post(`/users/${data.id}/risk-assessments/clear`) + .matchHeader('Authorization', `Bearer ${token}`) + .reply(200, {}); + + await usersManager.clearRiskAssessors(data, body); + expect(request.isDone()).toBe(true); + }); + }); });