From bce9141d057c449390fafeee224d87a1cb0d47d5 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Tayfun=20Y=C4=B1lmaz?= Date: Tue, 16 Dec 2025 00:36:28 +0300 Subject: [PATCH] Add contract and task-test workflows with tasks Introduces new contract approval and document subflow workflows, including associated tasks and C# mapping scripts. Adds test workflows and tasks for Dapr, HTTP, and workflow communication. Updates account opening workflow state types and minor config fixes. Removes obsolete OAuth workflow scripts and adds .gitignore entry for ai-docs/. --- .gitignore | 5 +- .../extension-user-session.json | 4 +- .../get-data-from-workflow.json | 3 +- .../trigger-scheduled-payments.json | 2 +- .../contract/get-contract-documents.json | 27 + .../contract/notify-document-approved.json | 23 + .../Tasks/contract/notify-document-ready.json | 23 + core/Tasks/contract/render-document.json | 27 + .../contract/start-document-subprocess.json | 22 + core/Tasks/task-test/test-dapr-pubsub.json | 27 + .../task-test/test-dapr-service-task.json | 24 + .../task-test/test-direct-transition.json | 23 + .../task-test/test-get-instance-data.json | 22 + core/Tasks/task-test/test-http-items.json | 27 + core/Tasks/task-test/test-http-task.json | 27 + core/Tasks/task-test/test-start-workflow.json | 22 + core/Tasks/task-test/test-subprocess.json | 23 + .../account-opening-workflow.diagram.json | 36 + .../account-opening-workflow.http | 209 +++++ .../account-opening-workflow.json | 4 +- .../contract-approval-workflow.diagram.json | 40 + .../contract-document-subflow.diagram.json | 40 + .../contract/contract-approval-workflow.http | 188 ++++ .../contract/contract-approval-workflow.json | 525 +++++++++++ .../contract/contract-document-subflow.json | 455 ++++++++++ .../contract/src/AllApprovedRule.csx | 25 + .../contract/src/AllDocumentsReadyRule.csx | 25 + .../Workflows/contract/src/AlwaysTrueRule.csx | 14 + .../contract/src/DocumentsLoadedRule.csx | 22 + .../src/GetContractDocumentsMapping.csx | 124 +++ .../contract/src/HasMoreDocumentsRule.csx | 25 + .../src/IncrementApprovedCountMapping.csx | 47 + .../src/IncrementReadyCountMapping.csx | 47 + .../src/InitContractApprovalMapping.csx | 52 ++ .../contract/src/InitDocumentMapping.csx | 50 ++ .../contract/src/MoreApprovalsPendingRule.csx | 25 + .../contract/src/NoDocumentsRule.csx | 22 + .../src/NotifyDocumentApprovedMapping.csx | 108 +++ .../src/NotifyDocumentReadyMapping.csx | 109 +++ .../src/NotifyDocumentRejectedMapping.csx | 109 +++ .../contract/src/RenderDocumentMapping.csx | 118 +++ .../contract/src/RenderFailedRule.csx | 22 + .../contract/src/RenderSuccessRule.csx | 22 + .../src/StartDocumentSubprocessMapping.csx | 149 ++++ .../oauth/oauth-authentication-workflow.http | 120 +++ core/Workflows/oauth/src/PushDeniedRule.csx | 11 - .../oauth/src/PushPendingContinueRule.csx | 11 - .../payment-notification-subflow.diagram.json | 20 + .../payment-notification-subflow.json | 2 +- .../payments/scheduled-payments-workflow.http | 157 ++++ .../.meta/task-test-subflow.diagram.json | 16 + .../.meta/task-test-workflow.diagram.json | 60 ++ .../task-test/src/AlwaysTrueRule.csx | 14 + .../task-test/src/DaprPubSubMapping.csx | 126 +++ .../task-test/src/DaprServiceTaskMapping.csx | 119 +++ .../task-test/src/DirectTransitionMapping.csx | 119 +++ .../task-test/src/GetConfigValueMapping.csx | 94 ++ .../task-test/src/GetInstanceDataMapping.csx | 108 +++ .../task-test/src/GetSecretAsyncMapping.csx | 94 ++ .../task-test/src/HttpTaskItemsMapping.csx | 119 +++ .../task-test/src/HttpTaskMapping.csx | 119 +++ .../src/InitialTransitionMapping.csx | 59 ++ .../task-test/src/ScriptTaskMapping.csx | 94 ++ .../task-test/src/StartWorkflowMapping.csx | 115 +++ .../task-test/src/SubProcessMapping.csx | 113 +++ .../src/TaskResponseUsageMapping.csx | 154 ++++ .../task-test/task-test-subflow.json | 113 +++ .../task-test/task-test-workflow.http | 149 ++++ .../task-test/task-test-workflow.json | 828 ++++++++++++++++++ mockoon/migration-api.json | 90 +- mockoon/upload-to-mockoon.sh | 69 -- ...xt Example Runtime.postman_collection.json | 606 ++++++++++++- 72 files changed, 6511 insertions(+), 131 deletions(-) create mode 100644 core/Tasks/contract/get-contract-documents.json create mode 100644 core/Tasks/contract/notify-document-approved.json create mode 100644 core/Tasks/contract/notify-document-ready.json create mode 100644 core/Tasks/contract/render-document.json create mode 100644 core/Tasks/contract/start-document-subprocess.json create mode 100644 core/Tasks/task-test/test-dapr-pubsub.json create mode 100644 core/Tasks/task-test/test-dapr-service-task.json create mode 100644 core/Tasks/task-test/test-direct-transition.json create mode 100644 core/Tasks/task-test/test-get-instance-data.json create mode 100644 core/Tasks/task-test/test-http-items.json create mode 100644 core/Tasks/task-test/test-http-task.json create mode 100644 core/Tasks/task-test/test-start-workflow.json create mode 100644 core/Tasks/task-test/test-subprocess.json create mode 100644 core/Workflows/account-opening/.meta/account-opening-workflow.diagram.json create mode 100644 core/Workflows/account-opening/account-opening-workflow.http create mode 100644 core/Workflows/contract/.meta/contract-approval-workflow.diagram.json create mode 100644 core/Workflows/contract/.meta/contract-document-subflow.diagram.json create mode 100644 core/Workflows/contract/contract-approval-workflow.http create mode 100644 core/Workflows/contract/contract-approval-workflow.json create mode 100644 core/Workflows/contract/contract-document-subflow.json create mode 100644 core/Workflows/contract/src/AllApprovedRule.csx create mode 100644 core/Workflows/contract/src/AllDocumentsReadyRule.csx create mode 100644 core/Workflows/contract/src/AlwaysTrueRule.csx create mode 100644 core/Workflows/contract/src/DocumentsLoadedRule.csx create mode 100644 core/Workflows/contract/src/GetContractDocumentsMapping.csx create mode 100644 core/Workflows/contract/src/HasMoreDocumentsRule.csx create mode 100644 core/Workflows/contract/src/IncrementApprovedCountMapping.csx create mode 100644 core/Workflows/contract/src/IncrementReadyCountMapping.csx create mode 100644 core/Workflows/contract/src/InitContractApprovalMapping.csx create mode 100644 core/Workflows/contract/src/InitDocumentMapping.csx create mode 100644 core/Workflows/contract/src/MoreApprovalsPendingRule.csx create mode 100644 core/Workflows/contract/src/NoDocumentsRule.csx create mode 100644 core/Workflows/contract/src/NotifyDocumentApprovedMapping.csx create mode 100644 core/Workflows/contract/src/NotifyDocumentReadyMapping.csx create mode 100644 core/Workflows/contract/src/NotifyDocumentRejectedMapping.csx create mode 100644 core/Workflows/contract/src/RenderDocumentMapping.csx create mode 100644 core/Workflows/contract/src/RenderFailedRule.csx create mode 100644 core/Workflows/contract/src/RenderSuccessRule.csx create mode 100644 core/Workflows/contract/src/StartDocumentSubprocessMapping.csx create mode 100644 core/Workflows/oauth/oauth-authentication-workflow.http delete mode 100644 core/Workflows/oauth/src/PushDeniedRule.csx delete mode 100644 core/Workflows/oauth/src/PushPendingContinueRule.csx create mode 100644 core/Workflows/payments/.meta/payment-notification-subflow.diagram.json create mode 100644 core/Workflows/payments/scheduled-payments-workflow.http create mode 100644 core/Workflows/task-test/.meta/task-test-subflow.diagram.json create mode 100644 core/Workflows/task-test/.meta/task-test-workflow.diagram.json create mode 100644 core/Workflows/task-test/src/AlwaysTrueRule.csx create mode 100644 core/Workflows/task-test/src/DaprPubSubMapping.csx create mode 100644 core/Workflows/task-test/src/DaprServiceTaskMapping.csx create mode 100644 core/Workflows/task-test/src/DirectTransitionMapping.csx create mode 100644 core/Workflows/task-test/src/GetConfigValueMapping.csx create mode 100644 core/Workflows/task-test/src/GetInstanceDataMapping.csx create mode 100644 core/Workflows/task-test/src/GetSecretAsyncMapping.csx create mode 100644 core/Workflows/task-test/src/HttpTaskItemsMapping.csx create mode 100644 core/Workflows/task-test/src/HttpTaskMapping.csx create mode 100644 core/Workflows/task-test/src/InitialTransitionMapping.csx create mode 100644 core/Workflows/task-test/src/ScriptTaskMapping.csx create mode 100644 core/Workflows/task-test/src/StartWorkflowMapping.csx create mode 100644 core/Workflows/task-test/src/SubProcessMapping.csx create mode 100644 core/Workflows/task-test/src/TaskResponseUsageMapping.csx create mode 100644 core/Workflows/task-test/task-test-subflow.json create mode 100644 core/Workflows/task-test/task-test-workflow.http create mode 100644 core/Workflows/task-test/task-test-workflow.json delete mode 100755 mockoon/upload-to-mockoon.sh diff --git a/.gitignore b/.gitignore index d8401e7..cdac152 100644 --- a/.gitignore +++ b/.gitignore @@ -268,4 +268,7 @@ profile-* # Security .npmrc.local auth.json -secrets.json \ No newline at end of file +secrets.json + +# AI folders +ai-docs/ \ No newline at end of file diff --git a/core/Extensions/account-opening/extension-user-session.json b/core/Extensions/account-opening/extension-user-session.json index ce26f42..746cb0c 100644 --- a/core/Extensions/account-opening/extension-user-session.json +++ b/core/Extensions/account-opening/extension-user-session.json @@ -1,8 +1,8 @@ { "key": "extension-user-session", - "flow": "sys-extensions", - "domain": "core", "version": "1.0.0", + "domain": "core", + "flow": "sys-extensions", "flowVersion": "1.0.0", "tags": [ "system", diff --git a/core/Tasks/account-opening/get-data-from-workflow.json b/core/Tasks/account-opening/get-data-from-workflow.json index 59e3a06..f5ebe0e 100644 --- a/core/Tasks/account-opening/get-data-from-workflow.json +++ b/core/Tasks/account-opening/get-data-from-workflow.json @@ -14,8 +14,7 @@ "type": "13", "config": { "domain": "core", - "flow": "account-opening", - "instanceId": "" + "flow": "account-opening" } } } \ No newline at end of file diff --git a/core/Tasks/account-opening/trigger-scheduled-payments.json b/core/Tasks/account-opening/trigger-scheduled-payments.json index 946c54c..a8b6040 100644 --- a/core/Tasks/account-opening/trigger-scheduled-payments.json +++ b/core/Tasks/account-opening/trigger-scheduled-payments.json @@ -14,7 +14,7 @@ "type": "14", "config": { "domain": "core", - "key": "scheduled-payments", + "flow": "scheduled-payments", "version": "1.0.0" } } diff --git a/core/Tasks/contract/get-contract-documents.json b/core/Tasks/contract/get-contract-documents.json new file mode 100644 index 0000000..6af2cec --- /dev/null +++ b/core/Tasks/contract/get-contract-documents.json @@ -0,0 +1,27 @@ +{ + "key": "get-contract-documents", + "version": "1.0.0", + "domain": "core", + "flow": "sys-tasks", + "flowVersion": "1.0.0", + "tags": [ + "contract", + "documents", + "http", + "get-list" + ], + "attributes": { + "type": "6", + "config": { + "url": "http://localhost:3001/api/contract/get-documents", + "method": "POST", + "headers": { + "Content-Type": "application/json" + }, + "body": {}, + "timeoutSeconds": 30, + "validateSsl": true + } + } +} + diff --git a/core/Tasks/contract/notify-document-approved.json b/core/Tasks/contract/notify-document-approved.json new file mode 100644 index 0000000..3a945c2 --- /dev/null +++ b/core/Tasks/contract/notify-document-approved.json @@ -0,0 +1,23 @@ +{ + "key": "notify-document-approved", + "version": "1.0.0", + "domain": "core", + "flow": "sys-tasks", + "flowVersion": "1.0.0", + "tags": [ + "contract", + "notification", + "direct-trigger", + "document-approved" + ], + "attributes": { + "type": "12", + "config": { + "domain": "core", + "flow": "contract-approval-workflow", + "transitionName": "document-approved", + "body": {} + } + } +} + diff --git a/core/Tasks/contract/notify-document-ready.json b/core/Tasks/contract/notify-document-ready.json new file mode 100644 index 0000000..2d66498 --- /dev/null +++ b/core/Tasks/contract/notify-document-ready.json @@ -0,0 +1,23 @@ +{ + "key": "notify-document-ready", + "version": "1.0.0", + "domain": "core", + "flow": "sys-tasks", + "flowVersion": "1.0.0", + "tags": [ + "contract", + "notification", + "direct-trigger", + "document-ready" + ], + "attributes": { + "type": "12", + "config": { + "domain": "core", + "flow": "contract-approval-workflow", + "transitionName": "document-ready", + "body": {} + } + } +} + diff --git a/core/Tasks/contract/render-document.json b/core/Tasks/contract/render-document.json new file mode 100644 index 0000000..1ca4f4c --- /dev/null +++ b/core/Tasks/contract/render-document.json @@ -0,0 +1,27 @@ +{ + "key": "render-document", + "version": "1.0.0", + "domain": "core", + "flow": "sys-tasks", + "flowVersion": "1.0.0", + "tags": [ + "contract", + "document", + "render", + "http" + ], + "attributes": { + "type": "6", + "config": { + "url": "http://localhost:3001/api/contract/render-document", + "method": "POST", + "headers": { + "Content-Type": "application/json" + }, + "body": {}, + "timeoutSeconds": 30, + "validateSsl": true + } + } +} + diff --git a/core/Tasks/contract/start-document-subprocess.json b/core/Tasks/contract/start-document-subprocess.json new file mode 100644 index 0000000..b1de5d3 --- /dev/null +++ b/core/Tasks/contract/start-document-subprocess.json @@ -0,0 +1,22 @@ +{ + "key": "start-document-subprocess", + "version": "1.0.0", + "domain": "core", + "flow": "sys-tasks", + "flowVersion": "1.0.0", + "tags": [ + "contract", + "subprocess", + "start", + "document-process" + ], + "attributes": { + "type": "14", + "config": { + "domain": "core", + "flow": "contract-document-subflow", + "body": {} + } + } +} + diff --git a/core/Tasks/task-test/test-dapr-pubsub.json b/core/Tasks/task-test/test-dapr-pubsub.json new file mode 100644 index 0000000..5a67392 --- /dev/null +++ b/core/Tasks/task-test/test-dapr-pubsub.json @@ -0,0 +1,27 @@ +{ + "key": "test-dapr-pubsub", + "version": "1.0.0", + "domain": "core", + "flow": "sys-tasks", + "flowVersion": "1.0.0", + "tags": [ + "task-test", + "dapr", + "pubsub", + "messaging", + "event" + ], + "attributes": { + "type": "4", + "config": { + "pubSubName": "vnext-execution-pubsub", + "topic": "vnext.test.events", + "data": {}, + "metadata": { + "priority": "normal", + "source": "task-test-workflow" + } + } + } +} + diff --git a/core/Tasks/task-test/test-dapr-service-task.json b/core/Tasks/task-test/test-dapr-service-task.json new file mode 100644 index 0000000..1a02f7f --- /dev/null +++ b/core/Tasks/task-test/test-dapr-service-task.json @@ -0,0 +1,24 @@ +{ + "key": "test-dapr-service-task", + "version": "1.0.0", + "domain": "core", + "flow": "sys-tasks", + "flowVersion": "1.0.0", + "tags": [ + "task-test", + "dapr", + "service-invocation", + "microservice" + ], + "attributes": { + "type": "3", + "config": { + "appId": "mockoon", + "methodName": "/api/api/task-test/dapr-endpoint", + "httpVerb": "POST", + "queryString": "", + "timeoutSeconds": 30 + } + } +} + diff --git a/core/Tasks/task-test/test-direct-transition.json b/core/Tasks/task-test/test-direct-transition.json new file mode 100644 index 0000000..bd44b39 --- /dev/null +++ b/core/Tasks/task-test/test-direct-transition.json @@ -0,0 +1,23 @@ +{ + "key": "test-direct-transition", + "version": "1.0.0", + "domain": "core", + "flow": "sys-tasks", + "flowVersion": "1.0.0", + "tags": [ + "task-test", + "direct-trigger", + "transition", + "workflow-communication" + ], + "attributes": { + "type": "12", + "config": { + "domain": "core", + "flow": "task-test-subflow", + "transitionName": "complete-subflow", + "body": {} + } + } +} + diff --git a/core/Tasks/task-test/test-get-instance-data.json b/core/Tasks/task-test/test-get-instance-data.json new file mode 100644 index 0000000..d6e5be6 --- /dev/null +++ b/core/Tasks/task-test/test-get-instance-data.json @@ -0,0 +1,22 @@ +{ + "key": "test-get-instance-data", + "version": "1.0.0", + "domain": "core", + "flow": "sys-tasks", + "flowVersion": "1.0.0", + "tags": [ + "task-test", + "instance-data", + "workflow-communication", + "data-fetch" + ], + "attributes": { + "type": "13", + "config": { + "domain": "core", + "flow": "task-test-subflow", + "extensions": [] + } + } +} + diff --git a/core/Tasks/task-test/test-http-items.json b/core/Tasks/task-test/test-http-items.json new file mode 100644 index 0000000..7cb237d --- /dev/null +++ b/core/Tasks/task-test/test-http-items.json @@ -0,0 +1,27 @@ +{ + "key": "test-http-items", + "version": "1.0.0", + "domain": "core", + "flow": "sys-tasks", + "flowVersion": "1.0.0", + "tags": [ + "task-test", + "http", + "api", + "external-service" + ], + "attributes": { + "type": "6", + "config": { + "url": "http://localhost:3001/api/task-test/list-items", + "method": "POST", + "headers": { + "Content-Type": "application/json" + }, + "body": {}, + "timeoutSeconds": 30, + "validateSsl": false + } + } +} + diff --git a/core/Tasks/task-test/test-http-task.json b/core/Tasks/task-test/test-http-task.json new file mode 100644 index 0000000..2b3977c --- /dev/null +++ b/core/Tasks/task-test/test-http-task.json @@ -0,0 +1,27 @@ +{ + "key": "test-http-task", + "version": "1.0.0", + "domain": "core", + "flow": "sys-tasks", + "flowVersion": "1.0.0", + "tags": [ + "task-test", + "http", + "api", + "external-service" + ], + "attributes": { + "type": "6", + "config": { + "url": "http://localhost:3001/api/task-test/http-endpoint", + "method": "POST", + "headers": { + "Content-Type": "application/json" + }, + "body": {}, + "timeoutSeconds": 30, + "validateSsl": false + } + } +} + diff --git a/core/Tasks/task-test/test-start-workflow.json b/core/Tasks/task-test/test-start-workflow.json new file mode 100644 index 0000000..b4c6348 --- /dev/null +++ b/core/Tasks/task-test/test-start-workflow.json @@ -0,0 +1,22 @@ +{ + "key": "test-start-workflow", + "version": "1.0.0", + "domain": "core", + "flow": "sys-tasks", + "flowVersion": "1.0.0", + "tags": [ + "task-test", + "start", + "workflow-initiation", + "new-instance" + ], + "attributes": { + "type": "11", + "config": { + "domain": "core", + "flow": "task-test-subflow", + "body": {} + } + } +} + diff --git a/core/Tasks/task-test/test-subprocess.json b/core/Tasks/task-test/test-subprocess.json new file mode 100644 index 0000000..d1de4cc --- /dev/null +++ b/core/Tasks/task-test/test-subprocess.json @@ -0,0 +1,23 @@ +{ + "key": "test-subprocess", + "version": "1.0.0", + "domain": "core", + "flow": "sys-tasks", + "flowVersion": "1.0.0", + "tags": [ + "task-test", + "subprocess", + "fire-and-forget", + "background-task" + ], + "attributes": { + "type": "14", + "config": { + "domain": "core", + "flow": "task-test-subflow", + "version": "1.0.0", + "body": {} + } + } +} + diff --git a/core/Workflows/account-opening/.meta/account-opening-workflow.diagram.json b/core/Workflows/account-opening/.meta/account-opening-workflow.diagram.json new file mode 100644 index 0000000..7ad6d7f --- /dev/null +++ b/core/Workflows/account-opening/.meta/account-opening-workflow.diagram.json @@ -0,0 +1,36 @@ +{ + "nodePos": { + "account-type-selection": { + "x": 556, + "y": 480.5 + }, + "account-details-input": { + "x": 1080, + "y": 400 + }, + "account-confirmation": { + "x": 1565, + "y": 400 + }, + "policy-validation": { + "x": 331, + "y": 240 + }, + "account-creation": { + "x": 780, + "y": 200 + }, + "account-opening-success": { + "x": 1220, + "y": 200 + }, + "cancelled": { + "x": 100, + "y": 100 + }, + "__start__": { + "x": 130, + "y": 480.5 + } + } +} \ No newline at end of file diff --git a/core/Workflows/account-opening/account-opening-workflow.http b/core/Workflows/account-opening/account-opening-workflow.http new file mode 100644 index 0000000..88259b4 --- /dev/null +++ b/core/Workflows/account-opening/account-opening-workflow.http @@ -0,0 +1,209 @@ +############################################################################### +# Account Opening Workflow - HTTP Test File +# +# This file tests the account-opening workflow which handles: +# - Account type selection (demand deposit, time deposit, etc.) +# - Account details input and validation +# - Policy validation +# - Account creation confirmation +# - Bank account creation via external API +# +# Prerequisites: +# 1. vNext Runtime running on localhost:4201 +# 2. Mockoon running on localhost:3001 +############################################################################### + +@baseUrl = http://localhost:4201 +@apiVersion = 1 +@domain = core +@workflow = account-opening +@instanceKey = account-{{$timestamp}} + +############################################################################### +# Step 1: Start Account Opening Workflow +# Initiates the account opening flow with session information +############################################################################### + +### Start Account Opening Instance +# @name startAccountOpening +POST {{baseUrl}}/api/v{{apiVersion}}/{{domain}}/workflows/{{workflow}}/instances/start?sync=true +Content-Type: application/json +Accept-Language: tr-TR +X-Request-Id: {{$guid}} +X-Device-Id: {{$guid}} +X-Token-Id: {{$guid}} +X-Device-Info: IOS 16 +X-Forwarded-For: 192.168.2.1 +user_reference: 34987491018 + +{ + "key": "{{instanceKey}}", + "tags": [ + "test", + "banking", + "account-opening" + ], + "attributes": { + "session": "session-{{$timestamp}}" + } +} + +############################################################################### +# Step 2: Get Current State +# Check the current state after workflow start +############################################################################### + +### Get Current State +GET {{baseUrl}}/api/v{{apiVersion}}/{{domain}}/workflows/{{workflow}}/instances/{{instanceKey}}/functions/state +Accept: application/json + +############################################################################### +# Step 3: Get Current View +# Retrieve the UI view definition for current state +############################################################################### + +### Get Current View +GET {{baseUrl}}/api/v{{apiVersion}}/{{domain}}/workflows/{{workflow}}/instances/{{instanceKey}}/functions/view +Accept: application/json + +### Get Transition Schema +GET {{baseUrl}}/api/v{{apiVersion}}/{{domain}}/workflows/{{workflow}}/instances/{{instanceKey}}/functions/schema?transitionKey=select-demand-deposit +Accept: application/json + +############################################################################### +# Step 4: Select Account Type - Demand Deposit +# User selects the type of account to open +############################################################################### + +### Select Demand Deposit Account +# @name selectDemandDeposit +PATCH {{baseUrl}}/api/v{{apiVersion}}/{{domain}}/workflows/{{workflow}}/instances/{{instanceKey}}/transitions/select-demand-deposit?sync=true +Content-Type: application/json + +{ + "key": "{{instanceKey}}", + "tags": [ + "test", + "banking", + "account-opening", + "demand-deposit" + ], + "attributes": { + "accountType": "demand-deposit" + } +} + +############################################################################### +# Step 4.1: Select Account Type - Time Deposit (Alternative) +# User selects time deposit account instead +############################################################################### + +### Select Time Deposit Account (Alternative) +# @name selectTimeDeposit +PATCH {{baseUrl}}/api/v{{apiVersion}}/{{domain}}/workflows/{{workflow}}/instances/{{instanceKey}}/transitions/select-time-deposit?sync=true +Content-Type: application/json + +{ + "attributes": { + "accountType": "time-deposit" + } +} + +############################################################################### +# Step 5: Submit Account Details +# User provides detailed account configuration +############################################################################### + +### Submit Account Details +# @name submitAccountDetails +PATCH {{baseUrl}}/api/v{{apiVersion}}/{{domain}}/workflows/{{workflow}}/instances/{{instanceKey}}/transitions/submit-account-details?sync=true +Content-Type: application/json + +{ + "attributes": { + "accountName": "My Demand Deposit Account", + "currency": "TRY", + "branchCode": "5436", + "initialDeposit": 100, + "accountPurpose": "personal-banking", + "notifications": { + "smsNotifications": true, + "emailNotifications": true, + "pushNotifications": true + } + } +} + +############################################################################### +# Step 6: Confirm Account Opening +# User confirms all details and accepts terms +############################################################################### + +### Confirm Account Opening +# @name confirmAccountOpening +PATCH {{baseUrl}}/api/v{{apiVersion}}/{{domain}}/workflows/{{workflow}}/instances/{{instanceKey}}/transitions/confirm-account-opening?sync=true +Content-Type: application/json + +{ + "attributes": { + "confirmed": true, + "termsAccepted": true, + "privacyPolicyAccepted": true + } +} + +############################################################################### +# Step 7: Get Instance Data with Extensions +# Retrieve all instance data including user session extension data +############################################################################### + +### Get Instance Data with User Session Extension +GET {{baseUrl}}/api/v{{apiVersion}}/{{domain}}/workflows/{{workflow}}/instances/{{instanceKey}}/functions/data?extensions=extension-user-session +Accept: application/json + +############################################################################### +# Step 8: Get Final Instance Data +# Retrieve all accumulated data including account details +############################################################################### + +### Get Final Instance Data +GET {{baseUrl}}/api/v{{apiVersion}}/{{domain}}/workflows/{{workflow}}/instances/{{instanceKey}}/functions/data +Accept: application/json + +############################################################################### +# Cancel Flow +############################################################################### + +### Cancel Account Opening +# @name cancelAccountOpening +PATCH {{baseUrl}}/api/v{{apiVersion}}/{{domain}}/workflows/{{workflow}}/instances/{{instanceKey}}/transitions/cancel?sync=false +Content-Type: application/json + +############################################################################### +# Back Navigation (Go to Previous State) +############################################################################### + +### Go Back from Account Details +# @name goBackFromDetails +PATCH {{baseUrl}}/api/v{{apiVersion}}/{{domain}}/workflows/{{workflow}}/instances/{{instanceKey}}/transitions/back-to-type-selection?sync=true +Content-Type: application/json + +############################################################################### +# Account Opening Flow Summary +############################################################################### +# +# | Step | Transition | Description | +# |------|-------------------------|--------------------------------------| +# | 1 | start | Start with session info | +# | 2 | select-demand-deposit | Select demand deposit account type | +# | | select-time-deposit | OR select time deposit account type | +# | 3 | submit-account-details | Provide account configuration | +# | 4 | (auto) | Validate policies | +# | 5 | confirm-account-opening | Confirm and accept terms | +# | 6 | (auto) | Create bank account via API | +# | 7 | (complete) | Workflow completes successfully | +# | | cancel | Cancel at any point | +# | | back-to-type-selection | Go back to type selection | +# +############################################################################### + diff --git a/core/Workflows/account-opening/account-opening-workflow.json b/core/Workflows/account-opening/account-opening-workflow.json index b35c1d8..386e89f 100644 --- a/core/Workflows/account-opening/account-opening-workflow.json +++ b/core/Workflows/account-opening/account-opening-workflow.json @@ -205,7 +205,7 @@ }, { "key": "account-details-input", - "stateType": 1, + "stateType": 2, "subType": 0, "versionStrategy": "Minor", "labels": [ @@ -271,7 +271,7 @@ }, { "key": "account-confirmation", - "stateType": 1, + "stateType": 2, "subType": 0, "versionStrategy": "Minor", "labels": [ diff --git a/core/Workflows/contract/.meta/contract-approval-workflow.diagram.json b/core/Workflows/contract/.meta/contract-approval-workflow.diagram.json new file mode 100644 index 0000000..3f26be9 --- /dev/null +++ b/core/Workflows/contract/.meta/contract-approval-workflow.diagram.json @@ -0,0 +1,40 @@ +{ + "nodePos": { + "get-documents": { + "x": 832.2613564163169, + "y": -59.090639542492255 + }, + "process-next-document": { + "x": 785.847542225539, + "y": 187.31525053290247 + }, + "waiting-for-ready": { + "x": 1077.8742868701956, + "y": 419.9565626003958 + }, + "check-all-ready": { + "x": 416, + "y": 418 + }, + "all-ready": { + "x": 333.43882559601354, + "y": 693.4918284667067 + }, + "check-all-approved": { + "x": 1395.5109010718922, + "y": 693.2832210317742 + }, + "contract-completed": { + "x": 1396, + "y": -60 + }, + "contract-rejected": { + "x": 448.62784213385794, + "y": 952.2279820637636 + }, + "__start__": { + "x": 262, + "y": -52 + } + } +} \ No newline at end of file diff --git a/core/Workflows/contract/.meta/contract-document-subflow.diagram.json b/core/Workflows/contract/.meta/contract-document-subflow.diagram.json new file mode 100644 index 0000000..7f5cc85 --- /dev/null +++ b/core/Workflows/contract/.meta/contract-document-subflow.diagram.json @@ -0,0 +1,40 @@ +{ + "nodePos": { + "render-document": { + "x": 100, + "y": 300 + }, + "notify-parent-ready": { + "x": 531, + "y": 200 + }, + "waiting-for-approval": { + "x": 1097, + "y": 200 + }, + "notify-parent-approved": { + "x": 1573, + "y": 100 + }, + "notify-parent-rejected": { + "x": 1573, + "y": 300 + }, + "document-completed": { + "x": 2085, + "y": 100 + }, + "document-rejected": { + "x": 2085, + "y": 300 + }, + "document-failed": { + "x": 391, + "y": 500 + }, + "__start__": { + "x": -296, + "y": 300 + } + } +} \ No newline at end of file diff --git a/core/Workflows/contract/contract-approval-workflow.http b/core/Workflows/contract/contract-approval-workflow.http new file mode 100644 index 0000000..4ab3145 --- /dev/null +++ b/core/Workflows/contract/contract-approval-workflow.http @@ -0,0 +1,188 @@ +############################################################################### +# Contract Approval Workflow - HTTP Test File +# +# This file tests the contract-approval workflow which handles: +# - Contract document fetching +# - Document rendering via subflow +# - Document approval/rejection by user +# - Multi-document processing in a loop +# - Completion notification +# +# Prerequisites: +# 1. vNext Runtime running on localhost:4201 +# 2. Mockoon running on localhost:3001 +############################################################################### + +@baseUrl = http://localhost:4201 +@apiVersion = 1 +@domain = core +@workflow = contract-approval-workflow +@subflow = contract-document-subflow +@instanceKey = contract-{{$timestamp}} + +############################################################################### +# Step 1: Start Contract Approval Workflow +# Initiates the contract approval flow with group code +############################################################################### + +### Start Contract Approval Instance +# @name startContractApproval +POST {{baseUrl}}/api/v{{apiVersion}}/{{domain}}/workflows/{{workflow}}/instances/start?sync=false +Content-Type: application/json +Accept-Language: tr-TR +X-Request-Id: {{$guid}} +X-Device-Id: {{$guid}} +X-Token-Id: {{$guid}} +X-Device-Info: IOS 16 +X-Forwarded-For: 192.168.2.1 +user_reference: 34987491018 + +{ + "key": "{{instanceKey}}", + "tags": [ + "contract", + "approval", + "test" + ], + "attributes": { + "groupCode": "KG-2024-001", + "userId": "user-123", + "sessionId": "session-456", + "requestedAt": "{{$isoTimestamp}}" + } +} + +############################################################################### +# Step 2: Get Main Workflow State +# Check the current state of the main approval workflow +############################################################################### + +### Get Main Workflow State +GET {{baseUrl}}/api/v{{apiVersion}}/{{domain}}/workflows/{{workflow}}/instances/{{instanceKey}}/functions/state +Accept: application/json + +############################################################################### +# Step 3: Get Main Workflow Data +# Retrieve data including document list +############################################################################### + +### Get Main Workflow Data +GET {{baseUrl}}/api/v{{apiVersion}}/{{domain}}/workflows/{{workflow}}/instances/{{instanceKey}}/functions/data +Accept: application/json + +############################################################################### +# Document Subflow Operations +# Each document is processed in a separate subflow instance +############################################################################### + +@subflowInstanceKey = document-subflow-instance-id + +### Get Document Subflow State +GET {{baseUrl}}/api/v{{apiVersion}}/{{domain}}/workflows/{{subflow}}/instances/{{subflowInstanceKey}}/functions/state +Accept: application/json + +### Get Document Subflow Data +GET {{baseUrl}}/api/v{{apiVersion}}/{{domain}}/workflows/{{subflow}}/instances/{{subflowInstanceKey}}/functions/data +Accept: application/json + +############################################################################### +# Step 4: Approve Document +# User approves the rendered document +############################################################################### + +### Approve Document +# @name approveDocument +PATCH {{baseUrl}}/api/v{{apiVersion}}/{{domain}}/workflows/{{subflow}}/instances/{{subflowInstanceKey}}/transitions/approve-document?sync=true +Content-Type: application/json + +{ + "attributes": { + "approvedBy": "user-123", + "approvalNotes": "Document reviewed and approved" + } +} + +############################################################################### +# Step 4.1: Reject Document (Alternative) +# User rejects the document with reason +############################################################################### + +### Reject Document (Alternative) +# @name rejectDocument +PATCH {{baseUrl}}/api/v{{apiVersion}}/{{domain}}/workflows/{{subflow}}/instances/{{subflowInstanceKey}}/transitions/reject-document?sync=true +Content-Type: application/json + +{ + "attributes": { + "rejectedBy": "user-123", + "reason": "Document content has missing information" + } +} + +############################################################################### +# Step 5: Check Final State +# Verify all documents are processed and workflow is complete +############################################################################### + +### Get Final Main Workflow State +GET {{baseUrl}}/api/v{{apiVersion}}/{{domain}}/workflows/{{workflow}}/instances/{{instanceKey}}/functions/state +Accept: application/json + +### Get Final Main Workflow Data +GET {{baseUrl}}/api/v{{apiVersion}}/{{domain}}/workflows/{{workflow}}/instances/{{instanceKey}}/functions/data +Accept: application/json + +############################################################################### +# Contract Approval Flow Summary +############################################################################### +# +# Main Workflow (contract-approval-workflow): +# | Step | State/Transition | Description | +# |------|-----------------------|---------------------------------------| +# | 1 | start | Start with groupCode for documents | +# | 2 | (auto) | Fetch contract documents | +# | 3 | (auto) | Start document subflow for each doc | +# | 4 | (wait) | Wait for all documents to be approved | +# | 5 | (auto) | Notify completion | +# | 6 | (complete) | All documents approved | +# +# Document Subflow (contract-document-subflow): +# | Step | Transition | Description | +# |------|-----------------------|---------------------------------------| +# | 1 | (start) | Receive document from parent workflow | +# | 2 | (auto) | Render document for display | +# | 3 | approve-document | User approves the document | +# | | reject-document | OR user rejects the document | +# | 4 | (auto) | Notify parent workflow | +# | 5 | (complete) | Subflow completes | +# +############################################################################### + +############################################################################### +# Mockoon Endpoint Tests - Verify Mock Server is Running +############################################################################### + +### Test Get Contract Documents (Mockoon) +GET http://localhost:3001/api/contract/documents?groupCode=KG-2024-001 +Accept: application/json + +### Test Render Document (Mockoon) +POST http://localhost:3001/api/contract/documents/render +Content-Type: application/json + +{ + "documentId": "doc-001", + "templateId": "template-standard", + "userId": "user-123" +} + +### Test Notify Document Approved (Mockoon) +POST http://localhost:3001/api/contract/documents/notify-approved +Content-Type: application/json + +{ + "documentId": "doc-001", + "approvedBy": "user-123", + "approvedAt": "{{$isoTimestamp}}" +} + diff --git a/core/Workflows/contract/contract-approval-workflow.json b/core/Workflows/contract/contract-approval-workflow.json new file mode 100644 index 0000000..48d2585 --- /dev/null +++ b/core/Workflows/contract/contract-approval-workflow.json @@ -0,0 +1,525 @@ +{ + "key": "contract-approval-workflow", + "flow": "sys-flows", + "domain": "core", + "version": "1.0.0", + "tags": [ + "contract", + "approval", + "workflow", + "document-management", + "sequential-process" + ], + "attributes": { + "type": "F", + "timeout": null, + "labels": [ + { + "language": "en-US", + "label": "Contract Approval Workflow" + }, + { + "language": "tr-TR", + "label": "Kontrat Onay İş Akışı" + } + ], + "functions": [], + "features": [], + "extensions": [], + "sharedTransitions": [], + "startTransition": { + "key": "start-contract-approval", + "target": "get-documents", + "triggerType": 0, + "versionStrategy": "Minor", + "labels": [ + { + "language": "en-US", + "label": "Start Contract Approval" + }, + { + "language": "tr-TR", + "label": "Kontrat Onayını Başlat" + } + ], + "onExecutionTasks": [ + { + "order": 1, + "task": { + "key": "script-task", + "domain": "core", + "version": "1.0.0", + "flow": "sys-tasks" + }, + "mapping": { + "location": "./src/InitContractApprovalMapping.csx", + "code": "dXNpbmcgU3lzdGVtOwp1c2luZyBTeXN0ZW0uVGhyZWFkaW5nLlRhc2tzOwp1c2luZyBCQlQuV29ya2Zsb3cuRGVmaW5pdGlvbnM7CnVzaW5nIEJCVC5Xb3JrZmxvdy5TY3JpcHRpbmc7CgovLy8gPHN1bW1hcnk+Ci8vLyBJbml0aWFsaXplIENvbnRyYWN0IEFwcHJvdmFsIFdvcmtmbG93IC0gUHJlcGFyZXMgaW5pdGlhbCBkYXRhCi8vLyA8L3N1bW1hcnk+CnB1YmxpYyBjbGFzcyBJbml0Q29udHJhY3RBcHByb3ZhbE1hcHBpbmcgOiBJTWFwcGluZwp7CiAgICBwdWJsaWMgVGFzazxTY3JpcHRSZXNwb25zZT4gSW5wdXRIYW5kbGVyKFdvcmtmbG93VGFzayB0YXNrLCBTY3JpcHRDb250ZXh0IGNvbnRleHQpCiAgICB7CiAgICAgICAgcmV0dXJuIFRhc2suRnJvbVJlc3VsdChuZXcgU2NyaXB0UmVzcG9uc2UoKSk7CiAgICB9CgogICAgcHVibGljIGFzeW5jIFRhc2s8U2NyaXB0UmVzcG9uc2U+IE91dHB1dEhhbmRsZXIoU2NyaXB0Q29udGV4dCBjb250ZXh0KQogICAgewogICAgICAgIHRyeQogICAgICAgIHsKICAgICAgICAgICAgdmFyIGlucHV0RGF0YSA9IGNvbnRleHQuSW5zdGFuY2U/LkRhdGE7CiAgICAgICAgICAgIHZhciBncm91cENvZGUgPSBpbnB1dERhdGE/Lmdyb3VwQ29kZT8uVG9TdHJpbmcoKSA/PyAiIjsKICAgICAgICAgICAgCiAgICAgICAgICAgIHJldHVybiBuZXcgU2NyaXB0UmVzcG9uc2UKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgS2V5ID0gImluaXQtc3VjY2VzcyIsCiAgICAgICAgICAgICAgICBEYXRhID0gbmV3CiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgZ3JvdXBDb2RlID0gZ3JvdXBDb2RlLAogICAgICAgICAgICAgICAgICAgIHdvcmtmbG93U3RhcnRlZEF0ID0gRGF0ZVRpbWUuVXRjTm93LAogICAgICAgICAgICAgICAgICAgIGRvY3VtZW50cyA9IG5ldyBvYmplY3RbXSB7IH0sCiAgICAgICAgICAgICAgICAgICAgY3VycmVudERvY3VtZW50SW5kZXggPSAwLAogICAgICAgICAgICAgICAgICAgIHJlYWR5Q291bnQgPSAwLAogICAgICAgICAgICAgICAgICAgIGFwcHJvdmVkQ291bnQgPSAwLAogICAgICAgICAgICAgICAgICAgIHJlamVjdGVkQ291bnQgPSAwLAogICAgICAgICAgICAgICAgICAgIHRvdGFsRG9jdW1lbnRzID0gMCwKICAgICAgICAgICAgICAgICAgICBkb2N1bWVudEluc3RhbmNlcyA9IG5ldyBvYmplY3RbXSB7IH0sCiAgICAgICAgICAgICAgICAgICAgc3RhdHVzID0gImluaXRpYWxpemVkIgogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgIFRhZ3MgPSBuZXdbXSB7ICJjb250cmFjdCIsICJpbml0aWFsaXplZCIgfQogICAgICAgICAgICB9OwogICAgICAgIH0KICAgICAgICBjYXRjaCAoRXhjZXB0aW9uIGV4KQogICAgICAgIHsKICAgICAgICAgICAgcmV0dXJuIG5ldyBTY3JpcHRSZXNwb25zZQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBLZXkgPSAiaW5pdC1lcnJvciIsCiAgICAgICAgICAgICAgICBEYXRhID0gbmV3IHsgZXJyb3IgPSBleC5NZXNzYWdlIH0KICAgICAgICAgICAgfTsKICAgICAgICB9CiAgICB9Cn0KCg==" + } + } + ] + }, + "states": [ + { + "key": "get-documents", + "stateType": 1, + "subType": 0, + "versionStrategy": "Minor", + "labels": [ + { + "language": "en-US", + "label": "Get Document List" + }, + { + "language": "tr-TR", + "label": "Döküman Listesini Al" + } + ], + "view": null, + "subFlow": null, + "onEntries": [ + { + "order": 1, + "task": { + "key": "get-contract-documents", + "domain": "core", + "version": "1.0.0", + "flow": "sys-tasks" + }, + "mapping": { + "location": "./src/GetContractDocumentsMapping.csx", + "code": "dXNpbmcgU3lzdGVtOwp1c2luZyBTeXN0ZW0uVGhyZWFkaW5nLlRhc2tzOwp1c2luZyBCQlQuV29ya2Zsb3cuRGVmaW5pdGlvbnM7CnVzaW5nIEJCVC5Xb3JrZmxvdy5TY3JpcHRpbmc7CgovLy8gPHN1bW1hcnk+Ci8vLyBHZXQgQ29udHJhY3QgRG9jdW1lbnRzIE1hcHBpbmcgLSBSZXRyaWV2ZXMgZG9jdW1lbnQgbGlzdCBmcm9tIEFQSQovLy8gPC9zdW1tYXJ5PgpwdWJsaWMgY2xhc3MgR2V0Q29udHJhY3REb2N1bWVudHNNYXBwaW5nIDogSU1hcHBpbmcKewogICAgcHVibGljIFRhc2s8U2NyaXB0UmVzcG9uc2U+IElucHV0SGFuZGxlcihXb3JrZmxvd1Rhc2sgdGFzaywgU2NyaXB0Q29udGV4dCBjb250ZXh0KQogICAgewogICAgICAgIHRyeQogICAgICAgIHsKICAgICAgICAgICAgdmFyIGh0dHBUYXNrID0gdGFzayBhcyBIdHRwVGFzazsKICAgICAgICAgICAgaWYgKGh0dHBUYXNrID09IG51bGwpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHRocm93IG5ldyBJbnZhbGlkT3BlcmF0aW9uRXhjZXB0aW9uKCJUYXNrIG11c3QgYmUgYW4gSHR0cFRhc2siKTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgdmFyIGdyb3VwQ29kZSA9IGNvbnRleHQuSW5zdGFuY2U/LkRhdGE/Lmdyb3VwQ29kZT8uVG9TdHJpbmcoKSA/PyAiIjsKICAgICAgICAgICAgCiAgICAgICAgICAgIC8vIE1vY2tvb24gQVBJIGV4cGVjdHMgImdyb3VwQ29kZSIgZmllbGQKICAgICAgICAgICAgdmFyIHJlcXVlc3RCb2R5ID0gbmV3CiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIGdyb3VwQ29kZSA9IGdyb3VwQ29kZSwKICAgICAgICAgICAgICAgIHJlcXVlc3RJZCA9IEd1aWQuTmV3R3VpZCgpLlRvU3RyaW5nKCksCiAgICAgICAgICAgICAgICB0aW1lc3RhbXAgPSBEYXRlVGltZS5VdGNOb3cKICAgICAgICAgICAgfTsKCiAgICAgICAgICAgIGh0dHBUYXNrLlNldEJvZHkocmVxdWVzdEJvZHkpOwoKICAgICAgICAgICAgdmFyIGhlYWRlcnMgPSBuZXcgRGljdGlvbmFyeTxzdHJpbmcsIHN0cmluZz8+CiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIFsiQ29udGVudC1UeXBlIl0gPSAiYXBwbGljYXRpb24vanNvbiIsCiAgICAgICAgICAgICAgICBbIlgtUmVxdWVzdC1JZCJdID0gR3VpZC5OZXdHdWlkKCkuVG9TdHJpbmcoKSwKICAgICAgICAgICAgICAgIFsiWC1Db3JyZWxhdGlvbi1JZCJdID0gY29udGV4dC5JbnN0YW5jZS5JZC5Ub1N0cmluZygpCiAgICAgICAgICAgIH07CiAgICAgICAgICAgIGh0dHBUYXNrLlNldEhlYWRlcnMoaGVhZGVycyk7CgogICAgICAgICAgICByZXR1cm4gVGFzay5Gcm9tUmVzdWx0KG5ldyBTY3JpcHRSZXNwb25zZSgpKTsKICAgICAgICB9CiAgICAgICAgY2F0Y2ggKEV4Y2VwdGlvbiBleCkKICAgICAgICB7CiAgICAgICAgICAgIHJldHVybiBUYXNrLkZyb21SZXN1bHQobmV3IFNjcmlwdFJlc3BvbnNlCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIEtleSA9ICJnZXQtZG9jdW1lbnRzLWlucHV0LWVycm9yIiwKICAgICAgICAgICAgICAgIERhdGEgPSBuZXcgeyBlcnJvciA9IGV4Lk1lc3NhZ2UgfQogICAgICAgICAgICB9KTsKICAgICAgICB9CiAgICB9CgogICAgcHVibGljIGFzeW5jIFRhc2s8U2NyaXB0UmVzcG9uc2U+IE91dHB1dEhhbmRsZXIoU2NyaXB0Q29udGV4dCBjb250ZXh0KQogICAgewogICAgICAgIHRyeQogICAgICAgIHsKICAgICAgICAgICAgdmFyIHJlc3BvbnNlID0gY29udGV4dC5Cb2R5OwogICAgICAgICAgICB2YXIgc3RhdHVzQ29kZSA9IHJlc3BvbnNlPy5zdGF0dXNDb2RlID8/IDUwMDsKCiAgICAgICAgICAgIGlmIChzdGF0dXNDb2RlID49IDIwMCAmJiBzdGF0dXNDb2RlIDwgMzAwKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAvLyBNb2Nrb29uIEFQSSByZXR1cm5zICJjb250cmFjdHMiIGFycmF5LCBub3QgImRvY3VtZW50cyIKICAgICAgICAgICAgICAgIHZhciBjb250cmFjdHMgPSByZXNwb25zZT8uZGF0YT8uZGF0YT8uY29udHJhY3RzID8/IG5ldyBvYmplY3RbXSB7IH07CiAgICAgICAgICAgICAgICB2YXIgY29udHJhY3RMaXN0ID0gbmV3IExpc3Q8b2JqZWN0PigpOwogICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICBpZiAoY29udHJhY3RzICE9IG51bGwpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgZm9yZWFjaCAodmFyIGNvbnRyYWN0IGluIGNvbnRyYWN0cykKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRyYWN0TGlzdC5BZGQoY29udHJhY3QpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAvLyB0b3RhbENvbnRyYWN0cyBmcm9tIEFQSSByZXNwb25zZSBvciBjYWxjdWxhdGVkIGZyb20gbGlzdAogICAgICAgICAgICAgICAgdmFyIHRvdGFsQ29udHJhY3RzID0gcmVzcG9uc2U/LmRhdGE/LmRhdGE/LnRvdGFsQ29udHJhY3RzID8/IGNvbnRyYWN0TGlzdC5Db3VudDsKCiAgICAgICAgICAgICAgICByZXR1cm4gbmV3IFNjcmlwdFJlc3BvbnNlCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgS2V5ID0gImdldC1kb2N1bWVudHMtc3VjY2VzcyIsCiAgICAgICAgICAgICAgICAgICAgRGF0YSA9IG5ldwogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgZG9jdW1lbnRzID0gY29udHJhY3RMaXN0LlRvQXJyYXkoKSwKICAgICAgICAgICAgICAgICAgICAgICAgdG90YWxEb2N1bWVudHMgPSAoaW50KXRvdGFsQ29udHJhY3RzLAogICAgICAgICAgICAgICAgICAgICAgICBncm91cENvZGUgPSByZXNwb25zZT8uZGF0YT8uZGF0YT8uZ3JvdXBDb2RlLAogICAgICAgICAgICAgICAgICAgICAgICByZXRyaWV2ZWRBdCA9IHJlc3BvbnNlPy5kYXRhPy5kYXRhPy5yZXRyaWV2ZWRBdCwKICAgICAgICAgICAgICAgICAgICAgICAgY3VycmVudERvY3VtZW50SW5kZXggPSAwLAogICAgICAgICAgICAgICAgICAgICAgICByZWFkeUNvdW50ID0gMCwKICAgICAgICAgICAgICAgICAgICAgICAgYXBwcm92ZWRDb3VudCA9IDAsCiAgICAgICAgICAgICAgICAgICAgICAgIGRvY3VtZW50SW5zdGFuY2VzID0gbmV3IG9iamVjdFtdIHsgfSwKICAgICAgICAgICAgICAgICAgICAgICAgZG9jdW1lbnRzTG9hZGVkQXQgPSBEYXRlVGltZS5VdGNOb3cKICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgIFRhZ3MgPSBuZXdbXSB7ICJjb250cmFjdCIsICJkb2N1bWVudHMtbG9hZGVkIiB9CiAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICB9CgogICAgICAgICAgICByZXR1cm4gbmV3IFNjcmlwdFJlc3BvbnNlCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIEtleSA9ICJnZXQtZG9jdW1lbnRzLWZhaWxlZCIsCiAgICAgICAgICAgICAgICBEYXRhID0gbmV3CiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgZXJyb3IgPSByZXNwb25zZT8uZGF0YT8uZXJyb3I/Lm1lc3NhZ2UgPz8gcmVzcG9uc2U/LmVycm9yID8/ICJGYWlsZWQgdG8gZ2V0IGRvY3VtZW50cyIsCiAgICAgICAgICAgICAgICAgICAgZXJyb3JDb2RlID0gcmVzcG9uc2U/LmRhdGE/LmVycm9yPy5jb2RlLAogICAgICAgICAgICAgICAgICAgIHN0YXR1c0NvZGUgPSBzdGF0dXNDb2RlLAogICAgICAgICAgICAgICAgICAgIGRvY3VtZW50cyA9IG5ldyBvYmplY3RbXSB7IH0sCiAgICAgICAgICAgICAgICAgICAgdG90YWxEb2N1bWVudHMgPSAwCiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH07CiAgICAgICAgfQogICAgICAgIGNhdGNoIChFeGNlcHRpb24gZXgpCiAgICAgICAgewogICAgICAgICAgICByZXR1cm4gbmV3IFNjcmlwdFJlc3BvbnNlCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIEtleSA9ICJnZXQtZG9jdW1lbnRzLWV4Y2VwdGlvbiIsCiAgICAgICAgICAgICAgICBEYXRhID0gbmV3CiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgZXJyb3IgPSBleC5NZXNzYWdlLAogICAgICAgICAgICAgICAgICAgIGRvY3VtZW50cyA9IG5ldyBvYmplY3RbXSB7IH0sCiAgICAgICAgICAgICAgICAgICAgdG90YWxEb2N1bWVudHMgPSAwCiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH07CiAgICAgICAgfQogICAgfQp9Cgo=" + } + } + ], + "onExits": [], + "transitions": [ + { + "key": "documents-loaded", + "target": "process-next-document", + "triggerType": 1, + "versionStrategy": "Minor", + "labels": [ + { + "language": "en-US", + "label": "Documents Loaded" + }, + { + "language": "tr-TR", + "label": "Dökümanlar Yüklendi" + } + ], + "schema": null, + "rule": { + "location": "./src/DocumentsLoadedRule.csx", + "code": "dXNpbmcgU3lzdGVtLlRocmVhZGluZy5UYXNrczsKdXNpbmcgQkJULldvcmtmbG93LlNjcmlwdGluZzsKCi8vLyA8c3VtbWFyeT4KLy8vIERvY3VtZW50cyBMb2FkZWQgUnVsZSAtIENoZWNrcyBpZiBkb2N1bWVudHMgYXJlIGxvYWRlZCBzdWNjZXNzZnVsbHkKLy8vIDwvc3VtbWFyeT4KcHVibGljIGNsYXNzIERvY3VtZW50c0xvYWRlZFJ1bGUgOiBJQ29uZGl0aW9uTWFwcGluZwp7CiAgICBwdWJsaWMgYXN5bmMgVGFzazxib29sPiBIYW5kbGVyKFNjcmlwdENvbnRleHQgY29udGV4dCkKICAgIHsKICAgICAgICB0cnkKICAgICAgICB7CiAgICAgICAgICAgIHZhciB0b3RhbERvY3VtZW50cyA9IGNvbnRleHQuSW5zdGFuY2U/LkRhdGE/LnRvdGFsRG9jdW1lbnRzID8/IDA7CiAgICAgICAgICAgIHJldHVybiAoaW50KXRvdGFsRG9jdW1lbnRzID4gMDsKICAgICAgICB9CiAgICAgICAgY2F0Y2ggKEV4Y2VwdGlvbikKICAgICAgICB7CiAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICB9CiAgICB9Cn0KCg==" + }, + "timer": null, + "view": null, + "onExecutionTasks": [] + }, + { + "key": "no-documents", + "target": "contract-completed", + "triggerType": 1, + "versionStrategy": "Minor", + "labels": [ + { + "language": "en-US", + "label": "No Documents Found" + }, + { + "language": "tr-TR", + "label": "Döküman Bulunamadı" + } + ], + "schema": null, + "rule": { + "location": "./src/NoDocumentsRule.csx", + "code": "dXNpbmcgU3lzdGVtLlRocmVhZGluZy5UYXNrczsKdXNpbmcgQkJULldvcmtmbG93LlNjcmlwdGluZzsKCi8vLyA8c3VtbWFyeT4KLy8vIE5vIERvY3VtZW50cyBSdWxlIC0gQ2hlY2tzIGlmIG5vIGRvY3VtZW50cyBmb3VuZAovLy8gPC9zdW1tYXJ5PgpwdWJsaWMgY2xhc3MgTm9Eb2N1bWVudHNSdWxlIDogSUNvbmRpdGlvbk1hcHBpbmcKewogICAgcHVibGljIGFzeW5jIFRhc2s8Ym9vbD4gSGFuZGxlcihTY3JpcHRDb250ZXh0IGNvbnRleHQpCiAgICB7CiAgICAgICAgdHJ5CiAgICAgICAgewogICAgICAgICAgICB2YXIgdG90YWxEb2N1bWVudHMgPSBjb250ZXh0Lkluc3RhbmNlPy5EYXRhPy50b3RhbERvY3VtZW50cyA/PyAwOwogICAgICAgICAgICByZXR1cm4gKGludCl0b3RhbERvY3VtZW50cyA9PSAwOwogICAgICAgIH0KICAgICAgICBjYXRjaCAoRXhjZXB0aW9uKQogICAgICAgIHsKICAgICAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgICAgfQogICAgfQp9Cgo=" + }, + "timer": null, + "view": null, + "onExecutionTasks": [] + } + ] + }, + { + "key": "process-next-document", + "stateType": 2, + "subType": 0, + "versionStrategy": "Minor", + "labels": [ + { + "language": "en-US", + "label": "Process Next Document" + }, + { + "language": "tr-TR", + "label": "Sonraki Dökümanı İşle" + } + ], + "view": null, + "subFlow": null, + "onEntries": [ + { + "order": 1, + "task": { + "key": "start-document-subprocess", + "domain": "core", + "version": "1.0.0", + "flow": "sys-tasks" + }, + "mapping": { + "location": "./src/StartDocumentSubprocessMapping.csx", + "code": "dXNpbmcgU3lzdGVtOwp1c2luZyBTeXN0ZW0uVGhyZWFkaW5nLlRhc2tzOwp1c2luZyBCQlQuV29ya2Zsb3cuRGVmaW5pdGlvbnM7CnVzaW5nIEJCVC5Xb3JrZmxvdy5TY3JpcHRpbmc7CgovLy8gPHN1bW1hcnk+Ci8vLyBTdGFydCBEb2N1bWVudCBTdWJwcm9jZXNzIE1hcHBpbmcgLSBTdGFydHMgc3VicHJvY2VzcyBmb3IgY3VycmVudCBkb2N1bWVudAovLy8gPC9zdW1tYXJ5PgpwdWJsaWMgY2xhc3MgU3RhcnREb2N1bWVudFN1YnByb2Nlc3NNYXBwaW5nIDogSU1hcHBpbmcKewogICAgcHVibGljIFRhc2s8U2NyaXB0UmVzcG9uc2U+IElucHV0SGFuZGxlcihXb3JrZmxvd1Rhc2sgdGFzaywgU2NyaXB0Q29udGV4dCBjb250ZXh0KQogICAgewogICAgICAgIHRyeQogICAgICAgIHsKICAgICAgICAgICAgdmFyIHN0YXJ0VGFzayA9IHRhc2sgYXMgU3ViUHJvY2Vzc1Rhc2s7CiAgICAgICAgICAgIGlmIChzdGFydFRhc2sgPT0gbnVsbCkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgdGhyb3cgbmV3IEludmFsaWRPcGVyYXRpb25FeGNlcHRpb24oIlRhc2sgbXVzdCBiZSBhIFN0YXJ0VGFzayIpOwogICAgICAgICAgICB9CgogICAgICAgICAgICAvLyBDb25maWd1cmUgdGFyZ2V0IHdvcmtmbG93CiAgICAgICAgICAgIHN0YXJ0VGFzay5TZXREb21haW4oImNvcmUiKTsKICAgICAgICAgICAgc3RhcnRUYXNrLlNldEZsb3coImNvbnRyYWN0LWRvY3VtZW50LXN1YmZsb3ciKTsKICAgICAgICAgICAgc3RhcnRUYXNrLlNldFZlcnNpb24oIjEuMC4wIik7CiAgICAgICAgICAgIAogICAgICAgICAgICAvLyBHZXQgY3VycmVudCBkb2N1bWVudAogICAgICAgICAgICB2YXIgY3VycmVudEluZGV4ID0gKGludCkoY29udGV4dC5JbnN0YW5jZT8uRGF0YT8uY3VycmVudERvY3VtZW50SW5kZXggPz8gMCk7CiAgICAgICAgICAgIHZhciBkb2N1bWVudHMgPSBjb250ZXh0Lkluc3RhbmNlPy5EYXRhPy5kb2N1bWVudHM7CiAgICAgICAgICAgIAogICAgICAgICAgICBvYmplY3QgY3VycmVudERvY3VtZW50ID0gbnVsbDsKICAgICAgICAgICAgaWYgKGRvY3VtZW50cyAhPSBudWxsKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICB2YXIgZG9jTGlzdCA9IG5ldyBMaXN0PG9iamVjdD4oKTsKICAgICAgICAgICAgICAgIGZvcmVhY2ggKHZhciBkb2MgaW4gZG9jdW1lbnRzKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIGRvY0xpc3QuQWRkKGRvYyk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBpZiAoY3VycmVudEluZGV4IDwgZG9jTGlzdC5Db3VudCkKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBjdXJyZW50RG9jdW1lbnQgPSBkb2NMaXN0W2N1cnJlbnRJbmRleF07CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIC8vIEdlbmVyYXRlIHVuaXF1ZSBrZXkgZm9yIHN1YnByb2Nlc3MKICAgICAgICAgICAgdmFyIHN1YnByb2Nlc3NLZXkgPSAkIntjb250ZXh0Lkluc3RhbmNlPy5LZXl9LWRvYy17Y3VycmVudEluZGV4fSI7CiAgICAgICAgICAgIHN0YXJ0VGFzay5TZXRLZXkoc3VicHJvY2Vzc0tleSk7CiAgICAgICAgICAgIHN0YXJ0VGFzay5TZXRUYWdzKG5ld1tdIHsgImNvbnRyYWN0IiwgImRvY3VtZW50IiwgInN1YnByb2Nlc3MiIH0pOwoKICAgICAgICAgICAgLy8gUHJlcGFyZSBpbml0aWFsaXphdGlvbiBib2R5CiAgICAgICAgICAgIHZhciBpbml0Qm9keSA9IG5ldwogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBwYXJlbnRJbnN0YW5jZUlkID0gY29udGV4dC5JbnN0YW5jZT8uSWQsCiAgICAgICAgICAgICAgICBwYXJlbnRJbnN0YW5jZUtleSA9IGNvbnRleHQuSW5zdGFuY2U/LktleSwKICAgICAgICAgICAgICAgIHBhcmVudFdvcmtmbG93S2V5ID0gY29udGV4dC5Xb3JrZmxvdz8uS2V5LAogICAgICAgICAgICAgICAgZG9jdW1lbnQgPSBjdXJyZW50RG9jdW1lbnQsCiAgICAgICAgICAgICAgICBkb2N1bWVudEluZGV4ID0gY3VycmVudEluZGV4LAogICAgICAgICAgICAgICAgZ3JvdXBDb2RlID0gY29udGV4dC5JbnN0YW5jZT8uRGF0YT8uZ3JvdXBDb2RlLAogICAgICAgICAgICAgICAgc3RhcnRlZEF0ID0gRGF0ZVRpbWUuVXRjTm93CiAgICAgICAgICAgIH07CiAgICAgICAgICAgIHN0YXJ0VGFzay5TZXRCb2R5KGluaXRCb2R5KTsKCiAgICAgICAgICAgIHJldHVybiBUYXNrLkZyb21SZXN1bHQobmV3IFNjcmlwdFJlc3BvbnNlKCkpOwogICAgICAgIH0KICAgICAgICBjYXRjaCAoRXhjZXB0aW9uIGV4KQogICAgICAgIHsKICAgICAgICAgICAgcmV0dXJuIFRhc2suRnJvbVJlc3VsdChuZXcgU2NyaXB0UmVzcG9uc2UKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgS2V5ID0gInN0YXJ0LXN1YnByb2Nlc3MtaW5wdXQtZXJyb3IiLAogICAgICAgICAgICAgICAgRGF0YSA9IG5ldyB7IGVycm9yID0gZXguTWVzc2FnZSB9CiAgICAgICAgICAgIH0pOwogICAgICAgIH0KICAgIH0KCiAgICBwdWJsaWMgYXN5bmMgVGFzazxTY3JpcHRSZXNwb25zZT4gT3V0cHV0SGFuZGxlcihTY3JpcHRDb250ZXh0IGNvbnRleHQpCiAgICB7CiAgICAgICAgdHJ5CiAgICAgICAgewogICAgICAgICAgICB2YXIgcmVzcG9uc2UgPSBjb250ZXh0LkJvZHk7CiAgICAgICAgICAgIHZhciBjdXJyZW50SW5kZXggPSAoaW50KShjb250ZXh0Lkluc3RhbmNlPy5EYXRhPy5jdXJyZW50RG9jdW1lbnRJbmRleCA/PyAwKTsKCiAgICAgICAgICAgIGlmIChyZXNwb25zZT8uaXNTdWNjZXNzID09IHRydWUpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIC8vIFN0b3JlIHN1YnByb2Nlc3MgaW5zdGFuY2UgaW5mbwogICAgICAgICAgICAgICAgdmFyIGV4aXN0aW5nSW5zdGFuY2VzID0gY29udGV4dC5JbnN0YW5jZT8uRGF0YT8uZG9jdW1lbnRJbnN0YW5jZXMgPz8gbmV3IG9iamVjdFtdIHsgfTsKICAgICAgICAgICAgICAgIHZhciBpbnN0YW5jZUxpc3QgPSBuZXcgTGlzdDxvYmplY3Q+KCk7CiAgICAgICAgICAgICAgICBmb3JlYWNoICh2YXIgaW5zdCBpbiBleGlzdGluZ0luc3RhbmNlcykKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBpbnN0YW5jZUxpc3QuQWRkKGluc3QpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAvLyBHZXQgY3VycmVudCBkb2N1bWVudCBmb3IgY29udHJhY3RJZCByZWZlcmVuY2UKICAgICAgICAgICAgICAgIHZhciBkb2N1bWVudHMgPSBjb250ZXh0Lkluc3RhbmNlPy5EYXRhPy5kb2N1bWVudHM7CiAgICAgICAgICAgICAgICBvYmplY3QgY3VycmVudERvYyA9IG51bGw7CiAgICAgICAgICAgICAgICBpZiAoZG9jdW1lbnRzICE9IG51bGwpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgdmFyIGRvY0xpc3QgPSBuZXcgTGlzdDxvYmplY3Q+KCk7CiAgICAgICAgICAgICAgICAgICAgZm9yZWFjaCAodmFyIGQgaW4gZG9jdW1lbnRzKQogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgZG9jTGlzdC5BZGQoZCk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGlmIChjdXJyZW50SW5kZXggPCBkb2NMaXN0LkNvdW50KQogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgY3VycmVudERvYyA9IGRvY0xpc3RbY3VycmVudEluZGV4XTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgaW5zdGFuY2VMaXN0LkFkZChuZXcKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBpbnN0YW5jZUlkID0gcmVzcG9uc2U/LmRhdGE/LmlkLAogICAgICAgICAgICAgICAgICAgIGNvbnRyYWN0SWQgPSAoKGR5bmFtaWMpY3VycmVudERvYyk/LmNvbnRyYWN0SWQsCiAgICAgICAgICAgICAgICAgICAgY29udHJhY3ROYW1lID0gKChkeW5hbWljKWN1cnJlbnREb2MpPy5jb250cmFjdE5hbWUsCiAgICAgICAgICAgICAgICAgICAgZG9jdW1lbnRJbmRleCA9IGN1cnJlbnRJbmRleCwKICAgICAgICAgICAgICAgICAgICBzdGFydGVkQXQgPSBEYXRlVGltZS5VdGNOb3csCiAgICAgICAgICAgICAgICAgICAgc3RhdHVzID0gInN0YXJ0ZWQiCiAgICAgICAgICAgICAgICB9KTsKCiAgICAgICAgICAgICAgICByZXR1cm4gbmV3IFNjcmlwdFJlc3BvbnNlCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgS2V5ID0gInN1YnByb2Nlc3Mtc3RhcnRlZCIsCiAgICAgICAgICAgICAgICAgICAgRGF0YSA9IG5ldwogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgZG9jdW1lbnRJbnN0YW5jZXMgPSBpbnN0YW5jZUxpc3QuVG9BcnJheSgpLAogICAgICAgICAgICAgICAgICAgICAgICBjdXJyZW50RG9jdW1lbnRJbmRleCA9IGN1cnJlbnRJbmRleCArIDEsCiAgICAgICAgICAgICAgICAgICAgICAgIGxhc3RTdWJwcm9jZXNzSWQgPSByZXNwb25zZT8uZGF0YT8uaWQKICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgIFRhZ3MgPSBuZXdbXSB7ICJjb250cmFjdCIsICJzdWJwcm9jZXNzLXN0YXJ0ZWQiIH0KICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIHJldHVybiBuZXcgU2NyaXB0UmVzcG9uc2UKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgS2V5ID0gInN1YnByb2Nlc3MtZmFpbGVkIiwKICAgICAgICAgICAgICAgIERhdGEgPSBuZXcKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBlcnJvciA9IHJlc3BvbnNlPy5lcnJvck1lc3NhZ2UgPz8gIkZhaWxlZCB0byBzdGFydCBzdWJwcm9jZXNzIgogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9OwogICAgICAgIH0KICAgICAgICBjYXRjaCAoRXhjZXB0aW9uIGV4KQogICAgICAgIHsKICAgICAgICAgICAgcmV0dXJuIG5ldyBTY3JpcHRSZXNwb25zZQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBLZXkgPSAic3VicHJvY2Vzcy1leGNlcHRpb24iLAogICAgICAgICAgICAgICAgRGF0YSA9IG5ldyB7IGVycm9yID0gZXguTWVzc2FnZSB9CiAgICAgICAgICAgIH07CiAgICAgICAgfQogICAgfQp9Cgo=" + } + } + ], + "onExits": [], + "transitions": [ + { + "key": "subprocess-started", + "target": "waiting-for-ready", + "triggerType": 1, + "versionStrategy": "Minor", + "labels": [ + { + "language": "en-US", + "label": "Subprocess Started" + }, + { + "language": "tr-TR", + "label": "Alt Süreç Başlatıldı" + } + ], + "schema": null, + "rule": { + "location": "./src/AlwaysTrueRule.csx", + "code": "dXNpbmcgU3lzdGVtLlRocmVhZGluZy5UYXNrczsKdXNpbmcgQkJULldvcmtmbG93LlNjcmlwdGluZzsKCi8vLyA8c3VtbWFyeT4KLy8vIEFsd2F5cyBUcnVlIFJ1bGUgLSBVc2VkIGZvciBhdXRvIHRyYW5zaXRpb25zIHRoYXQgc2hvdWxkIGFsd2F5cyBwcm9jZWVkCi8vLyA8L3N1bW1hcnk+CnB1YmxpYyBjbGFzcyBBbHdheXNUcnVlUnVsZSA6IElDb25kaXRpb25NYXBwaW5nCnsKICAgIHB1YmxpYyBhc3luYyBUYXNrPGJvb2w+IEhhbmRsZXIoU2NyaXB0Q29udGV4dCBjb250ZXh0KQogICAgewogICAgICAgIHJldHVybiB0cnVlOwogICAgfQp9Cgo=" + }, + "timer": null, + "view": null, + "onExecutionTasks": [] + } + ] + }, + { + "key": "waiting-for-ready", + "stateType": 2, + "subType": 0, + "versionStrategy": "Minor", + "labels": [ + { + "language": "en-US", + "label": "Waiting for Document Ready" + }, + { + "language": "tr-TR", + "label": "Döküman Hazır Bekliyor" + } + ], + "view": null, + "subFlow": null, + "onEntries": [], + "onExits": [], + "transitions": [ + { + "key": "document-ready", + "target": "check-all-ready", + "triggerType": 0, + "versionStrategy": "Minor", + "labels": [ + { + "language": "en-US", + "label": "Document Ready" + }, + { + "language": "tr-TR", + "label": "Döküman Hazır" + } + ], + "schema": null, + "rule": null, + "timer": null, + "view": null, + "onExecutionTasks": [ + { + "order": 1, + "task": { + "key": "script-task", + "domain": "core", + "version": "1.0.0", + "flow": "sys-tasks" + }, + "mapping": { + "location": "./src/IncrementReadyCountMapping.csx", + "code": "dXNpbmcgU3lzdGVtOwp1c2luZyBTeXN0ZW0uVGhyZWFkaW5nLlRhc2tzOwp1c2luZyBCQlQuV29ya2Zsb3cuRGVmaW5pdGlvbnM7CnVzaW5nIEJCVC5Xb3JrZmxvdy5TY3JpcHRpbmc7CgovLy8gPHN1bW1hcnk+Ci8vLyBJbmNyZW1lbnQgUmVhZHkgQ291bnQgTWFwcGluZyAtIEluY3JlbWVudHMgdGhlIHJlYWR5IGRvY3VtZW50IGNvdW50ZXIKLy8vIDwvc3VtbWFyeT4KcHVibGljIGNsYXNzIEluY3JlbWVudFJlYWR5Q291bnRNYXBwaW5nIDogSU1hcHBpbmcKewogICAgcHVibGljIFRhc2s8U2NyaXB0UmVzcG9uc2U+IElucHV0SGFuZGxlcihXb3JrZmxvd1Rhc2sgdGFzaywgU2NyaXB0Q29udGV4dCBjb250ZXh0KQogICAgewogICAgICAgIHJldHVybiBUYXNrLkZyb21SZXN1bHQobmV3IFNjcmlwdFJlc3BvbnNlKCkpOwogICAgfQoKICAgIHB1YmxpYyBhc3luYyBUYXNrPFNjcmlwdFJlc3BvbnNlPiBPdXRwdXRIYW5kbGVyKFNjcmlwdENvbnRleHQgY29udGV4dCkKICAgIHsKICAgICAgICB0cnkKICAgICAgICB7CiAgICAgICAgICAgIHZhciBjdXJyZW50UmVhZHlDb3VudCA9IChpbnQpKGNvbnRleHQuSW5zdGFuY2U/LkRhdGE/LnJlYWR5Q291bnQgPz8gMCk7CiAgICAgICAgICAgIHZhciB0cmFuc2l0aW9uRGF0YSA9IGNvbnRleHQuQm9keTsKICAgICAgICAgICAgCiAgICAgICAgICAgIC8vIFVzaW5nIE1vY2tvb24gY29udHJhY3Qgc3RydWN0dXJlIC0gY29udHJhY3RJZCBpbnN0ZWFkIG9mIGRvY3VtZW50SWQKICAgICAgICAgICAgcmV0dXJuIG5ldyBTY3JpcHRSZXNwb25zZQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBLZXkgPSAicmVhZHktY291bnQtaW5jcmVtZW50ZWQiLAogICAgICAgICAgICAgICAgRGF0YSA9IG5ldwogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIHJlYWR5Q291bnQgPSBjdXJyZW50UmVhZHlDb3VudCArIDEsCiAgICAgICAgICAgICAgICAgICAgbGFzdFJlYWR5Q29udHJhY3RJZCA9IHRyYW5zaXRpb25EYXRhPy5jb250cmFjdElkLAogICAgICAgICAgICAgICAgICAgIGxhc3RSZWFkeUNvbnRyYWN0TmFtZSA9IHRyYW5zaXRpb25EYXRhPy5jb250cmFjdE5hbWUsCiAgICAgICAgICAgICAgICAgICAgbGFzdFJlYWR5QXQgPSBEYXRlVGltZS5VdGNOb3cKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICBUYWdzID0gbmV3W10geyAiY29udHJhY3QiLCAiZG9jdW1lbnQtcmVhZHkiIH0KICAgICAgICAgICAgfTsKICAgICAgICB9CiAgICAgICAgY2F0Y2ggKEV4Y2VwdGlvbiBleCkKICAgICAgICB7CiAgICAgICAgICAgIHJldHVybiBuZXcgU2NyaXB0UmVzcG9uc2UKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgS2V5ID0gImluY3JlbWVudC1yZWFkeS1lcnJvciIsCiAgICAgICAgICAgICAgICBEYXRhID0gbmV3IHsgZXJyb3IgPSBleC5NZXNzYWdlIH0KICAgICAgICAgICAgfTsKICAgICAgICB9CiAgICB9Cn0KCg==" + } + } + ] + } + ] + }, + { + "key": "check-all-ready", + "stateType": 2, + "subType": 0, + "versionStrategy": "Minor", + "labels": [ + { + "language": "en-US", + "label": "Check All Documents Ready" + }, + { + "language": "tr-TR", + "label": "Tüm Dökümanlar Hazır mı Kontrol Et" + } + ], + "view": null, + "subFlow": null, + "onEntries": [], + "onExits": [], + "transitions": [ + { + "key": "has-more-documents", + "target": "process-next-document", + "triggerType": 1, + "versionStrategy": "Minor", + "labels": [ + { + "language": "en-US", + "label": "Has More Documents" + }, + { + "language": "tr-TR", + "label": "Daha Fazla Döküman Var" + } + ], + "schema": null, + "rule": { + "location": "./src/HasMoreDocumentsRule.csx", + "code": "dXNpbmcgU3lzdGVtLlRocmVhZGluZy5UYXNrczsKdXNpbmcgQkJULldvcmtmbG93LlNjcmlwdGluZzsKCi8vLyA8c3VtbWFyeT4KLy8vIEhhcyBNb3JlIERvY3VtZW50cyBSdWxlIC0gQ2hlY2tzIGlmIHRoZXJlIGFyZSBtb3JlIGRvY3VtZW50cyB0byBwcm9jZXNzCi8vLyA8L3N1bW1hcnk+CnB1YmxpYyBjbGFzcyBIYXNNb3JlRG9jdW1lbnRzUnVsZSA6IElDb25kaXRpb25NYXBwaW5nCnsKICAgIHB1YmxpYyBhc3luYyBUYXNrPGJvb2w+IEhhbmRsZXIoU2NyaXB0Q29udGV4dCBjb250ZXh0KQogICAgewogICAgICAgIHRyeQogICAgICAgIHsKICAgICAgICAgICAgdmFyIGN1cnJlbnRJbmRleCA9IChpbnQpKGNvbnRleHQuSW5zdGFuY2U/LkRhdGE/LmN1cnJlbnREb2N1bWVudEluZGV4ID8/IDApOwogICAgICAgICAgICB2YXIgdG90YWxEb2N1bWVudHMgPSAoaW50KShjb250ZXh0Lkluc3RhbmNlPy5EYXRhPy50b3RhbERvY3VtZW50cyA/PyAwKTsKICAgICAgICAgICAgCiAgICAgICAgICAgIC8vIElmIGN1cnJlbnQgaW5kZXggaXMgbGVzcyB0aGFuIHRvdGFsLCB0aGVyZSBhcmUgbW9yZSBkb2N1bWVudHMKICAgICAgICAgICAgcmV0dXJuIGN1cnJlbnRJbmRleCA8IHRvdGFsRG9jdW1lbnRzOwogICAgICAgIH0KICAgICAgICBjYXRjaCAoRXhjZXB0aW9uKQogICAgICAgIHsKICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgIH0KICAgIH0KfQoK" + }, + "timer": null, + "view": null, + "onExecutionTasks": [] + }, + { + "key": "all-documents-ready", + "target": "all-ready", + "triggerType": 1, + "versionStrategy": "Minor", + "labels": [ + { + "language": "en-US", + "label": "All Documents Ready" + }, + { + "language": "tr-TR", + "label": "Tüm Dökümanlar Hazır" + } + ], + "schema": null, + "rule": { + "location": "./src/AllDocumentsReadyRule.csx", + "code": "dXNpbmcgU3lzdGVtLlRocmVhZGluZy5UYXNrczsKdXNpbmcgQkJULldvcmtmbG93LlNjcmlwdGluZzsKCi8vLyA8c3VtbWFyeT4KLy8vIEFsbCBEb2N1bWVudHMgUmVhZHkgUnVsZSAtIENoZWNrcyBpZiBhbGwgZG9jdW1lbnRzIGFyZSByZWFkeQovLy8gPC9zdW1tYXJ5PgpwdWJsaWMgY2xhc3MgQWxsRG9jdW1lbnRzUmVhZHlSdWxlIDogSUNvbmRpdGlvbk1hcHBpbmcKewogICAgcHVibGljIGFzeW5jIFRhc2s8Ym9vbD4gSGFuZGxlcihTY3JpcHRDb250ZXh0IGNvbnRleHQpCiAgICB7CiAgICAgICAgdHJ5CiAgICAgICAgewogICAgICAgICAgICB2YXIgY3VycmVudEluZGV4ID0gKGludCkoY29udGV4dC5JbnN0YW5jZT8uRGF0YT8uY3VycmVudERvY3VtZW50SW5kZXggPz8gMCk7CiAgICAgICAgICAgIHZhciB0b3RhbERvY3VtZW50cyA9IChpbnQpKGNvbnRleHQuSW5zdGFuY2U/LkRhdGE/LnRvdGFsRG9jdW1lbnRzID8/IDApOwogICAgICAgICAgICAKICAgICAgICAgICAgLy8gQWxsIGRvY3VtZW50cyBhcmUgcHJvY2Vzc2VkIChzdGFydGVkKSB3aGVuIGN1cnJlbnQgaW5kZXggZXF1YWxzIHRvdGFsCiAgICAgICAgICAgIHJldHVybiBjdXJyZW50SW5kZXggPj0gdG90YWxEb2N1bWVudHM7CiAgICAgICAgfQogICAgICAgIGNhdGNoIChFeGNlcHRpb24pCiAgICAgICAgewogICAgICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgICB9CiAgICB9Cn0KCg==" + }, + "timer": null, + "view": null, + "onExecutionTasks": [] + } + ] + }, + { + "key": "all-ready", + "stateType": 2, + "subType": 0, + "versionStrategy": "Minor", + "labels": [ + { + "language": "en-US", + "label": "All Documents Ready - Waiting for Approvals" + }, + { + "language": "tr-TR", + "label": "Tüm Dökümanlar Hazır - Onay Bekliyor" + } + ], + "view": null, + "subFlow": null, + "onEntries": [], + "onExits": [], + "transitions": [ + { + "key": "document-approved", + "target": "check-all-approved", + "triggerType": 0, + "versionStrategy": "Minor", + "labels": [ + { + "language": "en-US", + "label": "Document Approved" + }, + { + "language": "tr-TR", + "label": "Döküman Onaylandı" + } + ], + "schema": null, + "rule": null, + "timer": null, + "view": null, + "onExecutionTasks": [ + { + "order": 1, + "task": { + "key": "script-task", + "domain": "core", + "version": "1.0.0", + "flow": "sys-tasks" + }, + "mapping": { + "location": "./src/IncrementApprovedCountMapping.csx", + "code": "dXNpbmcgU3lzdGVtOwp1c2luZyBTeXN0ZW0uVGhyZWFkaW5nLlRhc2tzOwp1c2luZyBCQlQuV29ya2Zsb3cuRGVmaW5pdGlvbnM7CnVzaW5nIEJCVC5Xb3JrZmxvdy5TY3JpcHRpbmc7CgovLy8gPHN1bW1hcnk+Ci8vLyBJbmNyZW1lbnQgQXBwcm92ZWQgQ291bnQgTWFwcGluZyAtIEluY3JlbWVudHMgdGhlIGFwcHJvdmVkIGRvY3VtZW50IGNvdW50ZXIKLy8vIDwvc3VtbWFyeT4KcHVibGljIGNsYXNzIEluY3JlbWVudEFwcHJvdmVkQ291bnRNYXBwaW5nIDogSU1hcHBpbmcKewogICAgcHVibGljIFRhc2s8U2NyaXB0UmVzcG9uc2U+IElucHV0SGFuZGxlcihXb3JrZmxvd1Rhc2sgdGFzaywgU2NyaXB0Q29udGV4dCBjb250ZXh0KQogICAgewogICAgICAgIHJldHVybiBUYXNrLkZyb21SZXN1bHQobmV3IFNjcmlwdFJlc3BvbnNlKCkpOwogICAgfQoKICAgIHB1YmxpYyBhc3luYyBUYXNrPFNjcmlwdFJlc3BvbnNlPiBPdXRwdXRIYW5kbGVyKFNjcmlwdENvbnRleHQgY29udGV4dCkKICAgIHsKICAgICAgICB0cnkKICAgICAgICB7CiAgICAgICAgICAgIHZhciBjdXJyZW50QXBwcm92ZWRDb3VudCA9IChpbnQpKGNvbnRleHQuSW5zdGFuY2U/LkRhdGE/LmFwcHJvdmVkQ291bnQgPz8gMCk7CiAgICAgICAgICAgIHZhciB0cmFuc2l0aW9uRGF0YSA9IGNvbnRleHQuQm9keTsKICAgICAgICAgICAgCiAgICAgICAgICAgIC8vIFVzaW5nIE1vY2tvb24gY29udHJhY3Qgc3RydWN0dXJlIC0gY29udHJhY3RJZCBpbnN0ZWFkIG9mIGRvY3VtZW50SWQKICAgICAgICAgICAgcmV0dXJuIG5ldyBTY3JpcHRSZXNwb25zZQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBLZXkgPSAiYXBwcm92ZWQtY291bnQtaW5jcmVtZW50ZWQiLAogICAgICAgICAgICAgICAgRGF0YSA9IG5ldwogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIGFwcHJvdmVkQ291bnQgPSBjdXJyZW50QXBwcm92ZWRDb3VudCArIDEsCiAgICAgICAgICAgICAgICAgICAgbGFzdEFwcHJvdmVkQ29udHJhY3RJZCA9IHRyYW5zaXRpb25EYXRhPy5jb250cmFjdElkLAogICAgICAgICAgICAgICAgICAgIGxhc3RBcHByb3ZlZENvbnRyYWN0TmFtZSA9IHRyYW5zaXRpb25EYXRhPy5jb250cmFjdE5hbWUsCiAgICAgICAgICAgICAgICAgICAgbGFzdEFwcHJvdmVkQXQgPSBEYXRlVGltZS5VdGNOb3cKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICBUYWdzID0gbmV3W10geyAiY29udHJhY3QiLCAiZG9jdW1lbnQtYXBwcm92ZWQiIH0KICAgICAgICAgICAgfTsKICAgICAgICB9CiAgICAgICAgY2F0Y2ggKEV4Y2VwdGlvbiBleCkKICAgICAgICB7CiAgICAgICAgICAgIHJldHVybiBuZXcgU2NyaXB0UmVzcG9uc2UKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgS2V5ID0gImluY3JlbWVudC1hcHByb3ZlZC1lcnJvciIsCiAgICAgICAgICAgICAgICBEYXRhID0gbmV3IHsgZXJyb3IgPSBleC5NZXNzYWdlIH0KICAgICAgICAgICAgfTsKICAgICAgICB9CiAgICB9Cn0KCg==" + } + } + ] + }, + { + "key": "document-rejected", + "target": "contract-rejected", + "triggerType": 0, + "versionStrategy": "Minor", + "labels": [ + { + "language": "en-US", + "label": "Document Rejected" + }, + { + "language": "tr-TR", + "label": "Döküman Reddedildi" + } + ], + "schema": null, + "rule": null, + "timer": null, + "view": null, + "onExecutionTasks": [] + } + ] + }, + { + "key": "check-all-approved", + "stateType": 2, + "subType": 0, + "versionStrategy": "Minor", + "labels": [ + { + "language": "en-US", + "label": "Check All Approved" + }, + { + "language": "tr-TR", + "label": "Tüm Onaylar Kontrol Et" + } + ], + "view": null, + "subFlow": null, + "onEntries": [], + "onExits": [], + "transitions": [ + { + "key": "more-approvals-pending", + "target": "all-ready", + "triggerType": 1, + "versionStrategy": "Minor", + "labels": [ + { + "language": "en-US", + "label": "More Approvals Pending" + }, + { + "language": "tr-TR", + "label": "Daha Fazla Onay Bekliyor" + } + ], + "schema": null, + "rule": { + "location": "./src/MoreApprovalsPendingRule.csx", + "code": "dXNpbmcgU3lzdGVtLlRocmVhZGluZy5UYXNrczsKdXNpbmcgQkJULldvcmtmbG93LlNjcmlwdGluZzsKCi8vLyA8c3VtbWFyeT4KLy8vIE1vcmUgQXBwcm92YWxzIFBlbmRpbmcgUnVsZSAtIENoZWNrcyBpZiBtb3JlIGFwcHJvdmFscyBhcmUgcGVuZGluZwovLy8gPC9zdW1tYXJ5PgpwdWJsaWMgY2xhc3MgTW9yZUFwcHJvdmFsc1BlbmRpbmdSdWxlIDogSUNvbmRpdGlvbk1hcHBpbmcKewogICAgcHVibGljIGFzeW5jIFRhc2s8Ym9vbD4gSGFuZGxlcihTY3JpcHRDb250ZXh0IGNvbnRleHQpCiAgICB7CiAgICAgICAgdHJ5CiAgICAgICAgewogICAgICAgICAgICB2YXIgYXBwcm92ZWRDb3VudCA9IChpbnQpKGNvbnRleHQuSW5zdGFuY2U/LkRhdGE/LmFwcHJvdmVkQ291bnQgPz8gMCk7CiAgICAgICAgICAgIHZhciB0b3RhbERvY3VtZW50cyA9IChpbnQpKGNvbnRleHQuSW5zdGFuY2U/LkRhdGE/LnRvdGFsRG9jdW1lbnRzID8/IDApOwogICAgICAgICAgICAKICAgICAgICAgICAgLy8gTW9yZSBhcHByb3ZhbHMgcGVuZGluZyBpZiBhcHByb3ZlZCBjb3VudCBpcyBsZXNzIHRoYW4gdG90YWwKICAgICAgICAgICAgcmV0dXJuIGFwcHJvdmVkQ291bnQgPCB0b3RhbERvY3VtZW50czsKICAgICAgICB9CiAgICAgICAgY2F0Y2ggKEV4Y2VwdGlvbikKICAgICAgICB7CiAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICB9CiAgICB9Cn0KCg==" + }, + "timer": null, + "view": null, + "onExecutionTasks": [] + }, + { + "key": "all-approved", + "target": "contract-completed", + "triggerType": 1, + "versionStrategy": "Minor", + "labels": [ + { + "language": "en-US", + "label": "All Documents Approved" + }, + { + "language": "tr-TR", + "label": "Tüm Dökümanlar Onaylandı" + } + ], + "schema": null, + "rule": { + "location": "./src/AllApprovedRule.csx", + "code": "dXNpbmcgU3lzdGVtLlRocmVhZGluZy5UYXNrczsKdXNpbmcgQkJULldvcmtmbG93LlNjcmlwdGluZzsKCi8vLyA8c3VtbWFyeT4KLy8vIEFsbCBBcHByb3ZlZCBSdWxlIC0gQ2hlY2tzIGlmIGFsbCBkb2N1bWVudHMgYXJlIGFwcHJvdmVkCi8vLyA8L3N1bW1hcnk+CnB1YmxpYyBjbGFzcyBBbGxBcHByb3ZlZFJ1bGUgOiBJQ29uZGl0aW9uTWFwcGluZwp7CiAgICBwdWJsaWMgYXN5bmMgVGFzazxib29sPiBIYW5kbGVyKFNjcmlwdENvbnRleHQgY29udGV4dCkKICAgIHsKICAgICAgICB0cnkKICAgICAgICB7CiAgICAgICAgICAgIHZhciBhcHByb3ZlZENvdW50ID0gKGludCkoY29udGV4dC5JbnN0YW5jZT8uRGF0YT8uYXBwcm92ZWRDb3VudCA/PyAwKTsKICAgICAgICAgICAgdmFyIHRvdGFsRG9jdW1lbnRzID0gKGludCkoY29udGV4dC5JbnN0YW5jZT8uRGF0YT8udG90YWxEb2N1bWVudHMgPz8gMCk7CiAgICAgICAgICAgIAogICAgICAgICAgICAvLyBBbGwgYXBwcm92ZWQgd2hlbiBhcHByb3ZlZCBjb3VudCBlcXVhbHMgdG90YWwgZG9jdW1lbnRzCiAgICAgICAgICAgIHJldHVybiBhcHByb3ZlZENvdW50ID49IHRvdGFsRG9jdW1lbnRzOwogICAgICAgIH0KICAgICAgICBjYXRjaCAoRXhjZXB0aW9uKQogICAgICAgIHsKICAgICAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgICAgfQogICAgfQp9Cgo=" + }, + "timer": null, + "view": null, + "onExecutionTasks": [] + } + ] + }, + { + "key": "contract-completed", + "stateType": 3, + "subType": 1, + "versionStrategy": "Minor", + "labels": [ + { + "language": "en-US", + "label": "Contract Completed" + }, + { + "language": "tr-TR", + "label": "Kontrat Tamamlandı" + } + ], + "view": null, + "subFlow": null, + "onEntries": [], + "onExits": [], + "transitions": [] + }, + { + "key": "contract-rejected", + "stateType": 3, + "subType": 2, + "versionStrategy": "Minor", + "labels": [ + { + "language": "en-US", + "label": "Contract Rejected" + }, + { + "language": "tr-TR", + "label": "Kontrat Reddedildi" + } + ], + "view": null, + "subFlow": null, + "onEntries": [], + "onExits": [], + "transitions": [] + } + ] + } +} \ No newline at end of file diff --git a/core/Workflows/contract/contract-document-subflow.json b/core/Workflows/contract/contract-document-subflow.json new file mode 100644 index 0000000..df14cec --- /dev/null +++ b/core/Workflows/contract/contract-document-subflow.json @@ -0,0 +1,455 @@ +{ + "key": "contract-document-subflow", + "flow": "sys-flows", + "domain": "core", + "version": "1.0.0", + "tags": [ + "contract", + "document", + "subflow", + "render", + "approval" + ], + "attributes": { + "type": "S", + "timeout": null, + "labels": [ + { + "language": "en-US", + "label": "Contract Document Subflow" + }, + { + "language": "tr-TR", + "label": "Kontrat Döküman Alt Akışı" + } + ], + "functions": [], + "features": [], + "extensions": [], + "sharedTransitions": [], + "startTransition": { + "key": "start-document-process", + "target": "render-document", + "triggerType": 0, + "versionStrategy": "Minor", + "labels": [ + { + "language": "en-US", + "label": "Start Document Process" + }, + { + "language": "tr-TR", + "label": "Döküman İşlemini Başlat" + } + ], + "onExecutionTasks": [ + { + "order": 1, + "task": { + "key": "script-task", + "domain": "core", + "version": "1.0.0", + "flow": "sys-tasks" + }, + "mapping": { + "location": "./src/InitDocumentMapping.csx", + "code": "dXNpbmcgU3lzdGVtOwp1c2luZyBTeXN0ZW0uVGhyZWFkaW5nLlRhc2tzOwp1c2luZyBCQlQuV29ya2Zsb3cuRGVmaW5pdGlvbnM7CnVzaW5nIEJCVC5Xb3JrZmxvdy5TY3JpcHRpbmc7CgovLy8gPHN1bW1hcnk+Ci8vLyBJbml0aWFsaXplIERvY3VtZW50IFByb2Nlc3MgTWFwcGluZyAtIFByZXBhcmVzIGRvY3VtZW50IGRhdGEgZm9yIHN1YnByb2Nlc3MKLy8vIDwvc3VtbWFyeT4KcHVibGljIGNsYXNzIEluaXREb2N1bWVudE1hcHBpbmcgOiBJTWFwcGluZwp7CiAgICBwdWJsaWMgVGFzazxTY3JpcHRSZXNwb25zZT4gSW5wdXRIYW5kbGVyKFdvcmtmbG93VGFzayB0YXNrLCBTY3JpcHRDb250ZXh0IGNvbnRleHQpCiAgICB7CiAgICAgICAgcmV0dXJuIFRhc2suRnJvbVJlc3VsdChuZXcgU2NyaXB0UmVzcG9uc2UoKSk7CiAgICB9CgogICAgcHVibGljIGFzeW5jIFRhc2s8U2NyaXB0UmVzcG9uc2U+IE91dHB1dEhhbmRsZXIoU2NyaXB0Q29udGV4dCBjb250ZXh0KQogICAgewogICAgICAgIHRyeQogICAgICAgIHsKICAgICAgICAgICAgdmFyIGlucHV0RGF0YSA9IGNvbnRleHQuSW5zdGFuY2U/LkRhdGE7CiAgICAgICAgICAgIAogICAgICAgICAgICByZXR1cm4gbmV3IFNjcmlwdFJlc3BvbnNlCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIEtleSA9ICJpbml0LWRvY3VtZW50LXN1Y2Nlc3MiLAogICAgICAgICAgICAgICAgRGF0YSA9IG5ldwogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIHBhcmVudEluc3RhbmNlSWQgPSBpbnB1dERhdGE/LnBhcmVudEluc3RhbmNlSWQsCiAgICAgICAgICAgICAgICAgICAgcGFyZW50SW5zdGFuY2VLZXkgPSBpbnB1dERhdGE/LnBhcmVudEluc3RhbmNlS2V5LAogICAgICAgICAgICAgICAgICAgIHBhcmVudFdvcmtmbG93S2V5ID0gaW5wdXREYXRhPy5wYXJlbnRXb3JrZmxvd0tleSwKICAgICAgICAgICAgICAgICAgICBkb2N1bWVudCA9IGlucHV0RGF0YT8uZG9jdW1lbnQsCiAgICAgICAgICAgICAgICAgICAgZG9jdW1lbnRJbmRleCA9IGlucHV0RGF0YT8uZG9jdW1lbnRJbmRleCwKICAgICAgICAgICAgICAgICAgICBncm91cENvZGUgPSBpbnB1dERhdGE/Lmdyb3VwQ29kZSwKICAgICAgICAgICAgICAgICAgICBwcm9jZXNzU3RhcnRlZEF0ID0gRGF0ZVRpbWUuVXRjTm93LAogICAgICAgICAgICAgICAgICAgIHJlbmRlclN0YXR1cyA9ICJwZW5kaW5nIiwKICAgICAgICAgICAgICAgICAgICBhcHByb3ZhbFN0YXR1cyA9ICJwZW5kaW5nIgogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgIFRhZ3MgPSBuZXdbXSB7ICJjb250cmFjdCIsICJkb2N1bWVudCIsICJpbml0aWFsaXplZCIgfQogICAgICAgICAgICB9OwogICAgICAgIH0KICAgICAgICBjYXRjaCAoRXhjZXB0aW9uIGV4KQogICAgICAgIHsKICAgICAgICAgICAgcmV0dXJuIG5ldyBTY3JpcHRSZXNwb25zZQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBLZXkgPSAiaW5pdC1kb2N1bWVudC1lcnJvciIsCiAgICAgICAgICAgICAgICBEYXRhID0gbmV3IHsgZXJyb3IgPSBleC5NZXNzYWdlIH0KICAgICAgICAgICAgfTsKICAgICAgICB9CiAgICB9Cn0KCg==" + } + } + ] + }, + "states": [ + { + "key": "render-document", + "stateType": 1, + "subType": 0, + "versionStrategy": "Minor", + "labels": [ + { + "language": "en-US", + "label": "Render Document" + }, + { + "language": "tr-TR", + "label": "Dökümanı Hazırla" + } + ], + "view": null, + "subFlow": null, + "onEntries": [ + { + "order": 1, + "task": { + "key": "render-document", + "domain": "core", + "version": "1.0.0", + "flow": "sys-tasks" + }, + "mapping": { + "location": "./src/RenderDocumentMapping.csx", + "code": "dXNpbmcgU3lzdGVtOwp1c2luZyBTeXN0ZW0uVGhyZWFkaW5nLlRhc2tzOwp1c2luZyBCQlQuV29ya2Zsb3cuRGVmaW5pdGlvbnM7CnVzaW5nIEJCVC5Xb3JrZmxvdy5TY3JpcHRpbmc7CgovLy8gPHN1bW1hcnk+Ci8vLyBSZW5kZXIgRG9jdW1lbnQgTWFwcGluZyAtIFJlbmRlcnMgZG9jdW1lbnQgdmlhIEhUVFAgQVBJCi8vLyA8L3N1bW1hcnk+CnB1YmxpYyBjbGFzcyBSZW5kZXJEb2N1bWVudE1hcHBpbmcgOiBJTWFwcGluZwp7CiAgICBwdWJsaWMgVGFzazxTY3JpcHRSZXNwb25zZT4gSW5wdXRIYW5kbGVyKFdvcmtmbG93VGFzayB0YXNrLCBTY3JpcHRDb250ZXh0IGNvbnRleHQpCiAgICB7CiAgICAgICAgdHJ5CiAgICAgICAgewogICAgICAgICAgICB2YXIgaHR0cFRhc2sgPSB0YXNrIGFzIEh0dHBUYXNrOwogICAgICAgICAgICBpZiAoaHR0cFRhc2sgPT0gbnVsbCkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgdGhyb3cgbmV3IEludmFsaWRPcGVyYXRpb25FeGNlcHRpb24oIlRhc2sgbXVzdCBiZSBhbiBIdHRwVGFzayIpOwogICAgICAgICAgICB9CgogICAgICAgICAgICB2YXIgZG9jdW1lbnQgPSBjb250ZXh0Lkluc3RhbmNlPy5EYXRhPy5kb2N1bWVudDsKICAgICAgICAgICAgdmFyIGdyb3VwQ29kZSA9IGNvbnRleHQuSW5zdGFuY2U/LkRhdGE/Lmdyb3VwQ29kZT8uVG9TdHJpbmcoKSA/PyAiIjsKICAgICAgICAgICAgCiAgICAgICAgICAgIC8vIE1vY2tvb24gQVBJIGNvbnRyYWN0IHN0cnVjdHVyZTogY29udHJhY3RJZCwgY29udHJhY3RUeXBlLCBjb250cmFjdE5hbWUsIHRlbXBsYXRlSWQsIGNvbnRyYWN0RGF0YQogICAgICAgICAgICB2YXIgcmVxdWVzdEJvZHkgPSBuZXcKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgZ3JvdXBDb2RlID0gZ3JvdXBDb2RlLAogICAgICAgICAgICAgICAgY29udHJhY3RJZCA9IGRvY3VtZW50Py5jb250cmFjdElkLAogICAgICAgICAgICAgICAgY29udHJhY3RUeXBlID0gZG9jdW1lbnQ/LmNvbnRyYWN0VHlwZSwKICAgICAgICAgICAgICAgIGNvbnRyYWN0TmFtZSA9IGRvY3VtZW50Py5jb250cmFjdE5hbWUsCiAgICAgICAgICAgICAgICB0ZW1wbGF0ZUlkID0gZG9jdW1lbnQ/LnRlbXBsYXRlSWQsCiAgICAgICAgICAgICAgICBjb250cmFjdERhdGEgPSBkb2N1bWVudD8uY29udHJhY3REYXRhID8/IG5ldyB7IH0sCiAgICAgICAgICAgICAgICByZXF1ZXN0SWQgPSBHdWlkLk5ld0d1aWQoKS5Ub1N0cmluZygpLAogICAgICAgICAgICAgICAgdGltZXN0YW1wID0gRGF0ZVRpbWUuVXRjTm93CiAgICAgICAgICAgIH07CgogICAgICAgICAgICBodHRwVGFzay5TZXRCb2R5KHJlcXVlc3RCb2R5KTsKCiAgICAgICAgICAgIHZhciBoZWFkZXJzID0gbmV3IERpY3Rpb25hcnk8c3RyaW5nLCBzdHJpbmc/PgogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBbIkNvbnRlbnQtVHlwZSJdID0gImFwcGxpY2F0aW9uL2pzb24iLAogICAgICAgICAgICAgICAgWyJYLVJlcXVlc3QtSWQiXSA9IEd1aWQuTmV3R3VpZCgpLlRvU3RyaW5nKCksCiAgICAgICAgICAgICAgICBbIlgtQ29udHJhY3QtSWQiXSA9IGRvY3VtZW50Py5jb250cmFjdElkPy5Ub1N0cmluZygpLAogICAgICAgICAgICAgICAgWyJYLUNvcnJlbGF0aW9uLUlkIl0gPSBjb250ZXh0Lkluc3RhbmNlLklkLlRvU3RyaW5nKCkKICAgICAgICAgICAgfTsKICAgICAgICAgICAgaHR0cFRhc2suU2V0SGVhZGVycyhoZWFkZXJzKTsKCiAgICAgICAgICAgIHJldHVybiBUYXNrLkZyb21SZXN1bHQobmV3IFNjcmlwdFJlc3BvbnNlKCkpOwogICAgICAgIH0KICAgICAgICBjYXRjaCAoRXhjZXB0aW9uIGV4KQogICAgICAgIHsKICAgICAgICAgICAgcmV0dXJuIFRhc2suRnJvbVJlc3VsdChuZXcgU2NyaXB0UmVzcG9uc2UKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgS2V5ID0gInJlbmRlci1pbnB1dC1lcnJvciIsCiAgICAgICAgICAgICAgICBEYXRhID0gbmV3IHsgZXJyb3IgPSBleC5NZXNzYWdlIH0KICAgICAgICAgICAgfSk7CiAgICAgICAgfQogICAgfQoKICAgIHB1YmxpYyBhc3luYyBUYXNrPFNjcmlwdFJlc3BvbnNlPiBPdXRwdXRIYW5kbGVyKFNjcmlwdENvbnRleHQgY29udGV4dCkKICAgIHsKICAgICAgICB0cnkKICAgICAgICB7CiAgICAgICAgICAgIHZhciByZXNwb25zZSA9IGNvbnRleHQuQm9keTsKICAgICAgICAgICAgdmFyIHN0YXR1c0NvZGUgPSByZXNwb25zZT8uc3RhdHVzQ29kZSA/PyA1MDA7CgogICAgICAgICAgICBpZiAoc3RhdHVzQ29kZSA+PSAyMDAgJiYgc3RhdHVzQ29kZSA8IDMwMCkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgLy8gTW9ja29vbiBBUEkgcmV0dXJuczogZG9jdW1lbnRJZCwgZG9jdW1lbnRVcmwsIGRvY3VtZW50U2l6ZSwgcGFnZUNvdW50LCBjaGVja3N1bSwgZXhwaXJlc0F0LCByZW5kZXJlZEF0LCBmb3JtYXQsIHRlbXBsYXRlVmVyc2lvbgogICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBTY3JpcHRSZXNwb25zZQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIEtleSA9ICJyZW5kZXItc3VjY2VzcyIsCiAgICAgICAgICAgICAgICAgICAgRGF0YSA9IG5ldwogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgcmVuZGVyU3RhdHVzID0gInN1Y2Nlc3MiLAogICAgICAgICAgICAgICAgICAgICAgICBkb2N1bWVudElkID0gcmVzcG9uc2U/LmRhdGE/LmRhdGE/LmRvY3VtZW50SWQsCiAgICAgICAgICAgICAgICAgICAgICAgIGRvY3VtZW50VXJsID0gcmVzcG9uc2U/LmRhdGE/LmRhdGE/LmRvY3VtZW50VXJsLAogICAgICAgICAgICAgICAgICAgICAgICBkb2N1bWVudFNpemUgPSByZXNwb25zZT8uZGF0YT8uZGF0YT8uZG9jdW1lbnRTaXplLAogICAgICAgICAgICAgICAgICAgICAgICBwYWdlQ291bnQgPSByZXNwb25zZT8uZGF0YT8uZGF0YT8ucGFnZUNvdW50LAogICAgICAgICAgICAgICAgICAgICAgICBjaGVja3N1bSA9IHJlc3BvbnNlPy5kYXRhPy5kYXRhPy5jaGVja3N1bSwKICAgICAgICAgICAgICAgICAgICAgICAgZXhwaXJlc0F0ID0gcmVzcG9uc2U/LmRhdGE/LmRhdGE/LmV4cGlyZXNBdCwKICAgICAgICAgICAgICAgICAgICAgICAgZm9ybWF0ID0gcmVzcG9uc2U/LmRhdGE/LmRhdGE/LmZvcm1hdCwKICAgICAgICAgICAgICAgICAgICAgICAgdGVtcGxhdGVWZXJzaW9uID0gcmVzcG9uc2U/LmRhdGE/LmRhdGE/LnRlbXBsYXRlVmVyc2lvbiwKICAgICAgICAgICAgICAgICAgICAgICAgcmVuZGVyZWRBdCA9IHJlc3BvbnNlPy5kYXRhPy5kYXRhPy5yZW5kZXJlZEF0ID8/IERhdGVUaW1lLlV0Y05vdy5Ub1N0cmluZygibyIpCiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICBUYWdzID0gbmV3W10geyAiY29udHJhY3QiLCAiZG9jdW1lbnQiLCAicmVuZGVyZWQiIH0KICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIHJldHVybiBuZXcgU2NyaXB0UmVzcG9uc2UKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgS2V5ID0gInJlbmRlci1mYWlsZWQiLAogICAgICAgICAgICAgICAgRGF0YSA9IG5ldwogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIHJlbmRlclN0YXR1cyA9ICJmYWlsZWQiLAogICAgICAgICAgICAgICAgICAgIGVycm9yID0gcmVzcG9uc2U/LmRhdGE/LmVycm9yPy5tZXNzYWdlID8/IHJlc3BvbnNlPy5lcnJvciA/PyAiRmFpbGVkIHRvIHJlbmRlciBkb2N1bWVudCIsCiAgICAgICAgICAgICAgICAgICAgZXJyb3JDb2RlID0gcmVzcG9uc2U/LmRhdGE/LmVycm9yPy5jb2RlLAogICAgICAgICAgICAgICAgICAgIHN0YXR1c0NvZGUgPSBzdGF0dXNDb2RlLAogICAgICAgICAgICAgICAgICAgIGZhaWxlZEF0ID0gRGF0ZVRpbWUuVXRjTm93CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH07CiAgICAgICAgfQogICAgICAgIGNhdGNoIChFeGNlcHRpb24gZXgpCiAgICAgICAgewogICAgICAgICAgICByZXR1cm4gbmV3IFNjcmlwdFJlc3BvbnNlCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIEtleSA9ICJyZW5kZXItZXhjZXB0aW9uIiwKICAgICAgICAgICAgICAgIERhdGEgPSBuZXcKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICByZW5kZXJTdGF0dXMgPSAiZmFpbGVkIiwKICAgICAgICAgICAgICAgICAgICBlcnJvciA9IGV4Lk1lc3NhZ2UsCiAgICAgICAgICAgICAgICAgICAgZmFpbGVkQXQgPSBEYXRlVGltZS5VdGNOb3cKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfTsKICAgICAgICB9CiAgICB9Cn0KCg==" + } + } + ], + "onExits": [], + "transitions": [ + { + "key": "render-success", + "target": "notify-parent-ready", + "triggerType": 1, + "versionStrategy": "Minor", + "labels": [ + { + "language": "en-US", + "label": "Render Success" + }, + { + "language": "tr-TR", + "label": "Hazırlama Başarılı" + } + ], + "schema": null, + "rule": { + "location": "./src/RenderSuccessRule.csx", + "code": "dXNpbmcgU3lzdGVtLlRocmVhZGluZy5UYXNrczsKdXNpbmcgQkJULldvcmtmbG93LlNjcmlwdGluZzsKCi8vLyA8c3VtbWFyeT4KLy8vIFJlbmRlciBTdWNjZXNzIFJ1bGUgLSBDaGVja3MgaWYgZG9jdW1lbnQgcmVuZGVyIHdhcyBzdWNjZXNzZnVsCi8vLyA8L3N1bW1hcnk+CnB1YmxpYyBjbGFzcyBSZW5kZXJTdWNjZXNzUnVsZSA6IElDb25kaXRpb25NYXBwaW5nCnsKICAgIHB1YmxpYyBhc3luYyBUYXNrPGJvb2w+IEhhbmRsZXIoU2NyaXB0Q29udGV4dCBjb250ZXh0KQogICAgewogICAgICAgIHRyeQogICAgICAgIHsKICAgICAgICAgICAgdmFyIHJlbmRlclN0YXR1cyA9IGNvbnRleHQuSW5zdGFuY2U/LkRhdGE/LnJlbmRlclN0YXR1cz8uVG9TdHJpbmcoKTsKICAgICAgICAgICAgcmV0dXJuIHJlbmRlclN0YXR1cyA9PSAic3VjY2VzcyI7CiAgICAgICAgfQogICAgICAgIGNhdGNoIChFeGNlcHRpb24pCiAgICAgICAgewogICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgfQogICAgfQp9Cgo=" + }, + "timer": null, + "view": null, + "onExecutionTasks": [] + }, + { + "key": "render-failed", + "target": "document-failed", + "triggerType": 1, + "versionStrategy": "Minor", + "labels": [ + { + "language": "en-US", + "label": "Render Failed" + }, + { + "language": "tr-TR", + "label": "Hazırlama Başarısız" + } + ], + "schema": null, + "rule": { + "location": "./src/RenderFailedRule.csx", + "code": "dXNpbmcgU3lzdGVtLlRocmVhZGluZy5UYXNrczsKdXNpbmcgQkJULldvcmtmbG93LlNjcmlwdGluZzsKCi8vLyA8c3VtbWFyeT4KLy8vIFJlbmRlciBGYWlsZWQgUnVsZSAtIENoZWNrcyBpZiBkb2N1bWVudCByZW5kZXIgZmFpbGVkCi8vLyA8L3N1bW1hcnk+CnB1YmxpYyBjbGFzcyBSZW5kZXJGYWlsZWRSdWxlIDogSUNvbmRpdGlvbk1hcHBpbmcKewogICAgcHVibGljIGFzeW5jIFRhc2s8Ym9vbD4gSGFuZGxlcihTY3JpcHRDb250ZXh0IGNvbnRleHQpCiAgICB7CiAgICAgICAgdHJ5CiAgICAgICAgewogICAgICAgICAgICB2YXIgcmVuZGVyU3RhdHVzID0gY29udGV4dC5JbnN0YW5jZT8uRGF0YT8ucmVuZGVyU3RhdHVzPy5Ub1N0cmluZygpOwogICAgICAgICAgICByZXR1cm4gcmVuZGVyU3RhdHVzID09ICJmYWlsZWQiOwogICAgICAgIH0KICAgICAgICBjYXRjaCAoRXhjZXB0aW9uKQogICAgICAgIHsKICAgICAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgICAgfQogICAgfQp9Cgo=" + }, + "timer": null, + "view": null, + "onExecutionTasks": [] + } + ] + }, + { + "key": "notify-parent-ready", + "stateType": 2, + "subType": 0, + "versionStrategy": "Minor", + "labels": [ + { + "language": "en-US", + "label": "Notify Parent - Document Ready" + }, + { + "language": "tr-TR", + "label": "Üst Akışa Bildir - Döküman Hazır" + } + ], + "view": null, + "subFlow": null, + "onEntries": [ + { + "order": 1, + "task": { + "key": "notify-document-ready", + "domain": "core", + "version": "1.0.0", + "flow": "sys-tasks" + }, + "mapping": { + "location": "./src/NotifyDocumentReadyMapping.csx", + "code": "dXNpbmcgU3lzdGVtOwp1c2luZyBTeXN0ZW0uVGhyZWFkaW5nLlRhc2tzOwp1c2luZyBCQlQuV29ya2Zsb3cuRGVmaW5pdGlvbnM7CnVzaW5nIEJCVC5Xb3JrZmxvdy5TY3JpcHRpbmc7CgovLy8gPHN1bW1hcnk+Ci8vLyBOb3RpZnkgRG9jdW1lbnQgUmVhZHkgTWFwcGluZyAtIE5vdGlmaWVzIHBhcmVudCB3b3JrZmxvdyB0aGF0IGRvY3VtZW50IGlzIHJlYWR5Ci8vLyA8L3N1bW1hcnk+CnB1YmxpYyBjbGFzcyBOb3RpZnlEb2N1bWVudFJlYWR5TWFwcGluZyA6IElNYXBwaW5nCnsKICAgIHB1YmxpYyBUYXNrPFNjcmlwdFJlc3BvbnNlPiBJbnB1dEhhbmRsZXIoV29ya2Zsb3dUYXNrIHRhc2ssIFNjcmlwdENvbnRleHQgY29udGV4dCkKICAgIHsKICAgICAgICB0cnkKICAgICAgICB7CiAgICAgICAgICAgIHZhciBkaXJlY3RUcmlnZ2VyVGFzayA9IHRhc2sgYXMgRGlyZWN0VHJpZ2dlclRhc2s7CiAgICAgICAgICAgIGlmIChkaXJlY3RUcmlnZ2VyVGFzayA9PSBudWxsKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSW52YWxpZE9wZXJhdGlvbkV4Y2VwdGlvbigiVGFzayBtdXN0IGJlIGEgRGlyZWN0VHJpZ2dlclRhc2siKTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgLy8gQ29uZmlndXJlIHRhcmdldCB3b3JrZmxvdwogICAgICAgICAgICBkaXJlY3RUcmlnZ2VyVGFzay5TZXREb21haW4oImNvcmUiKTsKICAgICAgICAgICAgZGlyZWN0VHJpZ2dlclRhc2suU2V0RmxvdygiY29udHJhY3QtYXBwcm92YWwtd29ya2Zsb3ciKTsKICAgICAgICAgICAgZGlyZWN0VHJpZ2dlclRhc2suU2V0VHJhbnNpdGlvbk5hbWUoImRvY3VtZW50LXJlYWR5Iik7CiAgICAgICAgICAgIGRpcmVjdFRyaWdnZXJUYXNrLlNldFN5bmModHJ1ZSk7CiAgICAgICAgICAgIAogICAgICAgICAgICAvLyBTZXQgcGFyZW50IGluc3RhbmNlCiAgICAgICAgICAgIHZhciBwYXJlbnRJbnN0YW5jZUlkID0gY29udGV4dC5JbnN0YW5jZT8uRGF0YT8ucGFyZW50SW5zdGFuY2VJZD8uVG9TdHJpbmcoKTsKICAgICAgICAgICAgdmFyIHBhcmVudEluc3RhbmNlS2V5ID0gY29udGV4dC5JbnN0YW5jZT8uRGF0YT8ucGFyZW50SW5zdGFuY2VLZXk/LlRvU3RyaW5nKCk7CiAgICAgICAgICAgIAogICAgICAgICAgICBpZiAoIXN0cmluZy5Jc051bGxPckVtcHR5KHBhcmVudEluc3RhbmNlSWQpKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBkaXJlY3RUcmlnZ2VyVGFzay5TZXRJbnN0YW5jZShwYXJlbnRJbnN0YW5jZUlkKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBpZiAoIXN0cmluZy5Jc051bGxPckVtcHR5KHBhcmVudEluc3RhbmNlS2V5KSkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgZGlyZWN0VHJpZ2dlclRhc2suU2V0S2V5KHBhcmVudEluc3RhbmNlS2V5KTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgLy8gUHJlcGFyZSB0cmFuc2l0aW9uIGJvZHkgLSB1c2luZyBNb2Nrb29uIGNvbnRyYWN0IHN0cnVjdHVyZSAoY29udHJhY3RJZCwgY29udHJhY3ROYW1lLCBjb250cmFjdFR5cGUpCiAgICAgICAgICAgIHZhciB0cmFuc2l0aW9uQm9keSA9IG5ldwogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBjb250cmFjdElkID0gY29udGV4dC5JbnN0YW5jZT8uRGF0YT8uZG9jdW1lbnQ/LmNvbnRyYWN0SWQsCiAgICAgICAgICAgICAgICBjb250cmFjdE5hbWUgPSBjb250ZXh0Lkluc3RhbmNlPy5EYXRhPy5kb2N1bWVudD8uY29udHJhY3ROYW1lLAogICAgICAgICAgICAgICAgY29udHJhY3RUeXBlID0gY29udGV4dC5JbnN0YW5jZT8uRGF0YT8uZG9jdW1lbnQ/LmNvbnRyYWN0VHlwZSwKICAgICAgICAgICAgICAgIGRvY3VtZW50SW5kZXggPSBjb250ZXh0Lkluc3RhbmNlPy5EYXRhPy5kb2N1bWVudEluZGV4LAogICAgICAgICAgICAgICAgc3VicHJvY2Vzc0luc3RhbmNlSWQgPSBjb250ZXh0Lkluc3RhbmNlPy5JZCwKICAgICAgICAgICAgICAgIHN1YnByb2Nlc3NJbnN0YW5jZUtleSA9IGNvbnRleHQuSW5zdGFuY2U/LktleSwKICAgICAgICAgICAgICAgIGRvY3VtZW50VXJsID0gY29udGV4dC5JbnN0YW5jZT8uRGF0YT8uZG9jdW1lbnRVcmwsCiAgICAgICAgICAgICAgICBkb2N1bWVudElkID0gY29udGV4dC5JbnN0YW5jZT8uRGF0YT8uZG9jdW1lbnRJZCwKICAgICAgICAgICAgICAgIHBhZ2VDb3VudCA9IGNvbnRleHQuSW5zdGFuY2U/LkRhdGE/LnBhZ2VDb3VudCwKICAgICAgICAgICAgICAgIHJlYWR5QXQgPSBEYXRlVGltZS5VdGNOb3csCiAgICAgICAgICAgICAgICBzdGF0dXMgPSAicmVhZHkiCiAgICAgICAgICAgIH07CiAgICAgICAgICAgIGRpcmVjdFRyaWdnZXJUYXNrLlNldEJvZHkodHJhbnNpdGlvbkJvZHkpOwoKICAgICAgICAgICAgcmV0dXJuIFRhc2suRnJvbVJlc3VsdChuZXcgU2NyaXB0UmVzcG9uc2UoKSk7CiAgICAgICAgfQogICAgICAgIGNhdGNoIChFeGNlcHRpb24gZXgpCiAgICAgICAgewogICAgICAgICAgICByZXR1cm4gVGFzay5Gcm9tUmVzdWx0KG5ldyBTY3JpcHRSZXNwb25zZQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBLZXkgPSAibm90aWZ5LXJlYWR5LWlucHV0LWVycm9yIiwKICAgICAgICAgICAgICAgIERhdGEgPSBuZXcgeyBlcnJvciA9IGV4Lk1lc3NhZ2UgfQogICAgICAgICAgICB9KTsKICAgICAgICB9CiAgICB9CgogICAgcHVibGljIGFzeW5jIFRhc2s8U2NyaXB0UmVzcG9uc2U+IE91dHB1dEhhbmRsZXIoU2NyaXB0Q29udGV4dCBjb250ZXh0KQogICAgewogICAgICAgIHRyeQogICAgICAgIHsKICAgICAgICAgICAgdmFyIHJlc3BvbnNlID0gY29udGV4dC5Cb2R5OwoKICAgICAgICAgICAgaWYgKHJlc3BvbnNlPy5pc1N1Y2Nlc3MgPT0gdHJ1ZSkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBTY3JpcHRSZXNwb25zZQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIEtleSA9ICJub3RpZnktcmVhZHktc3VjY2VzcyIsCiAgICAgICAgICAgICAgICAgICAgRGF0YSA9IG5ldwogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgcGFyZW50Tm90aWZpZWQgPSB0cnVlLAogICAgICAgICAgICAgICAgICAgICAgICBub3RpZmllZEF0ID0gRGF0ZVRpbWUuVXRjTm93CiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICBUYWdzID0gbmV3W10geyAiY29udHJhY3QiLCAiZG9jdW1lbnQtcmVhZHkiLCAibm90aWZpZWQiIH0KICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIHJldHVybiBuZXcgU2NyaXB0UmVzcG9uc2UKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgS2V5ID0gIm5vdGlmeS1yZWFkeS1mYWlsZWQiLAogICAgICAgICAgICAgICAgRGF0YSA9IG5ldwogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIHBhcmVudE5vdGlmaWVkID0gZmFsc2UsCiAgICAgICAgICAgICAgICAgICAgZXJyb3IgPSByZXNwb25zZT8uZXJyb3JNZXNzYWdlID8/ICJGYWlsZWQgdG8gbm90aWZ5IHBhcmVudCIKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfTsKICAgICAgICB9CiAgICAgICAgY2F0Y2ggKEV4Y2VwdGlvbiBleCkKICAgICAgICB7CiAgICAgICAgICAgIHJldHVybiBuZXcgU2NyaXB0UmVzcG9uc2UKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgS2V5ID0gIm5vdGlmeS1yZWFkeS1leGNlcHRpb24iLAogICAgICAgICAgICAgICAgRGF0YSA9IG5ldyB7IGVycm9yID0gZXguTWVzc2FnZSB9CiAgICAgICAgICAgIH07CiAgICAgICAgfQogICAgfQp9Cgo=" + } + } + ], + "onExits": [], + "transitions": [ + { + "key": "notify-ready-completed", + "target": "waiting-for-approval", + "triggerType": 1, + "versionStrategy": "Minor", + "labels": [ + { + "language": "en-US", + "label": "Notification Sent" + }, + { + "language": "tr-TR", + "label": "Bildirim Gönderildi" + } + ], + "schema": null, + "rule": { + "location": "./src/AlwaysTrueRule.csx", + "code": "dXNpbmcgU3lzdGVtLlRocmVhZGluZy5UYXNrczsKdXNpbmcgQkJULldvcmtmbG93LlNjcmlwdGluZzsKCi8vLyA8c3VtbWFyeT4KLy8vIEFsd2F5cyBUcnVlIFJ1bGUgLSBVc2VkIGZvciBhdXRvIHRyYW5zaXRpb25zIHRoYXQgc2hvdWxkIGFsd2F5cyBwcm9jZWVkCi8vLyA8L3N1bW1hcnk+CnB1YmxpYyBjbGFzcyBBbHdheXNUcnVlUnVsZSA6IElDb25kaXRpb25NYXBwaW5nCnsKICAgIHB1YmxpYyBhc3luYyBUYXNrPGJvb2w+IEhhbmRsZXIoU2NyaXB0Q29udGV4dCBjb250ZXh0KQogICAgewogICAgICAgIHJldHVybiB0cnVlOwogICAgfQp9Cgo=" + }, + "timer": null, + "view": null, + "onExecutionTasks": [] + } + ] + }, + { + "key": "waiting-for-approval", + "stateType": 2, + "subType": 0, + "versionStrategy": "Minor", + "labels": [ + { + "language": "en-US", + "label": "Waiting for Approval" + }, + { + "language": "tr-TR", + "label": "Onay Bekliyor" + } + ], + "view": null, + "subFlow": null, + "onEntries": [], + "onExits": [], + "transitions": [ + { + "key": "approve-document", + "target": "notify-parent-approved", + "triggerType": 0, + "versionStrategy": "Minor", + "labels": [ + { + "language": "en-US", + "label": "Approve Document" + }, + { + "language": "tr-TR", + "label": "Dökümanı Onayla" + } + ], + "schema": null, + "rule": null, + "timer": null, + "view": null, + "onExecutionTasks": [] + }, + { + "key": "reject-document", + "target": "notify-parent-rejected", + "triggerType": 0, + "versionStrategy": "Minor", + "labels": [ + { + "language": "en-US", + "label": "Reject Document" + }, + { + "language": "tr-TR", + "label": "Dökümanı Reddet" + } + ], + "schema": null, + "rule": null, + "timer": null, + "view": null, + "onExecutionTasks": [] + } + ] + }, + { + "key": "notify-parent-approved", + "stateType": 2, + "subType": 0, + "versionStrategy": "Minor", + "labels": [ + { + "language": "en-US", + "label": "Notify Parent - Approved" + }, + { + "language": "tr-TR", + "label": "Üst Akışa Bildir - Onaylandı" + } + ], + "view": null, + "subFlow": null, + "onEntries": [ + { + "order": 1, + "task": { + "key": "notify-document-approved", + "domain": "core", + "version": "1.0.0", + "flow": "sys-tasks" + }, + "mapping": { + "location": "./src/NotifyDocumentApprovedMapping.csx", + "code": "dXNpbmcgU3lzdGVtOwp1c2luZyBTeXN0ZW0uVGhyZWFkaW5nLlRhc2tzOwp1c2luZyBCQlQuV29ya2Zsb3cuRGVmaW5pdGlvbnM7CnVzaW5nIEJCVC5Xb3JrZmxvdy5TY3JpcHRpbmc7CgovLy8gPHN1bW1hcnk+Ci8vLyBOb3RpZnkgRG9jdW1lbnQgQXBwcm92ZWQgTWFwcGluZyAtIE5vdGlmaWVzIHBhcmVudCB3b3JrZmxvdyB0aGF0IGRvY3VtZW50IGlzIGFwcHJvdmVkCi8vLyA8L3N1bW1hcnk+CnB1YmxpYyBjbGFzcyBOb3RpZnlEb2N1bWVudEFwcHJvdmVkTWFwcGluZyA6IElNYXBwaW5nCnsKICAgIHB1YmxpYyBUYXNrPFNjcmlwdFJlc3BvbnNlPiBJbnB1dEhhbmRsZXIoV29ya2Zsb3dUYXNrIHRhc2ssIFNjcmlwdENvbnRleHQgY29udGV4dCkKICAgIHsKICAgICAgICB0cnkKICAgICAgICB7CiAgICAgICAgICAgIHZhciBkaXJlY3RUcmlnZ2VyVGFzayA9IHRhc2sgYXMgRGlyZWN0VHJpZ2dlclRhc2s7CiAgICAgICAgICAgIGlmIChkaXJlY3RUcmlnZ2VyVGFzayA9PSBudWxsKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSW52YWxpZE9wZXJhdGlvbkV4Y2VwdGlvbigiVGFzayBtdXN0IGJlIGEgRGlyZWN0VHJpZ2dlclRhc2siKTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgLy8gQ29uZmlndXJlIHRhcmdldCB3b3JrZmxvdwogICAgICAgICAgICBkaXJlY3RUcmlnZ2VyVGFzay5TZXREb21haW4oImNvcmUiKTsKICAgICAgICAgICAgZGlyZWN0VHJpZ2dlclRhc2suU2V0RmxvdygiY29udHJhY3QtYXBwcm92YWwtd29ya2Zsb3ciKTsKICAgICAgICAgICAgZGlyZWN0VHJpZ2dlclRhc2suU2V0VHJhbnNpdGlvbk5hbWUoImRvY3VtZW50LWFwcHJvdmVkIik7CiAgICAgICAgICAgIGRpcmVjdFRyaWdnZXJUYXNrLlNldFN5bmModHJ1ZSk7CiAgICAgICAgICAgIAogICAgICAgICAgICAvLyBTZXQgcGFyZW50IGluc3RhbmNlCiAgICAgICAgICAgIHZhciBwYXJlbnRJbnN0YW5jZUlkID0gY29udGV4dC5JbnN0YW5jZT8uRGF0YT8ucGFyZW50SW5zdGFuY2VJZD8uVG9TdHJpbmcoKTsKICAgICAgICAgICAgdmFyIHBhcmVudEluc3RhbmNlS2V5ID0gY29udGV4dC5JbnN0YW5jZT8uRGF0YT8ucGFyZW50SW5zdGFuY2VLZXk/LlRvU3RyaW5nKCk7CiAgICAgICAgICAgIAogICAgICAgICAgICBpZiAoIXN0cmluZy5Jc051bGxPckVtcHR5KHBhcmVudEluc3RhbmNlSWQpKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBkaXJlY3RUcmlnZ2VyVGFzay5TZXRJbnN0YW5jZShwYXJlbnRJbnN0YW5jZUlkKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBpZiAoIXN0cmluZy5Jc051bGxPckVtcHR5KHBhcmVudEluc3RhbmNlS2V5KSkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgZGlyZWN0VHJpZ2dlclRhc2suU2V0S2V5KHBhcmVudEluc3RhbmNlS2V5KTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgLy8gUHJlcGFyZSB0cmFuc2l0aW9uIGJvZHkgLSB1c2luZyBNb2Nrb29uIGNvbnRyYWN0IHN0cnVjdHVyZSAoY29udHJhY3RJZCwgY29udHJhY3ROYW1lLCBjb250cmFjdFR5cGUpCiAgICAgICAgICAgIHZhciB0cmFuc2l0aW9uQm9keSA9IG5ldwogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBjb250cmFjdElkID0gY29udGV4dC5JbnN0YW5jZT8uRGF0YT8uZG9jdW1lbnQ/LmNvbnRyYWN0SWQsCiAgICAgICAgICAgICAgICBjb250cmFjdE5hbWUgPSBjb250ZXh0Lkluc3RhbmNlPy5EYXRhPy5kb2N1bWVudD8uY29udHJhY3ROYW1lLAogICAgICAgICAgICAgICAgY29udHJhY3RUeXBlID0gY29udGV4dC5JbnN0YW5jZT8uRGF0YT8uZG9jdW1lbnQ/LmNvbnRyYWN0VHlwZSwKICAgICAgICAgICAgICAgIGRvY3VtZW50SW5kZXggPSBjb250ZXh0Lkluc3RhbmNlPy5EYXRhPy5kb2N1bWVudEluZGV4LAogICAgICAgICAgICAgICAgc3VicHJvY2Vzc0luc3RhbmNlSWQgPSBjb250ZXh0Lkluc3RhbmNlPy5JZCwKICAgICAgICAgICAgICAgIHN1YnByb2Nlc3NJbnN0YW5jZUtleSA9IGNvbnRleHQuSW5zdGFuY2U/LktleSwKICAgICAgICAgICAgICAgIGFwcHJvdmVkQXQgPSBEYXRlVGltZS5VdGNOb3csCiAgICAgICAgICAgICAgICBhcHByb3ZlZEJ5ID0gY29udGV4dC5Cb2R5Py5hcHByb3ZlZEJ5ID8/ICJ1c2VyIiwKICAgICAgICAgICAgICAgIHN0YXR1cyA9ICJhcHByb3ZlZCIKICAgICAgICAgICAgfTsKICAgICAgICAgICAgZGlyZWN0VHJpZ2dlclRhc2suU2V0Qm9keSh0cmFuc2l0aW9uQm9keSk7CgogICAgICAgICAgICByZXR1cm4gVGFzay5Gcm9tUmVzdWx0KG5ldyBTY3JpcHRSZXNwb25zZSgpKTsKICAgICAgICB9CiAgICAgICAgY2F0Y2ggKEV4Y2VwdGlvbiBleCkKICAgICAgICB7CiAgICAgICAgICAgIHJldHVybiBUYXNrLkZyb21SZXN1bHQobmV3IFNjcmlwdFJlc3BvbnNlCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIEtleSA9ICJub3RpZnktYXBwcm92ZWQtaW5wdXQtZXJyb3IiLAogICAgICAgICAgICAgICAgRGF0YSA9IG5ldyB7IGVycm9yID0gZXguTWVzc2FnZSB9CiAgICAgICAgICAgIH0pOwogICAgICAgIH0KICAgIH0KCiAgICBwdWJsaWMgYXN5bmMgVGFzazxTY3JpcHRSZXNwb25zZT4gT3V0cHV0SGFuZGxlcihTY3JpcHRDb250ZXh0IGNvbnRleHQpCiAgICB7CiAgICAgICAgdHJ5CiAgICAgICAgewogICAgICAgICAgICB2YXIgcmVzcG9uc2UgPSBjb250ZXh0LkJvZHk7CgogICAgICAgICAgICBpZiAocmVzcG9uc2U/LmlzU3VjY2VzcyA9PSB0cnVlKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICByZXR1cm4gbmV3IFNjcmlwdFJlc3BvbnNlCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgS2V5ID0gIm5vdGlmeS1hcHByb3ZlZC1zdWNjZXNzIiwKICAgICAgICAgICAgICAgICAgICBEYXRhID0gbmV3CiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICBwYXJlbnROb3RpZmllZCA9IHRydWUsCiAgICAgICAgICAgICAgICAgICAgICAgIGFwcHJvdmFsU3RhdHVzID0gImFwcHJvdmVkIiwKICAgICAgICAgICAgICAgICAgICAgICAgbm90aWZpZWRBdCA9IERhdGVUaW1lLlV0Y05vdwogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgVGFncyA9IG5ld1tdIHsgImNvbnRyYWN0IiwgImRvY3VtZW50LWFwcHJvdmVkIiwgIm5vdGlmaWVkIiB9CiAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICB9CgogICAgICAgICAgICByZXR1cm4gbmV3IFNjcmlwdFJlc3BvbnNlCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIEtleSA9ICJub3RpZnktYXBwcm92ZWQtZmFpbGVkIiwKICAgICAgICAgICAgICAgIERhdGEgPSBuZXcKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBwYXJlbnROb3RpZmllZCA9IGZhbHNlLAogICAgICAgICAgICAgICAgICAgIGVycm9yID0gcmVzcG9uc2U/LmVycm9yTWVzc2FnZSA/PyAiRmFpbGVkIHRvIG5vdGlmeSBwYXJlbnQiCiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH07CiAgICAgICAgfQogICAgICAgIGNhdGNoIChFeGNlcHRpb24gZXgpCiAgICAgICAgewogICAgICAgICAgICByZXR1cm4gbmV3IFNjcmlwdFJlc3BvbnNlCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIEtleSA9ICJub3RpZnktYXBwcm92ZWQtZXhjZXB0aW9uIiwKICAgICAgICAgICAgICAgIERhdGEgPSBuZXcgeyBlcnJvciA9IGV4Lk1lc3NhZ2UgfQogICAgICAgICAgICB9OwogICAgICAgIH0KICAgIH0KfQoK" + } + } + ], + "onExits": [], + "transitions": [ + { + "key": "approval-notified", + "target": "document-completed", + "triggerType": 1, + "versionStrategy": "Minor", + "labels": [ + { + "language": "en-US", + "label": "Approval Notified" + }, + { + "language": "tr-TR", + "label": "Onay Bildirildi" + } + ], + "schema": null, + "rule": { + "location": "./src/AlwaysTrueRule.csx", + "code": "dXNpbmcgU3lzdGVtLlRocmVhZGluZy5UYXNrczsKdXNpbmcgQkJULldvcmtmbG93LlNjcmlwdGluZzsKCi8vLyA8c3VtbWFyeT4KLy8vIEFsd2F5cyBUcnVlIFJ1bGUgLSBVc2VkIGZvciBhdXRvIHRyYW5zaXRpb25zIHRoYXQgc2hvdWxkIGFsd2F5cyBwcm9jZWVkCi8vLyA8L3N1bW1hcnk+CnB1YmxpYyBjbGFzcyBBbHdheXNUcnVlUnVsZSA6IElDb25kaXRpb25NYXBwaW5nCnsKICAgIHB1YmxpYyBhc3luYyBUYXNrPGJvb2w+IEhhbmRsZXIoU2NyaXB0Q29udGV4dCBjb250ZXh0KQogICAgewogICAgICAgIHJldHVybiB0cnVlOwogICAgfQp9Cgo=" + }, + "timer": null, + "view": null, + "onExecutionTasks": [] + } + ] + }, + { + "key": "notify-parent-rejected", + "stateType": 2, + "subType": 0, + "versionStrategy": "Minor", + "labels": [ + { + "language": "en-US", + "label": "Notify Parent - Rejected" + }, + { + "language": "tr-TR", + "label": "Üst Akışa Bildir - Reddedildi" + } + ], + "view": null, + "subFlow": null, + "onEntries": [ + { + "order": 1, + "task": { + "key": "notify-document-approved", + "domain": "core", + "version": "1.0.0", + "flow": "sys-tasks" + }, + "mapping": { + "location": "./src/NotifyDocumentRejectedMapping.csx", + "code": "dXNpbmcgU3lzdGVtOwp1c2luZyBTeXN0ZW0uVGhyZWFkaW5nLlRhc2tzOwp1c2luZyBCQlQuV29ya2Zsb3cuRGVmaW5pdGlvbnM7CnVzaW5nIEJCVC5Xb3JrZmxvdy5TY3JpcHRpbmc7CgovLy8gPHN1bW1hcnk+Ci8vLyBOb3RpZnkgRG9jdW1lbnQgUmVqZWN0ZWQgTWFwcGluZyAtIE5vdGlmaWVzIHBhcmVudCB3b3JrZmxvdyB0aGF0IGRvY3VtZW50IGlzIHJlamVjdGVkCi8vLyA8L3N1bW1hcnk+CnB1YmxpYyBjbGFzcyBOb3RpZnlEb2N1bWVudFJlamVjdGVkTWFwcGluZyA6IElNYXBwaW5nCnsKICAgIHB1YmxpYyBUYXNrPFNjcmlwdFJlc3BvbnNlPiBJbnB1dEhhbmRsZXIoV29ya2Zsb3dUYXNrIHRhc2ssIFNjcmlwdENvbnRleHQgY29udGV4dCkKICAgIHsKICAgICAgICB0cnkKICAgICAgICB7CiAgICAgICAgICAgIHZhciBkaXJlY3RUcmlnZ2VyVGFzayA9IHRhc2sgYXMgRGlyZWN0VHJpZ2dlclRhc2s7CiAgICAgICAgICAgIGlmIChkaXJlY3RUcmlnZ2VyVGFzayA9PSBudWxsKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSW52YWxpZE9wZXJhdGlvbkV4Y2VwdGlvbigiVGFzayBtdXN0IGJlIGEgRGlyZWN0VHJpZ2dlclRhc2siKTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgLy8gQ29uZmlndXJlIHRhcmdldCB3b3JrZmxvdwogICAgICAgICAgICBkaXJlY3RUcmlnZ2VyVGFzay5TZXREb21haW4oImNvcmUiKTsKICAgICAgICAgICAgZGlyZWN0VHJpZ2dlclRhc2suU2V0RmxvdygiY29udHJhY3QtYXBwcm92YWwtd29ya2Zsb3ciKTsKICAgICAgICAgICAgZGlyZWN0VHJpZ2dlclRhc2suU2V0VHJhbnNpdGlvbk5hbWUoImRvY3VtZW50LXJlamVjdGVkIik7CiAgICAgICAgICAgIGRpcmVjdFRyaWdnZXJUYXNrLlNldFN5bmModHJ1ZSk7CiAgICAgICAgICAgIAogICAgICAgICAgICAvLyBTZXQgcGFyZW50IGluc3RhbmNlCiAgICAgICAgICAgIHZhciBwYXJlbnRJbnN0YW5jZUlkID0gY29udGV4dC5JbnN0YW5jZT8uRGF0YT8ucGFyZW50SW5zdGFuY2VJZD8uVG9TdHJpbmcoKTsKICAgICAgICAgICAgdmFyIHBhcmVudEluc3RhbmNlS2V5ID0gY29udGV4dC5JbnN0YW5jZT8uRGF0YT8ucGFyZW50SW5zdGFuY2VLZXk/LlRvU3RyaW5nKCk7CiAgICAgICAgICAgIAogICAgICAgICAgICBpZiAoIXN0cmluZy5Jc051bGxPckVtcHR5KHBhcmVudEluc3RhbmNlSWQpKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBkaXJlY3RUcmlnZ2VyVGFzay5TZXRJbnN0YW5jZShwYXJlbnRJbnN0YW5jZUlkKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBpZiAoIXN0cmluZy5Jc051bGxPckVtcHR5KHBhcmVudEluc3RhbmNlS2V5KSkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgZGlyZWN0VHJpZ2dlclRhc2suU2V0S2V5KHBhcmVudEluc3RhbmNlS2V5KTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgLy8gUHJlcGFyZSB0cmFuc2l0aW9uIGJvZHkgLSB1c2luZyBNb2Nrb29uIGNvbnRyYWN0IHN0cnVjdHVyZSAoY29udHJhY3RJZCwgY29udHJhY3ROYW1lLCBjb250cmFjdFR5cGUpCiAgICAgICAgICAgIHZhciB0cmFuc2l0aW9uQm9keSA9IG5ldwogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBjb250cmFjdElkID0gY29udGV4dC5JbnN0YW5jZT8uRGF0YT8uZG9jdW1lbnQ/LmNvbnRyYWN0SWQsCiAgICAgICAgICAgICAgICBjb250cmFjdE5hbWUgPSBjb250ZXh0Lkluc3RhbmNlPy5EYXRhPy5kb2N1bWVudD8uY29udHJhY3ROYW1lLAogICAgICAgICAgICAgICAgY29udHJhY3RUeXBlID0gY29udGV4dC5JbnN0YW5jZT8uRGF0YT8uZG9jdW1lbnQ/LmNvbnRyYWN0VHlwZSwKICAgICAgICAgICAgICAgIGRvY3VtZW50SW5kZXggPSBjb250ZXh0Lkluc3RhbmNlPy5EYXRhPy5kb2N1bWVudEluZGV4LAogICAgICAgICAgICAgICAgc3VicHJvY2Vzc0luc3RhbmNlSWQgPSBjb250ZXh0Lkluc3RhbmNlPy5JZCwKICAgICAgICAgICAgICAgIHN1YnByb2Nlc3NJbnN0YW5jZUtleSA9IGNvbnRleHQuSW5zdGFuY2U/LktleSwKICAgICAgICAgICAgICAgIHJlamVjdGVkQXQgPSBEYXRlVGltZS5VdGNOb3csCiAgICAgICAgICAgICAgICByZWplY3RlZEJ5ID0gY29udGV4dC5Cb2R5Py5yZWplY3RlZEJ5ID8/ICJ1c2VyIiwKICAgICAgICAgICAgICAgIHJlamVjdGlvblJlYXNvbiA9IGNvbnRleHQuQm9keT8ucmVhc29uID8/ICJObyByZWFzb24gcHJvdmlkZWQiLAogICAgICAgICAgICAgICAgc3RhdHVzID0gInJlamVjdGVkIgogICAgICAgICAgICB9OwogICAgICAgICAgICBkaXJlY3RUcmlnZ2VyVGFzay5TZXRCb2R5KHRyYW5zaXRpb25Cb2R5KTsKCiAgICAgICAgICAgIHJldHVybiBUYXNrLkZyb21SZXN1bHQobmV3IFNjcmlwdFJlc3BvbnNlKCkpOwogICAgICAgIH0KICAgICAgICBjYXRjaCAoRXhjZXB0aW9uIGV4KQogICAgICAgIHsKICAgICAgICAgICAgcmV0dXJuIFRhc2suRnJvbVJlc3VsdChuZXcgU2NyaXB0UmVzcG9uc2UKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgS2V5ID0gIm5vdGlmeS1yZWplY3RlZC1pbnB1dC1lcnJvciIsCiAgICAgICAgICAgICAgICBEYXRhID0gbmV3IHsgZXJyb3IgPSBleC5NZXNzYWdlIH0KICAgICAgICAgICAgfSk7CiAgICAgICAgfQogICAgfQoKICAgIHB1YmxpYyBhc3luYyBUYXNrPFNjcmlwdFJlc3BvbnNlPiBPdXRwdXRIYW5kbGVyKFNjcmlwdENvbnRleHQgY29udGV4dCkKICAgIHsKICAgICAgICB0cnkKICAgICAgICB7CiAgICAgICAgICAgIHZhciByZXNwb25zZSA9IGNvbnRleHQuQm9keTsKCiAgICAgICAgICAgIGlmIChyZXNwb25zZT8uaXNTdWNjZXNzID09IHRydWUpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHJldHVybiBuZXcgU2NyaXB0UmVzcG9uc2UKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBLZXkgPSAibm90aWZ5LXJlamVjdGVkLXN1Y2Nlc3MiLAogICAgICAgICAgICAgICAgICAgIERhdGEgPSBuZXcKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgIHBhcmVudE5vdGlmaWVkID0gdHJ1ZSwKICAgICAgICAgICAgICAgICAgICAgICAgYXBwcm92YWxTdGF0dXMgPSAicmVqZWN0ZWQiLAogICAgICAgICAgICAgICAgICAgICAgICBub3RpZmllZEF0ID0gRGF0ZVRpbWUuVXRjTm93CiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICBUYWdzID0gbmV3W10geyAiY29udHJhY3QiLCAiZG9jdW1lbnQtcmVqZWN0ZWQiLCAibm90aWZpZWQiIH0KICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIHJldHVybiBuZXcgU2NyaXB0UmVzcG9uc2UKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgS2V5ID0gIm5vdGlmeS1yZWplY3RlZC1mYWlsZWQiLAogICAgICAgICAgICAgICAgRGF0YSA9IG5ldwogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIHBhcmVudE5vdGlmaWVkID0gZmFsc2UsCiAgICAgICAgICAgICAgICAgICAgZXJyb3IgPSByZXNwb25zZT8uZXJyb3JNZXNzYWdlID8/ICJGYWlsZWQgdG8gbm90aWZ5IHBhcmVudCIKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfTsKICAgICAgICB9CiAgICAgICAgY2F0Y2ggKEV4Y2VwdGlvbiBleCkKICAgICAgICB7CiAgICAgICAgICAgIHJldHVybiBuZXcgU2NyaXB0UmVzcG9uc2UKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgS2V5ID0gIm5vdGlmeS1yZWplY3RlZC1leGNlcHRpb24iLAogICAgICAgICAgICAgICAgRGF0YSA9IG5ldyB7IGVycm9yID0gZXguTWVzc2FnZSB9CiAgICAgICAgICAgIH07CiAgICAgICAgfQogICAgfQp9Cgo=" + } + } + ], + "onExits": [], + "transitions": [ + { + "key": "rejection-notified", + "target": "document-rejected", + "triggerType": 1, + "versionStrategy": "Minor", + "labels": [ + { + "language": "en-US", + "label": "Rejection Notified" + }, + { + "language": "tr-TR", + "label": "Red Bildirildi" + } + ], + "schema": null, + "rule": { + "location": "./src/AlwaysTrueRule.csx", + "code": "dXNpbmcgU3lzdGVtLlRocmVhZGluZy5UYXNrczsKdXNpbmcgQkJULldvcmtmbG93LlNjcmlwdGluZzsKCi8vLyA8c3VtbWFyeT4KLy8vIEFsd2F5cyBUcnVlIFJ1bGUgLSBVc2VkIGZvciBhdXRvIHRyYW5zaXRpb25zIHRoYXQgc2hvdWxkIGFsd2F5cyBwcm9jZWVkCi8vLyA8L3N1bW1hcnk+CnB1YmxpYyBjbGFzcyBBbHdheXNUcnVlUnVsZSA6IElDb25kaXRpb25NYXBwaW5nCnsKICAgIHB1YmxpYyBhc3luYyBUYXNrPGJvb2w+IEhhbmRsZXIoU2NyaXB0Q29udGV4dCBjb250ZXh0KQogICAgewogICAgICAgIHJldHVybiB0cnVlOwogICAgfQp9Cgo=" + }, + "timer": null, + "view": null, + "onExecutionTasks": [] + } + ] + }, + { + "key": "document-completed", + "stateType": 3, + "subType": 1, + "versionStrategy": "Minor", + "labels": [ + { + "language": "en-US", + "label": "Document Approved" + }, + { + "language": "tr-TR", + "label": "Döküman Onaylandı" + } + ], + "view": null, + "subFlow": null, + "onEntries": [], + "onExits": [], + "transitions": [] + }, + { + "key": "document-rejected", + "stateType": 3, + "subType": 2, + "versionStrategy": "Minor", + "labels": [ + { + "language": "en-US", + "label": "Document Rejected" + }, + { + "language": "tr-TR", + "label": "Döküman Reddedildi" + } + ], + "view": null, + "subFlow": null, + "onEntries": [], + "onExits": [], + "transitions": [] + }, + { + "key": "document-failed", + "stateType": 3, + "subType": 2, + "versionStrategy": "Minor", + "labels": [ + { + "language": "en-US", + "label": "Document Failed" + }, + { + "language": "tr-TR", + "label": "Döküman Başarısız" + } + ], + "view": null, + "subFlow": null, + "onEntries": [], + "onExits": [], + "transitions": [] + } + ] + } +} \ No newline at end of file diff --git a/core/Workflows/contract/src/AllApprovedRule.csx b/core/Workflows/contract/src/AllApprovedRule.csx new file mode 100644 index 0000000..d685540 --- /dev/null +++ b/core/Workflows/contract/src/AllApprovedRule.csx @@ -0,0 +1,25 @@ +using System.Threading.Tasks; +using BBT.Workflow.Scripting; + +/// +/// All Approved Rule - Checks if all documents are approved +/// +public class AllApprovedRule : IConditionMapping +{ + public async Task Handler(ScriptContext context) + { + try + { + var approvedCount = (int)(context.Instance?.Data?.approvedCount ?? 0); + var totalDocuments = (int)(context.Instance?.Data?.totalDocuments ?? 0); + + // All approved when approved count equals total documents + return approvedCount >= totalDocuments; + } + catch (Exception) + { + return true; + } + } +} + diff --git a/core/Workflows/contract/src/AllDocumentsReadyRule.csx b/core/Workflows/contract/src/AllDocumentsReadyRule.csx new file mode 100644 index 0000000..9678ce0 --- /dev/null +++ b/core/Workflows/contract/src/AllDocumentsReadyRule.csx @@ -0,0 +1,25 @@ +using System.Threading.Tasks; +using BBT.Workflow.Scripting; + +/// +/// All Documents Ready Rule - Checks if all documents are ready +/// +public class AllDocumentsReadyRule : IConditionMapping +{ + public async Task Handler(ScriptContext context) + { + try + { + var currentIndex = (int)(context.Instance?.Data?.currentDocumentIndex ?? 0); + var totalDocuments = (int)(context.Instance?.Data?.totalDocuments ?? 0); + + // All documents are processed (started) when current index equals total + return currentIndex >= totalDocuments; + } + catch (Exception) + { + return true; + } + } +} + diff --git a/core/Workflows/contract/src/AlwaysTrueRule.csx b/core/Workflows/contract/src/AlwaysTrueRule.csx new file mode 100644 index 0000000..44e727b --- /dev/null +++ b/core/Workflows/contract/src/AlwaysTrueRule.csx @@ -0,0 +1,14 @@ +using System.Threading.Tasks; +using BBT.Workflow.Scripting; + +/// +/// Always True Rule - Used for auto transitions that should always proceed +/// +public class AlwaysTrueRule : IConditionMapping +{ + public async Task Handler(ScriptContext context) + { + return true; + } +} + diff --git a/core/Workflows/contract/src/DocumentsLoadedRule.csx b/core/Workflows/contract/src/DocumentsLoadedRule.csx new file mode 100644 index 0000000..d9efb05 --- /dev/null +++ b/core/Workflows/contract/src/DocumentsLoadedRule.csx @@ -0,0 +1,22 @@ +using System.Threading.Tasks; +using BBT.Workflow.Scripting; + +/// +/// Documents Loaded Rule - Checks if documents are loaded successfully +/// +public class DocumentsLoadedRule : IConditionMapping +{ + public async Task Handler(ScriptContext context) + { + try + { + var totalDocuments = context.Instance?.Data?.totalDocuments ?? 0; + return (int)totalDocuments > 0; + } + catch (Exception) + { + return false; + } + } +} + diff --git a/core/Workflows/contract/src/GetContractDocumentsMapping.csx b/core/Workflows/contract/src/GetContractDocumentsMapping.csx new file mode 100644 index 0000000..f42b81c --- /dev/null +++ b/core/Workflows/contract/src/GetContractDocumentsMapping.csx @@ -0,0 +1,124 @@ +using System; +using System.Threading.Tasks; +using BBT.Workflow.Definitions; +using BBT.Workflow.Scripting; + +/// +/// Get Contract Documents Mapping - Retrieves document list from API +/// +public class GetContractDocumentsMapping : IMapping +{ + public Task InputHandler(WorkflowTask task, ScriptContext context) + { + try + { + var httpTask = task as HttpTask; + if (httpTask == null) + { + throw new InvalidOperationException("Task must be an HttpTask"); + } + + var groupCode = context.Instance?.Data?.groupCode?.ToString() ?? ""; + + // Mockoon API expects "groupCode" field + var requestBody = new + { + groupCode = groupCode, + requestId = Guid.NewGuid().ToString(), + timestamp = DateTime.UtcNow + }; + + httpTask.SetBody(requestBody); + + var headers = new Dictionary + { + ["Content-Type"] = "application/json", + ["X-Request-Id"] = Guid.NewGuid().ToString(), + ["X-Correlation-Id"] = context.Instance.Id.ToString() + }; + httpTask.SetHeaders(headers); + + return Task.FromResult(new ScriptResponse()); + } + catch (Exception ex) + { + return Task.FromResult(new ScriptResponse + { + Key = "get-documents-input-error", + Data = new { error = ex.Message } + }); + } + } + + public async Task OutputHandler(ScriptContext context) + { + try + { + var response = context.Body; + var statusCode = response?.statusCode ?? 500; + + if (statusCode >= 200 && statusCode < 300) + { + // Mockoon API returns "contracts" array, not "documents" + var contracts = response?.data?.data?.contracts ?? new object[] { }; + var contractList = new List(); + + if (contracts != null) + { + foreach (var contract in contracts) + { + contractList.Add(contract); + } + } + + // totalContracts from API response or calculated from list + var totalContracts = response?.data?.data?.totalContracts ?? contractList.Count; + + return new ScriptResponse + { + Key = "get-documents-success", + Data = new + { + documents = contractList.ToArray(), + totalDocuments = (int)totalContracts, + groupCode = response?.data?.data?.groupCode, + retrievedAt = response?.data?.data?.retrievedAt, + currentDocumentIndex = 0, + readyCount = 0, + approvedCount = 0, + documentInstances = new object[] { }, + documentsLoadedAt = DateTime.UtcNow + }, + Tags = new[] { "contract", "documents-loaded" } + }; + } + + return new ScriptResponse + { + Key = "get-documents-failed", + Data = new + { + error = response?.data?.error?.message ?? response?.error ?? "Failed to get documents", + errorCode = response?.data?.error?.code, + statusCode = statusCode, + documents = new object[] { }, + totalDocuments = 0 + } + }; + } + catch (Exception ex) + { + return new ScriptResponse + { + Key = "get-documents-exception", + Data = new + { + error = ex.Message, + documents = new object[] { }, + totalDocuments = 0 + } + }; + } + } +} + diff --git a/core/Workflows/contract/src/HasMoreDocumentsRule.csx b/core/Workflows/contract/src/HasMoreDocumentsRule.csx new file mode 100644 index 0000000..f116078 --- /dev/null +++ b/core/Workflows/contract/src/HasMoreDocumentsRule.csx @@ -0,0 +1,25 @@ +using System.Threading.Tasks; +using BBT.Workflow.Scripting; + +/// +/// Has More Documents Rule - Checks if there are more documents to process +/// +public class HasMoreDocumentsRule : IConditionMapping +{ + public async Task Handler(ScriptContext context) + { + try + { + var currentIndex = (int)(context.Instance?.Data?.currentDocumentIndex ?? 0); + var totalDocuments = (int)(context.Instance?.Data?.totalDocuments ?? 0); + + // If current index is less than total, there are more documents + return currentIndex < totalDocuments; + } + catch (Exception) + { + return false; + } + } +} + diff --git a/core/Workflows/contract/src/IncrementApprovedCountMapping.csx b/core/Workflows/contract/src/IncrementApprovedCountMapping.csx new file mode 100644 index 0000000..b463c9b --- /dev/null +++ b/core/Workflows/contract/src/IncrementApprovedCountMapping.csx @@ -0,0 +1,47 @@ +using System; +using System.Threading.Tasks; +using BBT.Workflow.Definitions; +using BBT.Workflow.Scripting; + +/// +/// Increment Approved Count Mapping - Increments the approved document counter +/// +public class IncrementApprovedCountMapping : IMapping +{ + public Task InputHandler(WorkflowTask task, ScriptContext context) + { + return Task.FromResult(new ScriptResponse()); + } + + public async Task OutputHandler(ScriptContext context) + { + try + { + var currentApprovedCount = (int)(context.Instance?.Data?.approvedCount ?? 0); + var transitionData = context.Body; + + // Using Mockoon contract structure - contractId instead of documentId + return new ScriptResponse + { + Key = "approved-count-incremented", + Data = new + { + approvedCount = currentApprovedCount + 1, + lastApprovedContractId = transitionData?.contractId, + lastApprovedContractName = transitionData?.contractName, + lastApprovedAt = DateTime.UtcNow + }, + Tags = new[] { "contract", "document-approved" } + }; + } + catch (Exception ex) + { + return new ScriptResponse + { + Key = "increment-approved-error", + Data = new { error = ex.Message } + }; + } + } +} + diff --git a/core/Workflows/contract/src/IncrementReadyCountMapping.csx b/core/Workflows/contract/src/IncrementReadyCountMapping.csx new file mode 100644 index 0000000..ce5e785 --- /dev/null +++ b/core/Workflows/contract/src/IncrementReadyCountMapping.csx @@ -0,0 +1,47 @@ +using System; +using System.Threading.Tasks; +using BBT.Workflow.Definitions; +using BBT.Workflow.Scripting; + +/// +/// Increment Ready Count Mapping - Increments the ready document counter +/// +public class IncrementReadyCountMapping : IMapping +{ + public Task InputHandler(WorkflowTask task, ScriptContext context) + { + return Task.FromResult(new ScriptResponse()); + } + + public async Task OutputHandler(ScriptContext context) + { + try + { + var currentReadyCount = (int)(context.Instance?.Data?.readyCount ?? 0); + var transitionData = context.Body; + + // Using Mockoon contract structure - contractId instead of documentId + return new ScriptResponse + { + Key = "ready-count-incremented", + Data = new + { + readyCount = currentReadyCount + 1, + lastReadyContractId = transitionData?.contractId, + lastReadyContractName = transitionData?.contractName, + lastReadyAt = DateTime.UtcNow + }, + Tags = new[] { "contract", "document-ready" } + }; + } + catch (Exception ex) + { + return new ScriptResponse + { + Key = "increment-ready-error", + Data = new { error = ex.Message } + }; + } + } +} + diff --git a/core/Workflows/contract/src/InitContractApprovalMapping.csx b/core/Workflows/contract/src/InitContractApprovalMapping.csx new file mode 100644 index 0000000..d28c07d --- /dev/null +++ b/core/Workflows/contract/src/InitContractApprovalMapping.csx @@ -0,0 +1,52 @@ +using System; +using System.Threading.Tasks; +using BBT.Workflow.Definitions; +using BBT.Workflow.Scripting; + +/// +/// Initialize Contract Approval Workflow - Prepares initial data +/// +public class InitContractApprovalMapping : IMapping +{ + public Task InputHandler(WorkflowTask task, ScriptContext context) + { + return Task.FromResult(new ScriptResponse()); + } + + public async Task OutputHandler(ScriptContext context) + { + try + { + var inputData = context.Instance?.Data; + var groupCode = inputData?.groupCode?.ToString() ?? ""; + + return new ScriptResponse + { + Key = "init-success", + Data = new + { + groupCode = groupCode, + workflowStartedAt = DateTime.UtcNow, + documents = new object[] { }, + currentDocumentIndex = 0, + readyCount = 0, + approvedCount = 0, + rejectedCount = 0, + totalDocuments = 0, + documentInstances = new object[] { }, + status = "initialized" + }, + Tags = new[] { "contract", "initialized" } + }; + } + catch (Exception ex) + { + return new ScriptResponse + { + Key = "init-error", + Data = new { error = ex.Message } + }; + } + } +} + diff --git a/core/Workflows/contract/src/InitDocumentMapping.csx b/core/Workflows/contract/src/InitDocumentMapping.csx new file mode 100644 index 0000000..3d964c1 --- /dev/null +++ b/core/Workflows/contract/src/InitDocumentMapping.csx @@ -0,0 +1,50 @@ +using System; +using System.Threading.Tasks; +using BBT.Workflow.Definitions; +using BBT.Workflow.Scripting; + +/// +/// Initialize Document Process Mapping - Prepares document data for subprocess +/// +public class InitDocumentMapping : IMapping +{ + public Task InputHandler(WorkflowTask task, ScriptContext context) + { + return Task.FromResult(new ScriptResponse()); + } + + public async Task OutputHandler(ScriptContext context) + { + try + { + var inputData = context.Instance?.Data; + + return new ScriptResponse + { + Key = "init-document-success", + Data = new + { + parentInstanceId = inputData?.parentInstanceId, + parentInstanceKey = inputData?.parentInstanceKey, + parentWorkflowKey = inputData?.parentWorkflowKey, + document = inputData?.document, + documentIndex = inputData?.documentIndex, + groupCode = inputData?.groupCode, + processStartedAt = DateTime.UtcNow, + renderStatus = "pending", + approvalStatus = "pending" + }, + Tags = new[] { "contract", "document", "initialized" } + }; + } + catch (Exception ex) + { + return new ScriptResponse + { + Key = "init-document-error", + Data = new { error = ex.Message } + }; + } + } +} + diff --git a/core/Workflows/contract/src/MoreApprovalsPendingRule.csx b/core/Workflows/contract/src/MoreApprovalsPendingRule.csx new file mode 100644 index 0000000..fa07a11 --- /dev/null +++ b/core/Workflows/contract/src/MoreApprovalsPendingRule.csx @@ -0,0 +1,25 @@ +using System.Threading.Tasks; +using BBT.Workflow.Scripting; + +/// +/// More Approvals Pending Rule - Checks if more approvals are pending +/// +public class MoreApprovalsPendingRule : IConditionMapping +{ + public async Task Handler(ScriptContext context) + { + try + { + var approvedCount = (int)(context.Instance?.Data?.approvedCount ?? 0); + var totalDocuments = (int)(context.Instance?.Data?.totalDocuments ?? 0); + + // More approvals pending if approved count is less than total + return approvedCount < totalDocuments; + } + catch (Exception) + { + return false; + } + } +} + diff --git a/core/Workflows/contract/src/NoDocumentsRule.csx b/core/Workflows/contract/src/NoDocumentsRule.csx new file mode 100644 index 0000000..26082eb --- /dev/null +++ b/core/Workflows/contract/src/NoDocumentsRule.csx @@ -0,0 +1,22 @@ +using System.Threading.Tasks; +using BBT.Workflow.Scripting; + +/// +/// No Documents Rule - Checks if no documents found +/// +public class NoDocumentsRule : IConditionMapping +{ + public async Task Handler(ScriptContext context) + { + try + { + var totalDocuments = context.Instance?.Data?.totalDocuments ?? 0; + return (int)totalDocuments == 0; + } + catch (Exception) + { + return true; + } + } +} + diff --git a/core/Workflows/contract/src/NotifyDocumentApprovedMapping.csx b/core/Workflows/contract/src/NotifyDocumentApprovedMapping.csx new file mode 100644 index 0000000..de50185 --- /dev/null +++ b/core/Workflows/contract/src/NotifyDocumentApprovedMapping.csx @@ -0,0 +1,108 @@ +using System; +using System.Threading.Tasks; +using BBT.Workflow.Definitions; +using BBT.Workflow.Scripting; + +/// +/// Notify Document Approved Mapping - Notifies parent workflow that document is approved +/// +public class NotifyDocumentApprovedMapping : IMapping +{ + public Task InputHandler(WorkflowTask task, ScriptContext context) + { + try + { + var directTriggerTask = task as DirectTriggerTask; + if (directTriggerTask == null) + { + throw new InvalidOperationException("Task must be a DirectTriggerTask"); + } + + // Configure target workflow + directTriggerTask.SetDomain("core"); + directTriggerTask.SetFlow("contract-approval-workflow"); + directTriggerTask.SetTransitionName("document-approved"); + directTriggerTask.SetSync(true); + + // Set parent instance + var parentInstanceId = context.Instance?.Data?.parentInstanceId?.ToString(); + var parentInstanceKey = context.Instance?.Data?.parentInstanceKey?.ToString(); + + if (!string.IsNullOrEmpty(parentInstanceId)) + { + directTriggerTask.SetInstance(parentInstanceId); + } + if (!string.IsNullOrEmpty(parentInstanceKey)) + { + directTriggerTask.SetKey(parentInstanceKey); + } + + // Prepare transition body - using Mockoon contract structure (contractId, contractName, contractType) + var transitionBody = new + { + contractId = context.Instance?.Data?.document?.contractId, + contractName = context.Instance?.Data?.document?.contractName, + contractType = context.Instance?.Data?.document?.contractType, + documentIndex = context.Instance?.Data?.documentIndex, + subprocessInstanceId = context.Instance?.Id, + subprocessInstanceKey = context.Instance?.Key, + approvedAt = DateTime.UtcNow, + approvedBy = context.Body?.approvedBy ?? "user", + status = "approved" + }; + directTriggerTask.SetBody(transitionBody); + + return Task.FromResult(new ScriptResponse()); + } + catch (Exception ex) + { + return Task.FromResult(new ScriptResponse + { + Key = "notify-approved-input-error", + Data = new { error = ex.Message } + }); + } + } + + public async Task OutputHandler(ScriptContext context) + { + try + { + var response = context.Body; + + if (response?.isSuccess == true) + { + return new ScriptResponse + { + Key = "notify-approved-success", + Data = new + { + parentNotified = true, + approvalStatus = "approved", + notifiedAt = DateTime.UtcNow + }, + Tags = new[] { "contract", "document-approved", "notified" } + }; + } + + return new ScriptResponse + { + Key = "notify-approved-failed", + Data = new + { + parentNotified = false, + error = response?.errorMessage ?? "Failed to notify parent" + } + }; + } + catch (Exception ex) + { + return new ScriptResponse + { + Key = "notify-approved-exception", + Data = new { error = ex.Message } + }; + } + } +} + diff --git a/core/Workflows/contract/src/NotifyDocumentReadyMapping.csx b/core/Workflows/contract/src/NotifyDocumentReadyMapping.csx new file mode 100644 index 0000000..70dd054 --- /dev/null +++ b/core/Workflows/contract/src/NotifyDocumentReadyMapping.csx @@ -0,0 +1,109 @@ +using System; +using System.Threading.Tasks; +using BBT.Workflow.Definitions; +using BBT.Workflow.Scripting; + +/// +/// Notify Document Ready Mapping - Notifies parent workflow that document is ready +/// +public class NotifyDocumentReadyMapping : IMapping +{ + public Task InputHandler(WorkflowTask task, ScriptContext context) + { + try + { + var directTriggerTask = task as DirectTriggerTask; + if (directTriggerTask == null) + { + throw new InvalidOperationException("Task must be a DirectTriggerTask"); + } + + // Configure target workflow + directTriggerTask.SetDomain("core"); + directTriggerTask.SetFlow("contract-approval-workflow"); + directTriggerTask.SetTransitionName("document-ready"); + directTriggerTask.SetSync(true); + + // Set parent instance + var parentInstanceId = context.Instance?.Data?.parentInstanceId?.ToString(); + var parentInstanceKey = context.Instance?.Data?.parentInstanceKey?.ToString(); + + if (!string.IsNullOrEmpty(parentInstanceId)) + { + directTriggerTask.SetInstance(parentInstanceId); + } + if (!string.IsNullOrEmpty(parentInstanceKey)) + { + directTriggerTask.SetKey(parentInstanceKey); + } + + // Prepare transition body - using Mockoon contract structure (contractId, contractName, contractType) + var transitionBody = new + { + contractId = context.Instance?.Data?.document?.contractId, + contractName = context.Instance?.Data?.document?.contractName, + contractType = context.Instance?.Data?.document?.contractType, + documentIndex = context.Instance?.Data?.documentIndex, + subprocessInstanceId = context.Instance?.Id, + subprocessInstanceKey = context.Instance?.Key, + documentUrl = context.Instance?.Data?.documentUrl, + documentId = context.Instance?.Data?.documentId, + pageCount = context.Instance?.Data?.pageCount, + readyAt = DateTime.UtcNow, + status = "ready" + }; + directTriggerTask.SetBody(transitionBody); + + return Task.FromResult(new ScriptResponse()); + } + catch (Exception ex) + { + return Task.FromResult(new ScriptResponse + { + Key = "notify-ready-input-error", + Data = new { error = ex.Message } + }); + } + } + + public async Task OutputHandler(ScriptContext context) + { + try + { + var response = context.Body; + + if (response?.isSuccess == true) + { + return new ScriptResponse + { + Key = "notify-ready-success", + Data = new + { + parentNotified = true, + notifiedAt = DateTime.UtcNow + }, + Tags = new[] { "contract", "document-ready", "notified" } + }; + } + + return new ScriptResponse + { + Key = "notify-ready-failed", + Data = new + { + parentNotified = false, + error = response?.errorMessage ?? "Failed to notify parent" + } + }; + } + catch (Exception ex) + { + return new ScriptResponse + { + Key = "notify-ready-exception", + Data = new { error = ex.Message } + }; + } + } +} + diff --git a/core/Workflows/contract/src/NotifyDocumentRejectedMapping.csx b/core/Workflows/contract/src/NotifyDocumentRejectedMapping.csx new file mode 100644 index 0000000..53c0da5 --- /dev/null +++ b/core/Workflows/contract/src/NotifyDocumentRejectedMapping.csx @@ -0,0 +1,109 @@ +using System; +using System.Threading.Tasks; +using BBT.Workflow.Definitions; +using BBT.Workflow.Scripting; + +/// +/// Notify Document Rejected Mapping - Notifies parent workflow that document is rejected +/// +public class NotifyDocumentRejectedMapping : IMapping +{ + public Task InputHandler(WorkflowTask task, ScriptContext context) + { + try + { + var directTriggerTask = task as DirectTriggerTask; + if (directTriggerTask == null) + { + throw new InvalidOperationException("Task must be a DirectTriggerTask"); + } + + // Configure target workflow + directTriggerTask.SetDomain("core"); + directTriggerTask.SetFlow("contract-approval-workflow"); + directTriggerTask.SetTransitionName("document-rejected"); + directTriggerTask.SetSync(true); + + // Set parent instance + var parentInstanceId = context.Instance?.Data?.parentInstanceId?.ToString(); + var parentInstanceKey = context.Instance?.Data?.parentInstanceKey?.ToString(); + + if (!string.IsNullOrEmpty(parentInstanceId)) + { + directTriggerTask.SetInstance(parentInstanceId); + } + if (!string.IsNullOrEmpty(parentInstanceKey)) + { + directTriggerTask.SetKey(parentInstanceKey); + } + + // Prepare transition body - using Mockoon contract structure (contractId, contractName, contractType) + var transitionBody = new + { + contractId = context.Instance?.Data?.document?.contractId, + contractName = context.Instance?.Data?.document?.contractName, + contractType = context.Instance?.Data?.document?.contractType, + documentIndex = context.Instance?.Data?.documentIndex, + subprocessInstanceId = context.Instance?.Id, + subprocessInstanceKey = context.Instance?.Key, + rejectedAt = DateTime.UtcNow, + rejectedBy = context.Body?.rejectedBy ?? "user", + rejectionReason = context.Body?.reason ?? "No reason provided", + status = "rejected" + }; + directTriggerTask.SetBody(transitionBody); + + return Task.FromResult(new ScriptResponse()); + } + catch (Exception ex) + { + return Task.FromResult(new ScriptResponse + { + Key = "notify-rejected-input-error", + Data = new { error = ex.Message } + }); + } + } + + public async Task OutputHandler(ScriptContext context) + { + try + { + var response = context.Body; + + if (response?.isSuccess == true) + { + return new ScriptResponse + { + Key = "notify-rejected-success", + Data = new + { + parentNotified = true, + approvalStatus = "rejected", + notifiedAt = DateTime.UtcNow + }, + Tags = new[] { "contract", "document-rejected", "notified" } + }; + } + + return new ScriptResponse + { + Key = "notify-rejected-failed", + Data = new + { + parentNotified = false, + error = response?.errorMessage ?? "Failed to notify parent" + } + }; + } + catch (Exception ex) + { + return new ScriptResponse + { + Key = "notify-rejected-exception", + Data = new { error = ex.Message } + }; + } + } +} + diff --git a/core/Workflows/contract/src/RenderDocumentMapping.csx b/core/Workflows/contract/src/RenderDocumentMapping.csx new file mode 100644 index 0000000..b1cf707 --- /dev/null +++ b/core/Workflows/contract/src/RenderDocumentMapping.csx @@ -0,0 +1,118 @@ +using System; +using System.Threading.Tasks; +using BBT.Workflow.Definitions; +using BBT.Workflow.Scripting; + +/// +/// Render Document Mapping - Renders document via HTTP API +/// +public class RenderDocumentMapping : IMapping +{ + public Task InputHandler(WorkflowTask task, ScriptContext context) + { + try + { + var httpTask = task as HttpTask; + if (httpTask == null) + { + throw new InvalidOperationException("Task must be an HttpTask"); + } + + var document = context.Instance?.Data?.document; + var groupCode = context.Instance?.Data?.groupCode?.ToString() ?? ""; + + // Mockoon API contract structure: contractId, contractType, contractName, templateId, contractData + var requestBody = new + { + groupCode = groupCode, + contractId = document?.contractId, + contractType = document?.contractType, + contractName = document?.contractName, + templateId = document?.templateId, + contractData = document?.contractData ?? new { }, + requestId = Guid.NewGuid().ToString(), + timestamp = DateTime.UtcNow + }; + + httpTask.SetBody(requestBody); + + var headers = new Dictionary + { + ["Content-Type"] = "application/json", + ["X-Request-Id"] = Guid.NewGuid().ToString(), + ["X-Contract-Id"] = document?.contractId?.ToString(), + ["X-Correlation-Id"] = context.Instance.Id.ToString() + }; + httpTask.SetHeaders(headers); + + return Task.FromResult(new ScriptResponse()); + } + catch (Exception ex) + { + return Task.FromResult(new ScriptResponse + { + Key = "render-input-error", + Data = new { error = ex.Message } + }); + } + } + + public async Task OutputHandler(ScriptContext context) + { + try + { + var response = context.Body; + var statusCode = response?.statusCode ?? 500; + + if (statusCode >= 200 && statusCode < 300) + { + // Mockoon API returns: documentId, documentUrl, documentSize, pageCount, checksum, expiresAt, renderedAt, format, templateVersion + return new ScriptResponse + { + Key = "render-success", + Data = new + { + renderStatus = "success", + documentId = response?.data?.data?.documentId, + documentUrl = response?.data?.data?.documentUrl, + documentSize = response?.data?.data?.documentSize, + pageCount = response?.data?.data?.pageCount, + checksum = response?.data?.data?.checksum, + expiresAt = response?.data?.data?.expiresAt, + format = response?.data?.data?.format, + templateVersion = response?.data?.data?.templateVersion, + renderedAt = response?.data?.data?.renderedAt ?? DateTime.UtcNow.ToString("o") + }, + Tags = new[] { "contract", "document", "rendered" } + }; + } + + return new ScriptResponse + { + Key = "render-failed", + Data = new + { + renderStatus = "failed", + error = response?.data?.error?.message ?? response?.error ?? "Failed to render document", + errorCode = response?.data?.error?.code, + statusCode = statusCode, + failedAt = DateTime.UtcNow + } + }; + } + catch (Exception ex) + { + return new ScriptResponse + { + Key = "render-exception", + Data = new + { + renderStatus = "failed", + error = ex.Message, + failedAt = DateTime.UtcNow + } + }; + } + } +} + diff --git a/core/Workflows/contract/src/RenderFailedRule.csx b/core/Workflows/contract/src/RenderFailedRule.csx new file mode 100644 index 0000000..ea9dabb --- /dev/null +++ b/core/Workflows/contract/src/RenderFailedRule.csx @@ -0,0 +1,22 @@ +using System.Threading.Tasks; +using BBT.Workflow.Scripting; + +/// +/// Render Failed Rule - Checks if document render failed +/// +public class RenderFailedRule : IConditionMapping +{ + public async Task Handler(ScriptContext context) + { + try + { + var renderStatus = context.Instance?.Data?.renderStatus?.ToString(); + return renderStatus == "failed"; + } + catch (Exception) + { + return true; + } + } +} + diff --git a/core/Workflows/contract/src/RenderSuccessRule.csx b/core/Workflows/contract/src/RenderSuccessRule.csx new file mode 100644 index 0000000..37ff4ac --- /dev/null +++ b/core/Workflows/contract/src/RenderSuccessRule.csx @@ -0,0 +1,22 @@ +using System.Threading.Tasks; +using BBT.Workflow.Scripting; + +/// +/// Render Success Rule - Checks if document render was successful +/// +public class RenderSuccessRule : IConditionMapping +{ + public async Task Handler(ScriptContext context) + { + try + { + var renderStatus = context.Instance?.Data?.renderStatus?.ToString(); + return renderStatus == "success"; + } + catch (Exception) + { + return false; + } + } +} + diff --git a/core/Workflows/contract/src/StartDocumentSubprocessMapping.csx b/core/Workflows/contract/src/StartDocumentSubprocessMapping.csx new file mode 100644 index 0000000..bf2359d --- /dev/null +++ b/core/Workflows/contract/src/StartDocumentSubprocessMapping.csx @@ -0,0 +1,149 @@ +using System; +using System.Threading.Tasks; +using BBT.Workflow.Definitions; +using BBT.Workflow.Scripting; + +/// +/// Start Document Subprocess Mapping - Starts subprocess for current document +/// +public class StartDocumentSubprocessMapping : IMapping +{ + public Task InputHandler(WorkflowTask task, ScriptContext context) + { + try + { + var startTask = task as SubProcessTask; + if (startTask == null) + { + throw new InvalidOperationException("Task must be a StartTask"); + } + + // Configure target workflow + startTask.SetDomain("core"); + startTask.SetFlow("contract-document-subflow"); + startTask.SetVersion("1.0.0"); + + // Get current document + var currentIndex = (int)(context.Instance?.Data?.currentDocumentIndex ?? 0); + var documents = context.Instance?.Data?.documents; + + object currentDocument = null; + if (documents != null) + { + var docList = new List(); + foreach (var doc in documents) + { + docList.Add(doc); + } + if (currentIndex < docList.Count) + { + currentDocument = docList[currentIndex]; + } + } + + // Generate unique key for subprocess + var subprocessKey = $"{context.Instance?.Key}-doc-{currentIndex}"; + startTask.SetKey(subprocessKey); + startTask.SetTags(new[] { "contract", "document", "subprocess" }); + + // Prepare initialization body + var initBody = new + { + parentInstanceId = context.Instance?.Id, + parentInstanceKey = context.Instance?.Key, + parentWorkflowKey = context.Workflow?.Key, + document = currentDocument, + documentIndex = currentIndex, + groupCode = context.Instance?.Data?.groupCode, + startedAt = DateTime.UtcNow + }; + startTask.SetBody(initBody); + + return Task.FromResult(new ScriptResponse()); + } + catch (Exception ex) + { + return Task.FromResult(new ScriptResponse + { + Key = "start-subprocess-input-error", + Data = new { error = ex.Message } + }); + } + } + + public async Task OutputHandler(ScriptContext context) + { + try + { + var response = context.Body; + var currentIndex = (int)(context.Instance?.Data?.currentDocumentIndex ?? 0); + + if (response?.isSuccess == true) + { + // Store subprocess instance info + var existingInstances = context.Instance?.Data?.documentInstances ?? new object[] { }; + var instanceList = new List(); + foreach (var inst in existingInstances) + { + instanceList.Add(inst); + } + + // Get current document for contractId reference + var documents = context.Instance?.Data?.documents; + object currentDoc = null; + if (documents != null) + { + var docList = new List(); + foreach (var d in documents) + { + docList.Add(d); + } + if (currentIndex < docList.Count) + { + currentDoc = docList[currentIndex]; + } + } + + instanceList.Add(new + { + instanceId = response?.data?.id, + contractId = ((dynamic)currentDoc)?.contractId, + contractName = ((dynamic)currentDoc)?.contractName, + documentIndex = currentIndex, + startedAt = DateTime.UtcNow, + status = "started" + }); + + return new ScriptResponse + { + Key = "subprocess-started", + Data = new + { + documentInstances = instanceList.ToArray(), + currentDocumentIndex = currentIndex + 1, + lastSubprocessId = response?.data?.id + }, + Tags = new[] { "contract", "subprocess-started" } + }; + } + + return new ScriptResponse + { + Key = "subprocess-failed", + Data = new + { + error = response?.errorMessage ?? "Failed to start subprocess" + } + }; + } + catch (Exception ex) + { + return new ScriptResponse + { + Key = "subprocess-exception", + Data = new { error = ex.Message } + }; + } + } +} + diff --git a/core/Workflows/oauth/oauth-authentication-workflow.http b/core/Workflows/oauth/oauth-authentication-workflow.http new file mode 100644 index 0000000..e90ef7d --- /dev/null +++ b/core/Workflows/oauth/oauth-authentication-workflow.http @@ -0,0 +1,120 @@ +############################################################################### +# OAuth Authentication Workflow - HTTP Test File +# +# This file tests the oauth-authentication workflow which handles OAuth2.0 +# authentication flow including: +# - Password grant type authentication +# - Push notification MFA +# - OTP MFA fallback +# - Token generation +# +# Prerequisites: +# 1. vNext Runtime running on localhost:4201 +# 2. Mockoon running on localhost:3001 +############################################################################### + +@baseUrl = http://localhost:4201 +@apiVersion = 1 +@domain = core +@workflow = oauth-authentication +@instanceKey = oauth-{{$timestamp}} + +############################################################################### +# Step 1: Start OAuth Authentication Workflow +# Initiates the OAuth flow with user credentials +############################################################################### + +### Start OAuth Instance +# @name startOAuthWorkflow +POST {{baseUrl}}/api/v{{apiVersion}}/{{domain}}/workflows/{{workflow}}/instances/start?sync=true +Content-Type: application/json +Accept-Language: tr-TR +X-Request-Id: {{$guid}} +X-Device-Id: {{$guid}} +X-Token-Id: {{$guid}} +X-Device-Info: IOS 16 +X-Forwarded-For: 192.168.2.1 + +{ + "key": "{{instanceKey}}", + "tags": [ + "test", + "oauth", + "authentication" + ], + "attributes": { + "username": "112233445566", + "password": "112233", + "grant_type": "password", + "client_id": "acme", + "client_secret": "1q2w3e*", + "scope": "openid profile product-api" + } +} + +############################################################################### +# Step 2: Get Instance Data +# Retrieve current workflow instance data +############################################################################### + +### Get Instance Data +GET {{baseUrl}}/api/v{{apiVersion}}/{{domain}}/workflows/{{workflow}}/instances/{{instanceKey}} +Content-Type: application/json + +### Get Current State +GET {{baseUrl}}/api/v{{apiVersion}}/{{domain}}/workflows/{{workflow}}/instances/{{instanceKey}}/functions/state +Accept: application/json + +############################################################################### +# Step 3: Push Notification MFA - Approval +# User approves the push notification on their device +############################################################################### + +### Push Send Approval +# @name pushApproved +PATCH {{baseUrl}}/api/v{{apiVersion}}/{{domain}}/workflows/{{workflow}}/instances/{{instanceKey}}/transitions/push-approved?sync=true +Content-Type: application/json + +############################################################################### +# Step 3.1: Push Notification MFA - Denied (Alternative) +# User denies the push notification - falls back to OTP +############################################################################### + +### Push Send Denied (Optional - triggers OTP fallback) +# @name pushDenied +PATCH {{baseUrl}}/api/v{{apiVersion}}/{{domain}}/workflows/{{workflow}}/instances/{{instanceKey}}/transitions/push-denied?sync=true +Content-Type: application/json + +############################################################################### +# Step 4: Get Current State (Long Polling) +# Check the current state of the workflow +############################################################################### + +### Get Current State +GET {{baseUrl}}/api/v{{apiVersion}}/{{domain}}/workflows/{{workflow}}/instances/{{instanceKey}}/functions/state +Accept: application/json + +############################################################################### +# Step 5: Get Instance Data (Final) +# Retrieve all accumulated data including tokens +############################################################################### + +### Get Final Instance Data +GET {{baseUrl}}/api/v{{apiVersion}}/{{domain}}/workflows/{{workflow}}/instances/{{instanceKey}}/functions/data +Accept: application/json + +############################################################################### +# OAuth Flow Summary +############################################################################### +# +# | Step | Transition | Description | +# |------|--------------------|------------------------------------------| +# | 1 | start | Start with username/password credentials | +# | 2 | (auto) | Validate client and user credentials | +# | 3a | push-approved | User approves push notification | +# | 3b | push-denied | User denies push, fallback to OTP | +# | 4 | (auto) | Generate tokens on successful auth | +# | 5 | (complete) | Workflow completes with tokens | +# +############################################################################### + diff --git a/core/Workflows/oauth/src/PushDeniedRule.csx b/core/Workflows/oauth/src/PushDeniedRule.csx deleted file mode 100644 index 87344e7..0000000 --- a/core/Workflows/oauth/src/PushDeniedRule.csx +++ /dev/null @@ -1,11 +0,0 @@ -using System.Threading.Tasks; -using BBT.Workflow.Scripting; - -public class PushDeniedRule : IConditionMapping -{ - public async Task Handler(ScriptContext context) - { - return context.Instance.Data.mfa.success == false && - context.Instance.Data.mfa.errorCode == "access_denied"; - } -} \ No newline at end of file diff --git a/core/Workflows/oauth/src/PushPendingContinueRule.csx b/core/Workflows/oauth/src/PushPendingContinueRule.csx deleted file mode 100644 index 3309fbe..0000000 --- a/core/Workflows/oauth/src/PushPendingContinueRule.csx +++ /dev/null @@ -1,11 +0,0 @@ -using System.Threading.Tasks; -using BBT.Workflow.Scripting; - -public class PushPendingContinueRule : IConditionMapping -{ - public async Task Handler(ScriptContext context) - { - return context.Instance.Data.mfa.success == null && - context.Instance.Data.mfa.status == "pending"; - } -} \ No newline at end of file diff --git a/core/Workflows/payments/.meta/payment-notification-subflow.diagram.json b/core/Workflows/payments/.meta/payment-notification-subflow.diagram.json new file mode 100644 index 0000000..32fe82c --- /dev/null +++ b/core/Workflows/payments/.meta/payment-notification-subflow.diagram.json @@ -0,0 +1,20 @@ +{ + "nodePos": { + "get-user-info": { + "x": 100, + "y": 100 + }, + "send-notifications": { + "x": 412, + "y": 100 + }, + "notification-complete": { + "x": 724, + "y": 100 + }, + "__start__": { + "x": -212, + "y": 100 + } + } +} \ No newline at end of file diff --git a/core/Workflows/payments/payment-notification-subflow.json b/core/Workflows/payments/payment-notification-subflow.json index f290937..8c583ff 100644 --- a/core/Workflows/payments/payment-notification-subflow.json +++ b/core/Workflows/payments/payment-notification-subflow.json @@ -107,7 +107,7 @@ }, { "key": "send-notifications", - "stateType": 1, + "stateType": 2, "subType": 0, "versionStrategy": "Minor", "labels": [ diff --git a/core/Workflows/payments/scheduled-payments-workflow.http b/core/Workflows/payments/scheduled-payments-workflow.http new file mode 100644 index 0000000..26a23dd --- /dev/null +++ b/core/Workflows/payments/scheduled-payments-workflow.http @@ -0,0 +1,157 @@ +############################################################################### +# Scheduled Payments Workflow - HTTP Test File +# +# This file tests the scheduled-payments workflow which handles: +# - Payment schedule configuration +# - Automatic payment execution based on schedule +# - Manual payment trigger (pay now) +# - Payment notifications (SMS, Push) +# - Retry logic for failed payments +# +# Prerequisites: +# 1. vNext Runtime running on localhost:4201 +# 2. Mockoon running on localhost:3001 +############################################################################### + +@baseUrl = http://localhost:4201 +@apiVersion = 1 +@domain = core +@workflow = scheduled-payments +@instanceKey = payment-{{$timestamp}} + +############################################################################### +# Step 1: Start Scheduled Payments Workflow +# Creates a new scheduled payment with configuration +############################################################################### + +### Start Scheduled Payment Instance +# @name startPaymentWorkflow +POST {{baseUrl}}/api/v{{apiVersion}}/{{domain}}/workflows/{{workflow}}/instances/start?sync=true +Content-Type: application/json +Accept-Language: tr-TR +X-Request-Id: {{$guid}} +X-Device-Id: {{$guid}} +X-Token-Id: {{$guid}} +X-Device-Info: IOS 16 +X-Forwarded-For: 192.168.2.1 + +{ + "key": "{{instanceKey}}", + "tags": [ + "test", + "payment", + "scheduled" + ], + "attributes": { + "userId": 1, + "amount": 12000, + "currency": "TL", + "frequency": "monthly", + "startDate": "2025-10-01T09:02:38.201Z", + "endDate": "2026-10-01T09:02:38.201Z", + "paymentMethodId": "1", + "description": "Monthly payment test", + "recipientId": "324324", + "isAutoRetry": false, + "maxRetries": 3 + } +} + +############################################################################### +# Step 2: Get Instance Data +# Retrieve current workflow instance data +############################################################################### + +### Get Instance Data +GET {{baseUrl}}/api/v{{apiVersion}}/{{domain}}/workflows/{{workflow}}/instances/{{instanceKey}} +Content-Type: application/json + +### Get Current State +GET {{baseUrl}}/api/v{{apiVersion}}/{{domain}}/workflows/{{workflow}}/instances/{{instanceKey}}/functions/state +Accept: application/json + +############################################################################### +# Step 3: Manual Pay Now +# Trigger immediate payment execution +############################################################################### + +### Pay Now (Manual Trigger) +# @name manualPayNow +PATCH {{baseUrl}}/api/v{{apiVersion}}/{{domain}}/workflows/{{workflow}}/instances/{{instanceKey}}/transitions/manual-pay-now?sync=false +Content-Type: application/json + +############################################################################### +# Step 4: Get Current State (Long Polling) +# Check the current state of the workflow +############################################################################### + +### Get Current State +GET {{baseUrl}}/api/v{{apiVersion}}/{{domain}}/workflows/{{workflow}}/instances/{{instanceKey}}/functions/state +Accept: application/json + +############################################################################### +# Step 5: Get Instance Data (After Payment) +# Retrieve all accumulated data including payment results +############################################################################### + +### Get Instance Data After Payment +GET {{baseUrl}}/api/v{{apiVersion}}/{{domain}}/workflows/{{workflow}}/instances/{{instanceKey}}/functions/data +Accept: application/json + +############################################################################### +# Alternative Flows +############################################################################### + +### Cancel Scheduled Payment +# @name cancelPayment +PATCH {{baseUrl}}/api/v{{apiVersion}}/{{domain}}/workflows/{{workflow}}/instances/{{instanceKey}}/transitions/cancel-payment?sync=true +Content-Type: application/json + +{ + "attributes": { + "cancelReason": "User requested cancellation", + "cancelledBy": "user-1", + "cancelledAt": "{{$isoTimestamp}}" + } +} + +### Pause Scheduled Payment +# @name pausePayment +PATCH {{baseUrl}}/api/v{{apiVersion}}/{{domain}}/workflows/{{workflow}}/instances/{{instanceKey}}/transitions/pause-payment?sync=true +Content-Type: application/json + +{ + "attributes": { + "pauseReason": "Temporary pause requested", + "pausedBy": "user-1" + } +} + +### Resume Scheduled Payment +# @name resumePayment +PATCH {{baseUrl}}/api/v{{apiVersion}}/{{domain}}/workflows/{{workflow}}/instances/{{instanceKey}}/transitions/resume-payment?sync=true +Content-Type: application/json + +{ + "attributes": { + "resumedBy": "user-1" + } +} + +############################################################################### +# Scheduled Payments Flow Summary +############################################################################### +# +# | Step | Transition | Description | +# |------|------------------|-------------------------------------------| +# | 1 | start | Create scheduled payment configuration | +# | 2 | (auto) | Validate and save payment configuration | +# | 3a | manual-pay-now | Trigger immediate payment execution | +# | 3b | (scheduled) | Wait for scheduled payment time | +# | 4 | (auto) | Process payment and send notifications | +# | 5a | (success) | Payment successful - archive or reschedule| +# | 5b | (retry) | Payment failed - retry if configured | +# | 6 | cancel-payment | Cancel the scheduled payment | +# +############################################################################### + diff --git a/core/Workflows/task-test/.meta/task-test-subflow.diagram.json b/core/Workflows/task-test/.meta/task-test-subflow.diagram.json new file mode 100644 index 0000000..bd51d28 --- /dev/null +++ b/core/Workflows/task-test/.meta/task-test-subflow.diagram.json @@ -0,0 +1,16 @@ +{ + "nodePos": { + "subflow-active": { + "x": 100, + "y": 100 + }, + "subflow-completed": { + "x": 526, + "y": 100 + }, + "__start__": { + "x": -296, + "y": 100 + } + } +} \ No newline at end of file diff --git a/core/Workflows/task-test/.meta/task-test-workflow.diagram.json b/core/Workflows/task-test/.meta/task-test-workflow.diagram.json new file mode 100644 index 0000000..8a1236f --- /dev/null +++ b/core/Workflows/task-test/.meta/task-test-workflow.diagram.json @@ -0,0 +1,60 @@ +{ + "nodePos": { + "test-get-secret-state": { + "x": 100, + "y": 100 + }, + "test-get-config-state": { + "x": 567, + "y": 100 + }, + "test-dapr-pubsub-state": { + "x": 1034, + "y": 100 + }, + "test-http-items-state": { + "x": 1484, + "y": 100 + }, + "test-http-task-state": { + "x": 1951, + "y": 100 + }, + "test-dapr-service-state": { + "x": 2387, + "y": 100 + }, + "test-notification-state": { + "x": 2863, + "y": 100 + }, + "test-script-state": { + "x": 3348, + "y": 100 + }, + "test-start-workflow-state": { + "x": 3779, + "y": 100 + }, + "test-get-instance-data-state": { + "x": 4300, + "y": 100 + }, + "test-direct-transition-state": { + "x": 4792, + "y": 100 + }, + "test-subprocess-state": { + "x": 5284, + "y": 100 + }, + "all-tests-completed": { + "x": 5727, + "y": 100 + }, + "__start__": { + "x": -296, + "y": 100 + } + } +} \ No newline at end of file diff --git a/core/Workflows/task-test/src/AlwaysTrueRule.csx b/core/Workflows/task-test/src/AlwaysTrueRule.csx new file mode 100644 index 0000000..44e727b --- /dev/null +++ b/core/Workflows/task-test/src/AlwaysTrueRule.csx @@ -0,0 +1,14 @@ +using System.Threading.Tasks; +using BBT.Workflow.Scripting; + +/// +/// Always True Rule - Used for auto transitions that should always proceed +/// +public class AlwaysTrueRule : IConditionMapping +{ + public async Task Handler(ScriptContext context) + { + return true; + } +} + diff --git a/core/Workflows/task-test/src/DaprPubSubMapping.csx b/core/Workflows/task-test/src/DaprPubSubMapping.csx new file mode 100644 index 0000000..5080294 --- /dev/null +++ b/core/Workflows/task-test/src/DaprPubSubMapping.csx @@ -0,0 +1,126 @@ +using System; +using System.Threading.Tasks; +using BBT.Workflow.Definitions; +using BBT.Workflow.Scripting; + +/// +/// DaprPubSub Task Mapping - Publishes events to message bus +/// Test case: Verify event publishing to Dapr PubSub component +/// +public class DaprPubSubMapping : IMapping +{ + public Task InputHandler(WorkflowTask task, ScriptContext context) + { + try + { + var pubsubTask = task as DaprPubSubTask; + if (pubsubTask == null) + { + throw new InvalidOperationException("Task must be a DaprPubSubTask"); + } + + // Configure PubSub component + pubsubTask.SetPubSubName("vnext-execution-pubsub"); + pubsubTask.SetTopic("vnext.test.events"); + + // Create Cloud Events format data + var eventData = new + { + specversion = "1.0", + type = "com.vnext.task-test.TestEvent", + source = "task-test-workflow", + id = Guid.NewGuid().ToString(), + time = DateTime.UtcNow.ToString("O"), + datacontenttype = "application/json", + data = new + { + testId = context.Instance?.Data?.testId ?? Guid.NewGuid().ToString(), + workflowId = context.Workflow.Key, + instanceId = context.Instance?.Id, + timestamp = DateTime.UtcNow, + message = "DaprPubSub test event published" + } + }; + + pubsubTask.SetData(eventData); + + // Set metadata + var metadata = new Dictionary + { + ["priority"] = "normal", + ["correlationId"] = context.Instance.Id.ToString(), + ["source"] = "task-test-workflow" + }; + pubsubTask.SetMetadata(metadata); + + return Task.FromResult(new ScriptResponse()); + } + catch (Exception ex) + { + return Task.FromResult(new ScriptResponse + { + Key = "dapr-pubsub-input-error", + Data = new { error = ex.Message } + }); + } + } + + public async Task OutputHandler(ScriptContext context) + { + try + { + var response = context.Body; + + if (response?.isSuccess == true) + { + return new ScriptResponse + { + Key = "dapr-pubsub-success", + Data = new + { + daprPubSubResult = new + { + success = true, + publishedAt = DateTime.UtcNow, + taskType = "DaprPubSub" + } + }, + Tags = new[] { "task-test", "dapr-pubsub", "success" } + }; + } + + return new ScriptResponse + { + Key = "dapr-pubsub-failed", + Data = new + { + daprPubSubResult = new + { + success = false, + error = response?.errorMessage ?? "Unknown error", + failedAt = DateTime.UtcNow, + taskType = "DaprPubSub" + } + }, + Tags = new[] { "task-test", "dapr-pubsub", "failed" } + }; + } + catch (Exception ex) + { + return new ScriptResponse + { + Key = "dapr-pubsub-exception", + Data = new + { + daprPubSubResult = new + { + success = false, + error = ex.Message, + taskType = "DaprPubSub" + } + } + }; + } + } +} + diff --git a/core/Workflows/task-test/src/DaprServiceTaskMapping.csx b/core/Workflows/task-test/src/DaprServiceTaskMapping.csx new file mode 100644 index 0000000..fd98681 --- /dev/null +++ b/core/Workflows/task-test/src/DaprServiceTaskMapping.csx @@ -0,0 +1,119 @@ +using System; +using System.Threading.Tasks; +using BBT.Workflow.Definitions; +using BBT.Workflow.Scripting; + +/// +/// DaprService Task Mapping - Invokes Dapr services +/// Test case: Verify service-to-service invocation via Dapr +/// +public class DaprServiceTaskMapping : IMapping +{ + public Task InputHandler(WorkflowTask task, ScriptContext context) + { + try + { + var serviceTask = task as DaprServiceTask; + if (serviceTask == null) + { + throw new InvalidOperationException("Task must be a DaprServiceTask"); + } + + // Configure target service + serviceTask.SetAppId("mockoon"); + serviceTask.SetMethodName("/api/task-test/dapr-endpoint"); + + // Prepare request body + var requestBody = new + { + testId = context.Instance?.Data?.testId ?? Guid.NewGuid().ToString(), + workflowId = context.Workflow.Key, + instanceId = context.Instance?.Id, + timestamp = DateTime.UtcNow, + action = "dapr-service-test" + }; + + serviceTask.SetBody(requestBody); + + // Set headers + var headers = new Dictionary + { + ["X-Test-Id"] = context.Instance?.Data?.testId?.ToString(), + ["X-Request-Id"] = Guid.NewGuid().ToString(), + ["X-Correlation-Id"] = context.Instance.Id.ToString() + }; + serviceTask.SetHeaders(headers); + + return Task.FromResult(new ScriptResponse()); + } + catch (Exception ex) + { + return Task.FromResult(new ScriptResponse + { + Key = "dapr-service-input-error", + Data = new { error = ex.Message } + }); + } + } + + public async Task OutputHandler(ScriptContext context) + { + try + { + var response = context.Body; + + if (response?.isSuccess == true) + { + return new ScriptResponse + { + Key = "dapr-service-success", + Data = new + { + daprServiceResult = new + { + success = true, + data = response?.data, + executionTime = response?.executionDurationMs, + processedAt = DateTime.UtcNow, + taskType = "DaprServiceTask" + } + }, + Tags = new[] { "task-test", "dapr-service", "success" } + }; + } + + return new ScriptResponse + { + Key = "dapr-service-failed", + Data = new + { + daprServiceResult = new + { + success = false, + error = response?.errorMessage ?? "Dapr service invocation failed", + failedAt = DateTime.UtcNow, + taskType = "DaprServiceTask" + } + }, + Tags = new[] { "task-test", "dapr-service", "failed" } + }; + } + catch (Exception ex) + { + return new ScriptResponse + { + Key = "dapr-service-exception", + Data = new + { + daprServiceResult = new + { + success = false, + error = ex.Message, + taskType = "DaprServiceTask" + } + } + }; + } + } +} + diff --git a/core/Workflows/task-test/src/DirectTransitionMapping.csx b/core/Workflows/task-test/src/DirectTransitionMapping.csx new file mode 100644 index 0000000..695c96d --- /dev/null +++ b/core/Workflows/task-test/src/DirectTransitionMapping.csx @@ -0,0 +1,119 @@ +using System; +using System.Threading.Tasks; +using BBT.Workflow.Definitions; +using BBT.Workflow.Scripting; + +/// +/// DirectTransition Task Mapping - Triggers transition on existing workflow instance +/// Test case: Verify workflow-to-workflow transition triggering +/// +public class DirectTransitionMapping : IMapping +{ + public Task InputHandler(WorkflowTask task, ScriptContext context) + { + try + { + var directTriggerTask = task as DirectTriggerTask; + if (directTriggerTask == null) + { + throw new InvalidOperationException("Task must be a DirectTriggerTask"); + } + + // Configure target workflow + directTriggerTask.SetDomain("core"); + directTriggerTask.SetFlow("task-test-subflow"); + directTriggerTask.SetTransitionName("complete-subflow"); + directTriggerTask.SetTags(new[] { "task-test", "direct-transition", "success" }); + directTriggerTask.SetSync(true); + + // Get instance ID from workflow data + var targetInstanceId = context.Instance?.Data?.subflowInstanceId?.ToString(); + if (!string.IsNullOrEmpty(targetInstanceId)) + { + directTriggerTask.SetInstance(targetInstanceId); + } + directTriggerTask.SetKey(context.Instance?.Key ?? Guid.NewGuid().ToString()); + + // Prepare transition body + var transitionBody = new + { + completedBy = "task-test-workflow", + completedAt = DateTime.UtcNow, + parentInstanceId = context.Instance?.Id, + message = "DirectTransition test executed" + }; + directTriggerTask.SetBody(transitionBody); + + return Task.FromResult(new ScriptResponse()); + } + catch (Exception ex) + { + return Task.FromResult(new ScriptResponse + { + Key = "direct-transition-input-error", + Data = new { error = ex.Message } + }); + } + } + + public async Task OutputHandler(ScriptContext context) + { + try + { + var response = context.Body; + + if (response?.isSuccess == true) + { + return new ScriptResponse + { + Key = "direct-transition-success", + Data = new + { + directTransitionResult = new + { + success = true, + instanceId = response?.data?.id, + status = response?.data?.status, + executedAt = DateTime.UtcNow, + taskType = "DirectTransition" + } + }, + Tags = new[] { "task-test", "direct-transition", "success" } + }; + } + + return new ScriptResponse + { + Key = "direct-transition-failed", + Data = new + { + directTransitionResult = new + { + success = false, + error = response?.errorMessage ?? "Direct transition failed", + failedAt = DateTime.UtcNow, + taskType = "DirectTransition" + } + }, + Tags = new[] { "task-test", "direct-transition", "failed" } + }; + } + catch (Exception ex) + { + return new ScriptResponse + { + Key = "direct-transition-exception", + Data = new + { + directTransitionResult = new + { + success = false, + error = ex.Message, + taskType = "DirectTransition" + } + } + }; + } + } +} + diff --git a/core/Workflows/task-test/src/GetConfigValueMapping.csx b/core/Workflows/task-test/src/GetConfigValueMapping.csx new file mode 100644 index 0000000..a6bbb67 --- /dev/null +++ b/core/Workflows/task-test/src/GetConfigValueMapping.csx @@ -0,0 +1,94 @@ +using System; +using System.Threading.Tasks; +using BBT.Workflow.Definitions; +using BBT.Workflow.Scripting; +using BBT.Workflow.Scripting.Functions; + +/// +/// GetConfigValue Test Mapping - Demonstrates configuration value retrieval +/// Test case: Verify GetConfigValue functionality and logging +/// +public class GetConfigValueMapping : ScriptBase, IMapping +{ + public Task InputHandler(WorkflowTask task, ScriptContext context) + { + try + { + LogInformation("GetConfigValue Test - Starting configuration retrieval test"); + + // Retrieve API base URL from configuration using GetConfigValue + var apiBaseUrl = GetConfigValue("Example:ApiBaseUrl"); + + LogInformation("GetConfigValue Test - Successfully retrieved ApiBaseUrl: {0}", + args: new object?[] { apiBaseUrl ?? "null" }); + + return Task.FromResult(new ScriptResponse + { + Data = new + { + configRetrieved = !string.IsNullOrEmpty(apiBaseUrl), + configKeyName = "ApiBaseUrl", + configValue = apiBaseUrl, + retrievedAt = DateTime.UtcNow + } + }); + } + catch (Exception ex) + { + LogError("GetConfigValue Test - Failed to retrieve config: {0}", + args: new object?[] { ex.Message }); + + return Task.FromResult(new ScriptResponse + { + Key = "get-config-input-error", + Data = new { error = ex.Message } + }); + } + } + + public Task OutputHandler(ScriptContext context) + { + try + { + LogInformation("GetConfigValue Test - Processing output"); + + var inputData = context.Instance?.Data; + + return Task.FromResult(new ScriptResponse + { + Key = "get-config-success", + Data = new + { + getConfigResult = new + { + success = true, + testName = "GetConfigValue", + description = "Retrieved ApiBaseUrl from configuration", + taskType = "ScriptTask" + } + }, + Tags = new[] { "task-test", "get-config-value", "success" } + }); + } + catch (Exception ex) + { + LogError("GetConfigValue Test - Output handler exception: {0}", + args: new object?[] { ex.Message }); + + return Task.FromResult(new ScriptResponse + { + Key = "get-config-exception", + Data = new + { + getConfigResult = new + { + success = false, + error = ex.Message, + taskType = "ScriptTask" + } + } + }); + } + } +} + diff --git a/core/Workflows/task-test/src/GetInstanceDataMapping.csx b/core/Workflows/task-test/src/GetInstanceDataMapping.csx new file mode 100644 index 0000000..8122a76 --- /dev/null +++ b/core/Workflows/task-test/src/GetInstanceDataMapping.csx @@ -0,0 +1,108 @@ +using System; +using System.Threading.Tasks; +using BBT.Workflow.Definitions; +using BBT.Workflow.Scripting; + +/// +/// GetInstanceData Task Mapping - Retrieves data from another workflow instance +/// Test case: Verify cross-workflow data retrieval +/// +public class GetInstanceDataMapping : IMapping +{ + public Task InputHandler(WorkflowTask task, ScriptContext context) + { + try + { + var getDataTask = task as GetInstanceDataTask; + if (getDataTask == null) + { + throw new InvalidOperationException("Task must be a GetInstanceDataTask"); + } + + // Configure target workflow + getDataTask.SetDomain("core"); + getDataTask.SetFlow("task-test-subflow"); + + // Get instance ID from workflow data + var targetInstanceId = context.Instance?.Data?.subflowInstanceId?.ToString(); + if (!string.IsNullOrEmpty(targetInstanceId)) + { + getDataTask.SetInstance(targetInstanceId); + } + + // Request specific extensions + getDataTask.SetExtensions(new[] { "all" }); + + return Task.FromResult(new ScriptResponse()); + } + catch (Exception ex) + { + return Task.FromResult(new ScriptResponse + { + Key = "get-instance-data-input-error", + Data = new { error = ex.Message } + }); + } + } + + public async Task OutputHandler(ScriptContext context) + { + try + { + var response = context.Body; + + if (response?.isSuccess == true) + { + return new ScriptResponse + { + Key = "get-instance-data-success", + Data = new + { + getInstanceDataResult = new + { + success = true, + retrievedData = response?.data, + metadata = response?.metadata, + retrievedAt = DateTime.UtcNow, + taskType = "GetInstanceData" + } + }, + Tags = new[] { "task-test", "get-instance-data", "success" } + }; + } + + return new ScriptResponse + { + Key = "get-instance-data-failed", + Data = new + { + getInstanceDataResult = new + { + success = false, + error = response?.errorMessage ?? "Failed to retrieve instance data", + failedAt = DateTime.UtcNow, + taskType = "GetInstanceData" + } + }, + Tags = new[] { "task-test", "get-instance-data", "failed" } + }; + } + catch (Exception ex) + { + return new ScriptResponse + { + Key = "get-instance-data-exception", + Data = new + { + getInstanceDataResult = new + { + success = false, + error = ex.Message, + taskType = "GetInstanceData" + } + } + }; + } + } +} + diff --git a/core/Workflows/task-test/src/GetSecretAsyncMapping.csx b/core/Workflows/task-test/src/GetSecretAsyncMapping.csx new file mode 100644 index 0000000..16b9588 --- /dev/null +++ b/core/Workflows/task-test/src/GetSecretAsyncMapping.csx @@ -0,0 +1,94 @@ +using System; +using System.Threading.Tasks; +using BBT.Workflow.Definitions; +using BBT.Workflow.Scripting; +using BBT.Workflow.Scripting.Functions; + +/// +/// GetSecretAsync Test Mapping - Demonstrates secret retrieval from Dapr secret store +/// Test case: Verify GetSecretAsync functionality and logging +/// +public class GetSecretAsyncMapping : ScriptBase, IMapping +{ + public async Task InputHandler(WorkflowTask task, ScriptContext context) + { + try + { + LogInformation("GetSecretAsync Test - Starting secret retrieval test"); + + // Retrieve API secret from Dapr secret store using GetSecretAsync + var apiSecret = await GetSecretAsync("vnext-secret", "workflow-secret", "ApiSecret"); + + LogInformation("GetSecretAsync Test - Successfully retrieved ApiSecret"); + LogDebug("GetSecretAsync Test - Secret value length: {0}", + args: new object?[] { apiSecret?.Length ?? 0 }); + + // Store the result for output handler + return new ScriptResponse + { + Data = new + { + secretRetrieved = !string.IsNullOrEmpty(apiSecret), + secretKeyName = "ApiSecret", + retrievedAt = DateTime.UtcNow + } + }; + } + catch (Exception ex) + { + LogError("GetSecretAsync Test - Failed to retrieve secret: {0}", + args: new object?[] { ex.Message }); + + return new ScriptResponse + { + Key = "get-secret-input-error", + Data = new { error = ex.Message } + }; + } + } + + public async Task OutputHandler(ScriptContext context) + { + try + { + LogInformation("GetSecretAsync Test - Processing output"); + + return new ScriptResponse + { + Key = "get-secret-success", + Data = new + { + getSecretResult = new + { + success = true, + testName = "GetSecretAsync", + description = "Retrieved ApiSecret from Dapr secret store", + completedAt = DateTime.UtcNow, + taskType = "ScriptTask" + } + }, + Tags = new[] { "task-test", "get-secret-async", "success" } + }; + } + catch (Exception ex) + { + LogError("GetSecretAsync Test - Output handler exception: {0}", + args: new object?[] { ex.Message }); + + return new ScriptResponse + { + Key = "get-secret-exception", + Data = new + { + getSecretResult = new + { + success = false, + error = ex.Message, + taskType = "ScriptTask" + } + } + }; + } + } +} + diff --git a/core/Workflows/task-test/src/HttpTaskItemsMapping.csx b/core/Workflows/task-test/src/HttpTaskItemsMapping.csx new file mode 100644 index 0000000..f435a15 --- /dev/null +++ b/core/Workflows/task-test/src/HttpTaskItemsMapping.csx @@ -0,0 +1,119 @@ +using System; +using System.Threading.Tasks; +using BBT.Workflow.Definitions; +using BBT.Workflow.Scripting; + +/// +/// HTTP Task Mapping - Makes external API calls +/// Test case: Verify HTTP requests to external services via Mockoon +/// +public class HttpTaskItemsMapping : IMapping +{ + public Task InputHandler(WorkflowTask task, ScriptContext context) + { + try + { + var httpTask = task as HttpTask; + if (httpTask == null) + { + throw new InvalidOperationException("Task must be an HttpTask"); + } + + // Prepare request body + var requestBody = new + { + testId = context.Instance?.Data?.testId ?? Guid.NewGuid().ToString(), + workflowId = context.Workflow.Key, + instanceId = context.Instance?.Id, + timestamp = DateTime.UtcNow, + action = "http-task-test" + }; + + httpTask.SetBody(requestBody); + + // Set headers + var headers = new Dictionary + { + ["Content-Type"] = "application/json", + ["X-Test-Id"] = context.Instance?.Data?.testId?.ToString(), + ["X-Request-Id"] = Guid.NewGuid().ToString(), + ["X-Correlation-Id"] = context.Instance.Id.ToString() + }; + httpTask.SetHeaders(headers); + + return Task.FromResult(new ScriptResponse()); + } + catch (Exception ex) + { + return Task.FromResult(new ScriptResponse + { + Key = "http-task-input-error", + Data = new { error = ex.Message } + }); + } + } + + public async Task OutputHandler(ScriptContext context) + { + try + { + var response = context.Body; + var statusCode = response?.statusCode ?? 500; + + if (statusCode >= 200 && statusCode < 300) + { + return new ScriptResponse + { + Key = "http-task-success", + Data = new + { + httpTaskItemsResult = new + { + success = true, + statusCode = statusCode, + data = response?.data, + executionTime = response?.executionDurationMs, + processedAt = DateTime.UtcNow, + taskType = "HttpTask" + } + }, + Tags = new[] { "task-test", "http-task", "success" } + }; + } + + return new ScriptResponse + { + Key = "http-task-failed", + Data = new + { + httpTaskItemsResult = new + { + success = false, + statusCode = statusCode, + error = response?.errorMessage ?? "HTTP request failed", + failedAt = DateTime.UtcNow, + taskType = "HttpTask" + } + }, + Tags = new[] { "task-test", "http-task", "failed" } + }; + } + catch (Exception ex) + { + return new ScriptResponse + { + Key = "http-task-exception", + Data = new + { + httpTaskItemsResult = new + { + success = false, + error = ex.Message, + taskType = "HttpTask" + } + } + }; + } + } +} + diff --git a/core/Workflows/task-test/src/HttpTaskMapping.csx b/core/Workflows/task-test/src/HttpTaskMapping.csx new file mode 100644 index 0000000..9fef608 --- /dev/null +++ b/core/Workflows/task-test/src/HttpTaskMapping.csx @@ -0,0 +1,119 @@ +using System; +using System.Threading.Tasks; +using BBT.Workflow.Definitions; +using BBT.Workflow.Scripting; + +/// +/// HTTP Task Mapping - Makes external API calls +/// Test case: Verify HTTP requests to external services via Mockoon +/// +public class HttpTaskMapping : IMapping +{ + public Task InputHandler(WorkflowTask task, ScriptContext context) + { + try + { + var httpTask = task as HttpTask; + if (httpTask == null) + { + throw new InvalidOperationException("Task must be an HttpTask"); + } + + // Prepare request body + var requestBody = new + { + testId = context.Instance?.Data?.testId ?? Guid.NewGuid().ToString(), + workflowId = context.Workflow.Key, + instanceId = context.Instance?.Id, + timestamp = DateTime.UtcNow, + action = "http-task-test" + }; + + httpTask.SetBody(requestBody); + + // Set headers + var headers = new Dictionary + { + ["Content-Type"] = "application/json", + ["X-Test-Id"] = context.Instance?.Data?.testId?.ToString(), + ["X-Request-Id"] = Guid.NewGuid().ToString(), + ["X-Correlation-Id"] = context.Instance.Id.ToString() + }; + httpTask.SetHeaders(headers); + + return Task.FromResult(new ScriptResponse()); + } + catch (Exception ex) + { + return Task.FromResult(new ScriptResponse + { + Key = "http-task-input-error", + Data = new { error = ex.Message } + }); + } + } + + public async Task OutputHandler(ScriptContext context) + { + try + { + var response = context.Body; + var statusCode = response?.statusCode ?? 500; + + if (statusCode >= 200 && statusCode < 300) + { + return new ScriptResponse + { + Key = "http-task-success", + Data = new + { + httpTaskResult = new + { + success = true, + statusCode = statusCode, + data = response?.data, + executionTime = response?.executionDurationMs, + processedAt = DateTime.UtcNow, + taskType = "HttpTask" + } + }, + Tags = new[] { "task-test", "http-task", "success" } + }; + } + + return new ScriptResponse + { + Key = "http-task-failed", + Data = new + { + httpTaskResult = new + { + success = false, + statusCode = statusCode, + error = response?.errorMessage ?? "HTTP request failed", + failedAt = DateTime.UtcNow, + taskType = "HttpTask" + } + }, + Tags = new[] { "task-test", "http-task", "failed" } + }; + } + catch (Exception ex) + { + return new ScriptResponse + { + Key = "http-task-exception", + Data = new + { + httpTaskResult = new + { + success = false, + error = ex.Message, + taskType = "HttpTask" + } + } + }; + } + } +} + diff --git a/core/Workflows/task-test/src/InitialTransitionMapping.csx b/core/Workflows/task-test/src/InitialTransitionMapping.csx new file mode 100644 index 0000000..c8e5c19 --- /dev/null +++ b/core/Workflows/task-test/src/InitialTransitionMapping.csx @@ -0,0 +1,59 @@ +using System; +using System.Threading.Tasks; +using BBT.Workflow.Definitions; +using BBT.Workflow.Scripting; + +/// +/// Initial Transition Mapping - Initializes workflow with test data +/// +public class InitialTransitionMapping : IMapping +{ + public Task InputHandler(WorkflowTask task, ScriptContext context) + { + return Task.FromResult(new ScriptResponse()); + } + + public async Task OutputHandler(ScriptContext context) + { + try + { + var inputData = context.Instance?.Data; + + return new ScriptResponse + { + Key = "initial-success", + Data = new + { + testId = inputData?.testId ?? Guid.NewGuid().ToString(), + workflowStartedAt = DateTime.UtcNow, + testConfiguration = new + { + testGetSecretAsync = true, + testGetConfigValue = true, + testTaskResponse = true, + testDaprPubSub = true, + testHttpTask = true, + testDaprServiceTask = true, + testNotificationTask = true, + testScriptTask = true, + testGetInstanceData = true, + testDirectTransition = true, + testStartWorkflow = true, + testSubProcess = true + }, + taskTestResults = new { } + }, + Tags = new[] { "task-test", "initialized" } + }; + } + catch (Exception ex) + { + return new ScriptResponse + { + Key = "initial-error", + Data = new { error = ex.Message } + }; + } + } +} + diff --git a/core/Workflows/task-test/src/ScriptTaskMapping.csx b/core/Workflows/task-test/src/ScriptTaskMapping.csx new file mode 100644 index 0000000..5ad263d --- /dev/null +++ b/core/Workflows/task-test/src/ScriptTaskMapping.csx @@ -0,0 +1,94 @@ +using System; +using System.Threading.Tasks; +using BBT.Workflow.Definitions; +using BBT.Workflow.Scripting; + +/// +/// Script Task Mapping - Executes custom business logic +/// Test case: Verify script execution and data transformation +/// +public class ScriptTaskMapping : IMapping +{ + public Task InputHandler(WorkflowTask task, ScriptContext context) + { + try + { + // Script tasks don't require specific task configuration + // They are used for data transformation and business logic + return Task.FromResult(new ScriptResponse()); + } + catch (Exception ex) + { + return Task.FromResult(new ScriptResponse + { + Key = "script-task-input-error", + Data = new { error = ex.Message } + }); + } + } + + public async Task OutputHandler(ScriptContext context) + { + try + { + // Perform data transformation + var inputData = context.Instance?.Data; + + // Calculate some values + var calculatedValues = new + { + originalTestId = inputData?.testId, + processedAt = DateTime.UtcNow, + calculatedValue = new Random().Next(1000, 9999), + isProcessed = true, + processingDuration = DateTime.UtcNow.Subtract(DateTime.UtcNow.AddMilliseconds(-100)).TotalMilliseconds + }; + + // Transform and aggregate data + var transformedData = new + { + scriptTaskResult = new + { + success = true, + originalData = new + { + testId = inputData?.testId, + workflowId = context.Workflow.Key, + instanceId = context.Instance?.Id + }, + transformed = calculatedValues, + metadata = new + { + taskType = "ScriptTask", + executedAt = DateTime.UtcNow, + scriptVersion = "1.0.0" + } + } + }; + + return new ScriptResponse + { + Key = "script-task-success", + Data = transformedData, + Tags = new[] { "task-test", "script-task", "success", "data-transformation" } + }; + } + catch (Exception ex) + { + return new ScriptResponse + { + Key = "script-task-exception", + Data = new + { + scriptTaskResult = new + { + success = false, + error = ex.Message, + taskType = "ScriptTask" + } + } + }; + } + } +} + diff --git a/core/Workflows/task-test/src/StartWorkflowMapping.csx b/core/Workflows/task-test/src/StartWorkflowMapping.csx new file mode 100644 index 0000000..9e227ee --- /dev/null +++ b/core/Workflows/task-test/src/StartWorkflowMapping.csx @@ -0,0 +1,115 @@ +using System; +using System.Threading.Tasks; +using BBT.Workflow.Definitions; +using BBT.Workflow.Scripting; + +/// +/// Start Workflow Task Mapping - Starts a new workflow instance +/// Test case: Verify starting new workflow instances +/// +public class StartWorkflowMapping : IMapping +{ + public Task InputHandler(WorkflowTask task, ScriptContext context) + { + try + { + var startTask = task as StartTask; + if (startTask == null) + { + throw new InvalidOperationException("Task must be a StartTask"); + } + + // Configure target workflow + startTask.SetDomain("core"); + startTask.SetFlow("task-test-subflow"); + startTask.SetSync(true); + startTask.SetVersion("1.0.0"); + startTask.SetKey(Guid.NewGuid().ToString()); + startTask.SetTags(new[] { "task-test", "start-workflow", "success" }); + + // Prepare initialization body + var initBody = new + { + parentInstanceId = context.Instance?.Id, + parentWorkflowId = context.Workflow?.Key, + testId = context.Instance?.Data?.testId ?? Guid.NewGuid().ToString(), + startedAt = DateTime.UtcNow, + startedBy = "task-test-workflow", + message = "StartTask test - new instance created" + }; + startTask.SetBody(initBody); + + return Task.FromResult(new ScriptResponse()); + } + catch (Exception ex) + { + return Task.FromResult(new ScriptResponse + { + Key = "start-workflow-input-error", + Data = new { error = ex.Message } + }); + } + } + + public async Task OutputHandler(ScriptContext context) + { + try + { + var response = context.Body; + + if (response?.isSuccess == true) + { + return new ScriptResponse + { + Key = "start-workflow-success", + Data = new + { + startWorkflowResult = new + { + success = true, + newInstanceId = response?.data?.id, + status = response?.data?.status, + startedAt = DateTime.UtcNow, + taskType = "Start" + }, + // Store instance ID for later use + subflowInstanceId = response?.data?.id + }, + Tags = new[] { "task-test", "start-workflow", "success" } + }; + } + + return new ScriptResponse + { + Key = "start-workflow-failed", + Data = new + { + startWorkflowResult = new + { + success = false, + error = response?.errorMessage ?? "Failed to start workflow", + failedAt = DateTime.UtcNow, + taskType = "Start" + } + }, + Tags = new[] { "task-test", "start-workflow", "failed" } + }; + } + catch (Exception ex) + { + return new ScriptResponse + { + Key = "start-workflow-exception", + Data = new + { + startWorkflowResult = new + { + success = false, + error = ex.Message, + taskType = "Start" + } + } + }; + } + } +} \ No newline at end of file diff --git a/core/Workflows/task-test/src/SubProcessMapping.csx b/core/Workflows/task-test/src/SubProcessMapping.csx new file mode 100644 index 0000000..de4fcba --- /dev/null +++ b/core/Workflows/task-test/src/SubProcessMapping.csx @@ -0,0 +1,113 @@ +using System; +using System.Threading.Tasks; +using BBT.Workflow.Definitions; +using BBT.Workflow.Scripting; + +/// +/// SubProcess Task Mapping - Starts a fire-and-forget subprocess +/// Test case: Verify subprocess launching (non-blocking) +/// +public class SubProcessMapping : IMapping +{ + public Task InputHandler(WorkflowTask task, ScriptContext context) + { + try + { + var subProcessTask = task as SubProcessTask; + if (subProcessTask == null) + { + throw new InvalidOperationException("Task must be a SubProcessTask"); + } + + // Configure subprocess + subProcessTask.SetDomain("core"); + subProcessTask.SetFlow("task-test-subflow"); + subProcessTask.SetKey(context.Instance?.Key ?? Guid.NewGuid().ToString()); + subProcessTask.SetTags(new[] { "task-test", "subprocess", "success" }); + + // Prepare subprocess data + var subProcessBody = new + { + parentInstanceId = context.Instance?.Id, + parentWorkflowId = context.Workflow.Key, + testId = context.Instance?.Data?.testId ?? Guid.NewGuid().ToString(), + launchedAt = DateTime.UtcNow, + launchedBy = "task-test-workflow", + isFireAndForget = true, + message = "SubProcess test - fire-and-forget instance" + }; + subProcessTask.SetBody(subProcessBody); + + return Task.FromResult(new ScriptResponse()); + } + catch (Exception ex) + { + return Task.FromResult(new ScriptResponse + { + Key = "subprocess-input-error", + Data = new { error = ex.Message } + }); + } + } + + public async Task OutputHandler(ScriptContext context) + { + try + { + var response = context.Body; + + if (response?.isSuccess == true) + { + return new ScriptResponse + { + Key = "subprocess-success", + Data = new + { + subProcessResult = new + { + success = true, + subProcessInstanceId = response?.data?.id, + launchedAt = DateTime.UtcNow, + taskType = "SubProcess", + note = "Fire-and-forget: Parent workflow does not wait for subprocess completion" + } + }, + Tags = new[] { "task-test", "subprocess", "success", "fire-and-forget" } + }; + } + + return new ScriptResponse + { + Key = "subprocess-failed", + Data = new + { + subProcessResult = new + { + success = false, + error = response?.errorMessage ?? "Failed to launch subprocess", + failedAt = DateTime.UtcNow, + taskType = "SubProcess" + } + }, + Tags = new[] { "task-test", "subprocess", "failed" } + }; + } + catch (Exception ex) + { + return new ScriptResponse + { + Key = "subprocess-exception", + Data = new + { + subProcessResult = new + { + success = false, + error = ex.Message, + taskType = "SubProcess" + } + } + }; + } + } +} + diff --git a/core/Workflows/task-test/src/TaskResponseUsageMapping.csx b/core/Workflows/task-test/src/TaskResponseUsageMapping.csx new file mode 100644 index 0000000..d358b0c --- /dev/null +++ b/core/Workflows/task-test/src/TaskResponseUsageMapping.csx @@ -0,0 +1,154 @@ +using System; +using System.Threading.Tasks; +using BBT.Workflow.Definitions; +using BBT.Workflow.Scripting; +using BBT.Workflow.Scripting.Functions; + +/// +/// TaskResponse Usage Test Mapping - Demonstrates accessing previous task responses +/// Test case: Verify TaskResponse dictionary usage in ScriptContext after HTTP tasks +/// Note: TaskResponse keys are the task's "key" value converted to camelCase +/// Example: "test-http-task" becomes "testHttpTask" +/// +public class TaskResponseUsageMapping : ScriptBase, IMapping +{ + public Task InputHandler(WorkflowTask task, ScriptContext context) + { + try + { + LogInformation("TaskResponse Usage Test - Starting TaskResponse access test"); + + // Access TaskResponse dictionary from ScriptContext + // This contains results from previously completed tasks in the workflow + var taskResponseDict = context.TaskResponse; + + if (taskResponseDict != null && taskResponseDict.Count > 0) + { + LogInformation("TaskResponse Usage Test - Found {0} task response(s) in context", + args: new object?[] { taskResponseDict.Count }); + + // Log all available task response keys + foreach (var key in taskResponseDict.Keys) + { + LogDebug("TaskResponse Usage Test - Available task response key: {0}", + args: new object?[] { key }); + } + + // Example: Access specific task response if it exists + // TaskResponse key is the task's "key" value converted to camelCase + // e.g., "test-http-task" becomes "testHttpTask" + if (taskResponseDict.ContainsKey("testHttpTask")) + { + var httpTaskResult = taskResponseDict["testHttpTask"]; + LogInformation("TaskResponse Usage Test - HTTP task response found: isSuccess={0}, statusCode={1}", + args: new object?[] { httpTaskResult?.isSuccess, httpTaskResult?.statusCode }); + + // Access response data + var responseData = httpTaskResult?.data; + if (responseData != null) + { + LogDebug("TaskResponse Usage Test - HTTP response data available"); + } + } + } + else + { + LogWarning("TaskResponse Usage Test - No previous task responses found in context"); + } + + return Task.FromResult(new ScriptResponse + { + Data = new + { + taskResponseCount = taskResponseDict?.Count ?? 0, + taskResponseKeys = taskResponseDict != null + ? string.Join(", ", taskResponseDict.Keys) + : "none", + testedAt = DateTime.UtcNow + } + }); + } + catch (Exception ex) + { + LogError("TaskResponse Usage Test - Failed to access TaskResponse: {0}", + args: new object?[] { ex.Message }); + + return Task.FromResult(new ScriptResponse + { + Key = "task-response-input-error", + Data = new { error = ex.Message } + }); + } + } + + public Task OutputHandler(ScriptContext context) + { + try + { + LogInformation("TaskResponse Usage Test - Processing output"); + + // Demonstrate accessing TaskResponse in OutputHandler as well + var taskResponseDict = context.TaskResponse; + + // Build a summary of available task responses + var taskResponseSummary = new System.Collections.Generic.List(); + + if (taskResponseDict != null) + { + foreach (var kvp in taskResponseDict) + { + taskResponseSummary.Add(new + { + taskKey = kvp.Key, + hasData = kvp.Value != null, + isSuccess = kvp.Value?.isSuccess, + statusCode = kvp.Value?.statusCode, + taskType = kvp.Value?.taskType + }); + } + } + + LogInformation("TaskResponse Usage Test - Processed {0} task response(s)", + args: new object?[] { taskResponseSummary.Count }); + + return Task.FromResult(new ScriptResponse + { + Key = "task-response-success", + Data = new + { + taskResponseResult = new + { + success = true, + testName = "TaskResponse Usage", + description = "Demonstrated context.TaskResponse dictionary access", + totalTaskResponses = taskResponseDict?.Count ?? 0, + taskResponseSummary = taskResponseSummary, + completedAt = DateTime.UtcNow, + taskType = "ScriptTask" + } + }, + Tags = new[] { "task-test", "task-response", "context-access", "success" } + }); + } + catch (Exception ex) + { + LogError("TaskResponse Usage Test - Output handler exception: {0}", + args: new object?[] { ex.Message }); + + return Task.FromResult(new ScriptResponse + { + Key = "task-response-exception", + Data = new + { + taskResponseResult = new + { + success = false, + error = ex.Message, + taskType = "ScriptTask" + } + } + }); + } + } +} + diff --git a/core/Workflows/task-test/task-test-subflow.json b/core/Workflows/task-test/task-test-subflow.json new file mode 100644 index 0000000..90deb96 --- /dev/null +++ b/core/Workflows/task-test/task-test-subflow.json @@ -0,0 +1,113 @@ +{ + "key": "task-test-subflow", + "flow": "sys-flows", + "domain": "core", + "version": "1.0.0", + "tags": [ + "task-test", + "subflow", + "helper-workflow", + "integration-test" + ], + "attributes": { + "type": "S", + "timeout": null, + "labels": [ + { + "language": "en-US", + "label": "Task Test Subflow" + }, + { + "language": "tr-TR", + "label": "Task Testi Alt Akışı" + } + ], + "functions": [], + "features": [], + "extensions": [], + "sharedTransitions": [], + "startTransition": { + "key": "start-subflow", + "target": "subflow-active", + "triggerType": 0, + "versionStrategy": "Minor", + "labels": [ + { + "language": "en-US", + "label": "Start Subflow" + }, + { + "language": "tr-TR", + "label": "Alt Akışı Başlat" + } + ], + "onExecutionTasks": [] + }, + "states": [ + { + "key": "subflow-active", + "stateType": 1, + "subType": 0, + "versionStrategy": "Minor", + "labels": [ + { + "language": "en-US", + "label": "Subflow Active" + }, + { + "language": "tr-TR", + "label": "Alt Akış Aktif" + } + ], + "view": null, + "subFlow": null, + "onEntries": [], + "onExits": [], + "transitions": [ + { + "key": "complete-subflow", + "target": "subflow-completed", + "triggerType": 0, + "versionStrategy": "Minor", + "labels": [ + { + "language": "en-US", + "label": "Complete Subflow" + }, + { + "language": "tr-TR", + "label": "Alt Akışı Tamamla" + } + ], + "schema": null, + "rule": null, + "timer": null, + "view": null, + "onExecutionTasks": [] + } + ] + }, + { + "key": "subflow-completed", + "stateType": 3, + "subType": 1, + "versionStrategy": "Minor", + "labels": [ + { + "language": "en-US", + "label": "Subflow Completed" + }, + { + "language": "tr-TR", + "label": "Alt Akış Tamamlandı" + } + ], + "view": null, + "subFlow": null, + "onEntries": [], + "onExits": [], + "transitions": [] + } + ] + } +} \ No newline at end of file diff --git a/core/Workflows/task-test/task-test-workflow.http b/core/Workflows/task-test/task-test-workflow.http new file mode 100644 index 0000000..adb795b --- /dev/null +++ b/core/Workflows/task-test/task-test-workflow.http @@ -0,0 +1,149 @@ +############################################################################### +# Task Test Workflow - HTTP Test File +# +# This file tests the task-test-workflow which demonstrates all vNext task types: +# - DaprPubSub (Type 4) +# - HttpTask (Type 6) +# - DaprServiceTask (Type 3) +# - NotificationTask (Type 8) +# - ScriptTask (Type 7) +# - GetInstanceData (Type 13) +# - DirectTransition (Type 12) +# - Start (Type 11) +# - SubProcess (Type 14) +# +# Prerequisites: +# 1. vNext Runtime running on localhost:4201 +# 2. Mockoon running on localhost:3001 +# 3. Dapr sidecar running (for DaprPubSub and DaprServiceTask) +############################################################################### + +@baseUrl = http://localhost:4201 +@apiVersion = 1 +@domain = core +@workflow = task-test-workflow +@subflow = task-test-subflow +@instanceKey = task-test-{{$timestamp}} + +############################################################################### +# Step 1: Start Task Test Workflow +# This initiates the main workflow that will test all task types +############################################################################### + +### Start Main Workflow Instance +# @name startWorkflow +POST {{baseUrl}}/api/v{{apiVersion}}/{{domain}}/workflows/{{workflow}}/instances/start +Content-Type: application/json + +{ + "key": "{{instanceKey}}", + "tags": ["task-test", "all-task-types", "integration-test"], + "attributes": { + "testId": "test-{{$timestamp}}", + "testName": "All Task Types Test", + "testDescription": "Testing all vNext task types in a single workflow", + "startedBy": "http-test-file", + "environment": "development" + } +} + +############################################################################### +# Step 2: Check Workflow State (Long Polling) +# The workflow should automatically progress through all states +############################################################################### + +### Get Current State - Use Long Polling +GET {{baseUrl}}/api/v{{apiVersion}}/{{domain}}/workflows/{{workflow}}/instances/{{instanceKey}}/functions/state +Accept: application/json + +############################################################################### +# Step 3: Get Instance Data +# Retrieve all accumulated data from the workflow instance +############################################################################### + +### Get Instance Data +GET {{baseUrl}}/api/v{{apiVersion}}/{{domain}}/workflows/{{workflow}}/instances/{{instanceKey}}/functions/data +Accept: application/json + +############################################################################### +# Subflow Operations - For Start, GetInstanceData, DirectTransition tests +############################################################################### + +### Start Subflow Instance Manually (for testing Start task type) +# @name startSubflow +POST {{baseUrl}}/api/v{{apiVersion}}/{{domain}}/workflows/{{subflow}}/instances/start +Content-Type: application/json + +{ + "key": "subflow-{{$timestamp}}", + "tags": ["task-test", "subflow", "helper"], + "attributes": { + "parentTestId": "test-{{$timestamp}}", + "purpose": "Testing Start, GetInstanceData, DirectTransition tasks", + "createdAt": "{{$isoTimestamp}}" + } +} + +### Get Subflow State +GET {{baseUrl}}/api/v{{apiVersion}}/{{domain}}/workflows/{{subflow}}/instances/subflow-{{$timestamp}}/functions/state +Accept: application/json + +### Get Subflow Data +GET {{baseUrl}}/api/v{{apiVersion}}/{{domain}}/workflows/{{subflow}}/instances/subflow-{{$timestamp}}/functions/data +Accept: application/json + +### Complete Subflow (DirectTransition test target) +PATCH {{baseUrl}}/api/v{{apiVersion}}/{{domain}}/workflows/{{subflow}}/instances/subflow-{{$timestamp}}/transitions/complete-subflow +Content-Type: application/json + +{ + "completedBy": "http-test-file", + "completedAt": "{{$isoTimestamp}}", + "message": "Subflow completed via HTTP test" +} + +############################################################################### +# Mockoon Endpoint Tests - Verify Mock Server is Running +############################################################################### + +### Test Mockoon Health Check +GET http://localhost:3001/health +Accept: application/json + +### Test Task Test HTTP Endpoint (Mockoon) +POST http://localhost:3001/api/task-test/http-endpoint +Content-Type: application/json + +{ + "testId": "mockoon-test-{{$timestamp}}", + "action": "http-task-test", + "timestamp": "{{$isoTimestamp}}" +} + +### Test Task Test HTTP Endpoint - Error Scenario +POST http://localhost:3001/api/task-test/http-endpoint +Content-Type: application/json + +{ + "testId": "mockoon-error-test-{{$timestamp}}", + "simulateError": "true" +} + +############################################################################### +# Task Type Summary +############################################################################### +# +# | Task Type | Type Code | Description | +# |------------------|-----------|---------------------------------------| +# | DaprServiceTask | 3 | Dapr service-to-service invocation | +# | DaprPubSubTask | 4 | Dapr publish/subscribe messaging | +# | HttpTask | 6 | External HTTP API calls | +# | ScriptTask | 7 | Custom business logic execution | +# | NotificationTask | 8 | Real-time client notifications | +# | StartTask | 11 | Start new workflow instance | +# | DirectTriggerTask| 12 | Trigger transition on existing inst. | +# | GetInstanceData | 13 | Fetch data from another workflow | +# | SubProcessTask | 14 | Fire-and-forget subprocess launch | +# +############################################################################### + diff --git a/core/Workflows/task-test/task-test-workflow.json b/core/Workflows/task-test/task-test-workflow.json new file mode 100644 index 0000000..64d0166 --- /dev/null +++ b/core/Workflows/task-test/task-test-workflow.json @@ -0,0 +1,828 @@ +{ + "key": "task-test-workflow", + "flow": "sys-flows", + "domain": "core", + "version": "1.0.0", + "tags": [ + "task-test", + "all-task-types", + "integration-test", + "get-secret-async", + "get-config-value", + "task-response", + "dapr-pubsub", + "http-task", + "dapr-service", + "notification", + "script", + "get-instance-data", + "direct-transition", + "start", + "subprocess" + ], + "attributes": { + "type": "F", + "timeout": null, + "labels": [ + { + "language": "en-US", + "label": "Task Type Test Workflow" + }, + { + "language": "tr-TR", + "label": "Task Tipi Test İş Akışı" + } + ], + "functions": [], + "features": [], + "extensions": [], + "sharedTransitions": [], + "startTransition": { + "key": "start-task-test", + "target": "test-get-secret-state", + "triggerType": 0, + "versionStrategy": "Minor", + "labels": [ + { + "language": "en-US", + "label": "Start Task Test" + }, + { + "language": "tr-TR", + "label": "Task Testini Başlat" + } + ], + "onExecutionTasks": [ + { + "order": 1, + "task": { + "key": "script-task", + "domain": "core", + "version": "1.0.0", + "flow": "sys-tasks" + }, + "mapping": { + "location": "./src/InitialTransitionMapping.csx", + "code": "dXNpbmcgU3lzdGVtOwp1c2luZyBTeXN0ZW0uVGhyZWFkaW5nLlRhc2tzOwp1c2luZyBCQlQuV29ya2Zsb3cuRGVmaW5pdGlvbnM7CnVzaW5nIEJCVC5Xb3JrZmxvdy5TY3JpcHRpbmc7CgovLy8gPHN1bW1hcnk+Ci8vLyBJbml0aWFsIFRyYW5zaXRpb24gTWFwcGluZyAtIEluaXRpYWxpemVzIHdvcmtmbG93IHdpdGggdGVzdCBkYXRhCi8vLyA8L3N1bW1hcnk+CnB1YmxpYyBjbGFzcyBJbml0aWFsVHJhbnNpdGlvbk1hcHBpbmcgOiBJTWFwcGluZwp7CiAgICBwdWJsaWMgVGFzazxTY3JpcHRSZXNwb25zZT4gSW5wdXRIYW5kbGVyKFdvcmtmbG93VGFzayB0YXNrLCBTY3JpcHRDb250ZXh0IGNvbnRleHQpCiAgICB7CiAgICAgICAgcmV0dXJuIFRhc2suRnJvbVJlc3VsdChuZXcgU2NyaXB0UmVzcG9uc2UoKSk7CiAgICB9CgogICAgcHVibGljIGFzeW5jIFRhc2s8U2NyaXB0UmVzcG9uc2U+IE91dHB1dEhhbmRsZXIoU2NyaXB0Q29udGV4dCBjb250ZXh0KQogICAgewogICAgICAgIHRyeQogICAgICAgIHsKICAgICAgICAgICAgdmFyIGlucHV0RGF0YSA9IGNvbnRleHQuSW5zdGFuY2U/LkRhdGE7CiAgICAgICAgICAgIAogICAgICAgICAgICByZXR1cm4gbmV3IFNjcmlwdFJlc3BvbnNlCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIEtleSA9ICJpbml0aWFsLXN1Y2Nlc3MiLAogICAgICAgICAgICAgICAgRGF0YSA9IG5ldwogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIHRlc3RJZCA9IGlucHV0RGF0YT8udGVzdElkID8/IEd1aWQuTmV3R3VpZCgpLlRvU3RyaW5nKCksCiAgICAgICAgICAgICAgICAgICAgd29ya2Zsb3dTdGFydGVkQXQgPSBEYXRlVGltZS5VdGNOb3csCiAgICAgICAgICAgICAgICAgICAgdGVzdENvbmZpZ3VyYXRpb24gPSBuZXcKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgIHRlc3RHZXRTZWNyZXRBc3luYyA9IHRydWUsCiAgICAgICAgICAgICAgICAgICAgICAgIHRlc3RHZXRDb25maWdWYWx1ZSA9IHRydWUsCiAgICAgICAgICAgICAgICAgICAgICAgIHRlc3RUYXNrUmVzcG9uc2UgPSB0cnVlLAogICAgICAgICAgICAgICAgICAgICAgICB0ZXN0RGFwclB1YlN1YiA9IHRydWUsCiAgICAgICAgICAgICAgICAgICAgICAgIHRlc3RIdHRwVGFzayA9IHRydWUsCiAgICAgICAgICAgICAgICAgICAgICAgIHRlc3REYXByU2VydmljZVRhc2sgPSB0cnVlLAogICAgICAgICAgICAgICAgICAgICAgICB0ZXN0Tm90aWZpY2F0aW9uVGFzayA9IHRydWUsCiAgICAgICAgICAgICAgICAgICAgICAgIHRlc3RTY3JpcHRUYXNrID0gdHJ1ZSwKICAgICAgICAgICAgICAgICAgICAgICAgdGVzdEdldEluc3RhbmNlRGF0YSA9IHRydWUsCiAgICAgICAgICAgICAgICAgICAgICAgIHRlc3REaXJlY3RUcmFuc2l0aW9uID0gdHJ1ZSwKICAgICAgICAgICAgICAgICAgICAgICAgdGVzdFN0YXJ0V29ya2Zsb3cgPSB0cnVlLAogICAgICAgICAgICAgICAgICAgICAgICB0ZXN0U3ViUHJvY2VzcyA9IHRydWUKICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgIHRhc2tUZXN0UmVzdWx0cyA9IG5ldyB7IH0KICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICBUYWdzID0gbmV3W10geyAidGFzay10ZXN0IiwgImluaXRpYWxpemVkIiB9CiAgICAgICAgICAgIH07CiAgICAgICAgfQogICAgICAgIGNhdGNoIChFeGNlcHRpb24gZXgpCiAgICAgICAgewogICAgICAgICAgICByZXR1cm4gbmV3IFNjcmlwdFJlc3BvbnNlCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIEtleSA9ICJpbml0aWFsLWVycm9yIiwKICAgICAgICAgICAgICAgIERhdGEgPSBuZXcgeyBlcnJvciA9IGV4Lk1lc3NhZ2UgfQogICAgICAgICAgICB9OwogICAgICAgIH0KICAgIH0KfQoK" + } + } + ] + }, + "states": [ + { + "key": "test-get-secret-state", + "stateType": 1, + "subType": 0, + "versionStrategy": "Minor", + "labels": [ + { + "language": "en-US", + "label": "Test GetSecretAsync" + }, + { + "language": "tr-TR", + "label": "GetSecretAsync Testi" + } + ], + "view": null, + "subFlow": null, + "onEntries": [ + { + "order": 1, + "task": { + "key": "script-task", + "domain": "core", + "version": "1.0.0", + "flow": "sys-tasks" + }, + "mapping": { + "location": "./src/GetSecretAsyncMapping.csx", + "code": "dXNpbmcgU3lzdGVtOwp1c2luZyBTeXN0ZW0uVGhyZWFkaW5nLlRhc2tzOwp1c2luZyBCQlQuV29ya2Zsb3cuRGVmaW5pdGlvbnM7CnVzaW5nIEJCVC5Xb3JrZmxvdy5TY3JpcHRpbmc7CnVzaW5nIEJCVC5Xb3JrZmxvdy5TY3JpcHRpbmcuRnVuY3Rpb25zOwoKLy8vIDxzdW1tYXJ5PgovLy8gR2V0U2VjcmV0QXN5bmMgVGVzdCBNYXBwaW5nIC0gRGVtb25zdHJhdGVzIHNlY3JldCByZXRyaWV2YWwgZnJvbSBEYXByIHNlY3JldCBzdG9yZQovLy8gVGVzdCBjYXNlOiBWZXJpZnkgR2V0U2VjcmV0QXN5bmMgZnVuY3Rpb25hbGl0eSBhbmQgbG9nZ2luZwovLy8gPC9zdW1tYXJ5PgpwdWJsaWMgY2xhc3MgR2V0U2VjcmV0QXN5bmNNYXBwaW5nIDogU2NyaXB0QmFzZSwgSU1hcHBpbmcKewogICAgcHVibGljIGFzeW5jIFRhc2s8U2NyaXB0UmVzcG9uc2U+IElucHV0SGFuZGxlcihXb3JrZmxvd1Rhc2sgdGFzaywgU2NyaXB0Q29udGV4dCBjb250ZXh0KQogICAgewogICAgICAgIHRyeQogICAgICAgIHsKICAgICAgICAgICAgTG9nSW5mb3JtYXRpb24oIkdldFNlY3JldEFzeW5jIFRlc3QgLSBTdGFydGluZyBzZWNyZXQgcmV0cmlldmFsIHRlc3QiKTsKCiAgICAgICAgICAgIC8vIFJldHJpZXZlIEFQSSBzZWNyZXQgZnJvbSBEYXByIHNlY3JldCBzdG9yZSB1c2luZyBHZXRTZWNyZXRBc3luYwogICAgICAgICAgICB2YXIgYXBpU2VjcmV0ID0gYXdhaXQgR2V0U2VjcmV0QXN5bmMoInZuZXh0LXNlY3JldCIsICJ3b3JrZmxvdy1zZWNyZXQiLCAiQXBpU2VjcmV0Iik7CiAgICAgICAgICAgIAogICAgICAgICAgICBMb2dJbmZvcm1hdGlvbigiR2V0U2VjcmV0QXN5bmMgVGVzdCAtIFN1Y2Nlc3NmdWxseSByZXRyaWV2ZWQgQXBpU2VjcmV0Iik7CiAgICAgICAgICAgIExvZ0RlYnVnKCJHZXRTZWNyZXRBc3luYyBUZXN0IC0gU2VjcmV0IHZhbHVlIGxlbmd0aDogezB9IiwgCiAgICAgICAgICAgICAgICBhcmdzOiBuZXcgb2JqZWN0P1tdIHsgYXBpU2VjcmV0Py5MZW5ndGggPz8gMCB9KTsKCiAgICAgICAgICAgIC8vIFN0b3JlIHRoZSByZXN1bHQgZm9yIG91dHB1dCBoYW5kbGVyCiAgICAgICAgICAgIHJldHVybiBuZXcgU2NyaXB0UmVzcG9uc2UKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgRGF0YSA9IG5ldwogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIHNlY3JldFJldHJpZXZlZCA9ICFzdHJpbmcuSXNOdWxsT3JFbXB0eShhcGlTZWNyZXQpLAogICAgICAgICAgICAgICAgICAgIHNlY3JldEtleU5hbWUgPSAiQXBpU2VjcmV0IiwKICAgICAgICAgICAgICAgICAgICByZXRyaWV2ZWRBdCA9IERhdGVUaW1lLlV0Y05vdwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9OwogICAgICAgIH0KICAgICAgICBjYXRjaCAoRXhjZXB0aW9uIGV4KQogICAgICAgIHsKICAgICAgICAgICAgTG9nRXJyb3IoIkdldFNlY3JldEFzeW5jIFRlc3QgLSBGYWlsZWQgdG8gcmV0cmlldmUgc2VjcmV0OiB7MH0iLCAKICAgICAgICAgICAgICAgIGFyZ3M6IG5ldyBvYmplY3Q/W10geyBleC5NZXNzYWdlIH0pOwogICAgICAgICAgICAKICAgICAgICAgICAgcmV0dXJuIG5ldyBTY3JpcHRSZXNwb25zZQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBLZXkgPSAiZ2V0LXNlY3JldC1pbnB1dC1lcnJvciIsCiAgICAgICAgICAgICAgICBEYXRhID0gbmV3IHsgZXJyb3IgPSBleC5NZXNzYWdlIH0KICAgICAgICAgICAgfTsKICAgICAgICB9CiAgICB9CgogICAgcHVibGljIGFzeW5jIFRhc2s8U2NyaXB0UmVzcG9uc2U+IE91dHB1dEhhbmRsZXIoU2NyaXB0Q29udGV4dCBjb250ZXh0KQogICAgewogICAgICAgIHRyeQogICAgICAgIHsKICAgICAgICAgICAgTG9nSW5mb3JtYXRpb24oIkdldFNlY3JldEFzeW5jIFRlc3QgLSBQcm9jZXNzaW5nIG91dHB1dCIpOwoKICAgICAgICAgICAgcmV0dXJuIG5ldyBTY3JpcHRSZXNwb25zZQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBLZXkgPSAiZ2V0LXNlY3JldC1zdWNjZXNzIiwKICAgICAgICAgICAgICAgIERhdGEgPSBuZXcKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBnZXRTZWNyZXRSZXN1bHQgPSBuZXcKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgIHN1Y2Nlc3MgPSB0cnVlLAogICAgICAgICAgICAgICAgICAgICAgICB0ZXN0TmFtZSA9ICJHZXRTZWNyZXRBc3luYyIsCiAgICAgICAgICAgICAgICAgICAgICAgIGRlc2NyaXB0aW9uID0gIlJldHJpZXZlZCBBcGlTZWNyZXQgZnJvbSBEYXByIHNlY3JldCBzdG9yZSIsCiAgICAgICAgICAgICAgICAgICAgICAgIGNvbXBsZXRlZEF0ID0gRGF0ZVRpbWUuVXRjTm93LAogICAgICAgICAgICAgICAgICAgICAgICB0YXNrVHlwZSA9ICJTY3JpcHRUYXNrIgogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICBUYWdzID0gbmV3W10geyAidGFzay10ZXN0IiwgImdldC1zZWNyZXQtYXN5bmMiLCAic3VjY2VzcyIgfQogICAgICAgICAgICB9OwogICAgICAgIH0KICAgICAgICBjYXRjaCAoRXhjZXB0aW9uIGV4KQogICAgICAgIHsKICAgICAgICAgICAgTG9nRXJyb3IoIkdldFNlY3JldEFzeW5jIFRlc3QgLSBPdXRwdXQgaGFuZGxlciBleGNlcHRpb246IHswfSIsIAogICAgICAgICAgICAgICAgYXJnczogbmV3IG9iamVjdD9bXSB7IGV4Lk1lc3NhZ2UgfSk7CiAgICAgICAgICAgIAogICAgICAgICAgICByZXR1cm4gbmV3IFNjcmlwdFJlc3BvbnNlCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIEtleSA9ICJnZXQtc2VjcmV0LWV4Y2VwdGlvbiIsCiAgICAgICAgICAgICAgICBEYXRhID0gbmV3CiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgZ2V0U2VjcmV0UmVzdWx0ID0gbmV3CiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICBzdWNjZXNzID0gZmFsc2UsCiAgICAgICAgICAgICAgICAgICAgICAgIGVycm9yID0gZXguTWVzc2FnZSwKICAgICAgICAgICAgICAgICAgICAgICAgdGFza1R5cGUgPSAiU2NyaXB0VGFzayIKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH07CiAgICAgICAgfQogICAgfQp9Cgo=" + } + } + ], + "onExits": [], + "transitions": [ + { + "key": "get-secret-completed", + "target": "test-get-config-state", + "triggerType": 1, + "versionStrategy": "Minor", + "labels": [ + { + "language": "en-US", + "label": "GetSecretAsync Completed" + }, + { + "language": "tr-TR", + "label": "GetSecretAsync Tamamlandı" + } + ], + "schema": null, + "rule": { + "location": "./src/AlwaysTrueRule.csx", + "code": "dXNpbmcgU3lzdGVtLlRocmVhZGluZy5UYXNrczsKdXNpbmcgQkJULldvcmtmbG93LlNjcmlwdGluZzsKCi8vLyA8c3VtbWFyeT4KLy8vIEFsd2F5cyBUcnVlIFJ1bGUgLSBVc2VkIGZvciBhdXRvIHRyYW5zaXRpb25zIHRoYXQgc2hvdWxkIGFsd2F5cyBwcm9jZWVkCi8vLyA8L3N1bW1hcnk+CnB1YmxpYyBjbGFzcyBBbHdheXNUcnVlUnVsZSA6IElDb25kaXRpb25NYXBwaW5nCnsKICAgIHB1YmxpYyBhc3luYyBUYXNrPGJvb2w+IEhhbmRsZXIoU2NyaXB0Q29udGV4dCBjb250ZXh0KQogICAgewogICAgICAgIHJldHVybiB0cnVlOwogICAgfQp9Cgo=" + }, + "timer": null, + "view": null, + "onExecutionTasks": [] + } + ] + }, + { + "key": "test-get-config-state", + "stateType": 2, + "subType": 0, + "versionStrategy": "Minor", + "labels": [ + { + "language": "en-US", + "label": "Test GetConfigValue" + }, + { + "language": "tr-TR", + "label": "GetConfigValue Testi" + } + ], + "view": null, + "subFlow": null, + "onEntries": [ + { + "order": 1, + "task": { + "key": "script-task", + "domain": "core", + "version": "1.0.0", + "flow": "sys-tasks" + }, + "mapping": { + "location": "./src/GetConfigValueMapping.csx", + "code": "dXNpbmcgU3lzdGVtOwp1c2luZyBTeXN0ZW0uVGhyZWFkaW5nLlRhc2tzOwp1c2luZyBCQlQuV29ya2Zsb3cuRGVmaW5pdGlvbnM7CnVzaW5nIEJCVC5Xb3JrZmxvdy5TY3JpcHRpbmc7CnVzaW5nIEJCVC5Xb3JrZmxvdy5TY3JpcHRpbmcuRnVuY3Rpb25zOwoKLy8vIDxzdW1tYXJ5PgovLy8gR2V0Q29uZmlnVmFsdWUgVGVzdCBNYXBwaW5nIC0gRGVtb25zdHJhdGVzIGNvbmZpZ3VyYXRpb24gdmFsdWUgcmV0cmlldmFsCi8vLyBUZXN0IGNhc2U6IFZlcmlmeSBHZXRDb25maWdWYWx1ZSBmdW5jdGlvbmFsaXR5IGFuZCBsb2dnaW5nCi8vLyA8L3N1bW1hcnk+CnB1YmxpYyBjbGFzcyBHZXRDb25maWdWYWx1ZU1hcHBpbmcgOiBTY3JpcHRCYXNlLCBJTWFwcGluZwp7CiAgICBwdWJsaWMgVGFzazxTY3JpcHRSZXNwb25zZT4gSW5wdXRIYW5kbGVyKFdvcmtmbG93VGFzayB0YXNrLCBTY3JpcHRDb250ZXh0IGNvbnRleHQpCiAgICB7CiAgICAgICAgdHJ5CiAgICAgICAgewogICAgICAgICAgICBMb2dJbmZvcm1hdGlvbigiR2V0Q29uZmlnVmFsdWUgVGVzdCAtIFN0YXJ0aW5nIGNvbmZpZ3VyYXRpb24gcmV0cmlldmFsIHRlc3QiKTsKCiAgICAgICAgICAgIC8vIFJldHJpZXZlIEFQSSBiYXNlIFVSTCBmcm9tIGNvbmZpZ3VyYXRpb24gdXNpbmcgR2V0Q29uZmlnVmFsdWUKICAgICAgICAgICAgdmFyIGFwaUJhc2VVcmwgPSBHZXRDb25maWdWYWx1ZSgiRXhhbXBsZTpBcGlCYXNlVXJsIik7CiAgICAgICAgICAgIAogICAgICAgICAgICBMb2dJbmZvcm1hdGlvbigiR2V0Q29uZmlnVmFsdWUgVGVzdCAtIFN1Y2Nlc3NmdWxseSByZXRyaWV2ZWQgQXBpQmFzZVVybDogezB9IiwgCiAgICAgICAgICAgICAgICBhcmdzOiBuZXcgb2JqZWN0P1tdIHsgYXBpQmFzZVVybCA/PyAibnVsbCIgfSk7CgogICAgICAgICAgICByZXR1cm4gVGFzay5Gcm9tUmVzdWx0KG5ldyBTY3JpcHRSZXNwb25zZQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBEYXRhID0gbmV3CiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgY29uZmlnUmV0cmlldmVkID0gIXN0cmluZy5Jc051bGxPckVtcHR5KGFwaUJhc2VVcmwpLAogICAgICAgICAgICAgICAgICAgIGNvbmZpZ0tleU5hbWUgPSAiQXBpQmFzZVVybCIsCiAgICAgICAgICAgICAgICAgICAgY29uZmlnVmFsdWUgPSBhcGlCYXNlVXJsLAogICAgICAgICAgICAgICAgICAgIHJldHJpZXZlZEF0ID0gRGF0ZVRpbWUuVXRjTm93CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0pOwogICAgICAgIH0KICAgICAgICBjYXRjaCAoRXhjZXB0aW9uIGV4KQogICAgICAgIHsKICAgICAgICAgICAgTG9nRXJyb3IoIkdldENvbmZpZ1ZhbHVlIFRlc3QgLSBGYWlsZWQgdG8gcmV0cmlldmUgY29uZmlnOiB7MH0iLCAKICAgICAgICAgICAgICAgIGFyZ3M6IG5ldyBvYmplY3Q/W10geyBleC5NZXNzYWdlIH0pOwogICAgICAgICAgICAKICAgICAgICAgICAgcmV0dXJuIFRhc2suRnJvbVJlc3VsdChuZXcgU2NyaXB0UmVzcG9uc2UKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgS2V5ID0gImdldC1jb25maWctaW5wdXQtZXJyb3IiLAogICAgICAgICAgICAgICAgRGF0YSA9IG5ldyB7IGVycm9yID0gZXguTWVzc2FnZSB9CiAgICAgICAgICAgIH0pOwogICAgICAgIH0KICAgIH0KCiAgICBwdWJsaWMgVGFzazxTY3JpcHRSZXNwb25zZT4gT3V0cHV0SGFuZGxlcihTY3JpcHRDb250ZXh0IGNvbnRleHQpCiAgICB7CiAgICAgICAgdHJ5CiAgICAgICAgewogICAgICAgICAgICBMb2dJbmZvcm1hdGlvbigiR2V0Q29uZmlnVmFsdWUgVGVzdCAtIFByb2Nlc3Npbmcgb3V0cHV0Iik7CgogICAgICAgICAgICB2YXIgaW5wdXREYXRhID0gY29udGV4dC5JbnN0YW5jZT8uRGF0YTsKCiAgICAgICAgICAgIHJldHVybiBUYXNrLkZyb21SZXN1bHQobmV3IFNjcmlwdFJlc3BvbnNlCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIEtleSA9ICJnZXQtY29uZmlnLXN1Y2Nlc3MiLAogICAgICAgICAgICAgICAgRGF0YSA9IG5ldwogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIGdldENvbmZpZ1Jlc3VsdCA9IG5ldwogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgc3VjY2VzcyA9IHRydWUsCiAgICAgICAgICAgICAgICAgICAgICAgIHRlc3ROYW1lID0gIkdldENvbmZpZ1ZhbHVlIiwKICAgICAgICAgICAgICAgICAgICAgICAgZGVzY3JpcHRpb24gPSAiUmV0cmlldmVkIEFwaUJhc2VVcmwgZnJvbSBjb25maWd1cmF0aW9uIiwKICAgICAgICAgICAgICAgICAgICAgICAgdGFza1R5cGUgPSAiU2NyaXB0VGFzayIKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgVGFncyA9IG5ld1tdIHsgInRhc2stdGVzdCIsICJnZXQtY29uZmlnLXZhbHVlIiwgInN1Y2Nlc3MiIH0KICAgICAgICAgICAgfSk7CiAgICAgICAgfQogICAgICAgIGNhdGNoIChFeGNlcHRpb24gZXgpCiAgICAgICAgewogICAgICAgICAgICBMb2dFcnJvcigiR2V0Q29uZmlnVmFsdWUgVGVzdCAtIE91dHB1dCBoYW5kbGVyIGV4Y2VwdGlvbjogezB9IiwgCiAgICAgICAgICAgICAgICBhcmdzOiBuZXcgb2JqZWN0P1tdIHsgZXguTWVzc2FnZSB9KTsKICAgICAgICAgICAgCiAgICAgICAgICAgIHJldHVybiBUYXNrLkZyb21SZXN1bHQobmV3IFNjcmlwdFJlc3BvbnNlCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIEtleSA9ICJnZXQtY29uZmlnLWV4Y2VwdGlvbiIsCiAgICAgICAgICAgICAgICBEYXRhID0gbmV3CiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgZ2V0Q29uZmlnUmVzdWx0ID0gbmV3CiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICBzdWNjZXNzID0gZmFsc2UsCiAgICAgICAgICAgICAgICAgICAgICAgIGVycm9yID0gZXguTWVzc2FnZSwKICAgICAgICAgICAgICAgICAgICAgICAgdGFza1R5cGUgPSAiU2NyaXB0VGFzayIKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0pOwogICAgICAgIH0KICAgIH0KfQoK" + } + } + ], + "onExits": [], + "transitions": [ + { + "key": "get-config-completed", + "target": "test-dapr-pubsub-state", + "triggerType": 1, + "versionStrategy": "Minor", + "labels": [ + { + "language": "en-US", + "label": "GetConfigValue Completed" + }, + { + "language": "tr-TR", + "label": "GetConfigValue Tamamlandı" + } + ], + "schema": null, + "rule": { + "location": "./src/AlwaysTrueRule.csx", + "code": "dXNpbmcgU3lzdGVtLlRocmVhZGluZy5UYXNrczsKdXNpbmcgQkJULldvcmtmbG93LlNjcmlwdGluZzsKCi8vLyA8c3VtbWFyeT4KLy8vIEFsd2F5cyBUcnVlIFJ1bGUgLSBVc2VkIGZvciBhdXRvIHRyYW5zaXRpb25zIHRoYXQgc2hvdWxkIGFsd2F5cyBwcm9jZWVkCi8vLyA8L3N1bW1hcnk+CnB1YmxpYyBjbGFzcyBBbHdheXNUcnVlUnVsZSA6IElDb25kaXRpb25NYXBwaW5nCnsKICAgIHB1YmxpYyBhc3luYyBUYXNrPGJvb2w+IEhhbmRsZXIoU2NyaXB0Q29udGV4dCBjb250ZXh0KQogICAgewogICAgICAgIHJldHVybiB0cnVlOwogICAgfQp9Cgo=" + }, + "timer": null, + "view": null, + "onExecutionTasks": [] + } + ] + }, + { + "key": "test-dapr-pubsub-state", + "stateType": 2, + "subType": 0, + "versionStrategy": "Minor", + "labels": [ + { + "language": "en-US", + "label": "Test DaprPubSub" + }, + { + "language": "tr-TR", + "label": "DaprPubSub Testi" + } + ], + "view": null, + "subFlow": null, + "onEntries": [ + { + "order": 1, + "task": { + "key": "test-dapr-pubsub", + "domain": "core", + "version": "1.0.0", + "flow": "sys-tasks" + }, + "mapping": { + "location": "./src/DaprPubSubMapping.csx", + "code": "dXNpbmcgU3lzdGVtOwp1c2luZyBTeXN0ZW0uVGhyZWFkaW5nLlRhc2tzOwp1c2luZyBCQlQuV29ya2Zsb3cuRGVmaW5pdGlvbnM7CnVzaW5nIEJCVC5Xb3JrZmxvdy5TY3JpcHRpbmc7CgovLy8gPHN1bW1hcnk+Ci8vLyBEYXByUHViU3ViIFRhc2sgTWFwcGluZyAtIFB1Ymxpc2hlcyBldmVudHMgdG8gbWVzc2FnZSBidXMKLy8vIFRlc3QgY2FzZTogVmVyaWZ5IGV2ZW50IHB1Ymxpc2hpbmcgdG8gRGFwciBQdWJTdWIgY29tcG9uZW50Ci8vLyA8L3N1bW1hcnk+CnB1YmxpYyBjbGFzcyBEYXByUHViU3ViTWFwcGluZyA6IElNYXBwaW5nCnsKICAgIHB1YmxpYyBUYXNrPFNjcmlwdFJlc3BvbnNlPiBJbnB1dEhhbmRsZXIoV29ya2Zsb3dUYXNrIHRhc2ssIFNjcmlwdENvbnRleHQgY29udGV4dCkKICAgIHsKICAgICAgICB0cnkKICAgICAgICB7CiAgICAgICAgICAgIHZhciBwdWJzdWJUYXNrID0gdGFzayBhcyBEYXByUHViU3ViVGFzazsKICAgICAgICAgICAgaWYgKHB1YnN1YlRhc2sgPT0gbnVsbCkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgdGhyb3cgbmV3IEludmFsaWRPcGVyYXRpb25FeGNlcHRpb24oIlRhc2sgbXVzdCBiZSBhIERhcHJQdWJTdWJUYXNrIik7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIC8vIENvbmZpZ3VyZSBQdWJTdWIgY29tcG9uZW50CiAgICAgICAgICAgIHB1YnN1YlRhc2suU2V0UHViU3ViTmFtZSgidm5leHQtZXhlY3V0aW9uLXB1YnN1YiIpOwogICAgICAgICAgICBwdWJzdWJUYXNrLlNldFRvcGljKCJ2bmV4dC50ZXN0LmV2ZW50cyIpOwoKICAgICAgICAgICAgLy8gQ3JlYXRlIENsb3VkIEV2ZW50cyBmb3JtYXQgZGF0YQogICAgICAgICAgICB2YXIgZXZlbnREYXRhID0gbmV3CiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHNwZWN2ZXJzaW9uID0gIjEuMCIsCiAgICAgICAgICAgICAgICB0eXBlID0gImNvbS52bmV4dC50YXNrLXRlc3QuVGVzdEV2ZW50IiwKICAgICAgICAgICAgICAgIHNvdXJjZSA9ICJ0YXNrLXRlc3Qtd29ya2Zsb3ciLAogICAgICAgICAgICAgICAgaWQgPSBHdWlkLk5ld0d1aWQoKS5Ub1N0cmluZygpLAogICAgICAgICAgICAgICAgdGltZSA9IERhdGVUaW1lLlV0Y05vdy5Ub1N0cmluZygiTyIpLAogICAgICAgICAgICAgICAgZGF0YWNvbnRlbnR0eXBlID0gImFwcGxpY2F0aW9uL2pzb24iLAogICAgICAgICAgICAgICAgZGF0YSA9IG5ldwogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIHRlc3RJZCA9IGNvbnRleHQuSW5zdGFuY2U/LkRhdGE/LnRlc3RJZCA/PyBHdWlkLk5ld0d1aWQoKS5Ub1N0cmluZygpLAogICAgICAgICAgICAgICAgICAgIHdvcmtmbG93SWQgPSBjb250ZXh0LldvcmtmbG93LktleSwKICAgICAgICAgICAgICAgICAgICBpbnN0YW5jZUlkID0gY29udGV4dC5JbnN0YW5jZT8uSWQsCiAgICAgICAgICAgICAgICAgICAgdGltZXN0YW1wID0gRGF0ZVRpbWUuVXRjTm93LAogICAgICAgICAgICAgICAgICAgIG1lc3NhZ2UgPSAiRGFwclB1YlN1YiB0ZXN0IGV2ZW50IHB1Ymxpc2hlZCIKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfTsKCiAgICAgICAgICAgIHB1YnN1YlRhc2suU2V0RGF0YShldmVudERhdGEpOwoKICAgICAgICAgICAgLy8gU2V0IG1ldGFkYXRhCiAgICAgICAgICAgIHZhciBtZXRhZGF0YSA9IG5ldyBEaWN0aW9uYXJ5PHN0cmluZywgc3RyaW5nPz4KICAgICAgICAgICAgewogICAgICAgICAgICAgICAgWyJwcmlvcml0eSJdID0gIm5vcm1hbCIsCiAgICAgICAgICAgICAgICBbImNvcnJlbGF0aW9uSWQiXSA9IGNvbnRleHQuSW5zdGFuY2UuSWQuVG9TdHJpbmcoKSwKICAgICAgICAgICAgICAgIFsic291cmNlIl0gPSAidGFzay10ZXN0LXdvcmtmbG93IgogICAgICAgICAgICB9OwogICAgICAgICAgICBwdWJzdWJUYXNrLlNldE1ldGFkYXRhKG1ldGFkYXRhKTsKCiAgICAgICAgICAgIHJldHVybiBUYXNrLkZyb21SZXN1bHQobmV3IFNjcmlwdFJlc3BvbnNlKCkpOwogICAgICAgIH0KICAgICAgICBjYXRjaCAoRXhjZXB0aW9uIGV4KQogICAgICAgIHsKICAgICAgICAgICAgcmV0dXJuIFRhc2suRnJvbVJlc3VsdChuZXcgU2NyaXB0UmVzcG9uc2UKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgS2V5ID0gImRhcHItcHVic3ViLWlucHV0LWVycm9yIiwKICAgICAgICAgICAgICAgIERhdGEgPSBuZXcgeyBlcnJvciA9IGV4Lk1lc3NhZ2UgfQogICAgICAgICAgICB9KTsKICAgICAgICB9CiAgICB9CgogICAgcHVibGljIGFzeW5jIFRhc2s8U2NyaXB0UmVzcG9uc2U+IE91dHB1dEhhbmRsZXIoU2NyaXB0Q29udGV4dCBjb250ZXh0KQogICAgewogICAgICAgIHRyeQogICAgICAgIHsKICAgICAgICAgICAgdmFyIHJlc3BvbnNlID0gY29udGV4dC5Cb2R5OwoKICAgICAgICAgICAgaWYgKHJlc3BvbnNlPy5pc1N1Y2Nlc3MgPT0gdHJ1ZSkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBTY3JpcHRSZXNwb25zZQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIEtleSA9ICJkYXByLXB1YnN1Yi1zdWNjZXNzIiwKICAgICAgICAgICAgICAgICAgICBEYXRhID0gbmV3CiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICBkYXByUHViU3ViUmVzdWx0ID0gbmV3CiAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN1Y2Nlc3MgPSB0cnVlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgcHVibGlzaGVkQXQgPSBEYXRlVGltZS5VdGNOb3csCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0YXNrVHlwZSA9ICJEYXByUHViU3ViIgogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICBUYWdzID0gbmV3W10geyAidGFzay10ZXN0IiwgImRhcHItcHVic3ViIiwgInN1Y2Nlc3MiIH0KICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIHJldHVybiBuZXcgU2NyaXB0UmVzcG9uc2UKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgS2V5ID0gImRhcHItcHVic3ViLWZhaWxlZCIsCiAgICAgICAgICAgICAgICBEYXRhID0gbmV3CiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgZGFwclB1YlN1YlJlc3VsdCA9IG5ldwogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgc3VjY2VzcyA9IGZhbHNlLAogICAgICAgICAgICAgICAgICAgICAgICBlcnJvciA9IHJlc3BvbnNlPy5lcnJvck1lc3NhZ2UgPz8gIlVua25vd24gZXJyb3IiLAogICAgICAgICAgICAgICAgICAgICAgICBmYWlsZWRBdCA9IERhdGVUaW1lLlV0Y05vdywKICAgICAgICAgICAgICAgICAgICAgICAgdGFza1R5cGUgPSAiRGFwclB1YlN1YiIKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgVGFncyA9IG5ld1tdIHsgInRhc2stdGVzdCIsICJkYXByLXB1YnN1YiIsICJmYWlsZWQiIH0KICAgICAgICAgICAgfTsKICAgICAgICB9CiAgICAgICAgY2F0Y2ggKEV4Y2VwdGlvbiBleCkKICAgICAgICB7CiAgICAgICAgICAgIHJldHVybiBuZXcgU2NyaXB0UmVzcG9uc2UKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgS2V5ID0gImRhcHItcHVic3ViLWV4Y2VwdGlvbiIsCiAgICAgICAgICAgICAgICBEYXRhID0gbmV3CiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgZGFwclB1YlN1YlJlc3VsdCA9IG5ldwogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgc3VjY2VzcyA9IGZhbHNlLAogICAgICAgICAgICAgICAgICAgICAgICBlcnJvciA9IGV4Lk1lc3NhZ2UsCiAgICAgICAgICAgICAgICAgICAgICAgIHRhc2tUeXBlID0gIkRhcHJQdWJTdWIiCiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9OwogICAgICAgIH0KICAgIH0KfQoK" + } + } + ], + "onExits": [], + "transitions": [ + { + "key": "dapr-pubsub-completed", + "target": "test-http-items-state", + "triggerType": 1, + "versionStrategy": "Minor", + "labels": [ + { + "language": "en-US", + "label": "DaprPubSub Completed" + }, + { + "language": "tr-TR", + "label": "DaprPubSub Tamamlandı" + } + ], + "schema": null, + "rule": { + "location": "./src/AlwaysTrueRule.csx", + "code": "dXNpbmcgU3lzdGVtLlRocmVhZGluZy5UYXNrczsKdXNpbmcgQkJULldvcmtmbG93LlNjcmlwdGluZzsKCi8vLyA8c3VtbWFyeT4KLy8vIEFsd2F5cyBUcnVlIFJ1bGUgLSBVc2VkIGZvciBhdXRvIHRyYW5zaXRpb25zIHRoYXQgc2hvdWxkIGFsd2F5cyBwcm9jZWVkCi8vLyA8L3N1bW1hcnk+CnB1YmxpYyBjbGFzcyBBbHdheXNUcnVlUnVsZSA6IElDb25kaXRpb25NYXBwaW5nCnsKICAgIHB1YmxpYyBhc3luYyBUYXNrPGJvb2w+IEhhbmRsZXIoU2NyaXB0Q29udGV4dCBjb250ZXh0KQogICAgewogICAgICAgIHJldHVybiB0cnVlOwogICAgfQp9Cgo=" + }, + "timer": null, + "view": null, + "onExecutionTasks": [] + } + ] + }, + { + "key": "test-http-items-state", + "stateType": 2, + "subType": 0, + "versionStrategy": "Minor", + "labels": [ + { + "language": "en-US", + "label": "Test Items HttpTask" + }, + { + "language": "tr-TR", + "label": "HttpTask Items Testi" + } + ], + "view": null, + "subFlow": null, + "onEntries": [ + { + "order": 1, + "task": { + "key": "test-http-items", + "domain": "core", + "version": "1.0.0", + "flow": "sys-tasks" + }, + "mapping": { + "location": "./src/HttpTaskItemsMapping.csx", + "code": "dXNpbmcgU3lzdGVtOwp1c2luZyBTeXN0ZW0uVGhyZWFkaW5nLlRhc2tzOwp1c2luZyBCQlQuV29ya2Zsb3cuRGVmaW5pdGlvbnM7CnVzaW5nIEJCVC5Xb3JrZmxvdy5TY3JpcHRpbmc7CgovLy8gPHN1bW1hcnk+Ci8vLyBIVFRQIFRhc2sgTWFwcGluZyAtIE1ha2VzIGV4dGVybmFsIEFQSSBjYWxscwovLy8gVGVzdCBjYXNlOiBWZXJpZnkgSFRUUCByZXF1ZXN0cyB0byBleHRlcm5hbCBzZXJ2aWNlcyB2aWEgTW9ja29vbgovLy8gPC9zdW1tYXJ5PgpwdWJsaWMgY2xhc3MgSHR0cFRhc2tJdGVtc01hcHBpbmcgOiBJTWFwcGluZwp7CiAgICBwdWJsaWMgVGFzazxTY3JpcHRSZXNwb25zZT4gSW5wdXRIYW5kbGVyKFdvcmtmbG93VGFzayB0YXNrLCBTY3JpcHRDb250ZXh0IGNvbnRleHQpCiAgICB7CiAgICAgICAgdHJ5CiAgICAgICAgewogICAgICAgICAgICB2YXIgaHR0cFRhc2sgPSB0YXNrIGFzIEh0dHBUYXNrOwogICAgICAgICAgICBpZiAoaHR0cFRhc2sgPT0gbnVsbCkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgdGhyb3cgbmV3IEludmFsaWRPcGVyYXRpb25FeGNlcHRpb24oIlRhc2sgbXVzdCBiZSBhbiBIdHRwVGFzayIpOwogICAgICAgICAgICB9CgogICAgICAgICAgICAvLyBQcmVwYXJlIHJlcXVlc3QgYm9keQogICAgICAgICAgICB2YXIgcmVxdWVzdEJvZHkgPSBuZXcKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgdGVzdElkID0gY29udGV4dC5JbnN0YW5jZT8uRGF0YT8udGVzdElkID8/IEd1aWQuTmV3R3VpZCgpLlRvU3RyaW5nKCksCiAgICAgICAgICAgICAgICB3b3JrZmxvd0lkID0gY29udGV4dC5Xb3JrZmxvdy5LZXksCiAgICAgICAgICAgICAgICBpbnN0YW5jZUlkID0gY29udGV4dC5JbnN0YW5jZT8uSWQsCiAgICAgICAgICAgICAgICB0aW1lc3RhbXAgPSBEYXRlVGltZS5VdGNOb3csCiAgICAgICAgICAgICAgICBhY3Rpb24gPSAiaHR0cC10YXNrLXRlc3QiCiAgICAgICAgICAgIH07CgogICAgICAgICAgICBodHRwVGFzay5TZXRCb2R5KHJlcXVlc3RCb2R5KTsKCiAgICAgICAgICAgIC8vIFNldCBoZWFkZXJzCiAgICAgICAgICAgIHZhciBoZWFkZXJzID0gbmV3IERpY3Rpb25hcnk8c3RyaW5nLCBzdHJpbmc/PgogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBbIkNvbnRlbnQtVHlwZSJdID0gImFwcGxpY2F0aW9uL2pzb24iLAogICAgICAgICAgICAgICAgWyJYLVRlc3QtSWQiXSA9IGNvbnRleHQuSW5zdGFuY2U/LkRhdGE/LnRlc3RJZD8uVG9TdHJpbmcoKSwKICAgICAgICAgICAgICAgIFsiWC1SZXF1ZXN0LUlkIl0gPSBHdWlkLk5ld0d1aWQoKS5Ub1N0cmluZygpLAogICAgICAgICAgICAgICAgWyJYLUNvcnJlbGF0aW9uLUlkIl0gPSBjb250ZXh0Lkluc3RhbmNlLklkLlRvU3RyaW5nKCkKICAgICAgICAgICAgfTsKICAgICAgICAgICAgaHR0cFRhc2suU2V0SGVhZGVycyhoZWFkZXJzKTsKCiAgICAgICAgICAgIHJldHVybiBUYXNrLkZyb21SZXN1bHQobmV3IFNjcmlwdFJlc3BvbnNlKCkpOwogICAgICAgIH0KICAgICAgICBjYXRjaCAoRXhjZXB0aW9uIGV4KQogICAgICAgIHsKICAgICAgICAgICAgcmV0dXJuIFRhc2suRnJvbVJlc3VsdChuZXcgU2NyaXB0UmVzcG9uc2UKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgS2V5ID0gImh0dHAtdGFzay1pbnB1dC1lcnJvciIsCiAgICAgICAgICAgICAgICBEYXRhID0gbmV3IHsgZXJyb3IgPSBleC5NZXNzYWdlIH0KICAgICAgICAgICAgfSk7CiAgICAgICAgfQogICAgfQoKICAgIHB1YmxpYyBhc3luYyBUYXNrPFNjcmlwdFJlc3BvbnNlPiBPdXRwdXRIYW5kbGVyKFNjcmlwdENvbnRleHQgY29udGV4dCkKICAgIHsKICAgICAgICB0cnkKICAgICAgICB7CiAgICAgICAgICAgIHZhciByZXNwb25zZSA9IGNvbnRleHQuQm9keTsKICAgICAgICAgICAgdmFyIHN0YXR1c0NvZGUgPSByZXNwb25zZT8uc3RhdHVzQ29kZSA/PyA1MDA7CgogICAgICAgICAgICBpZiAoc3RhdHVzQ29kZSA+PSAyMDAgJiYgc3RhdHVzQ29kZSA8IDMwMCkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBTY3JpcHRSZXNwb25zZQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIEtleSA9ICJodHRwLXRhc2stc3VjY2VzcyIsCiAgICAgICAgICAgICAgICAgICAgRGF0YSA9IG5ldwogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgaHR0cFRhc2tJdGVtc1Jlc3VsdCA9IG5ldwogICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdWNjZXNzID0gdHJ1ZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXR1c0NvZGUgPSBzdGF0dXNDb2RlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YSA9IHJlc3BvbnNlPy5kYXRhLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgZXhlY3V0aW9uVGltZSA9IHJlc3BvbnNlPy5leGVjdXRpb25EdXJhdGlvbk1zLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJvY2Vzc2VkQXQgPSBEYXRlVGltZS5VdGNOb3csCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0YXNrVHlwZSA9ICJIdHRwVGFzayIKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgVGFncyA9IG5ld1tdIHsgInRhc2stdGVzdCIsICJodHRwLXRhc2siLCAic3VjY2VzcyIgfQogICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgcmV0dXJuIG5ldyBTY3JpcHRSZXNwb25zZQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBLZXkgPSAiaHR0cC10YXNrLWZhaWxlZCIsCiAgICAgICAgICAgICAgICBEYXRhID0gbmV3CiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgaHR0cFRhc2tJdGVtc1Jlc3VsdCA9IG5ldwogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgc3VjY2VzcyA9IGZhbHNlLAogICAgICAgICAgICAgICAgICAgICAgICBzdGF0dXNDb2RlID0gc3RhdHVzQ29kZSwKICAgICAgICAgICAgICAgICAgICAgICAgZXJyb3IgPSByZXNwb25zZT8uZXJyb3JNZXNzYWdlID8/ICJIVFRQIHJlcXVlc3QgZmFpbGVkIiwKICAgICAgICAgICAgICAgICAgICAgICAgZmFpbGVkQXQgPSBEYXRlVGltZS5VdGNOb3csCiAgICAgICAgICAgICAgICAgICAgICAgIHRhc2tUeXBlID0gIkh0dHBUYXNrIgogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICBUYWdzID0gbmV3W10geyAidGFzay10ZXN0IiwgImh0dHAtdGFzayIsICJmYWlsZWQiIH0KICAgICAgICAgICAgfTsKICAgICAgICB9CiAgICAgICAgY2F0Y2ggKEV4Y2VwdGlvbiBleCkKICAgICAgICB7CiAgICAgICAgICAgIHJldHVybiBuZXcgU2NyaXB0UmVzcG9uc2UKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgS2V5ID0gImh0dHAtdGFzay1leGNlcHRpb24iLAogICAgICAgICAgICAgICAgRGF0YSA9IG5ldwogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIGh0dHBUYXNrSXRlbXNSZXN1bHQgPSBuZXcKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgIHN1Y2Nlc3MgPSBmYWxzZSwKICAgICAgICAgICAgICAgICAgICAgICAgZXJyb3IgPSBleC5NZXNzYWdlLAogICAgICAgICAgICAgICAgICAgICAgICB0YXNrVHlwZSA9ICJIdHRwVGFzayIKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH07CiAgICAgICAgfQogICAgfQp9Cgo=" + } + } + ], + "onExits": [], + "transitions": [ + { + "key": "http-task-completed", + "target": "test-http-task-state", + "triggerType": 1, + "versionStrategy": "Minor", + "labels": [ + { + "language": "en-US", + "label": "HttpTask Completed" + }, + { + "language": "tr-TR", + "label": "HttpTask Tamamlandı" + } + ], + "schema": null, + "rule": { + "location": "./src/AlwaysTrueRule.csx", + "code": "dXNpbmcgU3lzdGVtLlRocmVhZGluZy5UYXNrczsKdXNpbmcgQkJULldvcmtmbG93LlNjcmlwdGluZzsKCi8vLyA8c3VtbWFyeT4KLy8vIEFsd2F5cyBUcnVlIFJ1bGUgLSBVc2VkIGZvciBhdXRvIHRyYW5zaXRpb25zIHRoYXQgc2hvdWxkIGFsd2F5cyBwcm9jZWVkCi8vLyA8L3N1bW1hcnk+CnB1YmxpYyBjbGFzcyBBbHdheXNUcnVlUnVsZSA6IElDb25kaXRpb25NYXBwaW5nCnsKICAgIHB1YmxpYyBhc3luYyBUYXNrPGJvb2w+IEhhbmRsZXIoU2NyaXB0Q29udGV4dCBjb250ZXh0KQogICAgewogICAgICAgIHJldHVybiB0cnVlOwogICAgfQp9Cgo=" + }, + "timer": null, + "view": null, + "onExecutionTasks": [] + } + ] + }, + { + "key": "test-http-task-state", + "stateType": 2, + "subType": 0, + "versionStrategy": "Minor", + "labels": [ + { + "language": "en-US", + "label": "Test HttpTask" + }, + { + "language": "tr-TR", + "label": "HttpTask Testi" + } + ], + "view": null, + "subFlow": null, + "onEntries": [ + { + "order": 1, + "task": { + "key": "test-http-task", + "domain": "core", + "version": "1.0.0", + "flow": "sys-tasks" + }, + "mapping": { + "location": "./src/HttpTaskMapping.csx", + "code": "dXNpbmcgU3lzdGVtOwp1c2luZyBTeXN0ZW0uVGhyZWFkaW5nLlRhc2tzOwp1c2luZyBCQlQuV29ya2Zsb3cuRGVmaW5pdGlvbnM7CnVzaW5nIEJCVC5Xb3JrZmxvdy5TY3JpcHRpbmc7CgovLy8gPHN1bW1hcnk+Ci8vLyBIVFRQIFRhc2sgTWFwcGluZyAtIE1ha2VzIGV4dGVybmFsIEFQSSBjYWxscwovLy8gVGVzdCBjYXNlOiBWZXJpZnkgSFRUUCByZXF1ZXN0cyB0byBleHRlcm5hbCBzZXJ2aWNlcyB2aWEgTW9ja29vbgovLy8gPC9zdW1tYXJ5PgpwdWJsaWMgY2xhc3MgSHR0cFRhc2tNYXBwaW5nIDogSU1hcHBpbmcKewogICAgcHVibGljIFRhc2s8U2NyaXB0UmVzcG9uc2U+IElucHV0SGFuZGxlcihXb3JrZmxvd1Rhc2sgdGFzaywgU2NyaXB0Q29udGV4dCBjb250ZXh0KQogICAgewogICAgICAgIHRyeQogICAgICAgIHsKICAgICAgICAgICAgdmFyIGh0dHBUYXNrID0gdGFzayBhcyBIdHRwVGFzazsKICAgICAgICAgICAgaWYgKGh0dHBUYXNrID09IG51bGwpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHRocm93IG5ldyBJbnZhbGlkT3BlcmF0aW9uRXhjZXB0aW9uKCJUYXNrIG11c3QgYmUgYW4gSHR0cFRhc2siKTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgLy8gUHJlcGFyZSByZXF1ZXN0IGJvZHkKICAgICAgICAgICAgdmFyIHJlcXVlc3RCb2R5ID0gbmV3CiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHRlc3RJZCA9IGNvbnRleHQuSW5zdGFuY2U/LkRhdGE/LnRlc3RJZCA/PyBHdWlkLk5ld0d1aWQoKS5Ub1N0cmluZygpLAogICAgICAgICAgICAgICAgd29ya2Zsb3dJZCA9IGNvbnRleHQuV29ya2Zsb3cuS2V5LAogICAgICAgICAgICAgICAgaW5zdGFuY2VJZCA9IGNvbnRleHQuSW5zdGFuY2U/LklkLAogICAgICAgICAgICAgICAgdGltZXN0YW1wID0gRGF0ZVRpbWUuVXRjTm93LAogICAgICAgICAgICAgICAgYWN0aW9uID0gImh0dHAtdGFzay10ZXN0IgogICAgICAgICAgICB9OwoKICAgICAgICAgICAgaHR0cFRhc2suU2V0Qm9keShyZXF1ZXN0Qm9keSk7CgogICAgICAgICAgICAvLyBTZXQgaGVhZGVycwogICAgICAgICAgICB2YXIgaGVhZGVycyA9IG5ldyBEaWN0aW9uYXJ5PHN0cmluZywgc3RyaW5nPz4KICAgICAgICAgICAgewogICAgICAgICAgICAgICAgWyJDb250ZW50LVR5cGUiXSA9ICJhcHBsaWNhdGlvbi9qc29uIiwKICAgICAgICAgICAgICAgIFsiWC1UZXN0LUlkIl0gPSBjb250ZXh0Lkluc3RhbmNlPy5EYXRhPy50ZXN0SWQ/LlRvU3RyaW5nKCksCiAgICAgICAgICAgICAgICBbIlgtUmVxdWVzdC1JZCJdID0gR3VpZC5OZXdHdWlkKCkuVG9TdHJpbmcoKSwKICAgICAgICAgICAgICAgIFsiWC1Db3JyZWxhdGlvbi1JZCJdID0gY29udGV4dC5JbnN0YW5jZS5JZC5Ub1N0cmluZygpCiAgICAgICAgICAgIH07CiAgICAgICAgICAgIGh0dHBUYXNrLlNldEhlYWRlcnMoaGVhZGVycyk7CgogICAgICAgICAgICByZXR1cm4gVGFzay5Gcm9tUmVzdWx0KG5ldyBTY3JpcHRSZXNwb25zZSgpKTsKICAgICAgICB9CiAgICAgICAgY2F0Y2ggKEV4Y2VwdGlvbiBleCkKICAgICAgICB7CiAgICAgICAgICAgIHJldHVybiBUYXNrLkZyb21SZXN1bHQobmV3IFNjcmlwdFJlc3BvbnNlCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIEtleSA9ICJodHRwLXRhc2staW5wdXQtZXJyb3IiLAogICAgICAgICAgICAgICAgRGF0YSA9IG5ldyB7IGVycm9yID0gZXguTWVzc2FnZSB9CiAgICAgICAgICAgIH0pOwogICAgICAgIH0KICAgIH0KCiAgICBwdWJsaWMgYXN5bmMgVGFzazxTY3JpcHRSZXNwb25zZT4gT3V0cHV0SGFuZGxlcihTY3JpcHRDb250ZXh0IGNvbnRleHQpCiAgICB7CiAgICAgICAgdHJ5CiAgICAgICAgewogICAgICAgICAgICB2YXIgcmVzcG9uc2UgPSBjb250ZXh0LkJvZHk7CiAgICAgICAgICAgIHZhciBzdGF0dXNDb2RlID0gcmVzcG9uc2U/LnN0YXR1c0NvZGUgPz8gNTAwOwoKICAgICAgICAgICAgaWYgKHN0YXR1c0NvZGUgPj0gMjAwICYmIHN0YXR1c0NvZGUgPCAzMDApCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHJldHVybiBuZXcgU2NyaXB0UmVzcG9uc2UKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBLZXkgPSAiaHR0cC10YXNrLXN1Y2Nlc3MiLAogICAgICAgICAgICAgICAgICAgIERhdGEgPSBuZXcKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgIGh0dHBUYXNrUmVzdWx0ID0gbmV3CiAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN1Y2Nlc3MgPSB0cnVlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhdHVzQ29kZSA9IHN0YXR1c0NvZGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhID0gcmVzcG9uc2U/LmRhdGEsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBleGVjdXRpb25UaW1lID0gcmVzcG9uc2U/LmV4ZWN1dGlvbkR1cmF0aW9uTXMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcm9jZXNzZWRBdCA9IERhdGVUaW1lLlV0Y05vdywKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRhc2tUeXBlID0gIkh0dHBUYXNrIgogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICBUYWdzID0gbmV3W10geyAidGFzay10ZXN0IiwgImh0dHAtdGFzayIsICJzdWNjZXNzIiB9CiAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICB9CgogICAgICAgICAgICByZXR1cm4gbmV3IFNjcmlwdFJlc3BvbnNlCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIEtleSA9ICJodHRwLXRhc2stZmFpbGVkIiwKICAgICAgICAgICAgICAgIERhdGEgPSBuZXcKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBodHRwVGFza1Jlc3VsdCA9IG5ldwogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgc3VjY2VzcyA9IGZhbHNlLAogICAgICAgICAgICAgICAgICAgICAgICBzdGF0dXNDb2RlID0gc3RhdHVzQ29kZSwKICAgICAgICAgICAgICAgICAgICAgICAgZXJyb3IgPSByZXNwb25zZT8uZXJyb3JNZXNzYWdlID8/ICJIVFRQIHJlcXVlc3QgZmFpbGVkIiwKICAgICAgICAgICAgICAgICAgICAgICAgZmFpbGVkQXQgPSBEYXRlVGltZS5VdGNOb3csCiAgICAgICAgICAgICAgICAgICAgICAgIHRhc2tUeXBlID0gIkh0dHBUYXNrIgogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICBUYWdzID0gbmV3W10geyAidGFzay10ZXN0IiwgImh0dHAtdGFzayIsICJmYWlsZWQiIH0KICAgICAgICAgICAgfTsKICAgICAgICB9CiAgICAgICAgY2F0Y2ggKEV4Y2VwdGlvbiBleCkKICAgICAgICB7CiAgICAgICAgICAgIHJldHVybiBuZXcgU2NyaXB0UmVzcG9uc2UKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgS2V5ID0gImh0dHAtdGFzay1leGNlcHRpb24iLAogICAgICAgICAgICAgICAgRGF0YSA9IG5ldwogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIGh0dHBUYXNrUmVzdWx0ID0gbmV3CiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICBzdWNjZXNzID0gZmFsc2UsCiAgICAgICAgICAgICAgICAgICAgICAgIGVycm9yID0gZXguTWVzc2FnZSwKICAgICAgICAgICAgICAgICAgICAgICAgdGFza1R5cGUgPSAiSHR0cFRhc2siCiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9OwogICAgICAgIH0KICAgIH0KfQoK" + } + }, + { + "order": 2, + "task": { + "key": "script-task", + "domain": "core", + "version": "1.0.0", + "flow": "sys-tasks" + }, + "mapping": { + "location": "./src/TaskResponseUsageMapping.csx", + "code": "dXNpbmcgU3lzdGVtOwp1c2luZyBTeXN0ZW0uVGhyZWFkaW5nLlRhc2tzOwp1c2luZyBCQlQuV29ya2Zsb3cuRGVmaW5pdGlvbnM7CnVzaW5nIEJCVC5Xb3JrZmxvdy5TY3JpcHRpbmc7CnVzaW5nIEJCVC5Xb3JrZmxvdy5TY3JpcHRpbmcuRnVuY3Rpb25zOwoKLy8vIDxzdW1tYXJ5PgovLy8gVGFza1Jlc3BvbnNlIFVzYWdlIFRlc3QgTWFwcGluZyAtIERlbW9uc3RyYXRlcyBhY2Nlc3NpbmcgcHJldmlvdXMgdGFzayByZXNwb25zZXMKLy8vIFRlc3QgY2FzZTogVmVyaWZ5IFRhc2tSZXNwb25zZSBkaWN0aW9uYXJ5IHVzYWdlIGluIFNjcmlwdENvbnRleHQgYWZ0ZXIgSFRUUCB0YXNrcwovLy8gTm90ZTogVGFza1Jlc3BvbnNlIGtleXMgYXJlIHRoZSB0YXNrJ3MgImtleSIgdmFsdWUgY29udmVydGVkIHRvIGNhbWVsQ2FzZQovLy8gRXhhbXBsZTogInRlc3QtaHR0cC10YXNrIiBiZWNvbWVzICJ0ZXN0SHR0cFRhc2siCi8vLyA8L3N1bW1hcnk+CnB1YmxpYyBjbGFzcyBUYXNrUmVzcG9uc2VVc2FnZU1hcHBpbmcgOiBTY3JpcHRCYXNlLCBJTWFwcGluZwp7CiAgICBwdWJsaWMgVGFzazxTY3JpcHRSZXNwb25zZT4gSW5wdXRIYW5kbGVyKFdvcmtmbG93VGFzayB0YXNrLCBTY3JpcHRDb250ZXh0IGNvbnRleHQpCiAgICB7CiAgICAgICAgdHJ5CiAgICAgICAgewogICAgICAgICAgICBMb2dJbmZvcm1hdGlvbigiVGFza1Jlc3BvbnNlIFVzYWdlIFRlc3QgLSBTdGFydGluZyBUYXNrUmVzcG9uc2UgYWNjZXNzIHRlc3QiKTsKCiAgICAgICAgICAgIC8vIEFjY2VzcyBUYXNrUmVzcG9uc2UgZGljdGlvbmFyeSBmcm9tIFNjcmlwdENvbnRleHQKICAgICAgICAgICAgLy8gVGhpcyBjb250YWlucyByZXN1bHRzIGZyb20gcHJldmlvdXNseSBjb21wbGV0ZWQgdGFza3MgaW4gdGhlIHdvcmtmbG93CiAgICAgICAgICAgIHZhciB0YXNrUmVzcG9uc2VEaWN0ID0gY29udGV4dC5UYXNrUmVzcG9uc2U7CgogICAgICAgICAgICBpZiAodGFza1Jlc3BvbnNlRGljdCAhPSBudWxsICYmIHRhc2tSZXNwb25zZURpY3QuQ291bnQgPiAwKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBMb2dJbmZvcm1hdGlvbigiVGFza1Jlc3BvbnNlIFVzYWdlIFRlc3QgLSBGb3VuZCB7MH0gdGFzayByZXNwb25zZShzKSBpbiBjb250ZXh0IiwgCiAgICAgICAgICAgICAgICAgICAgYXJnczogbmV3IG9iamVjdD9bXSB7IHRhc2tSZXNwb25zZURpY3QuQ291bnQgfSk7CgogICAgICAgICAgICAgICAgLy8gTG9nIGFsbCBhdmFpbGFibGUgdGFzayByZXNwb25zZSBrZXlzCiAgICAgICAgICAgICAgICBmb3JlYWNoICh2YXIga2V5IGluIHRhc2tSZXNwb25zZURpY3QuS2V5cykKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBMb2dEZWJ1ZygiVGFza1Jlc3BvbnNlIFVzYWdlIFRlc3QgLSBBdmFpbGFibGUgdGFzayByZXNwb25zZSBrZXk6IHswfSIsIAogICAgICAgICAgICAgICAgICAgICAgICBhcmdzOiBuZXcgb2JqZWN0P1tdIHsga2V5IH0pOwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIC8vIEV4YW1wbGU6IEFjY2VzcyBzcGVjaWZpYyB0YXNrIHJlc3BvbnNlIGlmIGl0IGV4aXN0cwogICAgICAgICAgICAgICAgLy8gVGFza1Jlc3BvbnNlIGtleSBpcyB0aGUgdGFzaydzICJrZXkiIHZhbHVlIGNvbnZlcnRlZCB0byBjYW1lbENhc2UKICAgICAgICAgICAgICAgIC8vIGUuZy4sICJ0ZXN0LWh0dHAtdGFzayIgYmVjb21lcyAidGVzdEh0dHBUYXNrIgogICAgICAgICAgICAgICAgaWYgKHRhc2tSZXNwb25zZURpY3QuQ29udGFpbnNLZXkoInRlc3RIdHRwVGFzayIpKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIHZhciBodHRwVGFza1Jlc3VsdCA9IHRhc2tSZXNwb25zZURpY3RbInRlc3RIdHRwVGFzayJdOwogICAgICAgICAgICAgICAgICAgIExvZ0luZm9ybWF0aW9uKCJUYXNrUmVzcG9uc2UgVXNhZ2UgVGVzdCAtIEhUVFAgdGFzayByZXNwb25zZSBmb3VuZDogaXNTdWNjZXNzPXswfSwgc3RhdHVzQ29kZT17MX0iLCAKICAgICAgICAgICAgICAgICAgICAgICAgYXJnczogbmV3IG9iamVjdD9bXSB7IGh0dHBUYXNrUmVzdWx0Py5pc1N1Y2Nlc3MsIGh0dHBUYXNrUmVzdWx0Py5zdGF0dXNDb2RlIH0pOwogICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgIC8vIEFjY2VzcyByZXNwb25zZSBkYXRhCiAgICAgICAgICAgICAgICAgICAgdmFyIHJlc3BvbnNlRGF0YSA9IGh0dHBUYXNrUmVzdWx0Py5kYXRhOwogICAgICAgICAgICAgICAgICAgIGlmIChyZXNwb25zZURhdGEgIT0gbnVsbCkKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgIExvZ0RlYnVnKCJUYXNrUmVzcG9uc2UgVXNhZ2UgVGVzdCAtIEhUVFAgcmVzcG9uc2UgZGF0YSBhdmFpbGFibGUiKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBMb2dXYXJuaW5nKCJUYXNrUmVzcG9uc2UgVXNhZ2UgVGVzdCAtIE5vIHByZXZpb3VzIHRhc2sgcmVzcG9uc2VzIGZvdW5kIGluIGNvbnRleHQiKTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgcmV0dXJuIFRhc2suRnJvbVJlc3VsdChuZXcgU2NyaXB0UmVzcG9uc2UKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgRGF0YSA9IG5ldwogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIHRhc2tSZXNwb25zZUNvdW50ID0gdGFza1Jlc3BvbnNlRGljdD8uQ291bnQgPz8gMCwKICAgICAgICAgICAgICAgICAgICB0YXNrUmVzcG9uc2VLZXlzID0gdGFza1Jlc3BvbnNlRGljdCAhPSBudWxsIAogICAgICAgICAgICAgICAgICAgICAgICA/IHN0cmluZy5Kb2luKCIsICIsIHRhc2tSZXNwb25zZURpY3QuS2V5cykgCiAgICAgICAgICAgICAgICAgICAgICAgIDogIm5vbmUiLAogICAgICAgICAgICAgICAgICAgIHRlc3RlZEF0ID0gRGF0ZVRpbWUuVXRjTm93CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0pOwogICAgICAgIH0KICAgICAgICBjYXRjaCAoRXhjZXB0aW9uIGV4KQogICAgICAgIHsKICAgICAgICAgICAgTG9nRXJyb3IoIlRhc2tSZXNwb25zZSBVc2FnZSBUZXN0IC0gRmFpbGVkIHRvIGFjY2VzcyBUYXNrUmVzcG9uc2U6IHswfSIsIAogICAgICAgICAgICAgICAgYXJnczogbmV3IG9iamVjdD9bXSB7IGV4Lk1lc3NhZ2UgfSk7CiAgICAgICAgICAgIAogICAgICAgICAgICByZXR1cm4gVGFzay5Gcm9tUmVzdWx0KG5ldyBTY3JpcHRSZXNwb25zZQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBLZXkgPSAidGFzay1yZXNwb25zZS1pbnB1dC1lcnJvciIsCiAgICAgICAgICAgICAgICBEYXRhID0gbmV3IHsgZXJyb3IgPSBleC5NZXNzYWdlIH0KICAgICAgICAgICAgfSk7CiAgICAgICAgfQogICAgfQoKICAgIHB1YmxpYyBUYXNrPFNjcmlwdFJlc3BvbnNlPiBPdXRwdXRIYW5kbGVyKFNjcmlwdENvbnRleHQgY29udGV4dCkKICAgIHsKICAgICAgICB0cnkKICAgICAgICB7CiAgICAgICAgICAgIExvZ0luZm9ybWF0aW9uKCJUYXNrUmVzcG9uc2UgVXNhZ2UgVGVzdCAtIFByb2Nlc3Npbmcgb3V0cHV0Iik7CgogICAgICAgICAgICAvLyBEZW1vbnN0cmF0ZSBhY2Nlc3NpbmcgVGFza1Jlc3BvbnNlIGluIE91dHB1dEhhbmRsZXIgYXMgd2VsbAogICAgICAgICAgICB2YXIgdGFza1Jlc3BvbnNlRGljdCA9IGNvbnRleHQuVGFza1Jlc3BvbnNlOwogICAgICAgICAgICAKICAgICAgICAgICAgLy8gQnVpbGQgYSBzdW1tYXJ5IG9mIGF2YWlsYWJsZSB0YXNrIHJlc3BvbnNlcwogICAgICAgICAgICB2YXIgdGFza1Jlc3BvbnNlU3VtbWFyeSA9IG5ldyBTeXN0ZW0uQ29sbGVjdGlvbnMuR2VuZXJpYy5MaXN0PG9iamVjdD4oKTsKICAgICAgICAgICAgCiAgICAgICAgICAgIGlmICh0YXNrUmVzcG9uc2VEaWN0ICE9IG51bGwpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIGZvcmVhY2ggKHZhciBrdnAgaW4gdGFza1Jlc3BvbnNlRGljdCkKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICB0YXNrUmVzcG9uc2VTdW1tYXJ5LkFkZChuZXcKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgIHRhc2tLZXkgPSBrdnAuS2V5LAogICAgICAgICAgICAgICAgICAgICAgICBoYXNEYXRhID0ga3ZwLlZhbHVlICE9IG51bGwsCiAgICAgICAgICAgICAgICAgICAgICAgIGlzU3VjY2VzcyA9IGt2cC5WYWx1ZT8uaXNTdWNjZXNzLAogICAgICAgICAgICAgICAgICAgICAgICBzdGF0dXNDb2RlID0ga3ZwLlZhbHVlPy5zdGF0dXNDb2RlLAogICAgICAgICAgICAgICAgICAgICAgICB0YXNrVHlwZSA9IGt2cC5WYWx1ZT8udGFza1R5cGUKICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQoKICAgICAgICAgICAgTG9nSW5mb3JtYXRpb24oIlRhc2tSZXNwb25zZSBVc2FnZSBUZXN0IC0gUHJvY2Vzc2VkIHswfSB0YXNrIHJlc3BvbnNlKHMpIiwgCiAgICAgICAgICAgICAgICBhcmdzOiBuZXcgb2JqZWN0P1tdIHsgdGFza1Jlc3BvbnNlU3VtbWFyeS5Db3VudCB9KTsKCiAgICAgICAgICAgIHJldHVybiBUYXNrLkZyb21SZXN1bHQobmV3IFNjcmlwdFJlc3BvbnNlCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIEtleSA9ICJ0YXNrLXJlc3BvbnNlLXN1Y2Nlc3MiLAogICAgICAgICAgICAgICAgRGF0YSA9IG5ldwogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIHRhc2tSZXNwb25zZVJlc3VsdCA9IG5ldwogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgc3VjY2VzcyA9IHRydWUsCiAgICAgICAgICAgICAgICAgICAgICAgIHRlc3ROYW1lID0gIlRhc2tSZXNwb25zZSBVc2FnZSIsCiAgICAgICAgICAgICAgICAgICAgICAgIGRlc2NyaXB0aW9uID0gIkRlbW9uc3RyYXRlZCBjb250ZXh0LlRhc2tSZXNwb25zZSBkaWN0aW9uYXJ5IGFjY2VzcyIsCiAgICAgICAgICAgICAgICAgICAgICAgIHRvdGFsVGFza1Jlc3BvbnNlcyA9IHRhc2tSZXNwb25zZURpY3Q/LkNvdW50ID8/IDAsCiAgICAgICAgICAgICAgICAgICAgICAgIHRhc2tSZXNwb25zZVN1bW1hcnkgPSB0YXNrUmVzcG9uc2VTdW1tYXJ5LAogICAgICAgICAgICAgICAgICAgICAgICBjb21wbGV0ZWRBdCA9IERhdGVUaW1lLlV0Y05vdywKICAgICAgICAgICAgICAgICAgICAgICAgdGFza1R5cGUgPSAiU2NyaXB0VGFzayIKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgVGFncyA9IG5ld1tdIHsgInRhc2stdGVzdCIsICJ0YXNrLXJlc3BvbnNlIiwgImNvbnRleHQtYWNjZXNzIiwgInN1Y2Nlc3MiIH0KICAgICAgICAgICAgfSk7CiAgICAgICAgfQogICAgICAgIGNhdGNoIChFeGNlcHRpb24gZXgpCiAgICAgICAgewogICAgICAgICAgICBMb2dFcnJvcigiVGFza1Jlc3BvbnNlIFVzYWdlIFRlc3QgLSBPdXRwdXQgaGFuZGxlciBleGNlcHRpb246IHswfSIsIAogICAgICAgICAgICAgICAgYXJnczogbmV3IG9iamVjdD9bXSB7IGV4Lk1lc3NhZ2UgfSk7CiAgICAgICAgICAgIAogICAgICAgICAgICByZXR1cm4gVGFzay5Gcm9tUmVzdWx0KG5ldyBTY3JpcHRSZXNwb25zZQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBLZXkgPSAidGFzay1yZXNwb25zZS1leGNlcHRpb24iLAogICAgICAgICAgICAgICAgRGF0YSA9IG5ldwogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIHRhc2tSZXNwb25zZVJlc3VsdCA9IG5ldwogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgc3VjY2VzcyA9IGZhbHNlLAogICAgICAgICAgICAgICAgICAgICAgICBlcnJvciA9IGV4Lk1lc3NhZ2UsCiAgICAgICAgICAgICAgICAgICAgICAgIHRhc2tUeXBlID0gIlNjcmlwdFRhc2siCiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9KTsKICAgICAgICB9CiAgICB9Cn0KCg==" + } + } + ], + "onExits": [], + "transitions": [ + { + "key": "http-task-completed", + "target": "test-dapr-service-state", + "triggerType": 1, + "versionStrategy": "Minor", + "labels": [ + { + "language": "en-US", + "label": "HttpTask Completed" + }, + { + "language": "tr-TR", + "label": "HttpTask Tamamlandı" + } + ], + "schema": null, + "rule": { + "location": "./src/AlwaysTrueRule.csx", + "code": "dXNpbmcgU3lzdGVtLlRocmVhZGluZy5UYXNrczsKdXNpbmcgQkJULldvcmtmbG93LlNjcmlwdGluZzsKCi8vLyA8c3VtbWFyeT4KLy8vIEFsd2F5cyBUcnVlIFJ1bGUgLSBVc2VkIGZvciBhdXRvIHRyYW5zaXRpb25zIHRoYXQgc2hvdWxkIGFsd2F5cyBwcm9jZWVkCi8vLyA8L3N1bW1hcnk+CnB1YmxpYyBjbGFzcyBBbHdheXNUcnVlUnVsZSA6IElDb25kaXRpb25NYXBwaW5nCnsKICAgIHB1YmxpYyBhc3luYyBUYXNrPGJvb2w+IEhhbmRsZXIoU2NyaXB0Q29udGV4dCBjb250ZXh0KQogICAgewogICAgICAgIHJldHVybiB0cnVlOwogICAgfQp9Cgo=" + }, + "timer": null, + "view": null, + "onExecutionTasks": [] + } + ] + }, + { + "key": "test-dapr-service-state", + "stateType": 2, + "subType": 0, + "versionStrategy": "Minor", + "labels": [ + { + "language": "en-US", + "label": "Test DaprServiceTask" + }, + { + "language": "tr-TR", + "label": "DaprServiceTask Testi" + } + ], + "view": null, + "subFlow": null, + "onEntries": [ + { + "order": 1, + "task": { + "key": "test-dapr-service-task", + "domain": "core", + "version": "1.0.0", + "flow": "sys-tasks" + }, + "mapping": { + "location": "./src/DaprServiceTaskMapping.csx", + "code": "dXNpbmcgU3lzdGVtOwp1c2luZyBTeXN0ZW0uVGhyZWFkaW5nLlRhc2tzOwp1c2luZyBCQlQuV29ya2Zsb3cuRGVmaW5pdGlvbnM7CnVzaW5nIEJCVC5Xb3JrZmxvdy5TY3JpcHRpbmc7CgovLy8gPHN1bW1hcnk+Ci8vLyBEYXByU2VydmljZSBUYXNrIE1hcHBpbmcgLSBJbnZva2VzIERhcHIgc2VydmljZXMKLy8vIFRlc3QgY2FzZTogVmVyaWZ5IHNlcnZpY2UtdG8tc2VydmljZSBpbnZvY2F0aW9uIHZpYSBEYXByCi8vLyA8L3N1bW1hcnk+CnB1YmxpYyBjbGFzcyBEYXByU2VydmljZVRhc2tNYXBwaW5nIDogSU1hcHBpbmcKewogICAgcHVibGljIFRhc2s8U2NyaXB0UmVzcG9uc2U+IElucHV0SGFuZGxlcihXb3JrZmxvd1Rhc2sgdGFzaywgU2NyaXB0Q29udGV4dCBjb250ZXh0KQogICAgewogICAgICAgIHRyeQogICAgICAgIHsKICAgICAgICAgICAgdmFyIHNlcnZpY2VUYXNrID0gdGFzayBhcyBEYXByU2VydmljZVRhc2s7CiAgICAgICAgICAgIGlmIChzZXJ2aWNlVGFzayA9PSBudWxsKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSW52YWxpZE9wZXJhdGlvbkV4Y2VwdGlvbigiVGFzayBtdXN0IGJlIGEgRGFwclNlcnZpY2VUYXNrIik7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIC8vIENvbmZpZ3VyZSB0YXJnZXQgc2VydmljZQogICAgICAgICAgICBzZXJ2aWNlVGFzay5TZXRBcHBJZCgibW9ja29vbiIpOwogICAgICAgICAgICBzZXJ2aWNlVGFzay5TZXRNZXRob2ROYW1lKCIvYXBpL3Rhc2stdGVzdC9kYXByLWVuZHBvaW50Iik7CgogICAgICAgICAgICAvLyBQcmVwYXJlIHJlcXVlc3QgYm9keQogICAgICAgICAgICB2YXIgcmVxdWVzdEJvZHkgPSBuZXcKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgdGVzdElkID0gY29udGV4dC5JbnN0YW5jZT8uRGF0YT8udGVzdElkID8/IEd1aWQuTmV3R3VpZCgpLlRvU3RyaW5nKCksCiAgICAgICAgICAgICAgICB3b3JrZmxvd0lkID0gY29udGV4dC5Xb3JrZmxvdy5LZXksCiAgICAgICAgICAgICAgICBpbnN0YW5jZUlkID0gY29udGV4dC5JbnN0YW5jZT8uSWQsCiAgICAgICAgICAgICAgICB0aW1lc3RhbXAgPSBEYXRlVGltZS5VdGNOb3csCiAgICAgICAgICAgICAgICBhY3Rpb24gPSAiZGFwci1zZXJ2aWNlLXRlc3QiCiAgICAgICAgICAgIH07CgogICAgICAgICAgICBzZXJ2aWNlVGFzay5TZXRCb2R5KHJlcXVlc3RCb2R5KTsKCiAgICAgICAgICAgIC8vIFNldCBoZWFkZXJzCiAgICAgICAgICAgIHZhciBoZWFkZXJzID0gbmV3IERpY3Rpb25hcnk8c3RyaW5nLCBzdHJpbmc/PgogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBbIlgtVGVzdC1JZCJdID0gY29udGV4dC5JbnN0YW5jZT8uRGF0YT8udGVzdElkPy5Ub1N0cmluZygpLAogICAgICAgICAgICAgICAgWyJYLVJlcXVlc3QtSWQiXSA9IEd1aWQuTmV3R3VpZCgpLlRvU3RyaW5nKCksCiAgICAgICAgICAgICAgICBbIlgtQ29ycmVsYXRpb24tSWQiXSA9IGNvbnRleHQuSW5zdGFuY2UuSWQuVG9TdHJpbmcoKQogICAgICAgICAgICB9OwogICAgICAgICAgICBzZXJ2aWNlVGFzay5TZXRIZWFkZXJzKGhlYWRlcnMpOwoKICAgICAgICAgICAgcmV0dXJuIFRhc2suRnJvbVJlc3VsdChuZXcgU2NyaXB0UmVzcG9uc2UoKSk7CiAgICAgICAgfQogICAgICAgIGNhdGNoIChFeGNlcHRpb24gZXgpCiAgICAgICAgewogICAgICAgICAgICByZXR1cm4gVGFzay5Gcm9tUmVzdWx0KG5ldyBTY3JpcHRSZXNwb25zZQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBLZXkgPSAiZGFwci1zZXJ2aWNlLWlucHV0LWVycm9yIiwKICAgICAgICAgICAgICAgIERhdGEgPSBuZXcgeyBlcnJvciA9IGV4Lk1lc3NhZ2UgfQogICAgICAgICAgICB9KTsKICAgICAgICB9CiAgICB9CgogICAgcHVibGljIGFzeW5jIFRhc2s8U2NyaXB0UmVzcG9uc2U+IE91dHB1dEhhbmRsZXIoU2NyaXB0Q29udGV4dCBjb250ZXh0KQogICAgewogICAgICAgIHRyeQogICAgICAgIHsKICAgICAgICAgICAgdmFyIHJlc3BvbnNlID0gY29udGV4dC5Cb2R5OwoKICAgICAgICAgICAgaWYgKHJlc3BvbnNlPy5pc1N1Y2Nlc3MgPT0gdHJ1ZSkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBTY3JpcHRSZXNwb25zZQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIEtleSA9ICJkYXByLXNlcnZpY2Utc3VjY2VzcyIsCiAgICAgICAgICAgICAgICAgICAgRGF0YSA9IG5ldwogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgZGFwclNlcnZpY2VSZXN1bHQgPSBuZXcKICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgc3VjY2VzcyA9IHRydWUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhID0gcmVzcG9uc2U/LmRhdGEsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBleGVjdXRpb25UaW1lID0gcmVzcG9uc2U/LmV4ZWN1dGlvbkR1cmF0aW9uTXMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcm9jZXNzZWRBdCA9IERhdGVUaW1lLlV0Y05vdywKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRhc2tUeXBlID0gIkRhcHJTZXJ2aWNlVGFzayIKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgVGFncyA9IG5ld1tdIHsgInRhc2stdGVzdCIsICJkYXByLXNlcnZpY2UiLCAic3VjY2VzcyIgfQogICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgcmV0dXJuIG5ldyBTY3JpcHRSZXNwb25zZQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBLZXkgPSAiZGFwci1zZXJ2aWNlLWZhaWxlZCIsCiAgICAgICAgICAgICAgICBEYXRhID0gbmV3CiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgZGFwclNlcnZpY2VSZXN1bHQgPSBuZXcKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgIHN1Y2Nlc3MgPSBmYWxzZSwKICAgICAgICAgICAgICAgICAgICAgICAgZXJyb3IgPSByZXNwb25zZT8uZXJyb3JNZXNzYWdlID8/ICJEYXByIHNlcnZpY2UgaW52b2NhdGlvbiBmYWlsZWQiLAogICAgICAgICAgICAgICAgICAgICAgICBmYWlsZWRBdCA9IERhdGVUaW1lLlV0Y05vdywKICAgICAgICAgICAgICAgICAgICAgICAgdGFza1R5cGUgPSAiRGFwclNlcnZpY2VUYXNrIgogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICBUYWdzID0gbmV3W10geyAidGFzay10ZXN0IiwgImRhcHItc2VydmljZSIsICJmYWlsZWQiIH0KICAgICAgICAgICAgfTsKICAgICAgICB9CiAgICAgICAgY2F0Y2ggKEV4Y2VwdGlvbiBleCkKICAgICAgICB7CiAgICAgICAgICAgIHJldHVybiBuZXcgU2NyaXB0UmVzcG9uc2UKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgS2V5ID0gImRhcHItc2VydmljZS1leGNlcHRpb24iLAogICAgICAgICAgICAgICAgRGF0YSA9IG5ldwogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIGRhcHJTZXJ2aWNlUmVzdWx0ID0gbmV3CiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICBzdWNjZXNzID0gZmFsc2UsCiAgICAgICAgICAgICAgICAgICAgICAgIGVycm9yID0gZXguTWVzc2FnZSwKICAgICAgICAgICAgICAgICAgICAgICAgdGFza1R5cGUgPSAiRGFwclNlcnZpY2VUYXNrIgogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfTsKICAgICAgICB9CiAgICB9Cn0KCg==" + } + } + ], + "onExits": [], + "transitions": [ + { + "key": "dapr-service-completed", + "target": "test-notification-state", + "triggerType": 1, + "versionStrategy": "Minor", + "labels": [ + { + "language": "en-US", + "label": "DaprServiceTask Completed" + }, + { + "language": "tr-TR", + "label": "DaprServiceTask Tamamlandı" + } + ], + "schema": null, + "rule": { + "location": "./src/AlwaysTrueRule.csx", + "code": "dXNpbmcgU3lzdGVtLlRocmVhZGluZy5UYXNrczsKdXNpbmcgQkJULldvcmtmbG93LlNjcmlwdGluZzsKCi8vLyA8c3VtbWFyeT4KLy8vIEFsd2F5cyBUcnVlIFJ1bGUgLSBVc2VkIGZvciBhdXRvIHRyYW5zaXRpb25zIHRoYXQgc2hvdWxkIGFsd2F5cyBwcm9jZWVkCi8vLyA8L3N1bW1hcnk+CnB1YmxpYyBjbGFzcyBBbHdheXNUcnVlUnVsZSA6IElDb25kaXRpb25NYXBwaW5nCnsKICAgIHB1YmxpYyBhc3luYyBUYXNrPGJvb2w+IEhhbmRsZXIoU2NyaXB0Q29udGV4dCBjb250ZXh0KQogICAgewogICAgICAgIHJldHVybiB0cnVlOwogICAgfQp9Cgo=" + }, + "timer": null, + "view": null, + "onExecutionTasks": [] + } + ] + }, + { + "key": "test-notification-state", + "stateType": 2, + "subType": 0, + "versionStrategy": "Minor", + "labels": [ + { + "language": "en-US", + "label": "Test NotificationTask" + }, + { + "language": "tr-TR", + "label": "NotificationTask Testi" + } + ], + "view": null, + "subFlow": null, + "onEntries": [ + { + "order": 1, + "task": { + "key": "notification-task", + "domain": "core", + "version": "1.0.0", + "flow": "sys-tasks" + }, + "mapping": { + "type": "G" + } + } + ], + "onExits": [], + "transitions": [ + { + "key": "notification-completed", + "target": "test-script-state", + "triggerType": 1, + "versionStrategy": "Minor", + "labels": [ + { + "language": "en-US", + "label": "NotificationTask Completed" + }, + { + "language": "tr-TR", + "label": "NotificationTask Tamamlandı" + } + ], + "schema": null, + "rule": { + "location": "./src/AlwaysTrueRule.csx", + "code": "dXNpbmcgU3lzdGVtLlRocmVhZGluZy5UYXNrczsKdXNpbmcgQkJULldvcmtmbG93LlNjcmlwdGluZzsKCi8vLyA8c3VtbWFyeT4KLy8vIEFsd2F5cyBUcnVlIFJ1bGUgLSBVc2VkIGZvciBhdXRvIHRyYW5zaXRpb25zIHRoYXQgc2hvdWxkIGFsd2F5cyBwcm9jZWVkCi8vLyA8L3N1bW1hcnk+CnB1YmxpYyBjbGFzcyBBbHdheXNUcnVlUnVsZSA6IElDb25kaXRpb25NYXBwaW5nCnsKICAgIHB1YmxpYyBhc3luYyBUYXNrPGJvb2w+IEhhbmRsZXIoU2NyaXB0Q29udGV4dCBjb250ZXh0KQogICAgewogICAgICAgIHJldHVybiB0cnVlOwogICAgfQp9Cgo=" + }, + "timer": null, + "view": null, + "onExecutionTasks": [] + } + ] + }, + { + "key": "test-script-state", + "stateType": 2, + "subType": 0, + "versionStrategy": "Minor", + "labels": [ + { + "language": "en-US", + "label": "Test ScriptTask" + }, + { + "language": "tr-TR", + "label": "ScriptTask Testi" + } + ], + "view": null, + "subFlow": null, + "onEntries": [ + { + "order": 1, + "task": { + "key": "script-task", + "domain": "core", + "version": "1.0.0", + "flow": "sys-tasks" + }, + "mapping": { + "location": "./src/ScriptTaskMapping.csx", + "code": "dXNpbmcgU3lzdGVtOwp1c2luZyBTeXN0ZW0uVGhyZWFkaW5nLlRhc2tzOwp1c2luZyBCQlQuV29ya2Zsb3cuRGVmaW5pdGlvbnM7CnVzaW5nIEJCVC5Xb3JrZmxvdy5TY3JpcHRpbmc7CgovLy8gPHN1bW1hcnk+Ci8vLyBTY3JpcHQgVGFzayBNYXBwaW5nIC0gRXhlY3V0ZXMgY3VzdG9tIGJ1c2luZXNzIGxvZ2ljCi8vLyBUZXN0IGNhc2U6IFZlcmlmeSBzY3JpcHQgZXhlY3V0aW9uIGFuZCBkYXRhIHRyYW5zZm9ybWF0aW9uCi8vLyA8L3N1bW1hcnk+CnB1YmxpYyBjbGFzcyBTY3JpcHRUYXNrTWFwcGluZyA6IElNYXBwaW5nCnsKICAgIHB1YmxpYyBUYXNrPFNjcmlwdFJlc3BvbnNlPiBJbnB1dEhhbmRsZXIoV29ya2Zsb3dUYXNrIHRhc2ssIFNjcmlwdENvbnRleHQgY29udGV4dCkKICAgIHsKICAgICAgICB0cnkKICAgICAgICB7CiAgICAgICAgICAgIC8vIFNjcmlwdCB0YXNrcyBkb24ndCByZXF1aXJlIHNwZWNpZmljIHRhc2sgY29uZmlndXJhdGlvbgogICAgICAgICAgICAvLyBUaGV5IGFyZSB1c2VkIGZvciBkYXRhIHRyYW5zZm9ybWF0aW9uIGFuZCBidXNpbmVzcyBsb2dpYwogICAgICAgICAgICByZXR1cm4gVGFzay5Gcm9tUmVzdWx0KG5ldyBTY3JpcHRSZXNwb25zZSgpKTsKICAgICAgICB9CiAgICAgICAgY2F0Y2ggKEV4Y2VwdGlvbiBleCkKICAgICAgICB7CiAgICAgICAgICAgIHJldHVybiBUYXNrLkZyb21SZXN1bHQobmV3IFNjcmlwdFJlc3BvbnNlCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIEtleSA9ICJzY3JpcHQtdGFzay1pbnB1dC1lcnJvciIsCiAgICAgICAgICAgICAgICBEYXRhID0gbmV3IHsgZXJyb3IgPSBleC5NZXNzYWdlIH0KICAgICAgICAgICAgfSk7CiAgICAgICAgfQogICAgfQoKICAgIHB1YmxpYyBhc3luYyBUYXNrPFNjcmlwdFJlc3BvbnNlPiBPdXRwdXRIYW5kbGVyKFNjcmlwdENvbnRleHQgY29udGV4dCkKICAgIHsKICAgICAgICB0cnkKICAgICAgICB7CiAgICAgICAgICAgIC8vIFBlcmZvcm0gZGF0YSB0cmFuc2Zvcm1hdGlvbgogICAgICAgICAgICB2YXIgaW5wdXREYXRhID0gY29udGV4dC5JbnN0YW5jZT8uRGF0YTsKICAgICAgICAgICAgCiAgICAgICAgICAgIC8vIENhbGN1bGF0ZSBzb21lIHZhbHVlcwogICAgICAgICAgICB2YXIgY2FsY3VsYXRlZFZhbHVlcyA9IG5ldwogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBvcmlnaW5hbFRlc3RJZCA9IGlucHV0RGF0YT8udGVzdElkLAogICAgICAgICAgICAgICAgcHJvY2Vzc2VkQXQgPSBEYXRlVGltZS5VdGNOb3csCiAgICAgICAgICAgICAgICBjYWxjdWxhdGVkVmFsdWUgPSBuZXcgUmFuZG9tKCkuTmV4dCgxMDAwLCA5OTk5KSwKICAgICAgICAgICAgICAgIGlzUHJvY2Vzc2VkID0gdHJ1ZSwKICAgICAgICAgICAgICAgIHByb2Nlc3NpbmdEdXJhdGlvbiA9IERhdGVUaW1lLlV0Y05vdy5TdWJ0cmFjdChEYXRlVGltZS5VdGNOb3cuQWRkTWlsbGlzZWNvbmRzKC0xMDApKS5Ub3RhbE1pbGxpc2Vjb25kcwogICAgICAgICAgICB9OwoKICAgICAgICAgICAgLy8gVHJhbnNmb3JtIGFuZCBhZ2dyZWdhdGUgZGF0YQogICAgICAgICAgICB2YXIgdHJhbnNmb3JtZWREYXRhID0gbmV3CiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHNjcmlwdFRhc2tSZXN1bHQgPSBuZXcKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBzdWNjZXNzID0gdHJ1ZSwKICAgICAgICAgICAgICAgICAgICBvcmlnaW5hbERhdGEgPSBuZXcKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgIHRlc3RJZCA9IGlucHV0RGF0YT8udGVzdElkLAogICAgICAgICAgICAgICAgICAgICAgICB3b3JrZmxvd0lkID0gY29udGV4dC5Xb3JrZmxvdy5LZXksCiAgICAgICAgICAgICAgICAgICAgICAgIGluc3RhbmNlSWQgPSBjb250ZXh0Lkluc3RhbmNlPy5JZAogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgdHJhbnNmb3JtZWQgPSBjYWxjdWxhdGVkVmFsdWVzLAogICAgICAgICAgICAgICAgICAgIG1ldGFkYXRhID0gbmV3CiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICB0YXNrVHlwZSA9ICJTY3JpcHRUYXNrIiwKICAgICAgICAgICAgICAgICAgICAgICAgZXhlY3V0ZWRBdCA9IERhdGVUaW1lLlV0Y05vdywKICAgICAgICAgICAgICAgICAgICAgICAgc2NyaXB0VmVyc2lvbiA9ICIxLjAuMCIKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH07CgogICAgICAgICAgICByZXR1cm4gbmV3IFNjcmlwdFJlc3BvbnNlCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIEtleSA9ICJzY3JpcHQtdGFzay1zdWNjZXNzIiwKICAgICAgICAgICAgICAgIERhdGEgPSB0cmFuc2Zvcm1lZERhdGEsCiAgICAgICAgICAgICAgICBUYWdzID0gbmV3W10geyAidGFzay10ZXN0IiwgInNjcmlwdC10YXNrIiwgInN1Y2Nlc3MiLCAiZGF0YS10cmFuc2Zvcm1hdGlvbiIgfQogICAgICAgICAgICB9OwogICAgICAgIH0KICAgICAgICBjYXRjaCAoRXhjZXB0aW9uIGV4KQogICAgICAgIHsKICAgICAgICAgICAgcmV0dXJuIG5ldyBTY3JpcHRSZXNwb25zZQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBLZXkgPSAic2NyaXB0LXRhc2stZXhjZXB0aW9uIiwKICAgICAgICAgICAgICAgIERhdGEgPSBuZXcKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBzY3JpcHRUYXNrUmVzdWx0ID0gbmV3CiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICBzdWNjZXNzID0gZmFsc2UsCiAgICAgICAgICAgICAgICAgICAgICAgIGVycm9yID0gZXguTWVzc2FnZSwKICAgICAgICAgICAgICAgICAgICAgICAgdGFza1R5cGUgPSAiU2NyaXB0VGFzayIKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH07CiAgICAgICAgfQogICAgfQp9Cgo=" + } + } + ], + "onExits": [], + "transitions": [ + { + "key": "script-completed", + "target": "test-start-workflow-state", + "triggerType": 1, + "versionStrategy": "Minor", + "labels": [ + { + "language": "en-US", + "label": "ScriptTask Completed" + }, + { + "language": "tr-TR", + "label": "ScriptTask Tamamlandı" + } + ], + "schema": null, + "rule": { + "location": "./src/AlwaysTrueRule.csx", + "code": "dXNpbmcgU3lzdGVtLlRocmVhZGluZy5UYXNrczsKdXNpbmcgQkJULldvcmtmbG93LlNjcmlwdGluZzsKCi8vLyA8c3VtbWFyeT4KLy8vIEFsd2F5cyBUcnVlIFJ1bGUgLSBVc2VkIGZvciBhdXRvIHRyYW5zaXRpb25zIHRoYXQgc2hvdWxkIGFsd2F5cyBwcm9jZWVkCi8vLyA8L3N1bW1hcnk+CnB1YmxpYyBjbGFzcyBBbHdheXNUcnVlUnVsZSA6IElDb25kaXRpb25NYXBwaW5nCnsKICAgIHB1YmxpYyBhc3luYyBUYXNrPGJvb2w+IEhhbmRsZXIoU2NyaXB0Q29udGV4dCBjb250ZXh0KQogICAgewogICAgICAgIHJldHVybiB0cnVlOwogICAgfQp9Cgo=" + }, + "timer": null, + "view": null, + "onExecutionTasks": [] + } + ] + }, + { + "key": "test-start-workflow-state", + "stateType": 2, + "subType": 0, + "versionStrategy": "Minor", + "labels": [ + { + "language": "en-US", + "label": "Test Start (New Workflow)" + }, + { + "language": "tr-TR", + "label": "Start Testi (Yeni İş Akışı)" + } + ], + "view": null, + "subFlow": null, + "onEntries": [ + { + "order": 1, + "task": { + "key": "test-start-workflow", + "domain": "core", + "version": "1.0.0", + "flow": "sys-tasks" + }, + "mapping": { + "location": "./src/StartWorkflowMapping.csx", + "code": "using System;\nusing System.Threading.Tasks;\nusing BBT.Workflow.Definitions;\nusing BBT.Workflow.Scripting;\n\n/// \n/// Start Workflow Task Mapping - Starts a new workflow instance\n/// Test case: Verify starting new workflow instances\n/// \npublic class StartWorkflowMapping : IMapping\n{\n public Task InputHandler(WorkflowTask task, ScriptContext context)\n {\n try\n {\n var startTask = task as StartTask;\n if (startTask == null)\n {\n throw new InvalidOperationException(\"Task must be a StartTask\");\n }\n\n // Configure target workflow\n startTask.SetDomain(\"core\");\n startTask.SetFlow(\"task-test-subflow\");\n startTask.SetSync(true);\n startTask.SetVersion(\"1.0.0\");\n startTask.SetKey(Guid.NewGuid().ToString());\n startTask.SetTags(new[] { \"task-test\", \"start-workflow\", \"success\" });\n \n // Prepare initialization body\n var initBody = new\n {\n parentInstanceId = context.Instance?.Id,\n parentWorkflowId = context.Workflow?.Key,\n testId = context.Instance?.Data?.testId ?? Guid.NewGuid().ToString(),\n startedAt = DateTime.UtcNow,\n startedBy = \"task-test-workflow\",\n message = \"StartTask test - new instance created\"\n };\n startTask.SetBody(initBody);\n\n return Task.FromResult(new ScriptResponse());\n }\n catch (Exception ex)\n {\n return Task.FromResult(new ScriptResponse\n {\n Key = \"start-workflow-input-error\",\n Data = new { error = ex.Message }\n });\n }\n }\n\n public async Task OutputHandler(ScriptContext context)\n {\n try\n {\n var response = context.Body;\n\n if (response?.isSuccess == true)\n {\n return new ScriptResponse\n {\n Key = \"start-workflow-success\",\n Data = new\n {\n startWorkflowResult = new\n {\n success = true,\n newInstanceId = response?.data?.id,\n status = response?.data?.status,\n startedAt = DateTime.UtcNow,\n taskType = \"Start\"\n },\n // Store instance ID for later use\n subflowInstanceId = response?.data?.id\n },\n Tags = new[] { \"task-test\", \"start-workflow\", \"success\" }\n };\n }\n\n return new ScriptResponse\n {\n Key = \"start-workflow-failed\",\n Data = new\n {\n startWorkflowResult = new\n {\n success = false,\n error = response?.errorMessage ?? \"Failed to start workflow\",\n failedAt = DateTime.UtcNow,\n taskType = \"Start\"\n }\n },\n Tags = new[] { \"task-test\", \"start-workflow\", \"failed\" }\n };\n }\n catch (Exception ex)\n {\n return new ScriptResponse\n {\n Key = \"start-workflow-exception\",\n Data = new\n {\n startWorkflowResult = new\n {\n success = false,\n error = ex.Message,\n taskType = \"Start\"\n }\n }\n };\n }\n }\n}", + "encoding": "NAT" + } + } + ], + "onExits": [], + "transitions": [ + { + "key": "start-workflow-completed", + "target": "test-get-instance-data-state", + "triggerType": 1, + "versionStrategy": "Minor", + "labels": [ + { + "language": "en-US", + "label": "Start Completed" + }, + { + "language": "tr-TR", + "label": "Start Tamamlandı" + } + ], + "schema": null, + "rule": { + "location": "./src/AlwaysTrueRule.csx", + "code": "dXNpbmcgU3lzdGVtLlRocmVhZGluZy5UYXNrczsKdXNpbmcgQkJULldvcmtmbG93LlNjcmlwdGluZzsKCi8vLyA8c3VtbWFyeT4KLy8vIEFsd2F5cyBUcnVlIFJ1bGUgLSBVc2VkIGZvciBhdXRvIHRyYW5zaXRpb25zIHRoYXQgc2hvdWxkIGFsd2F5cyBwcm9jZWVkCi8vLyA8L3N1bW1hcnk+CnB1YmxpYyBjbGFzcyBBbHdheXNUcnVlUnVsZSA6IElDb25kaXRpb25NYXBwaW5nCnsKICAgIHB1YmxpYyBhc3luYyBUYXNrPGJvb2w+IEhhbmRsZXIoU2NyaXB0Q29udGV4dCBjb250ZXh0KQogICAgewogICAgICAgIHJldHVybiB0cnVlOwogICAgfQp9Cgo=" + }, + "timer": null, + "view": null, + "onExecutionTasks": [] + } + ] + }, + { + "key": "test-get-instance-data-state", + "stateType": 2, + "subType": 0, + "versionStrategy": "Minor", + "labels": [ + { + "language": "en-US", + "label": "Test GetInstanceData" + }, + { + "language": "tr-TR", + "label": "GetInstanceData Testi" + } + ], + "view": null, + "subFlow": null, + "onEntries": [ + { + "order": 1, + "task": { + "key": "test-get-instance-data", + "domain": "core", + "version": "1.0.0", + "flow": "sys-tasks" + }, + "mapping": { + "location": "./src/GetInstanceDataMapping.csx", + "code": "dXNpbmcgU3lzdGVtOwp1c2luZyBTeXN0ZW0uVGhyZWFkaW5nLlRhc2tzOwp1c2luZyBCQlQuV29ya2Zsb3cuRGVmaW5pdGlvbnM7CnVzaW5nIEJCVC5Xb3JrZmxvdy5TY3JpcHRpbmc7CgovLy8gPHN1bW1hcnk+Ci8vLyBHZXRJbnN0YW5jZURhdGEgVGFzayBNYXBwaW5nIC0gUmV0cmlldmVzIGRhdGEgZnJvbSBhbm90aGVyIHdvcmtmbG93IGluc3RhbmNlCi8vLyBUZXN0IGNhc2U6IFZlcmlmeSBjcm9zcy13b3JrZmxvdyBkYXRhIHJldHJpZXZhbAovLy8gPC9zdW1tYXJ5PgpwdWJsaWMgY2xhc3MgR2V0SW5zdGFuY2VEYXRhTWFwcGluZyA6IElNYXBwaW5nCnsKICAgIHB1YmxpYyBUYXNrPFNjcmlwdFJlc3BvbnNlPiBJbnB1dEhhbmRsZXIoV29ya2Zsb3dUYXNrIHRhc2ssIFNjcmlwdENvbnRleHQgY29udGV4dCkKICAgIHsKICAgICAgICB0cnkKICAgICAgICB7CiAgICAgICAgICAgIHZhciBnZXREYXRhVGFzayA9IHRhc2sgYXMgR2V0SW5zdGFuY2VEYXRhVGFzazsKICAgICAgICAgICAgaWYgKGdldERhdGFUYXNrID09IG51bGwpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHRocm93IG5ldyBJbnZhbGlkT3BlcmF0aW9uRXhjZXB0aW9uKCJUYXNrIG11c3QgYmUgYSBHZXRJbnN0YW5jZURhdGFUYXNrIik7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIC8vIENvbmZpZ3VyZSB0YXJnZXQgd29ya2Zsb3cKICAgICAgICAgICAgZ2V0RGF0YVRhc2suU2V0RG9tYWluKCJjb3JlIik7CiAgICAgICAgICAgIGdldERhdGFUYXNrLlNldEZsb3coInRhc2stdGVzdC1zdWJmbG93Iik7CiAgICAgICAgICAgIAogICAgICAgICAgICAvLyBHZXQgaW5zdGFuY2UgSUQgZnJvbSB3b3JrZmxvdyBkYXRhCiAgICAgICAgICAgIHZhciB0YXJnZXRJbnN0YW5jZUlkID0gY29udGV4dC5JbnN0YW5jZT8uRGF0YT8uc3ViZmxvd0luc3RhbmNlSWQ/LlRvU3RyaW5nKCk7CiAgICAgICAgICAgIGlmICghc3RyaW5nLklzTnVsbE9yRW1wdHkodGFyZ2V0SW5zdGFuY2VJZCkpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIGdldERhdGFUYXNrLlNldEluc3RhbmNlKHRhcmdldEluc3RhbmNlSWQpOwogICAgICAgICAgICB9CgogICAgICAgICAgICAvLyBSZXF1ZXN0IHNwZWNpZmljIGV4dGVuc2lvbnMKICAgICAgICAgICAgZ2V0RGF0YVRhc2suU2V0RXh0ZW5zaW9ucyhuZXdbXSB7ICJhbGwiIH0pOwoKICAgICAgICAgICAgcmV0dXJuIFRhc2suRnJvbVJlc3VsdChuZXcgU2NyaXB0UmVzcG9uc2UoKSk7CiAgICAgICAgfQogICAgICAgIGNhdGNoIChFeGNlcHRpb24gZXgpCiAgICAgICAgewogICAgICAgICAgICByZXR1cm4gVGFzay5Gcm9tUmVzdWx0KG5ldyBTY3JpcHRSZXNwb25zZQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBLZXkgPSAiZ2V0LWluc3RhbmNlLWRhdGEtaW5wdXQtZXJyb3IiLAogICAgICAgICAgICAgICAgRGF0YSA9IG5ldyB7IGVycm9yID0gZXguTWVzc2FnZSB9CiAgICAgICAgICAgIH0pOwogICAgICAgIH0KICAgIH0KCiAgICBwdWJsaWMgYXN5bmMgVGFzazxTY3JpcHRSZXNwb25zZT4gT3V0cHV0SGFuZGxlcihTY3JpcHRDb250ZXh0IGNvbnRleHQpCiAgICB7CiAgICAgICAgdHJ5CiAgICAgICAgewogICAgICAgICAgICB2YXIgcmVzcG9uc2UgPSBjb250ZXh0LkJvZHk7CgogICAgICAgICAgICBpZiAocmVzcG9uc2U/LmlzU3VjY2VzcyA9PSB0cnVlKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICByZXR1cm4gbmV3IFNjcmlwdFJlc3BvbnNlCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgS2V5ID0gImdldC1pbnN0YW5jZS1kYXRhLXN1Y2Nlc3MiLAogICAgICAgICAgICAgICAgICAgIERhdGEgPSBuZXcKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgIGdldEluc3RhbmNlRGF0YVJlc3VsdCA9IG5ldwogICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdWNjZXNzID0gdHJ1ZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHJpZXZlZERhdGEgPSByZXNwb25zZT8uZGF0YSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1ldGFkYXRhID0gcmVzcG9uc2U/Lm1ldGFkYXRhLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0cmlldmVkQXQgPSBEYXRlVGltZS5VdGNOb3csCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0YXNrVHlwZSA9ICJHZXRJbnN0YW5jZURhdGEiCiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgIFRhZ3MgPSBuZXdbXSB7ICJ0YXNrLXRlc3QiLCAiZ2V0LWluc3RhbmNlLWRhdGEiLCAic3VjY2VzcyIgfQogICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgcmV0dXJuIG5ldyBTY3JpcHRSZXNwb25zZQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBLZXkgPSAiZ2V0LWluc3RhbmNlLWRhdGEtZmFpbGVkIiwKICAgICAgICAgICAgICAgIERhdGEgPSBuZXcKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBnZXRJbnN0YW5jZURhdGFSZXN1bHQgPSBuZXcKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgIHN1Y2Nlc3MgPSBmYWxzZSwKICAgICAgICAgICAgICAgICAgICAgICAgZXJyb3IgPSByZXNwb25zZT8uZXJyb3JNZXNzYWdlID8/ICJGYWlsZWQgdG8gcmV0cmlldmUgaW5zdGFuY2UgZGF0YSIsCiAgICAgICAgICAgICAgICAgICAgICAgIGZhaWxlZEF0ID0gRGF0ZVRpbWUuVXRjTm93LAogICAgICAgICAgICAgICAgICAgICAgICB0YXNrVHlwZSA9ICJHZXRJbnN0YW5jZURhdGEiCiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgIFRhZ3MgPSBuZXdbXSB7ICJ0YXNrLXRlc3QiLCAiZ2V0LWluc3RhbmNlLWRhdGEiLCAiZmFpbGVkIiB9CiAgICAgICAgICAgIH07CiAgICAgICAgfQogICAgICAgIGNhdGNoIChFeGNlcHRpb24gZXgpCiAgICAgICAgewogICAgICAgICAgICByZXR1cm4gbmV3IFNjcmlwdFJlc3BvbnNlCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIEtleSA9ICJnZXQtaW5zdGFuY2UtZGF0YS1leGNlcHRpb24iLAogICAgICAgICAgICAgICAgRGF0YSA9IG5ldwogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIGdldEluc3RhbmNlRGF0YVJlc3VsdCA9IG5ldwogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgc3VjY2VzcyA9IGZhbHNlLAogICAgICAgICAgICAgICAgICAgICAgICBlcnJvciA9IGV4Lk1lc3NhZ2UsCiAgICAgICAgICAgICAgICAgICAgICAgIHRhc2tUeXBlID0gIkdldEluc3RhbmNlRGF0YSIKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH07CiAgICAgICAgfQogICAgfQp9Cgo=" + } + } + ], + "onExits": [], + "transitions": [ + { + "key": "get-instance-data-completed", + "target": "test-direct-transition-state", + "triggerType": 1, + "versionStrategy": "Minor", + "labels": [ + { + "language": "en-US", + "label": "GetInstanceData Completed" + }, + { + "language": "tr-TR", + "label": "GetInstanceData Tamamlandı" + } + ], + "schema": null, + "rule": { + "location": "./src/AlwaysTrueRule.csx", + "code": "dXNpbmcgU3lzdGVtLlRocmVhZGluZy5UYXNrczsKdXNpbmcgQkJULldvcmtmbG93LlNjcmlwdGluZzsKCi8vLyA8c3VtbWFyeT4KLy8vIEFsd2F5cyBUcnVlIFJ1bGUgLSBVc2VkIGZvciBhdXRvIHRyYW5zaXRpb25zIHRoYXQgc2hvdWxkIGFsd2F5cyBwcm9jZWVkCi8vLyA8L3N1bW1hcnk+CnB1YmxpYyBjbGFzcyBBbHdheXNUcnVlUnVsZSA6IElDb25kaXRpb25NYXBwaW5nCnsKICAgIHB1YmxpYyBhc3luYyBUYXNrPGJvb2w+IEhhbmRsZXIoU2NyaXB0Q29udGV4dCBjb250ZXh0KQogICAgewogICAgICAgIHJldHVybiB0cnVlOwogICAgfQp9Cgo=" + }, + "timer": null, + "view": null, + "onExecutionTasks": [] + } + ] + }, + { + "key": "test-direct-transition-state", + "stateType": 2, + "subType": 0, + "versionStrategy": "Minor", + "labels": [ + { + "language": "en-US", + "label": "Test DirectTransition" + }, + { + "language": "tr-TR", + "label": "DirectTransition Testi" + } + ], + "view": null, + "subFlow": null, + "onEntries": [ + { + "order": 1, + "task": { + "key": "test-direct-transition", + "domain": "core", + "version": "1.0.0", + "flow": "sys-tasks" + }, + "mapping": { + "location": "./src/DirectTransitionMapping.csx", + "code": "dXNpbmcgU3lzdGVtOwp1c2luZyBTeXN0ZW0uVGhyZWFkaW5nLlRhc2tzOwp1c2luZyBCQlQuV29ya2Zsb3cuRGVmaW5pdGlvbnM7CnVzaW5nIEJCVC5Xb3JrZmxvdy5TY3JpcHRpbmc7CgovLy8gPHN1bW1hcnk+Ci8vLyBEaXJlY3RUcmFuc2l0aW9uIFRhc2sgTWFwcGluZyAtIFRyaWdnZXJzIHRyYW5zaXRpb24gb24gZXhpc3Rpbmcgd29ya2Zsb3cgaW5zdGFuY2UKLy8vIFRlc3QgY2FzZTogVmVyaWZ5IHdvcmtmbG93LXRvLXdvcmtmbG93IHRyYW5zaXRpb24gdHJpZ2dlcmluZwovLy8gPC9zdW1tYXJ5PgpwdWJsaWMgY2xhc3MgRGlyZWN0VHJhbnNpdGlvbk1hcHBpbmcgOiBJTWFwcGluZwp7CiAgICBwdWJsaWMgVGFzazxTY3JpcHRSZXNwb25zZT4gSW5wdXRIYW5kbGVyKFdvcmtmbG93VGFzayB0YXNrLCBTY3JpcHRDb250ZXh0IGNvbnRleHQpCiAgICB7CiAgICAgICAgdHJ5CiAgICAgICAgewogICAgICAgICAgICB2YXIgZGlyZWN0VHJpZ2dlclRhc2sgPSB0YXNrIGFzIERpcmVjdFRyaWdnZXJUYXNrOwogICAgICAgICAgICBpZiAoZGlyZWN0VHJpZ2dlclRhc2sgPT0gbnVsbCkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgdGhyb3cgbmV3IEludmFsaWRPcGVyYXRpb25FeGNlcHRpb24oIlRhc2sgbXVzdCBiZSBhIERpcmVjdFRyaWdnZXJUYXNrIik7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIC8vIENvbmZpZ3VyZSB0YXJnZXQgd29ya2Zsb3cKICAgICAgICAgICAgZGlyZWN0VHJpZ2dlclRhc2suU2V0RG9tYWluKCJjb3JlIik7CiAgICAgICAgICAgIGRpcmVjdFRyaWdnZXJUYXNrLlNldEZsb3coInRhc2stdGVzdC1zdWJmbG93Iik7CiAgICAgICAgICAgIGRpcmVjdFRyaWdnZXJUYXNrLlNldFRyYW5zaXRpb25OYW1lKCJjb21wbGV0ZS1zdWJmbG93Iik7CiAgICAgICAgICAgIGRpcmVjdFRyaWdnZXJUYXNrLlNldFRhZ3MobmV3W10geyAidGFzay10ZXN0IiwgImRpcmVjdC10cmFuc2l0aW9uIiwgInN1Y2Nlc3MiIH0pOwogICAgICAgICAgICBkaXJlY3RUcmlnZ2VyVGFzay5TZXRTeW5jKHRydWUpOwoKICAgICAgICAgICAgLy8gR2V0IGluc3RhbmNlIElEIGZyb20gd29ya2Zsb3cgZGF0YQogICAgICAgICAgICB2YXIgdGFyZ2V0SW5zdGFuY2VJZCA9IGNvbnRleHQuSW5zdGFuY2U/LkRhdGE/LnN1YmZsb3dJbnN0YW5jZUlkPy5Ub1N0cmluZygpOwogICAgICAgICAgICBpZiAoIXN0cmluZy5Jc051bGxPckVtcHR5KHRhcmdldEluc3RhbmNlSWQpKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBkaXJlY3RUcmlnZ2VyVGFzay5TZXRJbnN0YW5jZSh0YXJnZXRJbnN0YW5jZUlkKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBkaXJlY3RUcmlnZ2VyVGFzay5TZXRLZXkoY29udGV4dC5JbnN0YW5jZT8uS2V5ID8/IEd1aWQuTmV3R3VpZCgpLlRvU3RyaW5nKCkpOwoKICAgICAgICAgICAgLy8gUHJlcGFyZSB0cmFuc2l0aW9uIGJvZHkKICAgICAgICAgICAgdmFyIHRyYW5zaXRpb25Cb2R5ID0gbmV3CiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIGNvbXBsZXRlZEJ5ID0gInRhc2stdGVzdC13b3JrZmxvdyIsCiAgICAgICAgICAgICAgICBjb21wbGV0ZWRBdCA9IERhdGVUaW1lLlV0Y05vdywKICAgICAgICAgICAgICAgIHBhcmVudEluc3RhbmNlSWQgPSBjb250ZXh0Lkluc3RhbmNlPy5JZCwKICAgICAgICAgICAgICAgIG1lc3NhZ2UgPSAiRGlyZWN0VHJhbnNpdGlvbiB0ZXN0IGV4ZWN1dGVkIgogICAgICAgICAgICB9OwogICAgICAgICAgICBkaXJlY3RUcmlnZ2VyVGFzay5TZXRCb2R5KHRyYW5zaXRpb25Cb2R5KTsKCiAgICAgICAgICAgIHJldHVybiBUYXNrLkZyb21SZXN1bHQobmV3IFNjcmlwdFJlc3BvbnNlKCkpOwogICAgICAgIH0KICAgICAgICBjYXRjaCAoRXhjZXB0aW9uIGV4KQogICAgICAgIHsKICAgICAgICAgICAgcmV0dXJuIFRhc2suRnJvbVJlc3VsdChuZXcgU2NyaXB0UmVzcG9uc2UKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgS2V5ID0gImRpcmVjdC10cmFuc2l0aW9uLWlucHV0LWVycm9yIiwKICAgICAgICAgICAgICAgIERhdGEgPSBuZXcgeyBlcnJvciA9IGV4Lk1lc3NhZ2UgfQogICAgICAgICAgICB9KTsKICAgICAgICB9CiAgICB9CgogICAgcHVibGljIGFzeW5jIFRhc2s8U2NyaXB0UmVzcG9uc2U+IE91dHB1dEhhbmRsZXIoU2NyaXB0Q29udGV4dCBjb250ZXh0KQogICAgewogICAgICAgIHRyeQogICAgICAgIHsKICAgICAgICAgICAgdmFyIHJlc3BvbnNlID0gY29udGV4dC5Cb2R5OwoKICAgICAgICAgICAgaWYgKHJlc3BvbnNlPy5pc1N1Y2Nlc3MgPT0gdHJ1ZSkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBTY3JpcHRSZXNwb25zZQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIEtleSA9ICJkaXJlY3QtdHJhbnNpdGlvbi1zdWNjZXNzIiwKICAgICAgICAgICAgICAgICAgICBEYXRhID0gbmV3CiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICBkaXJlY3RUcmFuc2l0aW9uUmVzdWx0ID0gbmV3CiAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN1Y2Nlc3MgPSB0cnVlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5zdGFuY2VJZCA9IHJlc3BvbnNlPy5kYXRhPy5pZCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXR1cyA9IHJlc3BvbnNlPy5kYXRhPy5zdGF0dXMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBleGVjdXRlZEF0ID0gRGF0ZVRpbWUuVXRjTm93LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgdGFza1R5cGUgPSAiRGlyZWN0VHJhbnNpdGlvbiIKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgVGFncyA9IG5ld1tdIHsgInRhc2stdGVzdCIsICJkaXJlY3QtdHJhbnNpdGlvbiIsICJzdWNjZXNzIiB9CiAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICB9CgogICAgICAgICAgICByZXR1cm4gbmV3IFNjcmlwdFJlc3BvbnNlCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIEtleSA9ICJkaXJlY3QtdHJhbnNpdGlvbi1mYWlsZWQiLAogICAgICAgICAgICAgICAgRGF0YSA9IG5ldwogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIGRpcmVjdFRyYW5zaXRpb25SZXN1bHQgPSBuZXcKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgIHN1Y2Nlc3MgPSBmYWxzZSwKICAgICAgICAgICAgICAgICAgICAgICAgZXJyb3IgPSByZXNwb25zZT8uZXJyb3JNZXNzYWdlID8/ICJEaXJlY3QgdHJhbnNpdGlvbiBmYWlsZWQiLAogICAgICAgICAgICAgICAgICAgICAgICBmYWlsZWRBdCA9IERhdGVUaW1lLlV0Y05vdywKICAgICAgICAgICAgICAgICAgICAgICAgdGFza1R5cGUgPSAiRGlyZWN0VHJhbnNpdGlvbiIKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgVGFncyA9IG5ld1tdIHsgInRhc2stdGVzdCIsICJkaXJlY3QtdHJhbnNpdGlvbiIsICJmYWlsZWQiIH0KICAgICAgICAgICAgfTsKICAgICAgICB9CiAgICAgICAgY2F0Y2ggKEV4Y2VwdGlvbiBleCkKICAgICAgICB7CiAgICAgICAgICAgIHJldHVybiBuZXcgU2NyaXB0UmVzcG9uc2UKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgS2V5ID0gImRpcmVjdC10cmFuc2l0aW9uLWV4Y2VwdGlvbiIsCiAgICAgICAgICAgICAgICBEYXRhID0gbmV3CiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgZGlyZWN0VHJhbnNpdGlvblJlc3VsdCA9IG5ldwogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgc3VjY2VzcyA9IGZhbHNlLAogICAgICAgICAgICAgICAgICAgICAgICBlcnJvciA9IGV4Lk1lc3NhZ2UsCiAgICAgICAgICAgICAgICAgICAgICAgIHRhc2tUeXBlID0gIkRpcmVjdFRyYW5zaXRpb24iCiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9OwogICAgICAgIH0KICAgIH0KfQoK" + } + } + ], + "onExits": [], + "transitions": [ + { + "key": "direct-transition-completed", + "target": "test-subprocess-state", + "triggerType": 1, + "versionStrategy": "Minor", + "labels": [ + { + "language": "en-US", + "label": "DirectTransition Completed" + }, + { + "language": "tr-TR", + "label": "DirectTransition Tamamlandı" + } + ], + "schema": null, + "rule": { + "location": "./src/AlwaysTrueRule.csx", + "code": "dXNpbmcgU3lzdGVtLlRocmVhZGluZy5UYXNrczsKdXNpbmcgQkJULldvcmtmbG93LlNjcmlwdGluZzsKCi8vLyA8c3VtbWFyeT4KLy8vIEFsd2F5cyBUcnVlIFJ1bGUgLSBVc2VkIGZvciBhdXRvIHRyYW5zaXRpb25zIHRoYXQgc2hvdWxkIGFsd2F5cyBwcm9jZWVkCi8vLyA8L3N1bW1hcnk+CnB1YmxpYyBjbGFzcyBBbHdheXNUcnVlUnVsZSA6IElDb25kaXRpb25NYXBwaW5nCnsKICAgIHB1YmxpYyBhc3luYyBUYXNrPGJvb2w+IEhhbmRsZXIoU2NyaXB0Q29udGV4dCBjb250ZXh0KQogICAgewogICAgICAgIHJldHVybiB0cnVlOwogICAgfQp9Cgo=" + }, + "timer": null, + "view": null, + "onExecutionTasks": [] + } + ] + }, + { + "key": "test-subprocess-state", + "stateType": 2, + "subType": 0, + "versionStrategy": "Minor", + "labels": [ + { + "language": "en-US", + "label": "Test SubProcess" + }, + { + "language": "tr-TR", + "label": "SubProcess Testi" + } + ], + "view": null, + "subFlow": null, + "onEntries": [ + { + "order": 1, + "task": { + "key": "test-subprocess", + "domain": "core", + "version": "1.0.0", + "flow": "sys-tasks" + }, + "mapping": { + "location": "./src/SubProcessMapping.csx", + "code": "dXNpbmcgU3lzdGVtOwp1c2luZyBTeXN0ZW0uVGhyZWFkaW5nLlRhc2tzOwp1c2luZyBCQlQuV29ya2Zsb3cuRGVmaW5pdGlvbnM7CnVzaW5nIEJCVC5Xb3JrZmxvdy5TY3JpcHRpbmc7CgovLy8gPHN1bW1hcnk+Ci8vLyBTdWJQcm9jZXNzIFRhc2sgTWFwcGluZyAtIFN0YXJ0cyBhIGZpcmUtYW5kLWZvcmdldCBzdWJwcm9jZXNzCi8vLyBUZXN0IGNhc2U6IFZlcmlmeSBzdWJwcm9jZXNzIGxhdW5jaGluZyAobm9uLWJsb2NraW5nKQovLy8gPC9zdW1tYXJ5PgpwdWJsaWMgY2xhc3MgU3ViUHJvY2Vzc01hcHBpbmcgOiBJTWFwcGluZwp7CiAgICBwdWJsaWMgVGFzazxTY3JpcHRSZXNwb25zZT4gSW5wdXRIYW5kbGVyKFdvcmtmbG93VGFzayB0YXNrLCBTY3JpcHRDb250ZXh0IGNvbnRleHQpCiAgICB7CiAgICAgICAgdHJ5CiAgICAgICAgewogICAgICAgICAgICB2YXIgc3ViUHJvY2Vzc1Rhc2sgPSB0YXNrIGFzIFN1YlByb2Nlc3NUYXNrOwogICAgICAgICAgICBpZiAoc3ViUHJvY2Vzc1Rhc2sgPT0gbnVsbCkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgdGhyb3cgbmV3IEludmFsaWRPcGVyYXRpb25FeGNlcHRpb24oIlRhc2sgbXVzdCBiZSBhIFN1YlByb2Nlc3NUYXNrIik7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIC8vIENvbmZpZ3VyZSBzdWJwcm9jZXNzCiAgICAgICAgICAgIHN1YlByb2Nlc3NUYXNrLlNldERvbWFpbigiY29yZSIpOwogICAgICAgICAgICBzdWJQcm9jZXNzVGFzay5TZXRGbG93KCJ0YXNrLXRlc3Qtc3ViZmxvdyIpOwogICAgICAgICAgICBzdWJQcm9jZXNzVGFzay5TZXRLZXkoY29udGV4dC5JbnN0YW5jZT8uS2V5ID8/IEd1aWQuTmV3R3VpZCgpLlRvU3RyaW5nKCkpOwogICAgICAgICAgICBzdWJQcm9jZXNzVGFzay5TZXRUYWdzKG5ld1tdIHsgInRhc2stdGVzdCIsICJzdWJwcm9jZXNzIiwgInN1Y2Nlc3MiIH0pOwoKICAgICAgICAgICAgLy8gUHJlcGFyZSBzdWJwcm9jZXNzIGRhdGEKICAgICAgICAgICAgdmFyIHN1YlByb2Nlc3NCb2R5ID0gbmV3CiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHBhcmVudEluc3RhbmNlSWQgPSBjb250ZXh0Lkluc3RhbmNlPy5JZCwKICAgICAgICAgICAgICAgIHBhcmVudFdvcmtmbG93SWQgPSBjb250ZXh0LldvcmtmbG93LktleSwKICAgICAgICAgICAgICAgIHRlc3RJZCA9IGNvbnRleHQuSW5zdGFuY2U/LkRhdGE/LnRlc3RJZCA/PyBHdWlkLk5ld0d1aWQoKS5Ub1N0cmluZygpLAogICAgICAgICAgICAgICAgbGF1bmNoZWRBdCA9IERhdGVUaW1lLlV0Y05vdywKICAgICAgICAgICAgICAgIGxhdW5jaGVkQnkgPSAidGFzay10ZXN0LXdvcmtmbG93IiwKICAgICAgICAgICAgICAgIGlzRmlyZUFuZEZvcmdldCA9IHRydWUsCiAgICAgICAgICAgICAgICBtZXNzYWdlID0gIlN1YlByb2Nlc3MgdGVzdCAtIGZpcmUtYW5kLWZvcmdldCBpbnN0YW5jZSIKICAgICAgICAgICAgfTsKICAgICAgICAgICAgc3ViUHJvY2Vzc1Rhc2suU2V0Qm9keShzdWJQcm9jZXNzQm9keSk7CgogICAgICAgICAgICByZXR1cm4gVGFzay5Gcm9tUmVzdWx0KG5ldyBTY3JpcHRSZXNwb25zZSgpKTsKICAgICAgICB9CiAgICAgICAgY2F0Y2ggKEV4Y2VwdGlvbiBleCkKICAgICAgICB7CiAgICAgICAgICAgIHJldHVybiBUYXNrLkZyb21SZXN1bHQobmV3IFNjcmlwdFJlc3BvbnNlCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIEtleSA9ICJzdWJwcm9jZXNzLWlucHV0LWVycm9yIiwKICAgICAgICAgICAgICAgIERhdGEgPSBuZXcgeyBlcnJvciA9IGV4Lk1lc3NhZ2UgfQogICAgICAgICAgICB9KTsKICAgICAgICB9CiAgICB9CgogICAgcHVibGljIGFzeW5jIFRhc2s8U2NyaXB0UmVzcG9uc2U+IE91dHB1dEhhbmRsZXIoU2NyaXB0Q29udGV4dCBjb250ZXh0KQogICAgewogICAgICAgIHRyeQogICAgICAgIHsKICAgICAgICAgICAgdmFyIHJlc3BvbnNlID0gY29udGV4dC5Cb2R5OwoKICAgICAgICAgICAgaWYgKHJlc3BvbnNlPy5pc1N1Y2Nlc3MgPT0gdHJ1ZSkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBTY3JpcHRSZXNwb25zZQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIEtleSA9ICJzdWJwcm9jZXNzLXN1Y2Nlc3MiLAogICAgICAgICAgICAgICAgICAgIERhdGEgPSBuZXcKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgIHN1YlByb2Nlc3NSZXN1bHQgPSBuZXcKICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgc3VjY2VzcyA9IHRydWUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdWJQcm9jZXNzSW5zdGFuY2VJZCA9IHJlc3BvbnNlPy5kYXRhPy5pZCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhdW5jaGVkQXQgPSBEYXRlVGltZS5VdGNOb3csCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0YXNrVHlwZSA9ICJTdWJQcm9jZXNzIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5vdGUgPSAiRmlyZS1hbmQtZm9yZ2V0OiBQYXJlbnQgd29ya2Zsb3cgZG9lcyBub3Qgd2FpdCBmb3Igc3VicHJvY2VzcyBjb21wbGV0aW9uIgogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICBUYWdzID0gbmV3W10geyAidGFzay10ZXN0IiwgInN1YnByb2Nlc3MiLCAic3VjY2VzcyIsICJmaXJlLWFuZC1mb3JnZXQiIH0KICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIHJldHVybiBuZXcgU2NyaXB0UmVzcG9uc2UKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgS2V5ID0gInN1YnByb2Nlc3MtZmFpbGVkIiwKICAgICAgICAgICAgICAgIERhdGEgPSBuZXcKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBzdWJQcm9jZXNzUmVzdWx0ID0gbmV3CiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICBzdWNjZXNzID0gZmFsc2UsCiAgICAgICAgICAgICAgICAgICAgICAgIGVycm9yID0gcmVzcG9uc2U/LmVycm9yTWVzc2FnZSA/PyAiRmFpbGVkIHRvIGxhdW5jaCBzdWJwcm9jZXNzIiwKICAgICAgICAgICAgICAgICAgICAgICAgZmFpbGVkQXQgPSBEYXRlVGltZS5VdGNOb3csCiAgICAgICAgICAgICAgICAgICAgICAgIHRhc2tUeXBlID0gIlN1YlByb2Nlc3MiCiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgIFRhZ3MgPSBuZXdbXSB7ICJ0YXNrLXRlc3QiLCAic3VicHJvY2VzcyIsICJmYWlsZWQiIH0KICAgICAgICAgICAgfTsKICAgICAgICB9CiAgICAgICAgY2F0Y2ggKEV4Y2VwdGlvbiBleCkKICAgICAgICB7CiAgICAgICAgICAgIHJldHVybiBuZXcgU2NyaXB0UmVzcG9uc2UKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgS2V5ID0gInN1YnByb2Nlc3MtZXhjZXB0aW9uIiwKICAgICAgICAgICAgICAgIERhdGEgPSBuZXcKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBzdWJQcm9jZXNzUmVzdWx0ID0gbmV3CiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICBzdWNjZXNzID0gZmFsc2UsCiAgICAgICAgICAgICAgICAgICAgICAgIGVycm9yID0gZXguTWVzc2FnZSwKICAgICAgICAgICAgICAgICAgICAgICAgdGFza1R5cGUgPSAiU3ViUHJvY2VzcyIKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH07CiAgICAgICAgfQogICAgfQp9Cgo=" + } + } + ], + "onExits": [], + "transitions": [ + { + "key": "subprocess-completed", + "target": "all-tests-completed", + "triggerType": 1, + "versionStrategy": "Minor", + "labels": [ + { + "language": "en-US", + "label": "SubProcess Completed" + }, + { + "language": "tr-TR", + "label": "SubProcess Tamamlandı" + } + ], + "schema": null, + "rule": { + "location": "./src/AlwaysTrueRule.csx", + "code": "dXNpbmcgU3lzdGVtLlRocmVhZGluZy5UYXNrczsKdXNpbmcgQkJULldvcmtmbG93LlNjcmlwdGluZzsKCi8vLyA8c3VtbWFyeT4KLy8vIEFsd2F5cyBUcnVlIFJ1bGUgLSBVc2VkIGZvciBhdXRvIHRyYW5zaXRpb25zIHRoYXQgc2hvdWxkIGFsd2F5cyBwcm9jZWVkCi8vLyA8L3N1bW1hcnk+CnB1YmxpYyBjbGFzcyBBbHdheXNUcnVlUnVsZSA6IElDb25kaXRpb25NYXBwaW5nCnsKICAgIHB1YmxpYyBhc3luYyBUYXNrPGJvb2w+IEhhbmRsZXIoU2NyaXB0Q29udGV4dCBjb250ZXh0KQogICAgewogICAgICAgIHJldHVybiB0cnVlOwogICAgfQp9Cgo=" + }, + "timer": null, + "view": null, + "onExecutionTasks": [] + } + ] + }, + { + "key": "all-tests-completed", + "stateType": 3, + "subType": 1, + "versionStrategy": "Minor", + "labels": [ + { + "language": "en-US", + "label": "All Tests Completed" + }, + { + "language": "tr-TR", + "label": "Tüm Testler Tamamlandı" + } + ], + "view": null, + "subFlow": null, + "onEntries": [], + "onExits": [], + "transitions": [] + } + ] + } +} \ No newline at end of file diff --git a/mockoon/migration-api.json b/mockoon/migration-api.json index 803a69e..b24d9e0 100644 --- a/mockoon/migration-api.json +++ b/mockoon/migration-api.json @@ -122,6 +122,16 @@ "uuid": "0fe9d51a-a402-45ec-955c-dca673b35b3b" } ] + }, + { + "uuid": "23f855b3-1df8-4eff-922c-3da82ed371f1", + "name": "task-test", + "children": [ + { + "type": "route", + "uuid": "30ce347c-8b04-44e4-8d50-da46d7ab04c7" + } + ] } ], "routes": [ @@ -1369,7 +1379,7 @@ "type": "http", "documentation": "", "method": "post", - "endpoint": "api/contract/group/query", + "endpoint": "api/contract/get-documents", "responses": [ { "uuid": "12a6bb9b-5e3f-4393-8fce-f66b76f6c370", @@ -1429,7 +1439,7 @@ "type": "http", "documentation": "", "method": "post", - "endpoint": "api/contract/document/render", + "endpoint": "api/contract/render-document", "responses": [ { "uuid": "d7ee8c1b-f0a0-49df-86a9-5b4421305c80", @@ -1483,6 +1493,78 @@ "responseMode": null, "streamingMode": null, "streamingInterval": 0 + }, + { + "uuid": "30ce347c-8b04-44e4-8d50-da46d7ab04c7", + "type": "http", + "documentation": "Task Test HTTP Endpoint - Test for HttpTask type", + "method": "post", + "endpoint": "api/task-test/http-endpoint", + "responses": [ + { + "uuid": "e9361ff0-f4c6-46a1-94de-1960c8e55cb3", + "body": "{\n \"statusCode\": 200,\n \"success\": true,\n \"data\": {\n \"taskType\": \"HttpTask\",\n \"message\": \"HTTP task test successful\",\n \"receivedData\": {{body}},\n \"processedAt\": \"{{now}}\",\n \"requestId\": \"{{faker 'string.uuid'}}\"\n },\n \"metadata\": {\n \"endpoint\": \"api/task-test/http-endpoint\",\n \"method\": \"POST\",\n \"responseTime\": {{faker 'number.int' min=50 max=200}}\n }\n}", + "latency": 500, + "statusCode": 200, + "label": "Success Response", + "headers": [ + { + "key": "Content-Type", + "value": "application/json" + }, + { + "key": "X-Task-Type", + "value": "HttpTask" + } + ], + "bodyType": "INLINE", + "filePath": "", + "databucketID": "", + "sendFileAsBody": false, + "rules": [], + "rulesOperator": "OR", + "disableTemplating": false, + "fallbackTo404": false, + "default": true, + "crudKey": "id", + "callbacks": [] + }, + { + "uuid": "6ad55341-fb41-466e-ab2b-2c87b19f4364", + "body": "{\n \"statusCode\": 500,\n \"success\": false,\n \"error\": {\n \"code\": \"INTERNAL_ERROR\",\n \"message\": \"Task test HTTP endpoint error\",\n \"timestamp\": \"{{now}}\"\n }\n}", + "latency": 200, + "statusCode": 500, + "label": "Error Response", + "headers": [ + { + "key": "Content-Type", + "value": "application/json" + } + ], + "bodyType": "INLINE", + "filePath": "", + "databucketID": "", + "sendFileAsBody": false, + "rules": [ + { + "target": "body", + "modifier": "simulateError", + "value": "true", + "invert": false, + "operator": "equals" + } + ], + "rulesOperator": "OR", + "disableTemplating": false, + "fallbackTo404": false, + "default": false, + "crudKey": "id", + "callbacks": [] + } + ], + "responseMode": null, + "streamingMode": null, + "streamingInterval": 0 } ], "rootChildren": [ @@ -1505,6 +1587,10 @@ { "type": "folder", "uuid": "0c0c687a-810a-434f-affc-a23e45a90dfc" + }, + { + "type": "folder", + "uuid": "23f855b3-1df8-4eff-922c-3da82ed371f1" } ], "proxyMode": false, diff --git a/mockoon/upload-to-mockoon.sh b/mockoon/upload-to-mockoon.sh deleted file mode 100755 index 4136103..0000000 --- a/mockoon/upload-to-mockoon.sh +++ /dev/null @@ -1,69 +0,0 @@ -#!/bin/bash - -# Mockoon sunucusuna environment yükleme scripti -# Kullanım: ./upload-to-mockoon.sh - -MOCKOON_URL="https://poc-mockoon.apps.nonprod.ebt.bank" -JSON_FILE="migration-api.json" - -echo "🚀 Mockoon sunucusuna bağlanılıyor..." -echo "📍 Sunucu: $MOCKOON_URL" -echo "📄 Dosya: $JSON_FILE" -echo "" - -# Sunucu durumunu kontrol et -echo "1️⃣ Sunucu durumu kontrol ediliyor..." -if curl -k -s -f "$MOCKOON_URL/health" > /dev/null 2>&1; then - echo "✅ Sunucu aktif" -else - echo "⚠️ Sunucu health check başarısız, devam ediliyor..." -fi - -echo "" -echo "2️⃣ Environment yükleniyor..." - -# Environment'ı POST et -RESPONSE=$(curl -k -s -w "\n%{http_code}" -X POST \ - "$MOCKOON_URL/api/environments" \ - -H "Content-Type: application/json" \ - -d @"$JSON_FILE" 2>&1) - -HTTP_CODE=$(echo "$RESPONSE" | tail -n1) -BODY=$(echo "$RESPONSE" | head -n-1) - -echo "📡 HTTP Durum Kodu: $HTTP_CODE" -echo "" - -if [ "$HTTP_CODE" = "200" ] || [ "$HTTP_CODE" = "201" ]; then - echo "✅ Başarılı! Environment yüklendi." - echo "$BODY" | jq '.' 2>/dev/null || echo "$BODY" -elif [ "$HTTP_CODE" = "409" ]; then - echo "ℹ️ Environment zaten mevcut, güncelleme deneniyor..." - - # UUID'yi dosyadan al - UUID=$(jq -r '.uuid' "$JSON_FILE") - - # PUT ile güncelle - RESPONSE=$(curl -k -s -w "\n%{http_code}" -X PUT \ - "$MOCKOON_URL/api/environments/$UUID" \ - -H "Content-Type: application/json" \ - -d @"$JSON_FILE" 2>&1) - - HTTP_CODE=$(echo "$RESPONSE" | tail -n1) - BODY=$(echo "$RESPONSE" | head -n-1) - - if [ "$HTTP_CODE" = "200" ] || [ "$HTTP_CODE" = "204" ]; then - echo "✅ Environment güncellendi!" - echo "$BODY" | jq '.' 2>/dev/null || echo "$BODY" - else - echo "❌ Güncelleme başarısız!" - echo "$BODY" - fi -else - echo "❌ Yükleme başarısız!" - echo "$BODY" -fi - -echo "" -echo "🏁 İşlem tamamlandı." - diff --git a/postman/vNext Example Runtime.postman_collection.json b/postman/vNext Example Runtime.postman_collection.json index dacc11a..0da6646 100644 --- a/postman/vNext Example Runtime.postman_collection.json +++ b/postman/vNext Example Runtime.postman_collection.json @@ -1,10 +1,10 @@ { "info": { - "_postman_id": "982a3afc-4d91-4c46-949b-29175ab8cfd6", + "_postman_id": "f503af8a-0a1b-4849-9330-e972cca00a10", "name": "vNext Example Runtime", "description": "Complete collection for testing Workflow SubFlows, SubProcesses and Main Flow integrations based on examples/sub-flows HTTP files", "schema": "https://schema.getpostman.com/json/collection/v2.1.0/collection.json", - "_exporter_id": "30789558" + "_exporter_id": "316535" }, "item": [ { @@ -60,6 +60,55 @@ }, "response": [] }, + { + "name": "Get State", + "protocolProfileBehavior": { + "disableBodyPruning": true + }, + "request": { + "method": "GET", + "header": [], + "body": { + "mode": "raw", + "raw": "", + "options": { + "raw": { + "language": "json" + } + } + }, + "url": { + "raw": "{{baseUrl}}/:domain/workflows/:flow/instances/:instance/functions/state", + "host": [ + "{{baseUrl}}" + ], + "path": [ + ":domain", + "workflows", + ":flow", + "instances", + ":instance", + "functions", + "state" + ], + "variable": [ + { + "key": "domain", + "value": "{{domain}}" + }, + { + "key": "flow", + "value": "oauth-authentication" + }, + { + "key": "instance", + "value": "{{instanceId}}" + } + ] + } + }, + "response": [] + }, { "name": "Step 1: Start Instance", "event": [ @@ -126,7 +175,7 @@ ], "body": { "mode": "raw", - "raw": "{\n \"key\": \"349874919955\",\n \"tags\": [\n \"test\",\n \"oauth\",\n \"authentication\"\n ],\n \"attributes\": {\n \"username\": \"34987491779\",\n \"password\": \"112233\",\n \"grant_type\": \"password\",\n \"client_id\": \"acme\",\n \"client_secret\": \"1q2w3e*\",\n \"scope\": \"openid profile product-api\"\n }\n}", + "raw": "{\n \"key\": \"34987491990221\",\n \"tags\": [\n \"test\",\n \"oauth\",\n \"authentication\"\n ],\n \"attributes\": {\n \"username\": \"34987491780\",\n \"password\": \"112233\",\n \"grant_type\": \"password\",\n \"client_id\": \"acme\",\n \"client_secret\": \"1q2w3e*\",\n \"scope\": \"openid profile product-api\"\n }\n}", "options": { "raw": { "language": "json" @@ -334,6 +383,55 @@ }, "response": [] }, + { + "name": "Get State", + "protocolProfileBehavior": { + "disableBodyPruning": true + }, + "request": { + "method": "GET", + "header": [], + "body": { + "mode": "raw", + "raw": "", + "options": { + "raw": { + "language": "json" + } + } + }, + "url": { + "raw": "{{baseUrl}}/:domain/workflows/:flow/instances/:instance/functions/state", + "host": [ + "{{baseUrl}}" + ], + "path": [ + ":domain", + "workflows", + ":flow", + "instances", + ":instance", + "functions", + "state" + ], + "variable": [ + { + "key": "domain", + "value": "{{domain}}" + }, + { + "key": "flow", + "value": "scheduled-payments" + }, + { + "key": "instance", + "value": "{{instanceId}}" + } + ] + } + }, + "response": [] + }, { "name": "Step 1: Start Instance", "event": [ @@ -406,7 +504,7 @@ ], "body": { "mode": "raw", - "raw": "{\n \"key\": \"349874994556\",\n \"tags\": [\n \"test\",\n \"oauth\",\n \"authentication\"\n ],\n \"attributes\": {\n \"userId\": 1,\n \"amount\": 12000,\n \"currency\": \"TL\",\n \"frequency\": \"monthly\",\n \"startDate\": \"2025-10-01T09:02:38.201Z\",\n \"endDate\": \"2026-10-01T09:02:38.201Z\",\n \"paymentMethodId\": \"1\",\n \"description\": \"Tayfun ödeme\",\n \"recipientId\": \"324324\",\n \"isAutoRetry\": false,\n \"maxRetries\": 3\n }\n}", + "raw": "{\n \"key\": \"349874994573\",\n \"tags\": [\n \"test\",\n \"oauth\",\n \"authentication\"\n ],\n \"attributes\": {\n \"userId\": 1,\n \"amount\": 12000,\n \"currency\": \"TL\",\n \"frequency\": \"monthly\",\n \"startDate\": \"2025-10-01T09:02:38.201Z\",\n \"endDate\": \"2026-10-01T09:02:38.201Z\",\n \"paymentMethodId\": \"1\",\n \"description\": \"Tayfun ödeme\",\n \"recipientId\": \"324324\",\n \"isAutoRetry\": false,\n \"maxRetries\": 3\n }\n}", "options": { "raw": { "language": "json" @@ -529,7 +627,48 @@ } }, "url": { - "raw": "{{baseUrl}}/:domain/workflows/:flow/instances/:instance", + "raw": "{{baseUrl}}/core/workflows/account-opening/instances/019aa5b7-0e29-7d53-9d72-f42260c5d222/functions/data?extensions=extension-user-session", + "host": [ + "{{baseUrl}}" + ], + "path": [ + "core", + "workflows", + "account-opening", + "instances", + "019aa5b7-0e29-7d53-9d72-f42260c5d222", + "functions", + "data" + ], + "query": [ + { + "key": "extensions", + "value": "extension-user-session" + } + ] + } + }, + "response": [] + }, + { + "name": "Get State", + "protocolProfileBehavior": { + "disableBodyPruning": true + }, + "request": { + "method": "GET", + "header": [], + "body": { + "mode": "raw", + "raw": "", + "options": { + "raw": { + "language": "json" + } + } + }, + "url": { + "raw": "{{baseUrl}}/:domain/workflows/:flow/instances/:instance/functions/state", "host": [ "{{baseUrl}}" ], @@ -538,7 +677,9 @@ "workflows", ":flow", "instances", - ":instance" + ":instance", + "functions", + "state" ], "variable": [ { @@ -559,7 +700,7 @@ "response": [] }, { - "name": "Get State", + "name": "Get View", "protocolProfileBehavior": { "disableBodyPruning": true }, @@ -576,7 +717,7 @@ } }, "url": { - "raw": "{{baseUrl}}/:domain/workflows/:flow/instances/:instance/functions/state", + "raw": "{{baseUrl}}/:domain/workflows/:flow/instances/:instance/functions/view", "host": [ "{{baseUrl}}" ], @@ -587,7 +728,7 @@ "instances", ":instance", "functions", - "state" + "view" ], "variable": [ { @@ -608,7 +749,7 @@ "response": [] }, { - "name": "Get View", + "name": "Get Schema", "protocolProfileBehavior": { "disableBodyPruning": true }, @@ -625,7 +766,7 @@ } }, "url": { - "raw": "{{baseUrl}}/:domain/workflows/:flow/instances/:instance/functions/view", + "raw": "{{baseUrl}}/:domain/workflows/:flow/instances/:instance/functions/schema?transitionKey=select-demand-deposit", "host": [ "{{baseUrl}}" ], @@ -636,7 +777,13 @@ "instances", ":instance", "functions", - "view" + "schema" + ], + "query": [ + { + "key": "transitionKey", + "value": "select-demand-deposit" + } ], "variable": [ { @@ -727,7 +874,7 @@ ], "body": { "mode": "raw", - "raw": "{\n \"key\": \"3498749106090045454232333\",\n \"tags\": [\n \"test\",\n \"banking\",\n \"account-openning\"\n ],\n \"attributes\": {\n \"session\": \"16\",\n \"oldInstanceId\": \"3498749106090045454232333\"\n }\n}", + "raw": "{\n \"key\": \"349874924\",\n \"tags\": [\n \"test\",\n \"banking\",\n \"account-openning\"\n ],\n \"attributes\": {\n \"session\": \"16\"\n }\n}", "options": { "raw": { "language": "json" @@ -735,7 +882,7 @@ } }, "url": { - "raw": "{{baseUrl}}/:domain/workflows/:flow/instances/start?sync=true", + "raw": "{{baseUrl}}/:domain/workflows/:flow/instances/start?sync=false", "host": [ "{{baseUrl}}" ], @@ -749,7 +896,7 @@ "query": [ { "key": "sync", - "value": "true" + "value": "false" } ], "variable": [ @@ -767,13 +914,13 @@ "response": [] }, { - "name": "Step 1.5(optinal): Execute Sub Copy", + "name": "Step 2: Select Account Type", "request": { "method": "PATCH", "header": [], "body": { "mode": "raw", - "raw": "{\n \"accountType\": \"demand-deposit\"\n}", + "raw": "{\n \"key\": \"3498749106\",\n \"tags\": [\n \"test\",\n \"banking\",\n \"account-openning\",\n \"key-test\"\n ],\n \"attributes\": {\n \"accountType\": \"demand-deposit\"\n }\n}", "options": { "raw": { "language": "json" @@ -781,7 +928,7 @@ } }, "url": { - "raw": "{{baseUrl}}/:domain/workflows/:flow/instances/:instance/transitions/:transition?sync=true", + "raw": "{{baseUrl}}/:domain/workflows/:flow/instances/:instance/transitions/:transition?sync=false", "host": [ "{{baseUrl}}" ], @@ -797,7 +944,7 @@ "query": [ { "key": "sync", - "value": "true" + "value": "false" } ], "variable": [ @@ -815,7 +962,7 @@ }, { "key": "transition", - "value": "execute-sub" + "value": "select-demand-deposit" } ] } @@ -823,13 +970,13 @@ "response": [] }, { - "name": "Step 2: Select Account Type", + "name": "Step 3: Submit Account Details", "request": { "method": "PATCH", "header": [], "body": { "mode": "raw", - "raw": "{\n \"accountType\": \"demand-deposit\"\n}", + "raw": "{\n \"attributes\": {\n \"accountName\": \"demand-deposit\",\n \"currency\": \"TRY\",\n \"branchCode\": \"5436\",\n \"initialDeposit\": 100,\n \"accountPurpose\": \"personal-banking\",\n \"notifications\": {\n \"smsNotifications\": true,\n \"emailNotifications\": true,\n \"pushNotifications\": true\n }\n }\n}", "options": { "raw": { "language": "json" @@ -871,7 +1018,7 @@ }, { "key": "transition", - "value": "select-demand-deposit" + "value": "submit-account-details" } ] } @@ -879,13 +1026,13 @@ "response": [] }, { - "name": "Step 3: Submit Account Details", + "name": "Step 4: Confirm Account", "request": { "method": "PATCH", "header": [], "body": { "mode": "raw", - "raw": "{\n \"accountName\": \"demand-deposit\",\n \"currency\": \"TRY\",\n \"branchCode\": \"5436\",\n \"initialDeposit\": 100,\n \"accountPurpose\": \"personal-banking\",\n \"notifications\": {\n \"smsNotifications\": true,\n \"emailNotifications\": true,\n \"pushNotifications\": true\n }\n}", + "raw": "{\n \"attributes\": {\n \"confirmed\": true,\n \"termsAccepted\": true,\n \"privacyPolicyAccepted\": true\n }\n}", "options": { "raw": { "language": "json" @@ -927,7 +1074,7 @@ }, { "key": "transition", - "value": "submit-account-details" + "value": "confirm-account-opening" } ] } @@ -935,13 +1082,13 @@ "response": [] }, { - "name": "Step 4: Confirm Account", + "name": "Cancel", "request": { "method": "PATCH", "header": [], "body": { "mode": "raw", - "raw": "{\n \"confirmed\": true,\n \"termsAccepted\": true,\n \"privacyPolicyAccepted\": true\n}", + "raw": "", "options": { "raw": { "language": "json" @@ -983,7 +1130,408 @@ }, { "key": "transition", - "value": "confirm-account-opening" + "value": "cancel" + } + ] + } + }, + "response": [] + } + ] + } + ] + }, + { + "name": "Test Flow", + "item": [ + { + "name": "Instance Execute", + "item": [ + { + "name": "Step 1: Start Instance", + "event": [ + { + "listen": "test", + "script": { + "exec": [ + "if (pm.response.code === 200 || pm.response.code === 201) {", + " var jsonData = pm.response.json();", + " pm.collectionVariables.set('instanceId', jsonData.id);", + "}" + ], + "type": "text/javascript", + "packages": {}, + "requests": {} + } + }, + { + "listen": "prerequest", + "script": { + "exec": [ + "var uuid = require('uuid');", + "pm.collectionVariables.set(\"requestId\",uuid.v4());" + ], + "type": "text/javascript", + "packages": {}, + "requests": {} + } + } + ], + "request": { + "method": "POST", + "header": [ + { + "key": "Accept-Language", + "value": "tr-TR", + "type": "text" + }, + { + "key": "X-Request-Id", + "value": "{{requestId}}", + "type": "text" + }, + { + "key": "X-Device-Id", + "value": "{{requestId}}", + "type": "text" + }, + { + "key": "X-Token-Id", + "value": "{{requestId}}", + "type": "text" + }, + { + "key": "X-Device-Info", + "value": "IOS 16", + "type": "text" + }, + { + "key": "X-Forwarded-For", + "value": "192.168.2.1", + "type": "text" + }, + { + "key": "user_reference", + "value": "34987491018", + "type": "text" + } + ], + "body": { + "mode": "raw", + "raw": "{\n \"key\": \"34987492001\",\n \"tags\": [\n \"test\",\n \"banking\",\n \"account-openning\"\n ],\n \"attributes\": {\n \"testId\": \"689bc680-162e-4cb5-aae7-859a108f0ae2\"\n }\n}", + "options": { + "raw": { + "language": "json" + } + } + }, + "url": { + "raw": "{{baseUrl}}/:domain/workflows/:flow/instances/start?sync=true", + "host": [ + "{{baseUrl}}" + ], + "path": [ + ":domain", + "workflows", + ":flow", + "instances", + "start" + ], + "query": [ + { + "key": "sync", + "value": "true" + } + ], + "variable": [ + { + "key": "domain", + "value": "{{domain}}" + }, + { + "key": "flow", + "value": "task-test-workflow" + } + ] + } + }, + "response": [] + } + ] + } + ] + }, + { + "name": "Contract", + "item": [ + { + "name": "Instance Execute", + "item": [ + { + "name": "Get State", + "protocolProfileBehavior": { + "disableBodyPruning": true + }, + "request": { + "method": "GET", + "header": [], + "body": { + "mode": "raw", + "raw": "", + "options": { + "raw": { + "language": "json" + } + } + }, + "url": { + "raw": "{{baseUrl}}/:domain/workflows/:flow/instances/:instance/functions/state", + "host": [ + "{{baseUrl}}" + ], + "path": [ + ":domain", + "workflows", + ":flow", + "instances", + ":instance", + "functions", + "state" + ], + "variable": [ + { + "key": "domain", + "value": "{{domain}}" + }, + { + "key": "flow", + "value": "contract-approval-workflow" + }, + { + "key": "instance", + "value": "{{instanceId}}" + } + ] + } + }, + "response": [] + }, + { + "name": "Step 1: Start Instance", + "event": [ + { + "listen": "test", + "script": { + "exec": [ + "if (pm.response.code === 200 || pm.response.code === 201) {", + " var jsonData = pm.response.json();", + " pm.collectionVariables.set('instanceId', jsonData.id);", + "}" + ], + "type": "text/javascript", + "packages": {}, + "requests": {} + } + }, + { + "listen": "prerequest", + "script": { + "exec": [ + "var uuid = require('uuid');", + "pm.collectionVariables.set(\"requestId\",uuid.v4());" + ], + "type": "text/javascript", + "packages": {}, + "requests": {} + } + } + ], + "request": { + "method": "POST", + "header": [ + { + "key": "Accept-Language", + "value": "tr-TR", + "type": "text" + }, + { + "key": "X-Request-Id", + "value": "{{requestId}}", + "type": "text" + }, + { + "key": "X-Device-Id", + "value": "{{requestId}}", + "type": "text" + }, + { + "key": "X-Token-Id", + "value": "{{requestId}}", + "type": "text" + }, + { + "key": "X-Device-Info", + "value": "IOS 16", + "type": "text" + }, + { + "key": "X-Forwarded-For", + "value": "192.168.2.1", + "type": "text" + }, + { + "key": "user_reference", + "value": "34987491018", + "type": "text" + } + ], + "body": { + "mode": "raw", + "raw": "{\n \"key\": \"349874911086\",\n \"tags\": [\n \"contract\",\n \"approval\",\n \"test\"\n ],\n \"attributes\": {\n \"groupCode\": \"KG-2024-001\",\n \"userId\": \"user-123\",\n \"sessionId\": \"session-456\",\n \"requestedAt\": \"2025-12-08T12:31:14.889+00:00\"\n }\n}", + "options": { + "raw": { + "language": "json" + } + } + }, + "url": { + "raw": "{{baseUrl}}/:domain/workflows/:flow/instances/start?sync=false", + "host": [ + "{{baseUrl}}" + ], + "path": [ + ":domain", + "workflows", + ":flow", + "instances", + "start" + ], + "query": [ + { + "key": "sync", + "value": "false" + } + ], + "variable": [ + { + "key": "domain", + "value": "{{domain}}" + }, + { + "key": "flow", + "value": "contract-approval-workflow" + } + ] + } + }, + "response": [] + }, + { + "name": "Step 2: Approce Document", + "request": { + "method": "PATCH", + "header": [], + "body": { + "mode": "raw", + "raw": "{\n \"attributes\": {\n \"approvedBy\": \"user-123\",\n \"approvalNotes\": \"Döküman incelendi ve onaylandı\"\n }\n}", + "options": { + "raw": { + "language": "json" + } + } + }, + "url": { + "raw": "{{baseUrl}}/:domain/workflows/:flow/instances/:instance/transitions/:transition?sync=false", + "host": [ + "{{baseUrl}}" + ], + "path": [ + ":domain", + "workflows", + ":flow", + "instances", + ":instance", + "transitions", + ":transition" + ], + "query": [ + { + "key": "sync", + "value": "false" + } + ], + "variable": [ + { + "key": "domain", + "value": "{{domain}}" + }, + { + "key": "flow", + "value": "contract-document-subflow" + }, + { + "key": "instance", + "value": "80a9a994-8ef7-42b4-96d4-96409d42f7c5" + }, + { + "key": "transition", + "value": "approve-document" + } + ] + } + }, + "response": [] + }, + { + "name": "Step 2.1: Reject Document", + "request": { + "method": "PATCH", + "header": [], + "body": { + "mode": "raw", + "raw": "{\n \"attributes\": {\n \"rejectedBy\": \"user-123\",\n \"reason\": \"Döküman içeriğinde eksiklik tespit edildi\"\n }\n}", + "options": { + "raw": { + "language": "json" + } + } + }, + "url": { + "raw": "{{baseUrl}}/:domain/workflows/:flow/instances/:instance/transitions/:transition?sync=true", + "host": [ + "{{baseUrl}}" + ], + "path": [ + ":domain", + "workflows", + ":flow", + "instances", + ":instance", + "transitions", + ":transition" + ], + "query": [ + { + "key": "sync", + "value": "true" + } + ], + "variable": [ + { + "key": "domain", + "value": "{{domain}}" + }, + { + "key": "flow", + "value": "contract-document-subflow" + }, + { + "key": "instance", + "value": "fabc273b-cc37-4449-82df-6172a30a48d2" + }, + { + "key": "transition", + "value": "reject-document" } ] }