@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.
Files changed (244) hide show
  1. package/LICENSE +21 -0
  2. package/burgan-tech-morph-touch-runtime-0.0.2.tgz +0 -0
  3. package/package.json +21 -0
  4. package/touch/Extensions/.gitkeep +0 -0
  5. package/touch/Functions/.gitkeep +0 -0
  6. package/touch/Functions/check-livekit-room-access.1.0.0.json +28 -0
  7. package/touch/Functions/check-livekit-room-access.http +44 -0
  8. package/touch/Functions/get-absence-entry.1.0.0.json +28 -0
  9. package/touch/Functions/get-advisor-stats.1.0.0.json +27 -0
  10. package/touch/Functions/get-available-slots.1.0.0.json +30 -0
  11. package/touch/Functions/get-available-slots.http +29 -0
  12. package/touch/Functions/get-chat-rooms.1.0.0.json +28 -0
  13. package/touch/Functions/get-chat-rooms.http +62 -0
  14. package/touch/Functions/get-customer-info.1.0.0.json +27 -0
  15. package/touch/Functions/get-matrix-sync.1.0.0.json +28 -0
  16. package/touch/Functions/get-rezervations.1.0.0.json +26 -0
  17. package/touch/Functions/get-rezervations.http +59 -0
  18. package/touch/Functions/get-room-messages.1.0.0.json +29 -0
  19. package/touch/Functions/get-room-messages.http +45 -0
  20. package/touch/Functions/rezervation-transfer.http +118 -0
  21. package/touch/Functions/send-room-message.1.0.0.json +29 -0
  22. package/touch/Functions/src/CheckLivekitRoomAccessMapping.csx +238 -0
  23. package/touch/Functions/src/GetAbsenceEntryMapping.csx +225 -0
  24. package/touch/Functions/src/GetAdvisorStatsMapping.csx +190 -0
  25. package/touch/Functions/src/GetAvailableSlotsMapping.csx +468 -0
  26. package/touch/Functions/src/GetChatRoomsMapping.csx +202 -0
  27. package/touch/Functions/src/GetCustomerInfoMapping.csx +140 -0
  28. package/touch/Functions/src/GetMatrixSyncMapping.csx +197 -0
  29. package/touch/Functions/src/GetRezervationsMapping.csx +162 -0
  30. package/touch/Functions/src/GetRoomMessagesMapping.csx +165 -0
  31. package/touch/Functions/src/SendCancelNotificationMapping.csx +63 -0
  32. package/touch/Functions/src/SendRoomMessageMapping.csx +131 -0
  33. package/touch/Schemas/.gitkeep +0 -0
  34. package/touch/Schemas/absence-entry.1.0.0.json +232 -0
  35. package/touch/Schemas/advisor-chat-rooms.1.0.0.json +62 -0
  36. package/touch/Schemas/chat-room.1.0.0.json +110 -0
  37. package/touch/Schemas/notification-sender.1.0.0.json +159 -0
  38. package/touch/Schemas/portfolio-manager.1.0.0.json +63 -0
  39. package/touch/Schemas/rezervation.1.0.0.json +102 -0
  40. package/touch/Tasks/.gitkeep +0 -0
  41. package/touch/Tasks/cancel-absence-entry-for-rezervation.1.0.0.json +21 -0
  42. package/touch/Tasks/check-already-completed-chat-room.1.0.0.json +24 -0
  43. package/touch/Tasks/check-duplicate-portfolio-manager.1.0.0.json +23 -0
  44. package/touch/Tasks/check-duplicate-rezervation.1.0.0.json +23 -0
  45. package/touch/Tasks/check-existing-permanent-chat-room.1.0.0.json +21 -0
  46. package/touch/Tasks/check-randevu-time.1.0.0.json +17 -0
  47. package/touch/Tasks/create-permanent-chat-room.1.0.0.json +28 -0
  48. package/touch/Tasks/determine-transfer-type.1.0.0.json +16 -0
  49. package/touch/Tasks/enrich-rezervations-for-transfer.1.0.0.json +23 -0
  50. package/touch/Tasks/execute-permanent-chatroom-update.1.0.0.json +21 -0
  51. package/touch/Tasks/execute-rez-chatroom-transfer.1.0.0.json +21 -0
  52. package/touch/Tasks/execute-rezervation-transfer.1.0.0.json +19 -0
  53. package/touch/Tasks/fetch-absence-entries-for-transfer.1.0.0.json +23 -0
  54. package/touch/Tasks/fetch-advisors-for-transfer.1.0.0.json +23 -0
  55. package/touch/Tasks/fetch-permanent-chatrooms-for-transfer.1.0.0.json +23 -0
  56. package/touch/Tasks/fetch-rez-chatrooms-for-transfer.1.0.0.json +23 -0
  57. package/touch/Tasks/fetch-rezervations-for-transfer.1.0.0.json +22 -0
  58. package/touch/Tasks/get-absence-entry-task.1.0.0.json +23 -0
  59. package/touch/Tasks/get-available-slots-http.1.0.0.json +27 -0
  60. package/touch/Tasks/get-available-slots.1.0.0.json +24 -0
  61. package/touch/Tasks/get-chat-room-data-for-rezervation.1.0.0.json +23 -0
  62. package/touch/Tasks/get-chat-token.1.0.0.json +27 -0
  63. package/touch/Tasks/get-matrix-room-messages.1.0.0.json +25 -0
  64. package/touch/Tasks/get-matrix-sync.1.0.0.json +25 -0
  65. package/touch/Tasks/get-rezervation-data-task.1.0.0.json +22 -0
  66. package/touch/Tasks/get-rezervation-state-task.1.0.0.json +22 -0
  67. package/touch/Tasks/get-rezervations-task.1.0.0.json +21 -0
  68. package/touch/Tasks/get-user-info-for-rezervation.1.0.0.json +24 -0
  69. package/touch/Tasks/get-video-call-url.1.0.0.json +17 -0
  70. package/touch/Tasks/invite-user-to-rezervation-room.1.0.0.json +27 -0
  71. package/touch/Tasks/join-chat-room-for-rezervation.1.0.0.json +28 -0
  72. package/touch/Tasks/join-matrix-room.1.0.0.json +27 -0
  73. package/touch/Tasks/join-user-to-room.1.0.0.json +27 -0
  74. package/touch/Tasks/merge-invited-user.1.0.0.json +17 -0
  75. package/touch/Tasks/merge-rezervation-update.1.0.0.json +16 -0
  76. package/touch/Tasks/merge-target-advisor-for-transfer.1.0.0.json +17 -0
  77. package/touch/Tasks/merge-update-body-for-randevu-update.1.0.0.json +16 -0
  78. package/touch/Tasks/merge-video-call-urls.1.0.0.json +17 -0
  79. package/touch/Tasks/query-chat-room-instances.1.0.0.json +23 -0
  80. package/touch/Tasks/remove-member-from-room.1.0.0.json +28 -0
  81. package/touch/Tasks/send-matrix-room-message.1.0.0.json +26 -0
  82. package/touch/Tasks/send-push-notification.1.0.0.json +26 -0
  83. package/touch/Tasks/send-sms-notification.1.0.0.json +26 -0
  84. package/touch/Tasks/set-chat-room-status-active.1.0.0.json +16 -0
  85. package/touch/Tasks/set-chat-room-status-deactive.1.0.0.json +16 -0
  86. package/touch/Tasks/set-previous-advisor.1.0.0.json +16 -0
  87. package/touch/Tasks/set-user-from-headers-for-rezervation.1.0.0.json +17 -0
  88. package/touch/Tasks/start-absence-entry-for-rezervation.1.0.0.json +21 -0
  89. package/touch/Tasks/start-chat-room-for-rezervation.1.0.0.json +20 -0
  90. package/touch/Tasks/start-notification-sender.1.0.0.json +20 -0
  91. package/touch/Tasks/start-permanent-chat-room.1.0.0.json +21 -0
  92. package/touch/Tasks/start-transfer-from-absence-entry.1.0.0.json +19 -0
  93. package/touch/Tasks/start-video-call.1.0.0.json +22 -0
  94. package/touch/Tasks/trigger-chat-room-deactivate.1.0.0.json +21 -0
  95. package/touch/Tasks/trigger-chat-room-transfer.1.0.0.json +21 -0
  96. package/touch/Tasks/trigger-chat-room-update.1.0.0.json +20 -0
  97. package/touch/Tasks/trigger-rezervation-add-invited-participant.1.0.0.json +20 -0
  98. package/touch/Tasks/trigger-rezervation-apply-update.1.0.0.json +20 -0
  99. package/touch/Tasks/trigger-rezervation-to-in-meet.1.0.0.json +20 -0
  100. package/touch/Tasks/trigger-rezervation-video-call-update.1.0.0.json +21 -0
  101. package/touch/Tasks/validate-date-for-rezervation.1.0.0.json +18 -0
  102. package/touch/Tasks/validate-slot-for-rezervation.1.0.0.json +24 -0
  103. package/touch/Tasks/validate-transfer-availability.1.0.0.json +23 -0
  104. package/touch/Views/.gitkeep +0 -0
  105. package/touch/Workflows/.gitkeep +0 -0
  106. package/touch/Workflows/absence-entry.http +458 -0
  107. package/touch/Workflows/absence-entry.json +179 -0
  108. package/touch/Workflows/add-participant-to-rezervation.http +47 -0
  109. package/touch/Workflows/add-participant-to-rezervation.json +340 -0
  110. package/touch/Workflows/chat-room.http +207 -0
  111. package/touch/Workflows/chat-room.json +452 -0
  112. package/touch/Workflows/investment-advisor.json +367 -0
  113. package/touch/Workflows/notification-sender.http +299 -0
  114. package/touch/Workflows/notification-sender.json +262 -0
  115. package/touch/Workflows/portfolio-manager.json +367 -0
  116. package/touch/Workflows/randevu-update.http +87 -0
  117. package/touch/Workflows/rezervation-start.json +467 -0
  118. package/touch/Workflows/rezervation-transfer.json +512 -0
  119. package/touch/Workflows/rezervation-update.http +87 -0
  120. package/touch/Workflows/rezervation-update.json +485 -0
  121. package/touch/Workflows/rezervation.http +214 -0
  122. package/touch/Workflows/rezervation.json +726 -0
  123. package/touch/Workflows/src/AllChatRoomsSuccessRule.csx +65 -0
  124. package/touch/Workflows/src/AlwaysTrueRule.csx +13 -0
  125. package/touch/Workflows/src/AnyChatRoomFailedRule.csx +64 -0
  126. package/touch/Workflows/src/AutoProcessRule.csx +38 -0
  127. package/touch/Workflows/src/BuildRezChatRoomPlanMapping.csx +160 -0
  128. package/touch/Workflows/src/CanStartRezervationTimerMapping.csx +48 -0
  129. package/touch/Workflows/src/CanStartTransferMapping.csx +14 -0
  130. package/touch/Workflows/src/CancelAbsenceEntryForRezervationMapping.csx +48 -0
  131. package/touch/Workflows/src/CancelAbsenceForRandevuUpdateMapping.csx +62 -0
  132. package/touch/Workflows/src/ChatRoomCreatedFailedRule.csx +54 -0
  133. package/touch/Workflows/src/ChatRoomCreatedSuccessRule.csx +54 -0
  134. package/touch/Workflows/src/ChatRoomRemoveMapping.csx +104 -0
  135. package/touch/Workflows/src/ChatRoomTransferInviteMapping.csx +109 -0
  136. package/touch/Workflows/src/ChatRoomTransferRemoveMapping.csx +71 -0
  137. package/touch/Workflows/src/ChatRoomUpdateMapping.csx +107 -0
  138. package/touch/Workflows/src/CheckAlreadyCompletedChatRoomMapping.csx +100 -0
  139. package/touch/Workflows/src/CheckDuplicatePortfolioManagerMapping.csx +119 -0
  140. package/touch/Workflows/src/CheckDuplicateRezervationMapping.csx +150 -0
  141. package/touch/Workflows/src/CheckExistingPermanentChatRoomMapping.csx +169 -0
  142. package/touch/Workflows/src/CheckRandevuTimeMapping.csx +67 -0
  143. package/touch/Workflows/src/CheckRezervationStateActiveOrInMeetRule.csx +14 -0
  144. package/touch/Workflows/src/CreateAbsenceEntryForRezervationMapping.csx +111 -0
  145. package/touch/Workflows/src/CreateAbsenceForRandevuUpdateMapping.csx +108 -0
  146. package/touch/Workflows/src/CreateChatRoomForRezervationMapping.csx +122 -0
  147. package/touch/Workflows/src/CreatePermanentChatRoomMapping.csx +140 -0
  148. package/touch/Workflows/src/CustomerControlToEndRule.csx +14 -0
  149. package/touch/Workflows/src/DetermineTransferTypeMapping.csx +92 -0
  150. package/touch/Workflows/src/EnrichRezervationsForTransferMapping.csx +495 -0
  151. package/touch/Workflows/src/ExecutePermanentChatRoomUpdateMapping.csx +124 -0
  152. package/touch/Workflows/src/ExecuteRezChatRoomTransferMapping.csx +95 -0
  153. package/touch/Workflows/src/ExecuteTransferMapping.csx +152 -0
  154. package/touch/Workflows/src/FetchAbsenceEntriesForTransferMapping.csx +116 -0
  155. package/touch/Workflows/src/FetchAdvisorsForTransferMapping.csx +145 -0
  156. package/touch/Workflows/src/FetchPermanentChatRoomsMapping.csx +128 -0
  157. package/touch/Workflows/src/FetchRezervationsForTransferMapping.csx +124 -0
  158. package/touch/Workflows/src/GetChatRoomDataForRezervationMapping.csx +100 -0
  159. package/touch/Workflows/src/GetChatTokenMapping.csx +85 -0
  160. package/touch/Workflows/src/GetRezervationDataForAddParticipantMapping.csx +105 -0
  161. package/touch/Workflows/src/GetRezervationDataForRandevuUpdateMapping.csx +110 -0
  162. package/touch/Workflows/src/GetRezervationDataMapping.csx +111 -0
  163. package/touch/Workflows/src/GetRezervationStateForRandevuUpdateMapping.csx +80 -0
  164. package/touch/Workflows/src/GetRezervationStateMapping.csx +92 -0
  165. package/touch/Workflows/src/GetUserInfoForRezervationMapping.csx +63 -0
  166. package/touch/Workflows/src/GetVideoCallUrlMapping.csx +62 -0
  167. package/touch/Workflows/src/HasChangedAdvisorRule.csx +28 -0
  168. package/touch/Workflows/src/HasChatIntegrationRule.csx +41 -0
  169. package/touch/Workflows/src/HasExistingPermanentRoomRule.csx +28 -0
  170. package/touch/Workflows/src/InviteAdvisorForRandevuUpdateMapping.csx +86 -0
  171. package/touch/Workflows/src/InviteNewAdvisorToRezervationRoomMapping.csx +78 -0
  172. package/touch/Workflows/src/InviteNewParticipantToRandevuRoomMapping.csx +88 -0
  173. package/touch/Workflows/src/InvitedUserMergeMapping.csx +77 -0
  174. package/touch/Workflows/src/InvitedUserNotAllowedRule.csx +71 -0
  175. package/touch/Workflows/src/InvitedUserNotInMeetRule.csx +19 -0
  176. package/touch/Workflows/src/IsNotfSentRule.csx +36 -0
  177. package/touch/Workflows/src/JoinChatRoomForAddParticipantMapping.csx +118 -0
  178. package/touch/Workflows/src/JoinChatRoomForRandevuStartMapping.csx +119 -0
  179. package/touch/Workflows/src/JoinChatRoomForRezervationMapping.csx +118 -0
  180. package/touch/Workflows/src/JoinMatrixRoomMapping.csx +100 -0
  181. package/touch/Workflows/src/JoinUserToRoomMapping.csx +118 -0
  182. package/touch/Workflows/src/LoginForAddParticipantChatMapping.csx +102 -0
  183. package/touch/Workflows/src/LoginForRandevuStartChatMapping.csx +96 -0
  184. package/touch/Workflows/src/MergeRezervationUpdateMapping.csx +82 -0
  185. package/touch/Workflows/src/MergeTargetAdvisorForTransferMapping.csx +79 -0
  186. package/touch/Workflows/src/MergeUpdateBodyForRandevuUpdateMapping.csx +91 -0
  187. package/touch/Workflows/src/NoExistingPermanentRoomRule.csx +23 -0
  188. package/touch/Workflows/src/NotificationCompleteAlwaysRule.csx +14 -0
  189. package/touch/Workflows/src/NotificationCompleteFromPendingRule.csx +41 -0
  190. package/touch/Workflows/src/NotificationCompleteFromSmsRule.csx +36 -0
  191. package/touch/Workflows/src/NotificationPushFromPendingRule.csx +42 -0
  192. package/touch/Workflows/src/NotificationPushFromSmsRule.csx +36 -0
  193. package/touch/Workflows/src/NotificationSmsPendingRule.csx +32 -0
  194. package/touch/Workflows/src/PermanentDoneRule.csx +44 -0
  195. package/touch/Workflows/src/PermanentProcessNextRule.csx +44 -0
  196. package/touch/Workflows/src/RezChatRoomProcessNextRule.csx +44 -0
  197. package/touch/Workflows/src/RezChatRoomsDoneRule.csx +44 -0
  198. package/touch/Workflows/src/SendPushNotificationMapping.csx +146 -0
  199. package/touch/Workflows/src/SendSmsNotificationMapping.csx +138 -0
  200. package/touch/Workflows/src/SetChatRoomStatusActiveMapping.csx +22 -0
  201. package/touch/Workflows/src/SetChatRoomStatusDeactiveMapping.csx +22 -0
  202. package/touch/Workflows/src/SetPreviousAdvisorMapping.csx +28 -0
  203. package/touch/Workflows/src/SetUserFromHeadersForRezervationMapping.csx +24 -0
  204. package/touch/Workflows/src/SlotAvailableRule.csx +33 -0
  205. package/touch/Workflows/src/SlotUnavailableRule.csx +33 -0
  206. package/touch/Workflows/src/StartChatRoomForRezervationMapping.csx +100 -0
  207. package/touch/Workflows/src/StartGetChatTokenForRezervationMapping.csx +71 -0
  208. package/touch/Workflows/src/StartNotificationForAdvisorMapping.csx +117 -0
  209. package/touch/Workflows/src/StartNotificationForRezervationFromUserInfoMapping.csx +128 -0
  210. package/touch/Workflows/src/StartNotificationForUserMapping.csx +117 -0
  211. package/touch/Workflows/src/StartPermanentChatRoomMapping.csx +92 -0
  212. package/touch/Workflows/src/StartTransferFromAbsenceEntryMapping.csx +94 -0
  213. package/touch/Workflows/src/StartVideoCallCustomerSubFlowMapping.csx +37 -0
  214. package/touch/Workflows/src/StartVideoCallForInvitedParticipantMapping.csx +54 -0
  215. package/touch/Workflows/src/StartVideoCallForRandevuStartMapping.csx +70 -0
  216. package/touch/Workflows/src/StartVideoCallStaffSubFlowMapping.csx +37 -0
  217. package/touch/Workflows/src/StateActiveForUpdateRule.csx +14 -0
  218. package/touch/Workflows/src/StateActiveRule.csx +14 -0
  219. package/touch/Workflows/src/StateInMeetRule.csx +14 -0
  220. package/touch/Workflows/src/StateNotActiveForUpdateRule.csx +14 -0
  221. package/touch/Workflows/src/StateNotActiveOrInMeetRule.csx +14 -0
  222. package/touch/Workflows/src/StatusCustomerEnterRule.csx +25 -0
  223. package/touch/Workflows/src/StatusStaffEnterRule.csx +25 -0
  224. package/touch/Workflows/src/SyncWorkingHoursRule.csx +46 -0
  225. package/touch/Workflows/src/TokenSuccessRule.csx +24 -0
  226. package/touch/Workflows/src/TransferAllDoneRule.csx +50 -0
  227. package/touch/Workflows/src/TransferHasInvalidRule.csx +34 -0
  228. package/touch/Workflows/src/TransferProcessNextRule.csx +50 -0
  229. package/touch/Workflows/src/TriggerChatRoomDeactivateMapping.csx +77 -0
  230. package/touch/Workflows/src/TriggerChatRoomTransferMapping.csx +93 -0
  231. package/touch/Workflows/src/TriggerChatRoomUpdateMapping.csx +99 -0
  232. package/touch/Workflows/src/TriggerRezervationAddInvitedParticipantMapping.csx +77 -0
  233. package/touch/Workflows/src/TriggerRezervationApplyUpdateMapping.csx +66 -0
  234. package/touch/Workflows/src/TriggerRezervationToInMeetMapping.csx +69 -0
  235. package/touch/Workflows/src/TriggerRezervationVideoCallUpdateMapping.csx +67 -0
  236. package/touch/Workflows/src/ValidateDateForRezervationMapping.csx +60 -0
  237. package/touch/Workflows/src/ValidateSlotForRandevuUpdateMapping.csx +211 -0
  238. package/touch/Workflows/src/ValidateSlotForRezervationMapping.csx +246 -0
  239. package/touch/Workflows/src/ValidateTransferMapping.csx +243 -0
  240. package/touch/Workflows/src/VideoCallUrlUpdateMergeMapping.csx +141 -0
  241. package/touch/Workflows/start-chat.json +217 -0
  242. package/touch/Workflows/start-video-call.http +93 -0
  243. package/touch/Workflows/start-video-call.json +206 -0
  244. 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
+ }