@oneuptime/common 12.0.6 → 12.0.7

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 (424) hide show
  1. package/Models/DatabaseModels/AIInsight.ts +1 -1
  2. package/Models/DatabaseModels/DatabaseBaseModel/FileModel.ts +2 -3
  3. package/Models/DatabaseModels/DeletedProject.ts +595 -0
  4. package/Models/DatabaseModels/Index.ts +2 -0
  5. package/Models/DatabaseModels/Monitor.ts +111 -0
  6. package/Models/DatabaseModels/Project.ts +3 -3
  7. package/Models/DatabaseModels/WorkspaceProjectAuthToken.ts +19 -1
  8. package/Server/API/FileAPI.ts +15 -2
  9. package/Server/API/MicrosoftTeamsAPI.ts +6 -1
  10. package/Server/API/ProjectAPI.ts +214 -0
  11. package/Server/API/StatusPageAPI.ts +39 -6
  12. package/Server/Infrastructure/Postgres/SchemaMigrations/1786446545142-MigrationName.ts +50 -0
  13. package/Server/Infrastructure/Postgres/SchemaMigrations/1786449497966-AddMonitorDependency.ts +67 -0
  14. package/Server/Infrastructure/Postgres/SchemaMigrations/1786461136170-AddDeletedProjectTable.ts +39 -0
  15. package/Server/Infrastructure/Postgres/SchemaMigrations/Index.ts +6 -0
  16. package/Server/Services/AIAgentService.ts +20 -0
  17. package/Server/Services/DashboardDomainService.ts +73 -28
  18. package/Server/Services/DatabaseService.ts +1 -0
  19. package/Server/Services/DeletedProjectService.ts +138 -0
  20. package/Server/Services/FileService.ts +61 -0
  21. package/Server/Services/IncidentEpisodePublicNoteService.ts +18 -0
  22. package/Server/Services/IncidentPublicNoteService.ts +18 -0
  23. package/Server/Services/Index.ts +2 -0
  24. package/Server/Services/MonitorService.ts +311 -0
  25. package/Server/Services/ProbeService.ts +20 -0
  26. package/Server/Services/ProjectService.ts +297 -1
  27. package/Server/Services/PushNotificationService.ts +71 -0
  28. package/Server/Services/ScheduledMaintenancePublicNoteService.ts +18 -0
  29. package/Server/Services/StatusPageAnnouncementService.ts +53 -0
  30. package/Server/Services/StatusPageDomainService.ts +73 -28
  31. package/Server/Services/TeamMemberService.ts +117 -12
  32. package/Server/Services/TelemetryIngestionKeyService.ts +1 -0
  33. package/Server/Services/UserWebhookService.ts +34 -109
  34. package/Server/Services/WorkspaceNotificationRuleService.ts +69 -0
  35. package/Server/Services/WorkspaceProjectAuthTokenService.ts +37 -1
  36. package/Server/Types/Database/DeleteById.ts +2 -0
  37. package/Server/Types/Database/DeleteOneBy.ts +6 -0
  38. package/Server/Types/Domain.ts +41 -0
  39. package/Server/Types/Workflow/Components/API/Delete.ts +2 -1
  40. package/Server/Types/Workflow/Components/API/Get.ts +2 -1
  41. package/Server/Types/Workflow/Components/API/Patch.ts +2 -1
  42. package/Server/Types/Workflow/Components/API/Post.ts +2 -1
  43. package/Server/Types/Workflow/Components/API/Put.ts +2 -1
  44. package/Server/Types/Workflow/Components/API/Utils.ts +41 -2
  45. package/Server/Types/Workflow/Components/BaseModel/CreateManyBaseModel.ts +25 -19
  46. package/Server/Types/Workflow/Components/BaseModel/CreateOneBaseModel.ts +6 -5
  47. package/Server/Types/Workflow/Components/BaseModel/DeleteManyBaseModel.ts +32 -14
  48. package/Server/Types/Workflow/Components/BaseModel/DeleteOneBaseModel.ts +31 -13
  49. package/Server/Types/Workflow/Components/BaseModel/FindManyBaseModel.ts +29 -20
  50. package/Server/Types/Workflow/Components/BaseModel/FindOneBaseModel.ts +28 -21
  51. package/Server/Types/Workflow/Components/BaseModel/LogComponentError.ts +89 -0
  52. package/Server/Types/Workflow/Components/BaseModel/ModelArguments.ts +208 -0
  53. package/Server/Types/Workflow/Components/BaseModel/OnTriggerBaseModel.ts +11 -0
  54. package/Server/Types/Workflow/Components/BaseModel/UpdateManyBaseModel.ts +41 -18
  55. package/Server/Types/Workflow/Components/BaseModel/UpdateOneBaseModel.ts +45 -19
  56. package/Server/Types/Workflow/Components/Discord/SendMessageToChannel.ts +16 -9
  57. package/Server/Types/Workflow/Components/IncomingWebhookUtils.ts +66 -0
  58. package/Server/Types/Workflow/Components/MicrosoftTeams/SendMessageToChannel.ts +15 -9
  59. package/Server/Types/Workflow/Components/Slack/SendMessageToChannel.ts +17 -0
  60. package/Server/Utils/AI/Chat/ObservabilityChatPrompt.ts +1 -1
  61. package/Server/Utils/AI/CodeFix/CodeAgentWorkspaceGuard.ts +171 -0
  62. package/Server/Utils/AI/SRE/FixFromIncidentTaskTrigger.ts +3 -3
  63. package/Server/Utils/AI/SRE/Insights/FixRouting.ts +3 -2
  64. package/Server/Utils/AI/SRE/TelemetryImprovementTaskTrigger.ts +1 -1
  65. package/Server/Utils/AI/Toolbox/CodeWriteTools.ts +6 -6
  66. package/Server/Utils/CodeRepository/GitHub/GitHub.ts +43 -5
  67. package/Server/Utils/DataSource/EgressGuard.ts +176 -16
  68. package/Server/Utils/DataSource/HttpFetch.ts +6 -45
  69. package/Server/Utils/Execute.ts +8 -0
  70. package/Server/Utils/InlineImageAccessTokenSync.ts +23 -0
  71. package/Server/Utils/LLM/LLMService.ts +57 -12
  72. package/Server/Utils/Monitor/MonitorAlert.ts +40 -0
  73. package/Server/Utils/Monitor/MonitorDependencySuppression.ts +192 -0
  74. package/Server/Utils/Monitor/MonitorIncident.ts +40 -0
  75. package/Server/Utils/Monitor/MonitorResource.ts +36 -0
  76. package/Server/Utils/Response.ts +142 -6
  77. package/Server/Utils/SSRFProtection.ts +273 -60
  78. package/Server/Utils/StartServer.ts +8 -0
  79. package/Server/Utils/VM/VMRunner.ts +88 -1
  80. package/Server/Utils/Workspace/MicrosoftTeams/MicrosoftTeams.ts +555 -49
  81. package/Server/Utils/Workspace/Slack/Slack.ts +25 -2
  82. package/Server/Utils/Workspace/WorkspaceBase.ts +6 -0
  83. package/Tests/App/Dashboard/DangerZone.test.tsx +334 -0
  84. package/Tests/App/Dashboard/DashboardVariableAllContract.test.tsx +539 -0
  85. package/Tests/App/Dashboard/DashboardVariableSelector.test.tsx +678 -0
  86. package/Tests/App/Dashboard/DashboardVariablesDiscard.test.tsx +706 -0
  87. package/Tests/App/Dashboard/DashboardVariablesModal.test.tsx +508 -0
  88. package/Tests/App/PublicDashboard/DashboardVariableSelector.test.tsx +470 -0
  89. package/Tests/App/StatusPage/StatusPageDetailPagesNotFound.test.tsx +308 -0
  90. package/Tests/Models/DatabaseModels/DeletedProjectModel.test.ts +251 -0
  91. package/Tests/Models/DatabaseModels/SavedViewJSONColumnTuples.test.ts +115 -0
  92. package/Tests/Server/API/FileAPIAccessControl.test.ts +316 -0
  93. package/Tests/Server/API/ProjectAPI.test.ts +299 -1
  94. package/Tests/Server/API/ProjectAPIAdjustBalance.test.ts +459 -0
  95. package/Tests/Server/API/ProjectAPIAdjustBalanceBillingDisabled.test.ts +177 -0
  96. package/Tests/Server/Services/DatabaseServiceDeletionReason.test.ts +123 -0
  97. package/Tests/Server/Services/DeletedProjectService.test.ts +415 -0
  98. package/Tests/Server/Services/DeletedProjectServiceSelfHosted.test.ts +70 -0
  99. package/Tests/Server/Services/DomainSubdomainHooks.test.ts +94 -0
  100. package/Tests/Server/Services/FileIsPublicBooleanMigration.test.ts +244 -0
  101. package/Tests/Server/Services/FileServiceMimeType.test.ts +89 -0
  102. package/Tests/Server/Services/MonitorServiceDependencyValidation.test.ts +702 -0
  103. package/Tests/Server/Services/ProjectServiceAdjustBalance.test.ts +615 -0
  104. package/Tests/Server/Services/ProjectServiceDeleteAudit.test.ts +406 -0
  105. package/Tests/Server/Services/PublishTimeImageVisibility.test.ts +450 -0
  106. package/Tests/Server/Services/TeamMemberAutoAcceptInvitation.test.ts +669 -0
  107. package/Tests/Server/Services/UserWebhookSSRF.test.ts +174 -0
  108. package/Tests/Server/Services/WebPushEndpointAllowlist.test.ts +133 -0
  109. package/Tests/Server/Services/WorkspaceProjectAuthTokenRepoint.test.ts +618 -0
  110. package/Tests/Server/Types/Workflow/Components/ApiComponentErrorPort.test.ts +26 -1
  111. package/Tests/Server/Types/Workflow/Components/ApiComponentSsrf.test.ts +215 -0
  112. package/Tests/Server/Types/Workflow/Components/BaseModelDatabaseComponents.test.ts +742 -0
  113. package/Tests/Server/Types/Workflow/Components/ChatWebhookComponents.test.ts +256 -0
  114. package/Tests/Server/Types/Workflow/Components/ModelArguments.test.ts +371 -0
  115. package/Tests/Server/Utils/AI/CodeAgentCommandGuard.test.ts +204 -0
  116. package/Tests/Server/Utils/AI/CodeAgentWriteLimits.test.ts +213 -0
  117. package/Tests/Server/Utils/AI/CodeWriteTools.test.ts +52 -5
  118. package/Tests/Server/Utils/AI/LLMServiceBaseUrl.test.ts +3 -0
  119. package/Tests/Server/Utils/AI/LLMServiceEgressGuard.test.ts +315 -0
  120. package/Tests/Server/Utils/AI/LLMServiceModelCompatibility.test.ts +3 -0
  121. package/Tests/Server/Utils/AI/LLMServiceRequestPolicy.test.ts +17 -5
  122. package/Tests/Server/Utils/AI/LLMServiceToolCalling.test.ts +14 -1
  123. package/Tests/Server/Utils/AI/ObservabilityChatPrompt.test.ts +35 -0
  124. package/Tests/Server/Utils/AI/StubLLMEgressGuard.ts +25 -0
  125. package/Tests/Server/Utils/Dashboard/PublicDashboardResourceListPolicy.test.ts +62 -7
  126. package/Tests/Server/Utils/DataSource/EgressGuard.test.ts +69 -0
  127. package/Tests/Server/Utils/DataSource/EgressGuardPinning.test.ts +330 -0
  128. package/Tests/Server/Utils/GitHubCreatePullRequestWithToken.test.ts +393 -0
  129. package/Tests/Server/Utils/InlineImageAccessTokenSync.test.ts +202 -0
  130. package/Tests/Server/Utils/Monitor/MonitorDependencySuppression.test.ts +811 -0
  131. package/Tests/Server/Utils/Monitor/MonitorDependencySuppressionCreatorSkip.test.ts +604 -0
  132. package/Tests/Server/Utils/ResponseSendFileResponse.test.ts +192 -0
  133. package/Tests/Server/Utils/SSRFProtectionBypasses.test.ts +406 -0
  134. package/Tests/Server/Utils/VM/VMRunnerSsrf.test.ts +194 -0
  135. package/Tests/Server/Utils/Workspace/MicrosoftTeamsChannelSend.test.ts +1169 -0
  136. package/Tests/Server/Utils/Workspace/MicrosoftTeamsChannelsList.test.ts +2 -0
  137. package/Tests/Server/Utils/Workspace/MicrosoftTeamsTeamInstalls.test.ts +1605 -0
  138. package/Tests/Server/Utils/Workspace/MicrosoftTeamsTenantResolution.test.ts +1218 -0
  139. package/Tests/Types/AI/AIChatMessageStatus.test.ts +79 -0
  140. package/Tests/Types/AI/AIInsightStatus.test.ts +40 -0
  141. package/Tests/Types/API/HostnameAuthorityParsing.test.ts +157 -0
  142. package/Tests/Types/Dashboard/DashboardTemplateInvariants.test.ts +27 -0
  143. package/Tests/Types/DataSource/DataSourceLimits.test.ts +71 -0
  144. package/Tests/Types/DataSource/DataSourceType.test.ts +181 -0
  145. package/Tests/Types/DomainSubdomainValidation.test.ts +90 -0
  146. package/Tests/Types/JSONFunctions.test.ts +252 -1
  147. package/Tests/Types/Monitor/SnmpMonitor/SnmpAuthProtocol.test.ts +61 -0
  148. package/Tests/Types/Monitor/SnmpMonitor/SnmpPrivProtocol.test.ts +62 -0
  149. package/Tests/Types/Monitor/SnmpMonitor/SnmpSecurityLevel.test.ts +68 -0
  150. package/Tests/Types/Monitor/SnmpMonitor/SnmpVersion.test.ts +51 -0
  151. package/Tests/UI/Components/404.test.tsx +1 -1
  152. package/Tests/UI/Components/Alert.test.tsx +1 -1
  153. package/Tests/UI/Components/Badge.test.tsx +1 -1
  154. package/Tests/UI/Components/BasicForm.test.tsx +39 -10
  155. package/Tests/UI/Components/Button.test.tsx +1 -1
  156. package/Tests/UI/Components/Card.test.tsx +1 -1
  157. package/Tests/UI/Components/Charts/AxisTickColor.test.tsx +1 -1
  158. package/Tests/UI/Components/ColorViewer.test.tsx +1 -1
  159. package/Tests/UI/Components/ComponentsModal.test.tsx +7 -1
  160. package/Tests/UI/Components/DictionaryOfStrings.test.tsx +1 -1
  161. package/Tests/UI/Components/Dropdown.test.tsx +1 -1
  162. package/Tests/UI/Components/FilePicker.test.tsx +1 -1
  163. package/Tests/UI/Components/HiddenText.test.tsx +1 -1
  164. package/Tests/UI/Components/Input.test.tsx +1 -1
  165. package/Tests/UI/Components/Loader.test.tsx +1 -1
  166. package/Tests/UI/Components/LogTimeRangePicker.test.tsx +1 -1
  167. package/Tests/UI/Components/MasterPage.test.tsx +1 -1
  168. package/Tests/UI/Components/ModalPortalDismissal.test.tsx +489 -0
  169. package/Tests/UI/Components/ModelDelete.test.tsx +214 -0
  170. package/Tests/UI/Components/ModelTable/BaseModelTableBulkSelectAll.test.tsx +1 -1
  171. package/Tests/UI/Components/ModelTable/BaseModelTableColumnCustomization.test.tsx +1 -1
  172. package/Tests/UI/Components/ModelTable/BaseModelTableSearchLabels.test.tsx +1 -1
  173. package/Tests/UI/Components/ModelTable/BaseModelTableUrlState.test.tsx +1 -1
  174. package/Tests/UI/Components/ModelTable/CustomFieldColumns.test.tsx +1 -1
  175. package/Tests/UI/Components/NavBar.test.tsx +1 -1
  176. package/Tests/UI/Components/OperatorSelectorKeyboard.test.tsx +1 -1
  177. package/Tests/UI/Components/Pagination.test.tsx +1 -1
  178. package/Tests/UI/Components/Pill.test.tsx +1 -1
  179. package/Tests/UI/Components/Probe.test.tsx +1 -1
  180. package/Tests/UI/Components/ProgressBar.test.tsx +1 -1
  181. package/Tests/UI/Components/RadioButtons.test.tsx +1 -1
  182. package/Tests/UI/Components/SideMenuItem.test.tsx +1 -1
  183. package/Tests/UI/Components/SideOver.test.tsx +500 -6
  184. package/Tests/UI/Components/Tabs.test.tsx +1 -1
  185. package/Tests/UI/Components/TelemetrySearchBar.test.tsx +1 -1
  186. package/Tests/UI/Components/TelemetryTimeRangePicker.test.tsx +1 -1
  187. package/Tests/UI/Components/TextArea.test.tsx +1 -1
  188. package/Tests/UI/Components/Toast.test.tsx +1 -1
  189. package/Tests/UI/Components/Toggle.test.tsx +1 -1
  190. package/Tests/UI/Components/TopSection.test.tsx +1 -1
  191. package/Tests/UI/Components/UseLiveLogsRefresh.test.tsx +1 -1
  192. package/Tests/UI/Rum/ReplayScrubber.test.tsx +1 -1
  193. package/Tests/UI/Rum/ReplayStage.test.tsx +1 -1
  194. package/Tests/UI/Telemetry/TelemetrySnapshotWindowAlert.test.tsx +1 -1
  195. package/Tests/UI/Utils/LocalStorageArrayRoundTrip.test.ts +72 -0
  196. package/Tests/Utils/Dashboard/HtmlWidgetDocument.test.ts +19 -2
  197. package/Tests/Utils/Dashboard/ModelQueryVariableInterpolation.test.ts +44 -0
  198. package/Tests/Utils/Dashboard/VariableInterpolation.test.ts +288 -5
  199. package/Tests/Utils/Dashboard/VariableUrlState.test.ts +42 -0
  200. package/Tests/Utils/DataSource/DataSourceQueryText.test.ts +27 -0
  201. package/Tests/Utils/LegacySerializedArray.test.ts +139 -0
  202. package/Tests/Utils/Monitor/MonitorDependencyRule.test.ts +190 -0
  203. package/Tests/Utils/Realtime.test.ts +78 -0
  204. package/Tests/Utils/Telemetry/SavedViewFilters.test.ts +246 -0
  205. package/Tests/__mocks__/i18next-browser-languagedetector.js +21 -0
  206. package/Types/AI/FixPullRequestCiStatus.ts +1 -1
  207. package/Types/AI/FixVerificationStatus.ts +2 -2
  208. package/Types/API/Hostname.ts +92 -4
  209. package/Types/API/URL.ts +43 -25
  210. package/Types/Billing/BalanceAdjustmentType.ts +14 -0
  211. package/Types/Billing/ProjectBalanceType.ts +13 -0
  212. package/Types/Domain.ts +26 -0
  213. package/Types/File/MimeType.ts +11 -0
  214. package/Types/JSONFunctions.ts +15 -0
  215. package/Types/Telemetry/TelemetrySavedViewState.ts +9 -1
  216. package/Types/Workflow/Components/BaseModel.ts +92 -28
  217. package/Typings/Index.d.ts +12 -0
  218. package/UI/Components/GanttChart/ChartContainer.tsx +4 -3
  219. package/UI/Components/Modal/ConfirmModal.tsx +10 -5
  220. package/UI/Components/Modal/Modal.tsx +27 -47
  221. package/UI/Components/ModelDelete/ModelDelete.tsx +23 -6
  222. package/UI/Components/SideOver/SideOver.tsx +195 -68
  223. package/UI/Utils/PageScrollLock.ts +66 -0
  224. package/Utils/Dashboard/HtmlWidgetDocument.ts +4 -2
  225. package/Utils/Dashboard/VariableInterpolation.ts +19 -1
  226. package/Utils/LegacySerializedArray.ts +60 -0
  227. package/Utils/Monitor/MonitorDependencyRule.ts +88 -0
  228. package/Utils/Telemetry/SavedViewFilters.ts +88 -0
  229. package/build/dist/Models/DatabaseModels/AIInsight.js +1 -1
  230. package/build/dist/Models/DatabaseModels/AIInsight.js.map +1 -1
  231. package/build/dist/Models/DatabaseModels/DatabaseBaseModel/FileModel.js +2 -3
  232. package/build/dist/Models/DatabaseModels/DatabaseBaseModel/FileModel.js.map +1 -1
  233. package/build/dist/Models/DatabaseModels/DeletedProject.js +640 -0
  234. package/build/dist/Models/DatabaseModels/DeletedProject.js.map +1 -0
  235. package/build/dist/Models/DatabaseModels/Index.js +2 -0
  236. package/build/dist/Models/DatabaseModels/Index.js.map +1 -1
  237. package/build/dist/Models/DatabaseModels/Monitor.js +106 -0
  238. package/build/dist/Models/DatabaseModels/Monitor.js.map +1 -1
  239. package/build/dist/Models/DatabaseModels/Project.js +3 -3
  240. package/build/dist/Models/DatabaseModels/Project.js.map +1 -1
  241. package/build/dist/Models/DatabaseModels/WorkspaceProjectAuthToken.js.map +1 -1
  242. package/build/dist/Server/API/FileAPI.js +14 -2
  243. package/build/dist/Server/API/FileAPI.js.map +1 -1
  244. package/build/dist/Server/API/MicrosoftTeamsAPI.js +6 -1
  245. package/build/dist/Server/API/MicrosoftTeamsAPI.js.map +1 -1
  246. package/build/dist/Server/API/ProjectAPI.js +157 -4
  247. package/build/dist/Server/API/ProjectAPI.js.map +1 -1
  248. package/build/dist/Server/API/StatusPageAPI.js +27 -3
  249. package/build/dist/Server/API/StatusPageAPI.js.map +1 -1
  250. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1786446545142-MigrationName.js +34 -0
  251. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1786446545142-MigrationName.js.map +1 -0
  252. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1786449497966-AddMonitorDependency.js +30 -0
  253. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1786449497966-AddMonitorDependency.js.map +1 -0
  254. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1786461136170-AddDeletedProjectTable.js +20 -0
  255. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1786461136170-AddDeletedProjectTable.js.map +1 -0
  256. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/Index.js +6 -0
  257. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/Index.js.map +1 -1
  258. package/build/dist/Server/Services/AIAgentService.js +17 -0
  259. package/build/dist/Server/Services/AIAgentService.js.map +1 -1
  260. package/build/dist/Server/Services/DashboardDomainService.js +55 -18
  261. package/build/dist/Server/Services/DashboardDomainService.js.map +1 -1
  262. package/build/dist/Server/Services/DatabaseService.js +1 -0
  263. package/build/dist/Server/Services/DatabaseService.js.map +1 -1
  264. package/build/dist/Server/Services/DeletedProjectService.js +124 -0
  265. package/build/dist/Server/Services/DeletedProjectService.js.map +1 -0
  266. package/build/dist/Server/Services/FileService.js +52 -0
  267. package/build/dist/Server/Services/FileService.js.map +1 -1
  268. package/build/dist/Server/Services/IncidentEpisodePublicNoteService.js +10 -1
  269. package/build/dist/Server/Services/IncidentEpisodePublicNoteService.js.map +1 -1
  270. package/build/dist/Server/Services/IncidentPublicNoteService.js +10 -1
  271. package/build/dist/Server/Services/IncidentPublicNoteService.js.map +1 -1
  272. package/build/dist/Server/Services/Index.js +2 -0
  273. package/build/dist/Server/Services/Index.js.map +1 -1
  274. package/build/dist/Server/Services/MonitorService.js +232 -0
  275. package/build/dist/Server/Services/MonitorService.js.map +1 -1
  276. package/build/dist/Server/Services/ProbeService.js +17 -0
  277. package/build/dist/Server/Services/ProbeService.js.map +1 -1
  278. package/build/dist/Server/Services/ProjectService.js +228 -6
  279. package/build/dist/Server/Services/ProjectService.js.map +1 -1
  280. package/build/dist/Server/Services/PushNotificationService.js +56 -0
  281. package/build/dist/Server/Services/PushNotificationService.js.map +1 -1
  282. package/build/dist/Server/Services/ScheduledMaintenancePublicNoteService.js +10 -1
  283. package/build/dist/Server/Services/ScheduledMaintenancePublicNoteService.js.map +1 -1
  284. package/build/dist/Server/Services/StatusPageAnnouncementService.js +54 -0
  285. package/build/dist/Server/Services/StatusPageAnnouncementService.js.map +1 -1
  286. package/build/dist/Server/Services/StatusPageDomainService.js +55 -18
  287. package/build/dist/Server/Services/StatusPageDomainService.js.map +1 -1
  288. package/build/dist/Server/Services/TeamMemberService.js +97 -6
  289. package/build/dist/Server/Services/TeamMemberService.js.map +1 -1
  290. package/build/dist/Server/Services/TelemetryIngestionKeyService.js +1 -0
  291. package/build/dist/Server/Services/TelemetryIngestionKeyService.js.map +1 -1
  292. package/build/dist/Server/Services/UserWebhookService.js +31 -87
  293. package/build/dist/Server/Services/UserWebhookService.js.map +1 -1
  294. package/build/dist/Server/Services/WorkspaceNotificationRuleService.js +65 -0
  295. package/build/dist/Server/Services/WorkspaceNotificationRuleService.js.map +1 -1
  296. package/build/dist/Server/Services/WorkspaceProjectAuthTokenService.js +23 -0
  297. package/build/dist/Server/Services/WorkspaceProjectAuthTokenService.js.map +1 -1
  298. package/build/dist/Server/Types/Domain.js +37 -0
  299. package/build/dist/Server/Types/Domain.js.map +1 -1
  300. package/build/dist/Server/Types/Workflow/Components/API/Delete.js +2 -1
  301. package/build/dist/Server/Types/Workflow/Components/API/Delete.js.map +1 -1
  302. package/build/dist/Server/Types/Workflow/Components/API/Get.js +2 -1
  303. package/build/dist/Server/Types/Workflow/Components/API/Get.js.map +1 -1
  304. package/build/dist/Server/Types/Workflow/Components/API/Patch.js +2 -1
  305. package/build/dist/Server/Types/Workflow/Components/API/Patch.js.map +1 -1
  306. package/build/dist/Server/Types/Workflow/Components/API/Post.js +2 -1
  307. package/build/dist/Server/Types/Workflow/Components/API/Post.js.map +1 -1
  308. package/build/dist/Server/Types/Workflow/Components/API/Put.js +2 -1
  309. package/build/dist/Server/Types/Workflow/Components/API/Put.js.map +1 -1
  310. package/build/dist/Server/Types/Workflow/Components/API/Utils.js +35 -2
  311. package/build/dist/Server/Types/Workflow/Components/API/Utils.js.map +1 -1
  312. package/build/dist/Server/Types/Workflow/Components/BaseModel/CreateManyBaseModel.js +15 -11
  313. package/build/dist/Server/Types/Workflow/Components/BaseModel/CreateManyBaseModel.js.map +1 -1
  314. package/build/dist/Server/Types/Workflow/Components/BaseModel/CreateOneBaseModel.js +2 -3
  315. package/build/dist/Server/Types/Workflow/Components/BaseModel/CreateOneBaseModel.js.map +1 -1
  316. package/build/dist/Server/Types/Workflow/Components/BaseModel/DeleteManyBaseModel.js +21 -10
  317. package/build/dist/Server/Types/Workflow/Components/BaseModel/DeleteManyBaseModel.js.map +1 -1
  318. package/build/dist/Server/Types/Workflow/Components/BaseModel/DeleteOneBaseModel.js +21 -10
  319. package/build/dist/Server/Types/Workflow/Components/BaseModel/DeleteOneBaseModel.js.map +1 -1
  320. package/build/dist/Server/Types/Workflow/Components/BaseModel/FindManyBaseModel.js +18 -13
  321. package/build/dist/Server/Types/Workflow/Components/BaseModel/FindManyBaseModel.js.map +1 -1
  322. package/build/dist/Server/Types/Workflow/Components/BaseModel/FindOneBaseModel.js +18 -13
  323. package/build/dist/Server/Types/Workflow/Components/BaseModel/FindOneBaseModel.js.map +1 -1
  324. package/build/dist/Server/Types/Workflow/Components/BaseModel/LogComponentError.js +43 -0
  325. package/build/dist/Server/Types/Workflow/Components/BaseModel/LogComponentError.js.map +1 -0
  326. package/build/dist/Server/Types/Workflow/Components/BaseModel/ModelArguments.js +116 -0
  327. package/build/dist/Server/Types/Workflow/Components/BaseModel/ModelArguments.js.map +1 -0
  328. package/build/dist/Server/Types/Workflow/Components/BaseModel/OnTriggerBaseModel.js +7 -0
  329. package/build/dist/Server/Types/Workflow/Components/BaseModel/OnTriggerBaseModel.js.map +1 -1
  330. package/build/dist/Server/Types/Workflow/Components/BaseModel/UpdateManyBaseModel.js +24 -13
  331. package/build/dist/Server/Types/Workflow/Components/BaseModel/UpdateManyBaseModel.js.map +1 -1
  332. package/build/dist/Server/Types/Workflow/Components/BaseModel/UpdateOneBaseModel.js +27 -13
  333. package/build/dist/Server/Types/Workflow/Components/BaseModel/UpdateOneBaseModel.js.map +1 -1
  334. package/build/dist/Server/Types/Workflow/Components/Discord/SendMessageToChannel.js +14 -6
  335. package/build/dist/Server/Types/Workflow/Components/Discord/SendMessageToChannel.js.map +1 -1
  336. package/build/dist/Server/Types/Workflow/Components/IncomingWebhookUtils.js +42 -0
  337. package/build/dist/Server/Types/Workflow/Components/IncomingWebhookUtils.js.map +1 -0
  338. package/build/dist/Server/Types/Workflow/Components/MicrosoftTeams/SendMessageToChannel.js +15 -6
  339. package/build/dist/Server/Types/Workflow/Components/MicrosoftTeams/SendMessageToChannel.js.map +1 -1
  340. package/build/dist/Server/Types/Workflow/Components/Slack/SendMessageToChannel.js +10 -2
  341. package/build/dist/Server/Types/Workflow/Components/Slack/SendMessageToChannel.js.map +1 -1
  342. package/build/dist/Server/Utils/AI/Chat/ObservabilityChatPrompt.js +1 -1
  343. package/build/dist/Server/Utils/AI/CodeFix/CodeAgentWorkspaceGuard.js +141 -0
  344. package/build/dist/Server/Utils/AI/CodeFix/CodeAgentWorkspaceGuard.js.map +1 -1
  345. package/build/dist/Server/Utils/AI/SRE/Insights/FixRouting.js.map +1 -1
  346. package/build/dist/Server/Utils/AI/SRE/TelemetryImprovementTaskTrigger.js +1 -1
  347. package/build/dist/Server/Utils/AI/Toolbox/CodeWriteTools.js +6 -6
  348. package/build/dist/Server/Utils/AI/Toolbox/CodeWriteTools.js.map +1 -1
  349. package/build/dist/Server/Utils/CodeRepository/GitHub/GitHub.js +39 -5
  350. package/build/dist/Server/Utils/CodeRepository/GitHub/GitHub.js.map +1 -1
  351. package/build/dist/Server/Utils/DataSource/EgressGuard.js +94 -10
  352. package/build/dist/Server/Utils/DataSource/EgressGuard.js.map +1 -1
  353. package/build/dist/Server/Utils/DataSource/HttpFetch.js +1 -19
  354. package/build/dist/Server/Utils/DataSource/HttpFetch.js.map +1 -1
  355. package/build/dist/Server/Utils/Execute.js +2 -2
  356. package/build/dist/Server/Utils/Execute.js.map +1 -1
  357. package/build/dist/Server/Utils/InlineImageAccessTokenSync.js +13 -0
  358. package/build/dist/Server/Utils/InlineImageAccessTokenSync.js.map +1 -1
  359. package/build/dist/Server/Utils/LLM/LLMService.js +43 -12
  360. package/build/dist/Server/Utils/LLM/LLMService.js.map +1 -1
  361. package/build/dist/Server/Utils/Monitor/MonitorAlert.js +44 -24
  362. package/build/dist/Server/Utils/Monitor/MonitorAlert.js.map +1 -1
  363. package/build/dist/Server/Utils/Monitor/MonitorDependencySuppression.js +158 -0
  364. package/build/dist/Server/Utils/Monitor/MonitorDependencySuppression.js.map +1 -0
  365. package/build/dist/Server/Utils/Monitor/MonitorIncident.js +50 -30
  366. package/build/dist/Server/Utils/Monitor/MonitorIncident.js.map +1 -1
  367. package/build/dist/Server/Utils/Monitor/MonitorResource.js +32 -0
  368. package/build/dist/Server/Utils/Monitor/MonitorResource.js.map +1 -1
  369. package/build/dist/Server/Utils/Response.js +112 -5
  370. package/build/dist/Server/Utils/Response.js.map +1 -1
  371. package/build/dist/Server/Utils/SSRFProtection.js +219 -53
  372. package/build/dist/Server/Utils/SSRFProtection.js.map +1 -1
  373. package/build/dist/Server/Utils/StartServer.js +7 -0
  374. package/build/dist/Server/Utils/StartServer.js.map +1 -1
  375. package/build/dist/Server/Utils/VM/VMRunner.js +73 -1
  376. package/build/dist/Server/Utils/VM/VMRunner.js.map +1 -1
  377. package/build/dist/Server/Utils/Workspace/MicrosoftTeams/MicrosoftTeams.js +445 -43
  378. package/build/dist/Server/Utils/Workspace/MicrosoftTeams/MicrosoftTeams.js.map +1 -1
  379. package/build/dist/Server/Utils/Workspace/Slack/Slack.js +18 -1
  380. package/build/dist/Server/Utils/Workspace/Slack/Slack.js.map +1 -1
  381. package/build/dist/Server/Utils/Workspace/WorkspaceBase.js.map +1 -1
  382. package/build/dist/Types/AI/FixPullRequestCiStatus.js +1 -1
  383. package/build/dist/Types/AI/FixVerificationStatus.js +2 -2
  384. package/build/dist/Types/API/Hostname.js +73 -4
  385. package/build/dist/Types/API/Hostname.js.map +1 -1
  386. package/build/dist/Types/API/URL.js +42 -24
  387. package/build/dist/Types/API/URL.js.map +1 -1
  388. package/build/dist/Types/Billing/BalanceAdjustmentType.js +15 -0
  389. package/build/dist/Types/Billing/BalanceAdjustmentType.js.map +1 -0
  390. package/build/dist/Types/Billing/ProjectBalanceType.js +14 -0
  391. package/build/dist/Types/Billing/ProjectBalanceType.js.map +1 -0
  392. package/build/dist/Types/Domain.js +22 -0
  393. package/build/dist/Types/Domain.js.map +1 -1
  394. package/build/dist/Types/File/MimeType.js +11 -0
  395. package/build/dist/Types/File/MimeType.js.map +1 -1
  396. package/build/dist/Types/JSONFunctions.js +14 -0
  397. package/build/dist/Types/JSONFunctions.js.map +1 -1
  398. package/build/dist/Types/Workflow/Components/BaseModel.js +83 -28
  399. package/build/dist/Types/Workflow/Components/BaseModel.js.map +1 -1
  400. package/build/dist/UI/Components/GanttChart/ChartContainer.js +4 -3
  401. package/build/dist/UI/Components/GanttChart/ChartContainer.js.map +1 -1
  402. package/build/dist/UI/Components/Modal/ConfirmModal.js +3 -1
  403. package/build/dist/UI/Components/Modal/ConfirmModal.js.map +1 -1
  404. package/build/dist/UI/Components/Modal/Modal.js +24 -34
  405. package/build/dist/UI/Components/Modal/Modal.js.map +1 -1
  406. package/build/dist/UI/Components/ModelDelete/ModelDelete.js +11 -6
  407. package/build/dist/UI/Components/ModelDelete/ModelDelete.js.map +1 -1
  408. package/build/dist/UI/Components/SideOver/SideOver.js +105 -30
  409. package/build/dist/UI/Components/SideOver/SideOver.js.map +1 -1
  410. package/build/dist/UI/Utils/PageScrollLock.js +52 -0
  411. package/build/dist/UI/Utils/PageScrollLock.js.map +1 -0
  412. package/build/dist/Utils/Dashboard/HtmlWidgetDocument.js +4 -2
  413. package/build/dist/Utils/Dashboard/HtmlWidgetDocument.js.map +1 -1
  414. package/build/dist/Utils/Dashboard/VariableInterpolation.js +19 -1
  415. package/build/dist/Utils/Dashboard/VariableInterpolation.js.map +1 -1
  416. package/build/dist/Utils/LegacySerializedArray.js +51 -0
  417. package/build/dist/Utils/LegacySerializedArray.js.map +1 -0
  418. package/build/dist/Utils/Monitor/MonitorDependencyRule.js +47 -0
  419. package/build/dist/Utils/Monitor/MonitorDependencyRule.js.map +1 -0
  420. package/build/dist/Utils/Telemetry/SavedViewFilters.js +52 -0
  421. package/build/dist/Utils/Telemetry/SavedViewFilters.js.map +1 -0
  422. package/jest.config.json +3 -0
  423. package/package.json +1 -1
  424. package/tsconfig.json +3 -1
@@ -4,8 +4,49 @@ import { PromiseRejectErrorFunction } from "../../Types/FunctionTypes";
4
4
  import dns from "dns";
5
5
  import CaptureSpan from "../Utils/Telemetry/CaptureSpan";
6
6
  import BadDataException from "../../Types/Exception/BadDataException";
7
+ import HTTPErrorResponse from "../../Types/API/HTTPErrorResponse";
8
+ import HTTPResponse from "../../Types/API/HTTPResponse";
9
+ import { JSONObject } from "../../Types/JSON";
10
+ import URL from "../../Types/API/URL";
11
+ import API from "../../Utils/API";
12
+ import DataSourceEgressGuard from "../Utils/DataSource/EgressGuard";
7
13
 
8
14
  export default class Domain extends DomainCommon {
15
+ /*
16
+ * GET a domain-verification URL built from a tenant-supplied domain.
17
+ *
18
+ * Both the status page and the dashboard build these URLs by interpolating
19
+ * a customer domain into a string, and the certificate cron re-fetches them
20
+ * unattended every 15 minutes — so the target has to be validated on every
21
+ * call, not just when the row was written. The address that was validated
22
+ * is pinned into the socket, and redirects are refused so a 3xx cannot
23
+ * bounce the request to a host that was never checked. (The callers try
24
+ * http first and https second, so the ordinary http→https redirect a
25
+ * customer proxy emits is still covered by the https attempt.)
26
+ *
27
+ * Private ranges stay reachable on self-hosted installs, where a status page
28
+ * domain legitimately resolves inside the corporate network.
29
+ */
30
+ @CaptureSpan()
31
+ public static async getForDomainVerification(data: {
32
+ url: string;
33
+ targetLabel: string;
34
+ }): Promise<HTTPErrorResponse | HTTPResponse<JSONObject>> {
35
+ const { httpAgent, httpsAgent } =
36
+ await DataSourceEgressGuard.assertUrlAllowedAndPin(data.url, {
37
+ targetLabel: data.targetLabel,
38
+ });
39
+
40
+ return API.get<JSONObject>({
41
+ url: URL.fromString(data.url),
42
+ options: {
43
+ doNotFollowRedirects: true,
44
+ httpAgent,
45
+ httpsAgent,
46
+ },
47
+ });
48
+ }
49
+
9
50
  @CaptureSpan()
10
51
  public static getCnameRecords(data: { domain: string }): Promise<string[]> {
11
52
  return new Promise(
@@ -37,7 +37,7 @@ export default class ApiDelete extends ComponentCode {
37
37
  options: RunOptions,
38
38
  ): Promise<RunReturnType> {
39
39
  const result: { args: JSONObject; successPort: Port; errorPort: Port } =
40
- ApiComponentUtils.sanitizeArgs(this.getMetadata(), args, options);
40
+ await ApiComponentUtils.sanitizeArgs(this.getMetadata(), args, options);
41
41
 
42
42
  let apiResult: HTTPResponse<JSONObject> | HTTPErrorResponse | null = null;
43
43
 
@@ -46,6 +46,7 @@ export default class ApiDelete extends ComponentCode {
46
46
  url: args["url"] as URL,
47
47
  data: args["request-body"] as JSONObject,
48
48
  headers: args["request-headers"] as Dictionary<string>,
49
+ options: ApiComponentUtils.requestOptions,
49
50
  });
50
51
 
51
52
  /*
@@ -37,7 +37,7 @@ export default class ApiGet extends ComponentCode {
37
37
  options: RunOptions,
38
38
  ): Promise<RunReturnType> {
39
39
  const result: { args: JSONObject; successPort: Port; errorPort: Port } =
40
- ApiComponentUtils.sanitizeArgs(this.getMetadata(), args, options);
40
+ await ApiComponentUtils.sanitizeArgs(this.getMetadata(), args, options);
41
41
 
42
42
  let apiResult: HTTPResponse<JSONObject> | HTTPErrorResponse | null = null;
43
43
 
@@ -46,6 +46,7 @@ export default class ApiGet extends ComponentCode {
46
46
  url: args["url"] as URL,
47
47
  data: args["request-body"] as JSONObject,
48
48
  headers: args["request-headers"] as Dictionary<string>,
49
+ options: ApiComponentUtils.requestOptions,
49
50
  });
50
51
 
51
52
  /*
@@ -37,7 +37,7 @@ export default class ApiPut extends ComponentCode {
37
37
  options: RunOptions,
38
38
  ): Promise<RunReturnType> {
39
39
  const result: { args: JSONObject; successPort: Port; errorPort: Port } =
40
- ApiComponentUtils.sanitizeArgs(this.getMetadata(), args, options);
40
+ await ApiComponentUtils.sanitizeArgs(this.getMetadata(), args, options);
41
41
 
42
42
  let apiResult: HTTPResponse<JSONObject> | HTTPErrorResponse | null = null;
43
43
 
@@ -46,6 +46,7 @@ export default class ApiPut extends ComponentCode {
46
46
  url: args["url"] as URL,
47
47
  data: args["request-body"] as JSONObject,
48
48
  headers: args["request-headers"] as Dictionary<string>,
49
+ options: ApiComponentUtils.requestOptions,
49
50
  });
50
51
 
51
52
  /*
@@ -38,7 +38,7 @@ export default class ApiPost extends ComponentCode {
38
38
  options: RunOptions,
39
39
  ): Promise<RunReturnType> {
40
40
  const result: { args: JSONObject; successPort: Port; errorPort: Port } =
41
- ApiComponentUtils.sanitizeArgs(this.getMetadata(), args, options);
41
+ await ApiComponentUtils.sanitizeArgs(this.getMetadata(), args, options);
42
42
 
43
43
  let apiResult: HTTPResponse<JSONObject> | HTTPErrorResponse | null = null;
44
44
 
@@ -77,6 +77,7 @@ export default class ApiPost extends ComponentCode {
77
77
  url: args["url"] as URL,
78
78
  data: args["request-body"] as JSONObject,
79
79
  headers: args["request-headers"] as Dictionary<string>,
80
+ options: ApiComponentUtils.requestOptions,
80
81
  });
81
82
 
82
83
  logger.debug("API Post Component is done.", workflowLogAttributes);
@@ -37,7 +37,7 @@ export default class ApiPut extends ComponentCode {
37
37
  options: RunOptions,
38
38
  ): Promise<RunReturnType> {
39
39
  const result: { args: JSONObject; successPort: Port; errorPort: Port } =
40
- ApiComponentUtils.sanitizeArgs(this.getMetadata(), args, options);
40
+ await ApiComponentUtils.sanitizeArgs(this.getMetadata(), args, options);
41
41
 
42
42
  let apiResult: HTTPResponse<JSONObject> | HTTPErrorResponse | null = null;
43
43
 
@@ -46,6 +46,7 @@ export default class ApiPut extends ComponentCode {
46
46
  url: args["url"] as URL,
47
47
  data: args["request-body"] as JSONObject,
48
48
  headers: args["request-headers"] as Dictionary<string>,
49
+ options: ApiComponentUtils.requestOptions,
49
50
  });
50
51
 
51
52
  /*
@@ -3,14 +3,27 @@ import HTTPErrorResponse from "../../../../../Types/API/HTTPErrorResponse";
3
3
  import HTTPResponse from "../../../../../Types/API/HTTPResponse";
4
4
  import URL from "../../../../../Types/API/URL";
5
5
  import BadDataException from "../../../../../Types/Exception/BadDataException";
6
+ import Exception from "../../../../../Types/Exception/Exception";
6
7
  import { JSONObject } from "../../../../../Types/JSON";
7
8
  import JSONFunctions from "../../../../../Types/JSONFunctions";
8
9
  import ComponentMetadata, {
9
10
  Port,
10
11
  } from "../../../../../Types/Workflow/Component";
12
+ import { RequestOptions } from "../../../../../Utils/API";
13
+ import SSRFProtection from "../../../../Utils/SSRFProtection";
11
14
  import CaptureSpan from "../../../../Utils/Telemetry/CaptureSpan";
12
15
 
13
16
  export class ApiComponentUtils {
17
+ /*
18
+ * Every API component sends its request with these. Redirects MUST stay off:
19
+ * sanitizeArgs validates the URL before the request is dispatched, and a
20
+ * validated public host that answers 302 -> http://169.254.169.254/ would
21
+ * otherwise walk the server straight past that check.
22
+ */
23
+ public static readonly requestOptions: RequestOptions = {
24
+ doNotFollowRedirects: true,
25
+ };
26
+
14
27
  @CaptureSpan()
15
28
  public static getReturnValues(
16
29
  response: HTTPResponse<JSONObject> | HTTPErrorResponse,
@@ -33,11 +46,11 @@ export class ApiComponentUtils {
33
46
  }
34
47
 
35
48
  @CaptureSpan()
36
- public static sanitizeArgs(
49
+ public static async sanitizeArgs(
37
50
  metadata: ComponentMetadata,
38
51
  args: JSONObject,
39
52
  options: RunOptions,
40
- ): { args: JSONObject; successPort: Port; errorPort: Port } {
53
+ ): Promise<{ args: JSONObject; successPort: Port; errorPort: Port }> {
41
54
  const successPort: Port | undefined = metadata.outPorts.find((p: Port) => {
42
55
  return p.id === "success";
43
56
  });
@@ -77,6 +90,32 @@ export class ApiComponentUtils {
77
90
  throw options.onError(new BadDataException("URL is not type of string"));
78
91
  }
79
92
 
93
+ /*
94
+ * The URL is authored by whoever built the workflow - i.e. any member of
95
+ * any project - and the request goes out from the server, which sits
96
+ * inside the cluster and next to the cloud metadata endpoint. Without this
97
+ * check the API components are an authenticated request proxy into the
98
+ * private network: GET http://169.254.169.254/latest/meta-data/iam/... and
99
+ * the credentials come back in the component's "response-body" return
100
+ * value, in plain sight in the workflow log. Resolve and blocklist the
101
+ * target the same way outbound webhooks already do.
102
+ *
103
+ * Validate the RAW string, before URL.fromString - that parser defaults an
104
+ * unrecognized scheme to https, so "file:///etc/passwd" would reach the
105
+ * check already rewritten as host "file".
106
+ */
107
+ try {
108
+ await SSRFProtection.validateWebhookTargetIsSafe(args["url"] as string);
109
+ } catch (err) {
110
+ throw options.onError(
111
+ new BadDataException(
112
+ err instanceof Exception
113
+ ? err.message
114
+ : "URL points to an address that is not allowed.",
115
+ ),
116
+ );
117
+ }
118
+
80
119
  args["url"] = URL.fromString(args["url"] as string);
81
120
 
82
121
  return { args, successPort, errorPort };
@@ -10,6 +10,7 @@ import ComponentMetadata, {
10
10
  } from "../../../../../Types/Workflow/Component";
11
11
  import BaseModelComponents from "../../../../../Types/Workflow/Components/BaseModel";
12
12
  import CaptureSpan from "../../../../Utils/Telemetry/CaptureSpan";
13
+ import { applyTenantColumn } from "./ModelArguments";
13
14
 
14
15
  export default class CreateManyBaseModel<
15
16
  TBaseModel extends BaseModel,
@@ -91,25 +92,30 @@ export default class CreateManyBaseModel<
91
92
 
92
93
  const array: Array<TBaseModel> = [];
93
94
 
94
- if (this.modelService.getModel().getTenantColumn()) {
95
- for (const item of args["json-array"]) {
96
- (item as JSONObject)[
97
- this.modelService.getModel().getTenantColumn() as string
98
- ] = options.projectId;
99
-
100
- array.push(
101
- (await this.modelService.create({
102
- data: BaseModel.fromJSON<TBaseModel>(
103
- (item as JSONObject) || {},
104
- this.modelService.modelType,
105
- ) as TBaseModel,
106
- props: {
107
- isRoot: true,
108
- tenantId: options.projectId,
109
- },
110
- })) as TBaseModel,
111
- );
112
- }
95
+ /*
96
+ * This loop used to sit inside an `if (getTenantColumn())` check that
97
+ * was only meant to guard the projectId stamping, so a model without a
98
+ * tenant column created nothing at all and still reported success.
99
+ */
100
+ for (const item of args["json-array"]) {
101
+ const json: JSONObject = applyTenantColumn(
102
+ (item as JSONObject) || {},
103
+ this.modelService.getModel(),
104
+ options.projectId,
105
+ );
106
+
107
+ array.push(
108
+ (await this.modelService.create({
109
+ data: BaseModel.fromJSON<TBaseModel>(
110
+ json,
111
+ this.modelService.modelType,
112
+ ) as TBaseModel,
113
+ props: {
114
+ isRoot: true,
115
+ tenantId: options.projectId,
116
+ },
117
+ })) as TBaseModel,
118
+ );
113
119
  }
114
120
 
115
121
  return {
@@ -12,6 +12,7 @@ import ComponentMetadata, {
12
12
  } from "../../../../../Types/Workflow/Component";
13
13
  import BaseModelComponents from "../../../../../Types/Workflow/Components/BaseModel";
14
14
  import CaptureSpan from "../../../../Utils/Telemetry/CaptureSpan";
15
+ import { applyTenantColumn } from "./ModelArguments";
15
16
 
16
17
  export default class CreateOneBaseModel<
17
18
  TBaseModel extends BaseModel,
@@ -90,11 +91,11 @@ export default class CreateOneBaseModel<
90
91
  );
91
92
  }
92
93
 
93
- if (this.modelService.getModel().getTenantColumn()) {
94
- (args["json"] as JSONObject)[
95
- this.modelService.getModel().getTenantColumn() as string
96
- ] = options.projectId;
97
- }
94
+ args["json"] = applyTenantColumn(
95
+ args["json"] as JSONObject,
96
+ this.modelService.getModel(),
97
+ options.projectId,
98
+ );
98
99
 
99
100
  const model: TBaseModel = (await this.modelService.create({
100
101
  data: BaseModel.fromJSON<TBaseModel>(
@@ -12,6 +12,8 @@ import ComponentMetadata, {
12
12
  Port,
13
13
  } from "../../../../../Types/Workflow/Component";
14
14
  import BaseModelComponents from "../../../../../Types/Workflow/Components/BaseModel";
15
+ import { normalizeModelKeys } from "./ModelArguments";
16
+ import logComponentError from "./LogComponentError";
15
17
 
16
18
  export default class DeleteManyBaseModel<
17
19
  TBaseModel extends BaseModel,
@@ -114,22 +116,26 @@ export default class DeleteManyBaseModel<
114
116
  args["limit"] = LIMIT_PER_PROJECT;
115
117
  }
116
118
 
119
+ const query: Query<TBaseModel> = JSONFunctions.deserialize(
120
+ normalizeModelKeys(
121
+ args["query"] as JSONObject,
122
+ this.modelService.getModel(),
123
+ ),
124
+ ) as Query<TBaseModel>;
125
+
126
+ /*
127
+ * The tenant column goes on the deserialized query, not on args["query"]
128
+ * - JSONFunctions.deserialize returns a new object, so anything written
129
+ * to args after it runs never reaches the database.
130
+ */
117
131
  if (this.modelService.getModel().getTenantColumn()) {
118
- (args["query"] as JSONObject)[
132
+ (query as JSONObject)[
119
133
  this.modelService.getModel().getTenantColumn() as string
120
134
  ] = options.projectId;
121
135
  }
122
136
 
123
- let query: Query<TBaseModel> = args["query"] as Query<TBaseModel>;
124
-
125
- if (query) {
126
- query = JSONFunctions.deserialize(
127
- args["query"] as JSONObject,
128
- ) as Query<TBaseModel>;
129
- }
130
-
131
- await this.modelService.deleteBy({
132
- query: query || {},
137
+ const itemsDeleted: number = await this.modelService.deleteBy({
138
+ query: query,
133
139
  limit: new PositiveNumber(args["limit"] as number),
134
140
  skip: new PositiveNumber(args["skip"] as number),
135
141
  props: {
@@ -138,13 +144,25 @@ export default class DeleteManyBaseModel<
138
144
  },
139
145
  });
140
146
 
147
+ options.log(
148
+ `Deleted ${itemsDeleted} ${
149
+ this.modelService.getModel().singularName || "record"
150
+ }(s).`,
151
+ );
152
+
141
153
  return {
142
- returnValues: {},
154
+ returnValues: {
155
+ "items-deleted": itemsDeleted,
156
+ },
143
157
  executePort: successPort,
144
158
  };
145
159
  } catch (err: any) {
146
- options.log("Error running component");
147
- options.log(err.message ? err.message : JSON.stringify(err, null, 2));
160
+ logComponentError({
161
+ error: err,
162
+ model: this.modelService?.getModel() || null,
163
+ log: options.log,
164
+ });
165
+
148
166
  return {
149
167
  returnValues: {},
150
168
  executePort: errorPort,
@@ -11,6 +11,8 @@ import ComponentMetadata, {
11
11
  } from "../../../../../Types/Workflow/Component";
12
12
  import BaseModelComponents from "../../../../../Types/Workflow/Components/BaseModel";
13
13
  import CaptureSpan from "../../../../Utils/Telemetry/CaptureSpan";
14
+ import { normalizeModelKeys } from "./ModelArguments";
15
+ import logComponentError from "./LogComponentError";
14
16
 
15
17
  export default class DeleteOneBaseModel<
16
18
  TBaseModel extends BaseModel,
@@ -89,35 +91,51 @@ export default class DeleteOneBaseModel<
89
91
  );
90
92
  }
91
93
 
92
- let query: Query<TBaseModel> = args["query"] as Query<TBaseModel>;
93
-
94
- if (query) {
95
- query = JSONFunctions.deserialize(
94
+ const query: Query<TBaseModel> = JSONFunctions.deserialize(
95
+ normalizeModelKeys(
96
96
  args["query"] as JSONObject,
97
- ) as Query<TBaseModel>;
98
- }
99
-
97
+ this.modelService.getModel(),
98
+ ),
99
+ ) as Query<TBaseModel>;
100
+
101
+ /*
102
+ * The tenant column goes on the deserialized query, not on args["query"]
103
+ * - JSONFunctions.deserialize returns a new object, so anything written
104
+ * to args after it runs never reaches the database.
105
+ */
100
106
  if (this.modelService.getModel().getTenantColumn()) {
101
- (args["query"] as JSONObject)[
107
+ (query as JSONObject)[
102
108
  this.modelService.getModel().getTenantColumn() as string
103
109
  ] = options.projectId;
104
110
  }
105
111
 
106
- await this.modelService.deleteOneBy({
107
- query: (query as Query<TBaseModel>) || {},
112
+ const itemsDeleted: number = await this.modelService.deleteOneBy({
113
+ query: query,
108
114
  props: {
109
115
  isRoot: true,
110
116
  tenantId: options.projectId,
111
117
  },
112
118
  });
113
119
 
120
+ options.log(
121
+ `Deleted ${itemsDeleted} ${
122
+ this.modelService.getModel().singularName || "record"
123
+ }(s).`,
124
+ );
125
+
114
126
  return {
115
- returnValues: {},
127
+ returnValues: {
128
+ "items-deleted": itemsDeleted,
129
+ },
116
130
  executePort: successPort,
117
131
  };
118
132
  } catch (err: any) {
119
- options.log("Error running component");
120
- options.log(err.message ? err.message : JSON.stringify(err, null, 2));
133
+ logComponentError({
134
+ error: err,
135
+ model: this.modelService?.getModel() || null,
136
+ log: options.log,
137
+ });
138
+
121
139
  return {
122
140
  returnValues: {},
123
141
  executePort: errorPort,
@@ -14,6 +14,8 @@ import ComponentMetadata, {
14
14
  } from "../../../../../Types/Workflow/Component";
15
15
  import BaseModelComponents from "../../../../../Types/Workflow/Components/BaseModel";
16
16
  import CaptureSpan from "../../../../Utils/Telemetry/CaptureSpan";
17
+ import { normalizeModelKeys } from "./ModelArguments";
18
+ import logComponentError from "./LogComponentError";
17
19
 
18
20
  export default class FindManyBaseModel<
19
21
  TBaseModel extends BaseModel,
@@ -92,12 +94,6 @@ export default class FindManyBaseModel<
92
94
  );
93
95
  }
94
96
 
95
- if (this.modelService.getModel().getTenantColumn()) {
96
- (args["query"] as JSONObject)[
97
- this.modelService.getModel().getTenantColumn() as string
98
- ] = options.projectId;
99
- }
100
-
101
97
  if (!args["select"]) {
102
98
  throw options.onError(
103
99
  new BadDataException("Select Fields is undefined."),
@@ -139,24 +135,33 @@ export default class FindManyBaseModel<
139
135
  args["limit"] = LIMIT_PER_PROJECT;
140
136
  }
141
137
 
142
- let query: Query<TBaseModel> = args["query"] as Query<TBaseModel>;
143
-
144
- if (query) {
145
- query = JSONFunctions.deserialize(
138
+ const query: Query<TBaseModel> = JSONFunctions.deserialize(
139
+ normalizeModelKeys(
146
140
  args["query"] as JSONObject,
147
- ) as Query<TBaseModel>;
141
+ this.modelService.getModel(),
142
+ ),
143
+ ) as Query<TBaseModel>;
144
+
145
+ /*
146
+ * The tenant column goes on the deserialized query, not on args["query"]
147
+ * - JSONFunctions.deserialize returns a new object, so anything written
148
+ * to args after it runs never reaches the database.
149
+ */
150
+ if (this.modelService.getModel().getTenantColumn()) {
151
+ (query as JSONObject)[
152
+ this.modelService.getModel().getTenantColumn() as string
153
+ ] = options.projectId;
148
154
  }
149
155
 
150
- let select: Select<TBaseModel> = args["select"] as Select<TBaseModel>;
151
-
152
- if (select) {
153
- select = JSONFunctions.deserialize(
156
+ const select: Select<TBaseModel> = JSONFunctions.deserialize(
157
+ normalizeModelKeys(
154
158
  args["select"] as JSONObject,
155
- ) as Select<TBaseModel>;
156
- }
159
+ this.modelService.getModel(),
160
+ ),
161
+ ) as Select<TBaseModel>;
157
162
 
158
163
  const models: Array<TBaseModel> = await this.modelService.findBy({
159
- query: query || {},
164
+ query: query,
160
165
  select: select,
161
166
  limit: new PositiveNumber(args["limit"] as number),
162
167
  skip: new PositiveNumber(args["skip"] as number),
@@ -173,8 +178,12 @@ export default class FindManyBaseModel<
173
178
  executePort: successPort,
174
179
  };
175
180
  } catch (err: any) {
176
- options.log("Error running component");
177
- options.log(err.message ? err.message : JSON.stringify(err, null, 2));
181
+ logComponentError({
182
+ error: err,
183
+ model: this.modelService?.getModel() || null,
184
+ log: options.log,
185
+ });
186
+
178
187
  return {
179
188
  returnValues: {},
180
189
  executePort: errorPort,
@@ -12,6 +12,8 @@ import ComponentMetadata, {
12
12
  } from "../../../../../Types/Workflow/Component";
13
13
  import BaseModelComponents from "../../../../../Types/Workflow/Components/BaseModel";
14
14
  import CaptureSpan from "../../../../Utils/Telemetry/CaptureSpan";
15
+ import { normalizeModelKeys } from "./ModelArguments";
16
+ import logComponentError from "./LogComponentError";
15
17
 
16
18
  export default class FindOneBaseModel<
17
19
  TBaseModel extends BaseModel,
@@ -90,12 +92,6 @@ export default class FindOneBaseModel<
90
92
  );
91
93
  }
92
94
 
93
- if (this.modelService.getModel().getTenantColumn()) {
94
- (args["query"] as JSONObject)[
95
- this.modelService.getModel().getTenantColumn() as string
96
- ] = options.projectId;
97
- }
98
-
99
95
  if (!args["select"]) {
100
96
  throw options.onError(
101
97
  new BadDataException("Select Fields is undefined."),
@@ -112,24 +108,33 @@ export default class FindOneBaseModel<
112
108
  );
113
109
  }
114
110
 
115
- let query: Query<TBaseModel> = args["query"] as Query<TBaseModel>;
116
-
117
- if (query) {
118
- query = JSONFunctions.deserialize(
111
+ const query: Query<TBaseModel> = JSONFunctions.deserialize(
112
+ normalizeModelKeys(
119
113
  args["query"] as JSONObject,
120
- ) as Query<TBaseModel>;
114
+ this.modelService.getModel(),
115
+ ),
116
+ ) as Query<TBaseModel>;
117
+
118
+ /*
119
+ * The tenant column goes on the deserialized query, not on args["query"]
120
+ * - JSONFunctions.deserialize returns a new object, so anything written
121
+ * to args after it runs never reaches the database.
122
+ */
123
+ if (this.modelService.getModel().getTenantColumn()) {
124
+ (query as JSONObject)[
125
+ this.modelService.getModel().getTenantColumn() as string
126
+ ] = options.projectId;
121
127
  }
122
128
 
123
- let select: Select<TBaseModel> = args["select"] as Select<TBaseModel>;
124
-
125
- if (select) {
126
- select = JSONFunctions.deserialize(
129
+ const select: Select<TBaseModel> = JSONFunctions.deserialize(
130
+ normalizeModelKeys(
127
131
  args["select"] as JSONObject,
128
- ) as Select<TBaseModel>;
129
- }
132
+ this.modelService.getModel(),
133
+ ),
134
+ ) as Select<TBaseModel>;
130
135
 
131
136
  const model: TBaseModel | null = await this.modelService.findOneBy({
132
- query: query || {},
137
+ query: query,
133
138
  select: select,
134
139
  props: {
135
140
  isRoot: true,
@@ -146,9 +151,11 @@ export default class FindOneBaseModel<
146
151
  executePort: successPort,
147
152
  };
148
153
  } catch (err: any) {
149
- options.log("Error running component");
150
-
151
- options.log(err.message ? err.message : JSON.stringify(err, null, 2));
154
+ logComponentError({
155
+ error: err,
156
+ model: this.modelService?.getModel() || null,
157
+ log: options.log,
158
+ });
152
159
 
153
160
  return {
154
161
  returnValues: {},