@nlabs/reaktor 1.18.0 → 1.20.0-reactorbox.1
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 +290 -0
- package/docs/GENERATION.md +42 -16
- package/lib/actions/alfredFaq.js +1 -1
- package/lib/actions/analytics.js +1 -1
- package/lib/actions/apps.js +17 -2
- package/lib/actions/connections.js +1 -1
- package/lib/actions/content.js +1 -1
- package/lib/actions/contentGeneration.d.ts +22 -1
- package/lib/actions/contentGeneration.js +120 -32
- package/lib/actions/contentGenerationErrors.js +1 -1
- package/lib/actions/contentGenerationSources.d.ts +29 -0
- package/lib/actions/contentGenerationSources.js +103 -0
- package/lib/actions/conversations.js +1 -1
- package/lib/actions/crm.d.ts +6 -2
- package/lib/actions/crm.js +91 -12
- package/lib/actions/crmCanonicalOutcomes.d.ts +88 -0
- package/lib/actions/crmCanonicalOutcomes.js +398 -0
- package/lib/actions/crmCanonicalPolicy.d.ts +92 -0
- package/lib/actions/crmCanonicalPolicy.js +104 -0
- package/lib/actions/crmCheckoutRecovery.d.ts +72 -0
- package/lib/actions/crmCheckoutRecovery.js +413 -0
- package/lib/actions/crmCheckoutRecoveryPolicy.d.ts +38 -0
- package/lib/actions/crmCheckoutRecoveryPolicy.js +61 -0
- package/lib/actions/crmDeliveryEvents.d.ts +24 -0
- package/lib/actions/crmDeliveryEvents.js +207 -0
- package/lib/actions/crmDeliveryEvidence.d.ts +17 -0
- package/lib/actions/crmDeliveryEvidence.js +58 -0
- package/lib/actions/crmExecution.d.ts +125 -0
- package/lib/actions/crmExecution.js +830 -0
- package/lib/actions/crmFinancialEvidence.d.ts +12 -0
- package/lib/actions/crmFinancialEvidence.js +60 -0
- package/lib/actions/crmInsights.d.ts +60 -0
- package/lib/actions/crmInsights.js +225 -0
- package/lib/actions/crmLeadFollowups.d.ts +66 -0
- package/lib/actions/crmLeadFollowups.js +209 -0
- package/lib/actions/crmOutcomes.d.ts +106 -0
- package/lib/actions/crmOutcomes.js +289 -0
- package/lib/actions/crmRecoveryRetention.d.ts +13 -0
- package/lib/actions/crmRecoveryRetention.js +163 -0
- package/lib/actions/crmReminderDispatch.d.ts +10 -0
- package/lib/actions/crmReminderDispatch.js +65 -0
- package/lib/actions/crmSourceOwnership.d.ts +7 -0
- package/lib/actions/crmSourceOwnership.js +27 -0
- package/lib/actions/crmSupportInsights.d.ts +18 -0
- package/lib/actions/crmSupportInsights.js +47 -0
- package/lib/actions/crmWinback.d.ts +71 -0
- package/lib/actions/crmWinback.js +347 -0
- package/lib/actions/crmWinbackConsent.d.ts +29 -0
- package/lib/actions/crmWinbackConsent.js +158 -0
- package/lib/actions/crmWinbackPolicy.d.ts +33 -0
- package/lib/actions/crmWinbackPolicy.js +115 -0
- package/lib/actions/crmWinbackShopSource.d.ts +15 -0
- package/lib/actions/crmWinbackShopSource.js +63 -0
- package/lib/actions/crud.js +1 -1
- package/lib/actions/databaseAccounts.js +1 -1
- package/lib/actions/databaseProvisioningLease.js +1 -1
- package/lib/actions/dynamodb.js +1 -1
- package/lib/actions/email.d.ts +4 -1
- package/lib/actions/email.js +25 -3
- package/lib/actions/files.js +1 -1
- package/lib/actions/flags.js +1 -1
- package/lib/actions/geminiVideo.js +1 -1
- package/lib/actions/groups.js +1 -1
- package/lib/actions/higgsfield.js +1 -1
- package/lib/actions/imageGeneration.js +1 -1
- package/lib/actions/images.js +1 -1
- package/lib/actions/index.d.ts +56 -0
- package/lib/actions/index.js +42 -1
- package/lib/actions/ios.js +1 -1
- package/lib/actions/locations.js +1 -1
- package/lib/actions/merchantAccountExperiment.d.ts +50 -0
- package/lib/actions/merchantAccountExperiment.js +424 -0
- package/lib/actions/merchantAccountExperimentConfig.d.ts +7 -0
- package/lib/actions/merchantAccountExperimentConfig.js +32 -0
- package/lib/actions/merchantAccountExperimentHost.d.ts +69 -0
- package/lib/actions/merchantAccountExperimentHost.js +92 -0
- package/lib/actions/merchantAccountExperimentPolicy.d.ts +66 -0
- package/lib/actions/merchantAccountExperimentPolicy.js +121 -0
- package/lib/actions/merchantAccountExperimentRelay.d.ts +10 -0
- package/lib/actions/merchantAccountExperimentRelay.js +75 -0
- package/lib/actions/merchantCalendar.d.ts +34 -0
- package/lib/actions/merchantCalendar.js +119 -0
- package/lib/actions/merchantCalendarBookings.d.ts +17 -0
- package/lib/actions/merchantCalendarBookings.js +113 -0
- package/lib/actions/merchantCalendarDelegation.d.ts +80 -0
- package/lib/actions/merchantCalendarDelegation.js +353 -0
- package/lib/actions/merchantCalendarDiscovery.d.ts +38 -0
- package/lib/actions/merchantCalendarDiscovery.js +124 -0
- package/lib/actions/merchantCalendarEventHost.d.ts +105 -0
- package/lib/actions/merchantCalendarEventHost.js +16 -0
- package/lib/actions/merchantCalendarEventPrivacy.d.ts +7 -0
- package/lib/actions/merchantCalendarEventPrivacy.js +70 -0
- package/lib/actions/merchantCalendarEventRepository.d.ts +121 -0
- package/lib/actions/merchantCalendarEventRepository.js +295 -0
- package/lib/actions/merchantCalendarEventTransport.d.ts +65 -0
- package/lib/actions/merchantCalendarEventTransport.js +132 -0
- package/lib/actions/merchantCalendarEvents.d.ts +172 -0
- package/lib/actions/merchantCalendarEvents.js +365 -0
- package/lib/actions/merchantCalendarInvitationConsent.d.ts +28 -0
- package/lib/actions/merchantCalendarInvitationConsent.js +118 -0
- package/lib/actions/merchantCalendarManagedSource.d.ts +22 -0
- package/lib/actions/merchantCalendarManagedSource.js +24 -0
- package/lib/actions/merchantCalendarOAuth.d.ts +92 -0
- package/lib/actions/merchantCalendarOAuth.js +502 -0
- package/lib/actions/merchantCalendarOAuthConfig.d.ts +4 -0
- package/lib/actions/merchantCalendarOAuthConfig.js +30 -0
- package/lib/actions/merchantCalendarOAuthRepository.d.ts +57 -0
- package/lib/actions/merchantCalendarOAuthRepository.js +108 -0
- package/lib/actions/merchantCalendarOAuthTransport.d.ts +4 -0
- package/lib/actions/merchantCalendarOAuthTransport.js +25 -0
- package/lib/actions/merchantCalendarScopes.d.ts +4 -0
- package/lib/actions/merchantCalendarScopes.js +31 -0
- package/lib/actions/merchantFinance.d.ts +65 -0
- package/lib/actions/merchantFinance.js +244 -0
- package/lib/actions/merchantFinanceProvider.d.ts +57 -0
- package/lib/actions/merchantFinanceProvider.js +180 -0
- package/lib/actions/merchantOperations.d.ts +94 -0
- package/lib/actions/merchantOperations.js +489 -0
- package/lib/actions/messages.js +1 -1
- package/lib/actions/notifications.js +1 -1
- package/lib/actions/ollamaGeneration.js +1 -1
- package/lib/actions/openaiResponseSession.js +1 -1
- package/lib/actions/payments.js +1 -1
- package/lib/actions/personas.js +1 -1
- package/lib/actions/phoneSupport.js +1 -1
- package/lib/actions/posts.js +1 -1
- package/lib/actions/providerCredentials.d.ts +35 -0
- package/lib/actions/providerCredentials.js +166 -0
- package/lib/actions/query.js +1 -1
- package/lib/actions/reactions.js +1 -1
- package/lib/actions/rum.js +1 -1
- package/lib/actions/s3.d.ts +10 -7
- package/lib/actions/s3.js +59 -14
- package/lib/actions/search.js +1 -1
- package/lib/actions/sms.js +1 -1
- package/lib/actions/statistics.js +1 -1
- package/lib/actions/subscriptions.js +1 -1
- package/lib/actions/supportChannelSources.d.ts +66 -0
- package/lib/actions/supportChannelSources.js +183 -0
- package/lib/actions/supportCommerce.d.ts +62 -0
- package/lib/actions/supportCommerce.js +252 -0
- package/lib/actions/supportConnect.d.ts +39 -0
- package/lib/actions/supportConnect.js +224 -0
- package/lib/actions/supportContext.d.ts +31 -0
- package/lib/actions/supportContext.js +88 -0
- package/lib/actions/supportConversation.d.ts +102 -0
- package/lib/actions/supportConversation.js +100 -0
- package/lib/actions/supportEmailEvents.d.ts +20 -0
- package/lib/actions/supportEmailEvents.js +130 -0
- package/lib/actions/supportEmailHandoff.d.ts +114 -0
- package/lib/actions/supportEmailHandoff.js +356 -0
- package/lib/actions/supportOperations.d.ts +32 -0
- package/lib/actions/supportOperations.js +74 -0
- package/lib/actions/supportPolicy.d.ts +9 -0
- package/lib/actions/supportPolicy.js +44 -0
- package/lib/actions/supportPurposeConsent.d.ts +32 -0
- package/lib/actions/supportPurposeConsent.js +196 -0
- package/lib/actions/supportPurposePrivacy.d.ts +15 -0
- package/lib/actions/supportPurposePrivacy.js +181 -0
- package/lib/actions/supportSemanticReview.d.ts +64 -0
- package/lib/actions/supportSemanticReview.js +239 -0
- package/lib/actions/tags.js +1 -1
- package/lib/actions/users.js +22 -3
- package/lib/actions/videoGeneration.js +1 -1
- package/lib/actions/videos.js +1 -1
- package/lib/adapters/arangoAdapter.js +1 -1
- package/lib/adapters/contentAdapter.js +1 -1
- package/lib/adapters/fileAdapter.js +1 -1
- package/lib/adapters/geminiGenerationAdapter.js +1 -1
- package/lib/adapters/higgsfieldAdapter.js +1 -1
- package/lib/adapters/higgsfieldModelCatalog.js +1 -1
- package/lib/adapters/higgsfieldModels.js +1 -1
- package/lib/adapters/imageAdapter.js +1 -1
- package/lib/adapters/imageGenerationAdapter.js +1 -1
- package/lib/adapters/index.js +1 -1
- package/lib/adapters/messageAdapter.js +1 -1
- package/lib/adapters/postAdapter.js +1 -1
- package/lib/adapters/reaktorAdapter.js +1 -1
- package/lib/adapters/tagAdapter.js +1 -1
- package/lib/adapters/userAdapter.js +1 -1
- package/lib/assistant/core.js +1 -1
- package/lib/assistant/faq.js +1 -1
- package/lib/assistant/faqCore.js +1 -1
- package/lib/assistant/index.js +1 -1
- package/lib/assistant/service.js +1 -1
- package/lib/config.js +1 -1
- package/lib/constants/collections.d.ts +2 -1
- package/lib/constants/collections.js +2 -1
- package/lib/durableChat/conversations.js +1 -1
- package/lib/durableChat/errors.js +1 -1
- package/lib/durableChat/events.js +1 -1
- package/lib/durableChat/index.js +1 -1
- package/lib/durableChat/membership.js +1 -1
- package/lib/durableChat/messageTypes.js +1 -1
- package/lib/durableChat/messages.js +1 -1
- package/lib/durableChat/transaction.js +1 -1
- package/lib/durableChat/types.js +1 -1
- package/lib/handlers/graphqlHandler.js +1 -1
- package/lib/index.js +1 -1
- package/lib/lambdas/actions/websockets.js +1 -1
- package/lib/lambdas/authorizer.js +1 -1
- package/lib/lambdas/connection.js +1 -1
- package/lib/lambdas/utils/message.js +1 -1
- package/lib/lambdas/utils/websocket.js +1 -1
- package/lib/mocks/conversation.js +1 -1
- package/lib/mocks/file.js +1 -1
- package/lib/mocks/group.js +1 -1
- package/lib/mocks/image.js +1 -1
- package/lib/mocks/post.js +1 -1
- package/lib/mocks/tag.js +1 -1
- package/lib/mocks/user.js +1 -1
- package/lib/mocks/video.js +1 -1
- package/lib/mutations/analytics/analytics.js +1 -1
- package/lib/mutations/content/content.js +1 -1
- package/lib/mutations/crm/crm.js +395 -7
- package/lib/mutations/events/events.js +1 -1
- package/lib/mutations/flags/flags.js +1 -1
- package/lib/mutations/groups/groups.js +1 -1
- package/lib/mutations/higgsfield/higgsfield.js +1 -1
- package/lib/mutations/images/images.js +1 -1
- package/lib/mutations/index.js +1 -1
- package/lib/mutations/locations/locations.js +1 -1
- package/lib/mutations/messages/messages.js +1 -1
- package/lib/mutations/personas/personas.js +1 -1
- package/lib/mutations/posts/posts.js +1 -1
- package/lib/mutations/reactions/reactions.js +1 -1
- package/lib/mutations/rum/rum.js +1 -1
- package/lib/mutations/statistics/statistics.js +1 -1
- package/lib/mutations/subscriptions/subscriptions.js +1 -1
- package/lib/mutations/tags/tags.js +1 -1
- package/lib/mutations/users/users.js +1 -1
- package/lib/mutations/videos/videos.js +1 -1
- package/lib/nativePush/graphql.js +1 -1
- package/lib/nativePush/index.js +1 -1
- package/lib/nativePush/migrations.js +1 -1
- package/lib/nativePush/nativePushContract.fixture.js +1 -1
- package/lib/nativePush/payload.js +1 -1
- package/lib/nativePush/repository.js +1 -1
- package/lib/nativePush/service.js +1 -1
- package/lib/nativePush/snsProvider.js +1 -1
- package/lib/nativePush/types.js +1 -1
- package/lib/objectTypes/analytics.js +1 -1
- package/lib/objectTypes/app.js +1 -1
- package/lib/objectTypes/bankAccount.js +1 -1
- package/lib/objectTypes/connection.js +1 -1
- package/lib/objectTypes/content.js +1 -1
- package/lib/objectTypes/contentGeneration.js +1 -1
- package/lib/objectTypes/conversation.js +1 -1
- package/lib/objectTypes/creditCard.js +1 -1
- package/lib/objectTypes/crm.js +1 -1
- package/lib/objectTypes/document.js +1 -1
- package/lib/objectTypes/error.js +1 -1
- package/lib/objectTypes/event.js +1 -1
- package/lib/objectTypes/external.js +1 -1
- package/lib/objectTypes/file.js +1 -1
- package/lib/objectTypes/filter.js +1 -1
- package/lib/objectTypes/flag.js +1 -1
- package/lib/objectTypes/group.js +1 -1
- package/lib/objectTypes/higgsfield.js +1 -1
- package/lib/objectTypes/iapSubscription.js +1 -1
- package/lib/objectTypes/image.js +1 -1
- package/lib/objectTypes/imageGeneration.js +1 -1
- package/lib/objectTypes/index.js +1 -1
- package/lib/objectTypes/location.js +1 -1
- package/lib/objectTypes/message.js +1 -1
- package/lib/objectTypes/passcode.js +1 -1
- package/lib/objectTypes/persona.js +1 -1
- package/lib/objectTypes/plan.js +1 -1
- package/lib/objectTypes/post.js +1 -1
- package/lib/objectTypes/query.js +1 -1
- package/lib/objectTypes/reaction.js +1 -1
- package/lib/objectTypes/relation.js +1 -1
- package/lib/objectTypes/rum.js +1 -1
- package/lib/objectTypes/search.js +1 -1
- package/lib/objectTypes/statistics.js +1 -1
- package/lib/objectTypes/subscription.js +1 -1
- package/lib/objectTypes/tag.js +1 -1
- package/lib/objectTypes/user.js +1 -1
- package/lib/objectTypes/video.js +1 -1
- package/lib/objectTypes/videoGeneration.js +1 -1
- package/lib/organizations/accountLifecycle.js +1 -1
- package/lib/organizations/authorization.js +1 -1
- package/lib/organizations/billing.js +1 -1
- package/lib/organizations/billingProvider.js +1 -1
- package/lib/organizations/billingUpdates.js +1 -1
- package/lib/organizations/index.js +1 -1
- package/lib/organizations/mail.js +1 -1
- package/lib/organizations/memberDirectory.js +1 -1
- package/lib/organizations/membership.js +1 -1
- package/lib/organizations/passwordRecovery.js +1 -1
- package/lib/organizations/plans.js +1 -1
- package/lib/organizations/providerPagination.js +1 -1
- package/lib/organizations/reconciliation.js +1 -1
- package/lib/organizations/signup.js +1 -1
- package/lib/organizations/store.js +1 -1
- package/lib/organizations/types.js +1 -1
- package/lib/organizations/verification.js +1 -1
- package/lib/queries/analytics/analytics.js +1 -1
- package/lib/queries/content/content.js +1 -1
- package/lib/queries/crm/crm.js +251 -5
- package/lib/queries/events/events.js +1 -1
- package/lib/queries/flags/flags.js +1 -1
- package/lib/queries/groups/groups.js +1 -1
- package/lib/queries/higgsfield/higgsfield.js +1 -1
- package/lib/queries/images/images.js +1 -1
- package/lib/queries/index.js +1 -1
- package/lib/queries/locations/locations.js +1 -1
- package/lib/queries/messages/messages.js +1 -1
- package/lib/queries/personas/personas.js +1 -1
- package/lib/queries/posts/posts.js +1 -1
- package/lib/queries/query/query.js +1 -1
- package/lib/queries/reactions/reactions.js +1 -1
- package/lib/queries/statistics/statistics.js +1 -1
- package/lib/queries/subscriptions/subscriptions.js +1 -1
- package/lib/queries/tags/tags.js +1 -1
- package/lib/queries/users/users.js +1 -1
- package/lib/queries/videos/videos.js +1 -1
- package/lib/templates/email/layout.js +1 -1
- package/lib/templates/email/passwordForgot.js +1 -1
- package/lib/templates/email/passwordRecovery.js +1 -1
- package/lib/templates/email/verifyEmail.js +1 -1
- package/lib/templates/email/welcome.js +1 -1
- package/lib/templates/sms/passwordForgot.js +1 -1
- package/lib/templates/sms/passwordRecovery.js +1 -1
- package/lib/templates/sms/verifyEmail.js +1 -1
- package/lib/templates/sms/verifyPhone.js +1 -1
- package/lib/templates/sms/welcome.js +1 -1
- package/lib/types/analytics.types.js +1 -1
- package/lib/types/apps.types.js +1 -1
- package/lib/types/arangodb.types.js +1 -1
- package/lib/types/auth.types.d.ts +2 -0
- package/lib/types/auth.types.js +1 -1
- package/lib/types/connections.types.js +1 -1
- package/lib/types/content.types.js +1 -1
- package/lib/types/conversations.types.js +1 -1
- package/lib/types/crm.types.d.ts +6 -0
- package/lib/types/crm.types.js +1 -1
- package/lib/types/databaseCredentials.types.js +1 -1
- package/lib/types/email.types.js +1 -1
- package/lib/types/error.types.js +1 -1
- package/lib/types/files.types.js +1 -1
- package/lib/types/flags.types.js +1 -1
- package/lib/types/google.types.js +1 -1
- package/lib/types/groups.types.js +1 -1
- package/lib/types/images.types.js +1 -1
- package/lib/types/index.js +1 -1
- package/lib/types/locations.types.js +1 -1
- package/lib/types/messages.types.js +1 -1
- package/lib/types/notifications.types.js +1 -1
- package/lib/types/payments.types.js +1 -1
- package/lib/types/personas.types.js +1 -1
- package/lib/types/posts.types.js +1 -1
- package/lib/types/rum.types.js +1 -1
- package/lib/types/statistics.types.js +1 -1
- package/lib/types/tags.types.js +1 -1
- package/lib/types/users.types.d.ts +2 -0
- package/lib/types/users.types.js +1 -1
- package/lib/types/videos.types.js +1 -1
- package/lib/types/websockets.types.js +1 -1
- package/lib/upload.js +1 -1
- package/lib/utils/adapterUtils.js +1 -1
- package/lib/utils/analyticsUtils.js +1 -1
- package/lib/utils/appContext.js +1 -1
- package/lib/utils/aqlHelpers.js +1 -1
- package/lib/utils/arangodbUtils.js +1 -1
- package/lib/utils/authUtils.js +17 -1
- package/lib/utils/awsUtils.js +1 -1
- package/lib/utils/collectionRegistry.js +1 -1
- package/lib/utils/contextUtils.js +1 -1
- package/lib/utils/databaseCredentials.js +1 -1
- package/lib/utils/dbI18n.example.js +1 -1
- package/lib/utils/dbI18n.js +1 -1
- package/lib/utils/generationCallback.js +1 -1
- package/lib/utils/googleTranslate.js +1 -1
- package/lib/utils/graphqlUtils.d.ts +2 -0
- package/lib/utils/graphqlUtils.js +1 -1
- package/lib/utils/imageUtils.js +1 -1
- package/lib/utils/index.js +1 -1
- package/lib/utils/languageDetection.js +1 -1
- package/lib/utils/localeUtils.example.js +1 -1
- package/lib/utils/localeUtils.js +1 -1
- package/lib/utils/mediaAccess.js +1 -1
- package/lib/utils/middlewareUtils.js +1 -1
- package/lib/utils/nodeRealtime.js +1 -1
- package/lib/utils/opaqueToken.js +1 -1
- package/lib/utils/queryBuilder.js +1 -1
- package/lib/utils/schemaUtils.js +1 -1
- package/lib/utils/secretDatabase.js +1 -1
- package/lib/utils/sessionUtils.js +1 -1
- package/lib/utils/stripeUtils.js +1 -1
- package/lib/utils/templateUtils.js +1 -1
- package/lib/utils/testUtils.js +1 -1
- package/lib/utils/translationQueue.example.js +1 -1
- package/lib/utils/translationQueue.js +1 -1
- package/lib/videoProcessing.js +1 -1
- package/package.json +8 -6
|
@@ -0,0 +1,92 @@
|
|
|
1
|
+
import type Stripe from 'stripe';
|
|
2
|
+
export interface CrmCanonicalEvent {
|
|
3
|
+
adjustmentId?: string;
|
|
4
|
+
amountMinor?: number;
|
|
5
|
+
campaignId: string;
|
|
6
|
+
currency?: string;
|
|
7
|
+
deleted?: true;
|
|
8
|
+
eventId: string;
|
|
9
|
+
occurredAt: string;
|
|
10
|
+
orderId?: string;
|
|
11
|
+
productId?: string;
|
|
12
|
+
projectId: string;
|
|
13
|
+
revision: number;
|
|
14
|
+
type: 'lead' | 'qualified_lead' | 'lead_won' | 'lead_lost' | 'purchase' | 'refund' | 'order_canceled';
|
|
15
|
+
version: 1;
|
|
16
|
+
}
|
|
17
|
+
export interface CrmCanonicalAssociation {
|
|
18
|
+
appId: string;
|
|
19
|
+
campaignId: string;
|
|
20
|
+
canonicalConsent?: {
|
|
21
|
+
evidenceRef: string;
|
|
22
|
+
expiresAt: number;
|
|
23
|
+
purpose: 'canonical_campaign_outcomes';
|
|
24
|
+
};
|
|
25
|
+
id: string;
|
|
26
|
+
kind: string;
|
|
27
|
+
organizationId: string;
|
|
28
|
+
productId?: string;
|
|
29
|
+
projectId: string;
|
|
30
|
+
revision: number;
|
|
31
|
+
sourceId: string;
|
|
32
|
+
sourceRevision: string;
|
|
33
|
+
status: string;
|
|
34
|
+
}
|
|
35
|
+
export interface CrmCanonicalNativeHistory {
|
|
36
|
+
association: CrmCanonicalAssociation;
|
|
37
|
+
source: {
|
|
38
|
+
revision: string;
|
|
39
|
+
history: {
|
|
40
|
+
at: number;
|
|
41
|
+
id?: string;
|
|
42
|
+
revision?: number;
|
|
43
|
+
stage: string;
|
|
44
|
+
deleted?: boolean;
|
|
45
|
+
}[];
|
|
46
|
+
truncated?: boolean;
|
|
47
|
+
deleted?: boolean;
|
|
48
|
+
};
|
|
49
|
+
suppressed: boolean;
|
|
50
|
+
}
|
|
51
|
+
export declare const crmCanonicalDigest: (value: unknown) => string;
|
|
52
|
+
/** Only real versioned native observations are eligible; legacy timestamps never become fabricated history. */
|
|
53
|
+
export declare const crmCanonicalHistoryEvents: (row: CrmCanonicalNativeHistory, at: number) => {
|
|
54
|
+
events: CrmCanonicalEvent[];
|
|
55
|
+
held: string;
|
|
56
|
+
incomplete: boolean;
|
|
57
|
+
};
|
|
58
|
+
export interface CrmFinancialVerificationSource {
|
|
59
|
+
amountMinor: number;
|
|
60
|
+
chargeId: string;
|
|
61
|
+
currency: string;
|
|
62
|
+
customerId: string;
|
|
63
|
+
invoiceIssuedAt: number;
|
|
64
|
+
invoiceStatus: string;
|
|
65
|
+
invoiceTotalMinor: number;
|
|
66
|
+
nativePaymentAmountMinor: number;
|
|
67
|
+
nativePaymentChargeId: string;
|
|
68
|
+
nativePaymentCurrency: string;
|
|
69
|
+
nativePaymentUserId: string;
|
|
70
|
+
settlementReference: string;
|
|
71
|
+
userId: string;
|
|
72
|
+
}
|
|
73
|
+
export interface CrmVerifiedFinancialProviderEvidence {
|
|
74
|
+
amountMinor: number;
|
|
75
|
+
chargeId: string;
|
|
76
|
+
currency: string;
|
|
77
|
+
occurredAt: number;
|
|
78
|
+
provider: 'stripe';
|
|
79
|
+
refunds: {
|
|
80
|
+
amountMinor: number;
|
|
81
|
+
id: string;
|
|
82
|
+
occurredAt: number;
|
|
83
|
+
}[];
|
|
84
|
+
revision: string;
|
|
85
|
+
}
|
|
86
|
+
type ReadClient = Pick<Stripe, 'charges' | 'customers' | 'refunds'>;
|
|
87
|
+
/** GET-only verification of an existing payment; legal registration alone cannot establish external settlement. */
|
|
88
|
+
export declare const verifyCrmFinancialProviderEvidence: (source: CrmFinancialVerificationSource, at: number, client?: ReadClient) => Promise<{
|
|
89
|
+
evidence?: CrmVerifiedFinancialProviderEvidence;
|
|
90
|
+
held?: string;
|
|
91
|
+
}>;
|
|
92
|
+
export {};
|
|
@@ -0,0 +1,104 @@
|
|
|
1
|
+
import { createHash } from 'node:crypto';
|
|
2
|
+
import { getStripeClient } from '../utils/stripeUtils.js';
|
|
3
|
+
export const crmCanonicalDigest = (value)=>createHash('sha256').update(JSON.stringify(value)).digest('hex');
|
|
4
|
+
const stages = {
|
|
5
|
+
lost: 'lead_lost',
|
|
6
|
+
new: 'lead',
|
|
7
|
+
qualified: 'qualified_lead',
|
|
8
|
+
won: 'lead_won'
|
|
9
|
+
};
|
|
10
|
+
/** Only real versioned native observations are eligible; legacy timestamps never become fabricated history. */ export const crmCanonicalHistoryEvents = (row, at)=>{
|
|
11
|
+
const { association, source } = row;
|
|
12
|
+
if (association.status !== 'active' || row.suppressed || source.deleted || source.revision !== association.sourceRevision || association.canonicalConsent?.purpose !== 'canonical_campaign_outcomes' || !Number.isFinite(association.canonicalConsent.expiresAt) || association.canonicalConsent.expiresAt <= at) {
|
|
13
|
+
return {
|
|
14
|
+
events: [],
|
|
15
|
+
held: 'source_or_consent_withdrawn',
|
|
16
|
+
incomplete: false
|
|
17
|
+
};
|
|
18
|
+
}
|
|
19
|
+
if (source.truncated || source.history.length > 100 || source.history.some((event)=>!event.id || !/^[a-f0-9]{64}$/.test(event.id) || !Number.isSafeInteger(event.revision) || event.revision < 1 || !Number.isSafeInteger(event.at) || event.at > at + 60000 || !Object.hasOwn(stages, event.stage))) {
|
|
20
|
+
return {
|
|
21
|
+
events: [],
|
|
22
|
+
held: 'unversioned_or_truncated_history',
|
|
23
|
+
incomplete: true
|
|
24
|
+
};
|
|
25
|
+
}
|
|
26
|
+
const events = source.history.filter((event)=>!event.deleted).map((event)=>({
|
|
27
|
+
campaignId: association.campaignId,
|
|
28
|
+
eventId: crmCanonicalDigest([
|
|
29
|
+
association.appId,
|
|
30
|
+
association.organizationId,
|
|
31
|
+
association.projectId,
|
|
32
|
+
association.campaignId,
|
|
33
|
+
association.id,
|
|
34
|
+
event.id,
|
|
35
|
+
event.stage
|
|
36
|
+
]),
|
|
37
|
+
occurredAt: new Date(event.at).toISOString(),
|
|
38
|
+
productId: association.productId,
|
|
39
|
+
projectId: association.projectId,
|
|
40
|
+
revision: event.revision,
|
|
41
|
+
type: stages[event.stage],
|
|
42
|
+
version: 1
|
|
43
|
+
}));
|
|
44
|
+
return {
|
|
45
|
+
events,
|
|
46
|
+
held: undefined,
|
|
47
|
+
incomplete: false
|
|
48
|
+
};
|
|
49
|
+
};
|
|
50
|
+
/** GET-only verification of an existing payment; legal registration alone cannot establish external settlement. */ export const verifyCrmFinancialProviderEvidence = async (source, at, client)=>{
|
|
51
|
+
if (typeof source.nativePaymentCurrency !== 'string' || typeof source.currency !== 'string' || !/^ch_[A-Za-z0-9]{1,160}$/.test(source.chargeId) || !/^cus_[A-Za-z0-9]{1,160}$/.test(source.customerId) || source.settlementReference !== source.chargeId || source.nativePaymentChargeId !== source.chargeId || source.nativePaymentUserId !== source.userId || source.nativePaymentAmountMinor !== source.amountMinor || source.nativePaymentCurrency.toUpperCase() !== source.currency || source.invoiceStatus !== 'issued' || source.invoiceTotalMinor !== source.amountMinor || !Number.isSafeInteger(source.amountMinor) || source.amountMinor <= 0 || !/^[A-Z]{3}$/.test(source.currency) || !Number.isSafeInteger(source.invoiceIssuedAt) || source.invoiceIssuedAt > at) {
|
|
52
|
+
return {
|
|
53
|
+
held: 'native_legal_payment_binding_unverified'
|
|
54
|
+
};
|
|
55
|
+
}
|
|
56
|
+
let charge;
|
|
57
|
+
let customer;
|
|
58
|
+
let refunds;
|
|
59
|
+
try {
|
|
60
|
+
const provider = client || getStripeClient();
|
|
61
|
+
[charge, customer, refunds] = await Promise.all([
|
|
62
|
+
provider.charges.retrieve(source.chargeId),
|
|
63
|
+
provider.customers.retrieve(source.customerId),
|
|
64
|
+
provider.refunds.list({
|
|
65
|
+
charge: source.chargeId,
|
|
66
|
+
limit: 100
|
|
67
|
+
})
|
|
68
|
+
]);
|
|
69
|
+
} catch {
|
|
70
|
+
return {
|
|
71
|
+
held: 'provider_verification_unavailable'
|
|
72
|
+
};
|
|
73
|
+
}
|
|
74
|
+
const chargeCustomerId = typeof charge.customer === 'string' ? charge.customer : charge.customer?.id;
|
|
75
|
+
if (charge.id !== source.chargeId || chargeCustomerId !== source.customerId || customer.id !== source.customerId || customer.deleted || !('metadata' in customer) || customer.metadata.userId !== source.userId || charge.paid !== true || charge.captured !== true || charge.status !== 'succeeded' || charge.disputed || charge.livemode !== true || charge.amount !== source.amountMinor || charge.amount_captured !== source.amountMinor || charge.currency.toUpperCase() !== source.currency || !Number.isSafeInteger(charge.created) || charge.created * 1000 > at + 60000 || charge.created * 1000 < source.invoiceIssuedAt) {
|
|
76
|
+
return {
|
|
77
|
+
held: 'provider_customer_or_settlement_mismatch'
|
|
78
|
+
};
|
|
79
|
+
}
|
|
80
|
+
if (refunds.has_more || refunds.data.length > 100 || refunds.data.some((refund)=>refund.charge !== charge.id || refund.currency.toUpperCase() !== source.currency || refund.status !== 'succeeded' || !Number.isSafeInteger(refund.amount) || refund.amount <= 0 || !Number.isSafeInteger(refund.created) || refund.created < charge.created || refund.created * 1000 > at + 60000) || new Set(refunds.data.map((refund)=>refund.id)).size !== refunds.data.length || refunds.data.reduce((sum, refund)=>sum + refund.amount, 0) !== charge.amount_refunded || charge.amount_refunded > charge.amount) {
|
|
81
|
+
return {
|
|
82
|
+
held: 'provider_refund_evidence_incomplete'
|
|
83
|
+
};
|
|
84
|
+
}
|
|
85
|
+
const evidence = {
|
|
86
|
+
amountMinor: charge.amount,
|
|
87
|
+
chargeId: charge.id,
|
|
88
|
+
currency: source.currency,
|
|
89
|
+
occurredAt: charge.created * 1000,
|
|
90
|
+
provider: 'stripe',
|
|
91
|
+
refunds: refunds.data.map((refund)=>({
|
|
92
|
+
amountMinor: refund.amount,
|
|
93
|
+
id: refund.id,
|
|
94
|
+
occurredAt: refund.created * 1000
|
|
95
|
+
})).sort((left, right)=>left.id.localeCompare(right.id)),
|
|
96
|
+
revision: ''
|
|
97
|
+
};
|
|
98
|
+
evidence.revision = crmCanonicalDigest(evidence);
|
|
99
|
+
return {
|
|
100
|
+
evidence
|
|
101
|
+
};
|
|
102
|
+
};
|
|
103
|
+
|
|
104
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi9Vc2Vycy9uaXRyb2c3L0RldmVsb3BtZW50L3JlYWt0b3IvcGFja2FnZXMvcmVha3Rvci9zcmMvYWN0aW9ucy9jcm1DYW5vbmljYWxQb2xpY3kudHMiXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtjcmVhdGVIYXNofSBmcm9tICdub2RlOmNyeXB0byc7XG5cbmltcG9ydCB7Z2V0U3RyaXBlQ2xpZW50fSBmcm9tICcuLi91dGlscy9zdHJpcGVVdGlscy5qcyc7XG5cbmltcG9ydCB0eXBlIFN0cmlwZSBmcm9tICdzdHJpcGUnO1xuXG5leHBvcnQgaW50ZXJmYWNlIENybUNhbm9uaWNhbEV2ZW50IHtcbiAgYWRqdXN0bWVudElkPzogc3RyaW5nO1xuICBhbW91bnRNaW5vcj86IG51bWJlcjtcbiAgY2FtcGFpZ25JZDogc3RyaW5nO1xuICBjdXJyZW5jeT86IHN0cmluZztcbiAgZGVsZXRlZD86IHRydWU7XG4gIGV2ZW50SWQ6IHN0cmluZztcbiAgb2NjdXJyZWRBdDogc3RyaW5nO1xuICBvcmRlcklkPzogc3RyaW5nO1xuICBwcm9kdWN0SWQ/OiBzdHJpbmc7XG4gIHByb2plY3RJZDogc3RyaW5nO1xuICByZXZpc2lvbjogbnVtYmVyO1xuICB0eXBlOiAnbGVhZCcgfCAncXVhbGlmaWVkX2xlYWQnIHwgJ2xlYWRfd29uJyB8ICdsZWFkX2xvc3QnIHwgJ3B1cmNoYXNlJyB8ICdyZWZ1bmQnIHwgJ29yZGVyX2NhbmNlbGVkJztcbiAgdmVyc2lvbjogMTtcbn1cbmV4cG9ydCBpbnRlcmZhY2UgQ3JtQ2Fub25pY2FsQXNzb2NpYXRpb24ge1xuICBhcHBJZDogc3RyaW5nO1xuICBjYW1wYWlnbklkOiBzdHJpbmc7XG4gIGNhbm9uaWNhbENvbnNlbnQ/OiB7ZXZpZGVuY2VSZWY6IHN0cmluZzsgZXhwaXJlc0F0OiBudW1iZXI7IHB1cnBvc2U6ICdjYW5vbmljYWxfY2FtcGFpZ25fb3V0Y29tZXMnfTtcbiAgaWQ6IHN0cmluZztcbiAga2luZDogc3RyaW5nO1xuICBvcmdhbml6YXRpb25JZDogc3RyaW5nO1xuICBwcm9kdWN0SWQ/OiBzdHJpbmc7XG4gIHByb2plY3RJZDogc3RyaW5nO1xuICByZXZpc2lvbjogbnVtYmVyO1xuICBzb3VyY2VJZDogc3RyaW5nO1xuICBzb3VyY2VSZXZpc2lvbjogc3RyaW5nO1xuICBzdGF0dXM6IHN0cmluZztcbn1cbmV4cG9ydCBpbnRlcmZhY2UgQ3JtQ2Fub25pY2FsTmF0aXZlSGlzdG9yeSB7XG4gIGFzc29jaWF0aW9uOiBDcm1DYW5vbmljYWxBc3NvY2lhdGlvbjtcbiAgc291cmNlOiB7cmV2aXNpb246IHN0cmluZzsgaGlzdG9yeToge2F0OiBudW1iZXI7IGlkPzogc3RyaW5nOyByZXZpc2lvbj86IG51bWJlcjsgc3RhZ2U6IHN0cmluZzsgZGVsZXRlZD86IGJvb2xlYW59W107XG4gICAgdHJ1bmNhdGVkPzogYm9vbGVhbjsgZGVsZXRlZD86IGJvb2xlYW47fTtcbiAgc3VwcHJlc3NlZDogYm9vbGVhbjtcbn1cbmV4cG9ydCBjb25zdCBjcm1DYW5vbmljYWxEaWdlc3QgPSAodmFsdWU6IHVua25vd24pOiBzdHJpbmcgPT5cbiAgY3JlYXRlSGFzaCgnc2hhMjU2JykudXBkYXRlKEpTT04uc3RyaW5naWZ5KHZhbHVlKSkuZGlnZXN0KCdoZXgnKTtcbmNvbnN0IHN0YWdlcyA9IHtsb3N0OiAnbGVhZF9sb3N0JywgbmV3OiAnbGVhZCcsIHF1YWxpZmllZDogJ3F1YWxpZmllZF9sZWFkJywgd29uOiAnbGVhZF93b24nfSBhcyBjb25zdDtcbi8qKiBPbmx5IHJlYWwgdmVyc2lvbmVkIG5hdGl2ZSBvYnNlcnZhdGlvbnMgYXJlIGVsaWdpYmxlOyBsZWdhY3kgdGltZXN0YW1wcyBuZXZlciBiZWNvbWUgZmFicmljYXRlZCBoaXN0b3J5LiAqL1xuZXhwb3J0IGNvbnN0IGNybUNhbm9uaWNhbEhpc3RvcnlFdmVudHMgPSAocm93OiBDcm1DYW5vbmljYWxOYXRpdmVIaXN0b3J5LCBhdDogbnVtYmVyKSA9PiB7XG4gIGNvbnN0IHthc3NvY2lhdGlvbiwgc291cmNlfSA9IHJvdztcbiAgaWYoYXNzb2NpYXRpb24uc3RhdHVzICE9PSAnYWN0aXZlJyB8fCByb3cuc3VwcHJlc3NlZCB8fCBzb3VyY2UuZGVsZXRlZFxuICAgIHx8IHNvdXJjZS5yZXZpc2lvbiAhPT0gYXNzb2NpYXRpb24uc291cmNlUmV2aXNpb25cbiAgICB8fCBhc3NvY2lhdGlvbi5jYW5vbmljYWxDb25zZW50Py5wdXJwb3NlICE9PSAnY2Fub25pY2FsX2NhbXBhaWduX291dGNvbWVzJ1xuICAgIHx8ICFOdW1iZXIuaXNGaW5pdGUoYXNzb2NpYXRpb24uY2Fub25pY2FsQ29uc2VudC5leHBpcmVzQXQpIHx8IGFzc29jaWF0aW9uLmNhbm9uaWNhbENvbnNlbnQuZXhwaXJlc0F0IDw9IGF0KSB7XG4gICAgcmV0dXJuIHtldmVudHM6IFtdIGFzIENybUNhbm9uaWNhbEV2ZW50W10sIGhlbGQ6ICdzb3VyY2Vfb3JfY29uc2VudF93aXRoZHJhd24nLCBpbmNvbXBsZXRlOiBmYWxzZX07XG4gIH1cbiAgaWYoc291cmNlLnRydW5jYXRlZCB8fCBzb3VyY2UuaGlzdG9yeS5sZW5ndGggPiAxMDAgfHwgc291cmNlLmhpc3Rvcnkuc29tZSgoZXZlbnQpID0+XG4gICAgIWV2ZW50LmlkIHx8ICEvXlthLWYwLTldezY0fSQvLnRlc3QoZXZlbnQuaWQpIHx8ICFOdW1iZXIuaXNTYWZlSW50ZWdlcihldmVudC5yZXZpc2lvbikgfHwgZXZlbnQucmV2aXNpb24hIDwgMVxuICAgIHx8ICFOdW1iZXIuaXNTYWZlSW50ZWdlcihldmVudC5hdCkgfHwgZXZlbnQuYXQgPiBhdCArIDYwMDAwIHx8ICFPYmplY3QuaGFzT3duKHN0YWdlcywgZXZlbnQuc3RhZ2UpKSkge1xuICAgIHJldHVybiB7ZXZlbnRzOiBbXSBhcyBDcm1DYW5vbmljYWxFdmVudFtdLCBoZWxkOiAndW52ZXJzaW9uZWRfb3JfdHJ1bmNhdGVkX2hpc3RvcnknLCBpbmNvbXBsZXRlOiB0cnVlfTtcbiAgfVxuICBjb25zdCBldmVudHM6IENybUNhbm9uaWNhbEV2ZW50W10gPSBzb3VyY2UuaGlzdG9yeS5maWx0ZXIoKGV2ZW50KSA9PiAhZXZlbnQuZGVsZXRlZCkubWFwKChldmVudCkgPT4gKHtcbiAgICBjYW1wYWlnbklkOiBhc3NvY2lhdGlvbi5jYW1wYWlnbklkLFxuICAgIGV2ZW50SWQ6IGNybUNhbm9uaWNhbERpZ2VzdChbYXNzb2NpYXRpb24uYXBwSWQsIGFzc29jaWF0aW9uLm9yZ2FuaXphdGlvbklkLCBhc3NvY2lhdGlvbi5wcm9qZWN0SWQsXG4gICAgICBhc3NvY2lhdGlvbi5jYW1wYWlnbklkLCBhc3NvY2lhdGlvbi5pZCwgZXZlbnQuaWQsIGV2ZW50LnN0YWdlXSksIG9jY3VycmVkQXQ6IG5ldyBEYXRlKGV2ZW50LmF0KS50b0lTT1N0cmluZygpLFxuICAgIHByb2R1Y3RJZDogYXNzb2NpYXRpb24ucHJvZHVjdElkLCBwcm9qZWN0SWQ6IGFzc29jaWF0aW9uLnByb2plY3RJZCwgcmV2aXNpb246IGV2ZW50LnJldmlzaW9uISxcbiAgICB0eXBlOiBzdGFnZXNbZXZlbnQuc3RhZ2UgYXMga2V5b2YgdHlwZW9mIHN0YWdlc10sIHZlcnNpb246IDF9KSk7XG4gIHJldHVybiB7ZXZlbnRzLCBoZWxkOiB1bmRlZmluZWQsIGluY29tcGxldGU6IGZhbHNlfTtcbn07XG5leHBvcnQgaW50ZXJmYWNlIENybUZpbmFuY2lhbFZlcmlmaWNhdGlvblNvdXJjZSB7XG4gIGFtb3VudE1pbm9yOiBudW1iZXI7XG4gIGNoYXJnZUlkOiBzdHJpbmc7XG4gIGN1cnJlbmN5OiBzdHJpbmc7XG4gIGN1c3RvbWVySWQ6IHN0cmluZztcbiAgaW52b2ljZUlzc3VlZEF0OiBudW1iZXI7XG4gIGludm9pY2VTdGF0dXM6IHN0cmluZztcbiAgaW52b2ljZVRvdGFsTWlub3I6IG51bWJlcjtcbiAgbmF0aXZlUGF5bWVudEFtb3VudE1pbm9yOiBudW1iZXI7XG4gIG5hdGl2ZVBheW1lbnRDaGFyZ2VJZDogc3RyaW5nO1xuICBuYXRpdmVQYXltZW50Q3VycmVuY3k6IHN0cmluZztcbiAgbmF0aXZlUGF5bWVudFVzZXJJZDogc3RyaW5nO1xuICBzZXR0bGVtZW50UmVmZXJlbmNlOiBzdHJpbmc7XG4gIHVzZXJJZDogc3RyaW5nO1xufVxuZXhwb3J0IGludGVyZmFjZSBDcm1WZXJpZmllZEZpbmFuY2lhbFByb3ZpZGVyRXZpZGVuY2Uge1xuICBhbW91bnRNaW5vcjogbnVtYmVyO1xuICBjaGFyZ2VJZDogc3RyaW5nO1xuICBjdXJyZW5jeTogc3RyaW5nO1xuICBvY2N1cnJlZEF0OiBudW1iZXI7XG4gIHByb3ZpZGVyOiAnc3RyaXBlJztcbiAgcmVmdW5kczoge2Ftb3VudE1pbm9yOiBudW1iZXI7IGlkOiBzdHJpbmc7IG9jY3VycmVkQXQ6IG51bWJlcn1bXTtcbiAgcmV2aXNpb246IHN0cmluZztcbn1cbnR5cGUgUmVhZENsaWVudCA9IFBpY2s8U3RyaXBlLCAnY2hhcmdlcycgfCAnY3VzdG9tZXJzJyB8ICdyZWZ1bmRzJz47XG4vKiogR0VULW9ubHkgdmVyaWZpY2F0aW9uIG9mIGFuIGV4aXN0aW5nIHBheW1lbnQ7IGxlZ2FsIHJlZ2lzdHJhdGlvbiBhbG9uZSBjYW5ub3QgZXN0YWJsaXNoIGV4dGVybmFsIHNldHRsZW1lbnQuICovXG5leHBvcnQgY29uc3QgdmVyaWZ5Q3JtRmluYW5jaWFsUHJvdmlkZXJFdmlkZW5jZSA9IGFzeW5jIChcbiAgc291cmNlOiBDcm1GaW5hbmNpYWxWZXJpZmljYXRpb25Tb3VyY2UsIGF0OiBudW1iZXIsIGNsaWVudD86IFJlYWRDbGllbnRcbik6IFByb21pc2U8e2V2aWRlbmNlPzogQ3JtVmVyaWZpZWRGaW5hbmNpYWxQcm92aWRlckV2aWRlbmNlOyBoZWxkPzogc3RyaW5nfT4gPT4ge1xuICBpZih0eXBlb2Ygc291cmNlLm5hdGl2ZVBheW1lbnRDdXJyZW5jeSAhPT0gJ3N0cmluZycgfHwgdHlwZW9mIHNvdXJjZS5jdXJyZW5jeSAhPT0gJ3N0cmluZydcbiAgICB8fCAhL15jaF9bQS1aYS16MC05XXsxLDE2MH0kLy50ZXN0KHNvdXJjZS5jaGFyZ2VJZCkgfHwgIS9eY3VzX1tBLVphLXowLTldezEsMTYwfSQvLnRlc3Qoc291cmNlLmN1c3RvbWVySWQpXG4gICAgfHwgc291cmNlLnNldHRsZW1lbnRSZWZlcmVuY2UgIT09IHNvdXJjZS5jaGFyZ2VJZCB8fCBzb3VyY2UubmF0aXZlUGF5bWVudENoYXJnZUlkICE9PSBzb3VyY2UuY2hhcmdlSWRcbiAgICB8fCBzb3VyY2UubmF0aXZlUGF5bWVudFVzZXJJZCAhPT0gc291cmNlLnVzZXJJZCB8fCBzb3VyY2UubmF0aXZlUGF5bWVudEFtb3VudE1pbm9yICE9PSBzb3VyY2UuYW1vdW50TWlub3JcbiAgICB8fCBzb3VyY2UubmF0aXZlUGF5bWVudEN1cnJlbmN5LnRvVXBwZXJDYXNlKCkgIT09IHNvdXJjZS5jdXJyZW5jeSB8fCBzb3VyY2UuaW52b2ljZVN0YXR1cyAhPT0gJ2lzc3VlZCdcbiAgICB8fCBzb3VyY2UuaW52b2ljZVRvdGFsTWlub3IgIT09IHNvdXJjZS5hbW91bnRNaW5vciB8fCAhTnVtYmVyLmlzU2FmZUludGVnZXIoc291cmNlLmFtb3VudE1pbm9yKVxuICAgIHx8IHNvdXJjZS5hbW91bnRNaW5vciA8PSAwIHx8ICEvXltBLVpdezN9JC8udGVzdChzb3VyY2UuY3VycmVuY3kpXG4gICAgfHwgIU51bWJlci5pc1NhZmVJbnRlZ2VyKHNvdXJjZS5pbnZvaWNlSXNzdWVkQXQpIHx8IHNvdXJjZS5pbnZvaWNlSXNzdWVkQXQgPiBhdCkge1xuICAgIHJldHVybiB7aGVsZDogJ25hdGl2ZV9sZWdhbF9wYXltZW50X2JpbmRpbmdfdW52ZXJpZmllZCd9O1xuICB9XG4gIGxldCBjaGFyZ2U6IFN0cmlwZS5DaGFyZ2U7XG4gIGxldCBjdXN0b21lcjogU3RyaXBlLkN1c3RvbWVyIHwgU3RyaXBlLkRlbGV0ZWRDdXN0b21lcjtcbiAgbGV0IHJlZnVuZHM6IFN0cmlwZS5BcGlMaXN0PFN0cmlwZS5SZWZ1bmQ+O1xuICB0cnkge1xuICAgIGNvbnN0IHByb3ZpZGVyID0gY2xpZW50IHx8IGdldFN0cmlwZUNsaWVudCgpO1xuICAgIFtjaGFyZ2UsIGN1c3RvbWVyLCByZWZ1bmRzXSA9IGF3YWl0IFByb21pc2UuYWxsKFtwcm92aWRlci5jaGFyZ2VzLnJldHJpZXZlKHNvdXJjZS5jaGFyZ2VJZCksXG4gICAgICBwcm92aWRlci5jdXN0b21lcnMucmV0cmlldmUoc291cmNlLmN1c3RvbWVySWQpLCBwcm92aWRlci5yZWZ1bmRzLmxpc3Qoe2NoYXJnZTogc291cmNlLmNoYXJnZUlkLCBsaW1pdDogMTAwfSldKTtcbiAgfSBjYXRjaHtcbiAgICByZXR1cm4ge2hlbGQ6ICdwcm92aWRlcl92ZXJpZmljYXRpb25fdW5hdmFpbGFibGUnfTtcbiAgfVxuICBjb25zdCBjaGFyZ2VDdXN0b21lcklkID0gdHlwZW9mIGNoYXJnZS5jdXN0b21lciA9PT0gJ3N0cmluZycgPyBjaGFyZ2UuY3VzdG9tZXIgOiBjaGFyZ2UuY3VzdG9tZXI/LmlkO1xuICBpZihjaGFyZ2UuaWQgIT09IHNvdXJjZS5jaGFyZ2VJZCB8fCBjaGFyZ2VDdXN0b21lcklkICE9PSBzb3VyY2UuY3VzdG9tZXJJZCB8fCBjdXN0b21lci5pZCAhPT0gc291cmNlLmN1c3RvbWVySWRcbiAgICB8fCBjdXN0b21lci5kZWxldGVkIHx8ICEoJ21ldGFkYXRhJyBpbiBjdXN0b21lcikgfHwgY3VzdG9tZXIubWV0YWRhdGEudXNlcklkICE9PSBzb3VyY2UudXNlcklkXG4gICAgICB8fCBjaGFyZ2UucGFpZCAhPT0gdHJ1ZSB8fCBjaGFyZ2UuY2FwdHVyZWQgIT09IHRydWVcbiAgICB8fCBjaGFyZ2Uuc3RhdHVzICE9PSAnc3VjY2VlZGVkJyB8fCBjaGFyZ2UuZGlzcHV0ZWQgfHwgY2hhcmdlLmxpdmVtb2RlICE9PSB0cnVlXG4gICAgfHwgY2hhcmdlLmFtb3VudCAhPT0gc291cmNlLmFtb3VudE1pbm9yIHx8IGNoYXJnZS5hbW91bnRfY2FwdHVyZWQgIT09IHNvdXJjZS5hbW91bnRNaW5vclxuICAgIHx8IGNoYXJnZS5jdXJyZW5jeS50b1VwcGVyQ2FzZSgpICE9PSBzb3VyY2UuY3VycmVuY3kgfHwgIU51bWJlci5pc1NhZmVJbnRlZ2VyKGNoYXJnZS5jcmVhdGVkKVxuICAgIHx8IGNoYXJnZS5jcmVhdGVkICogMTAwMCA+IGF0ICsgNjAwMDAgfHwgY2hhcmdlLmNyZWF0ZWQgKiAxMDAwIDwgc291cmNlLmludm9pY2VJc3N1ZWRBdCkge1xuICAgIHJldHVybiB7aGVsZDogJ3Byb3ZpZGVyX2N1c3RvbWVyX29yX3NldHRsZW1lbnRfbWlzbWF0Y2gnfTtcbiAgfVxuICBpZihyZWZ1bmRzLmhhc19tb3JlIHx8IHJlZnVuZHMuZGF0YS5sZW5ndGggPiAxMDAgfHwgcmVmdW5kcy5kYXRhLnNvbWUoKHJlZnVuZCkgPT5cbiAgICByZWZ1bmQuY2hhcmdlICE9PSBjaGFyZ2UuaWQgfHwgcmVmdW5kLmN1cnJlbmN5LnRvVXBwZXJDYXNlKCkgIT09IHNvdXJjZS5jdXJyZW5jeSB8fCByZWZ1bmQuc3RhdHVzICE9PSAnc3VjY2VlZGVkJ1xuICAgIHx8ICFOdW1iZXIuaXNTYWZlSW50ZWdlcihyZWZ1bmQuYW1vdW50KSB8fCByZWZ1bmQuYW1vdW50IDw9IDAgfHwgIU51bWJlci5pc1NhZmVJbnRlZ2VyKHJlZnVuZC5jcmVhdGVkKVxuICAgIHx8IHJlZnVuZC5jcmVhdGVkIDwgY2hhcmdlLmNyZWF0ZWQgfHwgcmVmdW5kLmNyZWF0ZWQgKiAxMDAwID4gYXQgKyA2MDAwMClcbiAgICB8fCBuZXcgU2V0KHJlZnVuZHMuZGF0YS5tYXAoKHJlZnVuZCkgPT4gcmVmdW5kLmlkKSkuc2l6ZSAhPT0gcmVmdW5kcy5kYXRhLmxlbmd0aFxuICAgIHx8IHJlZnVuZHMuZGF0YS5yZWR1Y2UoKHN1bSwgcmVmdW5kKSA9PiBzdW0gKyByZWZ1bmQuYW1vdW50LCAwKSAhPT0gY2hhcmdlLmFtb3VudF9yZWZ1bmRlZFxuICAgIHx8IGNoYXJnZS5hbW91bnRfcmVmdW5kZWQgPiBjaGFyZ2UuYW1vdW50KSB7XG4gICAgcmV0dXJuIHtoZWxkOiAncHJvdmlkZXJfcmVmdW5kX2V2aWRlbmNlX2luY29tcGxldGUnfTtcbiAgfVxuICBjb25zdCBldmlkZW5jZTogQ3JtVmVyaWZpZWRGaW5hbmNpYWxQcm92aWRlckV2aWRlbmNlID0ge2Ftb3VudE1pbm9yOiBjaGFyZ2UuYW1vdW50LCBjaGFyZ2VJZDogY2hhcmdlLmlkLFxuICAgIGN1cnJlbmN5OiBzb3VyY2UuY3VycmVuY3ksIG9jY3VycmVkQXQ6IGNoYXJnZS5jcmVhdGVkICogMTAwMCwgcHJvdmlkZXI6ICdzdHJpcGUnLFxuICAgIHJlZnVuZHM6IHJlZnVuZHMuZGF0YS5tYXAoKHJlZnVuZCkgPT4gKHthbW91bnRNaW5vcjogcmVmdW5kLmFtb3VudCwgaWQ6IHJlZnVuZC5pZCxcbiAgICAgIG9jY3VycmVkQXQ6IHJlZnVuZC5jcmVhdGVkICogMTAwMH0pKVxuICAgICAgLnNvcnQoKGxlZnQsIHJpZ2h0KSA9PiBsZWZ0LmlkLmxvY2FsZUNvbXBhcmUocmlnaHQuaWQpKSwgcmV2aXNpb246ICcnfTtcbiAgZXZpZGVuY2UucmV2aXNpb24gPSBjcm1DYW5vbmljYWxEaWdlc3QoZXZpZGVuY2UpO1xuICByZXR1cm4ge2V2aWRlbmNlfTtcbn07XG4iXSwibmFtZXMiOlsiY3JlYXRlSGFzaCIsImdldFN0cmlwZUNsaWVudCIsImNybUNhbm9uaWNhbERpZ2VzdCIsInZhbHVlIiwidXBkYXRlIiwiSlNPTiIsInN0cmluZ2lmeSIsImRpZ2VzdCIsInN0YWdlcyIsImxvc3QiLCJuZXciLCJxdWFsaWZpZWQiLCJ3b24iLCJjcm1DYW5vbmljYWxIaXN0b3J5RXZlbnRzIiwicm93IiwiYXQiLCJhc3NvY2lhdGlvbiIsInNvdXJjZSIsInN0YXR1cyIsInN1cHByZXNzZWQiLCJkZWxldGVkIiwicmV2aXNpb24iLCJzb3VyY2VSZXZpc2lvbiIsImNhbm9uaWNhbENvbnNlbnQiLCJwdXJwb3NlIiwiTnVtYmVyIiwiaXNGaW5pdGUiLCJleHBpcmVzQXQiLCJldmVudHMiLCJoZWxkIiwiaW5jb21wbGV0ZSIsInRydW5jYXRlZCIsImhpc3RvcnkiLCJsZW5ndGgiLCJzb21lIiwiZXZlbnQiLCJpZCIsInRlc3QiLCJpc1NhZmVJbnRlZ2VyIiwiT2JqZWN0IiwiaGFzT3duIiwic3RhZ2UiLCJmaWx0ZXIiLCJtYXAiLCJjYW1wYWlnbklkIiwiZXZlbnRJZCIsImFwcElkIiwib3JnYW5pemF0aW9uSWQiLCJwcm9qZWN0SWQiLCJvY2N1cnJlZEF0IiwiRGF0ZSIsInRvSVNPU3RyaW5nIiwicHJvZHVjdElkIiwidHlwZSIsInZlcnNpb24iLCJ1bmRlZmluZWQiLCJ2ZXJpZnlDcm1GaW5hbmNpYWxQcm92aWRlckV2aWRlbmNlIiwiY2xpZW50IiwibmF0aXZlUGF5bWVudEN1cnJlbmN5IiwiY3VycmVuY3kiLCJjaGFyZ2VJZCIsImN1c3RvbWVySWQiLCJzZXR0bGVtZW50UmVmZXJlbmNlIiwibmF0aXZlUGF5bWVudENoYXJnZUlkIiwibmF0aXZlUGF5bWVudFVzZXJJZCIsInVzZXJJZCIsIm5hdGl2ZVBheW1lbnRBbW91bnRNaW5vciIsImFtb3VudE1pbm9yIiwidG9VcHBlckNhc2UiLCJpbnZvaWNlU3RhdHVzIiwiaW52b2ljZVRvdGFsTWlub3IiLCJpbnZvaWNlSXNzdWVkQXQiLCJjaGFyZ2UiLCJjdXN0b21lciIsInJlZnVuZHMiLCJwcm92aWRlciIsIlByb21pc2UiLCJhbGwiLCJjaGFyZ2VzIiwicmV0cmlldmUiLCJjdXN0b21lcnMiLCJsaXN0IiwibGltaXQiLCJjaGFyZ2VDdXN0b21lcklkIiwibWV0YWRhdGEiLCJwYWlkIiwiY2FwdHVyZWQiLCJkaXNwdXRlZCIsImxpdmVtb2RlIiwiYW1vdW50IiwiYW1vdW50X2NhcHR1cmVkIiwiY3JlYXRlZCIsImhhc19tb3JlIiwiZGF0YSIsInJlZnVuZCIsIlNldCIsInNpemUiLCJyZWR1Y2UiLCJzdW0iLCJhbW91bnRfcmVmdW5kZWQiLCJldmlkZW5jZSIsInNvcnQiLCJsZWZ0IiwicmlnaHQiLCJsb2NhbGVDb21wYXJlIl0sIm1hcHBpbmdzIjoiQUFBQSxTQUFRQSxVQUFVLFFBQU8sY0FBYztBQUV2QyxTQUFRQyxlQUFlLFFB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
|
|
@@ -0,0 +1,72 @@
|
|
|
1
|
+
import { useDb } from '../utils/arangodbUtils.js';
|
|
2
|
+
import { authorizeCrmExecutionGrant } from './crmExecution.js';
|
|
3
|
+
import type { ApiContext } from '../types/auth.types.js';
|
|
4
|
+
import type { CrmCheckoutRecoveryBinding } from './crmCheckoutRecoveryPolicy.js';
|
|
5
|
+
type Db = ReturnType<typeof useDb>;
|
|
6
|
+
type Grant = Awaited<ReturnType<typeof authorizeCrmExecutionGrant>>;
|
|
7
|
+
export interface CrmCheckoutRecoveryCandidate {
|
|
8
|
+
appId: string;
|
|
9
|
+
campaignId: string;
|
|
10
|
+
email: string;
|
|
11
|
+
expiresAt: string;
|
|
12
|
+
id: string;
|
|
13
|
+
observedAt: string;
|
|
14
|
+
organizationId: string;
|
|
15
|
+
projectId: string;
|
|
16
|
+
reason: 'verified_unrecovered_checkout';
|
|
17
|
+
recoveryLinkHash?: string;
|
|
18
|
+
revision: string;
|
|
19
|
+
sourceId: string;
|
|
20
|
+
targetId: string;
|
|
21
|
+
targetRevision: string;
|
|
22
|
+
}
|
|
23
|
+
interface Candidate extends CrmCheckoutRecoveryCandidate {
|
|
24
|
+
_key: string;
|
|
25
|
+
bindingId: string;
|
|
26
|
+
bindingRevision: string;
|
|
27
|
+
proofRevision: string;
|
|
28
|
+
}
|
|
29
|
+
/** Only the authenticated customer can record this independent purpose; administrators cannot imply consent. */
|
|
30
|
+
export declare const recordCrmCheckoutRecoveryConsent: (context: ApiContext, input: {
|
|
31
|
+
appId: string;
|
|
32
|
+
consent: boolean;
|
|
33
|
+
expectedUserRevision: string;
|
|
34
|
+
expiresAt: number;
|
|
35
|
+
}, now?: () => number) => Promise<boolean>;
|
|
36
|
+
/** Registration binds verified existing source identities; it neither grants consent nor sends a message. */
|
|
37
|
+
export declare const registerCrmCheckoutRecoveryBinding: (context: ApiContext, input: {
|
|
38
|
+
appId: string;
|
|
39
|
+
associationId: string;
|
|
40
|
+
checkoutId: string;
|
|
41
|
+
expectedAssociationRevision: string;
|
|
42
|
+
expectedUserRevision: string;
|
|
43
|
+
sourceId: string;
|
|
44
|
+
userId: string;
|
|
45
|
+
}, now?: () => number, request?: (url: string, params?: any, options?: import("@nlabs/rip-hunter").HunterOptionsType) => Promise<any>) => Promise<{
|
|
46
|
+
id: string;
|
|
47
|
+
status: 'registered';
|
|
48
|
+
}>;
|
|
49
|
+
/** Every review and execution repeats protected source and native identity checks. */
|
|
50
|
+
export declare const validateCrmCheckoutRecoveryCandidate: (db: Db, grant: Grant, value: CrmCheckoutRecoveryBinding, now?: () => number, query?: any, request?: (url: string, params?: any, options?: import("@nlabs/rip-hunter").HunterOptionsType) => Promise<any>, receiptId?: string) => Promise<Candidate & {
|
|
51
|
+
verifiedRecoveryUrl?: string;
|
|
52
|
+
}>;
|
|
53
|
+
export declare const generateCrmCheckoutRecoveryCandidates: (context: ApiContext, input: {
|
|
54
|
+
appId: string;
|
|
55
|
+
campaignId: string;
|
|
56
|
+
limit: number;
|
|
57
|
+
organizationId: string;
|
|
58
|
+
projectId: string;
|
|
59
|
+
sourceId: string;
|
|
60
|
+
}, now?: () => number, request?: (url: string, params?: any, options?: import("@nlabs/rip-hunter").HunterOptionsType) => Promise<any>) => Promise<{
|
|
61
|
+
appId: string;
|
|
62
|
+
campaignId: string;
|
|
63
|
+
candidates: CrmCheckoutRecoveryCandidate[];
|
|
64
|
+
generatedAt: string;
|
|
65
|
+
held: Record<string, number>;
|
|
66
|
+
organizationId: string;
|
|
67
|
+
projectId: string;
|
|
68
|
+
schemaVersion: string;
|
|
69
|
+
sourceId: string;
|
|
70
|
+
truncated: boolean;
|
|
71
|
+
}>;
|
|
72
|
+
export {};
|