tm1npm 1.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.env.example +16 -0
- package/.eslintrc.js +28 -0
- package/.github/ISSUE_TEMPLATE/bug_report.md +36 -0
- package/.github/ISSUE_TEMPLATE/feature_request.md +20 -0
- package/.github/ISSUE_TEMPLATE/question.md +24 -0
- package/.github/workflows/publish-npm.yml +53 -0
- package/.github/workflows/test-on-tag.yml +172 -0
- package/DEVELOPMENT_GUIDE.md +587 -0
- package/LICENSE +21 -0
- package/README.md +580 -0
- package/jest.ci.config.js +83 -0
- package/jest.config.js +68 -0
- package/lib/exceptions/TM1Exception.d.ts +17 -0
- package/lib/exceptions/TM1Exception.d.ts.map +1 -0
- package/lib/exceptions/TM1Exception.js +36 -0
- package/lib/exceptions/TM1RestException.d.ts +10 -0
- package/lib/exceptions/TM1RestException.d.ts.map +1 -0
- package/lib/exceptions/TM1RestException.js +17 -0
- package/lib/exceptions/TM1TimeoutException.d.ts +9 -0
- package/lib/exceptions/TM1TimeoutException.d.ts.map +1 -0
- package/lib/exceptions/TM1TimeoutException.js +16 -0
- package/lib/index.d.ts +41 -0
- package/lib/index.d.ts.map +1 -0
- package/lib/index.js +132 -0
- package/lib/objects/Annotation.d.ts +36 -0
- package/lib/objects/Annotation.d.ts.map +1 -0
- package/lib/objects/Annotation.js +134 -0
- package/lib/objects/Application.d.ts +67 -0
- package/lib/objects/Application.d.ts.map +1 -0
- package/lib/objects/Application.js +125 -0
- package/lib/objects/Axis.d.ts +36 -0
- package/lib/objects/Axis.d.ts.map +1 -0
- package/lib/objects/Axis.js +103 -0
- package/lib/objects/Chore.d.ts +43 -0
- package/lib/objects/Chore.d.ts.map +1 -0
- package/lib/objects/Chore.js +129 -0
- package/lib/objects/ChoreFrequency.d.ts +23 -0
- package/lib/objects/ChoreFrequency.d.ts.map +1 -0
- package/lib/objects/ChoreFrequency.js +61 -0
- package/lib/objects/ChoreStartTime.d.ts +15 -0
- package/lib/objects/ChoreStartTime.d.ts.map +1 -0
- package/lib/objects/ChoreStartTime.js +85 -0
- package/lib/objects/ChoreTask.d.ts +28 -0
- package/lib/objects/ChoreTask.d.ts.map +1 -0
- package/lib/objects/ChoreTask.js +66 -0
- package/lib/objects/Cube.d.ts +26 -0
- package/lib/objects/Cube.d.ts.map +1 -0
- package/lib/objects/Cube.js +109 -0
- package/lib/objects/Dimension.d.ts +26 -0
- package/lib/objects/Dimension.d.ts.map +1 -0
- package/lib/objects/Dimension.js +86 -0
- package/lib/objects/Element.d.ts +35 -0
- package/lib/objects/Element.d.ts.map +1 -0
- package/lib/objects/Element.js +115 -0
- package/lib/objects/ElementAttribute.d.ts +28 -0
- package/lib/objects/ElementAttribute.d.ts.map +1 -0
- package/lib/objects/ElementAttribute.js +97 -0
- package/lib/objects/Git.d.ts +21 -0
- package/lib/objects/Git.d.ts.map +1 -0
- package/lib/objects/Git.js +49 -0
- package/lib/objects/GitCommit.d.ts +12 -0
- package/lib/objects/GitCommit.d.ts.map +1 -0
- package/lib/objects/GitCommit.js +26 -0
- package/lib/objects/GitPlan.d.ts +35 -0
- package/lib/objects/GitPlan.d.ts.map +1 -0
- package/lib/objects/GitPlan.js +78 -0
- package/lib/objects/GitRemote.d.ts +12 -0
- package/lib/objects/GitRemote.d.ts.map +1 -0
- package/lib/objects/GitRemote.js +26 -0
- package/lib/objects/Hierarchy.d.ts +47 -0
- package/lib/objects/Hierarchy.d.ts.map +1 -0
- package/lib/objects/Hierarchy.js +165 -0
- package/lib/objects/MDXView.d.ts +19 -0
- package/lib/objects/MDXView.d.ts.map +1 -0
- package/lib/objects/MDXView.js +67 -0
- package/lib/objects/NativeView.d.ts +39 -0
- package/lib/objects/NativeView.d.ts.map +1 -0
- package/lib/objects/NativeView.js +209 -0
- package/lib/objects/Process.d.ts +70 -0
- package/lib/objects/Process.d.ts.map +1 -0
- package/lib/objects/Process.js +210 -0
- package/lib/objects/ProcessDebugBreakpoint.d.ts +60 -0
- package/lib/objects/ProcessDebugBreakpoint.d.ts.map +1 -0
- package/lib/objects/ProcessDebugBreakpoint.js +168 -0
- package/lib/objects/ProcessParameter.d.ts +23 -0
- package/lib/objects/ProcessParameter.d.ts.map +1 -0
- package/lib/objects/ProcessParameter.js +55 -0
- package/lib/objects/ProcessVariable.d.ts +26 -0
- package/lib/objects/ProcessVariable.d.ts.map +1 -0
- package/lib/objects/ProcessVariable.js +63 -0
- package/lib/objects/Rules.d.ts +30 -0
- package/lib/objects/Rules.d.ts.map +1 -0
- package/lib/objects/Rules.js +103 -0
- package/lib/objects/Sandbox.d.ts +21 -0
- package/lib/objects/Sandbox.d.ts.map +1 -0
- package/lib/objects/Sandbox.js +64 -0
- package/lib/objects/Server.d.ts +27 -0
- package/lib/objects/Server.d.ts.map +1 -0
- package/lib/objects/Server.js +26 -0
- package/lib/objects/Subset.d.ts +44 -0
- package/lib/objects/Subset.d.ts.map +1 -0
- package/lib/objects/Subset.js +222 -0
- package/lib/objects/TM1Object.d.ts +8 -0
- package/lib/objects/TM1Object.d.ts.map +1 -0
- package/lib/objects/TM1Object.js +17 -0
- package/lib/objects/TM1Project.d.ts +74 -0
- package/lib/objects/TM1Project.d.ts.map +1 -0
- package/lib/objects/TM1Project.js +409 -0
- package/lib/objects/User.d.ts +42 -0
- package/lib/objects/User.d.ts.map +1 -0
- package/lib/objects/User.js +157 -0
- package/lib/objects/View.d.ts +19 -0
- package/lib/objects/View.d.ts.map +1 -0
- package/lib/objects/View.js +33 -0
- package/lib/objects/index.d.ts +30 -0
- package/lib/objects/index.d.ts.map +1 -0
- package/lib/objects/index.js +68 -0
- package/lib/services/AnnotationService.d.ts +17 -0
- package/lib/services/AnnotationService.d.ts.map +1 -0
- package/lib/services/AnnotationService.js +91 -0
- package/lib/services/ApplicationService.d.ts +21 -0
- package/lib/services/ApplicationService.d.ts.map +1 -0
- package/lib/services/ApplicationService.js +227 -0
- package/lib/services/AuditLogService.d.ts +15 -0
- package/lib/services/AuditLogService.d.ts.map +1 -0
- package/lib/services/AuditLogService.js +153 -0
- package/lib/services/CellService.d.ts +191 -0
- package/lib/services/CellService.d.ts.map +1 -0
- package/lib/services/CellService.js +597 -0
- package/lib/services/ChoreService.d.ts +24 -0
- package/lib/services/ChoreService.d.ts.map +1 -0
- package/lib/services/ChoreService.js +219 -0
- package/lib/services/ConfigurationService.d.ts +18 -0
- package/lib/services/ConfigurationService.d.ts.map +1 -0
- package/lib/services/ConfigurationService.js +60 -0
- package/lib/services/CubeService.d.ts +43 -0
- package/lib/services/CubeService.d.ts.map +1 -0
- package/lib/services/CubeService.js +296 -0
- package/lib/services/DimensionService.d.ts +21 -0
- package/lib/services/DimensionService.d.ts.map +1 -0
- package/lib/services/DimensionService.js +146 -0
- package/lib/services/ElementService.d.ts +132 -0
- package/lib/services/ElementService.d.ts.map +1 -0
- package/lib/services/ElementService.js +579 -0
- package/lib/services/FileService.d.ts +14 -0
- package/lib/services/FileService.d.ts.map +1 -0
- package/lib/services/FileService.js +65 -0
- package/lib/services/GitService.d.ts +23 -0
- package/lib/services/GitService.d.ts.map +1 -0
- package/lib/services/GitService.js +225 -0
- package/lib/services/HierarchyService.d.ts +32 -0
- package/lib/services/HierarchyService.d.ts.map +1 -0
- package/lib/services/HierarchyService.js +235 -0
- package/lib/services/JobService.d.ts +13 -0
- package/lib/services/JobService.d.ts.map +1 -0
- package/lib/services/JobService.js +83 -0
- package/lib/services/LoggerService.d.ts +16 -0
- package/lib/services/LoggerService.d.ts.map +1 -0
- package/lib/services/LoggerService.js +101 -0
- package/lib/services/ManageService.d.ts +47 -0
- package/lib/services/ManageService.d.ts.map +1 -0
- package/lib/services/ManageService.js +221 -0
- package/lib/services/MessageLogService.d.ts +13 -0
- package/lib/services/MessageLogService.d.ts.map +1 -0
- package/lib/services/MessageLogService.js +175 -0
- package/lib/services/MonitoringService.d.ts +29 -0
- package/lib/services/MonitoringService.d.ts.map +1 -0
- package/lib/services/MonitoringService.js +86 -0
- package/lib/services/ObjectService.d.ts +8 -0
- package/lib/services/ObjectService.d.ts.map +1 -0
- package/lib/services/ObjectService.js +20 -0
- package/lib/services/PowerBiService.d.ts +13 -0
- package/lib/services/PowerBiService.d.ts.map +1 -0
- package/lib/services/PowerBiService.js +52 -0
- package/lib/services/ProcessService.d.ts +57 -0
- package/lib/services/ProcessService.d.ts.map +1 -0
- package/lib/services/ProcessService.js +499 -0
- package/lib/services/RestService.d.ts +68 -0
- package/lib/services/RestService.d.ts.map +1 -0
- package/lib/services/RestService.js +166 -0
- package/lib/services/SandboxService.d.ts +28 -0
- package/lib/services/SandboxService.d.ts.map +1 -0
- package/lib/services/SandboxService.js +197 -0
- package/lib/services/SecurityService.d.ts +33 -0
- package/lib/services/SecurityService.d.ts.map +1 -0
- package/lib/services/SecurityService.js +249 -0
- package/lib/services/ServerService.d.ts +55 -0
- package/lib/services/ServerService.d.ts.map +1 -0
- package/lib/services/ServerService.js +247 -0
- package/lib/services/SessionService.d.ts +15 -0
- package/lib/services/SessionService.d.ts.map +1 -0
- package/lib/services/SessionService.js +68 -0
- package/lib/services/SubsetService.d.ts +13 -0
- package/lib/services/SubsetService.d.ts.map +1 -0
- package/lib/services/SubsetService.js +46 -0
- package/lib/services/TM1Service.d.ts +39 -0
- package/lib/services/TM1Service.d.ts.map +1 -0
- package/lib/services/TM1Service.js +94 -0
- package/lib/services/ThreadService.d.ts +15 -0
- package/lib/services/ThreadService.d.ts.map +1 -0
- package/lib/services/ThreadService.js +104 -0
- package/lib/services/TransactionLogService.d.ts +11 -0
- package/lib/services/TransactionLogService.d.ts.map +1 -0
- package/lib/services/TransactionLogService.js +124 -0
- package/lib/services/UserService.d.ts +14 -0
- package/lib/services/UserService.d.ts.map +1 -0
- package/lib/services/UserService.js +103 -0
- package/lib/services/ViewService.d.ts +30 -0
- package/lib/services/ViewService.d.ts.map +1 -0
- package/lib/services/ViewService.js +331 -0
- package/lib/services/index.d.ts +26 -0
- package/lib/services/index.d.ts.map +1 -0
- package/lib/services/index.js +56 -0
- package/lib/tests/100PercentParityCheck.test.d.ts +6 -0
- package/lib/tests/100PercentParityCheck.test.d.ts.map +1 -0
- package/lib/tests/100PercentParityCheck.test.js +143 -0
- package/lib/tests/basic.test.d.ts +6 -0
- package/lib/tests/basic.test.d.ts.map +1 -0
- package/lib/tests/basic.test.js +52 -0
- package/lib/tests/cellService.test.d.ts +6 -0
- package/lib/tests/cellService.test.d.ts.map +1 -0
- package/lib/tests/cellService.test.js +311 -0
- package/lib/tests/ciSetup.d.ts +6 -0
- package/lib/tests/ciSetup.d.ts.map +1 -0
- package/lib/tests/ciSetup.js +23 -0
- package/lib/tests/comprehensive.service.test.d.ts +6 -0
- package/lib/tests/comprehensive.service.test.d.ts.map +1 -0
- package/lib/tests/comprehensive.service.test.js +507 -0
- package/lib/tests/connection.test.d.ts +6 -0
- package/lib/tests/connection.test.d.ts.map +1 -0
- package/lib/tests/connection.test.js +89 -0
- package/lib/tests/cubeService.test.d.ts +6 -0
- package/lib/tests/cubeService.test.d.ts.map +1 -0
- package/lib/tests/cubeService.test.js +368 -0
- package/lib/tests/dimensionService.comprehensive.test.d.ts +7 -0
- package/lib/tests/dimensionService.comprehensive.test.d.ts.map +1 -0
- package/lib/tests/dimensionService.comprehensive.test.js +614 -0
- package/lib/tests/dimensionService.test.d.ts +6 -0
- package/lib/tests/dimensionService.test.d.ts.map +1 -0
- package/lib/tests/dimensionService.test.js +293 -0
- package/lib/tests/edgeCases.test.d.ts +6 -0
- package/lib/tests/edgeCases.test.d.ts.map +1 -0
- package/lib/tests/edgeCases.test.js +301 -0
- package/lib/tests/elementService.comprehensive.test.d.ts +7 -0
- package/lib/tests/elementService.comprehensive.test.d.ts.map +1 -0
- package/lib/tests/elementService.comprehensive.test.js +846 -0
- package/lib/tests/elementService.test.d.ts +6 -0
- package/lib/tests/elementService.test.d.ts.map +1 -0
- package/lib/tests/elementService.test.js +350 -0
- package/lib/tests/enhancedCellService.test.d.ts +2 -0
- package/lib/tests/enhancedCellService.test.d.ts.map +1 -0
- package/lib/tests/enhancedCellService.test.js +152 -0
- package/lib/tests/enhancedCubeService.test.d.ts +2 -0
- package/lib/tests/enhancedCubeService.test.d.ts.map +1 -0
- package/lib/tests/enhancedCubeService.test.js +246 -0
- package/lib/tests/enhancedElementService.test.d.ts +2 -0
- package/lib/tests/enhancedElementService.test.d.ts.map +1 -0
- package/lib/tests/enhancedElementService.test.js +199 -0
- package/lib/tests/enhancedViewService.test.d.ts +2 -0
- package/lib/tests/enhancedViewService.test.d.ts.map +1 -0
- package/lib/tests/enhancedViewService.test.js +260 -0
- package/lib/tests/errorHandling.test.d.ts +6 -0
- package/lib/tests/errorHandling.test.d.ts.map +1 -0
- package/lib/tests/errorHandling.test.js +227 -0
- package/lib/tests/exceptions.test.d.ts +7 -0
- package/lib/tests/exceptions.test.d.ts.map +1 -0
- package/lib/tests/exceptions.test.js +257 -0
- package/lib/tests/hierarchyService.test.d.ts +6 -0
- package/lib/tests/hierarchyService.test.d.ts.map +1 -0
- package/lib/tests/hierarchyService.test.js +294 -0
- package/lib/tests/index.test.d.ts +6 -0
- package/lib/tests/index.test.d.ts.map +1 -0
- package/lib/tests/index.test.js +346 -0
- package/lib/tests/integration.test.d.ts +6 -0
- package/lib/tests/integration.test.d.ts.map +1 -0
- package/lib/tests/integration.test.js +302 -0
- package/lib/tests/integrationTests.test.d.ts +2 -0
- package/lib/tests/integrationTests.test.d.ts.map +1 -0
- package/lib/tests/integrationTests.test.js +252 -0
- package/lib/tests/mdx.advanced.test.d.ts +6 -0
- package/lib/tests/mdx.advanced.test.d.ts.map +1 -0
- package/lib/tests/mdx.advanced.test.js +437 -0
- package/lib/tests/objects.improved.test.d.ts +7 -0
- package/lib/tests/objects.improved.test.d.ts.map +1 -0
- package/lib/tests/objects.improved.test.js +302 -0
- package/lib/tests/performance.test.d.ts +6 -0
- package/lib/tests/performance.test.d.ts.map +1 -0
- package/lib/tests/performance.test.js +264 -0
- package/lib/tests/processService.comprehensive.test.d.ts +7 -0
- package/lib/tests/processService.comprehensive.test.d.ts.map +1 -0
- package/lib/tests/processService.comprehensive.test.js +656 -0
- package/lib/tests/processService.test.d.ts +6 -0
- package/lib/tests/processService.test.d.ts.map +1 -0
- package/lib/tests/processService.test.js +322 -0
- package/lib/tests/restService.test.d.ts +6 -0
- package/lib/tests/restService.test.d.ts.map +1 -0
- package/lib/tests/restService.test.js +177 -0
- package/lib/tests/security.advanced.test.d.ts +6 -0
- package/lib/tests/security.advanced.test.d.ts.map +1 -0
- package/lib/tests/security.advanced.test.js +407 -0
- package/lib/tests/security.test.d.ts +6 -0
- package/lib/tests/security.test.d.ts.map +1 -0
- package/lib/tests/security.test.js +204 -0
- package/lib/tests/securityService.comprehensive.test.d.ts +7 -0
- package/lib/tests/securityService.comprehensive.test.d.ts.map +1 -0
- package/lib/tests/securityService.comprehensive.test.js +457 -0
- package/lib/tests/setup.d.ts +4 -0
- package/lib/tests/setup.d.ts.map +1 -0
- package/lib/tests/setup.js +40 -0
- package/lib/tests/simpleCoverage.test.d.ts +6 -0
- package/lib/tests/simpleCoverage.test.d.ts.map +1 -0
- package/lib/tests/simpleCoverage.test.js +236 -0
- package/lib/tests/stress.performance.test.d.ts +6 -0
- package/lib/tests/stress.performance.test.d.ts.map +1 -0
- package/lib/tests/stress.performance.test.js +423 -0
- package/lib/tests/subsetService.test.d.ts +6 -0
- package/lib/tests/subsetService.test.d.ts.map +1 -0
- package/lib/tests/subsetService.test.js +271 -0
- package/lib/tests/testConfig.d.ts +18 -0
- package/lib/tests/testConfig.d.ts.map +1 -0
- package/lib/tests/testConfig.js +38 -0
- package/lib/tests/testUtils.d.ts +9 -0
- package/lib/tests/testUtils.d.ts.map +1 -0
- package/lib/tests/testUtils.js +100 -0
- package/lib/tests/tm1Service.test.d.ts +7 -0
- package/lib/tests/tm1Service.test.d.ts.map +1 -0
- package/lib/tests/tm1Service.test.js +290 -0
- package/lib/tests/viewService.test.d.ts +6 -0
- package/lib/tests/viewService.test.d.ts.map +1 -0
- package/lib/tests/viewService.test.js +240 -0
- package/lib/utils/Utils.d.ts +90 -0
- package/lib/utils/Utils.d.ts.map +1 -0
- package/lib/utils/Utils.js +379 -0
- package/package.json +81 -0
- package/run-all-tests.js +296 -0
- package/src/exceptions/TM1Exception.ts +38 -0
- package/src/exceptions/TM1RestException.ts +17 -0
- package/src/exceptions/TM1TimeoutException.ts +15 -0
- package/src/index.ts +94 -0
- package/src/objects/Annotation.ts +194 -0
- package/src/objects/Application.ts +146 -0
- package/src/objects/Axis.ts +149 -0
- package/src/objects/Chore.ts +174 -0
- package/src/objects/ChoreFrequency.ts +83 -0
- package/src/objects/ChoreStartTime.ts +111 -0
- package/src/objects/ChoreTask.ts +92 -0
- package/src/objects/Cube.ts +125 -0
- package/src/objects/Dimension.ts +107 -0
- package/src/objects/Element.ts +153 -0
- package/src/objects/ElementAttribute.ts +115 -0
- package/src/objects/Git.ts +86 -0
- package/src/objects/GitCommit.ts +31 -0
- package/src/objects/GitPlan.ts +121 -0
- package/src/objects/GitRemote.ts +31 -0
- package/src/objects/Hierarchy.ts +229 -0
- package/src/objects/MDXView.ts +91 -0
- package/src/objects/NativeView.ts +268 -0
- package/src/objects/Process.ts +320 -0
- package/src/objects/ProcessDebugBreakpoint.ts +239 -0
- package/src/objects/ProcessParameter.ts +76 -0
- package/src/objects/ProcessVariable.ts +89 -0
- package/src/objects/Rules.ts +117 -0
- package/src/objects/Sandbox.ts +90 -0
- package/src/objects/Server.ts +45 -0
- package/src/objects/Subset.ts +323 -0
- package/src/objects/TM1Object.ts +17 -0
- package/src/objects/TM1Project.ts +587 -0
- package/src/objects/User.ts +198 -0
- package/src/objects/View.ts +43 -0
- package/src/objects/index.ts +36 -0
- package/src/services/AnnotationService.ts +107 -0
- package/src/services/ApplicationService.ts +279 -0
- package/src/services/AuditLogService.ts +172 -0
- package/src/services/CellService.ts +814 -0
- package/src/services/ChoreService.ts +219 -0
- package/src/services/ConfigurationService.ts +69 -0
- package/src/services/CubeService.ts +338 -0
- package/src/services/DimensionService.ts +168 -0
- package/src/services/ElementService.ts +966 -0
- package/src/services/FileService.ts +67 -0
- package/src/services/GitService.ts +324 -0
- package/src/services/HierarchyService.ts +284 -0
- package/src/services/JobService.ts +59 -0
- package/src/services/LoggerService.ts +118 -0
- package/src/services/ManageService.ts +322 -0
- package/src/services/MessageLogService.ts +211 -0
- package/src/services/MonitoringService.ts +105 -0
- package/src/services/ObjectService.ts +21 -0
- package/src/services/PowerBiService.ts +85 -0
- package/src/services/ProcessService.ts +589 -0
- package/src/services/RestService.ts +224 -0
- package/src/services/SandboxService.ts +217 -0
- package/src/services/SecurityService.ts +284 -0
- package/src/services/ServerService.ts +313 -0
- package/src/services/SessionService.ts +81 -0
- package/src/services/SubsetService.ts +52 -0
- package/src/services/TM1Service.ts +133 -0
- package/src/services/ThreadService.ts +83 -0
- package/src/services/TransactionLogService.ts +148 -0
- package/src/services/UserService.ts +77 -0
- package/src/services/ViewService.ts +398 -0
- package/src/services/index.ts +28 -0
- package/src/tests/100PercentParityCheck.test.ts +166 -0
- package/src/tests/basic.test.ts +59 -0
- package/src/tests/cellService.test.ts +405 -0
- package/src/tests/ciSetup.ts +26 -0
- package/src/tests/comprehensive.service.test.ts +653 -0
- package/src/tests/config.ini.template +23 -0
- package/src/tests/connection.test.ts +90 -0
- package/src/tests/cubeService.test.ts +458 -0
- package/src/tests/dimensionService.comprehensive.test.ts +786 -0
- package/src/tests/dimensionService.test.ts +373 -0
- package/src/tests/edgeCases.test.ts +358 -0
- package/src/tests/elementService.comprehensive.test.ts +1190 -0
- package/src/tests/elementService.test.ts +472 -0
- package/src/tests/enhancedCellService.test.ts +237 -0
- package/src/tests/enhancedCubeService.test.ts +384 -0
- package/src/tests/enhancedElementService.test.ts +301 -0
- package/src/tests/enhancedViewService.test.ts +373 -0
- package/src/tests/errorHandling.test.ts +264 -0
- package/src/tests/exceptions.test.ts +313 -0
- package/src/tests/hierarchyService.test.ts +386 -0
- package/src/tests/index.test.ts +376 -0
- package/src/tests/integration.test.ts +333 -0
- package/src/tests/integrationTests.test.ts +302 -0
- package/src/tests/mdx.advanced.test.ts +513 -0
- package/src/tests/objects.improved.test.ts +385 -0
- package/src/tests/performance.test.ts +314 -0
- package/src/tests/processService.comprehensive.test.ts +933 -0
- package/src/tests/processService.test.ts +409 -0
- package/src/tests/restService.test.ts +218 -0
- package/src/tests/security.advanced.test.ts +464 -0
- package/src/tests/security.test.ts +233 -0
- package/src/tests/securityService.comprehensive.test.ts +582 -0
- package/src/tests/setup.ts +42 -0
- package/src/tests/simpleCoverage.test.ts +287 -0
- package/src/tests/stress.performance.test.ts +531 -0
- package/src/tests/subsetService.test.ts +350 -0
- package/src/tests/testConfig.ts +53 -0
- package/src/tests/testUtils.ts +94 -0
- package/src/tests/tm1Service.test.ts +361 -0
- package/src/tests/viewService.test.ts +324 -0
- package/src/utils/Utils.ts +395 -0
- package/tests/README.md +57 -0
- package/tests/connection/test-connection.ts +86 -0
- package/tests/edge-cases/edge-cases-test.ts +244 -0
- package/tests/integration/working-test.ts +193 -0
- package/tests/performance/performance-test.ts +133 -0
- package/tests/run-all-tests.sh +106 -0
- package/tests/security/security-test.ts +103 -0
- package/tsconfig.json +20 -0
|
@@ -0,0 +1,284 @@
|
|
|
1
|
+
import { AxiosResponse } from 'axios';
|
|
2
|
+
import { RestService } from './RestService';
|
|
3
|
+
import { ObjectService } from './ObjectService';
|
|
4
|
+
import { User } from '../objects/User';
|
|
5
|
+
import { formatUrl, CaseAndSpaceInsensitiveSet, requireSecurityAdmin, requireAdmin } from '../utils/Utils';
|
|
6
|
+
|
|
7
|
+
export class SecurityService extends ObjectService {
|
|
8
|
+
/** Service to handle Security stuff
|
|
9
|
+
*
|
|
10
|
+
*/
|
|
11
|
+
|
|
12
|
+
constructor(rest: RestService) {
|
|
13
|
+
super(rest);
|
|
14
|
+
}
|
|
15
|
+
|
|
16
|
+
public async determineActualUserName(userName: string): Promise<string> {
|
|
17
|
+
return await this.determineActualObjectName("Users", userName);
|
|
18
|
+
}
|
|
19
|
+
|
|
20
|
+
public async determineActualGroupName(groupName: string): Promise<string> {
|
|
21
|
+
return await this.determineActualObjectName("Groups", groupName);
|
|
22
|
+
}
|
|
23
|
+
|
|
24
|
+
|
|
25
|
+
public async createUser(user: User): Promise<AxiosResponse> {
|
|
26
|
+
/** Create a user on TM1 Server
|
|
27
|
+
*
|
|
28
|
+
* :param user: instance of .User
|
|
29
|
+
* :return: response
|
|
30
|
+
*/
|
|
31
|
+
const url = '/Users';
|
|
32
|
+
return await this.rest.post(url, user.body);
|
|
33
|
+
}
|
|
34
|
+
|
|
35
|
+
|
|
36
|
+
public async createGroup(groupName: string): Promise<AxiosResponse> {
|
|
37
|
+
/** Create a Security group in the TM1 Server
|
|
38
|
+
*
|
|
39
|
+
* :param group_name:
|
|
40
|
+
* :return:
|
|
41
|
+
*/
|
|
42
|
+
const url = '/Groups';
|
|
43
|
+
return await this.rest.post(url, JSON.stringify({ Name: groupName }));
|
|
44
|
+
}
|
|
45
|
+
|
|
46
|
+
public async getUser(userName: string): Promise<User> {
|
|
47
|
+
/** Get user from TM1 Server
|
|
48
|
+
*
|
|
49
|
+
* :param user_name:
|
|
50
|
+
* :return: instance of .User
|
|
51
|
+
*/
|
|
52
|
+
const actualUserName = await this.determineActualUserName(userName);
|
|
53
|
+
const url = formatUrl(
|
|
54
|
+
"/Users('{}')?$select=Name,FriendlyName,Password,Type,Enabled&$expand=Groups",
|
|
55
|
+
actualUserName);
|
|
56
|
+
const response = await this.rest.get(url);
|
|
57
|
+
return User.fromDict(response.data);
|
|
58
|
+
}
|
|
59
|
+
|
|
60
|
+
public async getCurrentUser(): Promise<User> {
|
|
61
|
+
/** Get user and group assignments of this session
|
|
62
|
+
*
|
|
63
|
+
* :return: instance of .User
|
|
64
|
+
*/
|
|
65
|
+
const url = "/ActiveUser?$select=Name,FriendlyName,Password,Type,Enabled&$expand=Groups";
|
|
66
|
+
const response = await this.rest.get(url);
|
|
67
|
+
return User.fromDict(response.data);
|
|
68
|
+
}
|
|
69
|
+
|
|
70
|
+
|
|
71
|
+
public async updateUser(user: User): Promise<AxiosResponse> {
|
|
72
|
+
/** Update user on TM1 Server
|
|
73
|
+
*
|
|
74
|
+
* :param user: instance of .User
|
|
75
|
+
* :return: response
|
|
76
|
+
*/
|
|
77
|
+
user.name = await this.determineActualUserName(user.name);
|
|
78
|
+
const currentGroups = await this.getGroups(user.name);
|
|
79
|
+
|
|
80
|
+
for (const currentGroup of currentGroups) {
|
|
81
|
+
if (!user.groups.includes(currentGroup)) {
|
|
82
|
+
await this.removeUserFromGroup(currentGroup, user.name);
|
|
83
|
+
}
|
|
84
|
+
}
|
|
85
|
+
|
|
86
|
+
const url = formatUrl("/Users('{}')", user.name);
|
|
87
|
+
return await this.rest.patch(url, user.body);
|
|
88
|
+
}
|
|
89
|
+
|
|
90
|
+
public async updateUserPassword(userName: string, password: string): Promise<AxiosResponse> {
|
|
91
|
+
const url = formatUrl("/Users('{}')", userName);
|
|
92
|
+
const body = { Password: password };
|
|
93
|
+
return await this.rest.patch(url, JSON.stringify(body));
|
|
94
|
+
}
|
|
95
|
+
|
|
96
|
+
|
|
97
|
+
public async deleteUser(userName: string): Promise<AxiosResponse> {
|
|
98
|
+
/** Delete user on TM1 Server
|
|
99
|
+
*
|
|
100
|
+
* :param user_name:
|
|
101
|
+
* :return: response
|
|
102
|
+
*/
|
|
103
|
+
const actualUserName = await this.determineActualUserName(userName);
|
|
104
|
+
const url = formatUrl("/Users('{}')", actualUserName);
|
|
105
|
+
return await this.rest.delete(url);
|
|
106
|
+
}
|
|
107
|
+
|
|
108
|
+
|
|
109
|
+
public async deleteGroup(groupName: string): Promise<AxiosResponse> {
|
|
110
|
+
/** Delete a Security group in the TM1 Server
|
|
111
|
+
*
|
|
112
|
+
* :param group_name:
|
|
113
|
+
* :return: response
|
|
114
|
+
*/
|
|
115
|
+
const actualGroupName = await this.determineActualGroupName(groupName);
|
|
116
|
+
const url = formatUrl("/Groups('{}')", actualGroupName);
|
|
117
|
+
return await this.rest.delete(url);
|
|
118
|
+
}
|
|
119
|
+
|
|
120
|
+
public async getUserNames(): Promise<string[]> {
|
|
121
|
+
/** Get all user names
|
|
122
|
+
*
|
|
123
|
+
* :return: List of user names
|
|
124
|
+
*/
|
|
125
|
+
const url = "/Users?$select=Name";
|
|
126
|
+
const response = await this.rest.get(url);
|
|
127
|
+
return response.data.value.map((user: any) => user.Name);
|
|
128
|
+
}
|
|
129
|
+
|
|
130
|
+
public async getGroupNames(): Promise<string[]> {
|
|
131
|
+
/** Get all group names
|
|
132
|
+
*
|
|
133
|
+
* :return: List of group names
|
|
134
|
+
*/
|
|
135
|
+
const url = "/Groups?$select=Name";
|
|
136
|
+
const response = await this.rest.get(url);
|
|
137
|
+
return response.data.value.map((group: any) => group.Name);
|
|
138
|
+
}
|
|
139
|
+
|
|
140
|
+
public async getAllUsers(): Promise<User[]> {
|
|
141
|
+
/** Get all users
|
|
142
|
+
*
|
|
143
|
+
* :return: List of User instances
|
|
144
|
+
*/
|
|
145
|
+
const url = "/Users?$select=Name,FriendlyName,Password,Type,Enabled&$expand=Groups";
|
|
146
|
+
const response = await this.rest.get(url);
|
|
147
|
+
return response.data.value.map((userDict: any) => User.fromDict(userDict));
|
|
148
|
+
}
|
|
149
|
+
|
|
150
|
+
public async getGroups(userName?: string): Promise<string[]> {
|
|
151
|
+
/** Get groups for a user or all groups
|
|
152
|
+
*
|
|
153
|
+
* :param user_name: Optional user name
|
|
154
|
+
* :return: List of group names
|
|
155
|
+
*/
|
|
156
|
+
if (userName) {
|
|
157
|
+
const actualUserName = await this.determineActualUserName(userName);
|
|
158
|
+
const url = formatUrl("/Users('{}')/Groups?$select=Name", actualUserName);
|
|
159
|
+
const response = await this.rest.get(url);
|
|
160
|
+
return response.data.value.map((group: any) => group.Name);
|
|
161
|
+
} else {
|
|
162
|
+
return await this.getGroupNames();
|
|
163
|
+
}
|
|
164
|
+
}
|
|
165
|
+
|
|
166
|
+
public async getUsersFromGroup(groupName: string): Promise<string[]> {
|
|
167
|
+
/** Get users that belong to a group
|
|
168
|
+
*
|
|
169
|
+
* :param group_name: name of the group
|
|
170
|
+
* :return: List of user names
|
|
171
|
+
*/
|
|
172
|
+
const actualGroupName = await this.determineActualGroupName(groupName);
|
|
173
|
+
const url = formatUrl("/Groups('{}')/Users?$select=Name", actualGroupName);
|
|
174
|
+
const response = await this.rest.get(url);
|
|
175
|
+
return response.data.value.map((user: any) => user.Name);
|
|
176
|
+
}
|
|
177
|
+
|
|
178
|
+
|
|
179
|
+
public async addUserToGroups(userName: string, groupNames: string[]): Promise<AxiosResponse[]> {
|
|
180
|
+
/** Add user to multiple groups
|
|
181
|
+
*
|
|
182
|
+
* :param user_name: name of the user
|
|
183
|
+
* :param group_names: list of group names
|
|
184
|
+
* :return: list of responses
|
|
185
|
+
*/
|
|
186
|
+
const responses: AxiosResponse[] = [];
|
|
187
|
+
for (const groupName of groupNames) {
|
|
188
|
+
const response = await this.addUserToGroup(groupName, userName);
|
|
189
|
+
responses.push(response);
|
|
190
|
+
}
|
|
191
|
+
return responses;
|
|
192
|
+
}
|
|
193
|
+
|
|
194
|
+
|
|
195
|
+
public async addUserToGroup(groupName: string, userName: string): Promise<AxiosResponse> {
|
|
196
|
+
/** Add user to a group
|
|
197
|
+
*
|
|
198
|
+
* :param group_name: name of the group
|
|
199
|
+
* :param user_name: name of the user
|
|
200
|
+
* :return: response
|
|
201
|
+
*/
|
|
202
|
+
const actualGroupName = await this.determineActualGroupName(groupName);
|
|
203
|
+
const actualUserName = await this.determineActualUserName(userName);
|
|
204
|
+
|
|
205
|
+
const url = formatUrl("/Groups('{}')/Users", actualGroupName);
|
|
206
|
+
const body = {
|
|
207
|
+
'@odata.id': `Users('${actualUserName}')`
|
|
208
|
+
};
|
|
209
|
+
return await this.rest.post(url, JSON.stringify(body));
|
|
210
|
+
}
|
|
211
|
+
|
|
212
|
+
|
|
213
|
+
public async removeUserFromGroup(groupName: string, userName: string): Promise<AxiosResponse> {
|
|
214
|
+
/** Remove user from a group
|
|
215
|
+
*
|
|
216
|
+
* :param group_name: name of the group
|
|
217
|
+
* :param user_name: name of the user
|
|
218
|
+
* :return: response
|
|
219
|
+
*/
|
|
220
|
+
const actualGroupName = await this.determineActualGroupName(groupName);
|
|
221
|
+
const actualUserName = await this.determineActualUserName(userName);
|
|
222
|
+
|
|
223
|
+
const url = formatUrl("/Groups('{}')/Users('{}')", actualGroupName, actualUserName);
|
|
224
|
+
return await this.rest.delete(url);
|
|
225
|
+
}
|
|
226
|
+
|
|
227
|
+
|
|
228
|
+
public async getSecurityRefreshTime(): Promise<number> {
|
|
229
|
+
/** Get security refresh time in seconds
|
|
230
|
+
*
|
|
231
|
+
* :return: security refresh time
|
|
232
|
+
*/
|
|
233
|
+
const url = "/StaticConfiguration/ServerSettings('SecurityRefreshTime')";
|
|
234
|
+
const response = await this.rest.get(url);
|
|
235
|
+
return parseInt(response.data.Value);
|
|
236
|
+
}
|
|
237
|
+
|
|
238
|
+
public async userExists(userName: string): Promise<boolean> {
|
|
239
|
+
/** Check if user exists
|
|
240
|
+
*
|
|
241
|
+
* :param user_name: name of the user
|
|
242
|
+
* :return: True if user exists
|
|
243
|
+
*/
|
|
244
|
+
try {
|
|
245
|
+
await this.getUser(userName);
|
|
246
|
+
return true;
|
|
247
|
+
} catch {
|
|
248
|
+
return false;
|
|
249
|
+
}
|
|
250
|
+
}
|
|
251
|
+
|
|
252
|
+
public async groupExists(groupName: string): Promise<boolean> {
|
|
253
|
+
/** Check if group exists
|
|
254
|
+
*
|
|
255
|
+
* :param group_name: name of the group
|
|
256
|
+
* :return: True if group exists
|
|
257
|
+
*/
|
|
258
|
+
try {
|
|
259
|
+
const actualGroupName = await this.determineActualGroupName(groupName);
|
|
260
|
+
const url = formatUrl("/Groups('{}')", actualGroupName);
|
|
261
|
+
await this.rest.get(url);
|
|
262
|
+
return true;
|
|
263
|
+
} catch {
|
|
264
|
+
return false;
|
|
265
|
+
}
|
|
266
|
+
}
|
|
267
|
+
|
|
268
|
+
private async determineActualObjectName(objectClass: string, objectName: string): Promise<string> {
|
|
269
|
+
/** Determine the actual object name (case-sensitive) from TM1 Server
|
|
270
|
+
*
|
|
271
|
+
* :param object_class: 'Users' or 'Groups'
|
|
272
|
+
* :param object_name: name to look for
|
|
273
|
+
* :return: actual object name
|
|
274
|
+
*/
|
|
275
|
+
const url = `/${objectClass}?$select=Name&$filter=tolower(Name) eq '${objectName.toLowerCase()}'`;
|
|
276
|
+
const response = await this.rest.get(url);
|
|
277
|
+
|
|
278
|
+
if (response.data.value && response.data.value.length > 0) {
|
|
279
|
+
return response.data.value[0].Name;
|
|
280
|
+
}
|
|
281
|
+
|
|
282
|
+
return objectName; // fallback to original name
|
|
283
|
+
}
|
|
284
|
+
}
|
|
@@ -0,0 +1,313 @@
|
|
|
1
|
+
import { AxiosResponse } from 'axios';
|
|
2
|
+
import { RestService } from './RestService';
|
|
3
|
+
import { ObjectService } from './ObjectService';
|
|
4
|
+
import { TransactionLogService } from './TransactionLogService';
|
|
5
|
+
import { MessageLogService } from './MessageLogService';
|
|
6
|
+
import { AuditLogService } from './AuditLogService';
|
|
7
|
+
import { LoggerService } from './LoggerService';
|
|
8
|
+
import { ConfigurationService } from './ConfigurationService';
|
|
9
|
+
import { ProcessService } from './ProcessService';
|
|
10
|
+
import {
|
|
11
|
+
requireAdmin,
|
|
12
|
+
requireVersion,
|
|
13
|
+
deprecatedInVersion,
|
|
14
|
+
requireDataAdmin,
|
|
15
|
+
requireOpsAdmin
|
|
16
|
+
} from '../utils/Utils';
|
|
17
|
+
|
|
18
|
+
export enum LogLevel {
|
|
19
|
+
FATAL = "fatal",
|
|
20
|
+
ERROR = "error",
|
|
21
|
+
WARNING = "warning",
|
|
22
|
+
INFO = "info",
|
|
23
|
+
DEBUG = "debug",
|
|
24
|
+
OFF = "off"
|
|
25
|
+
}
|
|
26
|
+
|
|
27
|
+
export class ServerService extends ObjectService {
|
|
28
|
+
/** Service to query common information from the TM1 Server
|
|
29
|
+
*/
|
|
30
|
+
|
|
31
|
+
public transactionLogs: TransactionLogService;
|
|
32
|
+
public messageLogs: MessageLogService;
|
|
33
|
+
public configuration: ConfigurationService;
|
|
34
|
+
public auditLogs: AuditLogService;
|
|
35
|
+
public loggers: LoggerService;
|
|
36
|
+
|
|
37
|
+
constructor(rest: RestService) {
|
|
38
|
+
super(rest);
|
|
39
|
+
console.warn("Server Service will be moved to a new location in a future version");
|
|
40
|
+
this.transactionLogs = new TransactionLogService(rest);
|
|
41
|
+
this.messageLogs = new MessageLogService(rest);
|
|
42
|
+
this.configuration = new ConfigurationService(rest);
|
|
43
|
+
this.auditLogs = new AuditLogService(rest);
|
|
44
|
+
this.loggers = new LoggerService(rest);
|
|
45
|
+
}
|
|
46
|
+
|
|
47
|
+
public async initializeTransactionLogDeltaRequests(filter?: string): Promise<void> {
|
|
48
|
+
return await this.transactionLogs.initializeDeltaRequests(filter);
|
|
49
|
+
}
|
|
50
|
+
|
|
51
|
+
public async executeTransactionLogDeltaRequest(): Promise<any[]> {
|
|
52
|
+
return await this.transactionLogs.executeDeltaRequest();
|
|
53
|
+
}
|
|
54
|
+
|
|
55
|
+
public async initializeAuditLogDeltaRequests(filter?: string): Promise<void> {
|
|
56
|
+
return await this.auditLogs.initializeDeltaRequests(filter);
|
|
57
|
+
}
|
|
58
|
+
|
|
59
|
+
public async executeAuditLogDeltaRequest(): Promise<any[]> {
|
|
60
|
+
return await this.auditLogs.executeDeltaRequest();
|
|
61
|
+
}
|
|
62
|
+
|
|
63
|
+
public async initializeMessageLogDeltaRequests(filter?: string): Promise<void> {
|
|
64
|
+
return await this.messageLogs.initializeDeltaRequests(filter);
|
|
65
|
+
}
|
|
66
|
+
|
|
67
|
+
public async executeMessageLogDeltaRequest(): Promise<any[]> {
|
|
68
|
+
return await this.messageLogs.executeDeltaRequest();
|
|
69
|
+
}
|
|
70
|
+
|
|
71
|
+
@deprecatedInVersion("12.0.0")
|
|
72
|
+
|
|
73
|
+
public async getMessageLogEntries(
|
|
74
|
+
reverse: boolean = true,
|
|
75
|
+
since?: Date,
|
|
76
|
+
until?: Date,
|
|
77
|
+
top?: number,
|
|
78
|
+
logger?: string,
|
|
79
|
+
level?: string,
|
|
80
|
+
msgContains?: string | string[],
|
|
81
|
+
msgContainsOperator: string = 'and'
|
|
82
|
+
): Promise<any[]> {
|
|
83
|
+
/**
|
|
84
|
+
* :param reverse: Boolean
|
|
85
|
+
* :param since: of type datetime. If it doesn't have tz information, UTC is assumed.
|
|
86
|
+
* :param until: of type datetime. If it doesn't have tz information, UTC is assumed.
|
|
87
|
+
* :param top: Integer
|
|
88
|
+
* :param logger: string, eg TM1.Server, TM1.Chore, TM1.Mdx.Interface, TM1.Process
|
|
89
|
+
* :param level: string, ERROR, WARNING, INFO, DEBUG, UNKNOWN
|
|
90
|
+
* :param msg_contains: iterable, find substring in log message; list of substrings will be queried as AND statement
|
|
91
|
+
* :param msg_contains_operator: 'and' or 'or'
|
|
92
|
+
*
|
|
93
|
+
* :return: Dict of server log
|
|
94
|
+
*/
|
|
95
|
+
|
|
96
|
+
return await this.messageLogs.getEntries(
|
|
97
|
+
reverse,
|
|
98
|
+
since,
|
|
99
|
+
until,
|
|
100
|
+
top,
|
|
101
|
+
logger,
|
|
102
|
+
level,
|
|
103
|
+
msgContains,
|
|
104
|
+
msgContainsOperator
|
|
105
|
+
);
|
|
106
|
+
}
|
|
107
|
+
|
|
108
|
+
|
|
109
|
+
public async writeToMessageLog(level: string, message: string): Promise<void> {
|
|
110
|
+
/**
|
|
111
|
+
* :param level: string, FATAL, ERROR, WARN, INFO, DEBUG
|
|
112
|
+
* :param message: string
|
|
113
|
+
* :return:
|
|
114
|
+
*/
|
|
115
|
+
|
|
116
|
+
return await this.messageLogs.createEntry(level, message);
|
|
117
|
+
}
|
|
118
|
+
|
|
119
|
+
@deprecatedInVersion("12.0.0")
|
|
120
|
+
|
|
121
|
+
public async getTransactionLogEntries(
|
|
122
|
+
reverse: boolean = true,
|
|
123
|
+
user?: string,
|
|
124
|
+
cube?: string,
|
|
125
|
+
since?: Date,
|
|
126
|
+
until?: Date,
|
|
127
|
+
top?: number,
|
|
128
|
+
elementTupleFilter?: Record<string, string>,
|
|
129
|
+
elementPositionFilter?: Record<number, Record<string, string>>
|
|
130
|
+
): Promise<any[]> {
|
|
131
|
+
/**
|
|
132
|
+
* :param reverse: Boolean
|
|
133
|
+
* :param user: UserName
|
|
134
|
+
* :param cube: CubeName
|
|
135
|
+
* :param since: of type datetime. If it doesn't have tz information, UTC is assumed.
|
|
136
|
+
* :param until: of type datetime. If it doesn't have tz information, UTC is assumed.
|
|
137
|
+
* :param top: int
|
|
138
|
+
* :param element_tuple_filter: of type dict. Element name as key and comparison operator as value
|
|
139
|
+
* :param element_position_filter: not yet implemented
|
|
140
|
+
* tuple={'Actual':'eq','2020': 'ge'}
|
|
141
|
+
* :return:
|
|
142
|
+
*/
|
|
143
|
+
return await this.transactionLogs.getEntries(
|
|
144
|
+
reverse,
|
|
145
|
+
user,
|
|
146
|
+
cube,
|
|
147
|
+
since,
|
|
148
|
+
until,
|
|
149
|
+
top,
|
|
150
|
+
elementTupleFilter,
|
|
151
|
+
elementPositionFilter
|
|
152
|
+
);
|
|
153
|
+
}
|
|
154
|
+
|
|
155
|
+
|
|
156
|
+
@deprecatedInVersion("12.0.0")
|
|
157
|
+
@requireVersion("11.6")
|
|
158
|
+
public async getAuditLogEntries(
|
|
159
|
+
user?: string,
|
|
160
|
+
objectType?: string,
|
|
161
|
+
objectName?: string,
|
|
162
|
+
since?: Date,
|
|
163
|
+
until?: Date,
|
|
164
|
+
top?: number
|
|
165
|
+
): Promise<any[]> {
|
|
166
|
+
/**
|
|
167
|
+
* :param user: UserName
|
|
168
|
+
* :param object_type: ObjectType
|
|
169
|
+
* :param object_name: ObjectName
|
|
170
|
+
* :param since: of type datetime. If it doesn't have tz information, UTC is assumed.
|
|
171
|
+
* :param until: of type datetime. If it doesn't have tz information, UTC is assumed.
|
|
172
|
+
* :param top: int
|
|
173
|
+
* :return:
|
|
174
|
+
*/
|
|
175
|
+
return await this.auditLogs.getEntries(
|
|
176
|
+
user,
|
|
177
|
+
objectType,
|
|
178
|
+
objectName,
|
|
179
|
+
since,
|
|
180
|
+
until,
|
|
181
|
+
top
|
|
182
|
+
);
|
|
183
|
+
}
|
|
184
|
+
|
|
185
|
+
|
|
186
|
+
@deprecatedInVersion("12.0.0")
|
|
187
|
+
public async getLastProcessMessageFromMessageLog(processName: string): Promise<string | null> {
|
|
188
|
+
/** Get the latest message log entry for a process
|
|
189
|
+
*
|
|
190
|
+
* :param process_name: name of the process
|
|
191
|
+
* :return: String - the message, for instance: "Ausführung normal beendet, verstrichene Zeit 0.03 Sekunden"
|
|
192
|
+
*/
|
|
193
|
+
return await this.messageLogs.getLastProcessMessage(processName);
|
|
194
|
+
}
|
|
195
|
+
|
|
196
|
+
public async getServerName(): Promise<string> {
|
|
197
|
+
/** Ask TM1 Server for its name
|
|
198
|
+
*
|
|
199
|
+
* :Returns:
|
|
200
|
+
* String, the server name
|
|
201
|
+
*/
|
|
202
|
+
return await this.configuration.getServerName();
|
|
203
|
+
}
|
|
204
|
+
|
|
205
|
+
public async getProductVersion(): Promise<string> {
|
|
206
|
+
/** Ask TM1 Server for its version
|
|
207
|
+
*
|
|
208
|
+
* :Returns:
|
|
209
|
+
* String, the version
|
|
210
|
+
*/
|
|
211
|
+
return await this.configuration.getProductVersion();
|
|
212
|
+
}
|
|
213
|
+
|
|
214
|
+
public async getAdminHost(): Promise<string> {
|
|
215
|
+
return await this.configuration.getAdminHost();
|
|
216
|
+
}
|
|
217
|
+
|
|
218
|
+
public async getDataDirectory(): Promise<string> {
|
|
219
|
+
return await this.configuration.getDataDirectory();
|
|
220
|
+
}
|
|
221
|
+
|
|
222
|
+
public async getConfiguration(): Promise<Record<string, any>> {
|
|
223
|
+
return await this.configuration.getAll();
|
|
224
|
+
}
|
|
225
|
+
|
|
226
|
+
public async getStaticConfiguration(): Promise<Record<string, any>> {
|
|
227
|
+
return await this.configuration.getStatic();
|
|
228
|
+
}
|
|
229
|
+
|
|
230
|
+
public async getActiveConfiguration(): Promise<Record<string, any>> {
|
|
231
|
+
/** Read effective(!) TM1 config settings as dictionary from TM1 Server
|
|
232
|
+
*
|
|
233
|
+
* :return: config as dictionary
|
|
234
|
+
*/
|
|
235
|
+
return await this.configuration.getActive();
|
|
236
|
+
}
|
|
237
|
+
|
|
238
|
+
public async getApiMetadata(): Promise<Record<string, any>> {
|
|
239
|
+
/** Read effective(!) TM1 config settings as dictionary from TM1 Server
|
|
240
|
+
*
|
|
241
|
+
* :return: config as dictionary
|
|
242
|
+
*/
|
|
243
|
+
return await this.rest.getApiMetadata();
|
|
244
|
+
}
|
|
245
|
+
|
|
246
|
+
public async updateStaticConfiguration(configuration: Record<string, any>): Promise<AxiosResponse> {
|
|
247
|
+
/** Update the .cfg file and triggers TM1 to re-read the file.
|
|
248
|
+
*
|
|
249
|
+
* :param configuration:
|
|
250
|
+
* :return: Response
|
|
251
|
+
*/
|
|
252
|
+
return await this.configuration.updateStatic(configuration);
|
|
253
|
+
}
|
|
254
|
+
|
|
255
|
+
@deprecatedInVersion("12.0.0")
|
|
256
|
+
|
|
257
|
+
public async saveData(): Promise<AxiosResponse> {
|
|
258
|
+
const ti = "SaveDataAll;";
|
|
259
|
+
const processService = new ProcessService(this.rest);
|
|
260
|
+
return await processService.executeTiCode([ti]);
|
|
261
|
+
}
|
|
262
|
+
|
|
263
|
+
|
|
264
|
+
public async deletePersistentFeeders(): Promise<AxiosResponse> {
|
|
265
|
+
const ti = "DeleteAllPersistentFeeders;";
|
|
266
|
+
const processService = new ProcessService(this.rest);
|
|
267
|
+
return await processService.executeTiCode([ti]);
|
|
268
|
+
}
|
|
269
|
+
|
|
270
|
+
public async startPerformanceMonitor(): Promise<AxiosResponse> {
|
|
271
|
+
const config = {
|
|
272
|
+
"Administration": {"PerformanceMonitorOn": true}
|
|
273
|
+
};
|
|
274
|
+
return await this.configuration.updateStatic(config);
|
|
275
|
+
}
|
|
276
|
+
|
|
277
|
+
public async stopPerformanceMonitor(): Promise<AxiosResponse> {
|
|
278
|
+
const config = {
|
|
279
|
+
"Administration": {"PerformanceMonitorOn": false}
|
|
280
|
+
};
|
|
281
|
+
return await this.configuration.updateStatic(config);
|
|
282
|
+
}
|
|
283
|
+
|
|
284
|
+
public async activateAuditLog(): Promise<void> {
|
|
285
|
+
await this.auditLogs.activate();
|
|
286
|
+
}
|
|
287
|
+
|
|
288
|
+
|
|
289
|
+
public async deactivateAuditLog(): Promise<AxiosResponse> {
|
|
290
|
+
const config = {'Administration': {'AuditLog': {'Enable': false}}};
|
|
291
|
+
return await this.updateStaticConfiguration(config);
|
|
292
|
+
}
|
|
293
|
+
|
|
294
|
+
|
|
295
|
+
public async updateMessageLoggerLevel(logger: string, level: string): Promise<AxiosResponse> {
|
|
296
|
+
/**
|
|
297
|
+
* Updates tm1 message log levels
|
|
298
|
+
* :param logger:
|
|
299
|
+
* :param level:
|
|
300
|
+
* :return:
|
|
301
|
+
*/
|
|
302
|
+
return await this.loggers.setLevel(logger, level);
|
|
303
|
+
}
|
|
304
|
+
|
|
305
|
+
|
|
306
|
+
public async getAllMessageLoggerLevel(): Promise<any[]> {
|
|
307
|
+
/**
|
|
308
|
+
* Get tm1 message log levels
|
|
309
|
+
* :return:
|
|
310
|
+
*/
|
|
311
|
+
return await this.loggers.getAll();
|
|
312
|
+
}
|
|
313
|
+
}
|
|
@@ -0,0 +1,81 @@
|
|
|
1
|
+
import { AxiosResponse } from 'axios';
|
|
2
|
+
import { RestService } from './RestService';
|
|
3
|
+
import { ObjectService } from './ObjectService';
|
|
4
|
+
import { UserService } from './UserService';
|
|
5
|
+
import { formatUrl, caseAndSpaceInsensitiveEquals, requireAdmin } from '../utils/Utils';
|
|
6
|
+
|
|
7
|
+
export class SessionService extends ObjectService {
|
|
8
|
+
/** Service to Query and Cancel Threads in TM1
|
|
9
|
+
*/
|
|
10
|
+
|
|
11
|
+
private users: UserService;
|
|
12
|
+
|
|
13
|
+
constructor(rest: RestService) {
|
|
14
|
+
super(rest);
|
|
15
|
+
this.users = new UserService(rest);
|
|
16
|
+
}
|
|
17
|
+
|
|
18
|
+
public async getAll(includeUser: boolean = true, includeThreads: boolean = true): Promise<any[]> {
|
|
19
|
+
let url = "/Sessions";
|
|
20
|
+
|
|
21
|
+
if (includeUser || includeThreads) {
|
|
22
|
+
const expands: string[] = [];
|
|
23
|
+
if (includeUser) {
|
|
24
|
+
expands.push("User");
|
|
25
|
+
}
|
|
26
|
+
if (includeThreads) {
|
|
27
|
+
expands.push("Threads");
|
|
28
|
+
}
|
|
29
|
+
url += "?$expand=" + expands.join(",");
|
|
30
|
+
}
|
|
31
|
+
|
|
32
|
+
const response = await this.rest.get(url);
|
|
33
|
+
return response.data.value;
|
|
34
|
+
}
|
|
35
|
+
|
|
36
|
+
public async getCurrent(): Promise<any[]> {
|
|
37
|
+
const url = "/ActiveSession";
|
|
38
|
+
const response = await this.rest.get(url);
|
|
39
|
+
return response.data.value;
|
|
40
|
+
}
|
|
41
|
+
|
|
42
|
+
public async getThreadsForCurrent(excludeIdle: boolean = true): Promise<any[]> {
|
|
43
|
+
let url = "/ActiveSession/Threads?$filter=Function ne 'GET /ActiveSession/Threads'";
|
|
44
|
+
if (excludeIdle) {
|
|
45
|
+
url += " and State ne 'Idle'";
|
|
46
|
+
}
|
|
47
|
+
|
|
48
|
+
const response = await this.rest.get(url);
|
|
49
|
+
return response.data.value;
|
|
50
|
+
}
|
|
51
|
+
|
|
52
|
+
public async close(sessionId: string): Promise<AxiosResponse> {
|
|
53
|
+
const url = formatUrl("/Sessions('{}')/tm1.Close", sessionId);
|
|
54
|
+
return await this.rest.post(url);
|
|
55
|
+
}
|
|
56
|
+
|
|
57
|
+
|
|
58
|
+
public async closeAll(): Promise<any[]> {
|
|
59
|
+
const currentUser = await this.users.getCurrent();
|
|
60
|
+
const sessions = await this.getAll();
|
|
61
|
+
const closedSessions: any[] = [];
|
|
62
|
+
|
|
63
|
+
for (const session of sessions) {
|
|
64
|
+
if (!("User" in session)) {
|
|
65
|
+
continue;
|
|
66
|
+
}
|
|
67
|
+
if (session["User"] === null) {
|
|
68
|
+
continue;
|
|
69
|
+
}
|
|
70
|
+
if (!("Name" in session["User"])) {
|
|
71
|
+
continue;
|
|
72
|
+
}
|
|
73
|
+
if (caseAndSpaceInsensitiveEquals(currentUser.name, session["User"]["Name"])) {
|
|
74
|
+
continue;
|
|
75
|
+
}
|
|
76
|
+
await this.close(session['ID']);
|
|
77
|
+
closedSessions.push(session);
|
|
78
|
+
}
|
|
79
|
+
return closedSessions;
|
|
80
|
+
}
|
|
81
|
+
}
|