@learncard/network-brain-service 3.19.0 → 4.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 +47 -82
- package/AGENTS.md +52 -0
- package/CHANGELOG.md +147 -0
- package/README.md +51 -2
- package/bootstrapLambda.test.ts +72 -0
- package/config/config.dev.json +29 -0
- package/config/config.example.json +29 -0
- package/config/config.json +1 -0
- package/config/config.production.json +29 -0
- package/config/config.scouts.dev.json +24 -0
- package/config/config.scouts.production.json +24 -0
- package/contractEventsLambda.ts +18 -0
- package/contractEventsLambdaApp.ts +19 -0
- package/didWebLambda.ts +13 -18
- package/didWebLambdaApp.ts +22 -0
- package/dist/accesslayer/app-manifest-version/create.d.ts +10 -0
- package/dist/accesslayer/app-manifest-version/create.d.ts.map +1 -0
- package/dist/accesslayer/app-manifest-version/read.d.ts +11 -0
- package/dist/accesslayer/app-manifest-version/read.d.ts.map +1 -0
- package/dist/accesslayer/app-manifest-version/update.d.ts +7 -0
- package/dist/accesslayer/app-manifest-version/update.d.ts.map +1 -0
- package/dist/accesslayer/app-store-listing/read.d.ts +2 -1
- package/dist/accesslayer/app-store-listing/read.d.ts.map +1 -1
- package/dist/accesslayer/app-store-listing/relationships/create.d.ts +1 -0
- package/dist/accesslayer/app-store-listing/relationships/create.d.ts.map +1 -1
- package/dist/accesslayer/app-store-listing/relationships/read.d.ts +2 -0
- package/dist/accesslayer/app-store-listing/relationships/read.d.ts.map +1 -1
- package/dist/accesslayer/app-store-listing/update.d.ts +1 -0
- package/dist/accesslayer/app-store-listing/update.d.ts.map +1 -1
- package/dist/accesslayer/boost/relationships/create.d.ts +2 -1
- package/dist/accesslayer/boost/relationships/create.d.ts.map +1 -1
- package/dist/accesslayer/consentflowcontract/create.d.ts +9 -1
- package/dist/accesslayer/consentflowcontract/create.d.ts.map +1 -1
- package/dist/accesslayer/consentflowcontract/read.d.ts +34 -3
- package/dist/accesslayer/consentflowcontract/read.d.ts.map +1 -1
- package/dist/accesslayer/consentflowcontract/relationships/create.d.ts +4 -1
- package/dist/accesslayer/consentflowcontract/relationships/create.d.ts.map +1 -1
- package/dist/accesslayer/consentflowcontract/relationships/delete.d.ts.map +1 -1
- package/dist/accesslayer/consentflowcontract/relationships/read.d.ts +3 -2
- package/dist/accesslayer/consentflowcontract/relationships/read.d.ts.map +1 -1
- package/dist/accesslayer/consentflowcontract/relationships/recipients.d.ts +12 -0
- package/dist/accesslayer/consentflowcontract/relationships/recipients.d.ts.map +1 -0
- package/dist/accesslayer/consentflowcontract/relationships/smartResume.d.ts +12 -0
- package/dist/accesslayer/consentflowcontract/relationships/smartResume.d.ts.map +1 -0
- package/dist/accesslayer/consentflowcontract/relationships/update.d.ts +8 -5
- package/dist/accesslayer/consentflowcontract/relationships/update.d.ts.map +1 -1
- package/dist/accesslayer/credential/create.d.ts +2 -1
- package/dist/accesslayer/credential/create.d.ts.map +1 -1
- package/dist/accesslayer/credential/relationships/create.d.ts +4 -3
- package/dist/accesslayer/credential/relationships/create.d.ts.map +1 -1
- package/dist/accesslayer/inbox-credential/relationships/create.d.ts +2 -1
- package/dist/accesslayer/inbox-credential/relationships/create.d.ts.map +1 -1
- package/dist/accesslayer/inbox-credential/update.d.ts +2 -1
- package/dist/accesslayer/inbox-credential/update.d.ts.map +1 -1
- package/dist/accesslayer/presentation/read.d.ts.map +1 -1
- package/dist/accesslayer/presentation/relationships/create.d.ts +2 -2
- package/dist/accesslayer/presentation/relationships/create.d.ts.map +1 -1
- package/dist/accesslayer/presentation/relationships/read.d.ts.map +1 -1
- package/dist/accesslayer/share-link/abandon.d.ts +3 -0
- package/dist/accesslayer/share-link/abandon.d.ts.map +1 -0
- package/dist/accesslayer/share-link/attachment.d.ts +37 -0
- package/dist/accesslayer/share-link/attachment.d.ts.map +1 -0
- package/dist/accesslayer/share-link/cleanup.d.ts +6 -0
- package/dist/accesslayer/share-link/cleanup.d.ts.map +1 -0
- package/dist/accesslayer/share-link/errors.d.ts +8 -0
- package/dist/accesslayer/share-link/errors.d.ts.map +1 -0
- package/dist/accesslayer/share-link/finalize.d.ts +3 -0
- package/dist/accesslayer/share-link/finalize.d.ts.map +1 -0
- package/dist/accesslayer/share-link/helpers.d.ts +59 -0
- package/dist/accesslayer/share-link/helpers.d.ts.map +1 -0
- package/dist/accesslayer/share-link/index.d.ts +12 -0
- package/dist/accesslayer/share-link/index.d.ts.map +1 -0
- package/dist/accesslayer/share-link/list.d.ts +5 -0
- package/dist/accesslayer/share-link/list.d.ts.map +1 -0
- package/dist/accesslayer/share-link/read.d.ts +5 -0
- package/dist/accesslayer/share-link/read.d.ts.map +1 -0
- package/dist/accesslayer/share-link/receipt.d.ts +11 -0
- package/dist/accesslayer/share-link/receipt.d.ts.map +1 -0
- package/dist/accesslayer/share-link/recovery.d.ts +6 -0
- package/dist/accesslayer/share-link/recovery.d.ts.map +1 -0
- package/dist/accesslayer/share-link/reserve.d.ts +4 -0
- package/dist/accesslayer/share-link/reserve.d.ts.map +1 -0
- package/dist/accesslayer/share-link/revoke.d.ts +3 -0
- package/dist/accesslayer/share-link/revoke.d.ts.map +1 -0
- package/dist/accesslayer/share-link/transaction-execution.d.ts +18 -0
- package/dist/accesslayer/share-link/transaction-execution.d.ts.map +1 -0
- package/dist/accesslayer/share-link/transaction.d.ts +15 -0
- package/dist/accesslayer/share-link/transaction.d.ts.map +1 -0
- package/dist/accesslayer/share-link/types.d.ts +375 -0
- package/dist/accesslayer/share-link/types.d.ts.map +1 -0
- package/dist/app.d.ts +4 -0
- package/dist/app.d.ts.map +1 -1
- package/dist/cache/app-store.caches.d.ts +49 -0
- package/dist/cache/app-store.caches.d.ts.map +1 -1
- package/dist/config/applyDockerStageConfig.d.ts +2 -0
- package/dist/config/applyDockerStageConfig.d.ts.map +1 -0
- package/dist/config/environment.d.ts +14 -0
- package/dist/config/environment.d.ts.map +1 -1
- package/dist/config/serverlessFunctionEnv.test.d.ts +2 -0
- package/dist/config/serverlessFunctionEnv.test.d.ts.map +1 -0
- package/dist/config/stageConfig.d.ts +112 -0
- package/dist/config/stageConfig.d.ts.map +1 -0
- package/dist/config/stageConfig.test.d.ts +2 -0
- package/dist/config/stageConfig.test.d.ts.map +1 -0
- package/dist/constants/auth-grant.d.ts +2 -0
- package/dist/constants/auth-grant.d.ts.map +1 -1
- package/dist/didkit_wasm_bg.wasm +0 -0
- package/dist/docker-entry.d.ts +1 -1
- package/dist/docker-entry.d.ts.map +1 -1
- package/dist/helpers/app-manifest.helpers.d.ts +5 -0
- package/dist/helpers/app-manifest.helpers.d.ts.map +1 -0
- package/dist/helpers/boost.helpers.d.ts.map +1 -1
- package/dist/helpers/claim-hooks.helpers.d.ts +2 -1
- package/dist/helpers/claim-hooks.helpers.d.ts.map +1 -1
- package/dist/helpers/consent-referral.helpers.d.ts +2 -0
- package/dist/helpers/consent-referral.helpers.d.ts.map +1 -0
- package/dist/helpers/consent-scopes.helpers.d.ts +7 -0
- package/dist/helpers/consent-scopes.helpers.d.ts.map +1 -0
- package/dist/helpers/contract-event-maintenance.helpers.d.ts +3 -0
- package/dist/helpers/contract-event-maintenance.helpers.d.ts.map +1 -0
- package/dist/helpers/contract-events.helpers.d.ts +25 -0
- package/dist/helpers/contract-events.helpers.d.ts.map +1 -0
- package/dist/helpers/contract-requests.helpers.d.ts +19 -0
- package/dist/helpers/contract-requests.helpers.d.ts.map +1 -0
- package/dist/helpers/credentialSubject.helpers.d.ts +3 -0
- package/dist/helpers/credentialSubject.helpers.d.ts.map +1 -0
- package/dist/helpers/credentialSubject.helpers.test.d.ts +2 -0
- package/dist/helpers/credentialSubject.helpers.test.d.ts.map +1 -0
- package/dist/helpers/finalize-inbox.helpers.d.ts +3 -3
- package/dist/helpers/finalize-inbox.helpers.d.ts.map +1 -1
- package/dist/helpers/inbox.helpers.d.ts.map +1 -1
- package/dist/helpers/inline-template.helpers.d.ts +45 -0
- package/dist/helpers/inline-template.helpers.d.ts.map +1 -0
- package/dist/helpers/notificationMessages.d.ts +1 -1
- package/dist/helpers/notificationMessages.d.ts.map +1 -1
- package/dist/helpers/notificationQueue.helpers.d.ts.map +1 -1
- package/dist/helpers/notifications.helpers.d.ts +6 -0
- package/dist/helpers/notifications.helpers.d.ts.map +1 -1
- package/dist/helpers/presentation-metadata.d.ts +4 -0
- package/dist/helpers/presentation-metadata.d.ts.map +1 -0
- package/dist/helpers/presentation.helpers.d.ts +1 -1
- package/dist/helpers/presentation.helpers.d.ts.map +1 -1
- package/dist/helpers/profile.helpers.d.ts +2 -0
- package/dist/helpers/profile.helpers.d.ts.map +1 -1
- package/dist/helpers/share-content-client/adapters.d.ts +10 -0
- package/dist/helpers/share-content-client/adapters.d.ts.map +1 -0
- package/dist/helpers/share-content-client/canonical.d.ts +7 -0
- package/dist/helpers/share-content-client/canonical.d.ts.map +1 -0
- package/dist/helpers/share-content-client/client.d.ts +5 -0
- package/dist/helpers/share-content-client/client.d.ts.map +1 -0
- package/dist/helpers/share-content-client/config.d.ts +11 -0
- package/dist/helpers/share-content-client/config.d.ts.map +1 -0
- package/dist/helpers/share-content-client/index.d.ts +6 -0
- package/dist/helpers/share-content-client/index.d.ts.map +1 -0
- package/dist/helpers/share-content-client/responses.d.ts +16 -0
- package/dist/helpers/share-content-client/responses.d.ts.map +1 -0
- package/dist/helpers/share-content-client/types.d.ts +145 -0
- package/dist/helpers/share-content-client/types.d.ts.map +1 -0
- package/dist/helpers/share-link-attachment-access.d.ts +4 -0
- package/dist/helpers/share-link-attachment-access.d.ts.map +1 -0
- package/dist/helpers/share-link-attachment.d.ts +18 -0
- package/dist/helpers/share-link-attachment.d.ts.map +1 -0
- package/dist/helpers/share-link-coordinator/attachment-stat.d.ts +5 -0
- package/dist/helpers/share-link-coordinator/attachment-stat.d.ts.map +1 -0
- package/dist/helpers/share-link-coordinator/budget-helpers.d.ts +5 -0
- package/dist/helpers/share-link-coordinator/budget-helpers.d.ts.map +1 -0
- package/dist/helpers/share-link-coordinator/cleanup-runner.d.ts +3 -0
- package/dist/helpers/share-link-coordinator/cleanup-runner.d.ts.map +1 -0
- package/dist/helpers/share-link-coordinator/coordinator.d.ts +4 -0
- package/dist/helpers/share-link-coordinator/coordinator.d.ts.map +1 -0
- package/dist/helpers/share-link-coordinator/index.d.ts +5 -0
- package/dist/helpers/share-link-coordinator/index.d.ts.map +1 -0
- package/dist/helpers/share-link-coordinator/recovery-runner.d.ts +9 -0
- package/dist/helpers/share-link-coordinator/recovery-runner.d.ts.map +1 -0
- package/dist/helpers/share-link-coordinator/runtime.d.ts +11 -0
- package/dist/helpers/share-link-coordinator/runtime.d.ts.map +1 -0
- package/dist/helpers/share-link-coordinator/stat.d.ts +4 -0
- package/dist/helpers/share-link-coordinator/stat.d.ts.map +1 -0
- package/dist/helpers/share-link-coordinator/types.d.ts +160 -0
- package/dist/helpers/share-link-coordinator/types.d.ts.map +1 -0
- package/dist/helpers/share-link-lifecycle/index.d.ts +5 -0
- package/dist/helpers/share-link-lifecycle/index.d.ts.map +1 -0
- package/dist/helpers/share-link-lifecycle/lease.helpers.d.ts +4 -0
- package/dist/helpers/share-link-lifecycle/lease.helpers.d.ts.map +1 -0
- package/dist/helpers/share-link-lifecycle/recovery.helpers.d.ts +21 -0
- package/dist/helpers/share-link-lifecycle/recovery.helpers.d.ts.map +1 -0
- package/dist/helpers/share-link-lifecycle/request-hash.helpers.d.ts +9 -0
- package/dist/helpers/share-link-lifecycle/request-hash.helpers.d.ts.map +1 -0
- package/dist/helpers/share-link-lifecycle/types.d.ts +14 -0
- package/dist/helpers/share-link-lifecycle/types.d.ts.map +1 -0
- package/dist/helpers/share-link-maintenance/budget.d.ts +12 -0
- package/dist/helpers/share-link-maintenance/budget.d.ts.map +1 -0
- package/dist/helpers/share-link-maintenance/config.d.ts +48 -0
- package/dist/helpers/share-link-maintenance/config.d.ts.map +1 -0
- package/dist/helpers/share-link-maintenance/index.d.ts +8 -0
- package/dist/helpers/share-link-maintenance/index.d.ts.map +1 -0
- package/dist/helpers/share-link-maintenance/runner.d.ts +20 -0
- package/dist/helpers/share-link-maintenance/runner.d.ts.map +1 -0
- package/dist/helpers/share-link-maintenance/runtime.d.ts +38 -0
- package/dist/helpers/share-link-maintenance/runtime.d.ts.map +1 -0
- package/dist/helpers/share-link-maintenance/scheduler.d.ts +18 -0
- package/dist/helpers/share-link-maintenance/scheduler.d.ts.map +1 -0
- package/dist/helpers/share-link-maintenance/telemetry.d.ts +5 -0
- package/dist/helpers/share-link-maintenance/telemetry.d.ts.map +1 -0
- package/dist/helpers/share-link-maintenance/types.d.ts +56 -0
- package/dist/helpers/share-link-maintenance/types.d.ts.map +1 -0
- package/dist/helpers/share-link-owner/config.d.ts +16 -0
- package/dist/helpers/share-link-owner/config.d.ts.map +1 -0
- package/dist/helpers/share-link-owner/diagnostics.d.ts +26 -0
- package/dist/helpers/share-link-owner/diagnostics.d.ts.map +1 -0
- package/dist/helpers/share-link-owner/lazy-initializer.d.ts +2 -0
- package/dist/helpers/share-link-owner/lazy-initializer.d.ts.map +1 -0
- package/dist/helpers/share-link-owner-projection.d.ts +4 -0
- package/dist/helpers/share-link-owner-projection.d.ts.map +1 -0
- package/dist/helpers/share-link-passcode-abuse.d.ts +2 -0
- package/dist/helpers/share-link-passcode-abuse.d.ts.map +1 -0
- package/dist/helpers/share-link-passcode.d.ts +6 -0
- package/dist/helpers/share-link-passcode.d.ts.map +1 -0
- package/dist/helpers/share-link-policy/index.d.ts +4 -0
- package/dist/helpers/share-link-policy/index.d.ts.map +1 -0
- package/dist/helpers/share-link-policy/production.d.ts +11 -0
- package/dist/helpers/share-link-policy/production.d.ts.map +1 -0
- package/dist/helpers/share-link-policy/resolver.d.ts +6 -0
- package/dist/helpers/share-link-policy/resolver.d.ts.map +1 -0
- package/dist/helpers/share-link-policy/types.d.ts +22 -0
- package/dist/helpers/share-link-policy/types.d.ts.map +1 -0
- package/dist/helpers/share-link-public/config.d.ts +13 -0
- package/dist/helpers/share-link-public/config.d.ts.map +1 -0
- package/dist/helpers/share-link-view-notification.d.ts +2 -0
- package/dist/helpers/share-link-view-notification.d.ts.map +1 -0
- package/dist/helpers/signingAuthority.helpers.d.ts.map +1 -1
- package/dist/helpers/smartResume.helpers.d.ts +3 -0
- package/dist/helpers/smartResume.helpers.d.ts.map +1 -0
- package/dist/index.js +2 -2
- package/dist/models/AppManifestVersion.d.ts +20 -0
- package/dist/models/AppManifestVersion.d.ts.map +1 -0
- package/dist/models/AppStoreListing.d.ts +13 -0
- package/dist/models/AppStoreListing.d.ts.map +1 -1
- package/dist/models/ConsentFlowContract.d.ts +13 -2
- package/dist/models/ConsentFlowContract.d.ts.map +1 -1
- package/dist/models/ConsentFlowTerms.d.ts.map +1 -1
- package/dist/models/ConsentFlowTransaction.d.ts.map +1 -1
- package/dist/models/Integration.d.ts +2 -0
- package/dist/models/Integration.d.ts.map +1 -1
- package/dist/models/Presentation.d.ts +2 -0
- package/dist/models/Presentation.d.ts.map +1 -1
- package/dist/models/Profile.d.ts +2 -0
- package/dist/models/Profile.d.ts.map +1 -1
- package/dist/models/ShareLink.d.ts +46 -0
- package/dist/models/ShareLink.d.ts.map +1 -0
- package/dist/models/ShareViewReceipt.d.ts +22 -0
- package/dist/models/ShareViewReceipt.d.ts.map +1 -0
- package/dist/models/index.d.ts +2 -0
- package/dist/models/index.d.ts.map +1 -1
- package/dist/models/share-link-constraints.d.ts +3 -0
- package/dist/models/share-link-constraints.d.ts.map +1 -0
- package/dist/openapi.d.ts +1 -1
- package/dist/openapi.d.ts.map +1 -1
- package/dist/public-share-link-http.d.ts +4 -0
- package/dist/public-share-link-http.d.ts.map +1 -0
- package/dist/routes/app-store.d.ts +619 -0
- package/dist/routes/app-store.d.ts.map +1 -1
- package/dist/routes/boosts.d.ts +2 -2
- package/dist/routes/boosts.d.ts.map +1 -1
- package/dist/routes/contracts.d.ts +148 -5
- package/dist/routes/contracts.d.ts.map +1 -1
- package/dist/routes/credentials.d.ts +35 -1
- package/dist/routes/credentials.d.ts.map +1 -1
- package/dist/routes/inbox.d.ts +52 -2
- package/dist/routes/inbox.d.ts.map +1 -1
- package/dist/routes/index.d.ts +153 -0
- package/dist/routes/index.d.ts.map +1 -1
- package/dist/routes/presentations.d.ts +1 -0
- package/dist/routes/presentations.d.ts.map +1 -1
- package/dist/routes/profile-manager.d.ts.map +1 -1
- package/dist/routes/profiles.d.ts.map +1 -1
- package/dist/routes/public-share-links.d.ts +285 -0
- package/dist/routes/public-share-links.d.ts.map +1 -0
- package/dist/routes/share-links.d.ts +1005 -0
- package/dist/routes/share-links.d.ts.map +1 -0
- package/dist/routes/test.d.ts +5 -0
- package/dist/routes/test.d.ts.map +1 -1
- package/dist/routes/workflows.d.ts.map +1 -1
- package/dist/services/delivery/adapters/postmark.adapter.d.ts.map +1 -1
- package/dist/types/app-manifest.d.ts +339 -0
- package/dist/types/app-manifest.d.ts.map +1 -0
- package/dist/types/app-store-listing.d.ts +34 -0
- package/dist/types/app-store-listing.d.ts.map +1 -1
- package/dist/types/consentflowcontract.d.ts +31 -4
- package/dist/types/consentflowcontract.d.ts.map +1 -1
- package/dist/types/credential-refresh.d.ts +1 -1
- package/esbuildPlugins.cjs +1 -0
- package/lambda.ts +49 -192
- package/lambdaApp.ts +203 -0
- package/package.json +25 -17
- package/scripts/export-openapi.ts +20 -0
- package/scripts/offline-schema-environment.ts +18 -0
- package/scripts/seed-demo-persona.ts +425 -0
- package/scripts/verify-python-contracts.ts +72 -0
- package/serverless-local.yml +3 -6
- package/serverless.function-env.cjs +50 -0
- package/serverless.local.yml +0 -1
- package/serverless.yml +44 -55
- package/shareLinkMaintenanceLambda.ts +18 -0
- package/shareLinkMaintenanceLambdaApp.ts +50 -0
- package/src/accesslayer/app-manifest-version/create.ts +57 -0
- package/src/accesslayer/app-manifest-version/read.ts +129 -0
- package/src/accesslayer/app-manifest-version/update.ts +61 -0
- package/src/accesslayer/app-store-listing/read.ts +6 -0
- package/src/accesslayer/app-store-listing/relationships/create.ts +20 -0
- package/src/accesslayer/app-store-listing/relationships/read.ts +24 -1
- package/src/accesslayer/app-store-listing/update.ts +15 -0
- package/src/accesslayer/boost/relationships/create.ts +8 -2
- package/src/accesslayer/consentflowcontract/create.ts +81 -8
- package/src/accesslayer/consentflowcontract/read.ts +84 -10
- package/src/accesslayer/consentflowcontract/relationships/create.ts +125 -109
- package/src/accesslayer/consentflowcontract/relationships/delete.ts +1 -0
- package/src/accesslayer/consentflowcontract/relationships/read.ts +184 -108
- package/src/accesslayer/consentflowcontract/relationships/recipients.ts +125 -0
- package/src/accesslayer/consentflowcontract/relationships/smartResume.ts +125 -0
- package/src/accesslayer/consentflowcontract/relationships/update.ts +255 -217
- package/src/accesslayer/credential/create.test.ts +2 -115
- package/src/accesslayer/credential/create.ts +11 -6
- package/src/accesslayer/credential/relationships/create.ts +17 -10
- package/src/accesslayer/inbox-credential/relationships/create.ts +70 -48
- package/src/accesslayer/inbox-credential/update.ts +4 -2
- package/src/accesslayer/presentation/read.ts +57 -25
- package/src/accesslayer/presentation/relationships/create.ts +54 -11
- package/src/accesslayer/presentation/relationships/read.ts +21 -6
- package/src/accesslayer/share-link/abandon.ts +120 -0
- package/src/accesslayer/share-link/attachment.ts +360 -0
- package/src/accesslayer/share-link/cleanup.ts +271 -0
- package/src/accesslayer/share-link/errors.ts +32 -0
- package/src/accesslayer/share-link/finalize.ts +313 -0
- package/src/accesslayer/share-link/helpers.ts +450 -0
- package/src/accesslayer/share-link/index.ts +11 -0
- package/src/accesslayer/share-link/list.ts +162 -0
- package/src/accesslayer/share-link/read.ts +107 -0
- package/src/accesslayer/share-link/receipt.ts +548 -0
- package/src/accesslayer/share-link/recovery.ts +565 -0
- package/src/accesslayer/share-link/reserve.ts +763 -0
- package/src/accesslayer/share-link/revoke.ts +232 -0
- package/src/accesslayer/share-link/transaction-execution.ts +72 -0
- package/src/accesslayer/share-link/transaction.ts +126 -0
- package/src/accesslayer/share-link/types.ts +606 -0
- package/src/app.ts +6 -0
- package/src/cache/app-store.caches.ts +35 -0
- package/src/config/applyDockerStageConfig.ts +6 -0
- package/src/config/environment.test.ts +17 -12
- package/src/config/environment.ts +15 -0
- package/src/config/serverlessFunctionEnv.test.ts +105 -0
- package/src/config/stageConfig.test.ts +25 -0
- package/src/config/stageConfig.ts +24 -0
- package/src/constants/auth-grant.ts +5 -0
- package/src/docker-entry.ts +81 -0
- package/src/helpers/app-manifest.helpers.ts +185 -0
- package/src/helpers/boost.helpers.ts +4 -31
- package/src/helpers/claim-hooks.helpers.ts +20 -7
- package/src/helpers/consent-referral.helpers.ts +6 -0
- package/src/helpers/consent-scopes.helpers.ts +58 -0
- package/src/helpers/contract-event-maintenance.helpers.ts +43 -0
- package/src/helpers/contract-events.helpers.ts +540 -0
- package/src/helpers/contract-requests.helpers.ts +211 -0
- package/src/helpers/credentialSubject.helpers.test.ts +114 -0
- package/src/helpers/credentialSubject.helpers.ts +40 -0
- package/src/helpers/finalize-inbox.helpers.ts +163 -44
- package/src/helpers/inbox.helpers.ts +58 -70
- package/src/helpers/inline-template.helpers.ts +560 -0
- package/src/helpers/notificationMessages.ts +77 -1
- package/src/helpers/notificationQueue.helpers.ts +23 -5
- package/src/helpers/notifications.helpers.ts +25 -1
- package/src/helpers/presentation-metadata.ts +41 -0
- package/src/helpers/presentation.helpers.ts +27 -20
- package/src/helpers/profile.helpers.ts +13 -0
- package/src/helpers/share-content-client/adapters.ts +55 -0
- package/src/helpers/share-content-client/canonical.ts +25 -0
- package/src/helpers/share-content-client/client.ts +440 -0
- package/src/helpers/share-content-client/config.ts +189 -0
- package/src/helpers/share-content-client/index.ts +27 -0
- package/src/helpers/share-content-client/responses.ts +273 -0
- package/src/helpers/share-content-client/types.ts +253 -0
- package/src/helpers/share-link-attachment-access.ts +87 -0
- package/src/helpers/share-link-attachment.ts +115 -0
- package/src/helpers/share-link-coordinator/attachment-stat.ts +41 -0
- package/src/helpers/share-link-coordinator/budget-helpers.ts +53 -0
- package/src/helpers/share-link-coordinator/cleanup-runner.ts +286 -0
- package/src/helpers/share-link-coordinator/coordinator.ts +727 -0
- package/src/helpers/share-link-coordinator/index.ts +8 -0
- package/src/helpers/share-link-coordinator/recovery-runner.ts +443 -0
- package/src/helpers/share-link-coordinator/runtime.ts +88 -0
- package/src/helpers/share-link-coordinator/stat.ts +30 -0
- package/src/helpers/share-link-coordinator/types.ts +353 -0
- package/src/helpers/share-link-lifecycle/index.ts +4 -0
- package/src/helpers/share-link-lifecycle/lease.helpers.ts +35 -0
- package/src/helpers/share-link-lifecycle/recovery.helpers.ts +173 -0
- package/src/helpers/share-link-lifecycle/request-hash.helpers.ts +130 -0
- package/src/helpers/share-link-lifecycle/types.ts +58 -0
- package/src/helpers/share-link-maintenance/budget.ts +63 -0
- package/src/helpers/share-link-maintenance/config.ts +312 -0
- package/src/helpers/share-link-maintenance/index.ts +24 -0
- package/src/helpers/share-link-maintenance/runner.ts +251 -0
- package/src/helpers/share-link-maintenance/runtime.ts +340 -0
- package/src/helpers/share-link-maintenance/scheduler.ts +126 -0
- package/src/helpers/share-link-maintenance/telemetry.ts +73 -0
- package/src/helpers/share-link-maintenance/types.ts +91 -0
- package/src/helpers/share-link-owner/config.ts +48 -0
- package/src/helpers/share-link-owner/diagnostics.ts +89 -0
- package/src/helpers/share-link-owner/lazy-initializer.ts +29 -0
- package/src/helpers/share-link-owner-projection.ts +54 -0
- package/src/helpers/share-link-passcode-abuse.ts +36 -0
- package/src/helpers/share-link-passcode.ts +47 -0
- package/src/helpers/share-link-policy/index.ts +7 -0
- package/src/helpers/share-link-policy/production.ts +108 -0
- package/src/helpers/share-link-policy/resolver.ts +113 -0
- package/src/helpers/share-link-policy/types.ts +56 -0
- package/src/helpers/share-link-public/config.ts +41 -0
- package/src/helpers/share-link-view-notification.ts +18 -0
- package/src/helpers/signingAuthority.helpers.ts +23 -14
- package/src/helpers/smartResume.helpers.ts +123 -0
- package/src/models/AppManifestVersion.ts +43 -0
- package/src/models/AppStoreListing.ts +32 -0
- package/src/models/ConsentFlowContract.ts +34 -3
- package/src/models/ConsentFlowTerms.ts +10 -0
- package/src/models/ConsentFlowTransaction.ts +3 -0
- package/src/models/Integration.ts +2 -0
- package/src/models/Presentation.ts +2 -2
- package/src/models/Profile.ts +3 -2
- package/src/models/ShareLink.ts +134 -0
- package/src/models/ShareViewReceipt.ts +69 -0
- package/src/models/index.ts +25 -0
- package/src/models/share-link-constraints.ts +98 -0
- package/src/openapi.ts +44 -8
- package/src/public-share-link-http.ts +49 -0
- package/src/routes/app-store.ts +1056 -38
- package/src/routes/boosts.ts +14 -25
- package/src/routes/contracts.ts +384 -273
- package/src/routes/inbox.ts +4 -2
- package/src/routes/index.ts +142 -44
- package/src/routes/presentations.ts +19 -3
- package/src/routes/profile-manager.ts +29 -2
- package/src/routes/profiles.ts +29 -6
- package/src/routes/public-share-links.ts +983 -0
- package/src/routes/share-links.ts +709 -0
- package/src/routes/workflows.ts +3 -2
- package/src/services/delivery/adapters/postmark.adapter.ts +4 -1
- package/src/types/app-manifest.ts +28 -0
- package/src/types/app-store-listing.ts +13 -0
- package/src/types/consentflowcontract.ts +25 -4
- package/test/app-manifest.helpers.spec.ts +170 -0
- package/test/app-manifest.routes.spec.ts +299 -0
- package/test/app-store-listing-updates.spec.ts +236 -0
- package/test/app-store-listing.spec.ts +65 -3
- package/test/consent-data-boundaries.spec.ts +352 -0
- package/test/consent-recipients.spec.ts +513 -0
- package/test/consent-scopes.helpers.spec.ts +67 -0
- package/test/consentflow.spec.ts +63 -2
- package/test/contract-requests.spec.ts +1588 -0
- package/test/credential-storage.neo4j.spec.ts +122 -0
- package/test/dids.spec.ts +10 -1
- package/test/guardian-gated-routes.spec.ts +49 -0
- package/test/helpers/share-link-fixtures.ts +94 -0
- package/test/inbox-security.e2e.ts +26 -10
- package/test/inbox.spec.ts +184 -8
- package/test/inline-template.helpers.spec.ts +49 -0
- package/test/managed-recipient-inbox.spec.ts +152 -0
- package/test/notificationMessages.spec.ts +13 -0
- package/test/openapi.spec.ts +14 -53
- package/test/presentations.spec.ts +54 -6
- package/test/profiles.spec.ts +97 -1
- package/test/share-content-client.contract.spec.ts +365 -0
- package/test/share-content-client.unit.spec.ts +462 -0
- package/test/share-link-abuse.unit.spec.ts +65 -0
- package/test/share-link-attachment.neo4j.spec.ts +262 -0
- package/test/share-link-attachment.unit.spec.ts +244 -0
- package/test/share-link-coordinator.neo4j.spec.ts +684 -0
- package/test/share-link-coordinator.unit.spec.ts +990 -0
- package/test/share-link-dependency-diagnostics.unit.spec.ts +127 -0
- package/test/share-link-lifecycle.neo4j.spec.ts +1411 -0
- package/test/share-link-lifecycle.unit.spec.ts +205 -0
- package/test/share-link-list-cursor.unit.spec.ts +86 -0
- package/test/share-link-list.neo4j.spec.ts +324 -0
- package/test/share-link-maintenance.neo4j.spec.ts +355 -0
- package/test/share-link-maintenance.unit.spec.ts +1140 -0
- package/test/share-link-owner-policy.unit.spec.ts +210 -0
- package/test/share-link-owner-route.unit.spec.ts +820 -0
- package/test/share-link-owner-runtime.unit.spec.ts +102 -0
- package/test/share-link-passcode.unit.spec.ts +29 -0
- package/test/share-link-policy.unit.spec.ts +149 -0
- package/test/share-link-presentation-metadata.unit.spec.ts +49 -0
- package/test/share-link-production-policy.unit.spec.ts +126 -0
- package/test/share-link-public-config.unit.spec.ts +64 -0
- package/test/share-link-public-http-adapter.unit.spec.ts +315 -0
- package/test/share-link-public-route.unit.spec.ts +1079 -0
- package/test/share-link-receipt.neo4j.spec.ts +943 -0
- package/test/share-link-recovery.neo4j.spec.ts +935 -0
- package/test/share-link-recovery.unit.spec.ts +726 -0
- package/test/share-link-service-policy.neo4j.spec.ts +403 -0
- package/test/signing-authority-encryption.spec.ts +75 -0
- package/test/smart-resume-consent.spec.ts +233 -0
- package/test/smart-resume-upload.spec.ts +65 -0
- package/tsconfig.build.json +1 -1
- package/tsconfig.json +1 -0
- package/vitest.config.ts +14 -0
- package/vitest.inbox-e2e.config.ts +2 -0
- package/vitest.share-links-neo4j.config.ts +19 -0
- package/vitest.share-links-unit.config.ts +28 -0
- package/workerLambda.test.ts +100 -0
package/src/routes/inbox.ts
CHANGED
|
@@ -768,8 +768,10 @@ export const inboxRouter = t.router({
|
|
|
768
768
|
claimed: z.number(),
|
|
769
769
|
errors: z.number(),
|
|
770
770
|
guardianPending: z.number(),
|
|
771
|
-
verifiableCredentials: z.array(VCValidator),
|
|
772
|
-
deliveries: z.array(
|
|
771
|
+
verifiableCredentials: z.array(VCValidator.or(JWEValidator)),
|
|
772
|
+
deliveries: z.array(
|
|
773
|
+
z.object({ id: z.string(), credential: VCValidator.or(JWEValidator) })
|
|
774
|
+
),
|
|
773
775
|
})
|
|
774
776
|
)
|
|
775
777
|
.mutation(async ({ ctx }) => {
|
package/src/routes/index.ts
CHANGED
|
@@ -11,6 +11,7 @@ import jwtDecode from 'jwt-decode';
|
|
|
11
11
|
import * as Sentry from '@sentry/serverless';
|
|
12
12
|
import { ACT_AS_HEADER, AUTH_GRANT_AUDIENCE_DOMAIN_PREFIX } from '@learncard/types';
|
|
13
13
|
import { ContactMethodType } from '@learncard/types';
|
|
14
|
+
import { MAX_SHARE_LINK_REQUEST_BYTES, utf8ByteLength } from '@learncard/types';
|
|
14
15
|
|
|
15
16
|
import { RegExpTransformer } from '@learncard/helpers';
|
|
16
17
|
import { resolveTenantFromRequest, type ResolvedTenant } from '@learncard/email-templates';
|
|
@@ -22,6 +23,7 @@ import {
|
|
|
22
23
|
} from '@accesslayer/profile/relationships/read';
|
|
23
24
|
import { getDidWeb } from '@helpers/did.helpers';
|
|
24
25
|
import { getEmptyLearnCard, isServersDidWebDID } from '@helpers/learnCard.helpers';
|
|
26
|
+
import { isServiceProfileExemptFromGuardianship } from '@helpers/profile.helpers';
|
|
25
27
|
import { invalidateChallengeForDid, isChallengeValidForDid } from '@cache/challenges';
|
|
26
28
|
import { ProfileType } from 'types/profile';
|
|
27
29
|
import { getProfileManagerById } from '@accesslayer/profile-manager/read';
|
|
@@ -217,14 +219,93 @@ export const createContext = async (
|
|
|
217
219
|
return { domain, tenant, _guardianApprovalToken, sourceIp, actAs };
|
|
218
220
|
};
|
|
219
221
|
|
|
220
|
-
|
|
221
|
-
|
|
222
|
-
|
|
223
|
-
Sentry.configureScope(scope => {
|
|
224
|
-
scope.setTransactionName(`trpc-${path}`);
|
|
225
|
-
});
|
|
226
|
-
return next({ ctx });
|
|
222
|
+
const sentryTransactionNameMiddleware = t.middleware(({ ctx, next, path }) => {
|
|
223
|
+
Sentry.configureScope(scope => {
|
|
224
|
+
scope.setTransactionName(`trpc-${path}`);
|
|
227
225
|
});
|
|
226
|
+
return next({ ctx });
|
|
227
|
+
});
|
|
228
|
+
|
|
229
|
+
// Sentry's tRPC middleware type predates this repo's generic context. Cast
|
|
230
|
+
// through the tRPC builder's expected parameter type instead of `any`.
|
|
231
|
+
type SentryTrpcMiddleware = Parameters<typeof t.middleware>[0];
|
|
232
|
+
|
|
233
|
+
const sentryInputCaptureMiddleware = Sentry.Handlers.trpcMiddleware({
|
|
234
|
+
attachRpcInput: true,
|
|
235
|
+
}) as unknown as SentryTrpcMiddleware;
|
|
236
|
+
|
|
237
|
+
const sentryNoInputCaptureMiddleware = Sentry.Handlers.trpcMiddleware({
|
|
238
|
+
attachRpcInput: false,
|
|
239
|
+
}) as unknown as SentryTrpcMiddleware;
|
|
240
|
+
|
|
241
|
+
/**
|
|
242
|
+
* Complete-request byte bound for owner share-link routes, enforced on the RAW
|
|
243
|
+
* input before Zod parsing/stripping. Individual field validators cannot bound a
|
|
244
|
+
* request whose unknown or duplicate fields are stripped first, so this measures
|
|
245
|
+
* the whole serialized body (UTF-8) and fails closed over the shared 1 MiB cap.
|
|
246
|
+
*
|
|
247
|
+
* It is composed into the base so it runs before authentication and before any
|
|
248
|
+
* input parser, and can never be skipped by a malformed or unauthenticated call.
|
|
249
|
+
*/
|
|
250
|
+
const enforceShareLinkRequestByteBound = t.middleware(async ({ ctx, next, getRawInput }) => {
|
|
251
|
+
const raw = await getRawInput();
|
|
252
|
+
|
|
253
|
+
let bytes: number;
|
|
254
|
+
if (raw === undefined || raw === null) {
|
|
255
|
+
bytes = 0;
|
|
256
|
+
} else if (typeof raw === 'string') {
|
|
257
|
+
bytes = utf8ByteLength(raw);
|
|
258
|
+
} else {
|
|
259
|
+
let serialized: string;
|
|
260
|
+
try {
|
|
261
|
+
serialized = JSON.stringify(raw);
|
|
262
|
+
} catch {
|
|
263
|
+
throw new TRPCError({ code: 'BAD_REQUEST', message: 'invalid share-link request' });
|
|
264
|
+
}
|
|
265
|
+
bytes = utf8ByteLength(serialized);
|
|
266
|
+
}
|
|
267
|
+
|
|
268
|
+
if (bytes > MAX_SHARE_LINK_REQUEST_BYTES) {
|
|
269
|
+
throw new TRPCError({
|
|
270
|
+
code: 'PAYLOAD_TOO_LARGE',
|
|
271
|
+
message: 'share-link request exceeds the 1 MiB limit',
|
|
272
|
+
});
|
|
273
|
+
}
|
|
274
|
+
|
|
275
|
+
return next({ ctx });
|
|
276
|
+
});
|
|
277
|
+
|
|
278
|
+
export const openRoute = t.procedure
|
|
279
|
+
.use(t.middleware(sentryInputCaptureMiddleware))
|
|
280
|
+
.use(sentryTransactionNameMiddleware);
|
|
281
|
+
|
|
282
|
+
/**
|
|
283
|
+
* LC-2187 public share-link paths must never be cached by an intermediary or a
|
|
284
|
+
* browser. tRPC has no per-procedure header API, so the actual HTTP adapters
|
|
285
|
+
* (Fastify and Lambda, both tRPC and OpenAPI) apply `Cache-Control` from the
|
|
286
|
+
* resolved procedure path through this single helper.
|
|
287
|
+
*/
|
|
288
|
+
export const PUBLIC_SHARE_LINK_ROUTE_PREFIX = 'publicShareLinks.';
|
|
289
|
+
|
|
290
|
+
export const publicShareLinkCacheControlHeaders = (
|
|
291
|
+
paths: readonly string[] | undefined
|
|
292
|
+
): Record<string, string> =>
|
|
293
|
+
(paths ?? []).some(path => path.startsWith(PUBLIC_SHARE_LINK_ROUTE_PREFIX))
|
|
294
|
+
? { 'Cache-Control': 'private, no-store' }
|
|
295
|
+
: {};
|
|
296
|
+
|
|
297
|
+
/**
|
|
298
|
+
* Route base for procedures whose input carries owner-private material (titles,
|
|
299
|
+
* notes, ciphertext envelopes, recovery JWEs) and whose error paths must not
|
|
300
|
+
* attach raw request bodies to Sentry. It runs the same Sentry error/transaction
|
|
301
|
+
* handling but with input attachment disabled, so no branch — malformed,
|
|
302
|
+
* unauthenticated or failing — can capture the payload, and it enforces the
|
|
303
|
+
* complete-request byte bound before input parsing.
|
|
304
|
+
*/
|
|
305
|
+
export const openRouteWithoutInputCapture = t.procedure
|
|
306
|
+
.use(t.middleware(sentryNoInputCaptureMiddleware))
|
|
307
|
+
.use(sentryTransactionNameMiddleware)
|
|
308
|
+
.use(enforceShareLinkRequestByteBound);
|
|
228
309
|
|
|
229
310
|
export const resolveProfileFromContextDid = async (
|
|
230
311
|
didFromContext: string | undefined,
|
|
@@ -316,27 +397,33 @@ const resolveActAs = async (
|
|
|
316
397
|
return { ...user, profile: target, did: target.did, onBehalfOf: profile.profileId };
|
|
317
398
|
};
|
|
318
399
|
|
|
319
|
-
|
|
320
|
-
|
|
321
|
-
|
|
322
|
-
|
|
400
|
+
const withDid = (base: typeof openRoute) =>
|
|
401
|
+
base.use(async ({ ctx, next }) => {
|
|
402
|
+
if (!ctx.user?.did) {
|
|
403
|
+
throw new TRPCError({ code: 'UNAUTHORIZED' });
|
|
404
|
+
}
|
|
323
405
|
|
|
324
|
-
|
|
406
|
+
const profile = await resolveProfileFromContextDid(ctx.user.did, ctx.domain);
|
|
325
407
|
|
|
326
|
-
|
|
408
|
+
if (profile) Sentry.setUser({ id: profile.profileId, username: profile.displayName });
|
|
327
409
|
|
|
328
|
-
|
|
329
|
-
|
|
330
|
-
|
|
410
|
+
const user = ctx.user.isChallengeValid
|
|
411
|
+
? await resolveActAs({ ...ctx.user, profile }, ctx.actAs, ctx.domain)
|
|
412
|
+
: { ...ctx.user, profile };
|
|
331
413
|
|
|
332
|
-
|
|
333
|
-
});
|
|
414
|
+
return next({ ctx: { ...ctx, user } });
|
|
415
|
+
});
|
|
334
416
|
|
|
335
|
-
export const
|
|
336
|
-
if (!ctx.user?.isChallengeValid) throw new TRPCError({ code: 'UNAUTHORIZED' });
|
|
417
|
+
export const didRoute = withDid(openRoute);
|
|
337
418
|
|
|
338
|
-
|
|
339
|
-
})
|
|
419
|
+
const withChallenge = (base: typeof didRoute) =>
|
|
420
|
+
base.use(({ ctx, next }) => {
|
|
421
|
+
if (!ctx.user?.isChallengeValid) throw new TRPCError({ code: 'UNAUTHORIZED' });
|
|
422
|
+
|
|
423
|
+
return next({ ctx: { ...ctx, user: ctx.user } });
|
|
424
|
+
});
|
|
425
|
+
|
|
426
|
+
export const didAndChallengeRoute = withChallenge(didRoute);
|
|
340
427
|
|
|
341
428
|
export const scopedRoute = didAndChallengeRoute.use(({ ctx, next, meta }) => {
|
|
342
429
|
if (!meta?.requiredScope) {
|
|
@@ -370,33 +457,41 @@ export const openProfileRoute = didRoute.use(async ({ ctx, next }) => {
|
|
|
370
457
|
return next({ ctx: { ...ctx, user: { ...ctx.user, profile } } });
|
|
371
458
|
});
|
|
372
459
|
|
|
373
|
-
|
|
374
|
-
|
|
460
|
+
const withProfile = (base: typeof didAndChallengeRoute) =>
|
|
461
|
+
base.use(async ({ ctx, next, meta }) => {
|
|
462
|
+
const { profile } = ctx.user;
|
|
375
463
|
|
|
376
|
-
|
|
377
|
-
|
|
378
|
-
|
|
379
|
-
|
|
380
|
-
|
|
381
|
-
|
|
464
|
+
if (!profile) {
|
|
465
|
+
throw new TRPCError({
|
|
466
|
+
code: 'NOT_FOUND',
|
|
467
|
+
message: 'Profile not found. Please make a profile!',
|
|
468
|
+
});
|
|
469
|
+
}
|
|
382
470
|
|
|
383
|
-
|
|
384
|
-
|
|
385
|
-
|
|
471
|
+
if (!meta?.requiredScope) {
|
|
472
|
+
return next({ ctx: { ...ctx, user: { ...ctx.user, profile } } });
|
|
473
|
+
}
|
|
386
474
|
|
|
387
|
-
|
|
475
|
+
const userScope = ctx.user?.scope || AUTH_GRANT_NO_ACCESS_SCOPE;
|
|
388
476
|
|
|
389
|
-
|
|
477
|
+
const hasRequiredScope = userHasRequiredScopes(userScope, meta.requiredScope);
|
|
390
478
|
|
|
391
|
-
|
|
392
|
-
|
|
393
|
-
|
|
394
|
-
|
|
395
|
-
|
|
396
|
-
|
|
479
|
+
if (!hasRequiredScope) {
|
|
480
|
+
throw new TRPCError({
|
|
481
|
+
code: 'UNAUTHORIZED',
|
|
482
|
+
message: `This operation requires ${meta.requiredScope} scope`,
|
|
483
|
+
});
|
|
484
|
+
}
|
|
397
485
|
|
|
398
|
-
|
|
399
|
-
});
|
|
486
|
+
return next({ ctx: { ...ctx, user: { ...ctx.user, profile } } });
|
|
487
|
+
});
|
|
488
|
+
|
|
489
|
+
export const profileRoute = withProfile(didAndChallengeRoute);
|
|
490
|
+
|
|
491
|
+
/** Same auth chain, composed on a base that never attaches private RPC input to Sentry. */
|
|
492
|
+
export const didRouteWithoutInputCapture = withDid(openRouteWithoutInputCapture);
|
|
493
|
+
export const didAndChallengeRouteWithoutInputCapture = withChallenge(didRouteWithoutInputCapture);
|
|
494
|
+
export const profileRouteWithoutInputCapture = withProfile(didAndChallengeRouteWithoutInputCapture);
|
|
400
495
|
|
|
401
496
|
export const openProfileManagerRoute = openRoute.use(async ({ ctx, next }) => {
|
|
402
497
|
if (!ctx.user?.did) throw new TRPCError({ code: 'UNAUTHORIZED' });
|
|
@@ -460,7 +555,10 @@ const GUARDIAN_APPROVAL_CLOCK_SKEW_SECONDS = 60;
|
|
|
460
555
|
export const guardianGatedRoute = profileRoute.use(async ({ ctx, next }) => {
|
|
461
556
|
const { profile } = ctx.user;
|
|
462
557
|
const guardianApprovalToken = ctx._guardianApprovalToken;
|
|
463
|
-
|
|
558
|
+
// Service profiles (orgs) are managed for admin purposes, not guardianship.
|
|
559
|
+
const isChildAccount =
|
|
560
|
+
!isServiceProfileExemptFromGuardianship(profile.isServiceProfile, profile.type) &&
|
|
561
|
+
(await isProfileManaged(profile.profileId));
|
|
464
562
|
let guardianIdentity: { profileId: string; did: string } | undefined;
|
|
465
563
|
|
|
466
564
|
if (isChildAccount && guardianApprovalToken) {
|
|
@@ -16,6 +16,10 @@ import { getPresentationOwner } from '@accesslayer/presentation/relationships/re
|
|
|
16
16
|
import { deletePresentation } from '@accesslayer/presentation/delete';
|
|
17
17
|
import { isRelationshipBlocked } from '@helpers/connection.helpers';
|
|
18
18
|
import { getProfileIdFromString } from '@helpers/did.helpers';
|
|
19
|
+
import {
|
|
20
|
+
assertPresentationMetadataRecipient,
|
|
21
|
+
PresentationMetadataValidator,
|
|
22
|
+
} from '@helpers/presentation-metadata';
|
|
19
23
|
|
|
20
24
|
export const presentationsRouter = t.router({
|
|
21
25
|
sendPresentation: profileRoute
|
|
@@ -31,11 +35,17 @@ export const presentationsRouter = t.router({
|
|
|
31
35
|
},
|
|
32
36
|
requiredScope: 'presentations:write',
|
|
33
37
|
})
|
|
34
|
-
.input(
|
|
38
|
+
.input(
|
|
39
|
+
z.object({
|
|
40
|
+
profileId: z.string(),
|
|
41
|
+
presentation: VPValidator.or(JWEValidator),
|
|
42
|
+
metadata: PresentationMetadataValidator.optional(),
|
|
43
|
+
})
|
|
44
|
+
)
|
|
35
45
|
.output(z.string())
|
|
36
46
|
.mutation(async ({ ctx, input }) => {
|
|
37
47
|
const { profile } = ctx.user;
|
|
38
|
-
const { profileId, presentation } = input;
|
|
48
|
+
const { profileId, presentation, metadata } = input;
|
|
39
49
|
|
|
40
50
|
const resolvedProfileId = await getProfileIdFromString(profileId, ctx.domain);
|
|
41
51
|
if (!resolvedProfileId) {
|
|
@@ -52,7 +62,13 @@ export const presentationsRouter = t.router({
|
|
|
52
62
|
});
|
|
53
63
|
}
|
|
54
64
|
|
|
55
|
-
|
|
65
|
+
assertPresentationMetadataRecipient(
|
|
66
|
+
metadata,
|
|
67
|
+
profile.profileId,
|
|
68
|
+
targetProfile.profileId
|
|
69
|
+
);
|
|
70
|
+
|
|
71
|
+
return sendPresentation(profile, targetProfile, presentation, ctx.domain, metadata);
|
|
56
72
|
}),
|
|
57
73
|
|
|
58
74
|
acceptPresentation: profileRoute
|
|
@@ -18,13 +18,18 @@ import { checkIfProfileExists } from '@accesslayer/profile/read';
|
|
|
18
18
|
import { ProfileManagerType, ProfileManagerValidator } from 'types/profile-manager';
|
|
19
19
|
import { getLearnCard } from '@helpers/learnCard.helpers';
|
|
20
20
|
import { createProfile } from '@accesslayer/profile/create';
|
|
21
|
+
import { PublicProfileIdValidator } from '@helpers/profile.helpers';
|
|
21
22
|
import { createManagesRelationship } from '@accesslayer/profile-manager/relationships/create';
|
|
22
23
|
import { deleteManagesRelationship } from '@accesslayer/profile-manager/relationships/delete';
|
|
23
24
|
import { getBoostByUri } from '@accesslayer/boost/read';
|
|
24
|
-
import {
|
|
25
|
+
import {
|
|
26
|
+
getManagedProfiles,
|
|
27
|
+
getProfilesManagedByProfile,
|
|
28
|
+
} from '@accesslayer/profile-manager/relationships/read';
|
|
25
29
|
import { getProfilesThatManageAProfile } from '@accesslayer/profile/relationships/read';
|
|
26
30
|
import { updateProfileManager } from '@accesslayer/profile-manager/update';
|
|
27
31
|
import { getProfileManagerById } from '@accesslayer/profile-manager/read';
|
|
32
|
+
import { ProfileManager } from '@models';
|
|
28
33
|
|
|
29
34
|
export const profileManagersRouter = t.router({
|
|
30
35
|
createProfileManager: profileRoute
|
|
@@ -115,9 +120,31 @@ export const profileManagersRouter = t.router({
|
|
|
115
120
|
},
|
|
116
121
|
requiredScope: 'profileManagers:write',
|
|
117
122
|
})
|
|
118
|
-
.input(
|
|
123
|
+
.input(
|
|
124
|
+
LCNProfileValidator.omit({ did: true }).extend({
|
|
125
|
+
profileId: PublicProfileIdValidator,
|
|
126
|
+
})
|
|
127
|
+
)
|
|
119
128
|
.output(z.string())
|
|
120
129
|
.mutation(async ({ input, ctx }) => {
|
|
130
|
+
// Org onboarding also uses this API. Only the persisted Family parent
|
|
131
|
+
// (or an explicit child type), not a client service flag, defines a child path.
|
|
132
|
+
if (input.isServiceProfile) {
|
|
133
|
+
const parents = await ProfileManager.findRelationships({
|
|
134
|
+
alias: 'childOf',
|
|
135
|
+
where: { source: { id: ctx.user.manager.id } },
|
|
136
|
+
});
|
|
137
|
+
if (
|
|
138
|
+
input.type === 'child' ||
|
|
139
|
+
parents.some(({ target }) => target.category === 'Family')
|
|
140
|
+
) {
|
|
141
|
+
throw new TRPCError({
|
|
142
|
+
code: 'BAD_REQUEST',
|
|
143
|
+
message: 'Child profiles cannot be service profiles.',
|
|
144
|
+
});
|
|
145
|
+
}
|
|
146
|
+
}
|
|
147
|
+
|
|
121
148
|
const profileExists = await checkIfProfileExists(input);
|
|
122
149
|
|
|
123
150
|
if (profileExists) {
|
package/src/routes/profiles.ts
CHANGED
|
@@ -67,7 +67,7 @@ import { ProfileType, SigningAuthorityForUserValidator } from 'types/profile';
|
|
|
67
67
|
|
|
68
68
|
import { t, openRoute, didAndChallengeRoute, profileRoute, didRoute } from '@routes';
|
|
69
69
|
|
|
70
|
-
import { transformProfileId } from '@helpers/profile.helpers';
|
|
70
|
+
import { PublicProfileIdValidator, transformProfileId } from '@helpers/profile.helpers';
|
|
71
71
|
import { deleteDidDocForProfile } from '@cache/did-docs';
|
|
72
72
|
import {
|
|
73
73
|
isInviteAlreadySetForProfile,
|
|
@@ -102,7 +102,7 @@ import { createProfileContactMethodRelationship } from '@accesslayer/contact-met
|
|
|
102
102
|
import { deleteAllProfileContactMethodRelationshipsExceptForProfileId } from '@accesslayer/contact-method/relationships/delete';
|
|
103
103
|
|
|
104
104
|
const UpdateProfileInputValidator = z.object({
|
|
105
|
-
profileId:
|
|
105
|
+
profileId: PublicProfileIdValidator.optional(),
|
|
106
106
|
displayName: z.string().optional(),
|
|
107
107
|
shortBio: z.string().optional(),
|
|
108
108
|
bio: z.string().optional(),
|
|
@@ -154,7 +154,10 @@ export const profilesRouter = t.router({
|
|
|
154
154
|
LCNProfileValidator.omit({
|
|
155
155
|
did: true,
|
|
156
156
|
isServiceProfile: true,
|
|
157
|
-
}).extend({
|
|
157
|
+
}).extend({
|
|
158
|
+
profileId: PublicProfileIdValidator,
|
|
159
|
+
authToken: z.string().optional(),
|
|
160
|
+
})
|
|
158
161
|
)
|
|
159
162
|
.output(z.string())
|
|
160
163
|
.mutation(async ({ input, ctx }) => {
|
|
@@ -243,7 +246,11 @@ export const profilesRouter = t.router({
|
|
|
243
246
|
},
|
|
244
247
|
requiredScope: 'profiles:write',
|
|
245
248
|
})
|
|
246
|
-
.input(
|
|
249
|
+
.input(
|
|
250
|
+
LCNProfileValidator.omit({ did: true, isServiceProfile: true }).extend({
|
|
251
|
+
profileId: PublicProfileIdValidator,
|
|
252
|
+
})
|
|
253
|
+
)
|
|
247
254
|
.output(z.string())
|
|
248
255
|
.mutation(async ({ input, ctx }) => {
|
|
249
256
|
const profileExists = await checkIfProfileExists({ ...input, did: ctx.user.did });
|
|
@@ -281,7 +288,11 @@ export const profilesRouter = t.router({
|
|
|
281
288
|
},
|
|
282
289
|
requiredScope: 'profiles:write',
|
|
283
290
|
})
|
|
284
|
-
.input(
|
|
291
|
+
.input(
|
|
292
|
+
LCNProfileValidator.omit({ did: true, isServiceProfile: true }).extend({
|
|
293
|
+
profileId: PublicProfileIdValidator,
|
|
294
|
+
})
|
|
295
|
+
)
|
|
285
296
|
.output(z.string())
|
|
286
297
|
.mutation(async ({ input, ctx }) => {
|
|
287
298
|
const { profileId } = input;
|
|
@@ -498,7 +509,7 @@ export const profilesRouter = t.router({
|
|
|
498
509
|
} = input;
|
|
499
510
|
|
|
500
511
|
const _selfProfile = ctx.user?.did ? await getProfileByDid(ctx.user.did) : null;
|
|
501
|
-
const selfProfile = includeSelf ? null : _selfProfile ?? null;
|
|
512
|
+
const selfProfile = includeSelf ? null : (_selfProfile ?? null);
|
|
502
513
|
|
|
503
514
|
const blacklist =
|
|
504
515
|
(_selfProfile && (await getBlockedAndBlockedByIds(_selfProfile))) || [];
|
|
@@ -563,6 +574,18 @@ export const profilesRouter = t.router({
|
|
|
563
574
|
.output(z.boolean())
|
|
564
575
|
.mutation(async ({ input, ctx }) => {
|
|
565
576
|
const { profile } = ctx.user;
|
|
577
|
+
if (
|
|
578
|
+
profile.isServiceProfile === true &&
|
|
579
|
+
profile.type === 'child' &&
|
|
580
|
+
typeof input.type === 'string' &&
|
|
581
|
+
input.type !== 'child'
|
|
582
|
+
) {
|
|
583
|
+
throw new TRPCError({
|
|
584
|
+
code: 'BAD_REQUEST',
|
|
585
|
+
message:
|
|
586
|
+
'A service profile explicitly typed as a child cannot change profile type.',
|
|
587
|
+
});
|
|
588
|
+
}
|
|
566
589
|
|
|
567
590
|
const {
|
|
568
591
|
profileId,
|