@nlabs/reaktor 0.10.5 → 0.10.6
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/lib/actions/apps.d.ts +1 -0
- package/lib/actions/apps.d.ts.map +1 -0
- package/lib/actions/apps.js +221 -0
- package/lib/actions/connections.d.ts +1 -0
- package/lib/actions/connections.d.ts.map +1 -0
- package/lib/actions/connections.js +62 -0
- package/lib/actions/content.d.ts +1 -0
- package/lib/actions/content.d.ts.map +1 -0
- package/lib/actions/content.js +240 -0
- package/lib/actions/conversations.d.ts +1 -0
- package/lib/actions/conversations.d.ts.map +1 -0
- package/lib/actions/conversations.js +335 -0
- package/lib/actions/dynamodb.d.ts +1 -0
- package/lib/actions/dynamodb.d.ts.map +1 -0
- package/lib/actions/dynamodb.js +119 -0
- package/lib/actions/email.d.ts +1 -0
- package/lib/actions/email.d.ts.map +1 -0
- package/lib/actions/email.js +56 -0
- package/lib/actions/files.d.ts +1 -0
- package/lib/actions/files.d.ts.map +1 -0
- package/lib/actions/files.js +226 -0
- package/lib/actions/groups.d.ts +1 -0
- package/lib/actions/groups.d.ts.map +1 -0
- package/lib/actions/groups.js +267 -0
- package/lib/actions/images.d.ts +1 -0
- package/lib/actions/images.d.ts.map +1 -0
- package/lib/actions/images.js +723 -0
- package/lib/actions/index.d.ts +1 -0
- package/lib/actions/index.d.ts.map +1 -0
- package/lib/actions/index.js +29 -0
- package/lib/actions/ios.d.ts +1 -0
- package/lib/actions/ios.d.ts.map +1 -0
- package/lib/actions/ios.js +230 -0
- package/lib/actions/locations.d.ts +1 -0
- package/lib/actions/locations.d.ts.map +1 -0
- package/lib/actions/locations.js +111 -0
- package/lib/actions/messages.d.ts +1 -0
- package/lib/actions/messages.d.ts.map +1 -0
- package/lib/actions/messages.js +167 -0
- package/lib/actions/notifications.d.ts +3 -2
- package/lib/actions/notifications.d.ts.map +1 -0
- package/lib/actions/notifications.js +37 -0
- package/lib/actions/payments.d.ts +1 -0
- package/lib/actions/payments.d.ts.map +1 -0
- package/lib/actions/payments.js +449 -0
- package/lib/actions/posts.d.ts +1 -0
- package/lib/actions/posts.d.ts.map +1 -0
- package/lib/actions/posts.js +608 -0
- package/lib/actions/profiles.d.ts +1 -0
- package/lib/actions/profiles.d.ts.map +1 -0
- package/lib/actions/profiles.js +58 -0
- package/lib/actions/reactions.d.ts +1 -0
- package/lib/actions/reactions.d.ts.map +1 -0
- package/lib/actions/reactions.js +286 -0
- package/lib/actions/s3.d.ts +1 -0
- package/lib/actions/s3.d.ts.map +1 -0
- package/lib/actions/s3.js +102 -0
- package/lib/actions/search.d.ts +1 -0
- package/lib/actions/search.d.ts.map +1 -0
- package/lib/actions/search.js +81 -0
- package/lib/actions/sms.d.ts +1 -0
- package/lib/actions/sms.d.ts.map +1 -0
- package/lib/actions/sms.js +52 -0
- package/lib/actions/statistics.d.ts +1 -0
- package/lib/actions/statistics.d.ts.map +1 -0
- package/lib/actions/statistics.js +43 -0
- package/lib/actions/subscriptions.d.ts +1 -0
- package/lib/actions/subscriptions.d.ts.map +1 -0
- package/lib/actions/subscriptions.js +202 -0
- package/lib/actions/tags.d.ts +1 -0
- package/lib/actions/tags.d.ts.map +1 -0
- package/lib/actions/tags.js +263 -0
- package/lib/actions/users.d.ts +1 -0
- package/lib/actions/users.d.ts.map +1 -0
- package/lib/actions/users.js +802 -0
- package/lib/actions/videos.d.ts +1 -0
- package/lib/actions/videos.d.ts.map +1 -0
- package/lib/actions/videos.js +423 -0
- package/lib/actions/websockets.d.ts +1 -0
- package/lib/actions/websockets.d.ts.map +1 -0
- package/lib/actions/websockets.js +164 -0
- package/lib/adapters/arangoAdapter.d.ts +1 -0
- package/lib/adapters/arangoAdapter.d.ts.map +1 -0
- package/lib/adapters/arangoAdapter.js +70 -0
- package/lib/adapters/contentAdapter.d.ts +1 -0
- package/lib/adapters/contentAdapter.d.ts.map +1 -0
- package/lib/adapters/contentAdapter.js +108 -0
- package/lib/adapters/fileAdapter.d.ts +1 -0
- package/lib/adapters/fileAdapter.d.ts.map +1 -0
- package/lib/adapters/fileAdapter.js +119 -0
- package/lib/adapters/imageAdapter.d.ts +1 -0
- package/lib/adapters/imageAdapter.d.ts.map +1 -0
- package/lib/adapters/imageAdapter.js +112 -0
- package/lib/adapters/index.d.ts +1 -0
- package/lib/adapters/index.d.ts.map +1 -0
- package/lib/adapters/index.js +11 -0
- package/lib/adapters/messageAdapter.d.ts +1 -0
- package/lib/adapters/messageAdapter.d.ts.map +1 -0
- package/lib/adapters/messageAdapter.js +82 -0
- package/lib/adapters/postAdapter.d.ts +1 -0
- package/lib/adapters/postAdapter.d.ts.map +1 -0
- package/lib/adapters/postAdapter.js +117 -0
- package/lib/adapters/reaktorAdapter.d.ts +1 -0
- package/lib/adapters/reaktorAdapter.d.ts.map +1 -0
- package/lib/adapters/reaktorAdapter.js +59 -0
- package/lib/adapters/tagAdapter.d.ts +1 -0
- package/lib/adapters/tagAdapter.d.ts.map +1 -0
- package/lib/adapters/tagAdapter.js +99 -0
- package/lib/adapters/userAdapter.d.ts +1 -0
- package/lib/adapters/userAdapter.d.ts.map +1 -0
- package/lib/adapters/userAdapter.js +264 -0
- package/lib/config.d.ts +1 -0
- package/lib/config.d.ts.map +1 -0
- package/lib/config.js +161 -0
- package/lib/handlers/graphqlHandler.d.ts +1 -0
- package/lib/handlers/graphqlHandler.d.ts.map +1 -0
- package/lib/handlers/graphqlHandler.js +118 -0
- package/lib/index.d.ts +1 -0
- package/lib/index.d.ts.map +1 -0
- package/lib/index.js +18 -0
- package/lib/lambdas/actions/websockets.d.ts +1 -0
- package/lib/lambdas/actions/websockets.d.ts.map +1 -0
- package/lib/lambdas/actions/websockets.js +105 -0
- package/lib/lambdas/authorizer.d.ts +1 -0
- package/lib/lambdas/authorizer.d.ts.map +1 -0
- package/lib/lambdas/authorizer.js +41 -0
- package/lib/lambdas/connection.d.ts +1 -0
- package/lib/lambdas/connection.d.ts.map +1 -0
- package/lib/lambdas/connection.js +85 -0
- package/lib/lambdas/utils/message.d.ts +1 -0
- package/lib/lambdas/utils/message.d.ts.map +1 -0
- package/lib/lambdas/utils/message.js +20 -0
- package/lib/lambdas/utils/websocket.d.ts +1 -0
- package/lib/lambdas/utils/websocket.d.ts.map +1 -0
- package/lib/lambdas/utils/websocket.js +78 -0
- package/lib/mocks/conversation.d.ts +1 -0
- package/lib/mocks/conversation.d.ts.map +1 -0
- package/lib/mocks/conversation.js +10 -0
- package/lib/mocks/file.d.ts +1 -0
- package/lib/mocks/file.d.ts.map +1 -0
- package/lib/mocks/file.js +13 -0
- package/lib/mocks/group.d.ts +1 -0
- package/lib/mocks/group.d.ts.map +1 -0
- package/lib/mocks/group.js +20 -0
- package/lib/mocks/image.d.ts +1 -0
- package/lib/mocks/image.d.ts.map +1 -0
- package/lib/mocks/image.js +17 -0
- package/lib/mocks/post.d.ts +1 -0
- package/lib/mocks/post.d.ts.map +1 -0
- package/lib/mocks/post.js +28 -0
- package/lib/mocks/tag.d.ts +1 -0
- package/lib/mocks/tag.d.ts.map +1 -0
- package/lib/mocks/tag.js +12 -0
- package/lib/mocks/user.d.ts +1 -0
- package/lib/mocks/user.d.ts.map +1 -0
- package/lib/mocks/user.js +61 -0
- package/lib/mocks/video.d.ts +1 -0
- package/lib/mocks/video.d.ts.map +1 -0
- package/lib/mocks/video.js +17 -0
- package/lib/mutations/content.d.ts +1 -0
- package/lib/mutations/content.d.ts.map +1 -0
- package/lib/mutations/content.js +27 -0
- package/lib/mutations/index.d.ts +1 -0
- package/lib/mutations/index.d.ts.map +1 -0
- package/lib/mutations/index.js +29 -0
- package/lib/mutations/locations.d.ts +1 -0
- package/lib/mutations/locations.d.ts.map +1 -0
- package/lib/mutations/locations.js +22 -0
- package/lib/mutations/messages.d.ts +1 -0
- package/lib/mutations/messages.d.ts.map +1 -0
- package/lib/mutations/messages.js +75 -0
- package/lib/mutations/posts.d.ts +1 -0
- package/lib/mutations/posts.d.ts.map +1 -0
- package/lib/mutations/posts.js +31 -0
- package/lib/mutations/profiles.d.ts +1 -0
- package/lib/mutations/profiles.d.ts.map +1 -0
- package/lib/mutations/profiles.js +78 -0
- package/lib/mutations/reactions.d.ts +1 -0
- package/lib/mutations/reactions.d.ts.map +1 -0
- package/lib/mutations/reactions.js +29 -0
- package/lib/mutations/statistics.d.ts +1 -0
- package/lib/mutations/statistics.d.ts.map +1 -0
- package/lib/mutations/statistics.js +17 -0
- package/lib/mutations/subscriptions.d.ts +1 -0
- package/lib/mutations/subscriptions.d.ts.map +1 -0
- package/lib/mutations/subscriptions.js +38 -0
- package/lib/mutations/tags.d.ts +1 -0
- package/lib/mutations/tags.d.ts.map +1 -0
- package/lib/mutations/tags.js +109 -0
- package/lib/mutations/users.d.ts +1 -0
- package/lib/mutations/users.d.ts.map +1 -0
- package/lib/mutations/users.js +129 -0
- package/lib/objectTypes/app.d.ts +1 -0
- package/lib/objectTypes/app.d.ts.map +1 -0
- package/lib/objectTypes/app.js +147 -0
- package/lib/objectTypes/bankAccount.d.ts +1 -0
- package/lib/objectTypes/bankAccount.d.ts.map +1 -0
- package/lib/objectTypes/bankAccount.js +54 -0
- package/lib/objectTypes/connection.d.ts +1 -0
- package/lib/objectTypes/connection.d.ts.map +1 -0
- package/lib/objectTypes/connection.js +26 -0
- package/lib/objectTypes/content.d.ts +1 -0
- package/lib/objectTypes/content.d.ts.map +1 -0
- package/lib/objectTypes/content.js +79 -0
- package/lib/objectTypes/conversation.d.ts +1 -0
- package/lib/objectTypes/conversation.d.ts.map +1 -0
- package/lib/objectTypes/conversation.js +53 -0
- package/lib/objectTypes/creditCard.d.ts +1 -0
- package/lib/objectTypes/creditCard.d.ts.map +1 -0
- package/lib/objectTypes/creditCard.js +64 -0
- package/lib/objectTypes/document.d.ts +1 -0
- package/lib/objectTypes/document.d.ts.map +1 -0
- package/lib/objectTypes/document.js +21 -0
- package/lib/objectTypes/error.d.ts +1 -0
- package/lib/objectTypes/error.d.ts.map +1 -0
- package/lib/objectTypes/error.js +24 -0
- package/lib/objectTypes/external.d.ts +1 -0
- package/lib/objectTypes/external.d.ts.map +1 -0
- package/lib/objectTypes/external.js +52 -0
- package/lib/objectTypes/file.d.ts +1 -0
- package/lib/objectTypes/file.d.ts.map +1 -0
- package/lib/objectTypes/file.js +76 -0
- package/lib/objectTypes/filter.d.ts +1 -0
- package/lib/objectTypes/filter.d.ts.map +1 -0
- package/lib/objectTypes/filter.js +21 -0
- package/lib/objectTypes/group.d.ts +1 -0
- package/lib/objectTypes/group.d.ts.map +1 -0
- package/lib/objectTypes/group.js +97 -0
- package/lib/objectTypes/iapSubscription.d.ts +1 -0
- package/lib/objectTypes/iapSubscription.d.ts.map +1 -0
- package/lib/objectTypes/iapSubscription.js +18 -0
- package/lib/objectTypes/image.d.ts +1 -0
- package/lib/objectTypes/image.d.ts.map +1 -0
- package/lib/objectTypes/image.js +105 -0
- package/lib/objectTypes/index.d.ts +1 -0
- package/lib/objectTypes/index.d.ts.map +1 -0
- package/lib/objectTypes/index.js +28 -0
- package/lib/objectTypes/location.d.ts +1 -0
- package/lib/objectTypes/location.d.ts.map +1 -0
- package/lib/objectTypes/location.js +85 -0
- package/lib/objectTypes/message.d.ts +1 -0
- package/lib/objectTypes/message.d.ts.map +1 -0
- package/lib/objectTypes/message.js +72 -0
- package/lib/objectTypes/passcode.d.ts +1 -0
- package/lib/objectTypes/passcode.d.ts.map +1 -0
- package/lib/objectTypes/passcode.js +20 -0
- package/lib/objectTypes/plan.d.ts +1 -0
- package/lib/objectTypes/plan.d.ts.map +1 -0
- package/lib/objectTypes/plan.js +71 -0
- package/lib/objectTypes/post.d.ts +1 -0
- package/lib/objectTypes/post.d.ts.map +1 -0
- package/lib/objectTypes/post.js +101 -0
- package/lib/objectTypes/profile.d.ts +1 -0
- package/lib/objectTypes/profile.d.ts.map +1 -0
- package/lib/objectTypes/profile.js +68 -0
- package/lib/objectTypes/reaction.d.ts +1 -0
- package/lib/objectTypes/reaction.d.ts.map +1 -0
- package/lib/objectTypes/reaction.js +37 -0
- package/lib/objectTypes/relation.d.ts +1 -0
- package/lib/objectTypes/relation.d.ts.map +1 -0
- package/lib/objectTypes/relation.js +27 -0
- package/lib/objectTypes/search.d.ts +1 -0
- package/lib/objectTypes/search.d.ts.map +1 -0
- package/lib/objectTypes/search.js +50 -0
- package/lib/objectTypes/statistics.d.ts +1 -0
- package/lib/objectTypes/statistics.d.ts.map +1 -0
- package/lib/objectTypes/statistics.js +17 -0
- package/lib/objectTypes/subscription.d.ts +1 -0
- package/lib/objectTypes/subscription.d.ts.map +1 -0
- package/lib/objectTypes/subscription.js +102 -0
- package/lib/objectTypes/tag.d.ts +1 -0
- package/lib/objectTypes/tag.d.ts.map +1 -0
- package/lib/objectTypes/tag.js +41 -0
- package/lib/objectTypes/user.d.ts +1 -0
- package/lib/objectTypes/user.d.ts.map +1 -0
- package/lib/objectTypes/user.js +111 -0
- package/lib/queries/content.d.ts +1 -0
- package/lib/queries/content.d.ts.map +1 -0
- package/lib/queries/content.js +50 -0
- package/lib/queries/index.d.ts +1 -0
- package/lib/queries/index.d.ts.map +1 -0
- package/lib/queries/index.js +27 -0
- package/lib/queries/locations.d.ts +1 -0
- package/lib/queries/locations.d.ts.map +1 -0
- package/lib/queries/locations.js +23 -0
- package/lib/queries/messages.d.ts +1 -0
- package/lib/queries/messages.d.ts.map +1 -0
- package/lib/queries/messages.js +35 -0
- package/lib/queries/posts.d.ts +1 -0
- package/lib/queries/posts.d.ts.map +1 -0
- package/lib/queries/posts.js +154 -0
- package/lib/queries/reactions.d.ts +1 -0
- package/lib/queries/reactions.d.ts.map +1 -0
- package/lib/queries/reactions.js +34 -0
- package/lib/queries/statistics.d.ts +1 -0
- package/lib/queries/statistics.d.ts.map +1 -0
- package/lib/queries/statistics.js +17 -0
- package/lib/queries/subscriptions.d.ts +1 -0
- package/lib/queries/subscriptions.d.ts.map +1 -0
- package/lib/queries/subscriptions.js +21 -0
- package/lib/queries/tags.d.ts +1 -0
- package/lib/queries/tags.d.ts.map +1 -0
- package/lib/queries/tags.js +56 -0
- package/lib/queries/users.d.ts +1 -0
- package/lib/queries/users.d.ts.map +1 -0
- package/lib/queries/users.js +39 -0
- package/lib/templates/email/layout.d.ts +1 -0
- package/lib/templates/email/layout.d.ts.map +1 -0
- package/lib/templates/email/layout.js +281 -0
- package/lib/templates/email/passwordForgot.d.ts +1 -0
- package/lib/templates/email/passwordForgot.d.ts.map +1 -0
- package/lib/templates/email/passwordForgot.js +17 -0
- package/lib/templates/email/passwordRecovery.d.ts +1 -0
- package/lib/templates/email/passwordRecovery.d.ts.map +1 -0
- package/lib/templates/email/passwordRecovery.js +14 -0
- package/lib/templates/email/verifyEmail.d.ts +1 -0
- package/lib/templates/email/verifyEmail.d.ts.map +1 -0
- package/lib/templates/email/verifyEmail.js +17 -0
- package/lib/templates/email/welcome.d.ts +1 -0
- package/lib/templates/email/welcome.d.ts.map +1 -0
- package/lib/templates/email/welcome.js +17 -0
- package/lib/templates/sms/passwordForgot.d.ts +1 -0
- package/lib/templates/sms/passwordForgot.d.ts.map +1 -0
- package/lib/templates/sms/passwordForgot.js +3 -0
- package/lib/templates/sms/passwordRecovery.d.ts +1 -0
- package/lib/templates/sms/passwordRecovery.d.ts.map +1 -0
- package/lib/templates/sms/passwordRecovery.js +3 -0
- package/lib/templates/sms/verifyEmail.d.ts +1 -0
- package/lib/templates/sms/verifyEmail.d.ts.map +1 -0
- package/lib/templates/sms/verifyEmail.js +3 -0
- package/lib/templates/sms/verifyPhone.d.ts +1 -0
- package/lib/templates/sms/verifyPhone.d.ts.map +1 -0
- package/lib/templates/sms/verifyPhone.js +3 -0
- package/lib/templates/sms/welcome.d.ts +1 -0
- package/lib/templates/sms/welcome.d.ts.map +1 -0
- package/lib/templates/sms/welcome.js +3 -0
- package/lib/types/apps.types.d.ts +1 -0
- package/lib/types/apps.types.d.ts.map +1 -0
- package/lib/types/apps.types.js +10 -0
- package/lib/types/arangodb.types.d.ts +1 -0
- package/lib/types/arangodb.types.d.ts.map +1 -0
- package/lib/types/arangodb.types.js +6 -0
- package/lib/types/auth.types.d.ts +1 -0
- package/lib/types/auth.types.d.ts.map +1 -0
- package/lib/types/auth.types.js +6 -0
- package/lib/types/connections.types.d.ts +1 -0
- package/lib/types/connections.types.d.ts.map +1 -0
- package/lib/types/connections.types.js +6 -0
- package/lib/types/content.types.d.ts +1 -0
- package/lib/types/content.types.d.ts.map +1 -0
- package/lib/types/content.types.js +6 -0
- package/lib/types/conversations.types.d.ts +1 -0
- package/lib/types/conversations.types.d.ts.map +1 -0
- package/lib/types/conversations.types.js +6 -0
- package/lib/types/email.types.d.ts +1 -0
- package/lib/types/email.types.d.ts.map +1 -0
- package/lib/types/email.types.js +6 -0
- package/lib/types/error.types.d.ts +1 -0
- package/lib/types/error.types.d.ts.map +1 -0
- package/lib/types/error.types.js +20 -0
- package/lib/types/files.types.d.ts +1 -0
- package/lib/types/files.types.d.ts.map +1 -0
- package/lib/types/files.types.js +6 -0
- package/lib/types/google.types.d.ts +1 -0
- package/lib/types/google.types.d.ts.map +1 -0
- package/lib/types/google.types.js +6 -0
- package/lib/types/groups.types.d.ts +1 -0
- package/lib/types/groups.types.d.ts.map +1 -0
- package/lib/types/groups.types.js +6 -0
- package/lib/types/images.types.d.ts +1 -0
- package/lib/types/images.types.d.ts.map +1 -0
- package/lib/types/images.types.js +6 -0
- package/lib/types/index.d.ts +1 -0
- package/lib/types/index.d.ts.map +1 -0
- package/lib/types/index.js +28 -0
- package/lib/types/locations.types.d.ts +1 -0
- package/lib/types/locations.types.d.ts.map +1 -0
- package/lib/types/locations.types.js +6 -0
- package/lib/types/messages.types.d.ts +1 -0
- package/lib/types/messages.types.d.ts.map +1 -0
- package/lib/types/messages.types.js +6 -0
- package/lib/types/notifications.types.d.ts +1 -0
- package/lib/types/notifications.types.d.ts.map +1 -0
- package/lib/types/notifications.types.js +6 -0
- package/lib/types/payments.types.d.ts +1 -0
- package/lib/types/payments.types.d.ts.map +1 -0
- package/lib/types/payments.types.js +6 -0
- package/lib/types/posts.types.d.ts +1 -0
- package/lib/types/posts.types.d.ts.map +1 -0
- package/lib/types/posts.types.js +6 -0
- package/lib/types/profiles.types.d.ts +1 -0
- package/lib/types/profiles.types.d.ts.map +1 -0
- package/lib/types/profiles.types.js +3 -0
- package/lib/types/statistics.types.d.ts +1 -0
- package/lib/types/statistics.types.d.ts.map +1 -0
- package/lib/types/statistics.types.js +3 -0
- package/lib/types/tags.types.d.ts +1 -0
- package/lib/types/tags.types.d.ts.map +1 -0
- package/lib/types/tags.types.js +6 -0
- package/lib/types/users.types.d.ts +1 -0
- package/lib/types/users.types.d.ts.map +1 -0
- package/lib/types/users.types.js +6 -0
- package/lib/types/videos.types.d.ts +1 -0
- package/lib/types/videos.types.d.ts.map +1 -0
- package/lib/types/videos.types.js +6 -0
- package/lib/types/websockets.types.d.ts +1 -0
- package/lib/types/websockets.types.d.ts.map +1 -0
- package/lib/types/websockets.types.js +6 -0
- package/lib/utils/adapterUtils.d.ts +1 -0
- package/lib/utils/adapterUtils.d.ts.map +1 -0
- package/lib/utils/adapterUtils.js +23 -0
- package/lib/utils/analyticsUtils.d.ts +1 -0
- package/lib/utils/analyticsUtils.d.ts.map +1 -0
- package/lib/utils/analyticsUtils.js +45 -0
- package/lib/utils/arangodbUtils.d.ts +1 -0
- package/lib/utils/arangodbUtils.d.ts.map +1 -0
- package/lib/utils/arangodbUtils.js +130 -0
- package/lib/utils/authUtils.d.ts +1 -0
- package/lib/utils/authUtils.d.ts.map +1 -0
- package/lib/utils/authUtils.js +54 -0
- package/lib/utils/contextUtils.d.ts +1 -0
- package/lib/utils/contextUtils.d.ts.map +1 -0
- package/lib/utils/contextUtils.js +10 -0
- package/lib/utils/dbI18n.d.ts +1 -0
- package/lib/utils/dbI18n.d.ts.map +1 -0
- package/lib/utils/dbI18n.example.d.ts +1 -0
- package/lib/utils/dbI18n.example.d.ts.map +1 -0
- package/lib/utils/dbI18n.example.js +93 -0
- package/lib/utils/dbI18n.js +28 -0
- package/lib/utils/googleTranslate.d.ts +1 -0
- package/lib/utils/googleTranslate.d.ts.map +1 -0
- package/lib/utils/googleTranslate.js +70 -0
- package/lib/utils/graphqlUtils.d.ts +1 -0
- package/lib/utils/graphqlUtils.d.ts.map +1 -0
- package/lib/utils/graphqlUtils.js +11 -0
- package/lib/utils/index.d.ts +1 -0
- package/lib/utils/index.d.ts.map +1 -0
- package/lib/utils/index.js +19 -0
- package/lib/utils/languageDetection.d.ts +1 -0
- package/lib/utils/languageDetection.d.ts.map +1 -0
- package/lib/utils/languageDetection.js +120 -0
- package/lib/utils/localeUtils.d.ts +1 -0
- package/lib/utils/localeUtils.d.ts.map +1 -0
- package/lib/utils/localeUtils.example.d.ts +1 -0
- package/lib/utils/localeUtils.example.d.ts.map +1 -0
- package/lib/utils/localeUtils.example.js +124 -0
- package/lib/utils/localeUtils.js +71 -0
- package/lib/utils/middlewareUtils.d.ts +1 -0
- package/lib/utils/middlewareUtils.d.ts.map +1 -0
- package/lib/utils/middlewareUtils.js +10 -0
- package/lib/utils/sessionUtils.d.ts +1 -0
- package/lib/utils/sessionUtils.d.ts.map +1 -0
- package/lib/utils/sessionUtils.js +26 -0
- package/lib/utils/stripeUtils.d.ts +2 -1
- package/lib/utils/stripeUtils.d.ts.map +1 -0
- package/lib/utils/stripeUtils.js +12 -0
- package/lib/utils/templateUtils.d.ts +1 -0
- package/lib/utils/templateUtils.d.ts.map +1 -0
- package/lib/utils/templateUtils.js +11 -0
- package/lib/utils/testUtils.d.ts +1 -0
- package/lib/utils/testUtils.d.ts.map +1 -0
- package/lib/utils/testUtils.js +292 -0
- package/lib/utils/translationQueue.d.ts +1 -0
- package/lib/utils/translationQueue.d.ts.map +1 -0
- package/lib/utils/translationQueue.example.d.ts +1 -0
- package/lib/utils/translationQueue.example.d.ts.map +1 -0
- package/lib/utils/translationQueue.example.js +340 -0
- package/lib/utils/translationQueue.js +113 -0
- package/package.json +43 -24
package/lib/actions/apps.d.ts
CHANGED
|
@@ -23,3 +23,4 @@ export declare const deleteApp: (context: ApiContext, app: AppType) => Promise<A
|
|
|
23
23
|
export declare const deactivateApp: (context: ApiContext, app: AppType) => Promise<UserType>;
|
|
24
24
|
export declare const getApp: (context: ApiContext, options?: AppOptions) => Promise<AppType>;
|
|
25
25
|
export declare const getApps: (context: ApiContext, options?: AppOptions) => Promise<AppType[]>;
|
|
26
|
+
//# sourceMappingURL=apps.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"apps.d.ts","sourceRoot":"","sources":["../../src/actions/apps.ts"],"names":[],"mappings":"AAYA,OAAO,KAAK,EAAC,OAAO,EAAC,MAAM,wBAAwB,CAAC;AACpD,OAAO,KAAK,EAAC,UAAU,EAAC,MAAM,wBAAwB,CAAC;AAEvD,OAAO,KAAK,EAAC,QAAQ,EAAC,MAAM,yBAAyB,CAAC;AAKtD,MAAM,WAAW,UAAU;IACzB,QAAQ,CAAC,EAAE,CAAC,EAAE,MAAM,CAAC;IACrB,QAAQ,CAAC,GAAG,CAAC,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,IAAI,CAAC,EAAE,MAAM,CAAC;IACvB,QAAQ,CAAC,IAAI,CAAC,EAAE,MAAM,CAAC;IACvB,QAAQ,CAAC,EAAE,CAAC,EAAE,MAAM,CAAC;CACtB;AAED,eAAO,MAAM,cAAc,GAAI,SAAQ,MAAM,EAAO,QAOpB,CAAC;AAEjC,eAAO,MAAM,eAAe,GAAI,UAAS,UAAe;;SAhBxC,MAAM;UACL,MAAM;WACL,MAAM;WACN,MAAM;SACR,MAAM;CAuBrB,CAAC;AAEF,eAAO,MAAM,MAAM,GAAU,SAAS,UAAU,EAAE,KAAK,OAAO,KAAG,OAAO,CAAC,QAAQ,CAmEhF,CAAC;AAEF,eAAO,MAAM,SAAS,GAAU,SAAS,UAAU,EAAE,KAAK,OAAO,KAAG,OAAO,CAAC,OAAO,CAmBlF,CAAC;AAEF,eAAO,MAAM,SAAS,GAAU,SAAS,UAAU,EAAE,KAAK,OAAO,KAAG,OAAO,CAAC,OAAO,CA0BlF,CAAC;AAEF,eAAO,MAAM,aAAa,GAAI,SAAS,UAAU,EAAE,KAAK,OAAO,KAAG,OAAO,CAAC,QAAQ,CAyBjF,CAAC;AAEF,eAAO,MAAM,MAAM,GAAI,SAAS,UAAU,EAAE,UAAU,UAAU,KAAG,OAAO,CAAC,OAAO,CAwCjF,CAAC;AAEF,eAAO,MAAM,OAAO,GAAU,SAAS,UAAU,EAAE,UAAU,UAAU,KAAG,OAAO,CAAC,OAAO,EAAE,CAiC1F,CAAC"}
|
|
@@ -0,0 +1,221 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Copyright (c) 2019-Present, Nitrogen Labs, Inc.
|
|
3
|
+
* Copyrights licensed under the MIT License. See the accompanying LICENSE file for terms.
|
|
4
|
+
*/ import { aql } from 'arangojs';
|
|
5
|
+
import { logError, logException, UserError } from '../utils/analyticsUtils.js';
|
|
6
|
+
import { getDocId, getLimit, selectReactionCountByType, useDb } from '../utils/arangodbUtils.js';
|
|
7
|
+
import { isAdminUser } from '../utils/sessionUtils.js';
|
|
8
|
+
import { createHash, parseArangoId, parseEmail, parseId, parsePhone, parseString } from '@nlabs/utils/parsers/strings';
|
|
9
|
+
import { ErrorTypes } from '../types/error.types.js';
|
|
10
|
+
const eventCategory = 'apps';
|
|
11
|
+
export const getAppOptional = (fields = [])=>fields.reduce((selects, field)=>{
|
|
12
|
+
if (field.includes('Count')) {
|
|
13
|
+
return selectReactionCountByType('apps', 'a', field, selects);
|
|
14
|
+
}
|
|
15
|
+
return selects;
|
|
16
|
+
}, {
|
|
17
|
+
objects: [],
|
|
18
|
+
queries: []
|
|
19
|
+
});
|
|
20
|
+
export const parseAppOptions = (options = {})=>{
|
|
21
|
+
const { from = 0, to = 30 } = options;
|
|
22
|
+
const limit = getLimit(from, to);
|
|
23
|
+
return {
|
|
24
|
+
...options,
|
|
25
|
+
limit
|
|
26
|
+
};
|
|
27
|
+
};
|
|
28
|
+
export const addApp = async (context, app)=>{
|
|
29
|
+
const action = 'addUser';
|
|
30
|
+
const { databaseName } = context;
|
|
31
|
+
const { email = '', name = '', phone = '' } = app;
|
|
32
|
+
const formatName = parseString(name);
|
|
33
|
+
const formatEmail = parseEmail(email);
|
|
34
|
+
const formatPhone = parsePhone(phone);
|
|
35
|
+
if (!formatName) {
|
|
36
|
+
throw logException({
|
|
37
|
+
action,
|
|
38
|
+
category: eventCategory,
|
|
39
|
+
params: {
|
|
40
|
+
name
|
|
41
|
+
},
|
|
42
|
+
value: ErrorTypes.INVALID_ARGUMENTS
|
|
43
|
+
}, context);
|
|
44
|
+
}
|
|
45
|
+
const filters = [
|
|
46
|
+
`a.name == "${formatName}"`
|
|
47
|
+
];
|
|
48
|
+
if (formatEmail) {
|
|
49
|
+
filters.push(`a.email == "${formatEmail}"`);
|
|
50
|
+
}
|
|
51
|
+
const checkQuery = `FOR u IN users
|
|
52
|
+
FILTER ${filters.join(' || ')}
|
|
53
|
+
RETURN u`;
|
|
54
|
+
try {
|
|
55
|
+
const existingApps = await useDb(databaseName).query(checkQuery).then((cursor)=>cursor.all());
|
|
56
|
+
if (existingApps.length) {
|
|
57
|
+
throw logException({
|
|
58
|
+
action,
|
|
59
|
+
category: eventCategory,
|
|
60
|
+
params: {
|
|
61
|
+
name
|
|
62
|
+
},
|
|
63
|
+
value: ErrorTypes.EXISTING_ITEM
|
|
64
|
+
}, context);
|
|
65
|
+
}
|
|
66
|
+
} catch (error) {
|
|
67
|
+
throw logError({
|
|
68
|
+
action,
|
|
69
|
+
category: eventCategory,
|
|
70
|
+
label: ErrorTypes.DATABASE_ERROR,
|
|
71
|
+
params: {
|
|
72
|
+
name
|
|
73
|
+
}
|
|
74
|
+
}, error, context);
|
|
75
|
+
}
|
|
76
|
+
const insert = {
|
|
77
|
+
_key: createHash(name),
|
|
78
|
+
active: true,
|
|
79
|
+
added: Date.now(),
|
|
80
|
+
email: formatEmail,
|
|
81
|
+
modified: Date.now(),
|
|
82
|
+
name: formatName,
|
|
83
|
+
phone: formatPhone
|
|
84
|
+
};
|
|
85
|
+
const insertQuery = aql`INSERT ${insert} IN apps RETURN NEW`;
|
|
86
|
+
return await useDb(databaseName).query(insertQuery).then((cursor)=>cursor.next() || {}).catch((error)=>logError({
|
|
87
|
+
action,
|
|
88
|
+
category: eventCategory,
|
|
89
|
+
label: ErrorTypes.DATABASE_ERROR,
|
|
90
|
+
params: {
|
|
91
|
+
name
|
|
92
|
+
}
|
|
93
|
+
}, error, context));
|
|
94
|
+
};
|
|
95
|
+
export const updateApp = async (context, app)=>{
|
|
96
|
+
const action = 'updateApp';
|
|
97
|
+
const { databaseName } = context;
|
|
98
|
+
const { _key, _id, id, appId, ...updated } = app;
|
|
99
|
+
const appDocId = getDocId('apps', app);
|
|
100
|
+
const appQuery = aql`LET a = DOCUMENT(${appDocId})
|
|
101
|
+
UPDATE a WITH ${updated} IN apps
|
|
102
|
+
RETURN NEW`;
|
|
103
|
+
return await useDb(databaseName).query(appQuery).then((cursor)=>cursor.next()).catch((error)=>logError({
|
|
104
|
+
action,
|
|
105
|
+
category: eventCategory,
|
|
106
|
+
label: ErrorTypes.DATABASE_ERROR,
|
|
107
|
+
params: {
|
|
108
|
+
app
|
|
109
|
+
}
|
|
110
|
+
}, error, context));
|
|
111
|
+
};
|
|
112
|
+
export const deleteApp = async (context, app)=>{
|
|
113
|
+
const action = 'deleteApp';
|
|
114
|
+
const { databaseName, session = {} } = context;
|
|
115
|
+
const isAdmin = isAdminUser(session);
|
|
116
|
+
const appDocId = getDocId('apps', app);
|
|
117
|
+
if (!isAdmin) {
|
|
118
|
+
return Promise.reject(new UserError(ErrorTypes.INVALID_SESSION));
|
|
119
|
+
}
|
|
120
|
+
const aqlQuery = aql`FOR a IN apps
|
|
121
|
+
FILTER a._id == \"${appDocId}\"
|
|
122
|
+
LIMIT 1
|
|
123
|
+
REMOVE a IN apps
|
|
124
|
+
RETURN OLD`;
|
|
125
|
+
return useDb(databaseName).query(aqlQuery).then((cursor)=>cursor.next()).catch((error)=>{
|
|
126
|
+
throw logError({
|
|
127
|
+
action,
|
|
128
|
+
category: eventCategory,
|
|
129
|
+
label: ErrorTypes.DATABASE_ERROR,
|
|
130
|
+
params: app
|
|
131
|
+
}, error, context);
|
|
132
|
+
});
|
|
133
|
+
};
|
|
134
|
+
export const deactivateApp = (context, app)=>{
|
|
135
|
+
const action = 'deactivateApp';
|
|
136
|
+
const { databaseName, session = {} } = context;
|
|
137
|
+
const isAdmin = isAdminUser(session);
|
|
138
|
+
const appDocId = getDocId('apps', app);
|
|
139
|
+
if (!isAdmin) {
|
|
140
|
+
return Promise.reject(new UserError(ErrorTypes.INVALID_SESSION));
|
|
141
|
+
}
|
|
142
|
+
const updated = {
|
|
143
|
+
active: false
|
|
144
|
+
};
|
|
145
|
+
const aqlQuery = aql`UPDATE ${appDocId} WITH ${updated} IN apps LIMIT 1 RETURN NEW`;
|
|
146
|
+
return useDb(databaseName).query(aqlQuery).then((cursor)=>cursor.next()).catch((error)=>{
|
|
147
|
+
throw logError({
|
|
148
|
+
action,
|
|
149
|
+
category: eventCategory,
|
|
150
|
+
label: ErrorTypes.DATABASE_ERROR,
|
|
151
|
+
params: app
|
|
152
|
+
}, error, context);
|
|
153
|
+
});
|
|
154
|
+
};
|
|
155
|
+
export const getApp = (context, options)=>{
|
|
156
|
+
const action = 'getApp';
|
|
157
|
+
const { databaseName, fields, session = {} } = context;
|
|
158
|
+
const { id, key, name } = parseAppOptions(options);
|
|
159
|
+
const { objects: selectObjects, queries: selectQueries } = getAppOptional(fields);
|
|
160
|
+
const filterBy = [
|
|
161
|
+
'a.active == true'
|
|
162
|
+
];
|
|
163
|
+
const isAdmin = isAdminUser(session);
|
|
164
|
+
if (!isAdmin) {
|
|
165
|
+
return Promise.reject(new UserError(ErrorTypes.INVALID_SESSION));
|
|
166
|
+
}
|
|
167
|
+
if (id) {
|
|
168
|
+
filterBy.push(`a._id == "${parseArangoId(id)}"`);
|
|
169
|
+
}
|
|
170
|
+
if (key) {
|
|
171
|
+
filterBy.push(`a._key == "apps/${parseId(key)}"`);
|
|
172
|
+
}
|
|
173
|
+
if (name) {
|
|
174
|
+
filterBy.push(`CONTAINS(a.name, "${parseString(name)}")`);
|
|
175
|
+
}
|
|
176
|
+
// Get data from database
|
|
177
|
+
const aqlQuery = `FOR a IN apps
|
|
178
|
+
FILTER ${filterBy.join(' && ')}
|
|
179
|
+
${selectQueries.join('\n')}
|
|
180
|
+
RETURN MERGE(a, {${selectObjects.join(', ')}})`;
|
|
181
|
+
return useDb(databaseName).query(aqlQuery).then((cursor)=>cursor.next()).catch((error)=>{
|
|
182
|
+
throw logError({
|
|
183
|
+
action,
|
|
184
|
+
category: eventCategory,
|
|
185
|
+
label: ErrorTypes.DATABASE_ERROR,
|
|
186
|
+
params: options
|
|
187
|
+
}, error, context);
|
|
188
|
+
});
|
|
189
|
+
};
|
|
190
|
+
export const getApps = async (context, options)=>{
|
|
191
|
+
const action = 'getApps';
|
|
192
|
+
const { databaseName, fields, session = {} } = context;
|
|
193
|
+
const { limit, name } = parseAppOptions(options);
|
|
194
|
+
const { objects: selectObjects, queries: selectQueries } = getAppOptional(fields);
|
|
195
|
+
const filterBy = [
|
|
196
|
+
'a.active == true'
|
|
197
|
+
];
|
|
198
|
+
const isAdmin = isAdminUser(session);
|
|
199
|
+
if (!isAdmin) {
|
|
200
|
+
return Promise.reject(new UserError(ErrorTypes.INVALID_SESSION));
|
|
201
|
+
}
|
|
202
|
+
if (name) {
|
|
203
|
+
filterBy.push(`CONTAINS(a.name, "${parseString(name)}")`);
|
|
204
|
+
}
|
|
205
|
+
const aqlQuery = `FOR a IN apps
|
|
206
|
+
FILTER ${filterBy.join(' && ')}
|
|
207
|
+
${selectQueries.join('\n')}
|
|
208
|
+
${limit.aql}
|
|
209
|
+
SORT a.name
|
|
210
|
+
RETURN MERGE(a, {${selectObjects.join(', ')}})`;
|
|
211
|
+
return useDb(databaseName).query(aqlQuery).then((cursor)=>cursor.all()).catch((error)=>{
|
|
212
|
+
throw logError({
|
|
213
|
+
action,
|
|
214
|
+
category: eventCategory,
|
|
215
|
+
label: ErrorTypes.DATABASE_ERROR,
|
|
216
|
+
params: options
|
|
217
|
+
}, error, context);
|
|
218
|
+
});
|
|
219
|
+
};
|
|
220
|
+
|
|
221
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi9Vc2Vycy9uaXRyb2c3L0RldmVsb3BtZW50L3JlYWt0b3Ivc3JjL2FjdGlvbnMvYXBwcy50cyJdLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIENvcHlyaWdodCAoYykgMjAxOS1QcmVzZW50LCBOaXRyb2dlbiBMYWJzLCBJbmMuXG4gKiBDb3B5cmlnaHRzIGxpY2Vuc2VkIHVuZGVyIHRoZSBNSVQgTGljZW5zZS4gU2VlIHRoZSBhY2NvbXBhbnlpbmcgTElDRU5TRSBmaWxlIGZvciB0ZXJtcy5cbiAqL1xuaW1wb3J0IHthcWx9IGZyb20gJ2FyYW5nb2pzJztcbmltcG9ydCB0eXBlIHtBcWxRdWVyeX0gZnJvbSAnYXJhbmdvanMvYXFsJztcblxuaW1wb3J0IHtsb2dFcnJvciwgbG9nRXhjZXB0aW9uLCBVc2VyRXJyb3J9IGZyb20gJy4uL3V0aWxzL2FuYWx5dGljc1V0aWxzLmpzJztcbmltcG9ydCB7Z2V0RG9jSWQsIGdldExpbWl0LCBzZWxlY3RSZWFjdGlvbkNvdW50QnlUeXBlLCB1c2VEYn0gZnJvbSAnLi4vdXRpbHMvYXJhbmdvZGJVdGlscy5qcyc7XG5pbXBvcnQge2lzQWRtaW5Vc2VyfSBmcm9tICcuLi91dGlscy9zZXNzaW9uVXRpbHMuanMnO1xuXG5pbXBvcnQge2NyZWF0ZUhhc2gsIHBhcnNlQXJhbmdvSWQsIHBhcnNlRW1haWwsIHBhcnNlSWQsIHBhcnNlUGhvbmUsIHBhcnNlU3RyaW5nfSBmcm9tICdAbmxhYnMvdXRpbHMvcGFyc2Vycy9zdHJpbmdzJztcbmltcG9ydCB0eXBlIHtBcHBUeXBlfSBmcm9tICcuLi90eXBlcy9hcHBzLnR5cGVzLmpzJztcbmltcG9ydCB0eXBlIHtBcGlDb250ZXh0fSBmcm9tICcuLi90eXBlcy9hdXRoLnR5cGVzLmpzJztcbmltcG9ydCB7RXJyb3JUeXBlc30gZnJvbSAnLi4vdHlwZXMvZXJyb3IudHlwZXMuanMnO1xuaW1wb3J0IHR5cGUge1VzZXJUeXBlfSBmcm9tICcuLi90eXBlcy91c2Vycy50eXBlcy5qcyc7XG5pbXBvcnQgdHlwZSB7U2Vzc2lvbn0gZnJvbSAnLi4vdXRpbHMvc2Vzc2lvblV0aWxzLmpzJztcblxuY29uc3QgZXZlbnRDYXRlZ29yeTogc3RyaW5nID0gJ2FwcHMnO1xuXG5leHBvcnQgaW50ZXJmYWNlIEFwcE9wdGlvbnMge1xuICByZWFkb25seSBpZD86IHN0cmluZztcbiAgcmVhZG9ubHkga2V5Pzogc3RyaW5nO1xuICByZWFkb25seSBmcm9tPzogbnVtYmVyO1xuICByZWFkb25seSBuYW1lPzogc3RyaW5nO1xuICByZWFkb25seSB0bz86IG51bWJlcjtcbn1cblxuZXhwb3J0IGNvbnN0IGdldEFwcE9wdGlvbmFsID0gKGZpZWxkczogc3RyaW5nW10gPSBbXSkgPT5cbiAgZmllbGRzLnJlZHVjZSgoc2VsZWN0cywgZmllbGQ6IHN0cmluZykgPT4ge1xuICAgIGlmKGZpZWxkLmluY2x1ZGVzKCdDb3VudCcpKSB7XG4gICAgICByZXR1cm4gc2VsZWN0UmVhY3Rpb25Db3VudEJ5VHlwZSgnYXBwcycsICdhJywgZmllbGQsIHNlbGVjdHMpO1xuICAgIH1cblxuICAgIHJldHVybiBzZWxlY3RzO1xuICB9LCB7b2JqZWN0czogW10sIHF1ZXJpZXM6IFtdfSk7XG5cbmV4cG9ydCBjb25zdCBwYXJzZUFwcE9wdGlvbnMgPSAob3B0aW9uczogQXBwT3B0aW9ucyA9IHt9KSA9PiB7XG4gIGNvbnN0IHtcbiAgICBmcm9tID0gMCxcbiAgICB0byA9IDMwXG4gIH0gPSBvcHRpb25zO1xuICBjb25zdCBsaW1pdCA9IGdldExpbWl0KGZyb20sIHRvKTtcblxuICByZXR1cm4ge1xuICAgIC4uLm9wdGlvbnMsXG4gICAgbGltaXRcbiAgfTtcbn07XG5cbmV4cG9ydCBjb25zdCBhZGRBcHAgPSBhc3luYyAoY29udGV4dDogQXBpQ29udGV4dCwgYXBwOiBBcHBUeXBlKTogUHJvbWlzZTxVc2VyVHlwZT4gPT4ge1xuICBjb25zdCBhY3Rpb24gPSAnYWRkVXNlcic7XG4gIGNvbnN0IHtkYXRhYmFzZU5hbWV9ID0gY29udGV4dDtcbiAgY29uc3Qge2VtYWlsID0gJycsIG5hbWUgPSAnJywgcGhvbmUgPSAnJ30gPSBhcHA7XG4gIGNvbnN0IGZvcm1hdE5hbWUgPSBwYXJzZVN0cmluZyhuYW1lKTtcbiAgY29uc3QgZm9ybWF0RW1haWwgPSBwYXJzZUVtYWlsKGVtYWlsKTtcbiAgY29uc3QgZm9ybWF0UGhvbmUgPSBwYXJzZVBob25lKHBob25lKTtcblxuICBpZighZm9ybWF0TmFtZSkge1xuICAgIHRocm93IGxvZ0V4Y2VwdGlvbih7XG4gICAgICBhY3Rpb24sXG4gICAgICBjYXRlZ29yeTogZXZlbnRDYXRlZ29yeSxcbiAgICAgIHBhcmFtczoge25hbWV9LFxuICAgICAgdmFsdWU6IEVycm9yVHlwZXMuSU5WQUxJRF9BUkdVTUVOVFNcbiAgICB9LCBjb250ZXh0KTtcbiAgfVxuXG4gIGNvbnN0IGZpbHRlcnM6IHN0cmluZ1tdID0gW2BhLm5hbWUgPT0gXCIke2Zvcm1hdE5hbWV9XCJgXTtcblxuICBpZihmb3JtYXRFbWFpbCkge1xuICAgIGZpbHRlcnMucHVzaChgYS5lbWFpbCA9PSBcIiR7Zm9ybWF0RW1haWx9XCJgKTtcbiAgfVxuXG4gIGNvbnN0IGNoZWNrUXVlcnk6IHN0cmluZyA9IGBGT1IgdSBJTiB1c2Vyc1xuICAgIEZJTFRFUiAke2ZpbHRlcnMuam9pbignIHx8ICcpfVxuICAgIFJFVFVSTiB1YDtcblxuICB0cnkge1xuICAgIGNvbnN0IGV4aXN0aW5nQXBwcyA9IGF3YWl0IHVzZURiKGRhdGFiYXNlTmFtZSkucXVlcnkoY2hlY2tRdWVyeSkudGhlbigoY3Vyc29yKSA9PiBjdXJzb3IuYWxsKCkpO1xuXG4gICAgaWYoZXhpc3RpbmdBcHBzLmxlbmd0aCkge1xuICAgICAgdGhyb3cgbG9nRXhjZXB0aW9uKHtcbiAgICAgICAgYWN0aW9uLFxuICAgICAgICBjYXRlZ29yeTogZXZlbnRDYXRlZ29yeSxcbiAgICAgICAgcGFyYW1zOiB7bmFtZX0sXG4gICAgICAgIHZhbHVlOiBFcnJvclR5cGVzLkVYSVNUSU5HX0lURU1cbiAgICAgIH0sIGNvbnRleHQpO1xuICAgIH1cbiAgfSBjYXRjaChlcnJvcikge1xuICAgIHRocm93IGxvZ0Vycm9yKHtcbiAgICAgIGFjdGlvbixcbiAgICAgIGNhdGVnb3J5OiBldmVudENhdGVnb3J5LFxuICAgICAgbGFiZWw6IEVycm9yVHlwZXMuREFUQUJBU0VfRVJST1IsXG4gICAgICBwYXJhbXM6IHtuYW1lfVxuICAgIH0sIGVycm9yLCBjb250ZXh0KTtcbiAgfVxuXG4gIGNvbnN0IGluc2VydDogQXBwVHlwZSA9IHtcbiAgICBfa2V5OiBjcmVhdGVIYXNoKG5hbWUpLFxuICAgIGFjdGl2ZTogdHJ1ZSxcbiAgICBhZGRlZDogRGF0ZS5ub3coKSxcbiAgICBlbWFpbDogZm9ybWF0RW1haWwsXG4gICAgbW9kaWZpZWQ6IERhdGUubm93KCksXG4gICAgbmFtZTogZm9ybWF0TmFtZSxcbiAgICBwaG9uZTogZm9ybWF0UGhvbmVcbiAgfTtcblxuICBjb25zdCBpbnNlcnRRdWVyeTogQXFsUXVlcnkgPSBhcWxgSU5TRVJUICR7aW5zZXJ0fSBJTiBhcHBzIFJFVFVSTiBORVdgO1xuXG4gIHJldHVybiBhd2FpdCB1c2VEYihkYXRhYmFzZU5hbWUpLnF1ZXJ5KGluc2VydFF1ZXJ5KVxuICAgIC50aGVuKChjdXJzb3IpID0+IGN1cnNvci5uZXh0KCkgfHwge30pXG4gICAgLmNhdGNoKChlcnJvcikgPT4gbG9nRXJyb3Ioe1xuICAgICAgYWN0aW9uLFxuICAgICAgY2F0ZWdvcnk6IGV2ZW50Q2F0ZWdvcnksXG4gICAgICBsYWJlbDogRXJyb3JUeXBlcy5EQVRBQkFTRV9FUlJPUixcbiAgICAgIHBhcmFtczoge25hbWV9XG4gICAgfSwgZXJyb3IsIGNvbnRleHQpKTtcbn07XG5cbmV4cG9ydCBjb25zdCB1cGRhdGVBcHAgPSBhc3luYyAoY29udGV4dDogQXBpQ29udGV4dCwgYXBwOiBBcHBUeXBlKTogUHJvbWlzZTxBcHBUeXBlPiA9PiB7XG4gIGNvbnN0IGFjdGlvbjogc3RyaW5nID0gJ3VwZGF0ZUFwcCc7XG4gIGNvbnN0IHtkYXRhYmFzZU5hbWV9ID0gY29udGV4dDtcbiAgY29uc3Qge19rZXksIF9pZCwgaWQsIGFwcElkLCAuLi51cGRhdGVkfSA9IGFwcDtcbiAgY29uc3QgYXBwRG9jSWQgPSBnZXREb2NJZCgnYXBwcycsIGFwcCk7XG4gIGNvbnN0IGFwcFF1ZXJ5OiBBcWxRdWVyeSA9IGFxbGBMRVQgYSA9IERPQ1VNRU5UKCR7YXBwRG9jSWR9KVxuICAgIFVQREFURSBhIFdJVEggJHt1cGRhdGVkfSBJTiBhcHBzXG4gICAgUkVUVVJOIE5FV2A7XG5cbiAgcmV0dXJuIGF3YWl0IHVzZURiKGRhdGFiYXNlTmFtZSkucXVlcnkoYXBwUXVlcnkpXG4gICAgLnRoZW4oKGN1cnNvcikgPT4gY3Vyc29yLm5leHQoKSlcbiAgICAuY2F0Y2goKGVycm9yKSA9PlxuICAgICAgbG9nRXJyb3Ioe1xuICAgICAgICBhY3Rpb24sXG4gICAgICAgIGNhdGVnb3J5OiBldmVudENhdGVnb3J5LFxuICAgICAgICBsYWJlbDogRXJyb3JUeXBlcy5EQVRBQkFTRV9FUlJPUixcbiAgICAgICAgcGFyYW1zOiB7YXBwfVxuICAgICAgfSwgZXJyb3IsIGNvbnRleHQpXG4gICAgKTtcbn07XG5cbmV4cG9ydCBjb25zdCBkZWxldGVBcHAgPSBhc3luYyAoY29udGV4dDogQXBpQ29udGV4dCwgYXBwOiBBcHBUeXBlKTogUHJvbWlzZTxBcHBUeXBlPiA9PiB7XG4gIGNvbnN0IGFjdGlvbjogc3RyaW5nID0gJ2RlbGV0ZUFwcCc7XG4gIGNvbnN0IHtkYXRhYmFzZU5hbWUsIHNlc3Npb24gPSB7fX0gPSBjb250ZXh0O1xuICBjb25zdCBpc0FkbWluID0gaXNBZG1pblVzZXIoc2Vzc2lvbiBhcyBTZXNzaW9uKTtcbiAgY29uc3QgYXBwRG9jSWQgPSBnZXREb2NJZCgnYXBwcycsIGFwcCk7XG5cbiAgaWYoIWlzQWRtaW4pIHtcbiAgICByZXR1cm4gUHJvbWlzZS5yZWplY3QobmV3IFVzZXJFcnJvcihFcnJvclR5cGVzLklOVkFMSURfU0VTU0lPTikpO1xuICB9XG5cbiAgY29uc3QgYXFsUXVlcnk6IEFxbFF1ZXJ5ID0gYXFsYEZPUiBhIElOIGFwcHNcbiAgICBGSUxURVIgYS5faWQgPT0gXFxcIiR7YXBwRG9jSWR9XFxcIlxuICAgIExJTUlUIDFcbiAgICBSRU1PVkUgYSBJTiBhcHBzXG4gICAgUkVUVVJOIE9MRGA7XG5cbiAgcmV0dXJuIHVzZURiKGRhdGFiYXNlTmFtZSkucXVlcnkoYXFsUXVlcnkpXG4gICAgLnRoZW4oKGN1cnNvcikgPT4gY3Vyc29yLm5leHQoKSlcbiAgICAuY2F0Y2goKGVycm9yKSA9PntcbiAgICAgIHRocm93IGxvZ0Vycm9yKHtcbiAgICAgICAgYWN0aW9uLFxuICAgICAgICBjYXRlZ29yeTogZXZlbnRDYXRlZ29yeSxcbiAgICAgICAgbGFiZWw6IEVycm9yVHlwZXMuREFUQUJBU0VfRVJST1IsXG4gICAgICAgIHBhcmFtczogYXBwIGFzIFJlY29yZDxzdHJpbmcsIHVua25vd24+XG4gICAgICB9LCBlcnJvciwgY29udGV4dCk7XG4gICAgfSk7XG59O1xuXG5leHBvcnQgY29uc3QgZGVhY3RpdmF0ZUFwcCA9IChjb250ZXh0OiBBcGlDb250ZXh0LCBhcHA6IEFwcFR5cGUpOiBQcm9taXNlPFVzZXJUeXBlPiA9PiB7XG4gIGNvbnN0IGFjdGlvbjogc3RyaW5nID0gJ2RlYWN0aXZhdGVBcHAnO1xuICBjb25zdCB7ZGF0YWJhc2VOYW1lLCBzZXNzaW9uID0ge319ID0gY29udGV4dDtcbiAgY29uc3QgaXNBZG1pbiA9IGlzQWRtaW5Vc2VyKHNlc3Npb24gYXMgU2Vzc2lvbik7XG4gIGNvbnN0IGFwcERvY0lkID0gZ2V0RG9jSWQoJ2FwcHMnLCBhcHApO1xuXG4gIGlmKCFpc0FkbWluKSB7XG4gICAgcmV0dXJuIFByb21pc2UucmVqZWN0KG5ldyBVc2VyRXJyb3IoRXJyb3JUeXBlcy5JTlZBTElEX1NFU1NJT04pKTtcbiAgfVxuXG4gIGNvbnN0IHVwZGF0ZWQ6IEFwcFR5cGUgPSB7XG4gICAgYWN0aXZlOiBmYWxzZVxuICB9O1xuICBjb25zdCBhcWxRdWVyeTogQXFsUXVlcnkgPSBhcWxgVVBEQVRFICR7YXBwRG9jSWR9IFdJVEggJHt1cGRhdGVkfSBJTiBhcHBzIExJTUlUIDEgUkVUVVJOIE5FV2A7XG5cbiAgcmV0dXJuIHVzZURiKGRhdGFiYXNlTmFtZSkucXVlcnkoYXFsUXVlcnkpXG4gICAgLnRoZW4oKGN1cnNvcikgPT4gY3Vyc29yLm5leHQoKSlcbiAgICAuY2F0Y2goKGVycm9yOiBFcnJvcikgPT4ge1xuICAgICAgdGhyb3cgbG9nRXJyb3Ioe1xuICAgICAgICBhY3Rpb24sXG4gICAgICAgIGNhdGVnb3J5OiBldmVudENhdGVnb3J5LFxuICAgICAgICBsYWJlbDogRXJyb3JUeXBlcy5EQVRBQkFTRV9FUlJPUixcbiAgICAgICAgcGFyYW1zOiBhcHAgYXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj5cbiAgICAgIH0sIGVycm9yLCBjb250ZXh0KTtcbiAgICB9KTtcbn07XG5cbmV4cG9ydCBjb25zdCBnZXRBcHAgPSAoY29udGV4dDogQXBpQ29udGV4dCwgb3B0aW9ucz86IEFwcE9wdGlvbnMpOiBQcm9taXNlPEFwcFR5cGU+ID0+IHtcbiAgY29uc3QgYWN0aW9uOiBzdHJpbmcgPSAnZ2V0QXBwJztcbiAgY29uc3Qge2RhdGFiYXNlTmFtZSwgZmllbGRzLCBzZXNzaW9uID0ge319ID0gY29udGV4dDtcbiAgY29uc3Qge2lkLCBrZXksIG5hbWV9ID0gcGFyc2VBcHBPcHRpb25zKG9wdGlvbnMpO1xuICBjb25zdCB7b2JqZWN0czogc2VsZWN0T2JqZWN0cywgcXVlcmllczogc2VsZWN0UXVlcmllc30gPSBnZXRBcHBPcHRpb25hbChmaWVsZHMpO1xuICBjb25zdCBmaWx0ZXJCeTogc3RyaW5nW10gPSBbJ2EuYWN0aXZlID09IHRydWUnXTtcbiAgY29uc3QgaXNBZG1pbiA9IGlzQWRtaW5Vc2VyKHNlc3Npb24gYXMgU2Vzc2lvbik7XG5cbiAgaWYoIWlzQWRtaW4pIHtcbiAgICByZXR1cm4gUHJvbWlzZS5yZWplY3QobmV3IFVzZXJFcnJvcihFcnJvclR5cGVzLklOVkFMSURfU0VTU0lPTikpO1xuICB9XG5cbiAgaWYoaWQpIHtcbiAgICBmaWx0ZXJCeS5wdXNoKGBhLl9pZCA9PSBcIiR7cGFyc2VBcmFuZ29JZChpZCl9XCJgKTtcbiAgfVxuXG4gIGlmKGtleSkge1xuICAgIGZpbHRlckJ5LnB1c2goYGEuX2tleSA9PSBcImFwcHMvJHtwYXJzZUlkKGtleSl9XCJgKTtcbiAgfVxuXG4gIGlmKG5hbWUpIHtcbiAgICBmaWx0ZXJCeS5wdXNoKGBDT05UQUlOUyhhLm5hbWUsIFwiJHtwYXJzZVN0cmluZyhuYW1lKX1cIilgKTtcbiAgfVxuXG4gIC8vIEdldCBkYXRhIGZyb20gZGF0YWJhc2VcbiAgY29uc3QgYXFsUXVlcnk6IHN0cmluZyA9IGBGT1IgYSBJTiBhcHBzXG4gICAgRklMVEVSICR7ZmlsdGVyQnkuam9pbignICYmICcpfVxuICAgICR7c2VsZWN0UXVlcmllcy5qb2luKCdcXG4nKX1cbiAgICBSRVRVUk4gTUVSR0UoYSwgeyR7c2VsZWN0T2JqZWN0cy5qb2luKCcsICcpfX0pYDtcblxuICByZXR1cm4gdXNlRGIoZGF0YWJhc2VOYW1lKS5xdWVyeShhcWxRdWVyeSlcbiAgICAudGhlbigoY3Vyc29yKSA9PiBjdXJzb3IubmV4dCgpIGFzIHVua25vd24gYXMgQXBwVHlwZSlcbiAgICAuY2F0Y2goKGVycm9yOiBFcnJvcikgPT4ge1xuICAgICAgdGhyb3cgbG9nRXJyb3Ioe1xuICAgICAgICBhY3Rpb24sXG4gICAgICAgIGNhdGVnb3J5OiBldmVudENhdGVnb3J5LFxuICAgICAgICBsYWJlbDogRXJyb3JUeXBlcy5EQVRBQkFTRV9FUlJPUixcbiAgICAgICAgcGFyYW1zOiBvcHRpb25zIGFzIFJlY29yZDxzdHJpbmcsIHVua25vd24+XG4gICAgICB9LCBlcnJvciwgY29udGV4dCk7XG4gICAgfSk7XG59O1xuXG5leHBvcnQgY29uc3QgZ2V0QXBwcyA9IGFzeW5jIChjb250ZXh0OiBBcGlDb250ZXh0LCBvcHRpb25zPzogQXBwT3B0aW9ucyk6IFByb21pc2U8QXBwVHlwZVtdPiA9PiB7XG4gIGNvbnN0IGFjdGlvbjogc3RyaW5nID0gJ2dldEFwcHMnO1xuICBjb25zdCB7ZGF0YWJhc2VOYW1lLCBmaWVsZHMsIHNlc3Npb24gPSB7fX0gPSBjb250ZXh0O1xuICBjb25zdCB7bGltaXQsIG5hbWV9ID0gcGFyc2VBcHBPcHRpb25zKG9wdGlvbnMpO1xuICBjb25zdCB7b2JqZWN0czogc2VsZWN0T2JqZWN0cywgcXVlcmllczogc2VsZWN0UXVlcmllc30gPSBnZXRBcHBPcHRpb25hbChmaWVsZHMpO1xuICBjb25zdCBmaWx0ZXJCeTogc3RyaW5nW10gPSBbJ2EuYWN0aXZlID09IHRydWUnXTtcbiAgY29uc3QgaXNBZG1pbiA9IGlzQWRtaW5Vc2VyKHNlc3Npb24gYXMgU2Vzc2lvbik7XG5cbiAgaWYoIWlzQWRtaW4pIHtcbiAgICByZXR1cm4gUHJvbWlzZS5yZWplY3QobmV3IFVzZXJFcnJvcihFcnJvclR5cGVzLklOVkFMSURfU0VTU0lPTikpO1xuICB9XG5cbiAgaWYobmFtZSkge1xuICAgIGZpbHRlckJ5LnB1c2goYENPTlRBSU5TKGEubmFtZSwgXCIke3BhcnNlU3RyaW5nKG5hbWUpfVwiKWApO1xuICB9XG5cbiAgY29uc3QgYXFsUXVlcnk6IHN0cmluZyA9IGBGT1IgYSBJTiBhcHBzXG4gICAgRklMVEVSICR7ZmlsdGVyQnkuam9pbignICYmICcpfVxuICAgICR7c2VsZWN0UXVlcmllcy5qb2luKCdcXG4nKX1cbiAgICAke2xpbWl0LmFxbH1cbiAgICBTT1JUIGEubmFtZVxuICAgIFJFVFVSTiBNRVJHRShhLCB7JHtzZWxlY3RPYmplY3RzLmpvaW4oJywgJyl9fSlgO1xuXG4gIHJldHVybiB1c2VEYihkYXRhYmFzZU5hbWUpLnF1ZXJ5KGFxbFF1ZXJ5KVxuICAgIC50aGVuKChjdXJzb3IpID0+IGN1cnNvci5hbGwoKSBhcyB1bmtub3duIGFzIEFwcFR5cGVbXSlcbiAgICAuY2F0Y2goKGVycm9yOiBFcnJvcikgPT4ge1xuICAgICAgdGhyb3cgbG9nRXJyb3Ioe1xuICAgICAgICBhY3Rpb24sXG4gICAgICAgIGNhdGVnb3J5OiBldmVudENhdGVnb3J5LFxuICAgICAgICBsYWJlbDogRXJyb3JUeXBlcy5EQVRBQkFTRV9FUlJPUixcbiAgICAgICAgcGFyYW1zOiBvcHRpb25zIGFzIFJlY29yZDxzdHJpbmcsIHVua25vd24+XG4gICAgICB9LCBlcnJvciwgY29udGV4dCk7XG4gICAgfSk7XG59O1xuIl0sIm5hbWVzIjpbImFxbCIsImxvZ0Vycm9yIiwibG9nRXhjZXB0aW9uIiwiVXNlckVycm9yIiwiZ2V0RG9jSWQiLCJnZXRMaW1pdCIsInNlbGVjdFJlYWN0aW9uQ291bnRCeVR5cGUiLCJ1c2VEYiIsImlzQWRtaW5Vc2VyIiwiY3JlYXRlSGFzaCIsInBhcnNlQXJhbmdvSWQiLCJwYXJzZUVtYWlsIiwicGFyc2VJZCIsInBhcnNlUGhvbmUiLCJwYXJzZVN0cmluZyIsIkVycm9yVHlwZXMiLCJldmVudENhdGVnb3J5IiwiZ2V0QXBwT3B0aW9uYWwiLCJmaWVsZHMiLCJyZWR1Y2UiLCJzZWxlY3RzIiwiZmllbGQiLCJpbmNsdWRlcyIsIm9iamVjdHMiLCJxdWVyaWVzIiwicGFyc2VBcHBPcHRpb25zIiwib3B0aW9ucyIsImZyb20iLCJ0byIsImxpbWl0IiwiYWRkQXBwIiwiY29udGV4dCIsImFwcCIsImFjdGlvbiIsImRhdGFiYXNlTmFtZSIsImVtYWlsIiwibmFtZSIsInBob25lIiwiZm9ybWF0TmFtZSIsImZvcm1hdEVtYWlsIiwiZm9ybWF0UGhvbmUiLCJjYXRlZ29yeSIsInBhcmFtcyIsInZhbHVlIiwiSU5WQUxJRF9BUkdVTUVOVFMiLCJmaWx0ZXJzIiwicHVzaCIsImNoZWNrUXVlcnkiLCJqb2luIiwiZXhpc3RpbmdBcHBzIiwicXVlcnkiLCJ0aGVuIiwiY3Vyc29yIiwiYWxsIiwibGVuZ3RoIiwiRVhJU1RJTkdfSVRFTSIsImVycm9yIiwibGFiZWwiLCJEQVRBQkFTRV9FUlJPUiIsImluc2VydCIsIl9rZXkiLCJhY3RpdmUiLCJhZGRlZCIsIkRhdGUiLCJub3ciLCJtb2RpZmllZCIsImluc2VydFF1ZXJ5IiwibmV4dCIsImNhdGNoIiwidXBkYXRlQXBwIiwiX2lkIiwiaWQiLCJhcHBJZCIsInVwZGF0ZWQiLCJhcHBEb2NJZCIsImFwcFF1ZXJ5IiwiZGVsZXRlQXBwIiwic2Vzc2lvbiIsImlzQWRtaW4iLCJQcm9taXNlIiwicmVqZWN0IiwiSU5WQUxJRF9TRVNTSU9OIiwiYXFsUXVlcnkiLCJkZWFjdGl2YXRlQXBwIiwiZ2V0QXBwIiwia2V5Iiwic2VsZWN0T2JqZWN0cyIsInNlbGVjdFF1ZXJpZXMiLCJmaWx0ZXJCeSIsImdldEFwcHMiXSwibWFwcGluZ3MiOiJBQUFBOzs7Q0FHQyxHQUNELFNBQVFBLEdBQUcsUUFBTyxXQUFXO0FBRzdCLFNBQVFDLFFBQVEsRUFBRUMsWUFBWSxFQUFFQyxTQUFTLFFBQU8sNkJBQTZCO0FBQzdFLFNBQVFDLFFBQVEsRUFBRUMsUUFBUSxFQUFFQyx5QkFBeUIsRUFBRUMsS0FBSyxRQUFPLDRCQUE0QjtBQUMvRixTQUFRQyxXQUFXLFFBQU8sMkJBQTJCO0FBRXJELFNBQVFDLFVBQVUsRUFBRUMsYUFBYSxFQUFFQyxVQUFVLEVBQUVDLE9BQU8sRUFBRUMsVUFBVSxFQUFFQyxXQUFXLFFBQU8sK0JBQStCO0FBR3JILFNBQVFDLFVBQVUsUUFBTywwQkFBMEI7QUFJbkQsTUFBTUMsZ0JBQXdCO0FBVTlCLE9BQU8sTUFBTUMsaUJBQWlCLENBQUNDLFNBQW1CLEVBQUUsR0FDbERBLE9BQU9DLE1BQU0sQ0FBQyxDQUFDQyxTQUFTQztRQUN0QixJQUFHQSxNQUFNQyxRQUFRLENBQUMsVUFBVTtZQUMxQixPQUFPaEIsMEJBQTBCLFFBQVEsS0FBS2UsT0FBT0Q7UUFDdkQ7UUFFQSxPQUFPQTtJQUNULEdBQUc7UUFBQ0csU0FBUyxFQUFFO1FBQUVDLFNBQVMsRUFBRTtJQUFBLEdBQUc7QUFFakMsT0FBTyxNQUFNQyxrQkFBa0IsQ0FBQ0MsVUFBc0IsQ0FBQyxDQUFDO0lBQ3RELE1BQU0sRUFD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
|
|
@@ -3,3 +3,4 @@ import type { ConnectionType } from '../types/connections.types.js';
|
|
|
3
3
|
export declare const addConnection: (context: ApiContext, fromType: string, fromId: string, toType: string, toId: string, value?: string) => Promise<boolean>;
|
|
4
4
|
export declare const getConnection: (context: ApiContext, fromType: string, fromId: string, toType: string, toId: string) => Promise<ConnectionType>;
|
|
5
5
|
export declare const deleteConnection: (context: ApiContext, fromType: string, fromId: string, toType: string, toId: string) => Promise<boolean>;
|
|
6
|
+
//# sourceMappingURL=connections.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"connections.d.ts","sourceRoot":"","sources":["../../src/actions/connections.ts"],"names":[],"mappings":"AASA,OAAO,KAAK,EAAC,UAAU,EAAC,MAAM,wBAAwB,CAAC;AACvD,OAAO,KAAK,EAAC,cAAc,EAAC,MAAM,+BAA+B,CAAC;AAIlE,eAAO,MAAM,aAAa,GACxB,SAAS,UAAU,EACnB,UAAU,MAAM,EAChB,QAAQ,MAAM,EACd,QAAQ,MAAM,EACd,MAAM,MAAM,EACZ,QAAQ,MAAM,KACb,OAAO,CAAC,OAAO,CAyBjB,CAAC;AAEF,eAAO,MAAM,aAAa,GACxB,SAAS,UAAU,EACnB,UAAU,MAAM,EAChB,QAAQ,MAAM,EACd,QAAQ,MAAM,EACd,MAAM,MAAM,KACX,OAAO,CAAC,cAAc,CAkBxB,CAAC;AAEF,eAAO,MAAM,gBAAgB,GAC3B,SAAS,UAAU,EACnB,UAAU,MAAM,EAChB,QAAQ,MAAM,EACd,QAAQ,MAAM,EACd,MAAM,MAAM,KACX,OAAO,CAAC,OAAO,CAqBjB,CAAC"}
|
|
@@ -0,0 +1,62 @@
|
|
|
1
|
+
import { parseArangoId, parseString } from '@nlabs/utils/parsers/strings';
|
|
2
|
+
import { aql } from 'arangojs';
|
|
3
|
+
import { ErrorTypes } from '../types/error.types.js';
|
|
4
|
+
import { logError } from '../utils/analyticsUtils.js';
|
|
5
|
+
import { useDb } from '../utils/arangodbUtils.js';
|
|
6
|
+
const eventCategory = 'connections';
|
|
7
|
+
export const addConnection = (context, fromType, fromId, toType, toId, value)=>{
|
|
8
|
+
const action = 'addConnection';
|
|
9
|
+
const { databaseName } = context;
|
|
10
|
+
const formatFromDocId = parseArangoId(`${fromType}/${fromId}`);
|
|
11
|
+
const formatToDocId = parseArangoId(`${toType}/${toId}`);
|
|
12
|
+
const insert = {
|
|
13
|
+
_from: formatFromDocId,
|
|
14
|
+
_to: formatToDocId,
|
|
15
|
+
isDirect: true,
|
|
16
|
+
type: toType,
|
|
17
|
+
value: !!value ? parseString(value, 32) : undefined
|
|
18
|
+
};
|
|
19
|
+
const aqlQry = aql`INSERT ${insert} IN hasConnection`;
|
|
20
|
+
return useDb(databaseName).query(aqlQry).then(()=>true).catch((error)=>{
|
|
21
|
+
logError({
|
|
22
|
+
action,
|
|
23
|
+
category: eventCategory,
|
|
24
|
+
label: ErrorTypes.DATABASE_ERROR
|
|
25
|
+
}, error, context);
|
|
26
|
+
return false;
|
|
27
|
+
});
|
|
28
|
+
};
|
|
29
|
+
export const getConnection = (context, fromType, fromId, toType, toId)=>{
|
|
30
|
+
const action = 'getConnection';
|
|
31
|
+
const { databaseName } = context;
|
|
32
|
+
const formatFromDocId = parseArangoId(`${fromType}/${fromId}`);
|
|
33
|
+
const formatToDocId = parseArangoId(`${toType}/${toId}`);
|
|
34
|
+
const aqlQry = aql`FOR hc in hasConnection
|
|
35
|
+
FILTER hc._from == ${formatFromDocId} && hc._to == ${formatToDocId}
|
|
36
|
+
LIMIT 1`;
|
|
37
|
+
return useDb(databaseName).query(aqlQry).then((cursor)=>cursor.next()).catch((error)=>logError({
|
|
38
|
+
action,
|
|
39
|
+
category: eventCategory,
|
|
40
|
+
label: ErrorTypes.DATABASE_ERROR
|
|
41
|
+
}, error, context));
|
|
42
|
+
};
|
|
43
|
+
export const deleteConnection = (context, fromType, fromId, toType, toId)=>{
|
|
44
|
+
const action = 'deleteReactionByItem';
|
|
45
|
+
const { databaseName } = context;
|
|
46
|
+
const formatFromDocId = parseArangoId(`${fromType}/${fromId}`);
|
|
47
|
+
const formatToDocId = parseArangoId(`${toType}/${toId}`);
|
|
48
|
+
const aqlQry = aql`FOR hc in hasConnection
|
|
49
|
+
FILTER hc._from == ${formatFromDocId} && hc._to == ${formatToDocId}
|
|
50
|
+
LIMIT 1
|
|
51
|
+
REMOVE hc IN hasConnection`;
|
|
52
|
+
return useDb(databaseName).query(aqlQry).then(()=>true).catch((error)=>{
|
|
53
|
+
logError({
|
|
54
|
+
action,
|
|
55
|
+
category: eventCategory,
|
|
56
|
+
label: ErrorTypes.DATABASE_ERROR
|
|
57
|
+
}, error, context);
|
|
58
|
+
return false;
|
|
59
|
+
});
|
|
60
|
+
};
|
|
61
|
+
|
|
62
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi9Vc2Vycy9uaXRyb2c3L0RldmVsb3BtZW50L3JlYWt0b3Ivc3JjL2FjdGlvbnMvY29ubmVjdGlvbnMudHMiXSwic291cmNlc0NvbnRlbnQiOlsiXG5pbXBvcnQge3BhcnNlQXJhbmdvSWQsIHBhcnNlU3RyaW5nfSBmcm9tICdAbmxhYnMvdXRpbHMvcGFyc2Vycy9zdHJpbmdzJztcbmltcG9ydCB7YXFsfSBmcm9tICdhcmFuZ29qcyc7XG5cbmltcG9ydCB7RXJyb3JUeXBlc30gZnJvbSAnLi4vdHlwZXMvZXJyb3IudHlwZXMuanMnO1xuaW1wb3J0IHtsb2dFcnJvcn0gZnJvbSAnLi4vdXRpbHMvYW5hbHl0aWNzVXRpbHMuanMnO1xuaW1wb3J0IHt1c2VEYn0gZnJvbSAnLi4vdXRpbHMvYXJhbmdvZGJVdGlscy5qcyc7XG5cbmltcG9ydCB0eXBlIHtBcWxRdWVyeX0gZnJvbSAnYXJhbmdvanMvYXFsJztcbmltcG9ydCB0eXBlIHtBcGlDb250ZXh0fSBmcm9tICcuLi90eXBlcy9hdXRoLnR5cGVzLmpzJztcbmltcG9ydCB0eXBlIHtDb25uZWN0aW9uVHlwZX0gZnJvbSAnLi4vdHlwZXMvY29ubmVjdGlvbnMudHlwZXMuanMnO1xuXG5jb25zdCBldmVudENhdGVnb3J5OiBzdHJpbmcgPSAnY29ubmVjdGlvbnMnO1xuXG5leHBvcnQgY29uc3QgYWRkQ29ubmVjdGlvbiA9IChcbiAgY29udGV4dDogQXBpQ29udGV4dCxcbiAgZnJvbVR5cGU6IHN0cmluZyxcbiAgZnJvbUlkOiBzdHJpbmcsXG4gIHRvVHlwZTogc3RyaW5nLFxuICB0b0lkOiBzdHJpbmcsXG4gIHZhbHVlPzogc3RyaW5nXG4pOiBQcm9taXNlPGJvb2xlYW4+ID0+IHtcbiAgY29uc3QgYWN0aW9uOiBzdHJpbmcgPSAnYWRkQ29ubmVjdGlvbic7XG4gIGNvbnN0IHtkYXRhYmFzZU5hbWV9ID0gY29udGV4dDtcblxuICBjb25zdCBmb3JtYXRGcm9tRG9jSWQ6IHN0cmluZyA9IHBhcnNlQXJhbmdvSWQoYCR7ZnJvbVR5cGV9LyR7ZnJvbUlkfWApO1xuICBjb25zdCBmb3JtYXRUb0RvY0lkOiBzdHJpbmcgPSBwYXJzZUFyYW5nb0lkKGAke3RvVHlwZX0vJHt0b0lkfWApO1xuICBjb25zdCBpbnNlcnQgPSB7XG4gICAgX2Zyb206IGZvcm1hdEZyb21Eb2NJZCxcbiAgICBfdG86IGZvcm1hdFRvRG9jSWQsXG4gICAgaXNEaXJlY3Q6IHRydWUsXG4gICAgdHlwZTogdG9UeXBlLFxuICAgIHZhbHVlOiAhIXZhbHVlID8gcGFyc2VTdHJpbmcodmFsdWUsIDMyKSA6IHVuZGVmaW5lZFxuICB9O1xuICBjb25zdCBhcWxRcnk6IEFxbFF1ZXJ5ID0gYXFsYElOU0VSVCAke2luc2VydH0gSU4gaGFzQ29ubmVjdGlvbmA7XG5cbiAgcmV0dXJuIHVzZURiKGRhdGFiYXNlTmFtZSkucXVlcnkoYXFsUXJ5KVxuICAgIC50aGVuKCgpID0+IHRydWUpXG4gICAgLmNhdGNoKChlcnJvcjogRXJyb3IpID0+IHtcbiAgICAgIGxvZ0Vycm9yKHtcbiAgICAgICAgYWN0aW9uLFxuICAgICAgICBjYXRlZ29yeTogZXZlbnRDYXRlZ29yeSxcbiAgICAgICAgbGFiZWw6IEVycm9yVHlwZXMuREFUQUJBU0VfRVJST1JcbiAgICAgIH0sIGVycm9yLCBjb250ZXh0KTtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9KTtcbn07XG5cbmV4cG9ydCBjb25zdCBnZXRDb25uZWN0aW9uID0gKFxuICBjb250ZXh0OiBBcGlDb250ZXh0LFxuICBmcm9tVHlwZTogc3RyaW5nLFxuICBmcm9tSWQ6IHN0cmluZyxcbiAgdG9UeXBlOiBzdHJpbmcsXG4gIHRvSWQ6IHN0cmluZ1xuKTogUHJvbWlzZTxDb25uZWN0aW9uVHlwZT4gPT4ge1xuICBjb25zdCBhY3Rpb246IHN0cmluZyA9ICdnZXRDb25uZWN0aW9uJztcbiAgY29uc3Qge2RhdGFiYXNlTmFtZX0gPSBjb250ZXh0O1xuXG4gIGNvbnN0IGZvcm1hdEZyb21Eb2NJZDogc3RyaW5nID0gcGFyc2VBcmFuZ29JZChgJHtmcm9tVHlwZX0vJHtmcm9tSWR9YCk7XG4gIGNvbnN0IGZvcm1hdFRvRG9jSWQ6IHN0cmluZyA9IHBhcnNlQXJhbmdvSWQoYCR7dG9UeXBlfS8ke3RvSWR9YCk7XG5cbiAgY29uc3QgYXFsUXJ5OiBBcWxRdWVyeSA9IGFxbGBGT1IgaGMgaW4gaGFzQ29ubmVjdGlvblxuICAgIEZJTFRFUiBoYy5fZnJvbSA9PSAke2Zvcm1hdEZyb21Eb2NJZH0gJiYgaGMuX3RvID09ICR7Zm9ybWF0VG9Eb2NJZH1cbiAgICBMSU1JVCAxYDtcblxuICByZXR1cm4gdXNlRGIoZGF0YWJhc2VOYW1lKS5xdWVyeShhcWxRcnkpXG4gICAgLnRoZW4oKGN1cnNvcikgPT4gY3Vyc29yLm5leHQoKSlcbiAgICAuY2F0Y2goKGVycm9yOiBFcnJvcikgPT4gbG9nRXJyb3Ioe1xuICAgICAgYWN0aW9uLFxuICAgICAgY2F0ZWdvcnk6IGV2ZW50Q2F0ZWdvcnksXG4gICAgICBsYWJlbDogRXJyb3JUeXBlcy5EQVRBQkFTRV9FUlJPUlxuICAgIH0sIGVycm9yLCBjb250ZXh0KSk7XG59O1xuXG5leHBvcnQgY29uc3QgZGVsZXRlQ29ubmVjdGlvbiA9IChcbiAgY29udGV4dDogQXBpQ29udGV4dCxcbiAgZnJvbVR5cGU6IHN0cmluZyxcbiAgZnJvbUlkOiBzdHJpbmcsXG4gIHRvVHlwZTogc3RyaW5nLFxuICB0b0lkOiBzdHJpbmdcbik6IFByb21pc2U8Ym9vbGVhbj4gPT4ge1xuICBjb25zdCBhY3Rpb246IHN0cmluZyA9ICdkZWxldGVSZWFjdGlvbkJ5SXRlbSc7XG4gIGNvbnN0IHtkYXRhYmFzZU5hbWV9ID0gY29udGV4dDtcbiAgY29uc3QgZm9ybWF0RnJvbURvY0lkOiBzdHJpbmcgPSBwYXJzZUFyYW5nb0lkKGAke2Zyb21UeXBlfS8ke2Zyb21JZH1gKTtcbiAgY29uc3QgZm9ybWF0VG9Eb2NJZDogc3RyaW5nID0gcGFyc2VBcmFuZ29JZChgJHt0b1R5cGV9LyR7dG9JZH1gKTtcblxuICBjb25zdCBhcWxRcnk6IEFxbFF1ZXJ5ID0gYXFsYEZPUiBoYyBpbiBoYXNDb25uZWN0aW9uXG4gICAgRklMVEVSIGhjLl9mcm9tID09ICR7Zm9ybWF0RnJvbURvY0lkfSAmJiBoYy5fdG8gPT0gJHtmb3JtYXRUb0RvY0lkfVxuICAgIExJTUlUIDFcbiAgICBSRU1PVkUgaGMgSU4gaGFzQ29ubmVjdGlvbmA7XG5cbiAgcmV0dXJuIHVzZURiKGRhdGFiYXNlTmFtZSkucXVlcnkoYXFsUXJ5KVxuICAgIC50aGVuKCgpID0+IHRydWUpXG4gICAgLmNhdGNoKChlcnJvcjogRXJyb3IpID0+IHtcbiAgICAgIGxvZ0Vycm9yKHtcbiAgICAgICAgYWN0aW9uLFxuICAgICAgICBjYXRlZ29yeTogZXZlbnRDYXRlZ29yeSxcbiAgICAgICAgbGFiZWw6IEVycm9yVHlwZXMuREFUQUJBU0VfRVJST1JcbiAgICAgIH0sIGVycm9yLCBjb250ZXh0KTtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9KTtcbn07XG4iXSwibmFtZXMiOlsicGFyc2VBcmFuZ29JZCIsInBhcnNlU3RyaW5nIiwiYXFsIiwiRXJyb3JUeXBlcyIsImxvZ0Vycm9yIiwidXNlRGIiLCJldmVudENhdGVnb3J5IiwiYWRkQ29ubmVjdGlvbiIsImNvbnRleHQiLCJmcm9tVHlwZSIsImZyb21JZCIsInRvVHlwZSIsInRvSWQiLCJ2YWx1ZSIsImFjdGlvbiIsImRhdGFiYXNlTmFtZSIsImZvcm1hdEZyb21Eb2NJZCIsImZvcm1hdFRvRG9jSWQiLCJpbnNlcnQiLCJfZnJvbSIsIl90byIsImlzRGlyZWN0IiwidHlwZSIsInVuZGVmaW5lZCIsImFxbFFyeSIsInF1ZXJ5IiwidGhlbiIsImNhdGNoIiwiZXJyb3IiLCJjYXRlZ29yeSIsImxhYmVsIiwiREFUQUJBU0VfRVJST1IiLCJnZXRDb25uZWN0aW9uIiwiY3Vyc29yIiwibmV4dCIsImRlbGV0ZUNvbm5lY3Rpb24iXSwibWFwcGluZ3MiOiJBQUNBLFNBQVFBLGFBQWEsRUFBRUMsV0FBVyxRQUFPLCtCQUErQjtBQUN4RSxTQUFR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
|
package/lib/actions/content.d.ts
CHANGED
|
@@ -11,3 +11,4 @@ export declare const getContentWithFallback: (context: ApiContext, key: string,
|
|
|
11
11
|
export declare const addContent: (context: ApiContext, contentInput: ContentInputType) => Promise<ContentType>;
|
|
12
12
|
export declare const updateContent: (context: ApiContext, contentInput: ContentInputType) => Promise<ContentType>;
|
|
13
13
|
export declare const searchContent: (context: ApiContext, options?: ContentOptions) => Promise<ContentType[]>;
|
|
14
|
+
//# sourceMappingURL=content.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"content.d.ts","sourceRoot":"","sources":["../../src/actions/content.ts"],"names":[],"mappings":"AAgBA,OAAO,KAAK,EAAC,UAAU,EAAC,MAAM,wBAAwB,CAAC;AACvD,OAAO,KAAK,EAAC,gBAAgB,EAAE,cAAc,EAAE,WAAW,EAAE,MAAM,EAAC,MAAM,2BAA2B,CAAC;AAIrG,eAAO,MAAM,mBAAmB,GAAI,UAAS,cAAmB;;;;;CAc/D,CAAC;AAEF,eAAO,MAAM,UAAU,GACrB,SAAS,UAAU,EACnB,KAAK,MAAM,EACX,SAAQ,MAAa,KACpB,OAAO,CAAC,WAAW,GAAG,IAAI,CA2B5B,CAAC;AAEF,eAAO,MAAM,sBAAsB,GACjC,SAAS,UAAU,EACnB,KAAK,MAAM,EACX,iBAAiB,MAAM,EACvB,SAAQ,MAAa,KACpB,OAAO,CAAC,MAAM,CA6FhB,CAAC;AAEF,eAAO,MAAM,UAAU,GACrB,SAAS,UAAU,EACnB,cAAc,gBAAgB,KAC7B,OAAO,CAAC,WAAW,CAqCrB,CAAC;AAEF,eAAO,MAAM,aAAa,GACxB,SAAS,UAAU,EACnB,cAAc,gBAAgB,KAC7B,OAAO,CAAC,WAAW,CAmDrB,CAAC;AAEF,eAAO,MAAM,aAAa,GACxB,SAAS,UAAU,EACnB,UAAS,cAAmB,KAC3B,OAAO,CAAC,WAAW,EAAE,CAmDvB,CAAC"}
|
|
@@ -0,0 +1,240 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Copyright (c) 2025-Present, Nitrogen Labs, Inc.
|
|
3
|
+
* Copyrights licensed under the MIT License. See the accompanying LICENSE file for terms.
|
|
4
|
+
*/ import { createHash, parseString } from '@nlabs/utils/parsers/strings';
|
|
5
|
+
import { aql } from 'arangojs';
|
|
6
|
+
import { parseContentFromDb, parseContentInput } from '../adapters/contentAdapter.js';
|
|
7
|
+
import { Config } from '../config.js';
|
|
8
|
+
import { ErrorTypes } from '../types/error.types.js';
|
|
9
|
+
import { logError } from '../utils/analyticsUtils.js';
|
|
10
|
+
import { useDb } from '../utils/arangodbUtils.js';
|
|
11
|
+
import { translateText } from '../utils/googleTranslate.js';
|
|
12
|
+
import { extractLanguage, isRegionalLocale } from '../utils/localeUtils.js';
|
|
13
|
+
const eventCategory = 'content';
|
|
14
|
+
export const parseContentOptions = (options = {})=>{
|
|
15
|
+
const { category, isActive = true, key, locale } = options;
|
|
16
|
+
return {
|
|
17
|
+
category: category ? parseString(category, 100) : undefined,
|
|
18
|
+
isActive,
|
|
19
|
+
key: key ? parseString(key, 200) : undefined,
|
|
20
|
+
locale
|
|
21
|
+
};
|
|
22
|
+
};
|
|
23
|
+
export const getContent = async (context, key, locale = 'en')=>{
|
|
24
|
+
const action = 'getContent';
|
|
25
|
+
const { databaseName } = context;
|
|
26
|
+
const formatKey = parseString(key, 200);
|
|
27
|
+
const formatLocale = parseString(locale, 5);
|
|
28
|
+
const aqlQry = aql`
|
|
29
|
+
FOR c IN content
|
|
30
|
+
FILTER c.key == ${formatKey} && c.locale == ${formatLocale} && c.isActive == true
|
|
31
|
+
LIMIT 1
|
|
32
|
+
RETURN c
|
|
33
|
+
`;
|
|
34
|
+
try {
|
|
35
|
+
const content = await useDb(databaseName).query(aqlQry).then((cursor)=>cursor.next()).catch((error)=>logError({
|
|
36
|
+
action,
|
|
37
|
+
category: eventCategory,
|
|
38
|
+
label: ErrorTypes.DATABASE_ERROR
|
|
39
|
+
}, error, context));
|
|
40
|
+
return content ? parseContentFromDb(content) : null;
|
|
41
|
+
} catch (error) {
|
|
42
|
+
throw error;
|
|
43
|
+
}
|
|
44
|
+
};
|
|
45
|
+
export const getContentWithFallback = async (context, key, fallbackContent, locale = 'en')=>{
|
|
46
|
+
const appLocale = Config.get('app.locale') || 'en';
|
|
47
|
+
try {
|
|
48
|
+
let content = await getContent(context, key, locale);
|
|
49
|
+
if (content?.content) {
|
|
50
|
+
return content.content;
|
|
51
|
+
}
|
|
52
|
+
if (isRegionalLocale(locale)) {
|
|
53
|
+
const language = extractLanguage(locale);
|
|
54
|
+
content = await getContent(context, key, language);
|
|
55
|
+
if (content?.content) {
|
|
56
|
+
addContent(context, {
|
|
57
|
+
key,
|
|
58
|
+
content: content.content,
|
|
59
|
+
locale,
|
|
60
|
+
description: `Extracted from ${language}`
|
|
61
|
+
}).catch((saveError)=>{
|
|
62
|
+
console.error('Error saving extracted content:', saveError);
|
|
63
|
+
});
|
|
64
|
+
return content.content;
|
|
65
|
+
}
|
|
66
|
+
}
|
|
67
|
+
if (locale === appLocale) {
|
|
68
|
+
if (fallbackContent) {
|
|
69
|
+
addContent(context, {
|
|
70
|
+
key,
|
|
71
|
+
content: fallbackContent,
|
|
72
|
+
locale,
|
|
73
|
+
description: 'Auto-generated from fallback'
|
|
74
|
+
}).catch((saveError)=>{
|
|
75
|
+
console.error('Error saving fallback content:', saveError);
|
|
76
|
+
});
|
|
77
|
+
}
|
|
78
|
+
return fallbackContent || key;
|
|
79
|
+
}
|
|
80
|
+
try {
|
|
81
|
+
let sourceContent = await getContent(context, key, appLocale);
|
|
82
|
+
let sourceText;
|
|
83
|
+
if (sourceContent?.content) {
|
|
84
|
+
sourceText = sourceContent.content;
|
|
85
|
+
} else {
|
|
86
|
+
if (isRegionalLocale(appLocale)) {
|
|
87
|
+
const appLanguage = extractLanguage(appLocale);
|
|
88
|
+
sourceContent = await getContent(context, key, appLanguage);
|
|
89
|
+
}
|
|
90
|
+
if (sourceContent?.content) {
|
|
91
|
+
sourceText = sourceContent.content;
|
|
92
|
+
} else if (fallbackContent) {
|
|
93
|
+
sourceText = fallbackContent;
|
|
94
|
+
addContent(context, {
|
|
95
|
+
key,
|
|
96
|
+
content: fallbackContent,
|
|
97
|
+
locale: appLocale,
|
|
98
|
+
description: 'Auto-generated from fallback'
|
|
99
|
+
}).catch((saveError)=>{
|
|
100
|
+
console.error('Error saving fallback as default content:', saveError);
|
|
101
|
+
});
|
|
102
|
+
} else {
|
|
103
|
+
return key;
|
|
104
|
+
}
|
|
105
|
+
}
|
|
106
|
+
const translatedText = await translateText(sourceText, extractLanguage(locale), extractLanguage(appLocale));
|
|
107
|
+
addContent(context, {
|
|
108
|
+
key,
|
|
109
|
+
content: translatedText,
|
|
110
|
+
locale,
|
|
111
|
+
description: `Auto-translated from ${appLocale}`
|
|
112
|
+
}).catch((saveError)=>{
|
|
113
|
+
console.error('Error saving translated content:', saveError);
|
|
114
|
+
});
|
|
115
|
+
return translatedText;
|
|
116
|
+
} catch (translationError) {
|
|
117
|
+
console.error('Translation error:', translationError);
|
|
118
|
+
return fallbackContent || key;
|
|
119
|
+
}
|
|
120
|
+
} catch (error) {
|
|
121
|
+
console.error('Error fetching content from database:', error);
|
|
122
|
+
return fallbackContent || key;
|
|
123
|
+
}
|
|
124
|
+
};
|
|
125
|
+
export const addContent = async (context, contentInput)=>{
|
|
126
|
+
const action = 'addContent';
|
|
127
|
+
const { databaseName, session } = context;
|
|
128
|
+
const now = Date.now();
|
|
129
|
+
const parsedContent = parseContentInput(contentInput);
|
|
130
|
+
const { key, locale = 'en', content, description, category, isActive = true } = parsedContent;
|
|
131
|
+
const contentId = createHash(`content-${key}-${locale}`);
|
|
132
|
+
const insert = {
|
|
133
|
+
_id: `content/${contentId}`,
|
|
134
|
+
_key: contentId,
|
|
135
|
+
added: now,
|
|
136
|
+
key: parseString(key, 200),
|
|
137
|
+
locale,
|
|
138
|
+
content: parseString(content, 10000),
|
|
139
|
+
description: description ? parseString(description, 500) : undefined,
|
|
140
|
+
category: category ? parseString(category, 100) : undefined,
|
|
141
|
+
isActive,
|
|
142
|
+
modified: now,
|
|
143
|
+
userId: session?.userId
|
|
144
|
+
};
|
|
145
|
+
const aqlQry = aql`INSERT ${insert} IN content RETURN NEW`;
|
|
146
|
+
try {
|
|
147
|
+
const savedContent = await useDb(databaseName).query(aqlQry).then((cursor)=>cursor.next()).catch((error)=>logError({
|
|
148
|
+
action,
|
|
149
|
+
category: eventCategory,
|
|
150
|
+
label: ErrorTypes.DATABASE_ERROR
|
|
151
|
+
}, error, context));
|
|
152
|
+
return parseContentFromDb(savedContent);
|
|
153
|
+
} catch (error) {
|
|
154
|
+
throw error;
|
|
155
|
+
}
|
|
156
|
+
};
|
|
157
|
+
export const updateContent = async (context, contentInput)=>{
|
|
158
|
+
const action = 'updateContent';
|
|
159
|
+
const { databaseName } = context;
|
|
160
|
+
const now = Date.now();
|
|
161
|
+
const parsedContent = parseContentInput(contentInput);
|
|
162
|
+
const { contentId, content, description, category, isActive } = parsedContent;
|
|
163
|
+
if (!contentId) {
|
|
164
|
+
throw new Error('Content ID is required for update');
|
|
165
|
+
}
|
|
166
|
+
const update = {
|
|
167
|
+
content: parseString(content, 10000),
|
|
168
|
+
modified: now
|
|
169
|
+
};
|
|
170
|
+
if (description !== undefined) {
|
|
171
|
+
update.description = description ? parseString(description, 500) : undefined;
|
|
172
|
+
}
|
|
173
|
+
if (category !== undefined) {
|
|
174
|
+
update.category = category ? parseString(category, 100) : undefined;
|
|
175
|
+
}
|
|
176
|
+
if (isActive !== undefined) {
|
|
177
|
+
update.isActive = isActive;
|
|
178
|
+
}
|
|
179
|
+
const aqlQry = aql`
|
|
180
|
+
FOR c IN content
|
|
181
|
+
FILTER c._key == ${contentId}
|
|
182
|
+
UPDATE c WITH ${update} IN content
|
|
183
|
+
RETURN NEW
|
|
184
|
+
`;
|
|
185
|
+
try {
|
|
186
|
+
const updatedContent = await useDb(databaseName).query(aqlQry).then((cursor)=>cursor.next()).catch((error)=>logError({
|
|
187
|
+
action,
|
|
188
|
+
category: eventCategory,
|
|
189
|
+
label: ErrorTypes.DATABASE_ERROR
|
|
190
|
+
}, error, context));
|
|
191
|
+
if (!updatedContent) {
|
|
192
|
+
throw new Error('Content not found or access denied');
|
|
193
|
+
}
|
|
194
|
+
return parseContentFromDb(updatedContent);
|
|
195
|
+
} catch (error) {
|
|
196
|
+
throw error;
|
|
197
|
+
}
|
|
198
|
+
};
|
|
199
|
+
export const searchContent = async (context, options = {})=>{
|
|
200
|
+
const action = 'searchContent';
|
|
201
|
+
const { databaseName } = context;
|
|
202
|
+
const { category, isActive, key, locale } = parseContentOptions(options);
|
|
203
|
+
const filterConditions = [];
|
|
204
|
+
const bindVars = {};
|
|
205
|
+
if (key) {
|
|
206
|
+
filterConditions.push('c.key == @key');
|
|
207
|
+
bindVars.key = key;
|
|
208
|
+
}
|
|
209
|
+
if (locale) {
|
|
210
|
+
filterConditions.push('c.locale == @locale');
|
|
211
|
+
bindVars.locale = locale;
|
|
212
|
+
}
|
|
213
|
+
if (category) {
|
|
214
|
+
filterConditions.push('c.category == @category');
|
|
215
|
+
bindVars.category = category;
|
|
216
|
+
}
|
|
217
|
+
if (isActive !== undefined) {
|
|
218
|
+
filterConditions.push('c.isActive == @isActive');
|
|
219
|
+
bindVars.isActive = isActive;
|
|
220
|
+
}
|
|
221
|
+
const filterClause = filterConditions.length > 0 ? `FILTER ${filterConditions.join(' && ')}` : '';
|
|
222
|
+
const aqlQuery = `
|
|
223
|
+
FOR c IN content
|
|
224
|
+
${filterClause}
|
|
225
|
+
SORT c.key, c.locale
|
|
226
|
+
RETURN c
|
|
227
|
+
`;
|
|
228
|
+
try {
|
|
229
|
+
const contentList = await useDb(databaseName).query(aqlQuery, bindVars).then((cursor)=>cursor.all()).catch((error)=>logError({
|
|
230
|
+
action,
|
|
231
|
+
category: eventCategory,
|
|
232
|
+
label: ErrorTypes.DATABASE_ERROR
|
|
233
|
+
}, error, context));
|
|
234
|
+
return contentList.map((content)=>parseContentFromDb(content));
|
|
235
|
+
} catch (error) {
|
|
236
|
+
throw error;
|
|
237
|
+
}
|
|
238
|
+
};
|
|
239
|
+
|
|
240
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi9Vc2Vycy9uaXRyb2c3L0RldmVsb3BtZW50L3JlYWt0b3Ivc3JjL2FjdGlvbnMvY29udGVudC50cyJdLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIENvcHlyaWdodCAoYykgMjAyNS1QcmVzZW50LCBOaXRyb2dlbiBMYWJzLCBJbmMuXG4gKiBDb3B5cmlnaHRzIGxpY2Vuc2VkIHVuZGVyIHRoZSBNSVQgTGljZW5zZS4gU2VlIHRoZSBhY2NvbXBhbnlpbmcgTElDRU5TRSBmaWxlIGZvciB0ZXJtcy5cbiAqL1xuaW1wb3J0IHtjcmVhdGVIYXNoLCBwYXJzZVN0cmluZ30gZnJvbSAnQG5sYWJzL3V0aWxzL3BhcnNlcnMvc3RyaW5ncyc7XG5pbXBvcnQge2FxbH0gZnJvbSAnYXJhbmdvanMnO1xuaW1wb3J0IHR5cGUge0FxbFF1ZXJ5fSBmcm9tICdhcmFuZ29qcy9hcWwnO1xuXG5pbXBvcnQge3BhcnNlQ29udGVudEZyb21EYiwgcGFyc2VDb250ZW50SW5wdXR9IGZyb20gJy4uL2FkYXB0ZXJzL2NvbnRlbnRBZGFwdGVyLmpzJztcbmltcG9ydCB7Q29uZmlnfSBmcm9tICcuLi9jb25maWcuanMnO1xuaW1wb3J0IHtFcnJvclR5cGVzfSBmcm9tICcuLi90eXBlcy9lcnJvci50eXBlcy5qcyc7XG5pbXBvcnQge2xvZ0Vycm9yfSBmcm9tICcuLi91dGlscy9hbmFseXRpY3NVdGlscy5qcyc7XG5pbXBvcnQge3VzZURifSBmcm9tICcuLi91dGlscy9hcmFuZ29kYlV0aWxzLmpzJztcbmltcG9ydCB7dHJhbnNsYXRlVGV4dH0gZnJvbSAnLi4vdXRpbHMvZ29vZ2xlVHJhbnNsYXRlLmpzJztcbmltcG9ydCB7ZXh0cmFjdExhbmd1YWdlLCBpc1JlZ2lvbmFsTG9jYWxlfSBmcm9tICcuLi91dGlscy9sb2NhbGVVdGlscy5qcyc7XG5cbmltcG9ydCB0eXBlIHtBcGlDb250ZXh0fSBmcm9tICcuLi90eXBlcy9hdXRoLnR5cGVzLmpzJztcbmltcG9ydCB0eXBlIHtDb250ZW50SW5wdXRUeXBlLCBDb250ZW50T3B0aW9ucywgQ29udGVudFR5cGUsIExvY2FsZX0gZnJvbSAnLi4vdHlwZXMvY29udGVudC50eXBlcy5qcyc7XG5cbmNvbnN0IGV2ZW50Q2F0ZWdvcnk6IHN0cmluZyA9ICdjb250ZW50JztcblxuZXhwb3J0IGNvbnN0IHBhcnNlQ29udGVudE9wdGlvbnMgPSAob3B0aW9uczogQ29udGVudE9wdGlvbnMgPSB7fSkgPT4ge1xuICBjb25zdCB7XG4gICAgY2F0ZWdvcnksXG4gICAgaXNBY3RpdmUgPSB0cnVlLFxuICAgIGtleSxcbiAgICBsb2NhbGVcbiAgfSA9IG9wdGlvbnM7XG5cbiAgcmV0dXJuIHtcbiAgICBjYXRlZ29yeTogY2F0ZWdvcnkgPyBwYXJzZVN0cmluZyhjYXRlZ29yeSwgMTAwKSA6IHVuZGVmaW5lZCxcbiAgICBpc0FjdGl2ZSxcbiAgICBrZXk6IGtleSA/IHBhcnNlU3RyaW5nKGtleSwgMjAwKSA6IHVuZGVmaW5lZCxcbiAgICBsb2NhbGVcbiAgfTtcbn07XG5cbmV4cG9ydCBjb25zdCBnZXRDb250ZW50ID0gYXN5bmMgKFxuICBjb250ZXh0OiBBcGlDb250ZXh0LFxuICBrZXk6IHN0cmluZyxcbiAgbG9jYWxlOiBzdHJpbmcgPSAnZW4nXG4pOiBQcm9taXNlPENvbnRlbnRUeXBlIHwgbnVsbD4gPT4ge1xuICBjb25zdCBhY3Rpb246IHN0cmluZyA9ICdnZXRDb250ZW50JztcbiAgY29uc3Qge2RhdGFiYXNlTmFtZX0gPSBjb250ZXh0O1xuICBjb25zdCBmb3JtYXRLZXk6IHN0cmluZyA9IHBhcnNlU3RyaW5nKGtleSwgMjAwKTtcbiAgY29uc3QgZm9ybWF0TG9jYWxlOiBzdHJpbmcgPSBwYXJzZVN0cmluZyhsb2NhbGUsIDUpO1xuXG4gIGNvbnN0IGFxbFFyeTogQXFsUXVlcnkgPSBhcWxgXG4gICAgRk9SIGMgSU4gY29udGVudFxuICAgIEZJTFRFUiBjLmtleSA9PSAke2Zvcm1hdEtleX0gJiYgYy5sb2NhbGUgPT0gJHtmb3JtYXRMb2NhbGV9ICYmIGMuaXNBY3RpdmUgPT0gdHJ1ZVxuICAgIExJTUlUIDFcbiAgICBSRVRVUk4gY1xuICBgO1xuXG4gIHRyeSB7XG4gICAgY29uc3QgY29udGVudDogQ29udGVudFR5cGUgfCBudWxsID0gYXdhaXQgdXNlRGIoZGF0YWJhc2VOYW1lKVxuICAgICAgLnF1ZXJ5KGFxbFFyeSlcbiAgICAgIC50aGVuKChjdXJzb3IpID0+IGN1cnNvci5uZXh0KCkpXG4gICAgICAuY2F0Y2goKGVycm9yOiBFcnJvcikgPT4gbG9nRXJyb3Ioe1xuICAgICAgICBhY3Rpb24sXG4gICAgICAgIGNhdGVnb3J5OiBldmVudENhdGVnb3J5LFxuICAgICAgICBsYWJlbDogRXJyb3JUeXBlcy5EQVRBQkFTRV9FUlJPUlxuICAgICAgfSwgZXJyb3IsIGNvbnRleHQpKTtcblxuICAgIHJldHVybiBjb250ZW50ID8gcGFyc2VDb250ZW50RnJvbURiKGNvbnRlbnQpIDogbnVsbDtcbiAgfSBjYXRjaChlcnJvcikge1xuICAgIHRocm93IGVycm9yO1xuICB9XG59O1xuXG5leHBvcnQgY29uc3QgZ2V0Q29udGVudFdpdGhGYWxsYmFjayA9IGFzeW5jIChcbiAgY29udGV4dDogQXBpQ29udGV4dCxcbiAga2V5OiBzdHJpbmcsXG4gIGZhbGxiYWNrQ29udGVudDogc3RyaW5nLFxuICBsb2NhbGU6IExvY2FsZSA9ICdlbidcbik6IFByb21pc2U8c3RyaW5nPiA9PiB7XG4gIGNvbnN0IGFwcExvY2FsZSA9IChDb25maWcuZ2V0KCdhcHAubG9jYWxlJykgfHwgJ2VuJykgYXMgTG9jYWxlO1xuXG4gIHRyeSB7XG4gICAgbGV0IGNvbnRlbnQgPSBhd2FpdCBnZXRDb250ZW50KGNvbnRleHQsIGtleSwgbG9jYWxlKTtcblxuICAgIGlmKGNvbnRlbnQ/LmNvbnRlbnQpIHtcbiAgICAgIHJldHVybiBjb250ZW50LmNvbnRlbnQ7XG4gICAgfVxuXG4gICAgaWYoaXNSZWdpb25hbExvY2FsZShsb2NhbGUpKSB7XG4gICAgICBjb25zdCBsYW5ndWFnZSA9IGV4dHJhY3RMYW5ndWFnZShsb2NhbGUpO1xuICAgICAgY29udGVudCA9IGF3YWl0IGdldENvbnRlbnQoY29udGV4dCwga2V5LCBsYW5ndWFnZSBhcyBMb2NhbGUpO1xuXG4gICAgICBpZihjb250ZW50Py5jb250ZW50KSB7XG4gICAgICAgIGFkZENvbnRlbnQoY29udGV4dCwge1xuICAgICAgICAgIGtleSxcbiAgICAgICAgICBjb250ZW50OiBjb250ZW50LmNvbnRlbnQsXG4gICAgICAgICAgbG9jYWxlLFxuICAgICAgICAgIGRlc2NyaXB0aW9uOiBgRXh0cmFjdGVkIGZyb20gJHtsYW5ndWFnZX1gXG4gICAgICAgIH0pLmNhdGNoKChzYXZlRXJyb3IpID0+IHtcbiAgICAgICAgICBjb25zb2xlLmVycm9yKCdFcnJvciBzYXZpbmcgZXh0cmFjdGVkIGNvbnRlbnQ6Jywgc2F2ZUVycm9yKTtcbiAgICAgICAgfSk7XG5cbiAgICAgICAgcmV0dXJuIGNvbnRlbnQuY29udGVudDtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZihsb2NhbGUgPT09IGFwcExvY2FsZSkge1xuICAgICAgaWYoZmFsbGJhY2tDb250ZW50KSB7XG4gICAgICAgIGFkZENvbnRlbnQoY29udGV4dCwge1xuICAgICAgICAgIGtleSxcbiAgICAgICAgICBjb250ZW50OiBmYWxsYmFja0NvbnRlbnQsXG4gICAgICAgICAgbG9jYWxlLFxuICAgICAgICAgIGRlc2NyaXB0aW9uOiAnQXV0by1nZW5lcmF0ZWQgZnJvbSBmYWxsYmFjaydcbiAgICAgICAgfSkuY2F0Y2goKHNhdmVFcnJvcikgPT4ge1xuICAgICAgICAgIGNvbnNvbGUuZXJyb3IoJ0Vycm9yIHNhdmluZyBmYWxsYmFjayBjb250ZW50OicsIHNhdmVFcnJvcik7XG4gICAgICAgIH0pO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gZmFsbGJhY2tDb250ZW50IHx8IGtleTtcbiAgICB9XG4gICAgdHJ5IHtcbiAgICAgIGxldCBzb3VyY2VDb250ZW50ID0gYXdhaXQgZ2V0Q29udGVudChjb250ZXh0LCBrZXksIGFwcExvY2FsZSk7XG4gICAgICBsZXQgc291cmNlVGV4dDogc3RyaW5nO1xuXG4gICAgICBpZihzb3VyY2VDb250ZW50Py5jb250ZW50KSB7XG4gICAgICAgIHNvdXJjZVRleHQgPSBzb3VyY2VDb250ZW50LmNvbnRlbnQ7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBpZihpc1JlZ2lvbmFsTG9jYWxlKGFwcExvY2FsZSkpIHtcbiAgICAgICAgICBjb25zdCBhcHBMYW5ndWFnZSA9IGV4dHJhY3RMYW5ndWFnZShhcHBMb2NhbGUpO1xuICAgICAgICAgIHNvdXJjZUNvbnRlbnQgPSBhd2FpdCBnZXRDb250ZW50KGNvbnRleHQsIGtleSwgYXBwTGFuZ3VhZ2UgYXMgTG9jYWxlKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmKHNvdXJjZUNvbnRlbnQ/LmNvbnRlbnQpIHtcbiAgICAgICAgICBzb3VyY2VUZXh0ID0gc291cmNlQ29udGVudC5jb250ZW50O1xuICAgICAgICB9IGVsc2UgaWYoZmFsbGJhY2tDb250ZW50KSB7XG4gICAgICAgICAgc291cmNlVGV4dCA9IGZhbGxiYWNrQ29udGVudDtcblxuICAgICAgICAgIGFkZENvbnRlbnQoY29udGV4dCwge1xuICAgICAgICAgICAga2V5LFxuICAgICAgICAgICAgY29udGVudDogZmFsbGJhY2tDb250ZW50LFxuICAgICAgICAgICAgbG9jYWxlOiBhcHBMb2NhbGUsXG4gICAgICAgICAgICBkZXNjcmlwdGlvbjogJ0F1dG8tZ2VuZXJhdGVkIGZyb20gZmFsbGJhY2snXG4gICAgICAgICAgfSkuY2F0Y2goKHNhdmVFcnJvcikgPT4ge1xuICAgICAgICAgICAgY29uc29sZS5lcnJvcignRXJyb3Igc2F2aW5nIGZhbGxiYWNrIGFzIGRlZmF1bHQgY29udGVudDonLCBzYXZlRXJyb3IpO1xuICAgICAgICAgIH0pO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHJldHVybiBrZXk7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgY29uc3QgdHJhbnNsYXRlZFRleHQgPSBhd2FpdCB0cmFuc2xhdGVUZXh0KHNvdXJjZVRleHQsIGV4dHJhY3RMYW5ndWFnZShsb2NhbGUpLCBleHRyYWN0TGFuZ3VhZ2UoYXBwTG9jYWxlKSk7XG5cbiAgICAgIGFkZENvbnRlbnQoY29udGV4dCwge1xuICAgICAgICBrZXksXG4gICAgICAgIGNvbnRlbnQ6IHRyYW5zbGF0ZWRUZXh0LFxuICAgICAgICBsb2NhbGUsXG4gICAgICAgIGRlc2NyaXB0aW9uOiBgQXV0by10cmFuc2xhdGVkIGZyb20gJHthcHBMb2NhbGV9YFxuICAgICAgfSkuY2F0Y2goKHNhdmVFcnJvcikgPT4ge1xuICAgICAgICBjb25zb2xlLmVycm9yKCdFcnJvciBzYXZpbmcgdHJhbnNsYXRlZCBjb250ZW50OicsIHNhdmVFcnJvcik7XG4gICAgICB9KTtcblxuICAgICAgcmV0dXJuIHRyYW5zbGF0ZWRUZXh0O1xuICAgIH0gY2F0Y2godHJhbnNsYXRpb25FcnJvcikge1xuICAgICAgY29uc29sZS5lcnJvcignVHJhbnNsYXRpb24gZXJyb3I6JywgdHJhbnNsYXRpb25FcnJvcik7XG5cbiAgICAgIHJldHVybiBmYWxsYmFja0NvbnRlbnQgfHwga2V5O1xuICAgIH1cbiAgfSBjYXRjaChlcnJvcikge1xuICAgIGNvbnNvbGUuZXJyb3IoJ0Vycm9yIGZldGNoaW5nIGNvbnRlbnQgZnJvbSBkYXRhYmFzZTonLCBlcnJvcik7XG4gICAgcmV0dXJuIGZhbGxiYWNrQ29udGVudCB8fCBrZXk7XG4gIH1cbn07XG5cbmV4cG9ydCBjb25zdCBhZGRDb250ZW50ID0gYXN5bmMgKFxuICBjb250ZXh0OiBBcGlDb250ZXh0LFxuICBjb250ZW50SW5wdXQ6IENvbnRlbnRJbnB1dFR5cGVcbik6IFByb21pc2U8Q29udGVudFR5cGU+ID0+IHtcbiAgY29uc3QgYWN0aW9uOiBzdHJpbmcgPSAnYWRkQ29udGVudCc7XG4gIGNvbnN0IHtkYXRhYmFzZU5hbWUsIHNlc3Npb259ID0gY29udGV4dDtcbiAgY29uc3Qgbm93ID0gRGF0ZS5ub3coKTtcbiAgY29uc3QgcGFyc2VkQ29udGVudCA9IHBhcnNlQ29udGVudElucHV0KGNvbnRlbnRJbnB1dCk7XG4gIGNvbnN0IHtrZXksIGxvY2FsZSA9ICdlbicsIGNvbnRlbnQsIGRlc2NyaXB0aW9uLCBjYXRlZ29yeSwgaXNBY3RpdmUgPSB0cnVlfSA9IHBhcnNlZENvbnRlbnQ7XG4gIGNvbnN0IGNvbnRlbnRJZCA9IGNyZWF0ZUhhc2goYGNvbnRlbnQtJHtrZXl9LSR7bG9jYWxlfWApO1xuICBjb25zdCBpbnNlcnQ6IENvbnRlbnRUeXBlID0ge1xuICAgIF9pZDogYGNvbnRlbnQvJHtjb250ZW50SWR9YCxcbiAgICBfa2V5OiBjb250ZW50SWQsXG4gICAgYWRkZWQ6IG5vdyxcbiAgICBrZXk6IHBhcnNlU3RyaW5nKGtleSwgMjAwKSxcbiAgICBsb2NhbGUsXG4gICAgY29udGVudDogcGFyc2VTdHJpbmcoY29udGVudCwgMTAwMDApLFxuICAgIGRlc2NyaXB0aW9uOiAoZGVzY3JpcHRpb24gPyBwYXJzZVN0cmluZyhkZXNjcmlwdGlvbiwgNTAwKSA6IHVuZGVmaW5lZCkgYXMgc3RyaW5nLFxuICAgIGNhdGVnb3J5OiAoY2F0ZWdvcnkgPyBwYXJzZVN0cmluZyhjYXRlZ29yeSwgMTAwKSA6IHVuZGVmaW5lZCkgYXMgc3RyaW5nLFxuICAgIGlzQWN0aXZlLFxuICAgIG1vZGlmaWVkOiBub3csXG4gICAgdXNlcklkOiBzZXNzaW9uPy51c2VySWQgYXMgc3RyaW5nXG4gIH07XG5cbiAgY29uc3QgYXFsUXJ5OiBBcWxRdWVyeSA9IGFxbGBJTlNFUlQgJHtpbnNlcnR9IElOIGNvbnRlbnQgUkVUVVJOIE5FV2A7XG5cbiAgdHJ5IHtcbiAgICBjb25zdCBzYXZlZENvbnRlbnQ6IENvbnRlbnRUeXBlID0gYXdhaXQgdXNlRGIoZGF0YWJhc2VOYW1lKVxuICAgICAgLnF1ZXJ5KGFxbFFyeSlcbiAgICAgIC50aGVuKChjdXJzb3IpID0+IGN1cnNvci5uZXh0KCkpXG4gICAgICAuY2F0Y2goKGVycm9yOiBFcnJvcikgPT4gbG9nRXJyb3Ioe1xuICAgICAgICBhY3Rpb24sXG4gICAgICAgIGNhdGVnb3J5OiBldmVudENhdGVnb3J5LFxuICAgICAgICBsYWJlbDogRXJyb3JUeXBlcy5EQVRBQkFTRV9FUlJPUlxuICAgICAgfSwgZXJyb3IsIGNvbnRleHQpKTtcblxuICAgIHJldHVybiBwYXJzZUNvbnRlbnRGcm9tRGIoc2F2ZWRDb250ZW50KTtcbiAgfSBjYXRjaChlcnJvcikge1xuICAgIHRocm93IGVycm9yO1xuICB9XG59O1xuXG5leHBvcnQgY29uc3QgdXBkYXRlQ29udGVudCA9IGFzeW5jIChcbiAgY29udGV4dDogQXBpQ29udGV4dCxcbiAgY29udGVudElucHV0OiBDb250ZW50SW5wdXRUeXBlXG4pOiBQcm9taXNlPENvbnRlbnRUeXBlPiA9PiB7XG4gIGNvbnN0IGFjdGlvbjogc3RyaW5nID0gJ3VwZGF0ZUNvbnRlbnQnO1xuICBjb25zdCB7ZGF0YWJhc2VOYW1lfSA9IGNvbnRleHQ7XG4gIGNvbnN0IG5vdyA9IERhdGUubm93KCk7XG4gIGNvbnN0IHBhcnNlZENvbnRlbnQgPSBwYXJzZUNvbnRlbnRJbnB1dChjb250ZW50SW5wdXQpO1xuICBjb25zdCB7Y29udGVudElkLCBjb250ZW50LCBkZXNjcmlwdGlvbiwgY2F0ZWdvcnksIGlzQWN0aXZlfSA9IHBhcnNlZENvbnRlbnQ7XG5cbiAgaWYoIWNvbnRlbnRJZCkge1xuICAgIHRocm93IG5ldyBFcnJvcignQ29udGVudCBJRCBpcyByZXF1aXJlZCBmb3IgdXBkYXRlJyk7XG4gIH1cblxuICBjb25zdCB1cGRhdGU6IGFueSA9IHtcbiAgICBjb250ZW50OiBwYXJzZVN0cmluZyhjb250ZW50LCAxMDAwMCksXG4gICAgbW9kaWZpZWQ6IG5vd1xuICB9O1xuXG4gIGlmKGRlc2NyaXB0aW9uICE9PSB1bmRlZmluZWQpIHtcbiAgICB1cGRhdGUuZGVzY3JpcHRpb24gPSBkZXNjcmlwdGlvbiA/IHBhcnNlU3RyaW5nKGRlc2NyaXB0aW9uLCA1MDApIDogdW5kZWZpbmVkO1xuICB9XG4gIGlmKGNhdGVnb3J5ICE9PSB1bmRlZmluZWQpIHtcbiAgICB1cGRhdGUuY2F0ZWdvcnkgPSBjYXRlZ29yeSA/IHBhcnNlU3RyaW5nKGNhdGVnb3J5LCAxMDApIDogdW5kZWZpbmVkO1xuICB9XG4gIGlmKGlzQWN0aXZlICE9PSB1bmRlZmluZWQpIHtcbiAgICB1cGRhdGUuaXNBY3RpdmUgPSBpc0FjdGl2ZTtcbiAgfVxuXG4gIGNvbnN0IGFxbFFyeTogQXFsUXVlcnkgPSBhcWxgXG4gICAgRk9SIGMgSU4gY29udGVudFxuICAgIEZJTFRFUiBjLl9rZXkgPT0gJHtjb250ZW50SWR9XG4gICAgVVBEQVRFIGMgV0lUSCAke3VwZGF0ZX0gSU4gY29udGVudFxuICAgIFJFVFVSTiBORVdcbiAgYDtcblxuICB0cnkge1xuICAgIGNvbnN0IHVwZGF0ZWRDb250ZW50OiBDb250ZW50VHlwZSA9IGF3YWl0IHVzZURiKGRhdGFiYXNlTmFtZSlcbiAgICAgIC5xdWVyeShhcWxRcnkpXG4gICAgICAudGhlbigoY3Vyc29yKSA9PiBjdXJzb3IubmV4dCgpKVxuICAgICAgLmNhdGNoKChlcnJvcjogRXJyb3IpID0+IGxvZ0Vycm9yKHtcbiAgICAgICAgYWN0aW9uLFxuICAgICAgICBjYXRlZ29yeTogZXZlbnRDYXRlZ29yeSxcbiAgICAgICAgbGFiZWw6IEVycm9yVHlwZXMuREFUQUJBU0VfRVJST1JcbiAgICAgIH0sIGVycm9yLCBjb250ZXh0KSk7XG5cbiAgICBpZighdXBkYXRlZENvbnRlbnQpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignQ29udGVudCBub3QgZm91bmQgb3IgYWNjZXNzIGRlbmllZCcpO1xuICAgIH1cblxuICAgIHJldHVybiBwYXJzZUNvbnRlbnRGcm9tRGIodXBkYXRlZENvbnRlbnQpO1xuICB9IGNhdGNoKGVycm9yKSB7XG4gICAgdGhyb3cgZXJyb3I7XG4gIH1cbn07XG5cbmV4cG9ydCBjb25zdCBzZWFyY2hDb250ZW50ID0gYXN5bmMgKFxuICBjb250ZXh0OiBBcGlDb250ZXh0LFxuICBvcHRpb25zOiBDb250ZW50T3B0aW9ucyA9IHt9XG4pOiBQcm9taXNlPENvbnRlbnRUeXBlW10+ID0+IHtcbiAgY29uc3QgYWN0aW9uOiBzdHJpbmcgPSAnc2VhcmNoQ29udGVudCc7XG4gIGNvbnN0IHtkYXRhYmFzZU5hbWV9ID0gY29udGV4dDtcbiAgY29uc3Qge2NhdGVnb3J5LCBpc0FjdGl2ZSwga2V5LCBsb2NhbGV9ID0gcGFyc2VDb250ZW50T3B0aW9ucyhvcHRpb25zKTtcblxuICBjb25zdCBmaWx0ZXJDb25kaXRpb25zOiBzdHJpbmdbXSA9IFtdO1xuICBjb25zdCBiaW5kVmFyczogUmVjb3JkPHN0cmluZywgYW55PiA9IHt9O1xuXG4gIGlmKGtleSkge1xuICAgIGZpbHRlckNvbmRpdGlvbnMucHVzaCgnYy5rZXkgPT0gQGtleScpO1xuICAgIGJpbmRWYXJzLmtleSA9IGtleTtcbiAgfVxuXG4gIGlmKGxvY2FsZSkge1xuICAgIGZpbHRlckNvbmRpdGlvbnMucHVzaCgnYy5sb2NhbGUgPT0gQGxvY2FsZScpO1xuICAgIGJpbmRWYXJzLmxvY2FsZSA9IGxvY2FsZTtcbiAgfVxuXG4gIGlmKGNhdGVnb3J5KSB7XG4gICAgZmlsdGVyQ29uZGl0aW9ucy5wdXNoKCdjLmNhdGVnb3J5ID09IEBjYXRlZ29yeScpO1xuICAgIGJpbmRWYXJzLmNhdGVnb3J5ID0gY2F0ZWdvcnk7XG4gIH1cblxuICBpZihpc0FjdGl2ZSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgZmlsdGVyQ29uZGl0aW9ucy5wdXNoKCdjLmlzQWN0aXZlID09IEBpc0FjdGl2ZScpO1xuICAgIGJpbmRWYXJzLmlzQWN0aXZlID0gaXNBY3RpdmU7XG4gIH1cblxuICBjb25zdCBmaWx0ZXJDbGF1c2UgPSBmaWx0ZXJDb25kaXRpb25zLmxlbmd0aCA+IDAgPyBgRklMVEVSICR7ZmlsdGVyQ29uZGl0aW9ucy5qb2luKCcgJiYgJyl9YCA6ICcnO1xuXG4gIGNvbnN0IGFxbFF1ZXJ5ID0gYFxuICAgIEZPUiBjIElOIGNvbnRlbnRcbiAgICAke2ZpbHRlckNsYXVzZX1cbiAgICBTT1JUIGMua2V5LCBjLmxvY2FsZVxuICAgIFJFVFVSTiBjXG4gIGA7XG5cbiAgdHJ5IHtcbiAgICBjb25zdCBjb250ZW50TGlzdCA9IGF3YWl0IHVzZURiKGRhdGFiYXNlTmFtZSlcbiAgICAgIC5xdWVyeShhcWxRdWVyeSwgYmluZFZhcnMpXG4gICAgICAudGhlbigoY3Vyc29yKSA9PiBjdXJzb3IuYWxsKCkpXG4gICAgICAuY2F0Y2goKGVycm9yOiBFcnJvcikgPT4gbG9nRXJyb3Ioe1xuICAgICAgICBhY3Rpb24sXG4gICAgICAgIGNhdGVnb3J5OiBldmVudENhdGVnb3J5LFxuICAgICAgICBsYWJlbDogRXJyb3JUeXBlcy5EQVRBQkFTRV9FUlJPUlxuICAgICAgfSwgZXJyb3IsIGNvbnRleHQpKTtcblxuICAgIHJldHVybiAoY29udGVudExpc3QgYXMgQ29udGVudFR5cGVbXSkubWFwKChjb250ZW50KSA9PiBwYXJzZUNvbnRlbnRGcm9tRGIoY29udGVudCkpO1xuICB9IGNhdGNoKGVycm9yKSB7XG4gICAgdGhyb3cgZXJyb3I7XG4gIH1cbn07Il0sIm5hbWVzIjpbImNyZWF0ZUhhc2giLCJwYXJzZVN0cmluZyIsImFxbCIsInBhcnNlQ29udGVudEZyb21EYiIsInBhcnNlQ29udGVudElucHV0IiwiQ29uZmlnIiwiRXJyb3JUeXBlcyIsImxvZ0Vycm9yIiwidXNlRGIiLCJ0cmFuc2xhdGVUZXh0IiwiZXh0cmFjdExhbmd1YWdlIiwiaXNSZWdpb25hbExvY2FsZSIsImV2ZW50Q2F0ZWdvcnkiLCJwYXJzZUNvbnRlbnRPcHRpb25zIiwib3B0aW9ucyIsImNhdGVnb3J5IiwiaXNBY3RpdmUiLCJrZXkiLCJsb2NhbGUiLCJ1bmRlZmluZWQiLCJnZXRDb250ZW50IiwiY29udGV4dCIsImFjdGlvbiIsImRhdGFiYXNlTmFtZSIsImZvcm1hdEtleSIsImZvcm1hdExvY2FsZSIsImFxbFFyeSIsImNvbnRlbnQiLCJxdWVyeSIsInRoZW4iLCJjdXJzb3IiLCJuZXh0IiwiY2F0Y2giLCJlcnJvciIsImxhYmVsIiwiREFUQUJBU0VfRVJST1IiLCJnZXRDb250ZW50V2l0aEZhbGxiYWNrIiwiZmFsbGJhY2tDb250ZW50IiwiYXBwTG9jYWxlIiwiZ2V0IiwibGFuZ3VhZ2UiLCJhZGRDb250ZW50IiwiZGVzY3JpcHRpb24iLCJzYXZlRXJyb3IiLCJjb25zb2xlIiwic291cmNlQ29udGVudCIsInNvdXJjZVRleHQiLCJhcHBMYW5ndWFnZSIsInRyYW5zbGF0ZWRUZXh0IiwidHJhbnNsYXRpb25FcnJvciIsImNvbnRlbnRJbnB1dCIsInNlc3Npb24iLCJub3ciLCJEYXRlIiwicGFyc2VkQ29udGVudCIsImNvbnRlbnRJZCIsImluc2VydCIsIl9pZCIsIl9rZXkiLCJhZGRlZCIsIm1vZGlmaWVkIiwidXNlcklkIiwic2F2ZWRDb250ZW50IiwidXBkYXRlQ29udGVudCIsIkVycm9yIiwidXBkYXRlIiwidXBkYXRlZENvbnRlbnQiLCJzZWFyY2hDb250ZW50IiwiZmlsdGVyQ29uZGl0aW9ucyIsImJpbmRWYXJzIiwicHVzaCIsImZpbHRlckNsYXVzZSIsImxlbmd0aCIsImpvaW4iLCJhcWxRdWVyeSIsImNvbnRlbnRMaXN0IiwiYWxsIiwibWFwIl0sIm1hcHBpbmdzIjoiQUFBQTs7O0NBR0MsR0FDRCxTQUFRQSxVQUFVLEVBQUVDLFdBQVcsUUFBTywrQkFBK0I7QUFDckUsU0FBUUMsR0FBRyxRQUFPLFdBQVc7QUFHN0IsU0FBUUMsa0JBQWtCLEVBQUVDLGlCQUFpQixRQUFPLGdDQUFnQztBQUNwRixTQUFRQyxNQUFNLFFBQU8sZUFBZTtBQUNwQyxTQUFRQyxVQUFVLFFBQU8sMEJBQTBCO0FBQ25ELFNBQVFDLFFBQVEsUUFBTyw2QkFBNkI7QUFDcEQsU0FBUUMsS0FBSyxRQUFPLDRCQUE0QjtBQUNoRCxTQUFRQyxhQUFhLFFBQU8sOEJBQThCO0FBQzFELFNBQVFDLGVBQWUsRUFBRUMsZ0JBQWdCLFFBQU8sMEJBQTBCO0FBSzFF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
|