@solidxai/core 0.1.10-beta.0 → 0.1.10-beta.11
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/.claude/settings.local.json +15 -0
- package/CLAUDE.md +18 -0
- package/CURRENT_PROMPT +6 -0
- package/dist/commands/refresh-model.command.d.ts +0 -4
- package/dist/commands/refresh-model.command.d.ts.map +1 -1
- package/dist/commands/refresh-model.command.js +0 -32
- package/dist/commands/refresh-model.command.js.map +1 -1
- package/dist/commands/run-tests.command.d.ts +2 -0
- package/dist/commands/run-tests.command.d.ts.map +1 -1
- package/dist/commands/run-tests.command.js +49 -17
- package/dist/commands/run-tests.command.js.map +1 -1
- package/dist/controllers/action-metadata.controller.js +1 -1
- package/dist/controllers/action-metadata.controller.js.map +1 -1
- package/dist/controllers/facebook-authentication.controller.js +1 -1
- package/dist/controllers/facebook-authentication.controller.js.map +1 -1
- package/dist/controllers/google-authentication.controller.js +1 -1
- package/dist/controllers/google-authentication.controller.js.map +1 -1
- package/dist/controllers/mcp-audit-log.controller.d.ts +35 -0
- package/dist/controllers/mcp-audit-log.controller.d.ts.map +1 -0
- package/dist/controllers/mcp-audit-log.controller.js +147 -0
- package/dist/controllers/mcp-audit-log.controller.js.map +1 -0
- package/dist/controllers/menu-item-metadata.controller.js +1 -1
- package/dist/controllers/menu-item-metadata.controller.js.map +1 -1
- package/dist/controllers/microsoft-authentication.controller.js +1 -1
- package/dist/controllers/microsoft-authentication.controller.js.map +1 -1
- package/dist/controllers/model-metadata.controller.d.ts +1 -1
- package/dist/controllers/model-metadata.controller.js +2 -2
- package/dist/controllers/model-metadata.controller.js.map +1 -1
- package/dist/controllers/module-metadata.controller.js +1 -1
- package/dist/controllers/module-metadata.controller.js.map +1 -1
- package/dist/controllers/mq-message-queue.controller.js +1 -1
- package/dist/controllers/mq-message-queue.controller.js.map +1 -1
- package/dist/controllers/mq-message.controller.js +1 -1
- package/dist/controllers/mq-message.controller.js.map +1 -1
- package/dist/controllers/user.controller.d.ts.map +1 -1
- package/dist/controllers/user.controller.js.map +1 -1
- package/dist/controllers/view-metadata.controller.js +1 -1
- package/dist/controllers/view-metadata.controller.js.map +1 -1
- package/dist/dtos/create-mcp-audit-log.dto.d.ts +19 -0
- package/dist/dtos/create-mcp-audit-log.dto.d.ts.map +1 -0
- package/dist/dtos/create-mcp-audit-log.dto.js +118 -0
- package/dist/dtos/create-mcp-audit-log.dto.js.map +1 -0
- package/dist/dtos/update-mcp-audit-log.dto.d.ts +19 -0
- package/dist/dtos/update-mcp-audit-log.dto.d.ts.map +1 -0
- package/dist/dtos/update-mcp-audit-log.dto.js +117 -0
- package/dist/dtos/update-mcp-audit-log.dto.js.map +1 -0
- package/dist/dtos/update-user.dto.d.ts +1 -0
- package/dist/dtos/update-user.dto.d.ts.map +1 -1
- package/dist/dtos/update-user.dto.js +7 -1
- package/dist/dtos/update-user.dto.js.map +1 -1
- package/dist/entities/chatter-message-details.entity.d.ts.map +1 -1
- package/dist/entities/chatter-message-details.entity.js +0 -1
- package/dist/entities/chatter-message-details.entity.js.map +1 -1
- package/dist/entities/mcp-audit-log.entity.d.ts +19 -0
- package/dist/entities/mcp-audit-log.entity.d.ts.map +1 -0
- package/dist/entities/mcp-audit-log.entity.js +90 -0
- package/dist/entities/mcp-audit-log.entity.js.map +1 -0
- package/dist/entities/user.entity.js +1 -0
- package/dist/entities/user.entity.js.map +1 -1
- package/dist/helpers/bootstrap.helper.d.ts.map +1 -1
- package/dist/helpers/bootstrap.helper.js +2 -0
- package/dist/helpers/bootstrap.helper.js.map +1 -1
- package/dist/helpers/command.service.d.ts +1 -0
- package/dist/helpers/command.service.d.ts.map +1 -1
- package/dist/helpers/command.service.js +1 -0
- package/dist/helpers/command.service.js.map +1 -1
- package/dist/helpers/field-crud-managers/BigIntFieldCrudManager.js.map +1 -1
- package/dist/helpers/field-crud-managers/SelectionDynamicFieldCrudManager.js.map +1 -1
- package/dist/helpers/module-metadata-helper.service.js.map +1 -1
- package/dist/index.d.ts +4 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +4 -0
- package/dist/index.js.map +1 -1
- package/dist/interfaces.d.ts +0 -2
- package/dist/interfaces.d.ts.map +1 -1
- package/dist/interfaces.js.map +1 -1
- package/dist/jobs/database/chatter-queue-subscriber-database.service.d.ts.map +1 -1
- package/dist/jobs/database/chatter-queue-subscriber-database.service.js +3 -3
- package/dist/jobs/database/chatter-queue-subscriber-database.service.js.map +1 -1
- package/dist/jobs/database/trigger-mcp-client-subscriber-database.service.js.map +1 -1
- package/dist/jobs/rabbitmq/chatter-queue-subscriber.service.d.ts.map +1 -1
- package/dist/jobs/rabbitmq/chatter-queue-subscriber.service.js +3 -3
- package/dist/jobs/rabbitmq/chatter-queue-subscriber.service.js.map +1 -1
- package/dist/jobs/redis/chatter-queue-subscriber-redis.service.d.ts.map +1 -1
- package/dist/jobs/redis/chatter-queue-subscriber-redis.service.js +3 -3
- package/dist/jobs/redis/chatter-queue-subscriber-redis.service.js.map +1 -1
- package/dist/repository/mcp-audit-log.repository.d.ts +12 -0
- package/dist/repository/mcp-audit-log.repository.d.ts.map +1 -0
- package/dist/repository/mcp-audit-log.repository.js +34 -0
- package/dist/repository/mcp-audit-log.repository.js.map +1 -0
- package/dist/repository/security-rule.repository.js.map +1 -1
- package/dist/seeders/module-metadata-seeder.service.js.map +1 -1
- package/dist/seeders/module-test-data.service.d.ts +7 -0
- package/dist/seeders/module-test-data.service.d.ts.map +1 -1
- package/dist/seeders/module-test-data.service.js +94 -18
- package/dist/seeders/module-test-data.service.js.map +1 -1
- package/dist/seeders/permission-metadata-seeder.service.js.map +1 -1
- package/dist/seeders/seed-data/solid-core-metadata.json +380 -2
- package/dist/services/authentication.service.d.ts.map +1 -1
- package/dist/services/authentication.service.js +5 -5
- package/dist/services/authentication.service.js.map +1 -1
- package/dist/services/chatter-message.service.d.ts +6 -3
- package/dist/services/chatter-message.service.d.ts.map +1 -1
- package/dist/services/chatter-message.service.js +23 -35
- package/dist/services/chatter-message.service.js.map +1 -1
- package/dist/services/crud.service.js.map +1 -1
- package/dist/services/csv.service.js.map +1 -1
- package/dist/services/dashboard.service.js.map +1 -1
- package/dist/services/database/database-bootstrap.service.js.map +1 -1
- package/dist/services/excel.service.js.map +1 -1
- package/dist/services/export-transaction.service.js.map +1 -1
- package/dist/services/field-metadata.service.js +2 -2
- package/dist/services/field-metadata.service.js.map +1 -1
- package/dist/services/fixtures.service.js.map +1 -1
- package/dist/services/import-transaction.service.js.map +1 -1
- package/dist/services/list-of-values.service.js.map +1 -1
- package/dist/services/mcp-audit-log.service.d.ts +12 -0
- package/dist/services/mcp-audit-log.service.d.ts.map +1 -0
- package/dist/services/mcp-audit-log.service.js +38 -0
- package/dist/services/mcp-audit-log.service.js.map +1 -0
- package/dist/services/model-metadata.service.d.ts +4 -1
- package/dist/services/model-metadata.service.d.ts.map +1 -1
- package/dist/services/model-metadata.service.js +23 -24
- package/dist/services/model-metadata.service.js.map +1 -1
- package/dist/services/module-metadata.service.d.ts +4 -1
- package/dist/services/module-metadata.service.d.ts.map +1 -1
- package/dist/services/module-metadata.service.js +18 -2
- package/dist/services/module-metadata.service.js.map +1 -1
- package/dist/services/queues/database-publisher.service.js +3 -3
- package/dist/services/queues/database-publisher.service.js.map +1 -1
- package/dist/services/queues/database-subscriber.service.js +3 -3
- package/dist/services/queues/database-subscriber.service.js.map +1 -1
- package/dist/services/queues/rabbitmq-publisher.service.js +3 -3
- package/dist/services/queues/rabbitmq-publisher.service.js.map +1 -1
- package/dist/services/queues/rabbitmq-subscriber.service.js +4 -4
- package/dist/services/queues/rabbitmq-subscriber.service.js.map +1 -1
- package/dist/services/queues/redis-publisher.service.d.ts.map +1 -1
- package/dist/services/queues/redis-publisher.service.js +4 -1
- package/dist/services/queues/redis-publisher.service.js.map +1 -1
- package/dist/services/queues/redis-subscriber.service.d.ts.map +1 -1
- package/dist/services/queues/redis-subscriber.service.js +4 -1
- package/dist/services/queues/redis-subscriber.service.js.map +1 -1
- package/dist/services/role-metadata.service.js.map +1 -1
- package/dist/services/scheduled-jobs/scheduler.service.js.map +1 -1
- package/dist/services/settings/default-settings-provider.service.d.ts +58 -8
- package/dist/services/settings/default-settings-provider.service.d.ts.map +1 -1
- package/dist/services/settings/default-settings-provider.service.js +21 -4
- package/dist/services/settings/default-settings-provider.service.js.map +1 -1
- package/dist/services/sms/TwilioSMSService.js.map +1 -1
- package/dist/services/solid-introspect.service.js.map +1 -1
- package/dist/services/user-activity-history.service.js.map +1 -1
- package/dist/services/view-metadata.service.d.ts.map +1 -1
- package/dist/services/view-metadata.service.js +17 -2
- package/dist/services/view-metadata.service.js.map +1 -1
- package/dist/solid-core.module.d.ts +1 -0
- package/dist/solid-core.module.d.ts.map +1 -1
- package/dist/solid-core.module.js +9 -0
- package/dist/solid-core.module.js.map +1 -1
- package/dist/subscribers/computed-entity-field.subscriber.js.map +1 -1
- package/dist/subscribers/security-rule.subscriber.d.ts.map +1 -1
- package/dist/subscribers/security-rule.subscriber.js.map +1 -1
- package/dist/subscribers/view-metadata.subscriber.js.map +1 -1
- package/dist/testing/core/testing-engine.js.map +1 -1
- package/dist/testing/reporter/console-reporter.d.ts +10 -0
- package/dist/testing/reporter/console-reporter.d.ts.map +1 -1
- package/dist/testing/reporter/console-reporter.js +21 -0
- package/dist/testing/reporter/console-reporter.js.map +1 -1
- package/dist/testing/reporter/reporter.types.d.ts +7 -0
- package/dist/testing/reporter/reporter.types.d.ts.map +1 -1
- package/dist/testing/reporter/reporter.types.js.map +1 -1
- package/dist/testing/reporter/webhook-reporter.d.ts +54 -0
- package/dist/testing/reporter/webhook-reporter.d.ts.map +1 -0
- package/dist/testing/reporter/webhook-reporter.js +74 -0
- package/dist/testing/reporter/webhook-reporter.js.map +1 -0
- package/dist/testing/runner/run-from-metadata.d.ts.map +1 -1
- package/dist/testing/runner/run-from-metadata.js +20 -1
- package/dist/testing/runner/run-from-metadata.js.map +1 -1
- package/package.json +8 -8
- package/src/commands/refresh-model.command.ts +1 -32
- package/src/commands/run-tests.command.ts +45 -17
- package/src/controllers/action-metadata.controller.ts +1 -1
- package/src/controllers/facebook-authentication.controller.ts +1 -1
- package/src/controllers/google-authentication.controller.ts +1 -1
- package/src/controllers/mcp-audit-log.controller.ts +70 -0
- package/src/controllers/menu-item-metadata.controller.ts +1 -1
- package/src/controllers/microsoft-authentication.controller.ts +1 -1
- package/src/controllers/model-metadata.controller.ts +1 -1
- package/src/controllers/module-metadata.controller.ts +1 -1
- package/src/controllers/mq-message-queue.controller.ts +1 -1
- package/src/controllers/mq-message.controller.ts +1 -1
- package/src/controllers/user.controller.ts +16 -16
- package/src/controllers/view-metadata.controller.ts +1 -1
- package/src/dtos/create-mcp-audit-log.dto.ts +84 -0
- package/src/dtos/update-mcp-audit-log.dto.ts +83 -0
- package/src/dtos/update-user.dto.ts +4 -0
- package/src/entities/chatter-message-details.entity.ts +1 -2
- package/src/entities/mcp-audit-log.entity.ts +55 -0
- package/src/entities/user.entity.ts +1 -1
- package/src/helpers/bootstrap.helper.ts +3 -0
- package/src/helpers/command.service.ts +2 -0
- package/src/helpers/field-crud-managers/BigIntFieldCrudManager.ts +1 -1
- package/src/helpers/field-crud-managers/SelectionDynamicFieldCrudManager.ts +1 -1
- package/src/helpers/module-metadata-helper.service.ts +1 -1
- package/src/index.ts +4 -0
- package/src/interfaces.ts +0 -2
- package/src/jobs/database/chatter-queue-subscriber-database.service.ts +4 -2
- package/src/jobs/database/trigger-mcp-client-subscriber-database.service.ts +1 -1
- package/src/jobs/rabbitmq/chatter-queue-subscriber.service.ts +4 -2
- package/src/jobs/redis/chatter-queue-subscriber-redis.service.ts +10 -3
- package/src/repository/mcp-audit-log.repository.ts +17 -0
- package/src/repository/security-rule.repository.ts +1 -1
- package/src/seeders/module-metadata-seeder.service.ts +4 -4
- package/src/seeders/module-test-data.service.ts +107 -15
- package/src/seeders/permission-metadata-seeder.service.ts +1 -1
- package/src/seeders/seed-data/solid-core-metadata.json +380 -2
- package/src/services/1.js +6 -0
- package/src/services/authentication.service.ts +19 -31
- package/src/services/chatter-message.service.ts +28 -38
- package/src/services/crud.service.ts +3 -3
- package/src/services/csv.service.ts +1 -1
- package/src/services/dashboard.service.ts +1 -1
- package/src/services/database/database-bootstrap.service.ts +1 -1
- package/src/services/excel.service.ts +1 -1
- package/src/services/export-transaction.service.ts +2 -2
- package/src/services/field-metadata.service.ts +3 -3
- package/src/services/fixtures.service.ts +2 -2
- package/src/services/import-transaction.service.ts +2 -2
- package/src/services/list-of-values.service.ts +1 -1
- package/src/services/mcp-audit-log.service.ts +19 -0
- package/src/services/model-metadata.service.ts +35 -34
- package/src/services/module-metadata.service.ts +18 -7
- package/src/services/queues/database-publisher.service.ts +4 -4
- package/src/services/queues/database-subscriber.service.ts +7 -7
- package/src/services/queues/rabbitmq-publisher.service.ts +7 -7
- package/src/services/queues/rabbitmq-subscriber.service.ts +13 -13
- package/src/services/queues/redis-publisher.service.ts +7 -4
- package/src/services/queues/redis-subscriber.service.ts +9 -6
- package/src/services/role-metadata.service.ts +1 -1
- package/src/services/scheduled-jobs/scheduler.service.ts +5 -5
- package/src/services/settings/default-settings-provider.service.ts +21 -4
- package/src/services/sms/TwilioSMSService.ts +2 -2
- package/src/services/solid-introspect.service.ts +2 -2
- package/src/services/user-activity-history.service.ts +1 -1
- package/src/services/view-metadata.service.ts +25 -8
- package/src/solid-core.module.ts +9 -0
- package/src/subscribers/computed-entity-field.subscriber.ts +1 -1
- package/src/subscribers/security-rule.subscriber.ts +8 -8
- package/src/subscribers/view-metadata.subscriber.ts +1 -1
- package/src/testing/core/testing-engine.ts +2 -2
- package/src/testing/reporter/console-reporter.ts +27 -0
- package/src/testing/reporter/reporter.types.ts +7 -0
- package/src/testing/reporter/webhook-reporter.ts +116 -0
- package/src/testing/runner/run-from-metadata.ts +19 -1
- package/dist-tests/api/authenticate.spec.js +0 -119
- package/dist-tests/api/authenticate.spec.js.map +0 -1
- package/dist-tests/api/crud-service.findOne.cityMaster.spec.js +0 -97
- package/dist-tests/api/crud-service.findOne.cityMaster.spec.js.map +0 -1
- package/dist-tests/api/ping.spec.js +0 -21
- package/dist-tests/api/ping.spec.js.map +0 -1
- package/dist-tests/helpers/auth.js +0 -41
- package/dist-tests/helpers/auth.js.map +0 -1
- package/dist-tests/helpers/env.js +0 -11
- package/dist-tests/helpers/env.js.map +0 -1
- package/docs/grouping-enhancements.md +0 -89
- package/docs/java-spring/README.md +0 -3
- package/docs/java-spring/solid-core-module-deep-dive-report.md +0 -1317
- package/docs/seed-changes.md +0 -65
- package/docs/test-data-workflow.md +0 -200
- package/docs/type-declaration-import-issue.md +0 -24
|
@@ -1761,6 +1761,19 @@
|
|
|
1761
1761
|
"encrypt": false,
|
|
1762
1762
|
"isSystem": true
|
|
1763
1763
|
},
|
|
1764
|
+
{
|
|
1765
|
+
"name": "failedLoginAttempts",
|
|
1766
|
+
"displayName": "Failed Login Attempts",
|
|
1767
|
+
"type": "int",
|
|
1768
|
+
"ormType": "integer",
|
|
1769
|
+
"defaultValue": "0",
|
|
1770
|
+
"required": false,
|
|
1771
|
+
"unique": false,
|
|
1772
|
+
"index": false,
|
|
1773
|
+
"private": false,
|
|
1774
|
+
"encrypt": false,
|
|
1775
|
+
"isSystem": true
|
|
1776
|
+
},
|
|
1764
1777
|
{
|
|
1765
1778
|
"name": "profilePicture",
|
|
1766
1779
|
"displayName": "Profile Picture",
|
|
@@ -5919,6 +5932,214 @@
|
|
|
5919
5932
|
"isSystem": true
|
|
5920
5933
|
}
|
|
5921
5934
|
]
|
|
5935
|
+
},
|
|
5936
|
+
{
|
|
5937
|
+
"singularName": "mcpAuditLog",
|
|
5938
|
+
"pluralName": "mcpAuditLogs",
|
|
5939
|
+
"displayName": "MCP Audit Log",
|
|
5940
|
+
"description": "Audit trail of MCP requests handled by the server",
|
|
5941
|
+
"dataSource": "default",
|
|
5942
|
+
"dataSourceType": "postgres",
|
|
5943
|
+
"tableName": "ss_mcp_audit_log",
|
|
5944
|
+
"isChild": false,
|
|
5945
|
+
"isLegacyTable": true,
|
|
5946
|
+
"isLegacyTableWithId": true,
|
|
5947
|
+
"enableAuditTracking": false,
|
|
5948
|
+
"enableSoftDelete": false,
|
|
5949
|
+
"draftPublishWorkflow": false,
|
|
5950
|
+
"internationalisation": false,
|
|
5951
|
+
"isSystem": true,
|
|
5952
|
+
"userKeyFieldUserKey": "id",
|
|
5953
|
+
"fields": [
|
|
5954
|
+
{
|
|
5955
|
+
"name": "userId",
|
|
5956
|
+
"displayName": "User ID",
|
|
5957
|
+
"type": "int",
|
|
5958
|
+
"columnName": "user_id",
|
|
5959
|
+
"required": false,
|
|
5960
|
+
"unique": false,
|
|
5961
|
+
"index": true,
|
|
5962
|
+
"private": false,
|
|
5963
|
+
"encrypt": false,
|
|
5964
|
+
"isSystem": true
|
|
5965
|
+
},
|
|
5966
|
+
{
|
|
5967
|
+
"name": "apiKeyId",
|
|
5968
|
+
"displayName": "API Key ID",
|
|
5969
|
+
"type": "int",
|
|
5970
|
+
"columnName": "api_key_id",
|
|
5971
|
+
"required": false,
|
|
5972
|
+
"unique": false,
|
|
5973
|
+
"index": false,
|
|
5974
|
+
"private": false,
|
|
5975
|
+
"encrypt": false,
|
|
5976
|
+
"isSystem": true
|
|
5977
|
+
},
|
|
5978
|
+
{
|
|
5979
|
+
"name": "username",
|
|
5980
|
+
"displayName": "Username",
|
|
5981
|
+
"type": "shortText",
|
|
5982
|
+
"columnName": "username",
|
|
5983
|
+
"length": 128,
|
|
5984
|
+
"required": false,
|
|
5985
|
+
"unique": false,
|
|
5986
|
+
"index": false,
|
|
5987
|
+
"private": false,
|
|
5988
|
+
"encrypt": false,
|
|
5989
|
+
"isSystem": true
|
|
5990
|
+
},
|
|
5991
|
+
{
|
|
5992
|
+
"name": "transport",
|
|
5993
|
+
"displayName": "Transport",
|
|
5994
|
+
"type": "shortText",
|
|
5995
|
+
"columnName": "transport",
|
|
5996
|
+
"length": 32,
|
|
5997
|
+
"required": true,
|
|
5998
|
+
"unique": false,
|
|
5999
|
+
"index": false,
|
|
6000
|
+
"private": false,
|
|
6001
|
+
"encrypt": false,
|
|
6002
|
+
"isSystem": true
|
|
6003
|
+
},
|
|
6004
|
+
{
|
|
6005
|
+
"name": "mcpSessionId",
|
|
6006
|
+
"displayName": "MCP Session ID",
|
|
6007
|
+
"type": "shortText",
|
|
6008
|
+
"columnName": "mcp_session_id",
|
|
6009
|
+
"length": 64,
|
|
6010
|
+
"required": false,
|
|
6011
|
+
"unique": false,
|
|
6012
|
+
"index": true,
|
|
6013
|
+
"private": false,
|
|
6014
|
+
"encrypt": false,
|
|
6015
|
+
"isSystem": true
|
|
6016
|
+
},
|
|
6017
|
+
{
|
|
6018
|
+
"name": "clientAddr",
|
|
6019
|
+
"displayName": "Client Address",
|
|
6020
|
+
"type": "shortText",
|
|
6021
|
+
"columnName": "client_addr",
|
|
6022
|
+
"length": 64,
|
|
6023
|
+
"required": false,
|
|
6024
|
+
"unique": false,
|
|
6025
|
+
"index": false,
|
|
6026
|
+
"private": false,
|
|
6027
|
+
"encrypt": false,
|
|
6028
|
+
"isSystem": true
|
|
6029
|
+
},
|
|
6030
|
+
{
|
|
6031
|
+
"name": "method",
|
|
6032
|
+
"displayName": "Method",
|
|
6033
|
+
"type": "shortText",
|
|
6034
|
+
"columnName": "method",
|
|
6035
|
+
"length": 64,
|
|
6036
|
+
"required": true,
|
|
6037
|
+
"unique": false,
|
|
6038
|
+
"index": true,
|
|
6039
|
+
"private": false,
|
|
6040
|
+
"encrypt": false,
|
|
6041
|
+
"isSystem": true
|
|
6042
|
+
},
|
|
6043
|
+
{
|
|
6044
|
+
"name": "requestId",
|
|
6045
|
+
"displayName": "Request ID",
|
|
6046
|
+
"type": "shortText",
|
|
6047
|
+
"columnName": "request_id",
|
|
6048
|
+
"length": 64,
|
|
6049
|
+
"required": false,
|
|
6050
|
+
"unique": false,
|
|
6051
|
+
"index": false,
|
|
6052
|
+
"private": false,
|
|
6053
|
+
"encrypt": false,
|
|
6054
|
+
"isSystem": true
|
|
6055
|
+
},
|
|
6056
|
+
{
|
|
6057
|
+
"name": "toolName",
|
|
6058
|
+
"displayName": "Tool Name",
|
|
6059
|
+
"type": "shortText",
|
|
6060
|
+
"columnName": "tool_name",
|
|
6061
|
+
"length": 128,
|
|
6062
|
+
"required": false,
|
|
6063
|
+
"unique": false,
|
|
6064
|
+
"index": true,
|
|
6065
|
+
"private": false,
|
|
6066
|
+
"encrypt": false,
|
|
6067
|
+
"isSystem": true
|
|
6068
|
+
},
|
|
6069
|
+
{
|
|
6070
|
+
"name": "requestParams",
|
|
6071
|
+
"displayName": "Request Params",
|
|
6072
|
+
"type": "longText",
|
|
6073
|
+
"columnName": "request_params",
|
|
6074
|
+
"required": false,
|
|
6075
|
+
"unique": false,
|
|
6076
|
+
"index": false,
|
|
6077
|
+
"private": false,
|
|
6078
|
+
"encrypt": false,
|
|
6079
|
+
"isSystem": true
|
|
6080
|
+
},
|
|
6081
|
+
{
|
|
6082
|
+
"name": "status",
|
|
6083
|
+
"displayName": "Status",
|
|
6084
|
+
"type": "shortText",
|
|
6085
|
+
"columnName": "status",
|
|
6086
|
+
"length": 16,
|
|
6087
|
+
"required": true,
|
|
6088
|
+
"unique": false,
|
|
6089
|
+
"index": false,
|
|
6090
|
+
"private": false,
|
|
6091
|
+
"encrypt": false,
|
|
6092
|
+
"isSystem": true
|
|
6093
|
+
},
|
|
6094
|
+
{
|
|
6095
|
+
"name": "responseResult",
|
|
6096
|
+
"displayName": "Response Result",
|
|
6097
|
+
"type": "longText",
|
|
6098
|
+
"columnName": "response_result",
|
|
6099
|
+
"required": false,
|
|
6100
|
+
"unique": false,
|
|
6101
|
+
"index": false,
|
|
6102
|
+
"private": false,
|
|
6103
|
+
"encrypt": false,
|
|
6104
|
+
"isSystem": true
|
|
6105
|
+
},
|
|
6106
|
+
{
|
|
6107
|
+
"name": "errorCode",
|
|
6108
|
+
"displayName": "Error Code",
|
|
6109
|
+
"type": "int",
|
|
6110
|
+
"columnName": "error_code",
|
|
6111
|
+
"required": false,
|
|
6112
|
+
"unique": false,
|
|
6113
|
+
"index": false,
|
|
6114
|
+
"private": false,
|
|
6115
|
+
"encrypt": false,
|
|
6116
|
+
"isSystem": true
|
|
6117
|
+
},
|
|
6118
|
+
{
|
|
6119
|
+
"name": "errorMessage",
|
|
6120
|
+
"displayName": "Error Message",
|
|
6121
|
+
"type": "longText",
|
|
6122
|
+
"columnName": "error_message",
|
|
6123
|
+
"required": false,
|
|
6124
|
+
"unique": false,
|
|
6125
|
+
"index": false,
|
|
6126
|
+
"private": false,
|
|
6127
|
+
"encrypt": false,
|
|
6128
|
+
"isSystem": true
|
|
6129
|
+
},
|
|
6130
|
+
{
|
|
6131
|
+
"name": "durationMs",
|
|
6132
|
+
"displayName": "Duration (ms)",
|
|
6133
|
+
"type": "decimal",
|
|
6134
|
+
"columnName": "duration_ms",
|
|
6135
|
+
"required": false,
|
|
6136
|
+
"unique": false,
|
|
6137
|
+
"index": false,
|
|
6138
|
+
"private": false,
|
|
6139
|
+
"encrypt": false,
|
|
6140
|
+
"isSystem": true
|
|
6141
|
+
}
|
|
6142
|
+
]
|
|
5922
6143
|
}
|
|
5923
6144
|
]
|
|
5924
6145
|
},
|
|
@@ -5985,6 +6206,8 @@
|
|
|
5985
6206
|
"AgentSessionController.findOne",
|
|
5986
6207
|
"AgentEventController.findMany",
|
|
5987
6208
|
"AgentEventController.findOne",
|
|
6209
|
+
"McpAuditLogController.findMany",
|
|
6210
|
+
"McpAuditLogController.findOne",
|
|
5988
6211
|
"mcp:invoke",
|
|
5989
6212
|
"agent:invoke"
|
|
5990
6213
|
]
|
|
@@ -6594,6 +6817,32 @@
|
|
|
6594
6817
|
"viewUserKey": "agentEvent-form-view",
|
|
6595
6818
|
"moduleUserKey": "solid-core",
|
|
6596
6819
|
"modelUserKey": "agentEvent"
|
|
6820
|
+
},
|
|
6821
|
+
{
|
|
6822
|
+
"displayName": "MCP Audit Log List Action",
|
|
6823
|
+
"name": "mcpAuditLog-list-action",
|
|
6824
|
+
"type": "solid",
|
|
6825
|
+
"domain": "",
|
|
6826
|
+
"context": "",
|
|
6827
|
+
"customComponent": "",
|
|
6828
|
+
"customIsModal": true,
|
|
6829
|
+
"serverEndpoint": "",
|
|
6830
|
+
"viewUserKey": "mcpAuditLog-list-view",
|
|
6831
|
+
"moduleUserKey": "solid-core",
|
|
6832
|
+
"modelUserKey": "mcpAuditLog"
|
|
6833
|
+
},
|
|
6834
|
+
{
|
|
6835
|
+
"displayName": "MCP Audit Log Form Action",
|
|
6836
|
+
"name": "mcpAuditLog-form-action",
|
|
6837
|
+
"type": "solid",
|
|
6838
|
+
"domain": "",
|
|
6839
|
+
"context": "",
|
|
6840
|
+
"customComponent": "",
|
|
6841
|
+
"customIsModal": true,
|
|
6842
|
+
"serverEndpoint": "",
|
|
6843
|
+
"viewUserKey": "mcpAuditLog-form-view",
|
|
6844
|
+
"moduleUserKey": "solid-core",
|
|
6845
|
+
"modelUserKey": "mcpAuditLog"
|
|
6597
6846
|
}
|
|
6598
6847
|
],
|
|
6599
6848
|
"menus": [
|
|
@@ -6950,6 +7199,14 @@
|
|
|
6950
7199
|
"actionUserKey": "agentEvent-list-action",
|
|
6951
7200
|
"moduleUserKey": "solid-core",
|
|
6952
7201
|
"parentMenuItemUserKey": "agent-menu-item"
|
|
7202
|
+
},
|
|
7203
|
+
{
|
|
7204
|
+
"displayName": "MCP Audit Log",
|
|
7205
|
+
"name": "mcpAuditLog-menu-item",
|
|
7206
|
+
"sequenceNumber": 3,
|
|
7207
|
+
"actionUserKey": "mcpAuditLog-list-action",
|
|
7208
|
+
"moduleUserKey": "solid-core",
|
|
7209
|
+
"parentMenuItemUserKey": "agent-menu-item"
|
|
6953
7210
|
}
|
|
6954
7211
|
],
|
|
6955
7212
|
"views": [
|
|
@@ -9841,6 +10098,14 @@
|
|
|
9841
10098
|
"name": "active",
|
|
9842
10099
|
"isSearchable": true
|
|
9843
10100
|
}
|
|
10101
|
+
},
|
|
10102
|
+
{
|
|
10103
|
+
"type": "field",
|
|
10104
|
+
"attrs": {
|
|
10105
|
+
"label" : "Blocked / Unblocked",
|
|
10106
|
+
"name": "failedLoginAttempts",
|
|
10107
|
+
"viewWidget": "SolidUserBlockedStatusListWidget"
|
|
10108
|
+
}
|
|
9844
10109
|
}
|
|
9845
10110
|
]
|
|
9846
10111
|
}
|
|
@@ -11552,7 +11817,7 @@
|
|
|
11552
11817
|
"enableGlobalSearch": true,
|
|
11553
11818
|
"create": true,
|
|
11554
11819
|
"edit": true,
|
|
11555
|
-
"delete":
|
|
11820
|
+
"delete": true
|
|
11556
11821
|
},
|
|
11557
11822
|
"children": [
|
|
11558
11823
|
{
|
|
@@ -11570,7 +11835,18 @@
|
|
|
11570
11835
|
"name": "name",
|
|
11571
11836
|
"label": "Name",
|
|
11572
11837
|
"sortable": true,
|
|
11573
|
-
"filterable": true
|
|
11838
|
+
"filterable": true,
|
|
11839
|
+
"isSearchable": true
|
|
11840
|
+
}
|
|
11841
|
+
},
|
|
11842
|
+
{
|
|
11843
|
+
"type": "field",
|
|
11844
|
+
"attrs": {
|
|
11845
|
+
"name": "description",
|
|
11846
|
+
"label": "Description",
|
|
11847
|
+
"sortable": true,
|
|
11848
|
+
"filterable": true,
|
|
11849
|
+
"isSearchable": true
|
|
11574
11850
|
}
|
|
11575
11851
|
}
|
|
11576
11852
|
]
|
|
@@ -13862,6 +14138,108 @@
|
|
|
13862
14138
|
}
|
|
13863
14139
|
]
|
|
13864
14140
|
}
|
|
14141
|
+
},
|
|
14142
|
+
{
|
|
14143
|
+
"name": "mcpAuditLog-list-view",
|
|
14144
|
+
"displayName": "MCP Audit Logs",
|
|
14145
|
+
"type": "list",
|
|
14146
|
+
"context": "{}",
|
|
14147
|
+
"moduleUserKey": "solid-core",
|
|
14148
|
+
"modelUserKey": "mcpAuditLog",
|
|
14149
|
+
"layout": {
|
|
14150
|
+
"type": "list",
|
|
14151
|
+
"attrs": {
|
|
14152
|
+
"pagination": true,
|
|
14153
|
+
"pageSizeOptions": [10, 25, 50],
|
|
14154
|
+
"enableGlobalSearch": true,
|
|
14155
|
+
"create": true,
|
|
14156
|
+
"edit": true,
|
|
14157
|
+
"delete": false
|
|
14158
|
+
},
|
|
14159
|
+
"children": [
|
|
14160
|
+
{ "type": "field", "attrs": { "name": "id" } },
|
|
14161
|
+
{ "type": "field", "attrs": { "name": "createdAt" } },
|
|
14162
|
+
{ "type": "field", "attrs": { "name": "method", "isSearchable": true } },
|
|
14163
|
+
{ "type": "field", "attrs": { "name": "toolName", "isSearchable": true } },
|
|
14164
|
+
{ "type": "field", "attrs": { "name": "status", "isSearchable": true } },
|
|
14165
|
+
{ "type": "field", "attrs": { "name": "username", "isSearchable": true } },
|
|
14166
|
+
{ "type": "field", "attrs": { "name": "userId" } },
|
|
14167
|
+
{ "type": "field", "attrs": { "name": "transport", "isSearchable": true } },
|
|
14168
|
+
{ "type": "field", "attrs": { "name": "mcpSessionId", "isSearchable": true } },
|
|
14169
|
+
{ "type": "field", "attrs": { "name": "clientAddr", "isSearchable": true } },
|
|
14170
|
+
{ "type": "field", "attrs": { "name": "durationMs" } },
|
|
14171
|
+
{ "type": "field", "attrs": { "name": "errorCode" } }
|
|
14172
|
+
]
|
|
14173
|
+
}
|
|
14174
|
+
},
|
|
14175
|
+
{
|
|
14176
|
+
"name": "mcpAuditLog-form-view",
|
|
14177
|
+
"displayName": "MCP Audit Log",
|
|
14178
|
+
"type": "form",
|
|
14179
|
+
"context": "{}",
|
|
14180
|
+
"moduleUserKey": "solid-core",
|
|
14181
|
+
"modelUserKey": "mcpAuditLog",
|
|
14182
|
+
"layout": {
|
|
14183
|
+
"type": "form",
|
|
14184
|
+
"attrs": {
|
|
14185
|
+
"name": "form-1",
|
|
14186
|
+
"label": "MCP Audit Log",
|
|
14187
|
+
"className": "grid"
|
|
14188
|
+
},
|
|
14189
|
+
"children": [
|
|
14190
|
+
{
|
|
14191
|
+
"type": "sheet",
|
|
14192
|
+
"attrs": { "name": "sheet-1" },
|
|
14193
|
+
"children": [
|
|
14194
|
+
{
|
|
14195
|
+
"type": "row",
|
|
14196
|
+
"attrs": { "name": "row-1" },
|
|
14197
|
+
"children": [
|
|
14198
|
+
{
|
|
14199
|
+
"type": "column",
|
|
14200
|
+
"attrs": { "name": "col-1", "label": "", "className": "col-12 sm:col-12 md:col-6 lg:col-6" },
|
|
14201
|
+
"children": [
|
|
14202
|
+
{ "type": "field", "attrs": { "name": "method" } },
|
|
14203
|
+
{ "type": "field", "attrs": { "name": "toolName" } },
|
|
14204
|
+
{ "type": "field", "attrs": { "name": "status" } },
|
|
14205
|
+
{ "type": "field", "attrs": { "name": "transport" } },
|
|
14206
|
+
{ "type": "field", "attrs": { "name": "mcpSessionId" } },
|
|
14207
|
+
{ "type": "field", "attrs": { "name": "requestId" } }
|
|
14208
|
+
]
|
|
14209
|
+
},
|
|
14210
|
+
{
|
|
14211
|
+
"type": "column",
|
|
14212
|
+
"attrs": { "name": "col-2", "label": "", "className": "col-12 sm:col-12 md:col-6 lg:col-6" },
|
|
14213
|
+
"children": [
|
|
14214
|
+
{ "type": "field", "attrs": { "name": "userId" } },
|
|
14215
|
+
{ "type": "field", "attrs": { "name": "apiKeyId" } },
|
|
14216
|
+
{ "type": "field", "attrs": { "name": "username" } },
|
|
14217
|
+
{ "type": "field", "attrs": { "name": "clientAddr" } },
|
|
14218
|
+
{ "type": "field", "attrs": { "name": "durationMs" } },
|
|
14219
|
+
{ "type": "field", "attrs": { "name": "errorCode" } }
|
|
14220
|
+
]
|
|
14221
|
+
}
|
|
14222
|
+
]
|
|
14223
|
+
},
|
|
14224
|
+
{
|
|
14225
|
+
"type": "row",
|
|
14226
|
+
"attrs": { "name": "row-2" },
|
|
14227
|
+
"children": [
|
|
14228
|
+
{
|
|
14229
|
+
"type": "column",
|
|
14230
|
+
"attrs": { "name": "col-payload", "label": "", "className": "col-12" },
|
|
14231
|
+
"children": [
|
|
14232
|
+
{ "type": "field", "attrs": { "name": "requestParams", "viewWidget": "SolidJsonFormViewWidget" } },
|
|
14233
|
+
{ "type": "field", "attrs": { "name": "responseResult", "viewWidget": "SolidJsonFormViewWidget" } },
|
|
14234
|
+
{ "type": "field", "attrs": { "name": "errorMessage" } }
|
|
14235
|
+
]
|
|
14236
|
+
}
|
|
14237
|
+
]
|
|
14238
|
+
}
|
|
14239
|
+
]
|
|
14240
|
+
}
|
|
14241
|
+
]
|
|
14242
|
+
}
|
|
13865
14243
|
}
|
|
13866
14244
|
],
|
|
13867
14245
|
"emailTemplates": [
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
1. Do i need to create a storeStreams method for aws service too?
|
|
2
|
+
- Handle later
|
|
3
|
+
2. queues handling -> if queues is enabled by default, i.e triggerExport(exportTransactionEntity.id).
|
|
4
|
+
- startExport should either return the data or return the transaction id
|
|
5
|
+
3. How to handle scenarios wherein, nested related exist.(do i need to only get the userkey)
|
|
6
|
+
- show the userKey
|
|
@@ -164,6 +164,8 @@ export class AuthenticationService {
|
|
|
164
164
|
"mobile",
|
|
165
165
|
"roles",
|
|
166
166
|
"forcePasswordChange",
|
|
167
|
+
"isAllowedToGenerateApiKeys",
|
|
168
|
+
"failedLoginAttempts",
|
|
167
169
|
]);
|
|
168
170
|
|
|
169
171
|
async signUp(
|
|
@@ -191,22 +193,11 @@ export class AuthenticationService {
|
|
|
191
193
|
return this.performSignUp(signUpDto, new User(), this.userRepository);
|
|
192
194
|
}
|
|
193
195
|
|
|
194
|
-
private async performSignUp<T extends User>(
|
|
195
|
-
signUpDto: SignUpDto,
|
|
196
|
-
entity: T,
|
|
197
|
-
repo: Repository<T>,
|
|
198
|
-
): Promise<T> {
|
|
196
|
+
private async performSignUp<T extends User>(signUpDto: SignUpDto, entity: T, repo: Repository<T>): Promise<T> {
|
|
199
197
|
try {
|
|
200
|
-
const onForcePasswordChange =
|
|
201
|
-
|
|
202
|
-
|
|
203
|
-
);
|
|
204
|
-
const activateUserOnRegistration =
|
|
205
|
-
this.settingService.getConfigValue<SolidCoreSetting>(
|
|
206
|
-
"activateUserOnRegistration",
|
|
207
|
-
);
|
|
208
|
-
const defaultRole =
|
|
209
|
-
this.settingService.getConfigValue<SolidCoreSetting>("defaultRole");
|
|
198
|
+
const onForcePasswordChange = this.settingService.getConfigValue<SolidCoreSetting>("forceChangePasswordOnFirstLogin");
|
|
199
|
+
const activateUserOnRegistration = this.settingService.getConfigValue<SolidCoreSetting>("activateUserOnRegistration");
|
|
200
|
+
const defaultRole = this.settingService.getConfigValue<SolidCoreSetting>("defaultRole");
|
|
210
201
|
|
|
211
202
|
var { user, pwd, autoGeneratedPwd } = await this.populateForSignup<T>(
|
|
212
203
|
entity,
|
|
@@ -220,17 +211,14 @@ export class AuthenticationService {
|
|
|
220
211
|
}
|
|
221
212
|
const savedUser = await repo.save(user);
|
|
222
213
|
const userRoles = signUpDto.roles ?? [];
|
|
223
|
-
if (
|
|
224
|
-
(signUpDto.roles?.length ?? 0) === 0 &&
|
|
225
|
-
signUpDto.username !== "sa" &&
|
|
226
|
-
defaultRole
|
|
227
|
-
) {
|
|
214
|
+
if ((signUpDto.roles?.length ?? 0) === 0 && signUpDto.username !== "sa" && defaultRole) {
|
|
228
215
|
userRoles.push(defaultRole);
|
|
229
216
|
}
|
|
230
217
|
await this.handlePostSignup(savedUser, userRoles, pwd, autoGeneratedPwd);
|
|
231
218
|
|
|
232
219
|
return savedUser;
|
|
233
|
-
}
|
|
220
|
+
}
|
|
221
|
+
catch (err: any) {
|
|
234
222
|
const pgUniqueViolationErrorCode = "23505";
|
|
235
223
|
if (err.code === pgUniqueViolationErrorCode) {
|
|
236
224
|
throw new ConflictException(
|
|
@@ -485,7 +473,7 @@ export class AuthenticationService {
|
|
|
485
473
|
validationSource,
|
|
486
474
|
);
|
|
487
475
|
await this.notifyUserOnOtpInitiateRegistration(user, validationSource);
|
|
488
|
-
} catch (err) {
|
|
476
|
+
} catch (err: any) {
|
|
489
477
|
if (err.code === "23505") {
|
|
490
478
|
throw new ConflictException(ERROR_MESSAGES.USER_ALREADY_EXISTS);
|
|
491
479
|
}
|
|
@@ -1306,7 +1294,7 @@ export class AuthenticationService {
|
|
|
1306
1294
|
// Assuming all users do not have mobile as mandatory.
|
|
1307
1295
|
if (
|
|
1308
1296
|
forgotPasswordSendVerificationTokenOn ==
|
|
1309
|
-
|
|
1297
|
+
ForgotPasswordSendVerificationTokenOn.MOBILE &&
|
|
1310
1298
|
user.mobile
|
|
1311
1299
|
) {
|
|
1312
1300
|
const smsService = this.smsFactory.getSmsService();
|
|
@@ -1336,11 +1324,11 @@ export class AuthenticationService {
|
|
|
1336
1324
|
confirmForgotPasswordDto.verificationToken,
|
|
1337
1325
|
);
|
|
1338
1326
|
if (!user)
|
|
1339
|
-
throw new UnauthorizedException(
|
|
1327
|
+
throw new UnauthorizedException("Invalid verification token");
|
|
1340
1328
|
if (user.lastLoginProvider !== "local")
|
|
1341
1329
|
throw new UnauthorizedException(ERROR_MESSAGES.INVALID_CREDENTIALS);
|
|
1342
1330
|
if (!user.active)
|
|
1343
|
-
throw new UnauthorizedException(
|
|
1331
|
+
throw new UnauthorizedException("User is inactive");
|
|
1344
1332
|
|
|
1345
1333
|
// 1) Atomically consume the token (only one request can succeed)
|
|
1346
1334
|
const { affected } = await m
|
|
@@ -1432,7 +1420,7 @@ export class AuthenticationService {
|
|
|
1432
1420
|
// Assuming all users do not have mobile as mandatory.
|
|
1433
1421
|
if (
|
|
1434
1422
|
forgotPasswordSendVerificationTokenOn ==
|
|
1435
|
-
|
|
1423
|
+
ForgotPasswordSendVerificationTokenOn.MOBILE &&
|
|
1436
1424
|
user.mobile
|
|
1437
1425
|
) {
|
|
1438
1426
|
const smsService = this.smsFactory.getSmsService();
|
|
@@ -1548,7 +1536,7 @@ export class AuthenticationService {
|
|
|
1548
1536
|
accessToken: await this.generateAccessToken(user),
|
|
1549
1537
|
refreshToken: currentRefreshToken,
|
|
1550
1538
|
};
|
|
1551
|
-
} catch (err) {
|
|
1539
|
+
} catch (err: any) {
|
|
1552
1540
|
if (err instanceof InvalidatedRefreshTokenError) {
|
|
1553
1541
|
// Take action: notify user that his refresh token might have been stolen?
|
|
1554
1542
|
throw new UnauthorizedException(ERROR_MESSAGES.ACCESS_DENIED);
|
|
@@ -1599,7 +1587,7 @@ export class AuthenticationService {
|
|
|
1599
1587
|
} else {
|
|
1600
1588
|
throw new UnauthorizedException(ERROR_MESSAGES.INVALID_USER_PROFILE);
|
|
1601
1589
|
}
|
|
1602
|
-
} catch (error) {
|
|
1590
|
+
} catch (error: any) {
|
|
1603
1591
|
throw new UnauthorizedException(
|
|
1604
1592
|
ERROR_MESSAGES.GOOGLE_OAUTH_PROFILE_FETCH_FAILED,
|
|
1605
1593
|
);
|
|
@@ -1668,7 +1656,7 @@ export class AuthenticationService {
|
|
|
1668
1656
|
} else {
|
|
1669
1657
|
throw new UnauthorizedException(ERROR_MESSAGES.INVALID_USER_PROFILE);
|
|
1670
1658
|
}
|
|
1671
|
-
} catch (error) {
|
|
1659
|
+
} catch (error: any) {
|
|
1672
1660
|
if (error instanceof UnauthorizedException) {
|
|
1673
1661
|
throw error;
|
|
1674
1662
|
}
|
|
@@ -1733,7 +1721,7 @@ export class AuthenticationService {
|
|
|
1733
1721
|
} else {
|
|
1734
1722
|
throw new UnauthorizedException(ERROR_MESSAGES.INVALID_USER_PROFILE);
|
|
1735
1723
|
}
|
|
1736
|
-
} catch (error) {
|
|
1724
|
+
} catch (error: any) {
|
|
1737
1725
|
throw new UnauthorizedException("Microsoft OAuth profile fetch failed");
|
|
1738
1726
|
}
|
|
1739
1727
|
}
|
|
@@ -1880,7 +1868,7 @@ export class AuthenticationService {
|
|
|
1880
1868
|
await this.userActivityHistoryService.logEvent("logout", user);
|
|
1881
1869
|
|
|
1882
1870
|
return { message: SUCCESS_MESSAGES.LOGOUT_SUCCESS };
|
|
1883
|
-
} catch (err) {
|
|
1871
|
+
} catch (err: any) {
|
|
1884
1872
|
throw err instanceof UnauthorizedException ||
|
|
1885
1873
|
err instanceof InternalServerErrorException
|
|
1886
1874
|
? err
|