From accf4fefdfe35906d74cef216b6ea951ca8b99c6 Mon Sep 17 00:00:00 2001 From: Claudiu Zalinca Date: Fri, 17 Apr 2026 08:19:36 +0100 Subject: [PATCH 1/2] [FSMCPB-164692]: Add new event V1.GET_ORG_DATA --- CHANGELOG.md | 9 ++++++++ package-lock.json | 4 ++-- package.json | 2 +- src/ShellEvents.ts | 2 ++ src/index.ts | 16 ++++++++++++-- src/models/index.ts | 19 +++++++++++++++-- .../org-data/get-org-data-request.model.ts | 5 +++++ .../org-data/get-org-data-response.model.ts | 7 +++++++ src/models/org-data/index.ts | 4 ++++ .../org-data/org-data-filter-key.enum.ts | 4 ++++ src/models/org-data/org-level.model.ts | 21 +++++++++++++++++++ 11 files changed, 86 insertions(+), 7 deletions(-) create mode 100644 src/models/org-data/get-org-data-request.model.ts create mode 100644 src/models/org-data/get-org-data-response.model.ts create mode 100644 src/models/org-data/index.ts create mode 100644 src/models/org-data/org-data-filter-key.enum.ts create mode 100644 src/models/org-data/org-level.model.ts diff --git a/CHANGELOG.md b/CHANGELOG.md index 01842dd..0813744 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -5,6 +5,15 @@ All notable changes to this project will be documented in this file. The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/), and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html). +## [1.27.0] - 2026-04-09 + +### Added + +- Add new event `V1.GET_ORG_DATA` for fetching organisation level hierarchy data +- Define new models `OrgLevel`, `OrgLevelAllocation`, `GetOrgDataRequest`, `GetOrgDataResponse` +- Define new type `OrgLevelAllocationRole` +- Define new enum `OrgDataFilterKey` with filter keys: `all`, `current_user` + ## [1.26.1] - 2026-03-31 ### Changed diff --git a/package-lock.json b/package-lock.json index c697c20..6498fd0 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,12 +1,12 @@ { "name": "fsm-shell", - "version": "1.26.1", + "version": "1.27.0", "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "fsm-shell", - "version": "1.26.1", + "version": "1.27.0", "license": "Apache-2.0", "devDependencies": { "@types/jasmine": "^3.5.12", diff --git a/package.json b/package.json index b459098..82877ed 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "fsm-shell", - "version": "1.26.1", + "version": "1.27.0", "description": "client library for FSM shell", "main": "release/fsm-shell-client.js", "module": "release/fsm-shell-client.es.js", diff --git a/src/ShellEvents.ts b/src/ShellEvents.ts index a760542..0e5b9a6 100644 --- a/src/ShellEvents.ts +++ b/src/ShellEvents.ts @@ -17,6 +17,7 @@ export type EventType = | 'V1.TO_APP' | 'V1.LOADING_SUCCESS' | 'V1.GET_FEATURE_FLAG' + | 'V1.GET_ORG_DATA' | 'V1.PRIVATE.GET_ACCOUNT_SETTINGS' | 'V1.OUTLET.ADD_PLUGIN' | 'V1.OUTLET.REMOVE_PLUGIN' @@ -44,6 +45,7 @@ export const SHELL_EVENTS = { RESTORE_TITLE: 'V1.RESTORE_TITLE', TO_APP: 'V1.TO_APP', GET_FEATURE_FLAG: 'V1.GET_FEATURE_FLAG', + GET_ORG_DATA: 'V1.GET_ORG_DATA', PRIVATE: { GET_ACCOUNT_SETTINGS: 'V1.PRIVATE.GET_ACCOUNT_SETTINGS', }, diff --git a/src/index.ts b/src/index.ts index e7f5d68..b14d459 100644 --- a/src/index.ts +++ b/src/index.ts @@ -29,10 +29,16 @@ import { GetFeatureFlagResponse, GetItemRequest, GetItemResponse, + GetOrgDataRequest, + GetOrgDataResponse, ModalCloseRequest, ModalOpenRequest, ModalOpenRequestV2, ModalSize, + OrgDataFilterKey, + OrgLevel, + OrgLevelAllocation, + OrgLevelAllocationRole, Outlet, OutletsDeleteAssignmentRequest, OutletsDeleteAssignmentResponse, @@ -57,7 +63,7 @@ import { SetViewStateResponse, TraceEntry, UiPermissions, - ValidationMode + ValidationMode, } from './models/index'; export { @@ -71,10 +77,16 @@ export { GetFeatureFlagResponse, GetItemRequest, GetItemResponse, + GetOrgDataRequest, + GetOrgDataResponse, ModalCloseRequest, ModalOpenRequest, ModalOpenRequestV2, ModalSize, + OrgDataFilterKey, + OrgLevel, + OrgLevelAllocation, + OrgLevelAllocationRole, Outlet, OutletsDeleteAssignmentRequest, OutletsDeleteAssignmentResponse, @@ -99,5 +111,5 @@ export { SetViewStateResponse, TraceEntry, UiPermissions, - ValidationMode + ValidationMode, }; diff --git a/src/models/index.ts b/src/models/index.ts index 40808e8..b4b4242 100644 --- a/src/models/index.ts +++ b/src/models/index.ts @@ -1,7 +1,13 @@ export { PermissionRequest } from './permissions/permission-request.model'; export { PermissionResponse } from './permissions/permission-response.model'; -export { PermissionRequestV2, PermissionRequestV2Payload } from './permissions/permission-request.v2.model'; -export { PermissionRequestV3, PermissionRequestV3Payload } from './permissions/permission-request.v3.model'; +export { + PermissionRequestV2, + PermissionRequestV2Payload, +} from './permissions/permission-request.v2.model'; +export { + PermissionRequestV3, + PermissionRequestV3Payload, +} from './permissions/permission-request.v3.model'; export { PermissionResponseV3 } from './permissions/permission-response.v3.model'; export { Permission } from './permissions/permission.model'; export { UiPermissions } from './permissions/ui-permissions.model'; @@ -27,6 +33,15 @@ export { GetFeatureFlagRequest } from './feature-flag/get-feature-flag-request.m export { GetFeatureFlagsRequest } from './feature-flag/get-feature-flag-request.model'; export { GetFeatureFlagResponse } from './feature-flag/get-feature-flag-response.model'; +export { OrgDataFilterKey } from './org-data/org-data-filter-key.enum'; +export { + OrgLevel, + OrgLevelAllocation, + OrgLevelAllocationRole, +} from './org-data/org-level.model'; +export { GetOrgDataRequest } from './org-data/get-org-data-request.model'; +export { GetOrgDataResponse } from './org-data/get-org-data-response.model'; + export { SetViewStateRequest } from './view-state/set-view-state-request.model'; export { SetViewStateResponse } from './view-state/set-view-state-response.model'; diff --git a/src/models/org-data/get-org-data-request.model.ts b/src/models/org-data/get-org-data-request.model.ts new file mode 100644 index 0000000..c56dc8d --- /dev/null +++ b/src/models/org-data/get-org-data-request.model.ts @@ -0,0 +1,5 @@ +import { OrgDataFilterKey } from './org-data-filter-key.enum'; + +export interface GetOrgDataRequest { + key: OrgDataFilterKey; +} diff --git a/src/models/org-data/get-org-data-response.model.ts b/src/models/org-data/get-org-data-response.model.ts new file mode 100644 index 0000000..ad10a17 --- /dev/null +++ b/src/models/org-data/get-org-data-response.model.ts @@ -0,0 +1,7 @@ +import { OrgDataFilterKey } from './org-data-filter-key.enum'; +import { OrgLevel, OrgLevelAllocation } from './org-level.model'; + +export interface GetOrgDataResponse { + key: OrgDataFilterKey; + data: OrgLevel | OrgLevelAllocation[]; +} diff --git a/src/models/org-data/index.ts b/src/models/org-data/index.ts new file mode 100644 index 0000000..d41360e --- /dev/null +++ b/src/models/org-data/index.ts @@ -0,0 +1,4 @@ +export { OrgDataFilterKey } from './org-data-filter-key.enum'; +export { OrgLevel } from './org-level.model'; +export { GetOrgDataRequest } from './get-org-data-request.model'; +export { GetOrgDataResponse } from './get-org-data-response.model'; diff --git a/src/models/org-data/org-data-filter-key.enum.ts b/src/models/org-data/org-data-filter-key.enum.ts new file mode 100644 index 0000000..0f41a15 --- /dev/null +++ b/src/models/org-data/org-data-filter-key.enum.ts @@ -0,0 +1,4 @@ +export enum OrgDataFilterKey { + CURRENT_USER = 'current_user', + ALL = 'all', +} diff --git a/src/models/org-data/org-level.model.ts b/src/models/org-data/org-level.model.ts new file mode 100644 index 0000000..06927ea --- /dev/null +++ b/src/models/org-data/org-level.model.ts @@ -0,0 +1,21 @@ +export interface OrgLevel { + id: string; + externalId: string | null; + name: string; + shortDescription: string | null; + longDescription: string | null; + validFrom: string | null; + validTo: string | null; + status: 'ENABLED' | 'DISABLED'; + subLevels?: OrgLevel[]; +} + +export type OrgLevelAllocationRole = 'MEMBER' | 'MANAGER'; + +export interface OrgLevelAllocation { + id: string; + externalId: string | null; + level: Omit; + role: OrgLevelAllocationRole; + unifiedPersonId: string; +} From 07377a7e88345366216c454bfd735fe686a0ece1 Mon Sep 17 00:00:00 2001 From: Claudiu Zalinca Date: Mon, 20 Apr 2026 10:27:03 +0100 Subject: [PATCH 2/2] add validation schemas --- .../get-org-data-request.v1.schema.ts | 10 +++ .../get-org-data-response.v1.schema.ts | 64 +++++++++++++++++++ src/validation/schemas/schemas.spec.ts | 60 +++++++++++++++++ 3 files changed, 134 insertions(+) create mode 100644 src/validation/schemas/org-data/get-org-data-request.v1.schema.ts create mode 100644 src/validation/schemas/org-data/get-org-data-response.v1.schema.ts diff --git a/src/validation/schemas/org-data/get-org-data-request.v1.schema.ts b/src/validation/schemas/org-data/get-org-data-request.v1.schema.ts new file mode 100644 index 0000000..b5ec7f1 --- /dev/null +++ b/src/validation/schemas/org-data/get-org-data-request.v1.schema.ts @@ -0,0 +1,10 @@ +export const getOrgDataRequest_v1_schema = { + type: 'object', + properties: { + key: { + type: 'string', + enum: ['current_user', 'all'], + }, + }, + required: ['key'], +}; diff --git a/src/validation/schemas/org-data/get-org-data-response.v1.schema.ts b/src/validation/schemas/org-data/get-org-data-response.v1.schema.ts new file mode 100644 index 0000000..cdb3d0a --- /dev/null +++ b/src/validation/schemas/org-data/get-org-data-response.v1.schema.ts @@ -0,0 +1,64 @@ +export const getOrgDataResponse_v1_schema = { + $defs: { + orgLevel: { + type: 'object', + properties: { + id: { type: 'string' }, + externalId: { type: ['string', 'null'] }, + name: { type: 'string' }, + shortDescription: { type: ['string', 'null'] }, + longDescription: { type: ['string', 'null'] }, + validFrom: { type: ['string', 'null'] }, + validTo: { type: ['string', 'null'] }, + status: { type: 'string', enum: ['ENABLED', 'DISABLED'] }, + subLevels: { + type: 'array', + items: { $ref: '#/$defs/orgLevel' }, + }, + }, + required: ['id', 'name', 'status'], + }, + orgLevelWithoutSubLevels: { + type: 'object', + properties: { + id: { type: 'string' }, + externalId: { type: ['string', 'null'] }, + name: { type: 'string' }, + shortDescription: { type: ['string', 'null'] }, + longDescription: { type: ['string', 'null'] }, + validFrom: { type: ['string', 'null'] }, + validTo: { type: ['string', 'null'] }, + status: { type: 'string', enum: ['ENABLED', 'DISABLED'] }, + }, + required: ['id', 'name', 'status'], + }, + orgLevelAllocation: { + type: 'object', + properties: { + id: { type: 'string' }, + externalId: { type: ['string', 'null'] }, + level: { $ref: '#/$defs/orgLevelWithoutSubLevels' }, + role: { type: 'string', enum: ['MEMBER', 'MANAGER'] }, + unifiedPersonId: { type: 'string' }, + }, + required: ['id', 'level', 'role', 'unifiedPersonId'], + }, + }, + type: 'object', + properties: { + key: { + type: 'string', + enum: ['current_user', 'all'], + }, + data: { + oneOf: [ + { $ref: '#/$defs/orgLevel' }, + { + type: 'array', + items: { $ref: '#/$defs/orgLevelAllocation' }, + }, + ], + }, + }, + required: ['key', 'data'], +}; diff --git a/src/validation/schemas/schemas.spec.ts b/src/validation/schemas/schemas.spec.ts index 082f5f8..ac0df5c 100644 --- a/src/validation/schemas/schemas.spec.ts +++ b/src/validation/schemas/schemas.spec.ts @@ -42,6 +42,9 @@ import { outletsRemovePluginRequest_v1_schema } from './outlets/outlets-remove-p import { outletsRequestDynamicContextRequest_v1_schema } from './outlets/outlets-request-dynamic-context-request.v1.schema'; import { outletsRequestDynamicContextResponse_v1_schema } from './outlets/outlets-request-dynamic-context-response.v1.schema'; +import { getOrgDataRequest_v1_schema } from './org-data/get-org-data-request.v1.schema'; +import { getOrgDataResponse_v1_schema } from './org-data/get-org-data-response.v1.schema'; + // Valid objects for each schema export const validAuthRequest_v1 = { response_type: 'token' }; export const validAuthResponse_v1 = { access_token: 'string', expires_in: 123, token_type: 'string' }; @@ -139,6 +142,50 @@ export const validOutletsRequestDynamicContextResponse_v1 = { assignmentId: 'string' }] }; +export const validGetOrgDataRequest_v1 = { key: 'current_user' }; +export const validGetOrgDataResponse_v1_orgLevel = { + key: 'all', + data: { + id: 'level-1', + externalId: 'ext-1', + name: 'Root Level', + shortDescription: 'Root', + longDescription: 'Root Level Description', + validFrom: '2024-01-01', + validTo: null, + status: 'ENABLED', + subLevels: [{ + id: 'level-2', + externalId: 'ext-2', + name: 'Child Level', + shortDescription: 'Child', + longDescription: 'Child Level Description', + validFrom: '2024-01-01', + validTo: null, + status: 'ENABLED', + subLevels: [] + }] + } +}; +export const validGetOrgDataResponse_v1_allocations = { + key: 'current_user', + data: [{ + id: 'alloc-1', + externalId: 'ext-alloc-1', + level: { + id: 'level-1', + externalId: 'ext-1', + name: 'Root Level', + shortDescription: null, + longDescription: null, + validFrom: null, + validTo: null, + status: 'ENABLED' + }, + role: 'MEMBER', + unifiedPersonId: 'bff35ef6-ee07-4292-9bdd-3ca5de50314f' + }] +}; // Invalid objects for each schema export const invalidAuthRequest_v1 = { response_type: 123 }; @@ -230,6 +277,10 @@ export const invalidOutletsRequestDynamicContextResponse_v1 = { assignmentId: 123 }] }; +export const invalidGetOrgDataRequest_v1 = { key: 'invalid_key' }; +export const invalidGetOrgDataResponse_v1_wrongKeyType = { key: 123, data: {} }; +export const invalidGetOrgDataResponse_v1_missingData = { key: 'all' }; +export const invalidGetOrgDataResponse_v1_invalidStatus = { key: 'all', data: { id: 'level-1', name: 'Root', status: 'INVALID_STATUS' } }; describe('Schemas', () => { @@ -283,6 +334,8 @@ describe('Schemas', () => { validateSchemaHelper(ajv, 'outletsAddPluginRequest_v1_schema', outletsAddPluginRequest_v1_schema); validateSchemaHelper(ajv, 'outletsRemovePluginRequest_v1_schema', outletsRemovePluginRequest_v1_schema); validateSchemaHelper(ajv, 'outletsRequestDynamicContextRequest_v1_schema', outletsRequestDynamicContextRequest_v1_schema); + validateSchemaHelper(ajv, 'getOrgDataRequest_v1_schema', getOrgDataRequest_v1_schema); + validateSchemaHelper(ajv, 'getOrgDataResponse_v1_schema', getOrgDataResponse_v1_schema); } function validateSchemasSupportingOnly06and07(ajv: Ajv.Ajv) { @@ -347,6 +400,9 @@ describe('Schemas', () => { validateValidDataAgainstSchemaHelper(ajv, 'outletsAddPluginRequest_v1_schema', outletsAddPluginRequest_v1_schema, validOutletsAddPluginRequest_v1); validateValidDataAgainstSchemaHelper(ajv, 'outletsRemovePluginRequest_v1_schema', outletsRemovePluginRequest_v1_schema, validOutletsRemovePluginRequest_v1); validateValidDataAgainstSchemaHelper(ajv, 'outletsRequestDynamicContextRequest_v1_schema', outletsRequestDynamicContextRequest_v1_schema, validOutletsRequestDynamicContextRequest_v1); + validateValidDataAgainstSchemaHelper(ajv, 'getOrgDataRequest_v1_schema', getOrgDataRequest_v1_schema, validGetOrgDataRequest_v1); + validateValidDataAgainstSchemaHelper(ajv, 'getOrgDataResponse_v1_schema', getOrgDataResponse_v1_schema, validGetOrgDataResponse_v1_orgLevel); + validateValidDataAgainstSchemaHelper(ajv, 'getOrgDataResponse_v1_schema', getOrgDataResponse_v1_schema, validGetOrgDataResponse_v1_allocations); } function validateValidDataAgainstSchemaSupportingOnly06and07(ajv: Ajv.Ajv) { @@ -400,6 +456,10 @@ describe('Schemas', () => { validateInvalidDataAgainstSchemaHelper(ajv, 'outletsAddPluginRequest_v1_schema', outletsAddPluginRequest_v1_schema, invalidOutletsAddPluginRequest_v1); validateInvalidDataAgainstSchemaHelper(ajv, 'outletsRemovePluginRequest_v1_schema', outletsRemovePluginRequest_v1_schema, invalidOutletsRemovePluginRequest_v1); validateInvalidDataAgainstSchemaHelper(ajv, 'outletsRequestDynamicContextRequest_v1_schema', outletsRequestDynamicContextRequest_v1_schema, invalidOutletsRequestDynamicContextRequest_v1); + validateInvalidDataAgainstSchemaHelper(ajv, 'getOrgDataRequest_v1_schema', getOrgDataRequest_v1_schema, invalidGetOrgDataRequest_v1); + validateInvalidDataAgainstSchemaHelper(ajv, 'getOrgDataResponse_v1_schema', getOrgDataResponse_v1_schema, invalidGetOrgDataResponse_v1_wrongKeyType); + validateInvalidDataAgainstSchemaHelper(ajv, 'getOrgDataResponse_v1_schema', getOrgDataResponse_v1_schema, invalidGetOrgDataResponse_v1_missingData); + validateInvalidDataAgainstSchemaHelper(ajv, 'getOrgDataResponse_v1_schema', getOrgDataResponse_v1_schema, invalidGetOrgDataResponse_v1_invalidStatus); } function validateInvalidDataAgainstSchemaSupportingOnly06and07(ajv: Ajv.Ajv) {