Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
9 changes: 9 additions & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down
4 changes: 2 additions & 2 deletions package-lock.json

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

2 changes: 1 addition & 1 deletion package.json
Original file line number Diff line number Diff line change
@@ -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",
Expand Down
2 changes: 2 additions & 0 deletions src/ShellEvents.ts
Original file line number Diff line number Diff line change
Expand Up @@ -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'
Expand Down Expand Up @@ -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',
},
Expand Down
16 changes: 14 additions & 2 deletions src/index.ts
Original file line number Diff line number Diff line change
Expand Up @@ -29,10 +29,16 @@ import {
GetFeatureFlagResponse,
GetItemRequest,
GetItemResponse,
GetOrgDataRequest,
GetOrgDataResponse,
ModalCloseRequest,
ModalOpenRequest,
ModalOpenRequestV2,
ModalSize,
OrgDataFilterKey,
OrgLevel,
OrgLevelAllocation,
OrgLevelAllocationRole,
Outlet,
OutletsDeleteAssignmentRequest,
OutletsDeleteAssignmentResponse,
Expand All @@ -57,7 +63,7 @@ import {
SetViewStateResponse,
TraceEntry,
UiPermissions,
ValidationMode
ValidationMode,
} from './models/index';

export {
Expand All @@ -71,10 +77,16 @@ export {
GetFeatureFlagResponse,
GetItemRequest,
GetItemResponse,
GetOrgDataRequest,
GetOrgDataResponse,
ModalCloseRequest,
ModalOpenRequest,
ModalOpenRequestV2,
ModalSize,
OrgDataFilterKey,
OrgLevel,
OrgLevelAllocation,
OrgLevelAllocationRole,
Outlet,
OutletsDeleteAssignmentRequest,
OutletsDeleteAssignmentResponse,
Expand All @@ -99,5 +111,5 @@ export {
SetViewStateResponse,
TraceEntry,
UiPermissions,
ValidationMode
ValidationMode,
};
19 changes: 17 additions & 2 deletions src/models/index.ts
Original file line number Diff line number Diff line change
@@ -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';
Expand All @@ -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';

Expand Down
5 changes: 5 additions & 0 deletions src/models/org-data/get-org-data-request.model.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
import { OrgDataFilterKey } from './org-data-filter-key.enum';

export interface GetOrgDataRequest {
key: OrgDataFilterKey;
}
7 changes: 7 additions & 0 deletions src/models/org-data/get-org-data-response.model.ts
Original file line number Diff line number Diff line change
@@ -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[];
}
4 changes: 4 additions & 0 deletions src/models/org-data/index.ts
Original file line number Diff line number Diff line change
@@ -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';
4 changes: 4 additions & 0 deletions src/models/org-data/org-data-filter-key.enum.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,4 @@
export enum OrgDataFilterKey {
CURRENT_USER = 'current_user',
ALL = 'all',
}
21 changes: 21 additions & 0 deletions src/models/org-data/org-level.model.ts
Original file line number Diff line number Diff line change
@@ -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<OrgLevel, 'subLevels'>;
role: OrgLevelAllocationRole;
unifiedPersonId: string;
}
10 changes: 10 additions & 0 deletions src/validation/schemas/org-data/get-org-data-request.v1.schema.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,10 @@
export const getOrgDataRequest_v1_schema = {
type: 'object',
properties: {
key: {
type: 'string',
enum: ['current_user', 'all'],
},
},
required: ['key'],
};
64 changes: 64 additions & 0 deletions src/validation/schemas/org-data/get-org-data-response.v1.schema.ts
Original file line number Diff line number Diff line change
@@ -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'],
};
60 changes: 60 additions & 0 deletions src/validation/schemas/schemas.spec.ts
Original file line number Diff line number Diff line change
Expand Up @@ -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' };
Expand Down Expand Up @@ -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 };
Expand Down Expand Up @@ -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', () => {

Expand Down Expand Up @@ -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) {
Expand Down Expand Up @@ -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) {
Expand Down Expand Up @@ -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) {
Expand Down
Loading