@burgan-tech/morph-touch-runtime 0.0.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +21 -0
- package/burgan-tech-morph-touch-runtime-0.0.2.tgz +0 -0
- package/package.json +21 -0
- package/touch/Extensions/.gitkeep +0 -0
- package/touch/Functions/.gitkeep +0 -0
- package/touch/Functions/check-livekit-room-access.1.0.0.json +28 -0
- package/touch/Functions/check-livekit-room-access.http +44 -0
- package/touch/Functions/get-absence-entry.1.0.0.json +28 -0
- package/touch/Functions/get-advisor-stats.1.0.0.json +27 -0
- package/touch/Functions/get-available-slots.1.0.0.json +30 -0
- package/touch/Functions/get-available-slots.http +29 -0
- package/touch/Functions/get-chat-rooms.1.0.0.json +28 -0
- package/touch/Functions/get-chat-rooms.http +62 -0
- package/touch/Functions/get-customer-info.1.0.0.json +27 -0
- package/touch/Functions/get-matrix-sync.1.0.0.json +28 -0
- package/touch/Functions/get-rezervations.1.0.0.json +26 -0
- package/touch/Functions/get-rezervations.http +59 -0
- package/touch/Functions/get-room-messages.1.0.0.json +29 -0
- package/touch/Functions/get-room-messages.http +45 -0
- package/touch/Functions/rezervation-transfer.http +118 -0
- package/touch/Functions/send-room-message.1.0.0.json +29 -0
- package/touch/Functions/src/CheckLivekitRoomAccessMapping.csx +238 -0
- package/touch/Functions/src/GetAbsenceEntryMapping.csx +225 -0
- package/touch/Functions/src/GetAdvisorStatsMapping.csx +190 -0
- package/touch/Functions/src/GetAvailableSlotsMapping.csx +468 -0
- package/touch/Functions/src/GetChatRoomsMapping.csx +202 -0
- package/touch/Functions/src/GetCustomerInfoMapping.csx +140 -0
- package/touch/Functions/src/GetMatrixSyncMapping.csx +197 -0
- package/touch/Functions/src/GetRezervationsMapping.csx +162 -0
- package/touch/Functions/src/GetRoomMessagesMapping.csx +165 -0
- package/touch/Functions/src/SendCancelNotificationMapping.csx +63 -0
- package/touch/Functions/src/SendRoomMessageMapping.csx +131 -0
- package/touch/Schemas/.gitkeep +0 -0
- package/touch/Schemas/absence-entry.1.0.0.json +232 -0
- package/touch/Schemas/advisor-chat-rooms.1.0.0.json +62 -0
- package/touch/Schemas/chat-room.1.0.0.json +110 -0
- package/touch/Schemas/notification-sender.1.0.0.json +159 -0
- package/touch/Schemas/portfolio-manager.1.0.0.json +63 -0
- package/touch/Schemas/rezervation.1.0.0.json +102 -0
- package/touch/Tasks/.gitkeep +0 -0
- package/touch/Tasks/cancel-absence-entry-for-rezervation.1.0.0.json +21 -0
- package/touch/Tasks/check-already-completed-chat-room.1.0.0.json +24 -0
- package/touch/Tasks/check-duplicate-portfolio-manager.1.0.0.json +23 -0
- package/touch/Tasks/check-duplicate-rezervation.1.0.0.json +23 -0
- package/touch/Tasks/check-existing-permanent-chat-room.1.0.0.json +21 -0
- package/touch/Tasks/check-randevu-time.1.0.0.json +17 -0
- package/touch/Tasks/create-permanent-chat-room.1.0.0.json +28 -0
- package/touch/Tasks/determine-transfer-type.1.0.0.json +16 -0
- package/touch/Tasks/enrich-rezervations-for-transfer.1.0.0.json +23 -0
- package/touch/Tasks/execute-permanent-chatroom-update.1.0.0.json +21 -0
- package/touch/Tasks/execute-rez-chatroom-transfer.1.0.0.json +21 -0
- package/touch/Tasks/execute-rezervation-transfer.1.0.0.json +19 -0
- package/touch/Tasks/fetch-absence-entries-for-transfer.1.0.0.json +23 -0
- package/touch/Tasks/fetch-advisors-for-transfer.1.0.0.json +23 -0
- package/touch/Tasks/fetch-permanent-chatrooms-for-transfer.1.0.0.json +23 -0
- package/touch/Tasks/fetch-rez-chatrooms-for-transfer.1.0.0.json +23 -0
- package/touch/Tasks/fetch-rezervations-for-transfer.1.0.0.json +22 -0
- package/touch/Tasks/get-absence-entry-task.1.0.0.json +23 -0
- package/touch/Tasks/get-available-slots-http.1.0.0.json +27 -0
- package/touch/Tasks/get-available-slots.1.0.0.json +24 -0
- package/touch/Tasks/get-chat-room-data-for-rezervation.1.0.0.json +23 -0
- package/touch/Tasks/get-chat-token.1.0.0.json +27 -0
- package/touch/Tasks/get-matrix-room-messages.1.0.0.json +25 -0
- package/touch/Tasks/get-matrix-sync.1.0.0.json +25 -0
- package/touch/Tasks/get-rezervation-data-task.1.0.0.json +22 -0
- package/touch/Tasks/get-rezervation-state-task.1.0.0.json +22 -0
- package/touch/Tasks/get-rezervations-task.1.0.0.json +21 -0
- package/touch/Tasks/get-user-info-for-rezervation.1.0.0.json +24 -0
- package/touch/Tasks/get-video-call-url.1.0.0.json +17 -0
- package/touch/Tasks/invite-user-to-rezervation-room.1.0.0.json +27 -0
- package/touch/Tasks/join-chat-room-for-rezervation.1.0.0.json +28 -0
- package/touch/Tasks/join-matrix-room.1.0.0.json +27 -0
- package/touch/Tasks/join-user-to-room.1.0.0.json +27 -0
- package/touch/Tasks/merge-invited-user.1.0.0.json +17 -0
- package/touch/Tasks/merge-rezervation-update.1.0.0.json +16 -0
- package/touch/Tasks/merge-target-advisor-for-transfer.1.0.0.json +17 -0
- package/touch/Tasks/merge-update-body-for-randevu-update.1.0.0.json +16 -0
- package/touch/Tasks/merge-video-call-urls.1.0.0.json +17 -0
- package/touch/Tasks/query-chat-room-instances.1.0.0.json +23 -0
- package/touch/Tasks/remove-member-from-room.1.0.0.json +28 -0
- package/touch/Tasks/send-matrix-room-message.1.0.0.json +26 -0
- package/touch/Tasks/send-push-notification.1.0.0.json +26 -0
- package/touch/Tasks/send-sms-notification.1.0.0.json +26 -0
- package/touch/Tasks/set-chat-room-status-active.1.0.0.json +16 -0
- package/touch/Tasks/set-chat-room-status-deactive.1.0.0.json +16 -0
- package/touch/Tasks/set-previous-advisor.1.0.0.json +16 -0
- package/touch/Tasks/set-user-from-headers-for-rezervation.1.0.0.json +17 -0
- package/touch/Tasks/start-absence-entry-for-rezervation.1.0.0.json +21 -0
- package/touch/Tasks/start-chat-room-for-rezervation.1.0.0.json +20 -0
- package/touch/Tasks/start-notification-sender.1.0.0.json +20 -0
- package/touch/Tasks/start-permanent-chat-room.1.0.0.json +21 -0
- package/touch/Tasks/start-transfer-from-absence-entry.1.0.0.json +19 -0
- package/touch/Tasks/start-video-call.1.0.0.json +22 -0
- package/touch/Tasks/trigger-chat-room-deactivate.1.0.0.json +21 -0
- package/touch/Tasks/trigger-chat-room-transfer.1.0.0.json +21 -0
- package/touch/Tasks/trigger-chat-room-update.1.0.0.json +20 -0
- package/touch/Tasks/trigger-rezervation-add-invited-participant.1.0.0.json +20 -0
- package/touch/Tasks/trigger-rezervation-apply-update.1.0.0.json +20 -0
- package/touch/Tasks/trigger-rezervation-to-in-meet.1.0.0.json +20 -0
- package/touch/Tasks/trigger-rezervation-video-call-update.1.0.0.json +21 -0
- package/touch/Tasks/validate-date-for-rezervation.1.0.0.json +18 -0
- package/touch/Tasks/validate-slot-for-rezervation.1.0.0.json +24 -0
- package/touch/Tasks/validate-transfer-availability.1.0.0.json +23 -0
- package/touch/Views/.gitkeep +0 -0
- package/touch/Workflows/.gitkeep +0 -0
- package/touch/Workflows/absence-entry.http +458 -0
- package/touch/Workflows/absence-entry.json +179 -0
- package/touch/Workflows/add-participant-to-rezervation.http +47 -0
- package/touch/Workflows/add-participant-to-rezervation.json +340 -0
- package/touch/Workflows/chat-room.http +207 -0
- package/touch/Workflows/chat-room.json +452 -0
- package/touch/Workflows/investment-advisor.json +367 -0
- package/touch/Workflows/notification-sender.http +299 -0
- package/touch/Workflows/notification-sender.json +262 -0
- package/touch/Workflows/portfolio-manager.json +367 -0
- package/touch/Workflows/randevu-update.http +87 -0
- package/touch/Workflows/rezervation-start.json +467 -0
- package/touch/Workflows/rezervation-transfer.json +512 -0
- package/touch/Workflows/rezervation-update.http +87 -0
- package/touch/Workflows/rezervation-update.json +485 -0
- package/touch/Workflows/rezervation.http +214 -0
- package/touch/Workflows/rezervation.json +726 -0
- package/touch/Workflows/src/AllChatRoomsSuccessRule.csx +65 -0
- package/touch/Workflows/src/AlwaysTrueRule.csx +13 -0
- package/touch/Workflows/src/AnyChatRoomFailedRule.csx +64 -0
- package/touch/Workflows/src/AutoProcessRule.csx +38 -0
- package/touch/Workflows/src/BuildRezChatRoomPlanMapping.csx +160 -0
- package/touch/Workflows/src/CanStartRezervationTimerMapping.csx +48 -0
- package/touch/Workflows/src/CanStartTransferMapping.csx +14 -0
- package/touch/Workflows/src/CancelAbsenceEntryForRezervationMapping.csx +48 -0
- package/touch/Workflows/src/CancelAbsenceForRandevuUpdateMapping.csx +62 -0
- package/touch/Workflows/src/ChatRoomCreatedFailedRule.csx +54 -0
- package/touch/Workflows/src/ChatRoomCreatedSuccessRule.csx +54 -0
- package/touch/Workflows/src/ChatRoomRemoveMapping.csx +104 -0
- package/touch/Workflows/src/ChatRoomTransferInviteMapping.csx +109 -0
- package/touch/Workflows/src/ChatRoomTransferRemoveMapping.csx +71 -0
- package/touch/Workflows/src/ChatRoomUpdateMapping.csx +107 -0
- package/touch/Workflows/src/CheckAlreadyCompletedChatRoomMapping.csx +100 -0
- package/touch/Workflows/src/CheckDuplicatePortfolioManagerMapping.csx +119 -0
- package/touch/Workflows/src/CheckDuplicateRezervationMapping.csx +150 -0
- package/touch/Workflows/src/CheckExistingPermanentChatRoomMapping.csx +169 -0
- package/touch/Workflows/src/CheckRandevuTimeMapping.csx +67 -0
- package/touch/Workflows/src/CheckRezervationStateActiveOrInMeetRule.csx +14 -0
- package/touch/Workflows/src/CreateAbsenceEntryForRezervationMapping.csx +111 -0
- package/touch/Workflows/src/CreateAbsenceForRandevuUpdateMapping.csx +108 -0
- package/touch/Workflows/src/CreateChatRoomForRezervationMapping.csx +122 -0
- package/touch/Workflows/src/CreatePermanentChatRoomMapping.csx +140 -0
- package/touch/Workflows/src/CustomerControlToEndRule.csx +14 -0
- package/touch/Workflows/src/DetermineTransferTypeMapping.csx +92 -0
- package/touch/Workflows/src/EnrichRezervationsForTransferMapping.csx +495 -0
- package/touch/Workflows/src/ExecutePermanentChatRoomUpdateMapping.csx +124 -0
- package/touch/Workflows/src/ExecuteRezChatRoomTransferMapping.csx +95 -0
- package/touch/Workflows/src/ExecuteTransferMapping.csx +152 -0
- package/touch/Workflows/src/FetchAbsenceEntriesForTransferMapping.csx +116 -0
- package/touch/Workflows/src/FetchAdvisorsForTransferMapping.csx +145 -0
- package/touch/Workflows/src/FetchPermanentChatRoomsMapping.csx +128 -0
- package/touch/Workflows/src/FetchRezervationsForTransferMapping.csx +124 -0
- package/touch/Workflows/src/GetChatRoomDataForRezervationMapping.csx +100 -0
- package/touch/Workflows/src/GetChatTokenMapping.csx +85 -0
- package/touch/Workflows/src/GetRezervationDataForAddParticipantMapping.csx +105 -0
- package/touch/Workflows/src/GetRezervationDataForRandevuUpdateMapping.csx +110 -0
- package/touch/Workflows/src/GetRezervationDataMapping.csx +111 -0
- package/touch/Workflows/src/GetRezervationStateForRandevuUpdateMapping.csx +80 -0
- package/touch/Workflows/src/GetRezervationStateMapping.csx +92 -0
- package/touch/Workflows/src/GetUserInfoForRezervationMapping.csx +63 -0
- package/touch/Workflows/src/GetVideoCallUrlMapping.csx +62 -0
- package/touch/Workflows/src/HasChangedAdvisorRule.csx +28 -0
- package/touch/Workflows/src/HasChatIntegrationRule.csx +41 -0
- package/touch/Workflows/src/HasExistingPermanentRoomRule.csx +28 -0
- package/touch/Workflows/src/InviteAdvisorForRandevuUpdateMapping.csx +86 -0
- package/touch/Workflows/src/InviteNewAdvisorToRezervationRoomMapping.csx +78 -0
- package/touch/Workflows/src/InviteNewParticipantToRandevuRoomMapping.csx +88 -0
- package/touch/Workflows/src/InvitedUserMergeMapping.csx +77 -0
- package/touch/Workflows/src/InvitedUserNotAllowedRule.csx +71 -0
- package/touch/Workflows/src/InvitedUserNotInMeetRule.csx +19 -0
- package/touch/Workflows/src/IsNotfSentRule.csx +36 -0
- package/touch/Workflows/src/JoinChatRoomForAddParticipantMapping.csx +118 -0
- package/touch/Workflows/src/JoinChatRoomForRandevuStartMapping.csx +119 -0
- package/touch/Workflows/src/JoinChatRoomForRezervationMapping.csx +118 -0
- package/touch/Workflows/src/JoinMatrixRoomMapping.csx +100 -0
- package/touch/Workflows/src/JoinUserToRoomMapping.csx +118 -0
- package/touch/Workflows/src/LoginForAddParticipantChatMapping.csx +102 -0
- package/touch/Workflows/src/LoginForRandevuStartChatMapping.csx +96 -0
- package/touch/Workflows/src/MergeRezervationUpdateMapping.csx +82 -0
- package/touch/Workflows/src/MergeTargetAdvisorForTransferMapping.csx +79 -0
- package/touch/Workflows/src/MergeUpdateBodyForRandevuUpdateMapping.csx +91 -0
- package/touch/Workflows/src/NoExistingPermanentRoomRule.csx +23 -0
- package/touch/Workflows/src/NotificationCompleteAlwaysRule.csx +14 -0
- package/touch/Workflows/src/NotificationCompleteFromPendingRule.csx +41 -0
- package/touch/Workflows/src/NotificationCompleteFromSmsRule.csx +36 -0
- package/touch/Workflows/src/NotificationPushFromPendingRule.csx +42 -0
- package/touch/Workflows/src/NotificationPushFromSmsRule.csx +36 -0
- package/touch/Workflows/src/NotificationSmsPendingRule.csx +32 -0
- package/touch/Workflows/src/PermanentDoneRule.csx +44 -0
- package/touch/Workflows/src/PermanentProcessNextRule.csx +44 -0
- package/touch/Workflows/src/RezChatRoomProcessNextRule.csx +44 -0
- package/touch/Workflows/src/RezChatRoomsDoneRule.csx +44 -0
- package/touch/Workflows/src/SendPushNotificationMapping.csx +146 -0
- package/touch/Workflows/src/SendSmsNotificationMapping.csx +138 -0
- package/touch/Workflows/src/SetChatRoomStatusActiveMapping.csx +22 -0
- package/touch/Workflows/src/SetChatRoomStatusDeactiveMapping.csx +22 -0
- package/touch/Workflows/src/SetPreviousAdvisorMapping.csx +28 -0
- package/touch/Workflows/src/SetUserFromHeadersForRezervationMapping.csx +24 -0
- package/touch/Workflows/src/SlotAvailableRule.csx +33 -0
- package/touch/Workflows/src/SlotUnavailableRule.csx +33 -0
- package/touch/Workflows/src/StartChatRoomForRezervationMapping.csx +100 -0
- package/touch/Workflows/src/StartGetChatTokenForRezervationMapping.csx +71 -0
- package/touch/Workflows/src/StartNotificationForAdvisorMapping.csx +117 -0
- package/touch/Workflows/src/StartNotificationForRezervationFromUserInfoMapping.csx +128 -0
- package/touch/Workflows/src/StartNotificationForUserMapping.csx +117 -0
- package/touch/Workflows/src/StartPermanentChatRoomMapping.csx +92 -0
- package/touch/Workflows/src/StartTransferFromAbsenceEntryMapping.csx +94 -0
- package/touch/Workflows/src/StartVideoCallCustomerSubFlowMapping.csx +37 -0
- package/touch/Workflows/src/StartVideoCallForInvitedParticipantMapping.csx +54 -0
- package/touch/Workflows/src/StartVideoCallForRandevuStartMapping.csx +70 -0
- package/touch/Workflows/src/StartVideoCallStaffSubFlowMapping.csx +37 -0
- package/touch/Workflows/src/StateActiveForUpdateRule.csx +14 -0
- package/touch/Workflows/src/StateActiveRule.csx +14 -0
- package/touch/Workflows/src/StateInMeetRule.csx +14 -0
- package/touch/Workflows/src/StateNotActiveForUpdateRule.csx +14 -0
- package/touch/Workflows/src/StateNotActiveOrInMeetRule.csx +14 -0
- package/touch/Workflows/src/StatusCustomerEnterRule.csx +25 -0
- package/touch/Workflows/src/StatusStaffEnterRule.csx +25 -0
- package/touch/Workflows/src/SyncWorkingHoursRule.csx +46 -0
- package/touch/Workflows/src/TokenSuccessRule.csx +24 -0
- package/touch/Workflows/src/TransferAllDoneRule.csx +50 -0
- package/touch/Workflows/src/TransferHasInvalidRule.csx +34 -0
- package/touch/Workflows/src/TransferProcessNextRule.csx +50 -0
- package/touch/Workflows/src/TriggerChatRoomDeactivateMapping.csx +77 -0
- package/touch/Workflows/src/TriggerChatRoomTransferMapping.csx +93 -0
- package/touch/Workflows/src/TriggerChatRoomUpdateMapping.csx +99 -0
- package/touch/Workflows/src/TriggerRezervationAddInvitedParticipantMapping.csx +77 -0
- package/touch/Workflows/src/TriggerRezervationApplyUpdateMapping.csx +66 -0
- package/touch/Workflows/src/TriggerRezervationToInMeetMapping.csx +69 -0
- package/touch/Workflows/src/TriggerRezervationVideoCallUpdateMapping.csx +67 -0
- package/touch/Workflows/src/ValidateDateForRezervationMapping.csx +60 -0
- package/touch/Workflows/src/ValidateSlotForRandevuUpdateMapping.csx +211 -0
- package/touch/Workflows/src/ValidateSlotForRezervationMapping.csx +246 -0
- package/touch/Workflows/src/ValidateTransferMapping.csx +243 -0
- package/touch/Workflows/src/VideoCallUrlUpdateMergeMapping.csx +141 -0
- package/touch/Workflows/start-chat.json +217 -0
- package/touch/Workflows/start-video-call.http +93 -0
- package/touch/Workflows/start-video-call.json +206 -0
- package/vnext.config.json +58 -0
|
@@ -0,0 +1,59 @@
|
|
|
1
|
+
###############################################################################
|
|
2
|
+
# Get Rezervations Function - HTTP Test File
|
|
3
|
+
#
|
|
4
|
+
# This file tests the get-rezervations function which:
|
|
5
|
+
# - Uses DaprServiceTask (get-rezervations-task, Type 3) to GET rezervation instances
|
|
6
|
+
# - Filter: currentState in (active, in-meet) AND status eq "A"
|
|
7
|
+
# - Optional filters: advisorId, userId, managerId
|
|
8
|
+
# - Returns rezervation instances matching the criteria
|
|
9
|
+
#
|
|
10
|
+
# Prerequisites:
|
|
11
|
+
# 1. vNext Runtime running on localhost:4201
|
|
12
|
+
# 2. Some rezervation instances
|
|
13
|
+
#
|
|
14
|
+
# Reference:
|
|
15
|
+
# - DaprServiceTask: https://github.com/burgan-tech/vnext-runtime/blob/main/doc/en/flow/tasks/dapr-service.md
|
|
16
|
+
# - Instance Filtering: https://github.com/burgan-tech/vnext-runtime/blob/main/doc/en/flow/instance-filtering.md
|
|
17
|
+
###############################################################################
|
|
18
|
+
|
|
19
|
+
@baseUrl = http://localhost:4201
|
|
20
|
+
@apiVersion = 1
|
|
21
|
+
@domain = touch
|
|
22
|
+
|
|
23
|
+
###############################################################################
|
|
24
|
+
# Call get-rezervations function (uses get-rezervations-task)
|
|
25
|
+
###############################################################################
|
|
26
|
+
|
|
27
|
+
### Get Rezervations - by advisorId
|
|
28
|
+
# @name getRezervationsByAdvisor
|
|
29
|
+
GET {{baseUrl}}/api/v{{apiVersion}}/{{domain}}/functions/get-rezervations?advisorId=touch:portfolio-manager:pm-001
|
|
30
|
+
Accept: application/json
|
|
31
|
+
Accept-Language: tr-TR
|
|
32
|
+
X-Request-Id: {{$guid}}
|
|
33
|
+
|
|
34
|
+
### Get Rezervations - by userId
|
|
35
|
+
# @name getRezervationsByUser
|
|
36
|
+
GET {{baseUrl}}/api/v{{apiVersion}}/{{domain}}/functions/get-rezervations?userId=user-001
|
|
37
|
+
Accept: application/json
|
|
38
|
+
Accept-Language: tr-TR
|
|
39
|
+
X-Request-Id: {{$guid}}
|
|
40
|
+
|
|
41
|
+
### Get Rezervations - by managerId
|
|
42
|
+
# @name getRezervationsByManager
|
|
43
|
+
GET {{baseUrl}}/api/v{{apiVersion}}/{{domain}}/functions/get-rezervations?managerId=manager-001
|
|
44
|
+
Accept: application/json
|
|
45
|
+
Accept-Language: tr-TR
|
|
46
|
+
X-Request-Id: {{$guid}}
|
|
47
|
+
|
|
48
|
+
### Get Rezervations - by advisorId and userId
|
|
49
|
+
# @name getRezervationsByAdvisorAndUser
|
|
50
|
+
GET {{baseUrl}}/api/v{{apiVersion}}/{{domain}}/functions/get-rezervations?advisorId=touch:portfolio-manager:pm-001&userId=user-001
|
|
51
|
+
Accept: application/json
|
|
52
|
+
Accept-Language: tr-TR
|
|
53
|
+
X-Request-Id: {{$guid}}
|
|
54
|
+
|
|
55
|
+
###############################################################################
|
|
56
|
+
# DaprServiceTask (get-rezervations-task) calls:
|
|
57
|
+
# GET vnext-app-touch/api/v1/touch/workflows/rezervation/instances?pageSize=100&filter=<url-encoded-json>
|
|
58
|
+
# Filter JSON: {"and":[{"or":[{"currentState":{"eq":"active"}},{"currentState":{"eq":"in-meet"}}]},{"status":{"eq":"A"}},{"attributes":{"advisor":{"eq":"<advisorId>"}}},...]}
|
|
59
|
+
###############################################################################
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
{
|
|
2
|
+
"key": "get-room-messages",
|
|
3
|
+
"flow": "sys-functions",
|
|
4
|
+
"domain": "touch",
|
|
5
|
+
"version": "1.0.0",
|
|
6
|
+
"flowVersion": "1.0.0",
|
|
7
|
+
"tags": [
|
|
8
|
+
"chat",
|
|
9
|
+
"rooms",
|
|
10
|
+
"messages",
|
|
11
|
+
"matrix"
|
|
12
|
+
],
|
|
13
|
+
"attributes": {
|
|
14
|
+
"scope": "F",
|
|
15
|
+
"task": {
|
|
16
|
+
"order": 1,
|
|
17
|
+
"task": {
|
|
18
|
+
"key": "get-matrix-room-messages",
|
|
19
|
+
"domain": "touch",
|
|
20
|
+
"version": "1.0.0",
|
|
21
|
+
"flow": "sys-tasks"
|
|
22
|
+
},
|
|
23
|
+
"mapping": {
|
|
24
|
+
"location": "./src/GetRoomMessagesMapping.csx",
|
|
25
|
+
"code": "dXNpbmcgU3lzdGVtOwp1c2luZyBTeXN0ZW0uQ29sbGVjdGlvbnMuR2VuZXJpYzsKdXNpbmcgU3lzdGVtLlRocmVhZGluZy5UYXNrczsKdXNpbmcgQkJULldvcmtmbG93LlNjcmlwdGluZzsKdXNpbmcgQkJULldvcmtmbG93LkRlZmluaXRpb25zOwoKLy8vIDxzdW1tYXJ5PgovLy8gTWFwcGluZyBmb3IgZ2V0LW1hdHJpeC1yb29tLW1lc3NhZ2VzIEh0dHBUYXNrIChUeXBlIDYpLgovLy8gRmxvdy1sZXZlbCBmdW5jdGlvbiAoc2NvcGU6IEYpIC0tIG5vIGluc3RhbmNlIGNvbnRleHQuCi8vLyBSZWFkcyByb29tSWQsIHVzZXIsIGxpbWl0LCBmcm9tIHF1ZXJ5IHBhcmFtZXRlcnMuCi8vLyBDYWxscyBHRVQgL19tYXRyaXgvY2xpZW50L3YzL3Jvb21zL3tyb29tSWR9L21lc3NhZ2VzIHZpYSBBUElTSVguCi8vLyBSZXR1cm5zIHN0cnVjdHVyZWQgbWVzc2FnZSBsaXN0IGZyb20gTWF0cml4IHJlc3BvbnNlLgovLy8gPC9zdW1tYXJ5PgpwdWJsaWMgY2xhc3MgR2V0Um9vbU1lc3NhZ2VzTWFwcGluZyA6IFNjcmlwdEJhc2UsIElNYXBwaW5nCnsKICAgIHB1YmxpYyBhc3luYyBUYXNrPFNjcmlwdFJlc3BvbnNlPiBJbnB1dEhhbmRsZXIoV29ya2Zsb3dUYXNrIHRhc2ssIFNjcmlwdENvbnRleHQgY29udGV4dCkKICAgIHsKICAgICAgICB2YXIgaHR0cFRhc2sgPSB0YXNrIGFzIEh0dHBUYXNrOwogICAgICAgIGlmIChodHRwVGFzayA9PSBudWxsKQogICAgICAgICAgICB0aHJvdyBuZXcgSW52YWxpZE9wZXJhdGlvbkV4Y2VwdGlvbigiVGFzayBtdXN0IGJlIGFuIEh0dHBUYXNrIik7CgogICAgICAgIHZhciBtYXRyaXhCYXNlVXJsID0gYXdhaXQgR2V0U2VjcmV0QXN5bmMoInZuZXh0LXNlY3JldCIsICJ3b3JrZmxvdy1zZWNyZXQiLCAiTWF0cml4QmFzZVVybCIpOwogICAgICAgIGlmIChzdHJpbmcuSXNOdWxsT3JXaGl0ZVNwYWNlKG1hdHJpeEJhc2VVcmwpKQogICAgICAgICAgICB0aHJvdyBuZXcgSW52YWxpZE9wZXJhdGlvbkV4Y2VwdGlvbigiTWF0cml4QmFzZVVybCBzZWNyZXQgaXMgcmVxdWlyZWQiKTsKCiAgICAgICAgdmFyIHJvb21JZCA9IFJlYWRQYXJhbShjb250ZXh0LCAicm9vbUlkIik7CiAgICAgICAgdmFyIHVzZXIgPSBSZWFkUGFyYW0oY29udGV4dCwgInVzZXIiKTsKCiAgICAgICAgaWYgKHN0cmluZy5Jc051bGxPcldoaXRlU3BhY2Uocm9vbUlkKSkKICAgICAgICAgICAgdGhyb3cgbmV3IEludmFsaWRPcGVyYXRpb25FeGNlcHRpb24oIlZBTElEQVRJT05fRVJST1I6IHJvb21JZCBxdWVyeSBwYXJhbWV0ZXIgaXMgcmVxdWlyZWQiKTsKICAgICAgICBpZiAoc3RyaW5nLklzTnVsbE9yV2hpdGVTcGFjZSh1c2VyKSkKICAgICAgICAgICAgdGhyb3cgbmV3IEludmFsaWRPcGVyYXRpb25FeGNlcHRpb24oIlZBTElEQVRJT05fRVJST1I6IHVzZXIgcXVlcnkgcGFyYW1ldGVyIGlzIHJlcXVpcmVkIik7CgogICAgICAgIHZhciBsaW1pdCA9IFJlYWRQYXJhbShjb250ZXh0LCAibGltaXQiKTsKICAgICAgICBpZiAoc3RyaW5nLklzTnVsbE9yV2hpdGVTcGFjZShsaW1pdCkpCiAgICAgICAgICAgIGxpbWl0ID0gIjUwIjsKCiAgICAgICAgdmFyIGZyb20gPSBSZWFkUGFyYW0oY29udGV4dCwgImZyb20iKTsKCiAgICAgICAgdmFyIGZ1bGxVcmwgPSBtYXRyaXhCYXNlVXJsLlRyaW1FbmQoJy8nKSArICIvX21hdHJpeC9jbGllbnQvdjMvcm9vbXMvIiArIFVyaS5Fc2NhcGVEYXRhU3RyaW5nKHJvb21JZCkgKyAiL21lc3NhZ2VzIjsKCiAgICAgICAgdmFyIHFzID0gImRpcj1iJmxpbWl0PSIgKyBsaW1pdDsKICAgICAgICBpZiAoIXN0cmluZy5Jc051bGxPcldoaXRlU3BhY2UoZnJvbSkpCiAgICAgICAgICAgIHFzICs9ICImZnJvbT0iICsgVXJpLkVzY2FwZURhdGFTdHJpbmcoZnJvbSk7CgogICAgICAgIGh0dHBUYXNrLlNldFVybChmdWxsVXJsICsgIj8iICsgcXMpOwoKICAgICAgICB2YXIgaGVhZGVycyA9IG5ldyBEaWN0aW9uYXJ5PHN0cmluZywgc3RyaW5nPgogICAgICAgIHsKICAgICAgICAgICAgWyJBY2NlcHQiXSA9ICJhcHBsaWNhdGlvbi9qc29uIiwKICAgICAgICAgICAgWyJYLU1hdHJpeC1Vc2VyIl0gPSB1c2VyCiAgICAgICAgfTsKICAgICAgICBodHRwVGFzay5TZXRIZWFkZXJzKGhlYWRlcnMpOwoKICAgICAgICByZXR1cm4gbmV3IFNjcmlwdFJlc3BvbnNlKCk7CiAgICB9CgogICAgcHVibGljIFRhc2s8U2NyaXB0UmVzcG9uc2U+IE91dHB1dEhhbmRsZXIoU2NyaXB0Q29udGV4dCBjb250ZXh0KQogICAgewogICAgICAgIHRyeQogICAgICAgIHsKICAgICAgICAgICAgdmFyIHJlc3BvbnNlID0gY29udGV4dC5Cb2R5OwogICAgICAgICAgICB2YXIgYm9keURhdGEgPSByZXNwb25zZT8uZGF0YTsKCiAgICAgICAgICAgIHN0cmluZyBlcnJjb2RlID0gR2V0U3RyaW5nKGJvZHlEYXRhLCAiZXJyY29kZSIpOwogICAgICAgICAgICBpZiAoIXN0cmluZy5Jc051bGxPckVtcHR5KGVycmNvZGUpKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBzdHJpbmcgZXJyb3JNc2cgPSBHZXRTdHJpbmcoYm9keURhdGEsICJlcnJvciIpOwogICAgICAgICAgICAgICAgcmV0dXJuIFRhc2suRnJvbVJlc3VsdChuZXcgU2NyaXB0UmVzcG9uc2UKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBLZXkgPSAiZ2V0LXJvb20tbWVzc2FnZXMtZXJyb3IiLAogICAgICAgICAgICAgICAgICAgIERhdGEgPSBuZXcKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgIGVycm9yID0gZXJyb3JNc2csCiAgICAgICAgICAgICAgICAgICAgICAgIGVycm9yQ29kZSA9IGVycmNvZGUsCiAgICAgICAgICAgICAgICAgICAgICAgIG1lc3NhZ2VzID0gbmV3IExpc3Q8b2JqZWN0PigpCiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICBUYWdzID0gbmV3W10geyAiY2hhdCIsICJtZXNzYWdlcyIsICJlcnJvciIgfQogICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIHZhciBtZXNzYWdlcyA9IG5ldyBMaXN0PG9iamVjdD4oKTsKCiAgICAgICAgICAgIGlmIChIYXNQcm9wZXJ0eShib2R5RGF0YSwgImNodW5rIikgJiYgYm9keURhdGEuY2h1bmsgIT0gbnVsbCkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgZm9yZWFjaCAodmFyIGV2dCBpbiBib2R5RGF0YS5jaHVuaykKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICB2YXIgZXZ0VHlwZSA9IEdldFN0cmluZyhldnQsICJ0eXBlIik7CiAgICAgICAgICAgICAgICAgICAgaWYgKGV2dFR5cGUgIT0gIm0ucm9vbS5tZXNzYWdlIikgY29udGludWU7CgogICAgICAgICAgICAgICAgICAgIHZhciBjb250ZW50ID0gZXZ0Py5jb250ZW50OwogICAgICAgICAgICAgICAgICAgIGlmIChjb250ZW50ID09IG51bGwpIGNvbnRpbnVlOwoKICAgICAgICAgICAgICAgICAgICBzdHJpbmcgYm9keSA9IEdldFN0cmluZyhjb250ZW50LCAiYm9keSIpOwogICAgICAgICAgICAgICAgICAgIHN0cmluZyBtc2d0eXBlID0gR2V0U3RyaW5nKGNvbnRlbnQsICJtc2d0eXBlIik7CiAgICAgICAgICAgICAgICAgICAgc3RyaW5nIHNlbmRlciA9IEdldFN0cmluZyhldnQsICJzZW5kZXIiKTsKICAgICAgICAgICAgICAgICAgICBzdHJpbmcgZXZlbnRJZCA9IEdldFN0cmluZyhldnQsICJldmVudF9pZCIpOwogICAgICAgICAgICAgICAgICAgIHN0cmluZyB0cyA9IEdldFN0cmluZyhldnQsICJvcmlnaW5fc2VydmVyX3RzIik7CgogICAgICAgICAgICAgICAgICAgIG1lc3NhZ2VzLkFkZChuZXcKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgIGV2ZW50SWQgPSBldmVudElkLAogICAgICAgICAgICAgICAgICAgICAgICBzZW5kZXIgPSBzZW5kZXIsCiAgICAgICAgICAgICAgICAgICAgICAgIGJvZHkgPSBib2R5LAogICAgICAgICAgICAgICAgICAgICAgICB0aW1lc3RhbXAgPSB0cywKICAgICAgICAgICAgICAgICAgICAgICAgbXNndHlwZSA9IG1zZ3R5cGUKICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQoKICAgICAgICAgICAgc3RyaW5nIG5leHRUb2tlbiA9IEdldFN0cmluZyhib2R5RGF0YSwgImVuZCIpOwogICAgICAgICAgICBzdHJpbmcgcHJldlRva2VuID0gR2V0U3RyaW5nKGJvZHlEYXRhLCAic3RhcnQiKTsKCiAgICAgICAgICAgIHJldHVybiBUYXNrLkZyb21SZXN1bHQobmV3IFNjcmlwdFJlc3BvbnNlCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIEtleSA9ICJnZXQtcm9vbS1tZXNzYWdlcy1zdWNjZXNzIiwKICAgICAgICAgICAgICAgIERhdGEgPSBuZXcKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBtZXNzYWdlcyA9IG1lc3NhZ2VzLAogICAgICAgICAgICAgICAgICAgIG5leHRUb2tlbiA9IG5leHRUb2tlbiwKICAgICAgICAgICAgICAgICAgICBwcmV2VG9rZW4gPSBwcmV2VG9rZW4KICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICBUYWdzID0gbmV3W10geyAiY2hhdCIsICJtZXNzYWdlcyIsICJzdWNjZXNzIiB9CiAgICAgICAgICAgIH0pOwogICAgICAgIH0KICAgICAgICBjYXRjaCAoRXhjZXB0aW9uIGV4KQogICAgICAgIHsKICAgICAgICAgICAgcmV0dXJuIFRhc2suRnJvbVJlc3VsdChuZXcgU2NyaXB0UmVzcG9uc2UKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgS2V5ID0gImdldC1yb29tLW1lc3NhZ2VzLWVycm9yIiwKICAgICAgICAgICAgICAgIERhdGEgPSBuZXcKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBlcnJvciA9ICJJbnRlcm5hbCBwcm9jZXNzaW5nIGVycm9yIiwKICAgICAgICAgICAgICAgICAgICBlcnJvckNvZGUgPSAiUFJPQ0VTU0lOR19FUlJPUiIsCiAgICAgICAgICAgICAgICAgICAgZXJyb3JEZXNjcmlwdGlvbiA9IGV4Lk1lc3NhZ2UsCiAgICAgICAgICAgICAgICAgICAgbWVzc2FnZXMgPSBuZXcgTGlzdDxvYmplY3Q+KCkKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICBUYWdzID0gbmV3W10geyAiY2hhdCIsICJtZXNzYWdlcyIsICJlcnJvciIgfQogICAgICAgICAgICB9KTsKICAgICAgICB9CiAgICB9CgogICAgcHJpdmF0ZSBzdHJpbmcgUmVhZFBhcmFtKFNjcmlwdENvbnRleHQgY29udGV4dCwgc3RyaW5nIG5hbWUpCiAgICB7CiAgICAgICAgaWYgKGNvbnRleHQuUXVlcnlQYXJhbWV0ZXJzID09IG51bGwgfHwgIUhhc1Byb3BlcnR5KGNvbnRleHQuUXVlcnlQYXJhbWV0ZXJzLCBuYW1lKSkKICAgICAgICAgICAgcmV0dXJuIG51bGw7CiAgICAgICAgdmFyIHZhbCA9IGNvbnRleHQuUXVlcnlQYXJhbWV0ZXJzW25hbWVdOwogICAgICAgIHJldHVybiB2YWwgIT0gbnVsbCA/IHZhbC5Ub1N0cmluZygpIDogbnVsbDsKICAgIH0KCiAgICBwcml2YXRlIHN0cmluZyBHZXRTdHJpbmcoZHluYW1pYyBvYmosIHN0cmluZyBuYW1lKQogICAgewogICAgICAgIGlmIChvYmogPT0gbnVsbCkgcmV0dXJuIG51bGw7CiAgICAgICAgdHJ5CiAgICAgICAgewogICAgICAgICAgICBpZiAoSGFzUHJvcGVydHkob2JqLCBuYW1lKSkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgdmFyIHYgPSBHZXRQcm9wZXJ0eVZhbHVlKG9iaiwgbmFtZSk7CiAgICAgICAgICAgICAgICByZXR1cm4gdj8uVG9TdHJpbmcoKTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICBjYXRjaCB7IH0KICAgICAgICByZXR1cm4gbnVsbDsKICAgIH0KfQo="
|
|
26
|
+
}
|
|
27
|
+
}
|
|
28
|
+
}
|
|
29
|
+
}
|
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
###############################################################################
|
|
2
|
+
# get-room-messages - Flow-level Function (scope: F)
|
|
3
|
+
#
|
|
4
|
+
# Fetches message history from a Matrix room via
|
|
5
|
+
# GET /_matrix/client/v3/rooms/{roomId}/messages through APISIX.
|
|
6
|
+
#
|
|
7
|
+
# Parameters:
|
|
8
|
+
# roomId (required) - Matrix room ID (e.g. !abc:localhost)
|
|
9
|
+
# user (required) - User for X-Matrix-User header (APISIX auth)
|
|
10
|
+
# limit (optional) - Max messages to return (default 50)
|
|
11
|
+
# from (optional) - Pagination token (nextToken from previous response)
|
|
12
|
+
#
|
|
13
|
+
# Prerequisites:
|
|
14
|
+
# 1. vNext Runtime running (e.g. localhost:4201)
|
|
15
|
+
# 2. APISIX Gateway on localhost:9080 with matrix-auth plugin
|
|
16
|
+
# 3. At least one chat-room instance with a valid roomId
|
|
17
|
+
###############################################################################
|
|
18
|
+
|
|
19
|
+
@baseUrl = http://localhost:4201
|
|
20
|
+
@apiVersion = 1
|
|
21
|
+
@domain = touch
|
|
22
|
+
@user = core.user.user-001
|
|
23
|
+
@roomId = !paste-room-id-here:localhost
|
|
24
|
+
|
|
25
|
+
###############################################################################
|
|
26
|
+
# Get Room Messages (default limit)
|
|
27
|
+
###############################################################################
|
|
28
|
+
|
|
29
|
+
### Get Room Messages - Fetches last 50 messages from a Matrix room
|
|
30
|
+
# Flow-level function (scope: F) on chat-room workflow.
|
|
31
|
+
# Returns messages array with eventId, sender, body, timestamp, msgtype.
|
|
32
|
+
GET {{baseUrl}}/api/v{{apiVersion}}/{{domain}}/workflows/chat-room/functions/get-room-messages?roomId={{roomId}}&user={{user}}&pageSize=1
|
|
33
|
+
Accept: application/json
|
|
34
|
+
Accept-Language: tr-TR
|
|
35
|
+
X-Request-Id: {{$guid}}
|
|
36
|
+
|
|
37
|
+
###############################################################################
|
|
38
|
+
# Get Room Messages (custom limit)
|
|
39
|
+
###############################################################################
|
|
40
|
+
|
|
41
|
+
### Get Room Messages with limit - Fetches specified number of messages
|
|
42
|
+
GET {{baseUrl}}/api/v{{apiVersion}}/{{domain}}/workflows/chat-room/functions/get-room-messages?roomId={{roomId}}&user={{user}}&limit=20&pageSize=1
|
|
43
|
+
Accept: application/json
|
|
44
|
+
Accept-Language: tr-TR
|
|
45
|
+
X-Request-Id: {{$guid}}
|
|
@@ -0,0 +1,118 @@
|
|
|
1
|
+
###############################################################################
|
|
2
|
+
# Rezervation Transfer Workflow - HTTP Test File
|
|
3
|
+
#
|
|
4
|
+
# This file tests the rezervation-transfer workflow which allows transferring
|
|
5
|
+
# an advisor's future reservations to other available advisors.
|
|
6
|
+
#
|
|
7
|
+
# Two scenarios:
|
|
8
|
+
# A) Annual Leave: sourceAdvisorId + startDate + endDate
|
|
9
|
+
# B) Termination: sourceAdvisorId + startDate (no endDate)
|
|
10
|
+
#
|
|
11
|
+
# Flow:
|
|
12
|
+
# 1. Start: Provide params -> fetches + enriches reservations -> awaiting-assignment
|
|
13
|
+
# 2. confirm-transfer: Provide transferPlan -> validates -> validating
|
|
14
|
+
# 3. Auto: process-next (self-loop) until all done -> completed
|
|
15
|
+
# OR: has-invalid -> back to awaiting-assignment
|
|
16
|
+
#
|
|
17
|
+
# Prerequisites:
|
|
18
|
+
# 1. vNext Runtime running on localhost:4201
|
|
19
|
+
# 2. Active rezervation instances for the source advisor
|
|
20
|
+
# 3. Other advisors with available slots
|
|
21
|
+
#
|
|
22
|
+
###############################################################################
|
|
23
|
+
|
|
24
|
+
@baseUrl = http://localhost:4201
|
|
25
|
+
@apiVersion = 1
|
|
26
|
+
@domain = touch
|
|
27
|
+
@workflow = rezervation-transfer
|
|
28
|
+
@instanceKey = transfer-test-001
|
|
29
|
+
|
|
30
|
+
###############################################################################
|
|
31
|
+
# Scenario A: Annual Leave (startDate + endDate)
|
|
32
|
+
###############################################################################
|
|
33
|
+
|
|
34
|
+
### Start Transfer - Annual Leave
|
|
35
|
+
# @name startTransferAnnualLeave
|
|
36
|
+
POST {{baseUrl}}/api/v{{apiVersion}}/{{domain}}/workflows/{{workflow}}/instances/{{instanceKey}}/transitions/start
|
|
37
|
+
Content-Type: application/json
|
|
38
|
+
Accept: application/json
|
|
39
|
+
Accept-Language: tr-TR
|
|
40
|
+
X-Request-Id: {{$guid}}
|
|
41
|
+
|
|
42
|
+
{
|
|
43
|
+
"sourceAdvisorId": "touch:portfolio-manager:pm-001",
|
|
44
|
+
"startDate": "2026-03-15",
|
|
45
|
+
"endDate": "2026-04-15"
|
|
46
|
+
}
|
|
47
|
+
|
|
48
|
+
###############################################################################
|
|
49
|
+
# Scenario B: Termination (only startDate, no endDate)
|
|
50
|
+
###############################################################################
|
|
51
|
+
|
|
52
|
+
### Start Transfer - Termination
|
|
53
|
+
# @name startTransferTermination
|
|
54
|
+
POST {{baseUrl}}/api/v{{apiVersion}}/{{domain}}/workflows/{{workflow}}/instances/transfer-term-001/transitions/start
|
|
55
|
+
Content-Type: application/json
|
|
56
|
+
Accept: application/json
|
|
57
|
+
Accept-Language: tr-TR
|
|
58
|
+
X-Request-Id: {{$guid}}
|
|
59
|
+
|
|
60
|
+
{
|
|
61
|
+
"sourceAdvisorId": "touch:portfolio-manager:pm-001",
|
|
62
|
+
"startDate": "2026-03-15"
|
|
63
|
+
}
|
|
64
|
+
|
|
65
|
+
###############################################################################
|
|
66
|
+
# Step 2: Confirm Transfer (awaiting-assignment -> validating)
|
|
67
|
+
# User assigns target advisors from the enrichedRezervations list
|
|
68
|
+
###############################################################################
|
|
69
|
+
|
|
70
|
+
### Confirm Transfer - assign advisors and validate
|
|
71
|
+
# @name confirmTransfer
|
|
72
|
+
POST {{baseUrl}}/api/v{{apiVersion}}/{{domain}}/workflows/{{workflow}}/instances/{{instanceKey}}/transitions/confirm-transfer
|
|
73
|
+
Content-Type: application/json
|
|
74
|
+
Accept: application/json
|
|
75
|
+
Accept-Language: tr-TR
|
|
76
|
+
X-Request-Id: {{$guid}}
|
|
77
|
+
|
|
78
|
+
{
|
|
79
|
+
"transferPlan": [
|
|
80
|
+
{
|
|
81
|
+
"rezervationKey": "rez-001",
|
|
82
|
+
"targetAdvisor": "touch:portfolio-manager:pm-002"
|
|
83
|
+
},
|
|
84
|
+
{
|
|
85
|
+
"rezervationKey": "rez-002",
|
|
86
|
+
"targetAdvisor": "touch:investment-advisor:ia-001"
|
|
87
|
+
},
|
|
88
|
+
{
|
|
89
|
+
"rezervationKey": "rez-003",
|
|
90
|
+
"targetAdvisor": "touch:portfolio-manager:pm-003"
|
|
91
|
+
}
|
|
92
|
+
]
|
|
93
|
+
}
|
|
94
|
+
|
|
95
|
+
###############################################################################
|
|
96
|
+
# Cancel transfer from awaiting-assignment
|
|
97
|
+
###############################################################################
|
|
98
|
+
|
|
99
|
+
### Cancel Transfer
|
|
100
|
+
# @name cancelTransfer
|
|
101
|
+
POST {{baseUrl}}/api/v{{apiVersion}}/{{domain}}/workflows/{{workflow}}/instances/{{instanceKey}}/transitions/cancel
|
|
102
|
+
Content-Type: application/json
|
|
103
|
+
Accept: application/json
|
|
104
|
+
Accept-Language: tr-TR
|
|
105
|
+
X-Request-Id: {{$guid}}
|
|
106
|
+
|
|
107
|
+
{}
|
|
108
|
+
|
|
109
|
+
###############################################################################
|
|
110
|
+
# Get instance state (for debugging)
|
|
111
|
+
###############################################################################
|
|
112
|
+
|
|
113
|
+
### Get Transfer Instance
|
|
114
|
+
# @name getInstance
|
|
115
|
+
GET {{baseUrl}}/api/v{{apiVersion}}/{{domain}}/workflows/{{workflow}}/instances/{{instanceKey}}
|
|
116
|
+
Accept: application/json
|
|
117
|
+
Accept-Language: tr-TR
|
|
118
|
+
X-Request-Id: {{$guid}}
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
{
|
|
2
|
+
"key": "send-room-message",
|
|
3
|
+
"flow": "sys-functions",
|
|
4
|
+
"domain": "touch",
|
|
5
|
+
"version": "1.0.0",
|
|
6
|
+
"flowVersion": "1.0.0",
|
|
7
|
+
"tags": [
|
|
8
|
+
"chat",
|
|
9
|
+
"rooms",
|
|
10
|
+
"messages",
|
|
11
|
+
"matrix"
|
|
12
|
+
],
|
|
13
|
+
"attributes": {
|
|
14
|
+
"scope": "F",
|
|
15
|
+
"task": {
|
|
16
|
+
"order": 1,
|
|
17
|
+
"task": {
|
|
18
|
+
"key": "send-matrix-room-message",
|
|
19
|
+
"domain": "touch",
|
|
20
|
+
"version": "1.0.0",
|
|
21
|
+
"flow": "sys-tasks"
|
|
22
|
+
},
|
|
23
|
+
"mapping": {
|
|
24
|
+
"location": "./src/SendRoomMessageMapping.csx",
|
|
25
|
+
"code": "dXNpbmcgU3lzdGVtOwp1c2luZyBTeXN0ZW0uQ29sbGVjdGlvbnMuR2VuZXJpYzsKdXNpbmcgU3lzdGVtLlRocmVhZGluZy5UYXNrczsKdXNpbmcgQkJULldvcmtmbG93LlNjcmlwdGluZzsKdXNpbmcgQkJULldvcmtmbG93LkRlZmluaXRpb25zOwoKLy8vIDxzdW1tYXJ5PgovLy8gTWFwcGluZyBmb3Igc2VuZC1tYXRyaXgtcm9vbS1tZXNzYWdlIEh0dHBUYXNrIChUeXBlIDYpLgovLy8gRmxvdy1sZXZlbCBmdW5jdGlvbiAoc2NvcGU6IEYpIC0tIG5vIGluc3RhbmNlIGNvbnRleHQuCi8vLyBSZWFkcyByb29tSWQsIHVzZXIsIGJvZHkgZnJvbSBxdWVyeSBwYXJhbWV0ZXJzLgovLy8gQ2FsbHMgUE9TVCAvX21hdHJpeC9jbGllbnQvdjMvcm9vbXMve3Jvb21JZH0vc2VuZC9tLnJvb20ubWVzc2FnZS97dHhuSWR9IHZpYSBBUElTSVguCi8vLyBYLU1hdHJpeC1Vc2VyIGhlYWRlciBpcyBjb252ZXJ0ZWQgdG8gQmVhcmVyIHRva2VuIGJ5IEFQSVNJWCBhdXRvbWF0aWNhbGx5LgovLy8gUmV0dXJucyBldmVudF9pZCBvbiBzdWNjZXNzLgovLy8gPC9zdW1tYXJ5PgpwdWJsaWMgY2xhc3MgU2VuZFJvb21NZXNzYWdlTWFwcGluZyA6IFNjcmlwdEJhc2UsIElNYXBwaW5nCnsKICAgIHB1YmxpYyBhc3luYyBUYXNrPFNjcmlwdFJlc3BvbnNlPiBJbnB1dEhhbmRsZXIoV29ya2Zsb3dUYXNrIHRhc2ssIFNjcmlwdENvbnRleHQgY29udGV4dCkKICAgIHsKICAgICAgICB2YXIgaHR0cFRhc2sgPSB0YXNrIGFzIEh0dHBUYXNrOwogICAgICAgIGlmIChodHRwVGFzayA9PSBudWxsKQogICAgICAgICAgICB0aHJvdyBuZXcgSW52YWxpZE9wZXJhdGlvbkV4Y2VwdGlvbigiVGFzayBtdXN0IGJlIGFuIEh0dHBUYXNrIik7CgogICAgICAgIHZhciBtYXRyaXhCYXNlVXJsID0gYXdhaXQgR2V0U2VjcmV0QXN5bmMoInZuZXh0LXNlY3JldCIsICJ3b3JrZmxvdy1zZWNyZXQiLCAiTWF0cml4QmFzZVVybCIpOwogICAgICAgIGlmIChzdHJpbmcuSXNOdWxsT3JXaGl0ZVNwYWNlKG1hdHJpeEJhc2VVcmwpKQogICAgICAgICAgICB0aHJvdyBuZXcgSW52YWxpZE9wZXJhdGlvbkV4Y2VwdGlvbigiTWF0cml4QmFzZVVybCBzZWNyZXQgaXMgcmVxdWlyZWQiKTsKCiAgICAgICAgdmFyIHJvb21JZCA9IFJlYWRQYXJhbShjb250ZXh0LCAicm9vbUlkIik7CiAgICAgICAgdmFyIHVzZXIgPSBSZWFkUGFyYW0oY29udGV4dCwgInVzZXIiKTsKICAgICAgICB2YXIgYm9keSA9IFJlYWRQYXJhbShjb250ZXh0LCAiYm9keSIpOwoKICAgICAgICBpZiAoc3RyaW5nLklzTnVsbE9yV2hpdGVTcGFjZShyb29tSWQpKQogICAgICAgICAgICB0aHJvdyBuZXcgSW52YWxpZE9wZXJhdGlvbkV4Y2VwdGlvbigiVkFMSURBVElPTl9FUlJPUjogcm9vbUlkIHF1ZXJ5IHBhcmFtZXRlciBpcyByZXF1aXJlZCIpOwogICAgICAgIGlmIChzdHJpbmcuSXNOdWxsT3JXaGl0ZVNwYWNlKHVzZXIpKQogICAgICAgICAgICB0aHJvdyBuZXcgSW52YWxpZE9wZXJhdGlvbkV4Y2VwdGlvbigiVkFMSURBVElPTl9FUlJPUjogdXNlciBxdWVyeSBwYXJhbWV0ZXIgaXMgcmVxdWlyZWQiKTsKICAgICAgICBpZiAoc3RyaW5nLklzTnVsbE9yV2hpdGVTcGFjZShib2R5KSkKICAgICAgICAgICAgdGhyb3cgbmV3IEludmFsaWRPcGVyYXRpb25FeGNlcHRpb24oIlZBTElEQVRJT05fRVJST1I6IGJvZHkgcXVlcnkgcGFyYW1ldGVyIGlzIHJlcXVpcmVkIik7CgogICAgICAgIHZhciB0eG5JZCA9IEd1aWQuTmV3R3VpZCgpLlRvU3RyaW5nKCJOIik7CiAgICAgICAgdmFyIGZ1bGxVcmwgPSBtYXRyaXhCYXNlVXJsLlRyaW1FbmQoJy8nKSArCiAgICAgICAgICAgICIvX21hdHJpeC9jbGllbnQvdjMvcm9vbXMvIiArIFVyaS5Fc2NhcGVEYXRhU3RyaW5nKHJvb21JZCkgKwogICAgICAgICAgICAiL3NlbmQvbS5yb29tLm1lc3NhZ2UvIiArIHR4bklkOwoKICAgICAgICBodHRwVGFzay5TZXRVcmwoZnVsbFVybCk7CgogICAgICAgIHZhciBoZWFkZXJzID0gbmV3IERpY3Rpb25hcnk8c3RyaW5nLCBzdHJpbmc+CiAgICAgICAgewogICAgICAgICAgICBbIkNvbnRlbnQtVHlwZSJdID0gImFwcGxpY2F0aW9uL2pzb24iLAogICAgICAgICAgICBbIkFjY2VwdCJdID0gImFwcGxpY2F0aW9uL2pzb24iLAogICAgICAgICAgICBbIlgtTWF0cml4LVVzZXIiXSA9IHVzZXIKICAgICAgICB9OwogICAgICAgIGh0dHBUYXNrLlNldEhlYWRlcnMoaGVhZGVycyk7CgogICAgICAgIGh0dHBUYXNrLlNldEJvZHkobmV3CiAgICAgICAgewogICAgICAgICAgICBtc2d0eXBlID0gIm0udGV4dCIsCiAgICAgICAgICAgIGJvZHkgPSBib2R5CiAgICAgICAgfSk7CgogICAgICAgIHJldHVybiBuZXcgU2NyaXB0UmVzcG9uc2UoKTsKICAgIH0KCiAgICBwdWJsaWMgVGFzazxTY3JpcHRSZXNwb25zZT4gT3V0cHV0SGFuZGxlcihTY3JpcHRDb250ZXh0IGNvbnRleHQpCiAgICB7CiAgICAgICAgdHJ5CiAgICAgICAgewogICAgICAgICAgICB2YXIgcmVzcG9uc2UgPSBjb250ZXh0LkJvZHk7CiAgICAgICAgICAgIHZhciBib2R5RGF0YSA9IHJlc3BvbnNlPy5kYXRhOwoKICAgICAgICAgICAgc3RyaW5nIGVycmNvZGUgPSBHZXRTdHJpbmcoYm9keURhdGEsICJlcnJjb2RlIik7CiAgICAgICAgICAgIGlmICghc3RyaW5nLklzTnVsbE9yRW1wdHkoZXJyY29kZSkpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHN0cmluZyBlcnJvck1zZyA9IEdldFN0cmluZyhib2R5RGF0YSwgImVycm9yIik7CiAgICAgICAgICAgICAgICByZXR1cm4gVGFzay5Gcm9tUmVzdWx0KG5ldyBTY3JpcHRSZXNwb25zZQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIEtleSA9ICJzZW5kLXJvb20tbWVzc2FnZS1lcnJvciIsCiAgICAgICAgICAgICAgICAgICAgRGF0YSA9IG5ldwogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgZXJyb3IgPSBlcnJvck1zZywKICAgICAgICAgICAgICAgICAgICAgICAgZXJyb3JDb2RlID0gZXJyY29kZQogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgVGFncyA9IG5ld1tdIHsgImNoYXQiLCAibWVzc2FnZXMiLCAiZXJyb3IiIH0KICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICB9CgogICAgICAgICAgICBzdHJpbmcgZXZlbnRJZCA9IEdldFN0cmluZyhib2R5RGF0YSwgImV2ZW50X2lkIik7CiAgICAgICAgICAgIHJldHVybiBUYXNrLkZyb21SZXN1bHQobmV3IFNjcmlwdFJlc3BvbnNlCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIEtleSA9ICJzZW5kLXJvb20tbWVzc2FnZS1zdWNjZXNzIiwKICAgICAgICAgICAgICAgIERhdGEgPSBuZXcgeyBldmVudElkID0gZXZlbnRJZCB9LAogICAgICAgICAgICAgICAgVGFncyA9IG5ld1tdIHsgImNoYXQiLCAibWVzc2FnZXMiLCAic3VjY2VzcyIgfQogICAgICAgICAgICB9KTsKICAgICAgICB9CiAgICAgICAgY2F0Y2ggKEV4Y2VwdGlvbiBleCkKICAgICAgICB7CiAgICAgICAgICAgIHJldHVybiBUYXNrLkZyb21SZXN1bHQobmV3IFNjcmlwdFJlc3BvbnNlCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIEtleSA9ICJzZW5kLXJvb20tbWVzc2FnZS1lcnJvciIsCiAgICAgICAgICAgICAgICBEYXRhID0gbmV3CiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgZXJyb3IgPSAiSW50ZXJuYWwgcHJvY2Vzc2luZyBlcnJvciIsCiAgICAgICAgICAgICAgICAgICAgZXJyb3JDb2RlID0gIlBST0NFU1NJTkdfRVJST1IiLAogICAgICAgICAgICAgICAgICAgIGVycm9yRGVzY3JpcHRpb24gPSBleC5NZXNzYWdlCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgVGFncyA9IG5ld1tdIHsgImNoYXQiLCAibWVzc2FnZXMiLCAiZXJyb3IiIH0KICAgICAgICAgICAgfSk7CiAgICAgICAgfQogICAgfQoKICAgIHByaXZhdGUgc3RyaW5nIFJlYWRQYXJhbShTY3JpcHRDb250ZXh0IGNvbnRleHQsIHN0cmluZyBuYW1lKQogICAgewogICAgICAgIGlmIChjb250ZXh0LlF1ZXJ5UGFyYW1ldGVycyA9PSBudWxsIHx8ICFIYXNQcm9wZXJ0eShjb250ZXh0LlF1ZXJ5UGFyYW1ldGVycywgbmFtZSkpCiAgICAgICAgICAgIHJldHVybiBudWxsOwogICAgICAgIHZhciB2YWwgPSBjb250ZXh0LlF1ZXJ5UGFyYW1ldGVyc1tuYW1lXTsKICAgICAgICByZXR1cm4gdmFsICE9IG51bGwgPyB2YWwuVG9TdHJpbmcoKSA6IG51bGw7CiAgICB9CgogICAgcHJpdmF0ZSBzdHJpbmcgR2V0U3RyaW5nKGR5bmFtaWMgb2JqLCBzdHJpbmcgbmFtZSkKICAgIHsKICAgICAgICBpZiAob2JqID09IG51bGwpIHJldHVybiBudWxsOwogICAgICAgIHRyeQogICAgICAgIHsKICAgICAgICAgICAgaWYgKEhhc1Byb3BlcnR5KG9iaiwgbmFtZSkpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHZhciB2ID0gR2V0UHJvcGVydHlWYWx1ZShvYmosIG5hbWUpOwogICAgICAgICAgICAgICAgcmV0dXJuIHY/LlRvU3RyaW5nKCk7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgY2F0Y2ggeyB9CiAgICAgICAgcmV0dXJuIG51bGw7CiAgICB9Cn0K"
|
|
26
|
+
}
|
|
27
|
+
}
|
|
28
|
+
}
|
|
29
|
+
}
|
|
@@ -0,0 +1,238 @@
|
|
|
1
|
+
using System;
|
|
2
|
+
using System.Collections.Generic;
|
|
3
|
+
using System.Linq;
|
|
4
|
+
using System.Text;
|
|
5
|
+
using System.Text.Json;
|
|
6
|
+
using System.Threading.Tasks;
|
|
7
|
+
using BBT.Workflow.Scripting;
|
|
8
|
+
using BBT.Workflow.Definitions;
|
|
9
|
+
|
|
10
|
+
/// <summary>
|
|
11
|
+
/// Mapping for check-livekit-room-access function.
|
|
12
|
+
/// Decodes access_token (plain format "prefix:roomName:participantName" or LiveKit JWT) from query parameter to extract roomName and participantName,
|
|
13
|
+
/// filters rezervation instances by roomName (webrtcIntegration) and participantName (advisor OR user),
|
|
14
|
+
/// and validates: items null = throw/deny, items > 1 = simple response, items == 1 = success.
|
|
15
|
+
/// </summary>
|
|
16
|
+
public class CheckLivekitRoomAccessMapping : ScriptBase, IMapping
|
|
17
|
+
{
|
|
18
|
+
public Task<ScriptResponse> InputHandler(WorkflowTask task, ScriptContext context)
|
|
19
|
+
{
|
|
20
|
+
var serviceTask = task as DaprServiceTask;
|
|
21
|
+
if (serviceTask == null)
|
|
22
|
+
throw new InvalidOperationException("Task must be a DaprServiceTask");
|
|
23
|
+
|
|
24
|
+
var appId = GetConfigValue("DAPR_APP_ID");
|
|
25
|
+
if (!string.IsNullOrEmpty(appId))
|
|
26
|
+
serviceTask.SetAppId(appId);
|
|
27
|
+
|
|
28
|
+
var accessToken = context.QueryParameters?["access_token"]?.ToString()?.Trim();
|
|
29
|
+
if (string.IsNullOrWhiteSpace(accessToken))
|
|
30
|
+
{
|
|
31
|
+
throw new InvalidOperationException("access_token query parameter is required");
|
|
32
|
+
}
|
|
33
|
+
|
|
34
|
+
string roomName;
|
|
35
|
+
string participantName;
|
|
36
|
+
try
|
|
37
|
+
{
|
|
38
|
+
var decoded = DecodeLiveKitJwtPayload(accessToken ?? "");
|
|
39
|
+
roomName = decoded.Item1 ?? "";
|
|
40
|
+
participantName = decoded.Item2 ?? "";
|
|
41
|
+
}
|
|
42
|
+
catch (Exception ex)
|
|
43
|
+
{
|
|
44
|
+
throw new InvalidOperationException("Invalid or malformed access_token: " + ex.Message);
|
|
45
|
+
// return Task.FromResult(new ScriptResponse
|
|
46
|
+
// {
|
|
47
|
+
// Key = "validation-error",
|
|
48
|
+
// Data = new
|
|
49
|
+
// {
|
|
50
|
+
// error = "Invalid or malformed access_token: " + ex.Message,
|
|
51
|
+
// errorCode = "INVALID_TOKEN"
|
|
52
|
+
// },
|
|
53
|
+
// Tags = new[] { "livekit", "room-access", "error" }
|
|
54
|
+
// });
|
|
55
|
+
}
|
|
56
|
+
|
|
57
|
+
LogError($"roomName={roomName}, participantName={participantName}");
|
|
58
|
+
|
|
59
|
+
if (string.IsNullOrWhiteSpace(roomName) || string.IsNullOrWhiteSpace(participantName))
|
|
60
|
+
{
|
|
61
|
+
throw new InvalidOperationException("access_token must contain roomName and participantName");
|
|
62
|
+
// return Task.FromResult(new ScriptResponse
|
|
63
|
+
// {
|
|
64
|
+
// Key = "validation-error",
|
|
65
|
+
// Data = new
|
|
66
|
+
// {
|
|
67
|
+
// error = "access_token must contain roomName and participantName",
|
|
68
|
+
// errorCode = "VALIDATION_ERROR"
|
|
69
|
+
// },
|
|
70
|
+
// Tags = new[] { "livekit", "room-access", "error" }
|
|
71
|
+
// });
|
|
72
|
+
}
|
|
73
|
+
|
|
74
|
+
var roomNameEscaped = EscapeJsonString(roomName);
|
|
75
|
+
var participantNameEscaped = EscapeJsonString(participantName);
|
|
76
|
+
|
|
77
|
+
var conditions = new List<string>
|
|
78
|
+
{
|
|
79
|
+
"{\"or\":[" +
|
|
80
|
+
"{\"currentState\":{\"eq\":\"active\"}}," +
|
|
81
|
+
"{\"currentState\":{\"eq\":\"in-meet\"}}" +
|
|
82
|
+
"]}",
|
|
83
|
+
|
|
84
|
+
"{\"key\":{\"eq\":\"" + roomNameEscaped + "\"}}",
|
|
85
|
+
"{\"or\":[" +
|
|
86
|
+
"{\"attributes\":{\"advisor\":{\"eq\":\"" + participantNameEscaped + "\"}}}," +
|
|
87
|
+
"{\"attributes\":{\"user\":{\"eq\":\"" + participantNameEscaped + "\"}}}," +
|
|
88
|
+
"{\"attributes\":{\"invitedUser\":{\"contains\":\"" + participantNameEscaped + "\"}}}" +
|
|
89
|
+
"]}"
|
|
90
|
+
};
|
|
91
|
+
|
|
92
|
+
var filterJson = "{\"and\":[" + string.Join(",", conditions) + "]}";
|
|
93
|
+
var queryParams = new List<string> { "pageSize=100", "filter=" + filterJson };
|
|
94
|
+
serviceTask.SetQueryString(string.Join("&", queryParams));
|
|
95
|
+
|
|
96
|
+
return Task.FromResult(new ScriptResponse());
|
|
97
|
+
}
|
|
98
|
+
|
|
99
|
+
public Task<ScriptResponse> OutputHandler(ScriptContext context)
|
|
100
|
+
{
|
|
101
|
+
|
|
102
|
+
var response = context.Body;
|
|
103
|
+
|
|
104
|
+
if (response?.isSuccess == false)
|
|
105
|
+
{
|
|
106
|
+
throw new InvalidOperationException("Failed to fetch rezervation instances");
|
|
107
|
+
}
|
|
108
|
+
|
|
109
|
+
var responseData = response?.data;
|
|
110
|
+
var items = responseData?.items;
|
|
111
|
+
|
|
112
|
+
if (items == null)
|
|
113
|
+
{
|
|
114
|
+
throw new InvalidOperationException("User is not registered in this room");
|
|
115
|
+
}
|
|
116
|
+
|
|
117
|
+
var count = CountItems(items);
|
|
118
|
+
if (count > 1)
|
|
119
|
+
{
|
|
120
|
+
return Task.FromResult(new ScriptResponse
|
|
121
|
+
{
|
|
122
|
+
Key = "multiple-matches",
|
|
123
|
+
Data = new
|
|
124
|
+
{
|
|
125
|
+
test=items,
|
|
126
|
+
error = "Birden fazla eşleşen rezervasyon bulundu",
|
|
127
|
+
errorCode = "MULTIPLE_MATCHES"
|
|
128
|
+
},
|
|
129
|
+
Tags = new[] { "livekit", "room-access", "error" }
|
|
130
|
+
});
|
|
131
|
+
}
|
|
132
|
+
|
|
133
|
+
if (count == 1)
|
|
134
|
+
{
|
|
135
|
+
var singleItem = GetFirstItem(items);
|
|
136
|
+
return Task.FromResult(new ScriptResponse
|
|
137
|
+
{
|
|
138
|
+
Key = "room-access-allowed",
|
|
139
|
+
Data = new { allowed = true, item = singleItem },
|
|
140
|
+
Tags = new[] { "livekit", "room-access", "success" }
|
|
141
|
+
});
|
|
142
|
+
}
|
|
143
|
+
throw new InvalidOperationException("room-access-denied");
|
|
144
|
+
}
|
|
145
|
+
|
|
146
|
+
private string GetHeader(ScriptContext context, string name)
|
|
147
|
+
{
|
|
148
|
+
if (context?.Headers == null) return null;
|
|
149
|
+
try
|
|
150
|
+
{
|
|
151
|
+
var key = name.ToLowerInvariant();
|
|
152
|
+
if (HasProperty(context.Headers, key))
|
|
153
|
+
{
|
|
154
|
+
var v = GetPropertyValue(context.Headers, key);
|
|
155
|
+
return v?.ToString()?.Trim();
|
|
156
|
+
}
|
|
157
|
+
}
|
|
158
|
+
catch { }
|
|
159
|
+
return null;
|
|
160
|
+
}
|
|
161
|
+
|
|
162
|
+
private (string roomName, string participantName) DecodeLiveKitJwtPayload(string accessToken)
|
|
163
|
+
{
|
|
164
|
+
if (string.IsNullOrWhiteSpace(accessToken))
|
|
165
|
+
throw new ArgumentException("access_token is required");
|
|
166
|
+
|
|
167
|
+
// JWT format: exactly 3 dot-separated parts (header.payload.signature)
|
|
168
|
+
var dotParts = accessToken.Split('.');
|
|
169
|
+
if (dotParts.Length == 3)
|
|
170
|
+
{
|
|
171
|
+
try
|
|
172
|
+
{
|
|
173
|
+
var payloadBase64 = dotParts[1];
|
|
174
|
+
var base64 = payloadBase64.Replace('-', '+').Replace('_', '/');
|
|
175
|
+
switch (base64.Length % 4)
|
|
176
|
+
{
|
|
177
|
+
case 2: base64 += "=="; break;
|
|
178
|
+
case 3: base64 += "="; break;
|
|
179
|
+
}
|
|
180
|
+
var bytes = Convert.FromBase64String(base64);
|
|
181
|
+
var json = System.Text.Encoding.UTF8.GetString(bytes);
|
|
182
|
+
json = json.TrimStart('\uFEFF'); // Strip UTF-8 BOM if present
|
|
183
|
+
using var doc = JsonDocument.Parse(json);
|
|
184
|
+
var root = doc.RootElement;
|
|
185
|
+
string rn = null;
|
|
186
|
+
string pn = null;
|
|
187
|
+
if (root.TryGetProperty("video", out var video) && video.TryGetProperty("room", out var room))
|
|
188
|
+
rn = room.GetString();
|
|
189
|
+
if (root.TryGetProperty("sub", out var sub))
|
|
190
|
+
pn = sub.GetString();
|
|
191
|
+
if (!string.IsNullOrEmpty(rn) || !string.IsNullOrEmpty(pn))
|
|
192
|
+
return (rn ?? "", pn ?? "");
|
|
193
|
+
}
|
|
194
|
+
catch { /* Fall through to plain format if JWT decode fails */ }
|
|
195
|
+
}
|
|
196
|
+
|
|
197
|
+
// Plain format: "generate:roomName:participantName" or "roomName:participantName"
|
|
198
|
+
var colonParts = accessToken.Split(':');
|
|
199
|
+
if (colonParts.Length >= 2)
|
|
200
|
+
{
|
|
201
|
+
var roomName = colonParts.Length >= 3 ? colonParts[1].Trim() : colonParts[0].Trim();
|
|
202
|
+
var participantName = colonParts.Length >= 3 ? colonParts[2].Trim() : colonParts[1].Trim();
|
|
203
|
+
if (!string.IsNullOrEmpty(roomName) && !string.IsNullOrEmpty(participantName))
|
|
204
|
+
return (roomName, participantName);
|
|
205
|
+
}
|
|
206
|
+
|
|
207
|
+
throw new ArgumentException("Invalid access_token format: expected 'prefix:roomName:participantName' or JWT");
|
|
208
|
+
}
|
|
209
|
+
|
|
210
|
+
private string EscapeJsonString(string s)
|
|
211
|
+
{
|
|
212
|
+
if (string.IsNullOrEmpty(s)) return s;
|
|
213
|
+
return s.Replace("\\", "\\\\").Replace("\"", "\\\"").Replace("\n", "\\n").Replace("\r", "\\r").Replace("\t", "\\t");
|
|
214
|
+
}
|
|
215
|
+
|
|
216
|
+
private int CountItems(dynamic items)
|
|
217
|
+
{
|
|
218
|
+
if (items == null) return 0;
|
|
219
|
+
if (items is System.Collections.IEnumerable enumerable and not string)
|
|
220
|
+
{
|
|
221
|
+
var c = 0;
|
|
222
|
+
foreach (var _ in enumerable) c++;
|
|
223
|
+
return c;
|
|
224
|
+
}
|
|
225
|
+
return 0;
|
|
226
|
+
}
|
|
227
|
+
|
|
228
|
+
private object GetFirstItem(dynamic items)
|
|
229
|
+
{
|
|
230
|
+
if (items == null) return null;
|
|
231
|
+
if (items is System.Collections.IEnumerable enumerable and not string)
|
|
232
|
+
{
|
|
233
|
+
foreach (var item in enumerable)
|
|
234
|
+
return item;
|
|
235
|
+
}
|
|
236
|
+
return null;
|
|
237
|
+
}
|
|
238
|
+
}
|