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" } ] }