@memberjunction/server 6.2.0-edge.5 → 6.2.0-edge.6
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/README.md +27 -1
- package/dist/.tsbuildinfo +1 -1
- package/dist/agentSessions/SessionJanitor.d.ts +3 -3
- package/dist/agentSessions/SessionJanitor.js +3 -3
- package/dist/agentSessions/SessionManager.d.ts +15 -5
- package/dist/agentSessions/SessionManager.d.ts.map +1 -1
- package/dist/agentSessions/SessionManager.js +34 -12
- package/dist/agentSessions/SessionManager.js.map +1 -1
- package/dist/auth/AuthProviderCatalogRouter.d.ts.map +1 -1
- package/dist/auth/AuthProviderCatalogRouter.js +2 -0
- package/dist/auth/AuthProviderCatalogRouter.js.map +1 -1
- package/dist/auth/index.d.ts.map +1 -1
- package/dist/auth/index.js +51 -10
- package/dist/auth/index.js.map +1 -1
- package/dist/auth/initializeProviders.d.ts +10 -0
- package/dist/auth/initializeProviders.d.ts.map +1 -1
- package/dist/auth/initializeProviders.js +37 -1
- package/dist/auth/initializeProviders.js.map +1 -1
- package/dist/auth/localDevAuth.d.ts +79 -0
- package/dist/auth/localDevAuth.d.ts.map +1 -0
- package/dist/auth/localDevAuth.js +439 -0
- package/dist/auth/localDevAuth.js.map +1 -0
- package/dist/auth/magicLink/MagicLinkKeys.d.ts +2 -2
- package/dist/auth/magicLink/MagicLinkKeys.d.ts.map +1 -1
- package/dist/auth/magicLink/MagicLinkKeys.js +1 -1
- package/dist/auth/magicLink/MagicLinkKeys.js.map +1 -1
- package/dist/auth/magicLink/types.d.ts +12 -0
- package/dist/auth/magicLink/types.d.ts.map +1 -1
- package/dist/auth/sessionUserClone.d.ts +1 -1
- package/dist/auth/sessionUserClone.d.ts.map +1 -1
- package/dist/auth/sessionUserClone.js +3 -2
- package/dist/auth/sessionUserClone.js.map +1 -1
- package/dist/broadcast/BaseCacheInvalidationBroadcastProvider.d.ts +292 -0
- package/dist/broadcast/BaseCacheInvalidationBroadcastProvider.d.ts.map +1 -0
- package/dist/broadcast/BaseCacheInvalidationBroadcastProvider.js +442 -0
- package/dist/broadcast/BaseCacheInvalidationBroadcastProvider.js.map +1 -0
- package/dist/broadcast/index.d.ts +6 -0
- package/dist/broadcast/index.d.ts.map +1 -0
- package/dist/broadcast/index.js +6 -0
- package/dist/broadcast/index.js.map +1 -0
- package/dist/broadcast/providers/AWSIoTCoreBroadcastProvider.d.ts +43 -0
- package/dist/broadcast/providers/AWSIoTCoreBroadcastProvider.d.ts.map +1 -0
- package/dist/broadcast/providers/AWSIoTCoreBroadcastProvider.js +144 -0
- package/dist/broadcast/providers/AWSIoTCoreBroadcastProvider.js.map +1 -0
- package/dist/broadcast/providers/AzureWebPubSubBroadcastProvider.d.ts +46 -0
- package/dist/broadcast/providers/AzureWebPubSubBroadcastProvider.d.ts.map +1 -0
- package/dist/broadcast/providers/AzureWebPubSubBroadcastProvider.js +149 -0
- package/dist/broadcast/providers/AzureWebPubSubBroadcastProvider.js.map +1 -0
- package/dist/broadcast/providers/GCPPubSubBroadcastProvider.d.ts +49 -0
- package/dist/broadcast/providers/GCPPubSubBroadcastProvider.d.ts.map +1 -0
- package/dist/broadcast/providers/GCPPubSubBroadcastProvider.js +131 -0
- package/dist/broadcast/providers/GCPPubSubBroadcastProvider.js.map +1 -0
- package/dist/broadcast/providers/SequencedRoleBucketBroadcastProvider.d.ts +24 -0
- package/dist/broadcast/providers/SequencedRoleBucketBroadcastProvider.d.ts.map +1 -0
- package/dist/broadcast/providers/SequencedRoleBucketBroadcastProvider.js +51 -0
- package/dist/broadcast/providers/SequencedRoleBucketBroadcastProvider.js.map +1 -0
- package/dist/cache.d.ts +3 -2
- package/dist/cache.d.ts.map +1 -1
- package/dist/cache.js.map +1 -1
- package/dist/config.d.ts +496 -0
- package/dist/config.d.ts.map +1 -1
- package/dist/config.js +61 -0
- package/dist/config.js.map +1 -1
- package/dist/context.d.ts +3 -1
- package/dist/context.d.ts.map +1 -1
- package/dist/context.js +29 -8
- package/dist/context.js.map +1 -1
- package/dist/coreRoutes.d.ts.map +1 -1
- package/dist/coreRoutes.js +14 -0
- package/dist/coreRoutes.js.map +1 -1
- package/dist/generated/graphql-schemas/__mj.d.ts +635 -14
- package/dist/generated/graphql-schemas/__mj.d.ts.map +1 -1
- package/dist/generated/graphql-schemas/__mj.js +3366 -418
- package/dist/generated/graphql-schemas/__mj.js.map +1 -1
- package/dist/generic/CacheInvalidationResolver.d.ts +50 -30
- package/dist/generic/CacheInvalidationResolver.d.ts.map +1 -1
- package/dist/generic/CacheInvalidationResolver.js +154 -79
- package/dist/generic/CacheInvalidationResolver.js.map +1 -1
- package/dist/generic/OrphanedConversationDetailReconciler.d.ts.map +1 -1
- package/dist/generic/OrphanedConversationDetailReconciler.js +2 -0
- package/dist/generic/OrphanedConversationDetailReconciler.js.map +1 -1
- package/dist/generic/PubSubManager.d.ts +10 -0
- package/dist/generic/PubSubManager.d.ts.map +1 -1
- package/dist/generic/PubSubManager.js +44 -1
- package/dist/generic/PubSubManager.js.map +1 -1
- package/dist/generic/PushStatusResolver.d.ts +39 -6
- package/dist/generic/PushStatusResolver.d.ts.map +1 -1
- package/dist/generic/PushStatusResolver.js +93 -11
- package/dist/generic/PushStatusResolver.js.map +1 -1
- package/dist/generic/ResolverBase.d.ts +65 -25
- package/dist/generic/ResolverBase.d.ts.map +1 -1
- package/dist/generic/ResolverBase.js +201 -101
- package/dist/generic/ResolverBase.js.map +1 -1
- package/dist/generic/RunViewResolver.d.ts +11 -3
- package/dist/generic/RunViewResolver.d.ts.map +1 -1
- package/dist/generic/RunViewResolver.js +79 -13
- package/dist/generic/RunViewResolver.js.map +1 -1
- package/dist/generic/actionOutputFieldSecurity.d.ts +26 -0
- package/dist/generic/actionOutputFieldSecurity.d.ts.map +1 -0
- package/dist/generic/actionOutputFieldSecurity.js +47 -0
- package/dist/generic/actionOutputFieldSecurity.js.map +1 -0
- package/dist/generic/fieldSecurityTransport.d.ts +30 -0
- package/dist/generic/fieldSecurityTransport.d.ts.map +1 -0
- package/dist/generic/fieldSecurityTransport.js +30 -0
- package/dist/generic/fieldSecurityTransport.js.map +1 -0
- package/dist/index.d.ts +3 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +122 -66
- package/dist/index.js.map +1 -1
- package/dist/integration/CustomColumnPromoter.d.ts.map +1 -1
- package/dist/integration/CustomColumnPromoter.js +6 -1
- package/dist/integration/CustomColumnPromoter.js.map +1 -1
- package/dist/logging/variablesLoggingMiddleware.d.ts +12 -0
- package/dist/logging/variablesLoggingMiddleware.d.ts.map +1 -1
- package/dist/logging/variablesLoggingMiddleware.js +50 -1
- package/dist/logging/variablesLoggingMiddleware.js.map +1 -1
- package/dist/realtimeSessions/SessionVerificationPortsBase.d.ts.map +1 -1
- package/dist/realtimeSessions/SessionVerificationPortsBase.js +1 -0
- package/dist/realtimeSessions/SessionVerificationPortsBase.js.map +1 -1
- package/dist/realtimeSessions/ownedRealtimeSession.d.ts +8 -6
- package/dist/realtimeSessions/ownedRealtimeSession.d.ts.map +1 -1
- package/dist/realtimeSessions/ownedRealtimeSession.js +15 -6
- package/dist/realtimeSessions/ownedRealtimeSession.js.map +1 -1
- package/dist/realtimeSessions/sessionAccess.d.ts +88 -11
- package/dist/realtimeSessions/sessionAccess.d.ts.map +1 -1
- package/dist/realtimeSessions/sessionAccess.js +125 -22
- package/dist/realtimeSessions/sessionAccess.js.map +1 -1
- package/dist/realtimeSessions/sessionConfigStamps.js +1 -1
- package/dist/realtimeSessions/sessionConfigStamps.js.map +1 -1
- package/dist/realtimeSessions/subscriptionAuthorization.d.ts.map +1 -1
- package/dist/realtimeSessions/subscriptionAuthorization.js +5 -2
- package/dist/realtimeSessions/subscriptionAuthorization.js.map +1 -1
- package/dist/realtimeSessions/verificationWorkflow.d.ts +2 -0
- package/dist/realtimeSessions/verificationWorkflow.d.ts.map +1 -1
- package/dist/realtimeSessions/verificationWorkflow.js +1 -1
- package/dist/realtimeSessions/verificationWorkflow.js.map +1 -1
- package/dist/realtimeWidget/WidgetRouter.d.ts.map +1 -1
- package/dist/realtimeWidget/WidgetRouter.js +19 -3
- package/dist/realtimeWidget/WidgetRouter.js.map +1 -1
- package/dist/realtimeWidget/WidgetSessionService.d.ts +67 -7
- package/dist/realtimeWidget/WidgetSessionService.d.ts.map +1 -1
- package/dist/realtimeWidget/WidgetSessionService.js +201 -19
- package/dist/realtimeWidget/WidgetSessionService.js.map +1 -1
- package/dist/realtimeWidget/host-identity.d.ts +1 -1
- package/dist/realtimeWidget/host-identity.js +1 -1
- package/dist/realtimeWidget/widgetCore.d.ts +20 -1
- package/dist/realtimeWidget/widgetCore.d.ts.map +1 -1
- package/dist/realtimeWidget/widgetCore.js +17 -1
- package/dist/realtimeWidget/widgetCore.js.map +1 -1
- package/dist/realtimeWidget/widgetGuestElevation.d.ts +1 -1
- package/dist/realtimeWidget/widgetGuestElevation.d.ts.map +1 -1
- package/dist/realtimeWidget/widgetGuestElevation.js +2 -1
- package/dist/realtimeWidget/widgetGuestElevation.js.map +1 -1
- package/dist/resolvers/ActionResolver.d.ts +19 -1
- package/dist/resolvers/ActionResolver.d.ts.map +1 -1
- package/dist/resolvers/ActionResolver.js +63 -12
- package/dist/resolvers/ActionResolver.js.map +1 -1
- package/dist/resolvers/AdhocQueryResolver.d.ts.map +1 -1
- package/dist/resolvers/AdhocQueryResolver.js +1 -0
- package/dist/resolvers/AdhocQueryResolver.js.map +1 -1
- package/dist/resolvers/AgentRunStatusPublisher.d.ts +18 -4
- package/dist/resolvers/AgentRunStatusPublisher.d.ts.map +1 -1
- package/dist/resolvers/AgentRunStatusPublisher.js +32 -8
- package/dist/resolvers/AgentRunStatusPublisher.js.map +1 -1
- package/dist/resolvers/AgentSessionResolver.d.ts +10 -4
- package/dist/resolvers/AgentSessionResolver.d.ts.map +1 -1
- package/dist/resolvers/AgentSessionResolver.js +40 -17
- package/dist/resolvers/AgentSessionResolver.js.map +1 -1
- package/dist/resolvers/EntityCommunicationsResolver.d.ts +13 -1
- package/dist/resolvers/EntityCommunicationsResolver.d.ts.map +1 -1
- package/dist/resolvers/EntityCommunicationsResolver.js +50 -14
- package/dist/resolvers/EntityCommunicationsResolver.js.map +1 -1
- package/dist/resolvers/FetchEntityVectorsResolver.d.ts +28 -0
- package/dist/resolvers/FetchEntityVectorsResolver.d.ts.map +1 -1
- package/dist/resolvers/FetchEntityVectorsResolver.js +117 -21
- package/dist/resolvers/FetchEntityVectorsResolver.js.map +1 -1
- package/dist/resolvers/FileCategoryResolver.d.ts.map +1 -1
- package/dist/resolvers/FileCategoryResolver.js +1 -0
- package/dist/resolvers/FileCategoryResolver.js.map +1 -1
- package/dist/resolvers/FileResolver.d.ts +5 -0
- package/dist/resolvers/FileResolver.d.ts.map +1 -1
- package/dist/resolvers/FileResolver.js +13 -4
- package/dist/resolvers/FileResolver.js.map +1 -1
- package/dist/resolvers/IntegrationDiscoveryResolver.d.ts.map +1 -1
- package/dist/resolvers/IntegrationDiscoveryResolver.js +45 -7
- package/dist/resolvers/IntegrationDiscoveryResolver.js.map +1 -1
- package/dist/resolvers/MergeRecordsResolver.d.ts +8 -1
- package/dist/resolvers/MergeRecordsResolver.d.ts.map +1 -1
- package/dist/resolvers/MergeRecordsResolver.js +31 -3
- package/dist/resolvers/MergeRecordsResolver.js.map +1 -1
- package/dist/resolvers/PipelineProgressResolver.d.ts +6 -0
- package/dist/resolvers/PipelineProgressResolver.d.ts.map +1 -1
- package/dist/resolvers/PipelineProgressResolver.js +5 -3
- package/dist/resolvers/PipelineProgressResolver.js.map +1 -1
- package/dist/resolvers/QueryResolver.d.ts.map +1 -1
- package/dist/resolvers/QueryResolver.js +20 -6
- package/dist/resolvers/QueryResolver.js.map +1 -1
- package/dist/resolvers/QuerySystemUserResolver.d.ts +2 -0
- package/dist/resolvers/QuerySystemUserResolver.d.ts.map +1 -1
- package/dist/resolvers/QuerySystemUserResolver.js +15 -6
- package/dist/resolvers/QuerySystemUserResolver.js.map +1 -1
- package/dist/resolvers/RSUResolver.d.ts.map +1 -1
- package/dist/resolvers/RSUResolver.js +12 -0
- package/dist/resolvers/RSUResolver.js.map +1 -1
- package/dist/resolvers/RealtimeClientSessionResolver.d.ts +16 -2
- package/dist/resolvers/RealtimeClientSessionResolver.d.ts.map +1 -1
- package/dist/resolvers/RealtimeClientSessionResolver.js +82 -28
- package/dist/resolvers/RealtimeClientSessionResolver.js.map +1 -1
- package/dist/resolvers/RemoteBrowserActionResolver.d.ts.map +1 -1
- package/dist/resolvers/RemoteBrowserActionResolver.js +11 -9
- package/dist/resolvers/RemoteBrowserActionResolver.js.map +1 -1
- package/dist/resolvers/RunAIAgentResolver.d.ts +56 -8
- package/dist/resolvers/RunAIAgentResolver.d.ts.map +1 -1
- package/dist/resolvers/RunAIAgentResolver.js +209 -64
- package/dist/resolvers/RunAIAgentResolver.js.map +1 -1
- package/dist/resolvers/RunTemplateResolver.d.ts.map +1 -1
- package/dist/resolvers/RunTemplateResolver.js +4 -4
- package/dist/resolvers/RunTemplateResolver.js.map +1 -1
- package/dist/resolvers/RunTestResolver.d.ts.map +1 -1
- package/dist/resolvers/RunTestResolver.js +3 -1
- package/dist/resolvers/RunTestResolver.js.map +1 -1
- package/dist/resolvers/SyncDataResolver.d.ts.map +1 -1
- package/dist/resolvers/SyncDataResolver.js +4 -0
- package/dist/resolvers/SyncDataResolver.js.map +1 -1
- package/dist/resolvers/TestQuerySQLResolver.d.ts.map +1 -1
- package/dist/resolvers/TestQuerySQLResolver.js +1 -0
- package/dist/resolvers/TestQuerySQLResolver.js.map +1 -1
- package/dist/resolvers/TransactionGroupResolver.d.ts +17 -2
- package/dist/resolvers/TransactionGroupResolver.d.ts.map +1 -1
- package/dist/resolvers/TransactionGroupResolver.js +60 -15
- package/dist/resolvers/TransactionGroupResolver.js.map +1 -1
- package/dist/resolvers/UserViewResolver.d.ts +1 -1
- package/dist/resolvers/UserViewResolver.d.ts.map +1 -1
- package/dist/resolvers/UserViewResolver.js +2 -1
- package/dist/resolvers/UserViewResolver.js.map +1 -1
- package/dist/rest/EntityCRUDHandler.d.ts +6 -0
- package/dist/rest/EntityCRUDHandler.d.ts.map +1 -1
- package/dist/rest/EntityCRUDHandler.js +19 -5
- package/dist/rest/EntityCRUDHandler.js.map +1 -1
- package/dist/rest/RESTEndpointHandler.d.ts.map +1 -1
- package/dist/rest/RESTEndpointHandler.js +8 -5
- package/dist/rest/RESTEndpointHandler.js.map +1 -1
- package/dist/rest/RealtimeRecordingHandler.d.ts +3 -3
- package/dist/rest/RealtimeRecordingHandler.d.ts.map +1 -1
- package/dist/rest/RealtimeRecordingHandler.js +7 -7
- package/dist/rest/RealtimeRecordingHandler.js.map +1 -1
- package/dist/rest/ViewOperationsHandler.d.ts +6 -0
- package/dist/rest/ViewOperationsHandler.d.ts.map +1 -1
- package/dist/rest/ViewOperationsHandler.js +22 -5
- package/dist/rest/ViewOperationsHandler.js.map +1 -1
- package/dist/serverRoleConfigUnits.d.ts +29 -0
- package/dist/serverRoleConfigUnits.d.ts.map +1 -0
- package/dist/serverRoleConfigUnits.js +33 -0
- package/dist/serverRoleConfigUnits.js.map +1 -0
- package/dist/services/TaskGraphContinuationDeliverer.d.ts +5 -0
- package/dist/services/TaskGraphContinuationDeliverer.d.ts.map +1 -1
- package/dist/services/TaskGraphContinuationDeliverer.js +42 -15
- package/dist/services/TaskGraphContinuationDeliverer.js.map +1 -1
- package/dist/types.d.ts +23 -1
- package/dist/types.d.ts.map +1 -1
- package/dist/types.js.map +1 -1
- package/package.json +98 -98
- package/src/__tests__/ActionResolver.fieldSecurity.test.ts +237 -0
- package/src/__tests__/AdhocQueryResolver.dialect.test.ts +137 -0
- package/src/__tests__/AgentRunStatusPublisher.test.ts +49 -0
- package/src/__tests__/AgentSessionResolver.ownership.test.ts +137 -0
- package/src/__tests__/CustomColumnPromoterOnePass.test.ts +15 -1
- package/src/__tests__/EntityCommunicationsResolver.actingUser.test.ts +151 -0
- package/src/__tests__/EvolutionActsOnWhatItDetects.test.ts +113 -0
- package/src/__tests__/FetchEntityVectorsResolver.test.ts +206 -3
- package/src/__tests__/FileResolver.fieldSecurity.test.ts +82 -0
- package/src/__tests__/PipelineProgressResolver.filter.test.ts +58 -0
- package/src/__tests__/QuerySystemUserResolver.fieldSecurity.test.ts +49 -0
- package/src/__tests__/RESTEndpointHandler.test.ts +25 -0
- package/src/__tests__/RealtimeClientSessionResolver.configTamper.test.ts +23 -3
- package/src/__tests__/RealtimeClientSessionResolver.test.ts +324 -46
- package/src/__tests__/RemoteBrowserActionResolver.ownership.test.ts +98 -0
- package/src/__tests__/ResolverBase.clientOldValues.test.ts +37 -4
- package/src/__tests__/ResolverBase.deleteReturnProjection.test.ts +52 -0
- package/src/__tests__/ResolverBase.entityMessageRelay.test.ts +176 -0
- package/src/__tests__/ResolverBase.includeBinaryFields.test.ts +23 -1
- package/src/__tests__/ResolverBase.publishStatusUpdate.test.ts +68 -0
- package/src/__tests__/ResolverBase.userViewCacheAndDedup.test.ts +130 -0
- package/src/__tests__/RunAIAgentResolver.branch.test.ts +68 -13
- package/src/__tests__/RunAIAgentResolver.conversationWriter.test.ts +210 -0
- package/src/__tests__/RunAIAgentResolver.fireAndForgetCompletion.test.ts +209 -0
- package/src/__tests__/RunAIAgentResolver.historyFrom.test.ts +17 -27
- package/src/__tests__/RunAIAgentResolver.runDataGuard.test.ts +8 -2
- package/src/__tests__/RunAIAgentResolver.serverReply.test.ts +358 -0
- package/src/__tests__/RunAIAgentResolver.stoppedPredecessor.test.ts +4 -1
- package/src/__tests__/RunTemplateResolver.test.ts +35 -2
- package/src/__tests__/RunViewResolver.cacheCheckForwarding.test.ts +11 -0
- package/src/__tests__/SessionManager.test.ts +95 -0
- package/src/__tests__/TaskGraphContinuationDeliverer.test.ts +114 -3
- package/src/__tests__/TransactionGroupResolver.fieldSecurity.test.ts +199 -0
- package/src/__tests__/UserViewResolver.updateWhereClause.test.ts +15 -0
- package/src/__tests__/ViewOperationsHandler.test.ts +7 -2
- package/src/__tests__/WidgetSessionService.test.ts +583 -4
- package/src/__tests__/apiRootBoot.test.ts +1 -1
- package/src/__tests__/buildMagicLinkSessionUser.test.ts +96 -0
- package/src/__tests__/cacheBroadcastProviders.test.ts +403 -0
- package/src/__tests__/cacheInvalidationRecordData.test.ts +45 -0
- package/src/__tests__/fieldSecurityFixtures.ts +91 -0
- package/src/__tests__/globalCors.test.ts +3 -3
- package/src/__tests__/localDevAuth.test.ts +196 -0
- package/src/__tests__/orphanedConversationDetailReconciler.test.ts +10 -0
- package/src/__tests__/pushStatusResolver.filter.test.ts +57 -1
- package/src/__tests__/realtimeRecordingHandler.test.ts +19 -2
- package/src/__tests__/realtimeSessions/RealtimeSessionEventsResolver.test.ts +29 -1
- package/src/__tests__/realtimeSessions/ownedRealtimeSession.anonymous.test.ts +31 -0
- package/src/__tests__/realtimeSessions/ownedRealtimeSession.namedScoped.test.ts +37 -0
- package/src/__tests__/realtimeSessions/sessionAccess.test.ts +146 -7
- package/src/__tests__/realtimeSessions/sessionConfigStamps.test.ts +1 -1
- package/src/__tests__/realtimeSessions/verificationWorkflow.test.ts +25 -4
- package/src/__tests__/resolverBase.cloudEventChangedFields.test.ts +157 -0
- package/src/__tests__/resolverBase.fieldSecurityTransport.test.ts +222 -0
- package/src/__tests__/resolverBase.fls.test.ts +146 -97
- package/src/__tests__/restTransport.fieldSecurity.test.ts +148 -0
- package/src/__tests__/runParamsTimeZone.test.ts +179 -0
- package/src/__tests__/runStreams.fieldSecurity.test.ts +100 -0
- package/src/__tests__/runViewProperties.test.ts +114 -0
- package/src/__tests__/scalabilityBenchmarks.test.ts +765 -0
- package/src/__tests__/scalabilityDatabaseIntegration.test.ts +207 -0
- package/src/__tests__/sessionUserClone.test.ts +5 -1
- package/src/__tests__/startupSweepOrder.test.ts +40 -0
- package/src/__tests__/unifiedAuth.test.ts +28 -0
- package/src/__tests__/widgetGuestElevation.test.ts +2 -0
- package/src/agentSessions/SessionJanitor.ts +3 -3
- package/src/agentSessions/SessionManager.ts +35 -12
- package/src/auth/AuthProviderCatalogRouter.ts +3 -0
- package/src/auth/index.ts +56 -12
- package/src/auth/initializeProviders.ts +43 -1
- package/src/auth/localDevAuth.ts +528 -0
- package/src/auth/magicLink/MagicLinkKeys.ts +2 -2
- package/src/auth/magicLink/types.ts +10 -0
- package/src/auth/sessionUserClone.ts +3 -2
- package/src/broadcast/BaseCacheInvalidationBroadcastProvider.ts +674 -0
- package/src/broadcast/index.ts +5 -0
- package/src/broadcast/providers/AWSIoTCoreBroadcastProvider.ts +180 -0
- package/src/broadcast/providers/AzureWebPubSubBroadcastProvider.ts +182 -0
- package/src/broadcast/providers/GCPPubSubBroadcastProvider.ts +169 -0
- package/src/broadcast/providers/SequencedRoleBucketBroadcastProvider.ts +57 -0
- package/src/cache.ts +2 -1
- package/src/config.ts +69 -0
- package/src/context.ts +32 -8
- package/src/coreRoutes.ts +15 -0
- package/src/generated/graphql-schemas/__mj.ts +2239 -102
- package/src/generic/CacheInvalidationResolver.ts +135 -78
- package/src/generic/OrphanedConversationDetailReconciler.ts +4 -2
- package/src/generic/PubSubManager.ts +54 -1
- package/src/generic/PushStatusResolver.ts +108 -11
- package/src/generic/ResolverBase.ts +237 -107
- package/src/generic/RunViewResolver.ts +80 -15
- package/src/generic/actionOutputFieldSecurity.ts +75 -0
- package/src/generic/fieldSecurityTransport.ts +62 -0
- package/src/index.ts +127 -68
- package/src/integration/CustomColumnPromoter.ts +6 -1
- package/src/logging/variablesLoggingMiddleware.ts +59 -3
- package/src/realtimeSessions/README.md +7 -3
- package/src/realtimeSessions/SessionVerificationPortsBase.ts +1 -0
- package/src/realtimeSessions/ownedRealtimeSession.ts +20 -6
- package/src/realtimeSessions/sessionAccess.ts +181 -25
- package/src/realtimeSessions/sessionConfigStamps.ts +1 -1
- package/src/realtimeSessions/subscriptionAuthorization.ts +4 -2
- package/src/realtimeSessions/verificationWorkflow.ts +3 -1
- package/src/realtimeWidget/WidgetRouter.ts +22 -4
- package/src/realtimeWidget/WidgetSessionService.ts +252 -17
- package/src/realtimeWidget/host-identity.ts +1 -1
- package/src/realtimeWidget/widgetCore.ts +30 -1
- package/src/realtimeWidget/widgetGuestElevation.ts +2 -1
- package/src/resolvers/ActionResolver.ts +78 -15
- package/src/resolvers/AdhocQueryResolver.ts +1 -0
- package/src/resolvers/AgentRunStatusPublisher.ts +36 -8
- package/src/resolvers/AgentSessionResolver.ts +46 -18
- package/src/resolvers/EntityCommunicationsResolver.ts +56 -15
- package/src/resolvers/FetchEntityVectorsResolver.ts +132 -21
- package/src/resolvers/FileCategoryResolver.ts +1 -0
- package/src/resolvers/FileResolver.ts +14 -4
- package/src/resolvers/IntegrationDiscoveryResolver.ts +49 -7
- package/src/resolvers/MergeRecordsResolver.ts +23 -2
- package/src/resolvers/PipelineProgressResolver.ts +12 -3
- package/src/resolvers/QueryResolver.ts +20 -6
- package/src/resolvers/QuerySystemUserResolver.ts +15 -6
- package/src/resolvers/RSUResolver.ts +12 -0
- package/src/resolvers/RealtimeClientSessionResolver.ts +104 -33
- package/src/resolvers/RemoteBrowserActionResolver.ts +15 -10
- package/src/resolvers/RunAIAgentResolver.ts +258 -82
- package/src/resolvers/RunTemplateResolver.ts +6 -4
- package/src/resolvers/RunTestResolver.ts +3 -1
- package/src/resolvers/SyncDataResolver.ts +4 -0
- package/src/resolvers/TestQuerySQLResolver.ts +1 -0
- package/src/resolvers/TransactionGroupResolver.ts +66 -15
- package/src/resolvers/UserViewResolver.ts +2 -1
- package/src/resolvers/__tests__/MergeRecordsResolver.test.ts +43 -0
- package/src/rest/EntityCRUDHandler.ts +22 -5
- package/src/rest/RESTEndpointHandler.ts +8 -5
- package/src/rest/RealtimeRecordingHandler.ts +13 -10
- package/src/rest/ViewOperationsHandler.ts +24 -6
- package/src/serverRoleConfigUnits.ts +48 -0
- package/src/services/TaskGraphContinuationDeliverer.ts +52 -20
- package/src/types.ts +23 -1
|
@@ -1,7 +1,8 @@
|
|
|
1
1
|
import { Arg, Ctx, Field, InputType, Int, ObjectType, PubSubEngine, Query, Resolver } from 'type-graphql';
|
|
2
2
|
import { AppContext } from '../types.js';
|
|
3
|
-
import { ResolverBase } from './ResolverBase.js';
|
|
4
|
-
import { LogError, LogStatus, EntityInfo, FieldSecurityError, RunViewWithCacheCheckResult, RunViewsWithCacheCheckResponse, RunViewWithCacheCheckParams, AggregateResult, CompositeKey } from '@memberjunction/core';
|
|
3
|
+
import { ResolverBase, type RunViewResultWithResolvedView } from './ResolverBase.js';
|
|
4
|
+
import { LogError, LogStatus, EntityInfo, FieldSecurityError, RunViewWithCacheCheckResult, RunViewsWithCacheCheckResponse, RunViewWithCacheCheckParams, AggregateResult, CompositeKey, ViewPropertyValues } from '@memberjunction/core';
|
|
5
|
+
import { GraphQLJSONObject } from 'graphql-type-json';
|
|
5
6
|
|
|
6
7
|
import { ReplaceByteArraysWithBase64, UUIDsEqual } from '@memberjunction/global';
|
|
7
8
|
import { RequireSystemUser } from '../directives/RequireSystemUser.js';
|
|
@@ -207,6 +208,20 @@ export class RunViewByIDInput {
|
|
|
207
208
|
'Optional, when true the binary fields of the entity (varbinary / bytea columns) are returned, as base64 strings. They are omitted by default because they are usually large and lists rarely read them. A binary field named explicitly in Fields is always returned.',
|
|
208
209
|
})
|
|
209
210
|
IncludeBinaryFields?: boolean;
|
|
211
|
+
|
|
212
|
+
@Field(() => String, {
|
|
213
|
+
nullable: true,
|
|
214
|
+
description:
|
|
215
|
+
'Optional registered Alternate Base View logical Name (from EntityAlternateBaseView.Name) for this entity. When set, overrides both a saved UserView DisplayState.alternateBaseView pin and the entity default BaseView. Pass an empty string ("") to force the entity default BaseView over a saved UserView pin.',
|
|
216
|
+
})
|
|
217
|
+
AlternateBaseView?: string;
|
|
218
|
+
|
|
219
|
+
@Field(() => GraphQLJSONObject, {
|
|
220
|
+
nullable: true,
|
|
221
|
+
description:
|
|
222
|
+
"Optional values for the view's declared properties, keyed by property name ({ \"Chapter\": \"<id>\" }). A list is accepted only for a property whose operator is IN; null means no value. A name the view does not declare, a value of the wrong type, a value for a property that only the server may set, or a required property left without a value refuses the run with an error naming the property.",
|
|
223
|
+
})
|
|
224
|
+
Properties?: ViewPropertyValues;
|
|
210
225
|
}
|
|
211
226
|
|
|
212
227
|
@InputType()
|
|
@@ -335,6 +350,20 @@ export class RunViewByNameInput {
|
|
|
335
350
|
'Optional, when true the binary fields of the entity (varbinary / bytea columns) are returned, as base64 strings. They are omitted by default because they are usually large and lists rarely read them. A binary field named explicitly in Fields is always returned.',
|
|
336
351
|
})
|
|
337
352
|
IncludeBinaryFields?: boolean;
|
|
353
|
+
|
|
354
|
+
@Field(() => String, {
|
|
355
|
+
nullable: true,
|
|
356
|
+
description:
|
|
357
|
+
'Optional registered Alternate Base View logical Name (from EntityAlternateBaseView.Name) for this entity. When set, overrides both a saved UserView DisplayState.alternateBaseView pin and the entity default BaseView. Pass an empty string ("") to force the entity default BaseView over a saved UserView pin.',
|
|
358
|
+
})
|
|
359
|
+
AlternateBaseView?: string;
|
|
360
|
+
|
|
361
|
+
@Field(() => GraphQLJSONObject, {
|
|
362
|
+
nullable: true,
|
|
363
|
+
description:
|
|
364
|
+
"Optional values for the view's declared properties, keyed by property name ({ \"Chapter\": \"<id>\" }). A list is accepted only for a property whose operator is IN; null means no value. A name the view does not declare, a value of the wrong type, a value for a property that only the server may set, or a required property left without a value refuses the run with an error naming the property.",
|
|
365
|
+
})
|
|
366
|
+
Properties?: ViewPropertyValues;
|
|
338
367
|
}
|
|
339
368
|
|
|
340
369
|
@InputType()
|
|
@@ -449,6 +478,13 @@ export class RunDynamicViewInput {
|
|
|
449
478
|
'Optional, when true the binary fields of the entity (varbinary / bytea columns) are returned, as base64 strings. They are omitted by default because they are usually large and lists rarely read them. A binary field named explicitly in Fields is always returned.',
|
|
450
479
|
})
|
|
451
480
|
IncludeBinaryFields?: boolean;
|
|
481
|
+
|
|
482
|
+
@Field(() => String, {
|
|
483
|
+
nullable: true,
|
|
484
|
+
description:
|
|
485
|
+
'Optional registered Alternate Base View logical Name (from EntityAlternateBaseView.Name) for this entity. When set, routes the dynamic view read through the named alternate base view instead of the entity default BaseView.',
|
|
486
|
+
})
|
|
487
|
+
AlternateBaseView?: string;
|
|
452
488
|
}
|
|
453
489
|
|
|
454
490
|
@InputType()
|
|
@@ -592,6 +628,20 @@ export class RunViewGenericInput {
|
|
|
592
628
|
'Optional, when true the binary fields of the entity (varbinary / bytea columns) are returned, as base64 strings. They are omitted by default because they are usually large and lists rarely read them. A binary field named explicitly in Fields is always returned.',
|
|
593
629
|
})
|
|
594
630
|
IncludeBinaryFields?: boolean;
|
|
631
|
+
|
|
632
|
+
@Field(() => String, {
|
|
633
|
+
nullable: true,
|
|
634
|
+
description:
|
|
635
|
+
'Optional registered Alternate Base View logical Name (from EntityAlternateBaseView.Name) for this entity. When set, overrides both a saved UserView DisplayState.alternateBaseView pin and the entity default BaseView. Pass an empty string ("") to force the entity default BaseView over a saved UserView pin.',
|
|
636
|
+
})
|
|
637
|
+
AlternateBaseView?: string;
|
|
638
|
+
|
|
639
|
+
@Field(() => GraphQLJSONObject, {
|
|
640
|
+
nullable: true,
|
|
641
|
+
description:
|
|
642
|
+
"Optional values for the view's declared properties, keyed by property name ({ \"Chapter\": \"<id>\" }). A list is accepted only for a property whose operator is IN; null means no value. A name the view does not declare, a value of the wrong type, a value for a property that only the server may set, or a required property left without a value refuses the run with an error naming the property.",
|
|
643
|
+
})
|
|
644
|
+
Properties?: ViewPropertyValues;
|
|
595
645
|
}
|
|
596
646
|
|
|
597
647
|
//****************************************************************************
|
|
@@ -605,6 +655,12 @@ export class RunViewCacheStatusInput {
|
|
|
605
655
|
|
|
606
656
|
@Field(() => Int, { description: 'The number of rows in cached results' })
|
|
607
657
|
rowCount: number; // case-violation-ok-legacy-back-compat: the property name is the GraphQL schema field name — renaming it breaks every client query
|
|
658
|
+
|
|
659
|
+
@Field(() => String, {
|
|
660
|
+
nullable: true,
|
|
661
|
+
description: "A hash of the client's field-security key for this view ('' when the user is denied nothing). When it differs from the server's for the same user, the server answers stale with fresh rows. Omitted by older clients.",
|
|
662
|
+
})
|
|
663
|
+
fieldSecurityKey?: string; // case-violation-ok-legacy-back-compat: the property name is the GraphQL schema field name, matching its siblings
|
|
608
664
|
}
|
|
609
665
|
|
|
610
666
|
@InputType()
|
|
@@ -796,7 +852,7 @@ export class RunViewResolver extends ResolverBase {
|
|
|
796
852
|
await this.CheckAPIKeyScopeAuthorization('view:run', input.ViewName, userPayload);
|
|
797
853
|
const provider = GetReadOnlyProvider(providers, { allowFallbackToReadWrite: true });
|
|
798
854
|
const rawData = await super.RunViewByNameGeneric(input, provider, userPayload, pubSub);
|
|
799
|
-
if (rawData
|
|
855
|
+
if (!rawData) {
|
|
800
856
|
return {
|
|
801
857
|
Results: [],
|
|
802
858
|
Success: false,
|
|
@@ -807,9 +863,10 @@ export class RunViewResolver extends ResolverBase {
|
|
|
807
863
|
};
|
|
808
864
|
}
|
|
809
865
|
|
|
810
|
-
const viewInfo =
|
|
811
|
-
|
|
812
|
-
const
|
|
866
|
+
const viewInfo = (rawData as RunViewResultWithResolvedView)._resolvedViewEntity
|
|
867
|
+
?? await this.resolveUserViewByName(input.ViewName, provider, userPayload.userRecord);
|
|
868
|
+
const entity = viewInfo ? provider.EntityByID(viewInfo.EntityID) : undefined;
|
|
869
|
+
const returnData = this.processRawData(rawData.Results, viewInfo?.EntityID ?? null, entity);
|
|
813
870
|
return {
|
|
814
871
|
Results: returnData,
|
|
815
872
|
UserViewRunID: rawData?.UserViewRunID,
|
|
@@ -817,6 +874,7 @@ export class RunViewResolver extends ResolverBase {
|
|
|
817
874
|
TotalRowCount: rawData?.TotalRowCount,
|
|
818
875
|
ExecutionTime: rawData?.ExecutionTime,
|
|
819
876
|
Success: rawData?.Success,
|
|
877
|
+
ErrorMessage: rawData?.ErrorMessage,
|
|
820
878
|
AggregateResults: this.processAggregateResults(rawData?.AggregateResults),
|
|
821
879
|
AggregateExecutionTime: rawData?.AggregateExecutionTime,
|
|
822
880
|
};
|
|
@@ -845,7 +903,7 @@ export class RunViewResolver extends ResolverBase {
|
|
|
845
903
|
await this.CheckAPIKeyScopeAuthorization('view:run', input.ViewID, userPayload);
|
|
846
904
|
const provider = GetReadOnlyProvider(providers, { allowFallbackToReadWrite: true });
|
|
847
905
|
const rawData = await super.RunViewByIDGeneric(input, provider, userPayload, pubSub);
|
|
848
|
-
if (rawData
|
|
906
|
+
if (!rawData) {
|
|
849
907
|
return {
|
|
850
908
|
Results: [],
|
|
851
909
|
Success: false,
|
|
@@ -856,9 +914,10 @@ export class RunViewResolver extends ResolverBase {
|
|
|
856
914
|
};
|
|
857
915
|
}
|
|
858
916
|
|
|
859
|
-
const viewInfo =
|
|
860
|
-
|
|
861
|
-
const
|
|
917
|
+
const viewInfo = (rawData as RunViewResultWithResolvedView)._resolvedViewEntity
|
|
918
|
+
?? await this.resolveUserViewByID(input.ViewID, provider, userPayload.userRecord);
|
|
919
|
+
const entity = viewInfo ? provider.EntityByID(viewInfo.EntityID) : undefined;
|
|
920
|
+
const returnData = this.processRawData(rawData.Results, viewInfo?.EntityID ?? null, entity);
|
|
862
921
|
return {
|
|
863
922
|
Results: returnData,
|
|
864
923
|
UserViewRunID: rawData?.UserViewRunID,
|
|
@@ -866,6 +925,7 @@ export class RunViewResolver extends ResolverBase {
|
|
|
866
925
|
TotalRowCount: rawData?.TotalRowCount,
|
|
867
926
|
ExecutionTime: rawData?.ExecutionTime,
|
|
868
927
|
Success: rawData?.Success,
|
|
928
|
+
ErrorMessage: rawData?.ErrorMessage,
|
|
869
929
|
AggregateResults: this.processAggregateResults(rawData?.AggregateResults),
|
|
870
930
|
AggregateExecutionTime: rawData?.AggregateExecutionTime,
|
|
871
931
|
};
|
|
@@ -1011,8 +1071,9 @@ export class RunViewResolver extends ResolverBase {
|
|
|
1011
1071
|
};
|
|
1012
1072
|
}
|
|
1013
1073
|
|
|
1014
|
-
const
|
|
1015
|
-
const
|
|
1074
|
+
const viewInfo = (rawData as RunViewResultWithResolvedView)._resolvedViewEntity;
|
|
1075
|
+
const entity = viewInfo ? provider.EntityByID(viewInfo.EntityID) : provider.EntityByName(input.ViewName);
|
|
1076
|
+
const entityId = viewInfo?.EntityID ?? (entity ? entity.ID : null);
|
|
1016
1077
|
const returnData = this.processRawData(rawData.Results, entityId, entity);
|
|
1017
1078
|
return {
|
|
1018
1079
|
Results: returnData,
|
|
@@ -1058,9 +1119,10 @@ export class RunViewResolver extends ResolverBase {
|
|
|
1058
1119
|
};
|
|
1059
1120
|
}
|
|
1060
1121
|
|
|
1061
|
-
const viewInfo =
|
|
1062
|
-
|
|
1063
|
-
const
|
|
1122
|
+
const viewInfo = (rawData as RunViewResultWithResolvedView)._resolvedViewEntity
|
|
1123
|
+
?? await this.resolveUserViewByID(input.ViewID, provider, userPayload.userRecord);
|
|
1124
|
+
const entity = viewInfo ? provider.EntityByID(viewInfo.EntityID) : undefined;
|
|
1125
|
+
const returnData = this.processRawData(rawData.Results, viewInfo?.EntityID ?? null, entity);
|
|
1064
1126
|
return {
|
|
1065
1127
|
Results: returnData,
|
|
1066
1128
|
UserViewRunID: rawData?.UserViewRunID,
|
|
@@ -1264,6 +1326,7 @@ export class RunViewResolver extends ResolverBase {
|
|
|
1264
1326
|
// DataSource must be forwarded on this transport too (same as the InternalRunView/RunViews maps):
|
|
1265
1327
|
// otherwise a CacheLocal batch's DataSource:'Materialized' request silently reads the live view.
|
|
1266
1328
|
DataSource: item.params.DataSource,
|
|
1329
|
+
AlternateBaseView: item.params.AlternateBaseView,
|
|
1267
1330
|
IncludeBinaryFields: item.params.IncludeBinaryFields,
|
|
1268
1331
|
// BypassCache likewise — the input type (RunDynamicViewInput) has always declared it, and its
|
|
1269
1332
|
// own description promises "the pre-check cache lookup is skipped". Dropping it here left the
|
|
@@ -1272,10 +1335,12 @@ export class RunViewResolver extends ResolverBase {
|
|
|
1272
1335
|
AfterKey: item.params.AfterKey
|
|
1273
1336
|
? CompositeKey.FromKeyValuePairs(item.params.AfterKey.KeyValuePairs)
|
|
1274
1337
|
: undefined,
|
|
1338
|
+
TimeZone: userPayload?.TimeZone,
|
|
1275
1339
|
},
|
|
1276
1340
|
cacheStatus: item.cacheStatus ? {
|
|
1277
1341
|
maxUpdatedAt: item.cacheStatus.maxUpdatedAt,
|
|
1278
1342
|
rowCount: item.cacheStatus.rowCount,
|
|
1343
|
+
fieldSecurityKey: item.cacheStatus.fieldSecurityKey ?? undefined,
|
|
1279
1344
|
} : undefined,
|
|
1280
1345
|
}));
|
|
1281
1346
|
|
|
@@ -0,0 +1,75 @@
|
|
|
1
|
+
import { BaseEntity, EntityInfo, RecordChangeMetadataSource, UserInfo } from '@memberjunction/core';
|
|
2
|
+
import type { ActionParam } from '@memberjunction/actions-base';
|
|
3
|
+
import { ProjectEntityObjectForCaller, ProjectValuesForCaller } from './fieldSecurityTransport.js';
|
|
4
|
+
|
|
5
|
+
/**
|
|
6
|
+
* The parameters of an entity action that carry a plain copy of the bound record's field values
|
|
7
|
+
* (the `'Entity Object Data'` value type), and the entity those values belong to.
|
|
8
|
+
*/
|
|
9
|
+
export interface EntityObjectDataBinding {
|
|
10
|
+
EntityInfo: EntityInfo;
|
|
11
|
+
/** Parameter names, lowercased and trimmed. */
|
|
12
|
+
ParamNames: ReadonlySet<string>;
|
|
13
|
+
}
|
|
14
|
+
|
|
15
|
+
/**
|
|
16
|
+
* Action parameters as they may be sent back to `user`, with every value whose entity is KNOWN
|
|
17
|
+
* projected to the fields `user` may read:
|
|
18
|
+
*
|
|
19
|
+
* - an entity object (or an array holding them) becomes its projected field values, as an entity
|
|
20
|
+
* object is serialized by its internal state otherwise; one whose entity `user` may not read at
|
|
21
|
+
* all becomes `null`, since field projection narrows what a reader of the entity sees and must
|
|
22
|
+
* not hand a non-reader the fields it is not denied;
|
|
23
|
+
* - a parameter named in `binding` holds the bound record's values, projected for its entity.
|
|
24
|
+
*
|
|
25
|
+
* Any other value is returned as it is: without knowing which entity a plain object belongs to,
|
|
26
|
+
* removing keys from it would be a guess. Returns the original array when nothing changed.
|
|
27
|
+
*/
|
|
28
|
+
export function ProjectActionParamsForCaller(
|
|
29
|
+
params: ActionParam[] | null | undefined,
|
|
30
|
+
user: UserInfo | null | undefined,
|
|
31
|
+
provider?: RecordChangeMetadataSource,
|
|
32
|
+
binding?: EntityObjectDataBinding
|
|
33
|
+
): ActionParam[] | null | undefined {
|
|
34
|
+
if (!params?.length) {
|
|
35
|
+
return params;
|
|
36
|
+
}
|
|
37
|
+
const projected = params.map((p) => projectParam(p, user, provider, binding));
|
|
38
|
+
return projected.some((p, i) => p !== params[i]) ? projected : params;
|
|
39
|
+
}
|
|
40
|
+
|
|
41
|
+
function projectParam(
|
|
42
|
+
param: ActionParam,
|
|
43
|
+
user: UserInfo | null | undefined,
|
|
44
|
+
provider: RecordChangeMetadataSource | undefined,
|
|
45
|
+
binding: EntityObjectDataBinding | undefined
|
|
46
|
+
): ActionParam {
|
|
47
|
+
const value: unknown = param?.Value;
|
|
48
|
+
if (value instanceof BaseEntity) {
|
|
49
|
+
return { ...param, Value: projectEntityObject(value, user, provider) };
|
|
50
|
+
}
|
|
51
|
+
if (Array.isArray(value) && value.some((item) => item instanceof BaseEntity)) {
|
|
52
|
+
const items = value.map((item: unknown) => (item instanceof BaseEntity ? projectEntityObject(item, user, provider) : item));
|
|
53
|
+
return { ...param, Value: items };
|
|
54
|
+
}
|
|
55
|
+
if (binding && isPlainRecord(value) && binding.ParamNames.has(String(param.Name ?? '').trim().toLowerCase())) {
|
|
56
|
+
return { ...param, Value: ProjectValuesForCaller(binding.EntityInfo, value, user, provider) };
|
|
57
|
+
}
|
|
58
|
+
return param;
|
|
59
|
+
}
|
|
60
|
+
|
|
61
|
+
/** An entity object's values projected for `user`, or null when `user` may not read its entity at all. */
|
|
62
|
+
function projectEntityObject(
|
|
63
|
+
entity: BaseEntity,
|
|
64
|
+
user: UserInfo | null | undefined,
|
|
65
|
+
provider: RecordChangeMetadataSource | undefined
|
|
66
|
+
): Record<string, unknown> | null {
|
|
67
|
+
if (user && !entity.EntityInfo?.GetUserPermisions(user)?.CanRead) {
|
|
68
|
+
return null;
|
|
69
|
+
}
|
|
70
|
+
return ProjectEntityObjectForCaller(entity, user, provider);
|
|
71
|
+
}
|
|
72
|
+
|
|
73
|
+
function isPlainRecord(value: unknown): value is Record<string, unknown> {
|
|
74
|
+
return value !== null && typeof value === 'object' && !Array.isArray(value) && !(value instanceof Date);
|
|
75
|
+
}
|
|
@@ -0,0 +1,62 @@
|
|
|
1
|
+
import {
|
|
2
|
+
EntityInfo,
|
|
3
|
+
Metadata,
|
|
4
|
+
ProjectEntityValueRowsForUser,
|
|
5
|
+
ProjectEntityValuesForUser,
|
|
6
|
+
RecordChangeMetadataSource,
|
|
7
|
+
UserInfo,
|
|
8
|
+
} from '@memberjunction/core';
|
|
9
|
+
|
|
10
|
+
/**
|
|
11
|
+
* The members of an entity object the output projection reads. `BaseEntity` satisfies it; so does
|
|
12
|
+
* any test double that carries an `EntityInfo` and a `GetAll()`.
|
|
13
|
+
*/
|
|
14
|
+
export interface ProjectableEntityObject {
|
|
15
|
+
readonly EntityInfo?: EntityInfo | null;
|
|
16
|
+
GetAll(): Record<string, unknown>;
|
|
17
|
+
}
|
|
18
|
+
|
|
19
|
+
/**
|
|
20
|
+
* Field values of `entity`, reduced to what `user` may READ, for a transport that sends them to
|
|
21
|
+
* that user.
|
|
22
|
+
*
|
|
23
|
+
* An entity object built for a restricted user already holds no denied value, so for those this
|
|
24
|
+
* is a no-op returning the `GetAll()` copy unchanged. It is the backstop for objects that were not
|
|
25
|
+
* built for the recipient: a system-identity load, an object a long-running process shares across
|
|
26
|
+
* callers, or one built before its user was known.
|
|
27
|
+
*
|
|
28
|
+
* @param provider Metadata source for the Record Changes payload projection. Defaults to the
|
|
29
|
+
* global provider, which is only consulted when the entity is `MJ: Record Changes`.
|
|
30
|
+
*/
|
|
31
|
+
export function ProjectEntityObjectForCaller(
|
|
32
|
+
entity: ProjectableEntityObject,
|
|
33
|
+
user: UserInfo | null | undefined,
|
|
34
|
+
provider?: RecordChangeMetadataSource
|
|
35
|
+
): Record<string, unknown> {
|
|
36
|
+
// fls-guard: projected by ProjectEntityValuesForUser below
|
|
37
|
+
const values = entity.GetAll();
|
|
38
|
+
return ProjectEntityValuesForUser(provider ?? new Metadata(), entity.EntityInfo, values, user) ?? values;
|
|
39
|
+
}
|
|
40
|
+
|
|
41
|
+
/**
|
|
42
|
+
* Plain field values of `entityInfo`, reduced to what `user` may READ. See
|
|
43
|
+
* {@link ProjectEntityObjectForCaller}; this is the form for values that are already plain objects.
|
|
44
|
+
*/
|
|
45
|
+
export function ProjectValuesForCaller<T extends object>(
|
|
46
|
+
entityInfo: EntityInfo | null | undefined,
|
|
47
|
+
values: T,
|
|
48
|
+
user: UserInfo | null | undefined,
|
|
49
|
+
provider?: RecordChangeMetadataSource
|
|
50
|
+
): T {
|
|
51
|
+
return ProjectEntityValuesForUser(provider ?? new Metadata(), entityInfo, values, user) ?? values;
|
|
52
|
+
}
|
|
53
|
+
|
|
54
|
+
/** Array form of {@link ProjectValuesForCaller}: the denied set is computed once for the whole set. */
|
|
55
|
+
export function ProjectRowsForCaller<T extends object>(
|
|
56
|
+
entityInfo: EntityInfo | null | undefined,
|
|
57
|
+
rows: T[],
|
|
58
|
+
user: UserInfo | null | undefined,
|
|
59
|
+
provider?: RecordChangeMetadataSource
|
|
60
|
+
): T[] {
|
|
61
|
+
return ProjectEntityValueRowsForUser(provider ?? new Metadata(), entityInfo, rows, user) ?? rows;
|
|
62
|
+
}
|