Compare commits

...

1155 Commits

Author SHA1 Message Date
Simon Larsen
9fbaf1eb84 refactor: clean up code formatting and improve readability in notification rule service and user settings 2025-03-24 18:29:32 +00:00
Simon Larsen
dc6e5f7357 fix: update notification rule event type retrieval logic and add error handling 2025-03-24 18:23:13 +00:00
Simon Larsen
506c036be2 fix: trim rule name in notification message and update Slack app permissions 2025-03-24 18:17:27 +00:00
Simon Larsen
f08dbb98d8 fix: provide additional context for private channel error message in notification rule service 2025-03-24 17:44:06 +00:00
Simon Larsen
dd425edc43 refactor: remove unused alert notifications section from user settings 2025-03-24 17:31:13 +00:00
Simon Larsen
d2e1ae1c42 fix: disable code editor suggestions and adjust settings for improved user experience 2025-03-24 17:29:04 +00:00
Simon Larsen
496696e9e6 fix: correct default log limit to 250 in telemetry logs viewer 2025-03-24 16:45:00 +00:00
Simon Larsen
d590f7ff2a refactor: update table names and sort/primary keys in analytics models 2025-03-24 14:41:24 +00:00
Simon Larsen
4938127942 fix: add projectId to notification rule data handling 2025-03-24 14:41:10 +00:00
Simon Larsen
9997e604ff fix: reduce default log limit from 250 to 50 in telemetry logs viewer 2025-03-24 13:36:43 +00:00
Simon Larsen
971a877ae5 fix: correct syntax errors in Microsoft Teams API integration 2025-03-24 13:31:36 +00:00
Simon Larsen
8b0339eb95 implement microsoft teams implementation. 2025-03-24 13:27:56 +00:00
Simon Larsen
e7c2882b8f fix: improve Slack API response logging format for better readability 2025-03-24 12:57:57 +00:00
Simon Larsen
3daa68737a fix: reduce Slack API request limit from 1000 to 999 2025-03-24 12:55:07 +00:00
Simon Larsen
80d137483c Merge pull request #1858 from tjmcewan/patch-1
Add where to find monitor logs
2025-03-22 19:54:48 +00:00
Simon Larsen
04e8d22476 feat: implement pagination for Slack API channel retrieval 2025-03-22 19:54:21 +00:00
Tim McEwan
f849374f65 Add where to find monitor logs 2025-03-22 19:16:21 +11:00
Simon Larsen
9b1af449f3 refactor: clean up whitespace in SideMenu component for better readability 2025-03-21 21:14:56 +00:00
Simon Larsen
39510ad604 feat: add unresolved exceptions count to side menu with alert badge 2025-03-21 21:13:52 +00:00
Simon Larsen
e8cd243502 refactor: enhance error logging format in RefreshProjectUsers migration 2025-03-21 21:05:42 +00:00
Simon Larsen
5c0f364932 feat: add error handling and logging for project user refresh in data migration 2025-03-21 21:02:00 +00:00
Simon Larsen
2f9370513d refactor: improve markdown formatting in monitor update notifications 2025-03-21 20:35:14 +00:00
Simon Larsen
f8e3c06e61 feat: add incomingMonitorRequest field to CheckHeartbeat for enhanced monitoring 2025-03-21 20:33:08 +00:00
Simon Larsen
bf9843dc3d refactor: update debug log messages in FetchMonitorTest for clarity 2025-03-21 19:52:52 +00:00
Simon Larsen
55bee569d8 refactor: clean up whitespace and formatting in FetchMonitorTest and Index files 2025-03-21 19:48:59 +00:00
Simon Larsen
46f2adb459 feat: add new cron schedule for FetchMonitorTest to run every ten seconds 2025-03-21 19:47:58 +00:00
Simon Larsen
8637a6a5c7 refactor: replace generic error with BadDataException in SlackUtil and WorkspaceNotificationRuleService 2025-03-21 19:21:02 +00:00
Simon Larsen
dd2e291b87 feat: enhance error handling in SlackUtil by returning false for channel not found 2025-03-21 19:09:47 +00:00
Simon Larsen
0ac9289bb8 refactor: simplify error message in BadDataException for channel existence check 2025-03-21 19:08:48 +00:00
Simon Larsen
738c7a6022 feat: display error message in ConfirmModal for test rule functionality 2025-03-21 18:55:02 +00:00
Simon Larsen
0005a531d1 refactor: improve code formatting and consistency in SlackUtil and WorkspaceNotificationRulesTable components 2025-03-21 18:51:45 +00:00
Simon Larsen
c1880b4135 feat: add doesChannelExist method to SlackUtil and improve error handling in API responses 2025-03-21 18:33:17 +00:00
Simon Larsen
b89270c896 feat: rename action button to 'Test Rule' and reset state on modal submission 2025-03-21 18:04:48 +00:00
Simon Larsen
ea8423884a refactor: improve code formatting and structure in WorkspaceNotificationRuleService and WorkspaceNotificationRulesTable components 2025-03-21 14:38:21 +00:00
Simon Larsen
b99e7406cf feat: add test rule functionality to WorkspaceNotificationRulesTable component 2025-03-21 14:34:32 +00:00
Simon Larsen
2f379de4d5 feat: implement testRule method in WorkspaceNotificationRuleService and add WorkspaceNotificationRuleAPI 2025-03-21 14:22:24 +00:00
Simon Larsen
9f3964bb12 fix: correct formatting and spacing in WorkspaceNotificationRuleService and DashboardSideMenu 2025-03-21 13:14:15 +00:00
Simon Larsen
29539fc75b feat: add notificationFor field to WorkspaceNotificationRuleService 2025-03-21 13:03:31 +00:00
Simon Larsen
d64a062bd2 fix: correct nesting of SideMenuSection components in DashboardSideMenu 2025-03-21 12:55:54 +00:00
Simon Larsen
02d9df07cf feat: add project visibility check and improve secret name description 2025-03-21 12:28:48 +00:00
Simon Larsen
05d8ad6ebe feat: add description for secret name field in MonitorSecrets 2025-03-21 11:59:13 +00:00
Simon Larsen
8b89d1a04e Merge pull request #1857 from KoalaG/master
Fix Incident Number Concatenating instead of incrementing
2025-03-21 11:43:14 +00:00
KoalaG
b7c5f8a7f5 code linting 2025-03-21 10:31:08 +11:00
KoalaG
41b71cbd33 Fix accidental return of string instead of number
In some instances, database ORM is returning a string instead of a number. This commit ensures that a number is returned by this function.
2025-03-21 10:02:18 +11:00
Simon Larsen
31a06b21a5 Merge branch 'master' of github.com:OneUptime/oneuptime 2025-03-20 15:52:26 +00:00
Simon Larsen
d8a5bf387f refactor: clean up whitespace and improve formatting in OtelIngestService and migration files 2025-03-20 15:52:23 +00:00
Simon Larsen
8e862b8b8d refactor: streamline telemetry attribute handling and add migration for deleting all telemetry attributes 2025-03-20 15:16:14 +00:00
Simon Larsen
a870310f34 Merge pull request #1856 from omri-shilton/resources-and-additional-containers
Helm chart pod resources and probes additional containers
2025-03-20 12:44:59 +00:00
Simon Larsen
c02d560008 refactor: remove unused attributes from logger implementation 2025-03-20 12:11:40 +00:00
Simon Larsen
6c68203226 refactor: improve attribute handling and key prefixing in TelemetryUtil and OtelIngestService 2025-03-20 12:08:44 +00:00
omrishilton
6187d48d15 Pod resources and probes additional containers 2025-03-20 14:07:19 +02:00
Simon Larsen
cc5882a7b2 Merge branch 'release' 2025-03-19 16:59:09 +00:00
Simon Larsen
96adedb535 fix: ensure layerUsers array is properly accessed in FinalPreview component 2025-03-19 16:49:01 +00:00
Simon Larsen
3293df16f4 refactor: add structured attributes to logger for enhanced logging details 2025-03-19 15:38:24 +00:00
Simon Larsen
ae64daf3d8 refactor: improve code formatting and readability in OtelIngestService 2025-03-19 15:35:50 +00:00
Simon Larsen
4814694cfb refactor: enhance code structure and readability in Telemetry services 2025-03-19 15:31:58 +00:00
Simon Larsen
d0763ed707 refactor: replace spread operator with forEach for adding attribute keys in OtelIngestService 2025-03-19 15:25:25 +00:00
Simon Larsen
3ab037dd2d refactor: improve formatting for better readability in Telemetry utility 2025-03-19 15:10:13 +00:00
Simon Larsen
53a31b2010 2025-03-19 15:05:06 +00:00
Simon Larsen
06db041bd4 refactor: clean up formatting and improve readability in TelemetryAttribute model and related files 2025-03-19 15:02:02 +00:00
Simon Larsen
5147f6da82 feat: add attributes column to TelemetryAttribute model and update related services 2025-03-19 14:25:01 +00:00
Simon Larsen
87c3027a81 fix: ensure non-null assertion for layerUsers in FinalPreview component 2025-03-19 13:15:14 +00:00
Simon Larsen
a9bcb95edf feat: enhance telemetry utility with attribute retrieval and prefixing functionality 2025-03-18 22:30:24 +00:00
Simon Larsen
0a0048b117 refactor: remove debug logging of resource attributes in OtelIngestService 2025-03-18 21:20:33 +00:00
Simon Larsen
42f0daab8f refactor: improve logging format and consistency in ScheduledMaintenanceService and Slack utility 2025-03-18 20:18:55 +00:00
Simon Larsen
406240f76f fix: update title and description in FinalPreview component for clarity 2025-03-18 20:15:22 +00:00
Simon Larsen
69aae4f901 feat: add order property to sorting in FinalPreview component and adjust margin in SideMenuSection 2025-03-18 20:14:44 +00:00
Simon Larsen
4fbceb9a31 refactor: remove unused state for layer deletion error in FinalPreview component 2025-03-18 20:10:20 +00:00
Simon Larsen
954548c399 feat: add FinalPreview component to display on-call duty schedule layers 2025-03-18 20:09:39 +00:00
Simon Larsen
9ed90d6a69 feat: add migration to update reminder dates in scheduled maintenance events 2025-03-18 19:48:31 +00:00
Simon Larsen
5466eeb59a fix: add debug logging to ScheduledMaintenanceService for notification date calculations 2025-03-18 19:39:57 +00:00
Simon Larsen
4cb31ccfd4 fix: correct formatting in reminder notification text for scheduled maintenance events 2025-03-18 19:20:10 +00:00
Simon Larsen
9edb181b3b fix: normalize channel name formatting in Slack utility and update description in NotificationRuleForm 2025-03-18 19:08:50 +00:00
Simon Larsen
2ec4aaa076 fix: enhance description for channel name formatting in NotificationRuleForm component 2025-03-18 19:07:27 +00:00
Simon Larsen
e21a1cdb84 fix: add noItemsMessage prop to RecurringArrayViewElement and update ScheduledMaintenanceView to display a default message when no reminders are scheduled 2025-03-18 19:03:07 +00:00
Simon Larsen
39703474dc fix: correct formatting and improve readability in ScheduledMaintenance model and ScheduledMaintenanceView 2025-03-18 18:57:15 +00:00
Simon Larsen
fbd4510744 fix: update ScheduledMaintenance model and ScheduledMaintenanceView to improve reminder messaging and formatting 2025-03-18 18:53:44 +00:00
Simon Larsen
b974bae529 fix: update postfix text for subscriber notifications and enhance reminder display in Scheduled Maintenance components 2025-03-18 18:52:02 +00:00
Simon Larsen
39c2a1ae7b refactor: improve code formatting and readability in NotificationRuleViewElement component 2025-03-18 15:46:26 +00:00
Simon Larsen
a0725c5e2e refactor: clean up interface definition for MonitorNotificationRule 2025-03-18 15:41:02 +00:00
Simon Larsen
bba3f30820 refactor: replace MonitorStatusNotificationRule with MonitorNotificationRule and update related components 2025-03-18 15:31:49 +00:00
Simon Larsen
1eb35c4497 fix: improve code formatting and readability in MonitorStatusTimelineService, WorkspaceUtil, MonitorFeed, and NotificationRuleForm components 2025-03-18 15:14:37 +00:00
Simon Larsen
f9369ae3b6 fix: update sorting order to ascending for alert, incident, monitor, and scheduled maintenance feeds; handle null usernames in Slack utility 2025-03-18 15:08:51 +00:00
Simon Larsen
cbe97e1ff0 fix: change sorting order to descending for alert, incident, monitor, and scheduled maintenance feeds 2025-03-18 14:50:07 +00:00
Simon Larsen
e370c9aacf fix: improve markdown formatting in MonitorService and update icon in MonitorFeedElement 2025-03-18 14:47:59 +00:00
Simon Larsen
c9f2f82911 feat: enhance NotificationRuleForm to include new channel creation options and invite settings 2025-03-18 14:42:49 +00:00
Simon Larsen
3d053d5717 fix: correct formatting and improve readability in MonitorStatusTimelineService, MonitorFeed, and MonitorView components 2025-03-18 14:41:56 +00:00
Simon Larsen
64bcca1c17 feat: implement MonitorFeedService integration for monitor status change notifications 2025-03-18 14:38:10 +00:00
Simon Larsen
79925d2355 feat: add MonitorFeedElement component to display monitor updates and notifications 2025-03-18 14:33:00 +00:00
Simon Larsen
2a4a8975db fix: correct method signature to ensure proper return type in MonitorFeedService 2025-03-18 14:21:08 +00:00
Simon Larsen
5ecf6d2c70 refactor: remove unnecessary blank lines for improved code readability 2025-03-18 14:17:57 +00:00
Simon Larsen
14aba774b7 feat: integrate CaptureSpan for enhanced telemetry tracking across multiple services 2025-03-18 14:14:48 +00:00
Simon Larsen
06e5dac23d feat: add CaptureSpan decorator to various service methods for improved performance tracking 2025-03-18 14:07:34 +00:00
Simon Larsen
9161ce7c59 feat: add labels to alert, incident, and scheduled maintenance services; implement monitor workspace messages for Slack and Microsoft Teams 2025-03-18 13:49:37 +00:00
Simon Larsen
f071f0e4fa refactor: ensure incident and alert numbers are returned as numbers for consistency 2025-03-18 13:24:28 +00:00
Simon Larsen
053502aa35 feat: add Slack monitor actions and messages for improved monitoring capabilities 2025-03-18 12:51:50 +00:00
Simon Larsen
4edd853db7 refactor: update CaptureSpan to use TypedPropertyDescriptor for improved type safety 2025-03-18 12:14:02 +00:00
Simon Larsen
b394705280 Merge branch 'master' of github.com:OneUptime/oneuptime 2025-03-18 12:09:29 +00:00
Simon Larsen
cab1ec0346 refactor: remove unnecessary whitespace in GlobalCache, Status, and Telemetry classes for improved code cleanliness 2025-03-18 12:09:25 +00:00
Simon Larsen
e05b241a77 Merge pull request #1855 from KoalaG/master
Fix Schedule Maintence Event Number Concatenating instead of incrementing
2025-03-18 12:09:01 +00:00
Simon Larsen
23e76f4a04 refactor: consolidate success response handling in OtelIngestService for improved clarity 2025-03-18 12:05:46 +00:00
KoalaG
b7c3027aef Force result to return number
In some instances ORM/Database doesn't appear to return the correct type
2025-03-18 17:18:23 +11:00
Simon Larsen
9e3ae63daa refactor: remove redundant CaptureSpan decorators in GlobalCache, Status, and Telemetry classes for cleaner code 2025-03-17 23:23:04 +00:00
Simon Larsen
67521dee9e refactor: remove debug logging from CaptureSpan decorator for cleaner telemetry code 2025-03-17 23:20:43 +00:00
Simon Larsen
6764057154 refactor: streamline success response handling in OtelIngestService for improved clarity 2025-03-17 21:12:45 +00:00
Simon Larsen
419b3990d9 refactor: remove unnecessary whitespace in Logger and Telemetry classes for improved code cleanliness 2025-03-17 20:56:59 +00:00
Simon Larsen
9d68bd45fc refactor: remove CaptureSpan decorator from logger and telemetry methods for cleaner code 2025-03-17 20:47:15 +00:00
Simon Larsen
8f83a12627 refactor: enhance readability by restructuring status check routes and fixing formatting issues 2025-03-17 20:41:26 +00:00
Simon Larsen
c152cfc8d8 refactor: improve formatting and consistency in StatusAPI and update CaptureSpan import path 2025-03-17 20:38:49 +00:00
Simon Larsen
927351b499 feat: update CaptureSpan import paths across multiple files for consistency 2025-03-17 20:32:19 +00:00
Simon Larsen
260a7f29fa feat: add CaptureSpan import to multiple services for enhanced telemetry tracking 2025-03-17 20:22:25 +00:00
Simon Larsen
b39b9c02bf feat: integrate CaptureSpan decorator into multiple services for enhanced telemetry tracking 2025-03-17 20:18:43 +00:00
Simon Larsen
4539201ea9 refactor: clean up imports and formatting in various files for improved readability 2025-03-17 20:13:56 +00:00
Simon Larsen
527d191954 feat: add CaptureSpan decorator to multiple service classes for improved telemetry tracking 2025-03-17 20:08:56 +00:00
Simon Larsen
8972cc4d86 feat: integrate CaptureSpan decorator into various classes for enhanced telemetry tracking 2025-03-17 19:59:35 +00:00
Simon Larsen
7c50a09aff feat: add CaptureSpan decorator to various classes for enhanced telemetry tracking 2025-03-17 19:43:09 +00:00
Simon Larsen
4027fd1c58 docs: update README to enhance description of the Merch Store and its contribution to open-source development 2025-03-17 19:36:40 +00:00
Simon Larsen
ba32732ef0 feat: integrate CaptureSpan decorator into multiple monitor criteria classes for improved telemetry tracking 2025-03-17 19:35:51 +00:00
Simon Larsen
09ce3517ca feat: add CaptureSpan decorator to multiple authorization and service classes for enhanced telemetry tracking 2025-03-17 19:22:58 +00:00
Simon Larsen
dc514eeb04 feat: integrate CaptureSpan decorator into multiple monitor criteria classes for enhanced telemetry tracking 2025-03-17 19:19:46 +00:00
Simon Larsen
5c3dfc088b feat: implement Microsoft Teams and Slack integration for monitor notifications 2025-03-17 19:13:35 +00:00
Simon Larsen
31a3c0cfe9 feat: add Slack and Microsoft Teams connections to the dashboard side menu 2025-03-17 19:11:45 +00:00
Simon Larsen
93d12dde36 feat: add CaptureSpan decorator to multiple utility classes for improved telemetry tracking 2025-03-17 19:08:45 +00:00
Simon Larsen
af2b4c2ef1 feat: update import paths for CaptureSpan decorator across multiple files 2025-03-17 18:59:20 +00:00
Simon Larsen
b8ae12828c feat: add CaptureSpan decorator to multiple classes for enhanced telemetry tracking 2025-03-17 18:51:26 +00:00
Simon Larsen
e304f9500a fix: optimize CaptureSpan decorator for better promise handling and error management 2025-03-17 18:25:57 +00:00
Simon Larsen
140e7ab700 fix: handle undefined class names in CaptureSpan decorator to prevent errors 2025-03-17 17:39:49 +00:00
Simon Larsen
8a73bfaa11 fix: improve class name retrieval in CaptureSpan decorator for better span naming 2025-03-17 17:39:14 +00:00
Simon Larsen
3bc06091c1 refactor: enhance CaptureSpan decorator to include class name in span name 2025-03-17 17:30:43 +00:00
Simon Larsen
e7100fde94 feat: add UK phone number to on-call notification whitelist 2025-03-17 17:02:38 +00:00
Simon Larsen
f0f382df81 refactor: improve formatting and readability in CaptureSpan function 2025-03-14 22:49:56 +00:00
Simon Larsen
866aee3c57 refactor: clean up whitespace and formatting in OpenTelemetry ingest files 2025-03-14 22:31:50 +00:00
Simon Larsen
8f45deee2a feat: add DisableTelemetry check in CaptureSpan decorator to conditionally disable telemetry tracking 2025-03-14 22:26:21 +00:00
Simon Larsen
09690a9043 feat: implement CaptureSpan decorator in multiple services for enhanced telemetry tracking 2025-03-14 22:16:48 +00:00
Simon Larsen
8127ad5ef7 feat: enhance CaptureSpan decorator with optional attributes and improve logging in OpenTelemetry integration 2025-03-14 21:23:29 +00:00
Simon Larsen
68a2a54c51 refactor: simplify /status/ready endpoint logic and enhance logging in CaptureSpan decorator 2025-03-14 14:45:18 +00:00
Simon Larsen
521e9ca1ed feat: update Telemetry import paths and add CaptureSpan decorator for enhanced telemetry tracking 2025-03-14 14:30:01 +00:00
Simon Larsen
e45477fce8 feat: reintroduce Telemetry class with enhanced initialization for OpenTelemetry integration 2025-03-14 14:13:20 +00:00
Simon Larsen
cb1fead139 feat: add overridedByUserId field to OnCallDutyPolicyExecutionLogTimeline and update related services 2025-03-14 13:53:58 +00:00
Simon Larsen
f466f453f4 feat: add migration for overridedByUserId field in OnCallDutyPolicyExecutionLogTimeline and update related service logging 2025-03-14 13:51:44 +00:00
Simon Larsen
4ad562d39a fix: correct markdown formatting in on-call policy notification message 2025-03-14 13:28:18 +00:00
Simon Larsen
960dc654cc feat: enhance incident feed with overridedByUser details and improve markdown formatting 2025-03-14 13:28:02 +00:00
Simon Larsen
dea4f07641 feat: add overridedByUser and overridedByUserId fields to OnCallDutyPolicyExecutionLogTimeline model and update UserNotificationRuleService to utilize these fields 2025-03-14 13:25:33 +00:00
Simon Larsen
c2851709b5 refactor: update titles for Twilio phone number fields to clarify primary and secondary distinctions 2025-03-14 13:15:35 +00:00
Simon Larsen
218e1a1fe3 refactor: clean up whitespace and formatting across multiple files 2025-03-14 13:10:47 +00:00
Simon Larsen
6ae61dfae5 feat: add overridedByUserId column and relation to UserOnCallLog model 2025-03-14 13:06:52 +00:00
Simon Larsen
5a68d91f31 feat: trim input phone number and allow Phone instance in constructor 2025-03-14 12:41:13 +00:00
Simon Larsen
ef8d3f6eeb feat: update Twilio phone number configuration to allow non-unique primary numbers and add secondary phone numbers 2025-03-14 12:40:03 +00:00
Simon Larsen
d645dc3f28 fix: correct country code extraction to use the proper substring length 2025-03-14 12:20:03 +00:00
Simon Larsen
a61f77d93f feat: enhance phone number selection logic for SMS and call services 2025-03-14 12:17:11 +00:00
Simon Larsen
8f057c11ed feat: update Twilio configuration to include primary and secondary phone numbers 2025-03-14 10:45:52 +00:00
Simon Larsen
c60ebfa962 Merge pull request #1850 from OneUptime/on-call-overrides
On call overrides
2025-03-13 23:53:20 +00:00
Simon Larsen
8e579cc459 refactor: improve code formatting and consistency in OnCallDutyPolicyUserOverrideService and related files 2025-03-13 23:52:08 +00:00
Simon Larsen
d9aa2da199 feat: replace generic error with BadDataException for start time validation in OnCallDutyPolicyUserOverrideService 2025-03-13 23:35:59 +00:00
Simon Larsen
edd64868fe feat: implement validation in OnCallDutyPolicyUserOverrideService for create operations 2025-03-13 23:32:25 +00:00
Simon Larsen
b3c13d9175 feat: remove name and description fields from OnCallDutyPolicyUserOverride model and update migration 2025-03-13 23:24:06 +00:00
Simon Larsen
bbd76f5b6c feat: add onBeforeCreate handler to set projectId and onCallDutyPolicyId in UserOverrideTable 2025-03-13 23:21:30 +00:00
Simon Larsen
7eb85c9601 feat: add form fields for user overrides in UserOverrideTable component 2025-03-13 23:18:07 +00:00
Simon Larsen
78059e1370 feat: update UserOverrideTable to differentiate between global and policy-specific overrides 2025-03-13 23:11:10 +00:00
Simon Larsen
e44097ce73 feat: integrate User Overrides service into BaseAPI and update SideMenu for navigation 2025-03-13 23:09:24 +00:00
Simon Larsen
dda5541088 feat: restructure UserOverride components for improved organization and functionality 2025-03-13 23:04:22 +00:00
Simon Larsen
9f5266037d refactor: clean up code formatting and improve readability in On-Call Duty components 2025-03-13 22:58:23 +00:00
Simon Larsen
850d8b242f feat: implement User Overrides feature with routing and UI components 2025-03-13 22:56:14 +00:00
Simon Larsen
4e2e1ddd9d feat: add ExecutionLogsTable component for managing On-Call Policy User Overrides 2025-03-13 22:45:39 +00:00
Simon Larsen
63ed6723b3 feat: add On-Call Duty Policy User Override migration and table schema 2025-03-13 22:24:14 +00:00
Simon Larsen
9d417c3634 feat: add On-Call Duty Policy User Override service and integrate into services index 2025-03-13 22:21:03 +00:00
Simon Larsen
6fa8390ab9 feat: implement On-Call Duty Policy User Override service and update permissions 2025-03-13 22:19:58 +00:00
Simon Larsen
5b287c12a5 feat: add new permissions for On-Call Duty Policy User Overrides 2025-03-13 22:15:08 +00:00
Simon Larsen
b2f10da32b feat: add Merch Store link to footer and navigation, and update README with store information 2025-03-13 19:30:05 +00:00
Simon Larsen
adcdf5c7a1 docs: update Docker Compose installation description for clarity 2025-03-13 15:26:14 +00:00
Simon Larsen
eada5c67c7 fix: correct file path in BlogAPI and BlogPost utility for static files 2025-03-13 15:21:48 +00:00
Simon Larsen
de919f3a44 refactor: standardize parameter syntax across AlertStateTimelineService, IncidentStateTimelineService, and ScheduledMaintenanceStateTimelineService 2025-03-12 22:53:42 +00:00
Simon Larsen
7f02675a38 feat: enhance default value handling in form components with improved getDefaultValue method 2025-03-12 22:50:03 +00:00
Simon Larsen
7cdb0e68a4 feat: update StateTimeline components to use 'startsAt' for sorting and default value handling 2025-03-12 22:39:44 +00:00
Simon Larsen
f38f9c4af9 refactor: standardize getDefaultValue method syntax across form components 2025-03-12 22:11:48 +00:00
Simon Larsen
9dfcb8babb feat: implement getDefaultValue method for form fields to enhance default value handling 2025-03-12 22:06:22 +00:00
Simon Larsen
5181417a69 refactor: enhance MonitorStatusTimelineService logic for status updates and deletions 2025-03-12 21:55:55 +00:00
Simon Larsen
807976fa67 feat: update MonitorStatusTimelineService to use 'startsAt' for deletion and sorting logic 2025-03-12 20:51:50 +00:00
Simon Larsen
a86391832e feat: add billing access control to WorkspaceNotificationRule model 2025-03-12 19:35:52 +00:00
Simon Larsen
f3daebb628 refactor: simplify Workspace Connections section in SideMenu components 2025-03-12 19:32:33 +00:00
Simon Larsen
0ed557036d fix: quote Slack app client ID in Helm chart template for proper formatting 2025-03-12 18:00:10 +00:00
Simon Larsen
7e4d634a6e fix: update description for "Starts At" field in timeline models for clarity 2025-03-12 16:32:36 +00:00
Simon Larsen
8e2bd01d53 feat: add "Starts At" field to StatusTimeline component with default value 2025-03-12 16:29:35 +00:00
Simon Larsen
87d0ce7e51 fix: update condition to display "Workspace Connections" section in SideMenu components 2025-03-12 15:53:29 +00:00
Simon Larsen
479201c100 refactor: clean up code formatting and improve readability in Slack and SideMenu components 2025-03-12 15:52:56 +00:00
Simon Larsen
2ea4653338 fix: update condition for displaying "Workspace Connections" section in side menus 2025-03-12 15:48:15 +00:00
Simon Larsen
3e230e96e8 feat: handle Slack app uninstall requests by deleting associated auth tokens 2025-03-12 15:45:09 +00:00
Simon Larsen
40c3108d40 feat: conditionally display "Workspace Connections" section based on project ID in side menus 2025-03-12 15:38:58 +00:00
Simon Larsen
d4702b887c fix: make scheduled maintenance title and labels optional in Slack actions 2025-03-12 15:33:05 +00:00
Simon Larsen
ded2d95ce5 fix: improve error handling for scheduled maintenance title in Slack actions 2025-03-12 15:08:13 +00:00
Simon Larsen
39c59f5625 feat: add "Workspace Connections" section to documentation with Slack integration details 2025-03-12 14:51:55 +00:00
Simon Larsen
fa576ae549 feat: add "On Call" section to documentation with phone number whitelist details 2025-03-12 14:45:17 +00:00
Simon Larsen
d5b0cf0b61 fix: update notifyUserId assignment in alert, incident, and scheduled maintenance services for consistency 2025-03-12 14:40:26 +00:00
Simon Larsen
fe5c165ce2 fix: refactor Slack incident and alert actions to use AccessTokenService for common interaction properties 2025-03-12 14:06:30 +00:00
Simon Larsen
7f44c7906a fix: add tenantId property to Slack alert, incident, and scheduled maintenance actions 2025-03-12 13:34:10 +00:00
Simon Larsen
0c5856de67 fix: add isRoot property to SlackIncidentActions for improved functionality 2025-03-12 13:23:23 +00:00
Simon Larsen
82c1cdb4f9 fix: update titles and add isRoot property in Slack alert and scheduled maintenance actions 2025-03-12 13:22:30 +00:00
Simon Larsen
cbf18e50ff fix: correct markdown formatting in ScheduledMaintenancePublicNoteService and ScheduledMaintenanceService 2025-03-12 13:13:20 +00:00
Simon Larsen
bd9126426c fix: correct formatting in AlertService and ScheduledMaintenanceService 2025-03-12 13:09:12 +00:00
Simon Larsen
7fc89e7500 refactor: improve code formatting and readability in Slack action files 2025-03-11 21:25:08 +00:00
Simon Larsen
ac2860de52 fix: adjust markdown formatting for alert and scheduled maintenance messages 2025-03-11 21:18:12 +00:00
Simon Larsen
d84c7c93a1 feat: add date handling for selected date time in Slack view processing 2025-03-11 21:15:15 +00:00
Simon Larsen
57a4b96eec fix: change datepicker to datetimepicker in Slack utility 2025-03-11 21:06:27 +00:00
Simon Larsen
690a33bd19 refactor: update labels and titles for scheduled maintenance to improve clarity 2025-03-11 21:05:39 +00:00
Simon Larsen
de5285800d fix: update usage hints for Slack commands to remove leading slashes 2025-03-11 20:57:27 +00:00
Simon Larsen
0feaf80fb0 feat: add start and end date time pickers for scheduled maintenance in Slack actions 2025-03-11 20:53:56 +00:00
Simon Larsen
3d9be4734c fix: correct formatting of 'Scheduled Maintenance' labels and error messages 2025-03-11 20:21:43 +00:00
Simon Larsen
8eab46f2d9 feat: add date time picker block support in Slack and Workspace utilities 2025-03-11 20:19:41 +00:00
Simon Larsen
517ab93aa5 refactor: improve code formatting and consistency across scheduled maintenance and notification services 2025-03-11 20:16:26 +00:00
Simon Larsen
cdd668dd0b feat: enhance notification messages with user details and scheduled maintenance references 2025-03-11 20:13:18 +00:00
Simon Larsen
da023071a4 refactor: improve code formatting and readability in scheduled maintenance services and Slack API 2025-03-11 19:12:14 +00:00
Simon Larsen
8918a94b3e feat: implement notification rule handling for scheduled maintenance owner teams and users 2025-03-11 19:08:33 +00:00
Simon Larsen
22ae2da8c5 feat: add start and end time display for scheduled maintenance notifications 2025-03-11 19:06:23 +00:00
Simon Larsen
fbb3cfb667 feat: implement scheduled maintenance notification handling for Slack and Microsoft Teams 2025-03-11 18:43:18 +00:00
Simon Larsen
8d21cb2924 feat: add handling for scheduled maintenance actions in Slack API 2025-03-11 18:20:10 +00:00
Simon Larsen
b4724992c0 feat: add scheduled maintenance message handling for Microsoft Teams and Slack 2025-03-11 18:19:13 +00:00
Simon Larsen
2e21763e3c feat: add methods for managing scheduled maintenance notes and states 2025-03-11 17:11:55 +00:00
Simon Larsen
a8abc66f9f refactor: clean up code formatting and remove unnecessary line breaks for consistency 2025-03-11 16:39:11 +00:00
Simon Larsen
9a2d5de087 feat: add logging for alert creation and user invitation checks in Slack 2025-03-11 16:34:17 +00:00
Simon Larsen
5b5d28e414 feat: add early return for empty notification rules in workspace notification service 2025-03-11 16:13:27 +00:00
Simon Larsen
773aafb0e5 feat: implement notification rules for alert owner teams and users 2025-03-11 16:11:50 +00:00
Simon Larsen
5b3fc5f16e feat: update notification rule title and description for clarity 2025-03-11 14:39:40 +00:00
Simon Larsen
9b4de2ea85 refactor: add missing commas in function parameters for consistency 2025-03-11 14:34:55 +00:00
Simon Larsen
c00725b868 feat: enhance alert notifications with alert numbers and state emojis 2025-03-11 14:32:46 +00:00
Simon Larsen
feb4b246c6 refactor: uncomment "Workspace Connections" section in side menus across multiple pages 2025-03-11 14:01:48 +00:00
Simon Larsen
22281b08cb refactor: clean up code formatting and improve consistency in action type definitions 2025-03-11 14:00:52 +00:00
Simon Larsen
b1dbdd6158 feat: implement alert creation messaging for Slack and Microsoft Teams 2025-03-10 22:54:01 +00:00
Simon Larsen
cbbf5a28f0 feat: add Microsoft Teams alert message creation with action buttons and types 2025-03-10 22:47:55 +00:00
Simon Larsen
1cb6cb8e0e feat: implement Slack alert message creation with action buttons 2025-03-10 22:41:34 +00:00
Simon Larsen
736bf46992 feat: add alert note functionality and enhance alert state service methods 2025-03-10 22:40:09 +00:00
Simon Larsen
0a6cc8df48 refactor: improve formatting and comments in SlackAPI for clarity 2025-03-10 22:20:35 +00:00
Simon Larsen
de77a8134c refactor: comment out Workspace Connections section in multiple SideMenu files 2025-03-10 22:18:00 +00:00
Simon Larsen
babcd30b67 feat: update Slack API to remove trailing slash from server URL and adjust manifest placeholder 2025-03-10 22:09:32 +00:00
Simon Larsen
55d8488b45 feat: update Slack app manifest to use dynamic server URL and remove example manifest 2025-03-10 22:07:33 +00:00
Simon Larsen
3ace9e2bf9 fix: update action IDs for incident message buttons to use view actions 2025-03-10 22:00:15 +00:00
Simon Larsen
ce80e6c487 feat: add error handling and logging for workspace rules in UserNotificationRuleService 2025-03-10 21:51:58 +00:00
Simon Larsen
54bd349a6e refactor: clean up code formatting and improve readability in multiple files 2025-03-10 21:23:34 +00:00
Simon Larsen
dd420ae898 feat: implement notification for users unable to join channels due to disconnected accounts in WorkspaceNotificationRuleService 2025-03-10 21:05:40 +00:00
Simon Larsen
a498f2df86 feat: add logging for channel IDs in message sending process in WorkspaceNotificationRuleService 2025-03-10 21:03:17 +00:00
Simon Larsen
babb2dc222 fix: correct typo in projectOrUserAuthTokenForWorkspace parameter in postToWorkspaceChannels method 2025-03-10 20:56:23 +00:00
Simon Larsen
c47bb1b2a1 feat: enhance logging for notification rules and channel creation in IncidentOwnerTeamService and WorkspaceNotificationRuleService 2025-03-10 20:34:08 +00:00
Simon Larsen
1fbc58a9a8 fix: simplify channel creation logic in WorkspaceNotificationRuleService 2025-03-10 20:00:46 +00:00
Simon Larsen
d6be47f711 fix: update FormField and Radio components to use 'value' prop and enhance null safety in NotificationRuleViewElement 2025-03-10 19:51:49 +00:00
Simon Larsen
7a9fc86c34 feat: enhance Slack API with user direct message channel check and improve error handling 2025-03-10 19:34:16 +00:00
Simon Larsen
4326a09e36 refactor: streamline alert service methods and improve code formatting 2025-03-10 18:46:00 +00:00
Simon Larsen
4a18759f8d feat: implement workspace notification rules for alert and incident channels 2025-03-10 18:43:23 +00:00
Simon Larsen
cb81343289 refactor: improve code readability by standardizing formatting and indentation in notification rule service and utility 2025-03-10 17:47:22 +00:00
Simon Larsen
680e784fc4 refactor: clean up code formatting and remove unnecessary whitespace in various files 2025-03-10 17:45:56 +00:00
Simon Larsen
ed767465cd refactor: update import statements for NotificationRuleWorkspaceChannel to use default import 2025-03-10 17:36:45 +00:00
Simon Larsen
fac2911864 fix: add debug logging for cases with no channels to invite based on notification rules 2025-03-10 11:44:14 +00:00
Simon Larsen
ee87266ad9 feat: implement notification rules for inviting teams and users to incident channels 2025-03-10 11:42:55 +00:00
Simon Larsen
f089e9d10b refactor: remove unused import of WorkspaceChannel from ScheduledMaintenance model 2025-03-10 11:19:03 +00:00
Simon Larsen
e03d5cb45c refactor: remove unused WorkspaceChannel imports from Alert, Incident, and IncidentWorkspaceMessages 2025-03-10 11:17:39 +00:00
Simon Larsen
bed21d9ce2 feat: introduce NotificationRuleWorkspaceChannel interface and update related services to use it 2025-03-10 11:14:17 +00:00
Simon Larsen
3e37024104 feat: update NotificationRuleConditionElement to render values in a span and simplify return structure 2025-03-10 11:03:41 +00:00
Simon Larsen
138ee1554e feat: normalize channel name by removing leading '#' and converting to lowercase 2025-03-10 11:03:26 +00:00
Simon Larsen
167e724ce0 feat: update NotificationRuleCondition to support array values and add 'Contains' condition type 2025-03-10 10:35:23 +00:00
Simon Larsen
be704b04ac feat: add debug logging for notification rule retrieval and matching process 2025-03-10 09:53:30 +00:00
Simon Larsen
fa055b13c6 feat: add optional property to monitor status block in SlackIncidentActions 2025-03-10 09:32:09 +00:00
Simon Larsen
920b51054e feat: add optional property to input blocks and update callback IDs in app manifest 2025-03-10 09:28:56 +00:00
Simon Larsen
712f64a369 fix: streamline response handling in SlackIncidentActions by removing redundant response calls 2025-03-08 12:15:35 +00:00
Simon Larsen
8977c7a5b2 refactor: update viewValues type to support array values in SlackAuthAction and SlackUtil 2025-03-08 12:11:01 +00:00
Simon Larsen
32383524ea refactor: clean up whitespace and improve code formatting in Slack-related files 2025-03-08 11:25:03 +00:00
Simon Larsen
27a7b57f3f feat: update incident modal to use text box for title and enhance response handling 2025-03-07 20:22:25 +00:00
Simon Larsen
b5e6ed087f feat: add multi-select option to dropdown block and new incident slash command 2025-03-07 15:07:51 +00:00
Simon Larsen
7e016b54f5 fix: add command check to payload validation in SlackAuthAction 2025-03-07 14:00:34 +00:00
Simon Larsen
74b744d92e refactor: remove unused command fields and enhance payload handling in SlackAuthAction 2025-03-07 13:58:04 +00:00
Simon Larsen
ca9dbbd65f feat: enhance Slack authorization to support additional payload fields and improve request handling 2025-03-07 13:52:59 +00:00
Simon Larsen
0de9f4bb89 feat: update Slack slash commands to create incidents and scheduled maintenance 2025-03-07 13:37:50 +00:00
Simon Larsen
1837f6b6f6 refactor: clean up code formatting and improve readability in Slack authorization and integration components 2025-03-07 13:23:58 +00:00
Simon Larsen
764c9b4e0e refactor: enhance Slack request authorization logic and add raw body middleware for form data 2025-03-07 13:22:56 +00:00
Simon Larsen
ffb17f01c6 fix: correct Slack integration condition to display documentation when client ID is absent 2025-03-06 13:55:35 +00:00
Simon Larsen
4be249ee9c refactor: update Slack integration documentation formatting and logic for display condition 2025-03-06 13:41:37 +00:00
Simon Larsen
8b929eb5ec feat: add Slack integration documentation component and update SlackIntegration to display it when not connected 2025-03-06 13:39:23 +00:00
Simon Larsen
ed345a1569 refactor: simplify incident creation flow by removing promise chaining for message blocks retrieval 2025-03-06 13:27:27 +00:00
Simon Larsen
bb2779f095 refactor: simplify incident creation logic by chaining promise for message blocks retrieval 2025-03-06 13:23:49 +00:00
Simon Larsen
c2741a9436 refactor: enhance markdown formatting for user links in on-call duty policy notifications 2025-03-06 13:20:55 +00:00
Simon Larsen
2b75c6bb6a refactor: streamline user retrieval and markdown formatting in incident and scheduled maintenance services 2025-03-06 13:12:17 +00:00
Simon Larsen
5209f4c8b1 refactor: improve formatting and readability of user markdown string in alert and incident services 2025-03-06 13:07:43 +00:00
Simon Larsen
77f19241ff feat: update user identification in alerts and incidents to use markdown format for better readability 2025-03-06 13:04:31 +00:00
Simon Larsen
fbbcee1633 fix: specify error type in loadPage catch block for improved type safety 2025-03-06 12:44:29 +00:00
Simon Larsen
f868737dda feat: add getUserLinkInDashboard method and integrate RemoveUserFromProject component in UserView 2025-03-06 12:41:34 +00:00
Simon Larsen
a4c50c0a76 feat: add RemoveUserFromProject component with confirmation modal and error handling 2025-03-06 12:24:46 +00:00
Simon Larsen
eb2981a0c2 feat: enhance UserView to load user details and display profile picture with error handling 2025-03-06 12:10:30 +00:00
Simon Larsen
40481981b0 refactor: clean up code formatting and remove unnecessary whitespace in various components 2025-03-05 22:12:12 +00:00
Simon Larsen
1fe8d00807 feat: add filter applied state to Users component and update no items message accordingly 2025-03-05 22:08:25 +00:00
Simon Larsen
4e8ee6aeec feat: add user invitation modal and update user list message in Teams component 2025-03-05 21:59:29 +00:00
Simon Larsen
068b44a668 fix: handle errors in ProjectUserService refresh calls and correct UserView descriptions 2025-03-05 21:42:31 +00:00
Simon Larsen
e284aae226 feat: add profile picture field to UserView and adjust user ID display 2025-03-05 21:35:32 +00:00
Simon Larsen
6272f55500 fix: update project ID retrieval in Team component and clear singular/plural names in UserView 2025-03-05 21:33:34 +00:00
Simon Larsen
af5f2db9ad feat: add singular and plural names for teams in UserView component 2025-03-05 21:30:45 +00:00
Simon Larsen
92f9b4c81f fix: clean up code formatting and improve readability in various files 2025-03-05 21:30:04 +00:00
Simon Larsen
0340e5d9fd feat: add migration for ProjectUser and related team associations 2025-03-05 21:16:48 +00:00
Simon Larsen
d295644812 feat: refactor Users settings page to use ModelTable for ProjectUser and enhance user listing 2025-03-05 21:14:51 +00:00
Simon Larsen
2a752213cf feat: add BaseAPI route for ProjectUser model and service 2025-03-05 20:45:09 +00:00
Simon Larsen
11c2bb0e42 feat: add ProjectUser model and refresh logic for project users in services and migrations 2025-03-05 20:43:32 +00:00
Simon Larsen
3cace9cf3a feat: enhance Teams page with pagination test data for user listings 2025-03-05 20:23:07 +00:00
Simon Larsen
8ccbc3be61 feat: add user settings and view routes, update side menu for users and teams 2025-03-05 19:36:07 +00:00
Simon Larsen
3f0e518024 fix: improve markdown formatting for incident notes and notifications 2025-03-05 15:55:46 +00:00
Simon Larsen
77c6391aee fix: correct spacing in incident state change message formatting 2025-03-05 13:13:56 +00:00
Simon Larsen
4ec707f571 feat: implement Teams page with user listing and team associations 2025-03-05 13:11:23 +00:00
Simon Larsen
baef15be23 feat: update incident state emojis and improve Slack message formatting 2025-03-05 12:34:39 +00:00
Simon Larsen
8e4cda6556 fix: standardize team mention formatting in alert and incident notifications 2025-03-04 23:00:32 +00:00
Simon Larsen
d131befbac feat: add logging for incident states and dropdown options in Slack actions 2025-03-04 22:58:36 +00:00
Simon Larsen
fea31e7251 fix: update incident creation message header level for better formatting 2025-03-04 22:40:32 +00:00
Simon Larsen
e50af261d4 feat: enhance incident notification messages with emojis for better visibility 2025-03-04 22:39:49 +00:00
Simon Larsen
4aa953b886 style: improve code formatting and consistency across incident-related files 2025-03-04 22:27:22 +00:00
Simon Larsen
a0bccc0bf4 fix: disable workspace notifications for incident-related messages and enhance feed info formatting 2025-03-04 22:19:38 +00:00
Simon Larsen
54aa8cf857 feat: add actions for changing incident state in Slack integration 2025-03-04 21:52:45 +00:00
Simon Larsen
b6a4bf29af fix: update placeholder text for Microsoft Teams integration to improve clarity 2025-03-04 21:47:25 +00:00
Simon Larsen
f9d54bcf23 refactor: improve code formatting and consistency in Microsoft Teams integration components 2025-03-04 21:24:34 +00:00
Simon Larsen
ee1bf5b39b feat: add Microsoft Teams integration page and update routing in user settings 2025-03-04 21:19:47 +00:00
Simon Larsen
79083b4a28 feat: add Microsoft Teams integration settings to the dashboard 2025-03-04 20:51:48 +00:00
Simon Larsen
a375990ad8 feat: add placeholder for Microsoft Teams integration settings page 2025-03-04 20:48:10 +00:00
Simon Larsen
915e48b62a refactor: improve code formatting and consistency across various components 2025-03-04 20:46:57 +00:00
Simon Larsen
44f0c09d61 feat: add Microsoft Teams workspace connection support in alerts and incidents 2025-03-04 20:44:19 +00:00
Simon Larsen
c7364ca2b8 refactor: clean up code formatting and remove unnecessary whitespace in various files 2025-03-04 20:26:45 +00:00
Simon Larsen
cdc0ffa204 feat: add Slack workspace connection to Scheduled Maintenance Events and update routing and breadcrumbs 2025-03-04 20:24:39 +00:00
Simon Larsen
194cfd0457 feat: add Slack workspace connection page and update routing and breadcrumbs 2025-03-04 20:20:55 +00:00
Simon Larsen
55470e0451 feat: add Slack workspace connection pages for alerts and scheduled maintenance notifications 2025-03-04 20:18:29 +00:00
Simon Larsen
cf4e2983b6 refactor: remove unnecessary early response in SlackIncidentActions 2025-03-04 20:15:23 +00:00
Simon Larsen
a72052bf90 feat: add Slack workspace connection page and integrate connection status handling 2025-03-04 18:00:32 +00:00
Simon Larsen
dc1a077f54 refactor: simplify markdown handling in IncidentFeedService and enhance null safety in SlackAuthAction 2025-03-04 17:30:10 +00:00
Simon Larsen
5e4526695a refactor: update button titles in Slack incident messages to include emojis for enhanced visibility 2025-03-04 17:18:57 +00:00
Simon Larsen
04dd043f7c refactor: update button titles in Slack incident messages to use emoji for better visibility 2025-03-04 17:17:45 +00:00
Simon Larsen
de023ef593 refactor: remove unused import for WorkspaceCheckboxBlock in Incident actions 2025-03-04 16:50:16 +00:00
Simon Larsen
6b03609bb2 refactor: update incident state handling and improve modal interaction 2025-03-04 16:47:37 +00:00
Simon Larsen
3ea08e1462 refactor: rename incident state action types for clarity and implement state change modal handling 2025-03-04 16:40:35 +00:00
Simon Larsen
6bd82af652 refactor: rename action types for clarity and update related methods in SlackIncidentActions 2025-03-04 16:33:43 +00:00
Simon Larsen
1f17a11ca0 refactor: improve clarity of feedInfoInMarkdown for owner team and user events 2025-03-04 16:15:03 +00:00
Simon Larsen
5c38ed72bb refactor: update feedInfoInMarkdown for owner team and user events to improve clarity 2025-03-04 16:14:07 +00:00
Simon Larsen
060b2dfbab refactor: enhance incident services with new note handling and user notification improvements 2025-03-04 16:10:48 +00:00
Simon Larsen
635c1ee8ad refactor: enhance user notification handling and add utility for fetching usernames from workspace 2025-03-04 14:28:14 +00:00
Simon Larsen
72bdb2bd7e refactor: improve code formatting by adding whitespace for visibility checks in notification services 2025-03-04 14:10:49 +00:00
Simon Larsen
a616f38b6f refactor: add visibility checks for notifications in various services to ensure only visible incidents and events are sent to subscribers 2025-03-04 12:35:00 +00:00
Simon Larsen
847296798d refactor: enhance logging for Slack API and IncidentService, improve code formatting and readability 2025-03-04 12:10:47 +00:00
Simon Larsen
0acee70580 refactor: enhance code formatting and readability in IncidentService.ts 2025-03-03 21:28:18 +00:00
Simon Larsen
57100bf5db refactor: improve import formatting for consistency in Workspace.ts 2025-03-03 21:21:08 +00:00
Simon Larsen
65b4ede27e refactor: improve code readability by adding whitespace and consistent formatting in IncidentFeedService and WorkspaceUtil 2025-03-03 21:14:43 +00:00
Simon Larsen
a080b09cdc refactor: add type annotations for better clarity and consistency in IncidentFeedService and WorkspaceUtil 2025-03-03 21:11:49 +00:00
Simon Larsen
f9674fc376 refactor: standardize formatting and clean up workspace notification objects across incident services 2025-03-03 21:08:59 +00:00
Simon Larsen
5410bea3d8 refactor: remove unused imports and clean up Slack action files 2025-03-03 20:58:31 +00:00
Simon Larsen
d5babfd42d feat: add workspace notification support across incident notification services 2025-03-03 20:51:50 +00:00
Simon Larsen
a97c4f5200 refactor: rename createAlertFeed and createIncidentFeed methods to createAlertFeedItem and createIncidentFeedItem for consistency 2025-03-03 19:53:33 +00:00
Simon Larsen
c5c09ef3f0 refactor: clean up whitespace and improve code formatting in Slack action files 2025-03-03 18:34:52 +00:00
Simon Larsen
9736a5ddea refactor: remove unused incidentId assignment and clean up modal configuration in Slack incident actions 2025-02-28 23:35:23 +00:00
Simon Larsen
fbddf4ef18 feat: streamline modal handling in Slack integration by generating modal JSON and removing unused properties 2025-02-28 23:28:49 +00:00
Simon Larsen
b4418c36e2 feat: add triggerId to Slack request and enhance modal handling for incident notes 2025-02-28 23:21:57 +00:00
Simon Larsen
d4dfa0a5ff refactor: clean up code formatting and remove unnecessary whitespace in various files 2025-02-28 22:56:13 +00:00
Simon Larsen
8139e48cff feat: enhance Slack incident notifications with emoji indicators for acknowledgment and resolution 2025-02-28 22:50:50 +00:00
Simon Larsen
6185d8f502 feat: implement incident resolution checks and enhance Slack notifications for resolved incidents 2025-02-28 22:49:33 +00:00
Simon Larsen
bf1ea21079 feat: add user visibility and direct messaging functionality in Slack integration 2025-02-28 22:33:42 +00:00
Simon Larsen
fda5d690e0 fix: add newline for better formatting in root cause message of Slack incident 2025-02-28 20:49:35 +00:00
Simon Larsen
f05a9cd292 Merge branch 'master' into workspace-slack 2025-02-28 20:43:32 +00:00
Simon Larsen
0dd5cb063b fix: remove unnecessary whitespace and improve code formatting in UserOnCallLogTimelineAPI 2025-02-28 20:31:49 +00:00
Simon Larsen
53f953a408 feat: enhance acknowledgment handling with detailed view message page 2025-02-28 20:29:56 +00:00
Simon Larsen
af64f200f8 fix: remove unnecessary text color class from acknowledgment button 2025-02-28 19:56:27 +00:00
Simon Larsen
7e253c5b1a refactor: clean up code formatting and improve readability in UserOnCallLogTimelineAPI 2025-02-28 19:55:06 +00:00
Simon Larsen
fc367b5d75 fix: update acknowledgment link styling and improve clarity in notification form 2025-02-28 13:34:58 +00:00
Simon Larsen
5349ac95fe docs: add clarification comments for acknowledgment page logic 2025-02-28 13:24:09 +00:00
Simon Larsen
4fce79f893 fix: update acknowledge route to acknowledge-page for clarity 2025-02-28 13:23:31 +00:00
Simon Larsen
d0333ca131 feat: add acknowledge page for user on-call notifications 2025-02-28 13:22:12 +00:00
Simon Larsen
7da4e7cca0 Merge branch 'master' of github.com:OneUptime/oneuptime 2025-02-28 10:54:33 +00:00
Simon Larsen
27fc0d0548 refactor: format debug logging statements for improved readability 2025-02-28 10:54:30 +00:00
Simon Larsen
9ceb08c1f6 feat: enhance logging for status page subscription process 2025-02-28 10:47:25 +00:00
Simon Larsen
21a3163c65 feat: refactor Slack action handling to support multiple actions and improve payload structure 2025-02-28 10:29:08 +00:00
Simon Larsen
044aa8b5cd feat: add detailed logging for Slack request authorization and handle payload parsing 2025-02-27 17:30:18 +00:00
Simon Larsen
731bc0d018 refactor: comment out unused code and improve readability in SlackAuthorization middleware 2025-02-27 17:24:21 +00:00
Simon Larsen
4b3ce59255 feat: enhance Slack authorization middleware with detailed logging for request validation 2025-02-27 17:13:59 +00:00
Simon Larsen
e111bc4152 feat: add handling for view incident action and improve error response for invalid action types in SlackIncidentActions 2025-02-27 17:13:05 +00:00
Simon Larsen
5e641fa297 feat: add incident notification functionality for workspace creation in Slack 2025-02-27 17:06:50 +00:00
Simon Larsen
3c6a8ef4a1 refactor: improve code formatting and readability in WorkspaceNotificationRuleService and SlackIncidentActions 2025-02-27 16:41:37 +00:00
Simon Larsen
27cac6ccb5 feat: update Slack action types and enhance incident model with new workspace message handling 2025-02-27 16:38:05 +00:00
Simon Larsen
ac32509aeb Merge pull request #1842 from anxuanzi/master
Add status command to agent and cleanup code
2025-02-27 15:06:05 +00:00
Tony An
c77cb8cd19 ⬆️ Update dependencies and bump Go version
Updated various dependencies in `go.mod` and `go.sum` to their latest versions, including `golang.org/x/sys`, `github.com/go-co-op/gocron`, and more. Increased the Go version to 1.23.0 and added toolchain specification for Go 1.24.0. These updates improve compatibility, security, and maintainability.
2025-02-27 08:54:28 -06:00
Tony An
39c8acc720 🗑️ Refactor service structure for improved code clarity
Renamed the program struct to agentService and updated related methods and variables for consistency. This enhances readability and aligns naming conventions with the underlying functionality. Minor adjustments made to configuration handling and formatting for better maintainability.
2025-02-27 08:52:46 -06:00
Tony An
a4420a06c1 🗑️ Refactor error handling for configuration checks.
Removed redundant error checks and streamlined logic for verifying service configuration. This simplifies the code and avoids duplicate error handling, improving maintainability.
2025-02-27 08:48:11 -06:00
Tony An
6ba0768366 Add status command to check service state
Introduced a new `status` command to display the service state (running, stopped, or unknown). Improved user feedback by logging the status and handling potential errors during the status check.
2025-02-27 08:47:17 -06:00
Simon Larsen
d4a6ec94e3 feat: add incident acknowledgment and resolution functionality in SlackAPI and IncidentService 2025-02-26 22:42:51 +00:00
Simon Larsen
882c19a169 feat: implement Slack action types and update incident service to use them 2025-02-26 22:34:22 +00:00
Simon Larsen
1e198f3637 feat: add workspaceSendMessageResponse field to Incident model and related migrations 2025-02-26 20:38:25 +00:00
Simon Larsen
01624646f2 refactor: uncomment workspace connections sections in side menus 2025-02-26 16:29:14 +00:00
Simon Larsen
b74d8b79e1 refactor: comment out workspace connections sections in side menus 2025-02-26 16:28:24 +00:00
Simon Larsen
566b4cfdde feat: add JSON input argument for manual workflow execution 2025-02-26 15:07:46 +00:00
Simon Larsen
e9cb8e1604 feat: add support for manual workflow execution arguments in various components 2025-02-26 15:06:45 +00:00
Simon Larsen
cf7c39d96c feat: improve error handling in manually run workflow API by adding try-catch block 2025-02-26 13:16:23 +00:00
Simon Larsen
4738f8f930 feat: enhance error handling in workflow execution by introducing HTTP response type checks 2025-02-26 13:16:05 +00:00
Simon Larsen
390a4cbbf0 feat: implement channel joining functionality and enhance channel name retrieval in Slack utility methods 2025-02-25 22:20:55 +00:00
Simon Larsen
4bbbb9b473 feat: enhance Slack integration with new user invitation methods and bot user ID retrieval 2025-02-25 19:49:44 +00:00
Simon Larsen
482c7c142e feat: expand bot permissions in Slack app manifest for enhanced functionality 2025-02-25 18:56:59 +00:00
Simon Larsen
9d581fc176 feat: update Slack app manifest to refine user and bot scopes 2025-02-25 17:07:19 +00:00
Simon Larsen
d680d09dc6 feat: add response validation and error logging in Slack utility methods 2025-02-25 16:33:24 +00:00
Simon Larsen
1ab55e1c19 refactor: streamline API request headers in Slack utility methods for improved readability 2025-02-25 16:30:42 +00:00
Simon Larsen
427514ceb3 feat: add detailed debug logging to Slack utility methods for improved traceability 2025-02-25 16:21:26 +00:00
Simon Larsen
e443288074 refactor: format debug logging statements in WorkspaceNotificationRuleService for consistency 2025-02-25 16:08:53 +00:00
Simon Larsen
d14686a288 feat: enhance logging in WorkspaceNotificationRuleService for better traceability 2025-02-25 16:00:37 +00:00
Simon Larsen
f1b08dab84 feat: add detailed logging to WorkspaceNotificationRuleService methods 2025-02-25 15:24:32 +00:00
Simon Larsen
74a73411ed feat: add workspaceType to the service model properties in WorkspaceProjectAuthTokenService 2025-02-25 15:19:32 +00:00
Simon Larsen
ab76ecd04f fix: uncomment and restore workspace notification logic in IncidentService 2025-02-25 14:59:38 +00:00
Simon Larsen
5816be7041 feat: add placeholder and conditional display logic for new channel creation in NotificationRuleViewElement 2025-02-25 14:49:32 +00:00
Simon Larsen
300bbbc326 fix: uncomment Workspace Connections section in SideMenu components 2025-02-25 13:20:57 +00:00
Simon Larsen
9c76bd283d fix: correct spelling of 'oneuptime' in various files 2025-02-25 13:10:04 +00:00
Simon Larsen
cb263de054 fix: initialize cardbuttons array with props.cardButtons if available 2025-02-25 12:25:01 +00:00
Simon Larsen
06f3ba40dc refactor: clean up code formatting in OnCallPolicyExecutionLogs components 2025-02-24 21:32:15 +00:00
Simon Larsen
f5febd029a fix: update incidentId to alertId in OnCallPolicyExecutionLogs component 2025-02-24 21:28:36 +00:00
Simon Larsen
09fde3a29b feat: add On Call Policy Execution Logs pages and update breadcrumbs and routes 2025-02-24 21:26:28 +00:00
Simon Larsen
e628968b97 feat: add triggeredByUserId to OnCallDutyPolicyExecutionLog and update related services and migrations 2025-02-24 21:18:03 +00:00
Simon Larsen
12b31ca237 feat: add on-call policy execution modal to Alert and Incident feeds 2025-02-24 21:15:58 +00:00
Simon Larsen
f2de1695f5 feat: add triggeredByUserId to OnCallDutyPolicyExecutionLog and create permission for log creation 2025-02-24 20:54:04 +00:00
Simon Larsen
ef8c36d176 fix: improve string concatenation for log messages in workflow services 2025-02-24 18:49:39 +00:00
Simon Larsen
2ea10bfbdd feat: enhance date formatting options to include seconds in logs 2025-02-24 18:45:46 +00:00
Simon Larsen
4dcd691ef7 fix: add missing semicolons in WebhookTrigger class methods 2025-02-24 18:33:53 +00:00
Simon Larsen
61ff89af8f fix: add error handling to webhook trigger routes 2025-02-24 18:33:24 +00:00
Simon Larsen
35b3dbfd8b refactor: clean up code formatting and improve readability in StatusPageAPI, MasterPage, and NavBar components 2025-02-24 18:07:19 +00:00
Simon Larsen
9174a04795 feat: implement conditional fetching for incidents, announcements, and scheduled maintenance events based on status page settings 2025-02-24 18:06:13 +00:00
Simon Larsen
4a80b1c8fd feat: add showIncidentsOnStatusPage, showAnnouncementsOnStatusPage, and showScheduledMaintenanceEventsOnStatusPage props to StatusPage components 2025-02-24 18:00:17 +00:00
Simon Larsen
95c2bee9a9 feat: add toggle fields for showIncidentsOnStatusPage, showAnnouncementsOnStatusPage, and showScheduledMaintenanceEventsOnStatusPage in StatusPage settings 2025-02-24 17:51:13 +00:00
Simon Larsen
3d0f0a62fe feat: add showIncidentsOnStatusPage, showAnnouncementsOnStatusPage, and showScheduledMaintenanceEventsOnStatusPage fields to StatusPage model 2025-02-24 17:48:23 +00:00
Simon Larsen
b23af6c6a9 feat: add validation for startDate and endDate in uptime API and implement worst status calculation 2025-02-24 17:42:02 +00:00
Simon Larsen
434305acc9 feat: enhance uptime API to support startDate and endDate parameters and update response structure 2025-02-24 17:13:55 +00:00
Simon Larsen
a225314c65 refactor: update getMonitorStatusTimelineForStatusPage to use startDate and endDate parameters 2025-02-24 16:18:50 +00:00
Simon Larsen
a8e20574c7 Merge branch 'sp-api' 2025-02-22 17:26:22 +00:00
Simon Larsen
c667fddc64 chore: update Node.js base image to version 23.8 in Dockerfile templates 2025-02-21 22:38:02 +00:00
Simon Larsen
c2ce1ea140 feat: add server monitor ingest hostname and port to Helm chart configuration 2025-02-21 21:35:49 +00:00
Simon Larsen
8b1680fab5 fix: rename package from probe-ingest to server-monitor-ingest in package.json 2025-02-21 20:31:06 +00:00
Simon Larsen
fe64380384 feat: add server monitor ingest service with Docker and configuration updates 2025-02-21 20:23:27 +00:00
Simon Larsen
449a1db573 feat: add visibility flag for status page in StatusPageAPI 2025-02-21 19:34:33 +00:00
Simon Larsen
e4c05c09f0 refactor: clean up code formatting and improve readability in Incident and ScheduledMaintenance models 2025-02-21 19:29:04 +00:00
Simon Larsen
d4107e049f feat: add settings page for scheduled maintenance events with visibility control 2025-02-21 19:28:10 +00:00
Simon Larsen
3811f9648c feat: add settings page for incident management and visibility control 2025-02-21 19:14:05 +00:00
Simon Larsen
f4415dafc7 feat: add TLS configuration to MailService for handling unauthorized certificates 2025-02-20 19:20:01 +00:00
Simon Larsen
30940991e0 feat: add endpoint to calculate uptime percentage for status page resources 2025-02-20 19:07:45 +00:00
Simon Larsen
a6d3047007 refactor: comment out workspace connections sections in side menus 2025-02-20 14:05:40 +00:00
Simon Larsen
2ae0d139ea refactor: simplify WorkflowTimeoutInMs declaration in EnvironmentConfig 2025-02-20 14:02:49 +00:00
Simon Larsen
1507583cf3 feat: add workflow timeout configuration and update related files 2025-02-20 14:00:28 +00:00
Simon Larsen
310e1b764c fix: log complete request body instead of just code in VM sandbox execution 2025-02-20 13:51:40 +00:00
Simon Larsen
1d7a25f2bb refactor: clean up code formatting and remove unnecessary whitespace in various files 2025-02-14 21:46:02 +00:00
Simon Larsen
3bc89a8cae feat: add migration to update postUpdatesToWorkspaceChannels column type to JSONB in Incident, Alert, and ScheduledMaintenance tables 2025-02-14 21:43:06 +00:00
Simon Larsen
ff54b5a26c feat: add notification event type support in WorkspaceNotificationRuleService and update NotificationRuleForm validation 2025-02-14 21:41:46 +00:00
Simon Larsen
07b9f38e90 feat: enhance Notification Rule form to support new channel template name and improve validation messages for existing channels 2025-02-14 19:45:40 +00:00
Simon Larsen
f612940668 feat: update Alert, Incident, and ScheduledMaintenance models to support multiple workspace channels and change column types to JSON 2025-02-14 18:35:44 +00:00
Simon Larsen
6046bda443 feat: update WorkspaceNotificationRuleService to return created channels and enhance WorkspaceChannel interface 2025-02-14 17:53:40 +00:00
Simon Larsen
cd97a72ef2 refactor: clean up whitespace and improve formatting in workspace utility classes 2025-02-14 17:51:05 +00:00
Simon Larsen
c20fbcc7a4 fix: correct spelling errors in comments and update variable names for clarity 2025-02-14 17:27:27 +00:00
Simon Larsen
f22e410860 feat: implement MicrosoftTeams workspace utility and enhance notification rule interfaces 2025-02-14 16:28:02 +00:00
Simon Larsen
3059ca848e refactor: reorganize Slack utility imports and introduce CreateChannelNotificationRule interface 2025-02-14 15:50:20 +00:00
Simon Larsen
ce8b8c3b58 refactor: update import path for IncidentNotificationRule to improve module organization 2025-02-14 13:13:29 +00:00
Simon Larsen
78846a3f95 refactor: improve code formatting and add documentation for non-HTTP methods in API reference 2025-02-14 13:12:44 +00:00
Simon Larsen
994f329a49 fix: update example API request URLs to use dynamic ID placeholders 2025-02-14 13:00:44 +00:00
Simon Larsen
d621df58cd refactor: remove obsolete migration file and clean up Slack utility code 2025-02-14 12:48:26 +00:00
Simon Larsen
0e0ccd9651 refactor: update method visibility and improve naming consistency in notification rule conditions 2025-02-14 12:36:54 +00:00
Simon Larsen
cc0adea216 refactor: remove unnecessary blank line in BaseAPI 2025-02-14 12:30:08 +00:00
Simon Larsen
8ec0825a52 feat: add update and delete item routes to BaseAPI and improve monitor ID handling in WorkspaceNotificationRuleService 2025-02-14 12:26:47 +00:00
Simon Larsen
4d083f9663 feat: refactor notification rule service to support new notification rule types and improve channel handling 2025-02-14 12:16:02 +00:00
Simon Larsen
81b3795b1c feat: update migration and interfaces to rename Slack channel references to Workspace channel for consistency 2025-02-14 09:58:10 +00:00
Simon Larsen
74cf9ae184 feat: rename Slack channel references to Workspace channel for consistency across models 2025-02-12 17:58:29 +00:00
Simon Larsen
9ba4c0bfdd feat: implement validation for notification rule form inputs to enhance user experience 2025-02-12 17:49:07 +00:00
Simon Larsen
85e83c6822 feat: rename inviteOwnersToNewChannel to shouldInviteOwnersToNewChannel for clarity and update NotificationRuleForm to include new toggle option 2025-02-12 17:33:05 +00:00
Simon Larsen
65eedde511 feat: reintroduce AlertNotificationRule interface and update NotificationRuleForm to support new channel creation and user invitations 2025-02-12 17:29:46 +00:00
Simon Larsen
7d45056ae4 feat: update notification rule form to support dynamic workspace type for channel creation and user invitations 2025-02-12 17:16:52 +00:00
Simon Larsen
f2db382087 feat: introduce new notification rule types for monitor status, alerts, and scheduled maintenance with updated logic for channel management 2025-02-12 17:14:18 +00:00
Simon Larsen
3e99783119 feat: add migration to rename Slack channel ID columns to channel name for improved clarity 2025-02-12 15:36:20 +00:00
Simon Larsen
de6bbbee8c feat: rename Slack channel ID references to channel name and update related logic for improved clarity 2025-02-12 15:35:17 +00:00
Simon Larsen
0309c2d7e8 feat: enhance Slack notification rule handling by adding channel creation logic and user invitation functionality 2025-02-12 14:23:33 +00:00
Simon Larsen
1c9bb0605b feat: update notification rule conditions and enhance incident service methods for improved clarity and functionality 2025-02-12 13:58:03 +00:00
Simon Larsen
b8b98be7a0 feat: rename WorkspacePayloadBlock to WorkspaceMessageBlock and update related methods in WorkspaceNotificationRuleService 2025-02-11 19:20:53 +00:00
Simon Larsen
6c037b0996 feat: rename WorkspaceNotificationPayload to WorkspaceMessagePayload and update related services 2025-02-11 17:49:29 +00:00
Simon Larsen
326b60c260 feat: enhance Slack notification payload structure and improve incident service methods 2025-02-11 17:17:03 +00:00
Simon Larsen
e13ab0b214 feat: implement getWorkspacePayloadForIncidentCreate method and enhance Slack notification payload structure 2025-02-11 16:25:16 +00:00
Simon Larsen
01f8a27dd2 feat: add postUpdatesToSlackChannelId field to Alert, Incident, and ScheduledMaintenance models for Slack integration 2025-02-11 15:51:52 +00:00
Simon Larsen
081029b49a feat: add postUpdatesToSlackChannelId field to Alert, Incident, and ScheduledMaintenance models for Slack integration 2025-02-11 13:57:33 +00:00
Simon Larsen
32d55fdc46 refactor: improve code formatting and enhance readability in various service and utility files 2025-02-11 13:53:21 +00:00
Simon Larsen
69aa680dd1 feat: update user creation to optionally include full name and enhance Slack notification methods 2025-02-11 13:43:37 +00:00
Simon Larsen
117c02d457 refactor: comment out Workspace Connections section in SideMenu components 2025-02-11 10:17:43 +00:00
Simon Larsen
f74fcb3734 refactor: clean up whitespace and improve code formatting in various components 2025-02-10 21:20:43 +00:00
Simon Larsen
676d6598d7 feat: enhance error handling and messaging in MonitorCriteriaInstance and related components 2025-02-10 21:15:38 +00:00
Simon Larsen
af1edfef99 fix: correct validation error check in MonitorStep and tidy up CriteriaFilters component 2025-02-10 20:50:02 +00:00
Simon Larsen
56cadf01fd feat: implement hasValueField utility method for CriteriaFilter validation 2025-02-10 20:35:22 +00:00
Simon Larsen
6a0ef8d940 refactor: improve code formatting and structure in migration files and notification rule validation logic 2025-02-10 20:21:43 +00:00
Simon Larsen
1e01942218 feat: implement validation logic for Slack notification rules in NotificationRuleConditionUtil 2025-02-10 20:16:59 +00:00
Simon Larsen
5dab4f8042 feat: add scheduledMaintenanceNumber column to ScheduledMaintenance table and create corresponding index 2025-02-10 19:54:52 +00:00
Simon Larsen
3e4a50d430 refactor: clean up code by removing unnecessary blank lines in Alert and ScheduledMaintenance models, migration files, and services 2025-02-10 18:54:54 +00:00
Simon Larsen
96d236b034 feat: add scheduledMaintenanceNumber to ScheduledMaintenance model and implement related logic in service and UI components 2025-02-10 18:50:52 +00:00
Simon Larsen
ade5e69aa0 feat: add alertNumber column to Alert table and create corresponding index 2025-02-10 18:06:55 +00:00
Simon Larsen
4733c710b2 feat: add alertNumber field to Alert model and implement related logic in AlertService and UI components 2025-02-10 18:02:54 +00:00
Simon Larsen
1c8922249e feat: add WorkspaceNotificationPayload interface and update notifyWorkspace method to accept new payload structure 2025-02-10 17:55:50 +00:00
Simon Larsen
73c787836f feat: introduce WorkspaceType and NotificationRuleEventType enums; implement SlackNotificationRule interface and related services 2025-02-10 17:43:49 +00:00
Simon Larsen
ec6f3d84d7 refactor: rename ServiceProviderType to WorkspaceType and update related components for consistency 2025-02-10 17:40:07 +00:00
Simon Larsen
1f2df5f3ee refactor: rename initialValue prop to value in notification rule components for consistency 2025-02-10 14:47:33 +00:00
Simon Larsen
121a78ea8d refactor: improve code formatting and readability in form components 2025-02-10 14:42:34 +00:00
Simon Larsen
832ab4ab24 Merge branch 'master' of github.com:OneUptime/oneuptime 2025-02-10 14:25:33 +00:00
Simon Larsen
445f3906ee feat: improve notification rule forms and conditions; enhance filter handling and UI elements 2025-02-10 14:25:30 +00:00
Simon Larsen
c869acc0e5 Merge pull request #1831 from diabolocom/nginx_ipv6
Feature: Nginx: Allow to specify listen options
2025-02-10 13:59:24 +00:00
Simon Larsen
0d2b2a272b feat: enhance notification rule conditions and form fields with additional labels and descriptions 2025-02-10 13:18:37 +00:00
Simon Larsen
d8ac1c39b7 feat: add option to show horizontal rule in form fields 2025-02-10 13:03:21 +00:00
Simon Larsen
e31dbe935c feat: enhance Slack integration and notification rule forms with additional descriptions and conditions 2025-02-10 12:59:00 +00:00
Jules Lefebvre
35e46cebfc feat(helm): add nginx listen config values
Add the posibility to define `NGINX_LISTEN_ADDRESS` and `NGINX_LISTEN_OPTIONS` via the `nginx.listenAddress` and `nginx.listenOptions` to allow to listen on all single and dual stack
2025-02-10 13:58:28 +01:00
Jules Lefebvre
891861f396 feat(docker-compose): add nginx listen enviroment variables
Add the posibility to define `NGINX_LISTEN_ADDRESS` and `NGINX_LISTEN_OPTIONS` to allow to listen on all single and dual stack
2025-02-10 13:57:36 +01:00
Jules Lefebvre
fbc38230b8 feat(nginx): allow to specify listen options 2025-02-10 13:44:35 +01:00
Simon Larsen
61561f9745 fix: add missing comma in schema migrations index for consistency 2025-02-10 12:25:09 +00:00
Simon Larsen
13e5f57160 feat: add migration for ServiceProviderUserAuthToken table and update index; log project creation for user 2025-02-10 11:43:03 +00:00
Simon Larsen
7600085473 feat: add migration for ServiceProviderUserAuthToken, ServiceProviderProjectAuthToken, ServiceProviderSetting, and ServiceProviderNotificationRule tables 2025-02-10 11:29:53 +00:00
Simon Larsen
99641d6994 refactor: remove obsolete migration files and clean up schema migrations index 2025-02-10 11:25:27 +00:00
Simon Larsen
dea66cc8d8 refactor: improve formatting of radioButtonOptions mapping in FormField component 2025-02-07 20:02:25 +00:00
Simon Larsen
1dd43a69a0 refactor: clean up formatting and improve readability in various components 2025-02-07 19:43:09 +00:00
Simon Larsen
e539cb7ae3 feat: add onBeforeCreate handler to ServiceProviderNotificationRulesTable for event type and project ID assignment 2025-02-07 19:33:50 +00:00
Simon Larsen
5269f7a164 feat: replace RadioButton with OptionChooserButton in form field schema and update related components 2025-02-07 19:29:02 +00:00
Simon Larsen
8e1d6b420f feat: enhance SlackIntegration component with connection handlers and improve notification rule naming 2025-02-07 19:10:30 +00:00
Simon Larsen
311f7dbb5b refactor: rename connection state variables for clarity in SlackIntegration component 2025-02-07 18:51:54 +00:00
Simon Larsen
9ac64b5873 feat: add color selection to ServiceProviderNotificationRulesTable and update SlackIntegration component props 2025-02-07 18:45:56 +00:00
Simon Larsen
e54126e6bf refactor: clean up permission definitions and formatting in ServiceProvider models 2025-02-07 18:36:56 +00:00
Simon Larsen
a4acc59505 fix: remove unnecessary permissions from ServiceProviderNotificationRule update access control 2025-02-07 18:31:35 +00:00
Simon Larsen
854bc297a6 feat: add permissions for Service Provider Notification Rules and update access control in ServiceProviderProjectAuthToken 2025-02-07 18:29:34 +00:00
Simon Larsen
69bfb48573 refactor: rename Settings component to SlackIntegrationPage for clarity 2025-02-07 18:18:20 +00:00
Simon Larsen
9ef7f720b1 refactor: improve code formatting and readability in ServiceProviderNotificationRulesTable and SlackIntegration components 2025-02-07 18:14:42 +00:00
Simon Larsen
2155dcad65 fix: correct spelling of NotificationRuleForm and NotificationRuleViewElement components; remove unused ServiceProviderNotificationRules component 2025-02-07 18:10:58 +00:00
Simon Larsen
fb4da29ade fix: correct URL formatting for social media and blog links in BlogPostUtil 2025-02-07 14:04:14 +00:00
Simon Larsen
d146d33059 Merge branch 'master' of github.com:OneUptime/oneuptime 2025-02-07 11:03:51 +00:00
Simon Larsen
978ac9155f refactor: update event type cases in NotificationRuleConditionUtil for consistency 2025-02-07 11:03:34 +00:00
Simon Larsen
cf9b4f0eba refactor: simplify value extraction in NotificationRuleConditionElement 2025-02-07 11:01:58 +00:00
Simon Larsen
d26a2aa995 refactor: update type annotations for selected alert and incident conditions in NotificationRuleConditionElement 2025-02-07 10:56:15 +00:00
Simon Larsen
c8301e21eb feat: update NotificationRule components to include event type in titles and descriptions 2025-02-07 10:53:25 +00:00
Simon Larsen
1a24232a1c refactor: improve code formatting and readability in AlertSeverityElement, IncidentStateElement, and NotificationRuleForm components 2025-02-07 10:42:06 +00:00
Simon Larsen
69c94835fe Merge pull request #1830 from OneUptime/slack-app
Slack app
2025-02-07 10:26:00 +00:00
Simon Larsen
706a9145ac feat: add NotificationRuleConditions and NotificationRuleForm components for enhanced notification rule management 2025-02-06 19:57:05 +00:00
Simon Larsen
9bde6194a5 feat: add NotificationRuleConditionElement and related components for alert and incident states 2025-02-06 19:29:55 +00:00
Simon Larsen
3dd8c62bc4 feat: enhance SlackNotificationRule and NotificationRuleForm with new fields and conditions 2025-02-06 18:47:12 +00:00
Simon Larsen
895a434d0e refactor: clean up code formatting and improve readability in various files 2025-02-06 17:49:01 +00:00
Simon Larsen
d3ec3a60df feat: implement NotificationRuleForm component and utility functions for condition checks 2025-02-06 14:25:39 +00:00
Simon Larsen
df15a2dcae feat: add name and description fields to ServiceProviderNotificationRule model and update migration 2025-02-06 12:18:04 +00:00
Simon Larsen
5e4b24dcfb feat: refactor notification rule models to use BaseNotificationRule and update filter conditions 2025-02-06 11:14:52 +00:00
Simon Larsen
0eae73c4e5 feat: add ServiceProviderNotificationRule model and service with migration 2025-02-06 11:03:43 +00:00
Simon Larsen
deb3f81e5d Merge pull request #1817 from OneUptime/slack-app
Slack App
2025-02-05 19:22:02 +00:00
Simon Larsen
dcb3fe6f69 feat: add ServiceProviderSetting model and service with CRUD operations 2025-02-05 17:33:45 +00:00
Simon Larsen
4bbecb3013 feat: refactor ServiceProviderProjectAuthToken and ServiceProviderSetting models, add deletedByUserId field 2025-02-05 16:25:13 +00:00
Simon Larsen
52954f3702 feat: add migration for ServiceProviderUserAuthToken and ServiceProviderProjectAuthToken tables 2025-02-05 16:17:37 +00:00
Simon Larsen
12a7fff668 refactor: update ServiceProviderUserAuthToken to use ServiceProviderType enum 2025-02-05 16:12:14 +00:00
Simon Larsen
14e489a719 feat: implement ServiceProviderType enum and refactor auth token services for Slack and Microsoft Teams 2025-02-05 16:09:50 +00:00
Simon Larsen
83f2935f41 fix: update Slack integration page URL to reflect new settings path 2025-02-05 16:00:49 +00:00
Simon Larsen
28855d482e 2025-02-05 15:56:15 +00:00
Simon Larsen
7c11ebdacf refactor: rename "Workspace Integrations" to "Workspace Connections" in SideMenu 2025-02-05 14:10:17 +00:00
Simon Larsen
592c806465 feat: add user and project auth token services to BaseAPI routing 2025-02-05 14:09:36 +00:00
Simon Larsen
7a3d0266c4 chore: update SlackAPI comments to use sample access tokens for clarity 2025-02-05 14:00:17 +00:00
Simon Larsen
e9b7368cf1 refactor: clean up code by removing unnecessary whitespace and improving formatting 2025-02-05 13:58:27 +00:00
Simon Larsen
f8c0004f85 feat: add Slack integration section to settings menu and routing 2025-02-05 13:45:26 +00:00
Simon Larsen
b007cb8bbd feat: implement Slack integration settings page and enhance auth token services for user and project 2025-02-05 13:43:22 +00:00
Simon Larsen
541015766c feat: rename service type to service provider type and add new fields for user and project IDs in service provider 2025-02-05 11:55:17 +00:00
Simon Larsen
5310087287 feat: update Slack app manifest by refining user and bot scopes and adding a temporary manifest file 2025-02-04 19:33:32 +00:00
Simon Larsen
7649c6c566 feat: update Slack integration authorization URL and add app manifest for enhanced functionality 2025-02-04 19:23:09 +00:00
Simon Larsen
1b2650f6df feat: expand Slack app manifest scopes for enhanced functionality 2025-02-04 19:14:02 +00:00
Simon Larsen
de3586d60e feat: update Slack integration error handling and redirect logic in user settings 2025-02-04 19:08:17 +00:00
Simon Larsen
a0ca579c2f feat: enhance Slack integration error handling and redirect logic in user settings 2025-02-04 19:04:39 +00:00
Simon Larsen
9bc7a115a1 feat: implement Slack app manifest retrieval and enhance scope validation in user settings 2025-02-04 18:51:26 +00:00
Simon Larsen
aef7af0a9a feat: refactor Slack utility imports and add new Slack utility class 2025-02-04 18:35:34 +00:00
Simon Larsen
e9f2e46e16 feat: add endpoint to retrieve Slack app manifest 2025-02-04 18:17:44 +00:00
Simon Larsen
56fd18f7c9 feat: update Slack API with improved error handling and new command shortcuts 2025-02-04 18:16:30 +00:00
Simon Larsen
ecccd8b536 feat: enhance Slack authentication flow with projectId and userId validation 2025-02-04 18:09:35 +00:00
Simon Larsen
dd2f0f37f2 fix: simplify signature validation logic in SlackAuthorization middleware 2025-02-04 18:00:32 +00:00
Simon Larsen
600a5eafe3 fix: update SlackAuthorization middleware to use req.body instead of req.rawBody 2025-02-04 17:54:53 +00:00
Simon Larsen
9b07bf7a08 feat: implement Slack API integration with authorization and event handling 2025-02-04 17:53:59 +00:00
Simon Larsen
d341f6c2b0 feat: enhance Slack integration with error handling and documentation 2025-02-04 15:33:24 +00:00
Simon Larsen
06a030f518 feat: add Slack app client credentials to Helm chart configuration 2025-02-04 14:34:42 +00:00
Simon Larsen
b02fed6e5b feat: add Slack App configuration to environment and UI settings 2025-02-04 14:33:48 +00:00
Simon Larsen
310884bd73 feat: implement Slack OAuth redirection in SlackIntegration component 2025-02-04 14:22:19 +00:00
Simon Larsen
0c625d52c2 feat: update Slack icon SVG paths for improved rendering 2025-02-04 14:11:54 +00:00
Simon Larsen
82ab70f396 refactor: clean up whitespace and formatting in UserSettingsBreadcrumbs and UserSettingsRoutes 2025-02-04 14:08:15 +00:00
Simon Larsen
24d9c9dbc0 feat: add Slack integration to user settings with routing and breadcrumbs 2025-02-04 14:04:49 +00:00
Simon Larsen
d9f1dc9fd2 feat: add UserAuthToken and ProjectAuthToken services and migrations 2025-02-04 13:44:51 +00:00
Simon Larsen
4b503471bd feat: implement Slack status API and initialize routing 2025-02-04 12:40:05 +00:00
Simon Larsen
b523434be3 feat: add Slack app manifest for OneUptime integration 2025-02-04 11:43:22 +00:00
Simon Larsen
f32b1950d9 fix: add return type to sendSubscriptionChangeWebhookSlackNotification method in ProjectService 2025-02-03 18:42:08 +00:00
Simon Larsen
e1c45a5c99 refactor: update property name from 'id' to '_id' and improve Slack message formatting in ProjectService 2025-02-03 18:41:20 +00:00
Simon Larsen
195655b4df refactor: improve code formatting and readability in ProjectService 2025-02-03 18:23:59 +00:00
Simon Larsen
9d7d65f0ef feat: add Slack notification for subscription plan changes in ProjectService 2025-02-03 18:05:08 +00:00
Simon Larsen
985b5410f6 refactor: clean up formatting and improve code readability in environment config and project service 2025-02-03 17:54:41 +00:00
Simon Larsen
d1dd57deec feat: add Slack webhook notifications for user creation, project management, and subscription updates 2025-02-03 17:50:34 +00:00
Simon Larsen
2ec6902537 refactor: improve async handling in BlogPost utility methods 2025-02-03 17:26:01 +00:00
Simon Larsen
cd130bc8ef feat: enhance status page URL handling and add unsubscribe link in subscription emails 2025-01-31 14:34:11 +00:00
Simon Larsen
3fcd1f694e refactor: clean up whitespace and formatting in blog-related files 2025-01-31 14:14:39 +00:00
Simon Larsen
b98b43b9f6 feat: add blog management features and update routing for blog posts 2025-01-31 14:10:54 +00:00
Simon Larsen
b59c76f771 feat: set log limit to 250 in TraceExplorer and Logs components 2025-01-30 20:35:46 +00:00
Simon Larsen
4d2e386328 feat: set default log limit to 250 in DashboardLogsViewer 2025-01-30 17:23:56 +00:00
Simon Larsen
deddcbe152 refactor: add serviceName attribute to telemetry data attributes 2025-01-30 17:00:30 +00:00
Simon Larsen
e305284fe2 refactor: enhance error handling and logging in TelemetryIngest middleware 2025-01-30 16:47:55 +00:00
Simon Larsen
3163debdb8 chore: remove end-to-end test workflow from GitHub Actions 2025-01-30 15:39:59 +00:00
Simon Larsen
f827237a80 refactor: change convertSelectReturnedDataToJson method visibility from private to public in AnalyticsDatabaseService 2025-01-30 15:22:32 +00:00
Simon Larsen
c038e39620 refactor: replace executeQuery calls with execute for consistency in AnalyticsDatabaseService 2025-01-30 15:20:28 +00:00
Simon Larsen
b8c1190c9f refactor: update execute method calls to use executeQuery for consistency in AnalyticsDatabaseService 2025-01-30 14:54:12 +00:00
Simon Larsen
7f5ff5068e refactor: improve code formatting and readability in AnalyticsDatabaseService and LogsViewer components 2025-01-30 14:47:54 +00:00
Simon Larsen
943acc8567 feat: add Clickhouse configuration volume and update AnalyticsDatabaseService to use ResultSet for JSON responses 2025-01-30 11:58:43 +00:00
Simon Larsen
81798211ea chore: update @clickhouse/client and @clickhouse/client-common to version 1.10.1 2025-01-29 21:02:48 +00:00
Simon Larsen
39596f6a42 refactor: replace <div> tags with <pre> for better JSON body rendering in LogsViewer component 2025-01-29 18:35:13 +00:00
Simon Larsen
36a181e77e refactor: replace <pre> tags with <div> for log body rendering in LogsViewer component 2025-01-29 18:25:55 +00:00
Simon Larsen
032c03a877 docs: update health check extension comment to indicate deprecation and suggest upgrade to health_check_v2 2025-01-29 15:42:19 +00:00
Simon Larsen
500299fb2f feat: add liveness, readiness, and startup probes to otel-collector configuration 2025-01-29 15:40:26 +00:00
Simon Larsen
b959e84032 feat: add health check extension to OTel collector configuration 2025-01-29 15:38:57 +00:00
Simon Larsen
30edc194f4 feat: add batch processor configuration for OTLP exporter in collector config template 2025-01-29 14:07:49 +00:00
Simon Larsen
0a20894dd1 feat: add DISABLE_TELEMETRY environment variable to multiple templates for telemetry control 2025-01-28 20:28:03 +00:00
Simon Larsen
1045a7399f fix: change OTLP exporter protocol from http/json to http/protobuf in config template 2025-01-28 19:44:51 +00:00
Simon Larsen
0f3ef0027b fix: update OTLP exporter protocol from http/protobuf to http/json in config template 2025-01-28 19:19:24 +00:00
Simon Larsen
2f43bc5c65 feat: add setup function for ts-node installation in configure script 2025-01-28 18:34:59 +00:00
Simon Larsen
8d9f7e125d feat: add additional breadcrumb links for status pages 2025-01-28 18:27:06 +00:00
Simon Larsen
3ac841ddc1 refactor: improve code formatting and simplify component structure in status pages 2025-01-28 17:27:21 +00:00
Simon Larsen
9fc8c6f7a2 refactor: update route paths and simplify side menu component for status pages 2025-01-28 17:24:22 +00:00
Simon Larsen
62cd974235 refactor: clean up whitespace and improve code formatting in status pages 2025-01-28 13:05:14 +00:00
Simon Larsen
a0d03238ee feat: add announcements route and update breadcrumbs for status pages 2025-01-28 12:55:43 +00:00
Simon Larsen
4303cf00cc feat: add announcements page and update routing for status pages 2025-01-28 12:49:57 +00:00
Simon Larsen
747ea70de5 refactor: update date formatting in scheduled maintenance feed for improved readability 2025-01-28 12:00:19 +00:00
Simon Larsen
6dd4ef22df refactor: enhance scheduled maintenance feed with additional details and improve Recurring class string representation 2025-01-28 11:52:11 +00:00
Simon Larsen
4b97c79ae2 refactor: enhance alert and scheduled maintenance feed updates with additional data fields 2025-01-28 11:36:30 +00:00
Simon Larsen
d34b118c68 refactor: streamline summary prop definition in form components 2025-01-28 11:26:37 +00:00
Simon Larsen
a3ff2e1067 refactor: introduce FormSummaryConfig interface and update form components to use it 2025-01-28 11:23:32 +00:00
Simon Larsen
e6ef2a7945 chore: add concurrency settings to test-release workflow 2025-01-27 19:57:57 +00:00
Simon Larsen
9bf8d5d941 refactor: improve readability of getSummaryElement functions in ScheduledMaintenanceCreate component 2025-01-27 19:53:34 +00:00
Simon Larsen
f3ee93bd48 refactor: remove unused import from Create.tsx in ScheduledMaintenanceEvents 2025-01-27 19:47:06 +00:00
Simon Larsen
5b78fee225 refactor: rename StatusPagesLabel to StatusPagesElement and update imports across components 2025-01-27 19:46:51 +00:00
Simon Larsen
dd73947b7f Merge branch 'release' of github.com:OneUptime/oneuptime into release 2025-01-27 18:25:15 +00:00
Simon Larsen
78998fb123 refactor: simplify form field mapping and improve readability in FormSummary component 2025-01-27 18:22:51 +00:00
Simon Larsen
0bcfccffe0 feat: add margin-bottom to form step title for improved spacing in FormSummary component 2025-01-27 18:19:23 +00:00
Simon Larsen
3ab45f40ca feat: optimize FormSummary component by refining field filtering logic and improving step title styling 2025-01-27 18:16:16 +00:00
Simon Larsen
bb2f610bc8 feat: enhance form summary component to support conditional rendering of form steps and improve layout structure 2025-01-27 18:10:45 +00:00
Simon Larsen
9b685133c4 feat: enhance incident severity and monitor status components with new props for animation and improved data handling 2025-01-27 17:58:21 +00:00
Simon Larsen
33c4943794 refactor: standardize fetch functions to use PromiseVoidFunction type and improve error handling in incident severity, monitors, monitor statuses, and on-call policies components 2025-01-27 17:49:33 +00:00
Simon Larsen
a7f8aa4faa refactor: update state initialization and error handling in Fetch components; improve type definitions for fetch functions 2025-01-27 17:41:27 +00:00
Simon Larsen
722fe30c8f feat: implement FetchMonitors, FetchMonitorStatuses, and FetchOnCallPolicies components; update Field interface for summary element handling 2025-01-27 17:37:08 +00:00
Simon Larsen
500104eb81 feat: add FetchTeams and FetchUsers components; implement label ID handling in IncidentCreate 2025-01-27 17:07:22 +00:00
Simon Larsen
41c3a14dfa fix: change exit code in configure.sh to allow continuation on directory change failure 2025-01-27 16:55:47 +00:00
Simon Larsen
113eda94fa Merge branch 'master' of github.com:OneUptime/oneuptime 2025-01-27 16:51:49 +00:00
Simon Larsen
c6ce43f7cc feat: add FormSummary component and integrate it into BasicForm; implement FetchLabels for incident labels 2025-01-27 16:49:53 +00:00
Simon Larsen
6d5bc60127 fix: update secondTLDs initialization to use split method for better readability 2025-01-27 16:49:46 +00:00
Simon Larsen
b7b7b28834 Merge pull request #1816 from KalvadTech/improve_configure_sh
refactor: modernize configure.sh
2025-01-27 16:48:26 +00:00
Loïc Tosser
5a0b0d7c61 refactor: modernize configure.sh with improved error handling, modularity, and installation process 2025-01-27 18:50:51 +04:00
Simon Larsen
79bf7ce7ee fix: replace props.steps with getFormSteps in BasicForm component 2025-01-27 11:03:31 +00:00
Simon Larsen
4ab150bf75 refactor: clean up code formatting and improve readability in various files 2025-01-27 10:54:46 +00:00
Simon Larsen
951668c982 fix: update debug log messages to specify 'test' for monitor list API 2025-01-27 10:52:59 +00:00
Simon Larsen
d7845407f0 fix: set default limit to 100 in FetchMonitorTest 2025-01-27 10:47:35 +00:00
Simon Larsen
8c5e3187ab feat: add MonitorTestService to services index 2025-01-27 10:44:56 +00:00
Simon Larsen
d2ae1cd845 Merge pull request #1814 from OneUptime/master
chore: update playwright to version 1.50.0 and adjust debugger port i…
2025-01-24 19:18:03 +00:00
Simon Larsen
8cb64fbe66 feat: add isSummaryStep property to BasicForm and FormStep interface 2025-01-24 19:11:49 +00:00
Simon Larsen
092b858873 fix: correct spelling of 'enabled' in BasicForm and update related components 2025-01-24 18:54:28 +00:00
Simon Larsen
81d19722f6 chore: update dependencies in test-release workflow to include infrastructure-agent-deploy 2025-01-24 18:39:11 +00:00
Simon Larsen
1f7b268875 feat: add summary step to BasicForm and implement detail display for form fields 2025-01-24 18:32:10 +00:00
Simon Larsen
38b32a6090 refactor: improve code formatting and consistency in IncidentService 2025-01-24 18:08:21 +00:00
Simon Larsen
373159cb29 feat: enhance incident update feed with detailed information including title, root cause, description, remediation notes, labels, and severity 2025-01-24 17:59:52 +00:00
Simon Larsen
ec86ef4c0e chore: update playwright to version 1.50.0 and adjust debugger port in launch configuration 2025-01-24 16:11:51 +00:00
Simon Larsen
270231374b refactor: clean up migration and improve formatting for subscriber email notification footer text 2025-01-24 10:48:31 +00:00
Simon Larsen
aac4281602 feat: update subscriber email notification footer text to support longer content and add migration 2025-01-24 10:45:51 +00:00
Simon Larsen
bdea1139a4 refactor: improve code formatting for subscriber email notification footer text 2025-01-24 10:36:02 +00:00
Simon Larsen
14fdfa6d17 feat: add subscriber email notification footer text to status page and update notification templates 2025-01-24 10:31:59 +00:00
Simon Larsen
3b22747dbf Merge branch 'release' 2025-01-23 21:51:08 +00:00
Simon Larsen
eb9e20dad5 fix: update OpenTelemetry configuration template to use index for environment variables 2025-01-23 21:31:58 +00:00
Simon Larsen
5aa4b883ad feat: add OpenTelemetry exporter configuration options in Helm chart templates 2025-01-23 21:28:11 +00:00
Simon Larsen
ea38e2621f refactor: clean up code formatting and remove unused props in Scheduled Maintenance components 2025-01-23 16:22:16 +00:00
Simon Larsen
b2cb95e1fc feat: enhance Scheduled Maintenance Table with template creation buttons and update description in create page 2025-01-23 16:17:26 +00:00
Simon Larsen
b174b9795a feat: add imports for form handling and recurring events in Scheduled Maintenance Create page 2025-01-23 16:10:19 +00:00
Simon Larsen
9d1caa8336 feat: add Scheduled Maintenance Event creation page and update routing and breadcrumbs 2025-01-23 16:07:35 +00:00
Simon Larsen
52e8669960 feat: remove unused createInitialValues prop from IncidentsTable component 2025-01-23 15:51:09 +00:00
Simon Larsen
f0505725a7 feat: refine query parameters handling in Route class and improve navigation logic 2025-01-23 15:49:33 +00:00
Simon Larsen
7897641ef7 feat: implement addQueryParams method in Route class and update incident navigation logic 2025-01-23 15:07:11 +00:00
Simon Larsen
761f5f35e9 feat: add query parameters support in navigation and update incident declaration flow 2025-01-23 14:56:59 +00:00
Simon Larsen
241586ff4a feat: add Incident creation page with routing and breadcrumbs integration 2025-01-23 14:39:15 +00:00
Simon Larsen
f8fc1a9dae feat: enhance Monitor layout with hideSideMenu prop and improve component styling 2025-01-23 13:59:24 +00:00
Simon Larsen
6bbcc0a301 feat: add hideSideMenu prop to Monitor layout and update routing logic 2025-01-23 13:43:58 +00:00
Simon Larsen
0e6604aa11 refactor: update description in Monitor creation component for clarity 2025-01-23 13:24:40 +00:00
Simon Larsen
ade84a23ff refactor: clean up Monitor creation component and improve button navigation 2025-01-23 13:10:20 +00:00
Simon Larsen
6ff883b54e feat: add Monitor creation page and update routing and breadcrumbs 2025-01-23 12:52:27 +00:00
Simon Larsen
3546d92143 refactor: update localRoot paths in launch.json and improve logging in CheckHeartbeat and UpdateConnectionStatus 2025-01-23 12:41:34 +00:00
Simon Larsen
e932eb1b1d feat: update DISABLE_TELEMETRY value to false in otel-collector.yaml 2025-01-22 17:49:30 +00:00
Simon Larsen
cbca712af8 feat: add OpenTelemetry exporter environment variables and disable telemetry in otel-collector.yaml 2025-01-22 17:49:00 +00:00
Simon Larsen
8490128833 feat: add DISABLE_TELEMETRY environment variable to otel-collector.yaml 2025-01-22 15:38:10 +00:00
Simon Larsen
b80e126540 chore: update Playwright and related dependencies to version 1.49.1 2025-01-22 13:53:30 +00:00
Simon Larsen
5494a2244e feat: update Dockerfile.tpl to use new OpenTelemetry Collector version and improve gomplate installation 2025-01-22 12:44:22 +00:00
Simon Larsen
23be5b1736 fix: downgrade collector version to 0.104.0 and enhance config output in Dockerfile.tpl 2025-01-22 12:12:15 +00:00
Simon Larsen
9f3a9bc915 fix: update download command in Dockerfile.tpl to use uname for architecture detection 2025-01-22 11:34:00 +00:00
Simon Larsen
84d322f476 fix: correct echo command syntax in OTelCollector Dockerfile.tpl 2025-01-22 11:15:23 +00:00
Simon Larsen
f94fbcc2ae feat: improve architecture detection and installation process in Dockerfile.tpl 2025-01-22 11:11:14 +00:00
Simon Larsen
0e85162b50 fix: update architecture detection syntax in Dockerfile.tpl for compatibility 2025-01-21 15:59:59 +00:00
Simon Larsen
a5927f3681 feat: refactor Dockerfile.tpl to streamline gomplate installation and architecture detection 2025-01-21 15:58:20 +00:00
Simon Larsen
0d37587199 feat: enhance OpenTelemetry Collector configuration with sending queue parameters 2025-01-21 15:20:50 +00:00
Simon Larsen
4674578c90 feat: update OTel Collector Dockerfile and configuration for gomplate integration 2025-01-21 15:10:44 +00:00
Simon Larsen
87d280edbd feat: use sudo for apt-get update in compile workflow 2025-01-21 13:26:03 +00:00
Simon Larsen
d44ddd6781 feat: extend hard delete retention period from 3 to 30 days in WorkflowLogService 2025-01-21 12:42:50 +00:00
Simon Larsen
7271481fb7 feat: add apt-get update step in compile workflow 2025-01-20 17:08:59 +00:00
Simon Larsen
7f05ae7415 feat: upgrade checkout action to v4 in GitHub workflows 2025-01-20 14:43:07 +00:00
Simon Larsen
1e84b3a0cb feat: upgrade Node.js setup action to v4 in GitHub workflows 2025-01-20 14:42:33 +00:00
Simon Larsen
20c7b11ecc feat: update Node.js version in GitHub workflows to latest 2025-01-20 14:42:06 +00:00
Simon Larsen
6666f6e817 Merge pull request #1807 from diabolocom/helm-clickhouse-update
Deps: Helm-chart: Update clickhouse chart v7.2.0
2025-01-20 14:23:34 +00:00
Simon Larsen
621e1ce207 feat: update Dockerfiles to replace libasound2t64 with libasound2 for playwright dependencies 2025-01-20 14:14:06 +00:00
Simon Larsen
1c42c58591 feat: update Dockerfiles to include libasound2t64 dependency for playwright 2025-01-20 14:09:41 +00:00
Jules Lefebvre
6a1b0d8718 deps(chart): update clickhouse chart
Update binami clickhouse helm chart to version 7.2.0 to support ipv6 by default
2025-01-20 15:07:28 +01:00
Simon Larsen
bc244bfde1 feat: rename notification rule type for clarity and update related migration 2025-01-20 13:55:56 +00:00
Simon Larsen
984cb41efc feat: update notification rule types to use ON_CALL_EXECUTED for incidents and alerts 2025-01-20 13:42:54 +00:00
Simon Larsen
076386f0d4 feat: update OnCallDutyPolicyExecutionLog and UserOnCallLog models to make Triggered By Incident and Alert IDs optional 2025-01-20 13:26:11 +00:00
Simon Larsen
cb11a46cc9 feat: enhance logging for on-call duty policy execution and improve user notification handling 2025-01-20 13:03:15 +00:00
Simon Larsen
6c7f1b5eb9 feat: update ExecutionLogsTable to display triggered by incident and alert details 2025-01-20 12:17:09 +00:00
Simon Larsen
95709f1996 feat: add support for displaying alerts in execution logs table 2025-01-20 12:12:31 +00:00
Simon Larsen
eaebcc748d fix: add missing newline for improved code readability in Alive job 2025-01-20 11:52:23 +00:00
Simon Larsen
13c2f6e73d feat: implement probe alive endpoint and enhance state change notification with project ID 2025-01-20 11:49:46 +00:00
Simon Larsen
f746d353a7 refactor: remove unnecessary whitespace and improve code formatting in Alert services and components 2025-01-20 11:08:23 +00:00
Simon Larsen
de1760bda7 feat: update alert services and components to support private notes and improve description handling 2025-01-20 10:56:54 +00:00
Simon Larsen
a28b870c23 feat: mark report fields as required for improved form validation 2025-01-20 09:58:03 +00:00
Simon Larsen
eb216e52cf feat: enhance alert notifications by integrating AlertFeedService for state change and note posting events 2025-01-17 21:50:31 +00:00
Simon Larsen
c19913ac58 refactor: clean up code formatting and improve readability in Alert components 2025-01-17 20:42:10 +00:00
Simon Larsen
b55bb4ceeb feat: simplify alert state management by consolidating ChangeAlertState usage and adding AlertFeedElement 2025-01-17 20:39:43 +00:00
Simon Larsen
26ec1aa5b2 feat: implement Alert Feed component with event handling and data fetching 2025-01-17 20:37:13 +00:00
Simon Larsen
7b733c32e9 feat: remove unused CardModelDetail components for Alert Description, Root Cause, and Remediation Notes 2025-01-17 20:27:34 +00:00
Simon Larsen
3d34118f9e feat: add new pages for Alert Description, Root Cause, and Remediation with routing and breadcrumbs 2025-01-17 20:26:49 +00:00
Simon Larsen
69a3a898f5 refactor: improve code formatting and readability in UserSettings components 2025-01-17 19:56:07 +00:00
Simon Larsen
74d21e7c33 feat: update alert and incident on-call rule titles to include severity information and change side menu icon 2025-01-17 19:53:55 +00:00
Simon Larsen
aecf1c38a6 feat: rename and add routes for Incident and Alert On-Call Rules in user settings 2025-01-17 19:47:02 +00:00
Simon Larsen
8b3041301a refactor: clean up whitespace and improve code readability in various models and services 2025-01-17 19:24:48 +00:00
Simon Larsen
af77d191e3 feat: update triggeredByIncidentId and triggeredByAlertId fields to be nullable in relevant models 2025-01-17 19:23:09 +00:00
Simon Larsen
ad58125663 feat: add alert severity handling and triggeredByAlertId support in notification and execution logs 2025-01-17 19:09:22 +00:00
Simon Larsen
63650ba791 feat: add support for triggeredByAlertId in OnCallDutyPolicyExecutionLogTimeline and related services 2025-01-17 18:42:20 +00:00
Simon Larsen
1c5a434ee3 feat: add triggeredByAlertId relation to OnCallDutyPolicyExecutionLogTimeline, UserOnCallLog, and UserOnCallLogTimeline 2025-01-17 15:58:27 +00:00
Simon Larsen
102e64224f fix: remove unnecessary whitespace and improve error logging in alert, billing, incident, and scheduled maintenance feed services 2025-01-17 15:41:07 +00:00
Simon Larsen
854fe3084a fix: refactor alert, incident, and scheduled maintenance feed services to improve error handling and logging 2025-01-17 15:39:51 +00:00
Simon Larsen
b6c6186625 fix: remove unnecessary trace logging in BillingService when changing plan 2025-01-17 15:18:23 +00:00
Simon Larsen
92bdd5cf03 fix: improve clarity of reminder notification message for scheduled maintenance events 2025-01-17 15:14:02 +00:00
Simon Larsen
c2e78d122a fix: update property name from 'id' to '_id' in incident and scheduled maintenance note services 2025-01-17 15:10:20 +00:00
Simon Larsen
bfc061ad47 feat: add isRoot property to props in incident and scheduled maintenance note services 2025-01-17 15:08:21 +00:00
Simon Larsen
98302a887a fix: correct spelling of "scheduled maintenance" in markdown logs and notifications 2025-01-17 15:01:44 +00:00
Simon Larsen
743db411d5 refactor: add type annotations for subscription status checks in BillingInvoiceService and ProjectUtil 2025-01-17 13:30:57 +00:00
Simon Larsen
9537a9a13a feat: implement subscription status refresh logic with mutex handling and logging enhancements 2025-01-17 13:17:44 +00:00
Simon Larsen
0931705d6a feat: implement subscription status refresh logic in BillingInvoiceService and UserAPI 2025-01-17 12:23:01 +00:00
Simon Larsen
6bfd9b657a refactor: improve logging formatting in SendSubscriberRemindersOnEventScheduled job 2025-01-16 22:53:17 +00:00
Simon Larsen
493aef5b05 feat: enhance subscriber notification system with reminder notifications and improved logging 2025-01-16 21:21:49 +00:00
Simon Larsen
185f70e893 refactor: clean up code formatting and improve readability in Scheduled Maintenance components 2025-01-16 21:06:26 +00:00
Simon Larsen
db2ecde486 feat: add notification logging for scheduled maintenance note postings 2025-01-16 20:45:16 +00:00
Simon Larsen
ff3b7edec8 feat: enhance Scheduled Maintenance feed with subscriber and owner notification events 2025-01-16 20:42:09 +00:00
Simon Larsen
968b050d13 feat: implement onUpdateSuccess for internal and public notes in scheduled maintenance services 2025-01-16 20:07:52 +00:00
Simon Larsen
4328f7fc40 feat: add Scheduled Maintenance Description page and update routing 2025-01-16 16:55:26 +00:00
Simon Larsen
6ae3c28b8b feat: update ScheduledMaintenanceFeed event types and integrate ScheduledMaintenanceFeedElement in view 2025-01-16 16:25:33 +00:00
Simon Larsen
8be022e34f refactor: clean up state initialization and formatting in IncidentFeed component 2025-01-16 13:27:31 +00:00
Simon Larsen
ce6938396a feat: add modals for creating public and private incident notes 2025-01-16 13:25:32 +00:00
Simon Larsen
537e2d02e7 feat: enhance incident update permissions and enable root cause editing 2025-01-16 13:07:27 +00:00
Simon Larsen
80b9e48771 fix: remove space before incident number in IncidentsTable and IncidentView components 2025-01-16 12:57:49 +00:00
Simon Larsen
e0c3437c45 feat: implement otel-collector deployment with configurable replica count 2025-01-16 12:54:43 +00:00
Simon Larsen
e5df15a53e test: update expected value for ColumnLength.Color to reflect changes 2025-01-15 21:09:53 +00:00
Simon Larsen
a0f6e979b8 refactor: enhance readability by restructuring Feed and FeedItem components 2025-01-15 20:36:18 +00:00
Simon Larsen
e20624a635 refactor: invert isLastItem condition for rendering FeedItem separator 2025-01-15 20:29:16 +00:00
Simon Larsen
800583ddde refactor: enforce isLastItem prop as required in FeedItem component 2025-01-15 20:29:02 +00:00
Simon Larsen
f0bc71bee4 refactor: improve code readability and structure in OnCallDutyPolicyExecutionLog services and Feed components 2025-01-15 20:26:30 +00:00
Simon Larsen
ba0dd4f2b0 refactor: add display color handling by OnCallDutyPolicy status and update notification displayColor logic 2025-01-15 20:23:11 +00:00
Simon Larsen
63b560ad93 refactor: improve markdown formatting in notifications and update query id handling 2025-01-15 20:20:36 +00:00
Simon Larsen
ae0553a1e5 refactor: update IncidentFeed and OnCallDutyPolicyExecutionLogTimeline services for improved type handling and logging 2025-01-15 19:48:00 +00:00
Simon Larsen
fd4e2737e5 refactor: enhance notification messages to include incident state details and public note content 2025-01-15 19:23:57 +00:00
Simon Larsen
15f18c6d4f refactor: enhance notification messages and add projectId to relevant data structures 2025-01-15 18:52:35 +00:00
Simon Larsen
a84e32fe1b refactor: enhance logging and improve incident feed notification messages across multiple services 2025-01-15 18:37:18 +00:00
Simon Larsen
c09d97310f refactor: update ProgressButtons and ChangeIncidentState components to support completedStepId and improve click handling 2025-01-15 17:35:33 +00:00
Simon Larsen
782eb45eb3 refactor: improve formatting and consistency in multiple components 2025-01-14 21:20:21 +00:00
Simon Larsen
fb37da0aca refactor: update ErrorMessage component to use 'message' prop instead of 'error' across multiple components 2025-01-14 21:16:17 +00:00
Simon Larsen
ae2608e66f refactor: update ErrorMessage component usage to use 'message' prop instead of 'error' across multiple files 2025-01-14 21:01:40 +00:00
Simon Larsen
29565bc24c refactor: clean up unnecessary whitespace and improve code formatting across multiple files 2025-01-14 19:35:54 +00:00
Simon Larsen
da7860fc3f feat: add new incident view pages for Root Cause and Description; update icon properties and breadcrumb links 2025-01-14 19:35:39 +00:00
Simon Larsen
0375e8c568 refactor: improve code formatting in ProgressButtonItem and IncidentFeed components for better readability 2025-01-14 19:22:09 +00:00
Simon Larsen
60c53b32e6 refactor: update ProgressButtonItem and ProgressButtons components for improved structure and readability; enhance error handling in IncidentFeed 2025-01-14 19:21:59 +00:00
Simon Larsen
4d1797e9fa refactor: clean up code formatting and remove unnecessary whitespace in various files 2025-01-14 18:16:51 +00:00
Simon Larsen
1ff4bde7b9 feat: enhance incident feed markdown for OnCallDutyPolicyExecutionLogTimeline with detailed alert information 2025-01-14 18:13:40 +00:00
Simon Larsen
fae6d89a18 feat: add OnCallNotification event type to IncidentFeed and implement related handling in OnCallDutyPolicyExecutionLogTimelineService 2025-01-14 18:09:30 +00:00
Simon Larsen
aa429abe01 feat: implement ProgressButtons and ProgressButtonItem components for enhanced step navigation 2025-01-14 16:01:56 +00:00
Simon Larsen
203763aa95 feat: add OnCallPolicy event type to IncidentFeed and implement related feed updates in OnCallDutyPolicyExecutionLogService 2025-01-14 15:38:05 +00:00
Simon Larsen
0b69ae195f feat: implement onBeforeDelete and onDeleteSuccess methods to handle OwnerTeamRemoved events in IncidentOwnerTeamService 2025-01-14 14:47:28 +00:00
Simon Larsen
0756a43d62 feat: add OwnerUserRemoved and OwnerTeamRemoved event types to IncidentFeed; update feedInfoInMarkdown and improve icon handling 2025-01-14 14:45:32 +00:00
Simon Larsen
13eb3205a2 feat: add RootCause and RemediationNotes event types to IncidentFeed; update feedInfoInMarkdown formatting and icons 2025-01-14 14:12:51 +00:00
Simon Larsen
9dcd295fd0 feat: update incident feed event types for owner additions and enhance related services 2025-01-14 13:59:24 +00:00
Simon Larsen
1fb84ea302 fix: update incidentId references and improve notification messages for clarity 2025-01-14 13:43:31 +00:00
Simon Larsen
53ea3d32dc feat: update incident feed colors and improve notification messages; add refresh button to IncidentFeedElement 2025-01-14 12:36:52 +00:00
Simon Larsen
5c9ec28a4e fix: format feedInfoInMarkdown for better readability in IncidentService 2025-01-14 12:26:30 +00:00
Simon Larsen
04c2293378 feat: add postedAt field to IncidentFeed, AlertFeed, and ScheduledMaintenanceFeed; update services to set postedAt on creation 2025-01-14 12:15:49 +00:00
Simon Larsen
6c672c541a feat: include createdByUserId in IncidentFeed creation for better tracking of incident authors 2025-01-14 11:04:21 +00:00
Simon Larsen
169db73704 fix: remove margin from no items message in Feed component for better layout 2025-01-14 11:01:10 +00:00
Simon Larsen
e980f00f1c feat: add noItemsMessage prop to Feed component and update IncidentFeedElement to display error message when no items are present 2025-01-14 11:00:07 +00:00
Simon Larsen
66a594ed99 feat: replace Feed component with IncidentFeedElement in IncidentView 2025-01-14 10:19:43 +00:00
Simon Larsen
52c35c1e4d feat: update userId handling in IncidentFeed and AlertFeed services; increase LIMIT_PER_PROJECT to 10000; refactor User class to UserUtil; add IncidentFeedElement component 2025-01-13 18:39:06 +00:00
Simon Larsen
caa4103b48 feat: add userId field to AlertFeed, IncidentFeed, and ScheduledMaintenanceFeed services 2025-01-13 17:28:44 +00:00
Simon Larsen
f6069ca4a7 feat: remove tls.verify option from Fluent Bit configuration 2025-01-13 17:22:48 +00:00
Simon Larsen
f519748c44 feat: add userId field and relationship to AlertFeed, IncidentFeed, and ScheduledMaintenanceFeed models 2025-01-13 17:19:37 +00:00
Simon Larsen
27de0f0ddb feat: update displayColor column length to 10 for AlertFeed, IncidentFeed, and ScheduledMaintenanceFeed 2025-01-13 17:14:36 +00:00
Simon Larsen
5426c22740 feat: update moreInformationInMarkdown fields to be optional in IncidentFeed, AlertFeed, and ScheduledMaintenanceFeed 2025-01-13 17:00:46 +00:00
Simon Larsen
a55d4d1e02 refactor: format migration name and clean up up/down methods for consistency 2025-01-13 16:20:51 +00:00
Simon Larsen
2f65b1ee82 feat: add migration to drop IncidentLog, AlertLog, and ScheduledMaintenanceLog tables 2025-01-13 15:04:00 +00:00
Simon Larsen
730dc56316 feat: add migration for IncidentFeed, AlertFeed, and ScheduledMaintenanceFeed tables 2025-01-13 14:59:13 +00:00
Simon Larsen
101e697a12 refactor: update BaseAPI instantiation for ScheduledMaintenanceFeed to improve type clarity 2025-01-13 14:56:18 +00:00
Simon Larsen
1c1488bca5 refactor: replace IncidentLogService with IncidentFeedService in various services 2025-01-13 14:52:55 +00:00
Simon Larsen
0e74adbd08 refactor: simplify FeedItem component and clean up IncidentView layout 2025-01-13 14:11:04 +00:00
Simon Larsen
35947b4010 fix: remove redundant empty line in IncidentView component 2025-01-13 13:27:06 +00:00
Simon Larsen
b304ceddbb feat: add Incident Feed component to display incident updates 2025-01-13 11:25:52 +00:00
Simon Larsen
cba6c48673 fix: update API request method from GET to POST in public-api documentation 2025-01-13 11:12:04 +00:00
Simon Larsen
63b40cde75 fix: update titles for subscription fields in EmailSubscribers component 2025-01-13 10:54:26 +00:00
Simon Larsen
439f2e87a2 feat: add subscription confirmation field to EmailSubscribers component 2025-01-13 10:53:18 +00:00
Simon Larsen
fc0869d9fe fix: correct query merging order in BaseModelTable component 2025-01-13 10:50:50 +00:00
Simon Larsen
fb5646e8c2 feat: update incident log event type and add logging for subscriber notifications in Incident services 2025-01-13 10:37:45 +00:00
Simon Larsen
7538a47be5 fix: update userName type to string and ensure proper string conversion in IncidentNote services 2025-01-13 08:50:31 +00:00
Simon Larsen
8568cc0c89 feat: implement logging for internal and public notes creation in IncidentNote services 2025-01-13 08:48:58 +00:00
Simon Larsen
2457de9757 feat: update IncidentLog and AlertLog models to use displayColor and event type enums 2025-01-12 18:21:08 +00:00
Simon Larsen
a6859631ae feat: add validation for required fields in AlertLogService, IncidentLogService, and ScheduledMaintenanceLogService 2025-01-12 17:50:45 +00:00
Simon Larsen
e737444c52 feat: add severity fields to AlertLog, IncidentLog, and ScheduledMaintenanceLog models 2025-01-12 17:40:25 +00:00
Simon Larsen
b4a2726c81 refactor: improve code formatting and readability in BaseAPI and IncidentView 2025-01-12 14:57:17 +00:00
Simon Larsen
5fc60491ff feat: reorder fields in IncidentView to improve layout and visibility of Incident ID 2025-01-12 14:53:12 +00:00
Simon Larsen
a7558535a6 feat: add IncidentLogService, AlertLogService, and ScheduledMaintenanceLogService to BaseAPI 2025-01-12 13:28:36 +00:00
Simon Larsen
408d06edb9 feat: add AlertLogService, IncidentLogService, and ScheduledMaintenanceLogService; update services index 2025-01-12 12:02:25 +00:00
Simon Larsen
87be913388 feat: enhance filtering logic to support numeric values in BaseModelTable 2025-01-12 11:52:33 +00:00
Simon Larsen
1a034abe96 feat: add NumberFilter component and integrate it into FiltersForm 2025-01-12 11:45:02 +00:00
Simon Larsen
19bdfd66b9 docs: update public API documentation to include overallStatus object details 2025-01-12 10:36:46 +00:00
Simon Larsen
982d051329 feat: implement mutex for incident creation and improve incident number handling 2025-01-12 10:35:04 +00:00
Simon Larsen
b66b1db2cb feat: add Incident Number column to IncidentsTable and IncidentView components 2025-01-12 10:19:38 +00:00
Simon Larsen
12e67a065d feat: add incidentNumber field to Incident model and implement data migration for existing incidents 2025-01-12 10:08:48 +00:00
Simon Larsen
1f3cdc08ac feat: add incidentNumber field to Incident model and implement logic for auto-incrementing incident numbers 2025-01-12 10:03:28 +00:00
Simon Larsen
5ebcba9f46 refactor: improve code readability in StatusPageAPI and Overview components 2025-01-10 14:44:31 +00:00
Simon Larsen
15e49c1b45 feat: implement overall monitor status calculation and update Overview component 2025-01-10 14:40:42 +00:00
Simon Larsen
b71a657dea feat: update API documentation to reflect POST method for status page endpoints 2025-01-09 18:38:38 +00:00
Simon Larsen
72e573bbc4 Merge branch 'release' 2025-01-09 14:32:47 +00:00
Simon Larsen
2113ffefd9 feat: refactor ScheduledMaintenanceLog model and migration for improved readability and structure 2025-01-09 14:32:43 +00:00
Simon Larsen
8da42884c2 feat: add documentation for using Monitor Secrets in custom and synthetic monitors 2025-01-09 14:30:24 +00:00
Simon Larsen
e14c54c6cc Merge branch 'release' 2025-01-08 19:48:16 +00:00
Simon Larsen
10a199f3f5 feat: add IncidentLog and ScheduledMaintenanceLog tables with migrations 2025-01-08 19:47:50 +00:00
Simon Larsen
2df97392b2 feat: enhance server monitor queries by integrating active project status checks 2025-01-08 18:54:06 +00:00
Simon Larsen
fcd2ecd118 feat: improve server monitor request handling by refining query and response logic 2025-01-08 18:41:41 +00:00
Simon Larsen
e2e5533229 Merge branch 'release' 2025-01-08 17:43:00 +00:00
Simon Larsen
cf01fce011 feat: add uninstall instructions for OneUptime in documentation 2025-01-08 17:18:51 +00:00
Simon Larsen
100152ecc1 feat: update API endpoint URLs in Public Status Page documentation 2025-01-08 17:12:45 +00:00
Simon Larsen
7b68c0b3c0 feat: refactor permission handling by extracting getFieldPermissions function 2025-01-07 18:59:34 +00:00
Simon Larsen
a7ad9b752b feat: fix Clickhouse configuration to use default port if not specified 2025-01-06 20:10:59 +00:00
Simon Larsen
2e3ed42723 feat: add Public Status Page API documentation 2025-01-06 12:43:29 +00:00
Simon Larsen
864e44d1a2 feat: add "Status Pages" section with link to Public API documentation 2025-01-06 12:40:52 +00:00
Simon Larsen
08cdb33e6e feat: remove redundant MYENVVAR environment variable from installer templates 2025-01-06 12:39:17 +00:00
Simon Larsen
27647f529f feat: rename workflow step to clarify NPM package publishing 2025-01-06 08:30:49 +00:00
Simon Larsen
4021650ea5 feat: add MYENVVAR environment variable to installer for amd64 template 2025-01-06 08:27:01 +00:00
Simon Larsen
6a9f76c656 feat: add environment variable MYENVVAR to installer for arm64 template 2025-01-06 08:26:43 +00:00
Simon Larsen
c3bba74107 feat: update product name for amd64 and remove unnecessary custom actions from installer 2025-01-03 17:15:25 +00:00
Simon Larsen
16b9d4794e feat: enhance error handling in SSO login process and improve response structure 2025-01-03 16:19:23 +00:00
Simon Larsen
22e16d5c5b feat: update documentation to include proxy configuration for agent setup 2025-01-03 15:28:37 +00:00
Simon Larsen
ef340e5fa0 feat: improve error logging for secret key validation and add proxy support for HTTP requests 2025-01-03 15:22:35 +00:00
Simon Larsen
20aff38458 feat: enhance agent configuration logging and save proxy URL 2025-01-03 15:08:57 +00:00
Simon Larsen
16a1051280 feat: add proxy configuration support to agent and update related functions 2025-01-03 14:55:16 +00:00
Simon Larsen
fe9d3d3020 Add proxy 2025-01-03 14:21:47 +00:00
Simon Larsen
a0c0041cbd feat: implement default logging to file with fallback to console 2025-01-03 13:31:59 +00:00
Simon Larsen
d755c62a51 chore: update README for build instructions and remove unused dependency 2025-01-03 10:04:11 +00:00
Simon Larsen
5756623f45 fix: improve error handling and logging for metrics ingestion and secret key verification 2025-01-03 09:47:35 +00:00
Simon Larsen
8247f504c4 fix: correct formatting of Redis IP family value in Helm chart templates 2025-01-01 18:46:25 +00:00
Simon Larsen
f05b0a15ee feat: add conditional logic for Redis IP family in Helm chart templates 2025-01-01 18:42:38 +00:00
Simon Larsen
1abf1df1ee refactor: format PORT initialization and improve import structure in Config and Index 2025-01-01 18:24:30 +00:00
Simon Larsen
f1afab0b52 feat: add configurable port for probe services and update initialization 2025-01-01 18:04:19 +00:00
Simon Larsen
a0d33bf9c1 feat: initialize server with a specific port using Port type in Probe 2025-01-01 17:03:13 +00:00
Simon Larsen
7c16fa7b42 refactor: update ClickhouseConfig to use Hostname type for host configuration 2025-01-01 16:37:12 +00:00
Simon Larsen
5ba526d12e refactor: remove outdated comments and improve context object in VMRunner 2025-01-01 16:11:19 +00:00
Simon Larsen
92174be7fd docs: enhance documentation with available objects in Playwright context and error handling for browser closure 2025-01-01 15:34:10 +00:00
Simon Larsen
ece451b660 refactor: remove unnecessary UI reference and streamline thank you message in installation templates 2024-12-24 21:09:36 +00:00
Simon Larsen
5ca740b43c feat: add custom action to set PATH environment variable and show thank you message during installation 2024-12-24 20:55:16 +00:00
Simon Larsen
70aae7c59a fix: update RedisIPFamily initialization to handle undefined environment variable 2024-12-24 20:13:21 +00:00
Simon Larsen
bb543ef010 Merge pull request #1773 from diabolocom/redis-ipv6
Feature: Allow to set Redis IP Family
2024-12-24 20:09:59 +00:00
Simon Larsen
64bba9246b Add thank you message and UI reference to installation templates 2024-12-24 20:07:08 +00:00
Simon Larsen
511987bd70 Add PATH environment variable setting in Windows installer templates 2024-12-24 20:03:40 +00:00
Jules Lefebvre
19162504c8 feat(helm): add externalRedis.ipFamily configuration
Add the `externalRedis.ipFamily` values to set `REDIS_IP_FAMILY environmental variable
2024-12-24 13:08:15 +01:00
Jules Lefebvre
96f5173fb9 feat(docker): allow to chose redis ip family
Add the `REDIS_IP_FAMILY` to the default docker environment variables
2024-12-24 13:08:04 +01:00
Jules Lefebvre
8704f47b44 feat(common/infra): allow to chose redis ip familly
Introduce a new environment variable (`REDIS_IP_FAMILY`) to choose witch version
of the IP protocol to use in Redis.
2024-12-24 13:06:39 +01:00
Simon Larsen
45803a8cd2 Fix path separators in build-msi.sh for consistency across platforms 2024-12-23 20:19:11 +00:00
Simon Larsen
c04c2a3563 Fix path separators in build-msi.sh for Windows compatibility 2024-12-23 19:10:41 +00:00
Simon Larsen
e61e7f3ba0 Update file identifiers in Windows installer templates for Infrastructure Agent 2024-12-23 18:43:33 +00:00
Simon Larsen
e438050f6e Fix path separators in build-msi.sh for Windows compatibility 2024-12-23 18:42:23 +00:00
Simon Larsen
9601bdec93 Update product names and descriptions in installer templates for consistency 2024-12-23 18:31:56 +00:00
Simon Larsen
c631dcfd44 Remove unnecessary whitespace in CustomSMTPTable component 2024-12-23 18:29:01 +00:00
Simon Larsen
4cabd2562a Reduce job duration from 1 minute to 30 seconds in InfrastructureAgent 2024-12-23 18:22:03 +00:00
Simon Larsen
09e997c104 Add noValueMessage prop to description fields across multiple components 2024-12-23 17:54:27 +00:00
Simon Larsen
eee787be1c Update description fields to be optional across multiple components 2024-12-20 17:22:05 +00:00
Simon Larsen
c9b0d4fbec Fix binary paths in build script for MSI to remove leading dot 2024-12-20 16:58:00 +00:00
Simon Larsen
946f82f978 Add debug logging to server monitor criteria and comparison functions 2024-12-20 16:23:34 +00:00
Simon Larsen
8fc3fe4a98 Increase offline check duration from 2 to 3 minutes in server monitor criteria 2024-12-20 16:16:25 +00:00
Simon Larsen
3d321a038b Add infrastructure agent deployment workflow with GoReleaser and artifact upload 2024-12-20 16:00:56 +00:00
Simon Larsen
ef06d47619 Fix binary paths in build script for MSI to remove leading dot 2024-12-20 15:55:46 +00:00
Simon Larsen
c8a966a2f7 Enhance server monitor functionality by adding serverMonitorResponse handling and improving hostname resolution 2024-12-20 15:48:32 +00:00
Simon Larsen
32ffdf9174 Consolidate package installation in build script for MSI 2024-12-20 14:54:22 +00:00
Simon Larsen
d482cb00a9 Fix typo in form step title from "Baisc Info" to "Basic Info" in SSO pages 2024-12-20 13:59:20 +00:00
Simon Larsen
6286b8bf4c Update output directory in build script for MSI to a more general path 2024-12-20 13:58:48 +00:00
Simon Larsen
b264f4a6b9 Add MSI image release step to GitHub Actions and update build script for dependencies 2024-12-20 12:10:58 +00:00
Simon Larsen
ec7d5fe5c2 Update ARM64 binary path in MSI build script to reflect new version structure 2024-12-20 12:08:47 +00:00
Simon Larsen
4b9d770030 Update Windows installer templates for arm64: enhance XML structure, update product details, and adjust file references 2024-12-19 20:38:24 +00:00
Simon Larsen
a8100e9b01 Refactor Windows installer template for arm64: update XML structure, improve metadata, and enhance component definitions 2024-12-19 20:37:35 +00:00
Simon Larsen
b43e892295 Update GoReleaser to v6.1.0 and increment version in configuration 2024-12-19 20:14:30 +00:00
Simon Larsen
663f151051 Add MSI build script and templates for Windows infrastructure agent 2024-12-19 19:44:39 +00:00
Simon Larsen
282373b654 Update server monitor criteria and request handling for accurate time tracking 2024-12-19 18:10:15 +00:00
Simon Larsen
43faeb6e32 Update CheckOnlineStatus to use three minutes ago for server monitor queries 2024-12-19 17:58:25 +00:00
Simon Larsen
8180fcf386 Update metric view data handling in MonitorMetrics component 2024-12-19 17:49:38 +00:00
Simon Larsen
e2cbd4d0ac Refactor loading and error handling in MonitorMetrics component 2024-12-19 17:31:27 +00:00
Simon Larsen
084c259197 Update report settings to clarify email notifications for subscribers 2024-12-17 19:16:04 +00:00
Simon Larsen
6ecd709f29 Add NFPM configuration for packaging and install step in release workflow 2024-12-17 18:56:27 +00:00
Simon Larsen
b935cef5a0 Fix typo in subscription confirmation message 2024-12-17 17:41:44 +00:00
Simon Larsen
1d5e838afa Update subscription success message to include email confirmation instructions 2024-12-17 17:35:38 +00:00
Simon Larsen
90ca4b68cf Add email notification for new subscribers and improve subscription confirmation handling 2024-12-17 15:01:26 +00:00
Simon Larsen
031bd26b09 Update subscription confirmation to use 'verification-token' query parameter 2024-12-17 14:56:42 +00:00
Simon Larsen
1296f37081 Enhance subscription confirmation handling by updating permission controls and modifying email notification options 2024-12-17 14:41:31 +00:00
Simon Larsen
ba1a707156 Remove outdated IP addresses from the configuration documentation 2024-12-17 13:08:41 +00:00
Simon Larsen
d670cca559 Add subscription confirmation feature and enhance Pill component with tooltip support 2024-12-17 13:00:23 +00:00
Simon Larsen
f7e31a4f04 Add subscription confirmation handling and enhance Pill component with tooltip support 2024-12-17 12:50:02 +00:00
Simon Larsen
bb7917551f Add confirmation functionality for status page subscriptions and update related templates 2024-12-17 12:42:22 +00:00
Simon Larsen
53238aee40 Refactor date handling in AggregateUtil and XAxisUtil, and improve error handling in MetricView and IncidentView components 2024-12-16 18:17:01 +00:00
Simon Larsen
187d41e25f Refactor RollingTimePicker and MetricMonitorStepForm for improved state management and performance 2024-12-16 17:59:18 +00:00
Simon Larsen
56f79a91c1 Enhance IncidentView component with HeaderAlert for date display and improve metrics card layout 2024-12-16 16:57:04 +00:00
Simon Larsen
4dd6b5f32e Add MetricViewData interface and update imports across components 2024-12-16 16:53:38 +00:00
Simon Larsen
f48a5a650c Add metricAggregationType handling to MetricMonitorOptions and enhance CriteriaFilter component 2024-12-16 16:23:57 +00:00
Simon Larsen
09a2a31d2b Refactor evaluation type handling in CompareCriteria and update MetricMonitorOptions interface 2024-12-16 16:14:23 +00:00
Simon Larsen
5fd60094ab Add monitorStep parameter to MetricMonitorCriteria and enhance metric alias handling 2024-12-16 15:59:59 +00:00
Simon Larsen
0cfc9fbb56 Improve data handling and code readability in various components 2024-12-16 15:38:29 +00:00
Simon Larsen
2fc6200c47 Update chartCssClass in MetricMonitor components for consistent styling 2024-12-16 11:11:51 +00:00
Simon Larsen
437e5e7004 Enhance MetricMonitorPreview with rolling time selection and modal for improved user interaction 2024-12-16 11:08:40 +00:00
Simon Larsen
22e2c1f25c Uncomment Metrics monitor type in MonitorTypeHelper for clarity 2024-12-16 10:34:30 +00:00
Simon Larsen
4799ed0434 Fix typo in alert configuration key for consistency in Helm chart 2024-12-16 10:26:18 +00:00
Simon Larsen
0848dfc5d6 Refactor EnvironmentConfig and StatusPageService for improved readability and consistency 2024-12-16 10:25:26 +00:00
Simon Larsen
88cf2c3cb0 Add configuration options to disable automatic alert and incident creation 2024-12-16 09:57:24 +00:00
Simon Larsen
ca3855d109 Remove commented-out Metrics monitor type from MonitorTypeHelper for cleaner code 2024-12-13 15:55:52 +00:00
Simon Larsen
36570f3944 Refactor APIRequestCriteria to improve readability of response code check 2024-12-13 14:09:23 +00:00
Simon Larsen
df10a1900d Update APIRequestCriteria to include responseCode check for ResponseStatusCode validation 2024-12-13 14:06:43 +00:00
Simon Larsen
eca3408598 Update APIResponse interface to allow statusCode to be undefined for better error handling 2024-12-13 14:04:57 +00:00
Simon Larsen
9d1a2c40c7 Refactor MetricMonitorStepForm and MetricView to optimize state management and enhance data handling 2024-12-12 13:57:46 +00:00
Simon Larsen
cd58b72a9c Refactor MetricMonitorStepForm to eliminate unnecessary state management and streamline onChange handling 2024-12-12 13:17:00 +00:00
Simon Larsen
ceead6eaba Refactor StartAndEndDate and CriteriaFilter components for improved readability and consistency in type usage 2024-12-12 13:02:29 +00:00
Simon Larsen
45a665b004 Refactor DateFilter and MetricView components for consistency in value prop usage; improve formatting in various files 2024-12-12 12:58:20 +00:00
Simon Larsen
2dd1cd8453 Update chartCssClass for improved styling in MetricMonitorStepForm 2024-12-12 12:03:54 +00:00
Simon Larsen
8152a7f7ea Add hideCardInCharts prop and chartCssClass for enhanced styling in MetricMonitorStepForm 2024-12-12 12:02:09 +00:00
Simon Larsen
55d962eed7 Add chartCssClass prop to ChartGroup, MetricCharts, and MetricView for customizable styling 2024-12-12 11:55:48 +00:00
Simon Larsen
ebf5c83358 Merge branch 'master' of github.com:OneUptime/oneuptime 2024-12-12 11:28:57 +00:00
Simon Larsen
69e5fba5ff Add monitorStep prop to various components for improved data handling in monitoring forms 2024-12-12 11:15:00 +00:00
Simon Larsen
139ee62106 Add FieldLabelElement for metric selection in MetricMonitorStepForm 2024-12-12 10:36:47 +00:00
Simon Larsen
2d89431dc1 Merge pull request #1765 from ThoSt81/patch-1
Update SubscribedToStatusPage.hbs
2024-12-12 10:29:07 +00:00
ThoSt
d506e658f0 Update SubscribedToStatusPage.hbs
Remove InfoBlock which is identical to EmailTitle and thus messing up the template when send to the new subscriber.
2024-12-11 15:49:42 +01:00
Simon Larsen
180d02c53d Refactor MonitorMetrics and MetricExplorer components to streamline state management with MetricViewData and improve code readability 2024-12-11 14:01:31 +00:00
Simon Larsen
e500886b12 Refactor MetricMonitor components to utilize MetricViewData for improved state management and data handling 2024-12-11 13:57:15 +00:00
Simon Larsen
7f7bcbc0a3 Add FieldLabelElement for time range selection and refactor MetricView data handling in MetricExplorer 2024-12-11 13:51:43 +00:00
Simon Larsen
397231f1df Refactor MetricMonitorCriteria to improve type safety and enhance alias handling in data processing 2024-12-10 22:44:58 +00:00
Simon Larsen
f575afa151 Enhance MetricMonitorCriteria to support metric alias handling and improve data processing logic 2024-12-10 22:38:14 +00:00
Simon Larsen
b26cf4e876 Enhance Metric Monitor functionality by introducing MetricMonitorCriteria, updating MetricMonitorResponse, and refining telemetry monitoring logic 2024-12-10 19:37:24 +00:00
Simon Larsen
450488eb4f Refactor code for improved readability and consistency across Monitor components 2024-12-10 14:37:31 +00:00
Simon Larsen
14d3228786 Add Metric Monitor functionality with Rolling Time selection and preview 2024-12-10 14:32:54 +00:00
Simon Larsen
811fd24cd5 Merge branch 'master' of github.com:OneUptime/oneuptime 2024-12-10 10:25:21 +00:00
Simon Larsen
098fb5be78 Merge branch 'metrics-monitor' 2024-12-10 10:25:10 +00:00
Simon Larsen
837d065b81 Merge pull request #1761 from WillDaSilva/patch-1
Remove trailing whitespace in `fluentbit.md`
2024-12-10 10:16:09 +00:00
Simon Larsen
fe2b001c6d Improve error handling in OTelIngest API to provide clearer feedback on failures 2024-12-09 18:23:17 +00:00
Simon Larsen
b08c047da7 Add early empty success response to prevent timeouts in OTelIngest API 2024-12-09 18:12:50 +00:00
Simon Larsen
79ff8b1f82 Enable debug logging in telemetry configuration for improved diagnostics 2024-12-09 17:59:58 +00:00
Simon Larsen
7da47d6e16 Refactor response handling in OTelIngest API to ensure early success response is sent consistently 2024-12-09 17:08:50 +00:00
Simon Larsen
6e6f3c6c38 Add MetricMonitor support with criteria checks and response type 2024-12-09 17:03:24 +00:00
Simon Larsen
b3b3d9a0b7 Merge branch 'master' into metrics-monitor 2024-12-09 16:19:26 +00:00
Simon Larsen
16f0fe145a Enhance probe monitoring by introducing configurable retry limit and updating logic 2024-12-09 16:18:43 +00:00
Simon Larsen
eea7209aaf Remove unused imports and clean up whitespace in OTelIngest API 2024-12-09 15:38:51 +00:00
Simon Larsen
c4c93f1cc5 Refactor error handling in data processing module for improved clarity and maintainability 2024-12-09 15:34:25 +00:00
Simon Larsen
0d19f56519 Refactor monitor type helper methods and update side menu to reflect changes in metrics handling 2024-12-09 12:58:22 +00:00
Simon Larsen
85d0ded200 Remove commented-out telemetry indexing and billing logic from OTelIngest API 2024-12-09 12:52:27 +00:00
Simon Larsen
c5134f0dd7 Add default value for PROBE_MONITOR_RETRY_LIMIT in probe.yaml and update values.yaml 2024-12-09 10:32:55 +00:00
Simon Larsen
9e117f34d4 Add PROBE_MONITOR_RETRY_LIMIT environment variable and update monitor retry logic 2024-12-09 10:28:22 +00:00
Will Da Silva
72f994d079 Remove trailing whitespace in fluentbit.md 2024-12-06 19:31:16 -05:00
Simon Larsen
4a6edfa660 Enhance logging for mutex acquisition and release in Monitor API 2024-12-06 17:43:52 +00:00
Simon Larsen
a20c05adb2 Merge branch 'master' into release 2024-12-06 17:39:33 +00:00
Simon Larsen
a286aba432 Refactor Semaphore class to streamline lockOptions initialization 2024-12-06 17:39:12 +00:00
Simon Larsen
a3f1302e37 Add lockTimeout and acquireTimeout options in Monitor API semaphore 2024-12-06 17:36:17 +00:00
Simon Larsen
9393388cc5 Add acquireTimeout option and improve lock options in Semaphore class 2024-12-06 17:34:21 +00:00
Simon Larsen
d249fe16d9 Add Fluent Bit integration documentation and image tiles to Telemetry section 2024-12-06 16:33:11 +00:00
Simon Larsen
7f6223f4c8 Remove debugger statement and improve code formatting in telemetry ingestion 2024-12-06 12:04:14 +00:00
Simon Larsen
dc5e2c0d40 Update Fluent Bit documentation and configuration for OneUptime telemetry ingestion 2024-12-06 11:58:40 +00:00
Simon Larsen
26f6a14e93 Update OpenTelemetry configuration in Fluent Bit to use new host and secure settings 2024-12-05 18:21:53 +00:00
Simon Larsen
588de5ad27 Add Fluent Bit documentation and update configuration for telemetry ingestion 2024-12-05 18:06:23 +00:00
Simon Larsen
8734938a82 Enhance telemetry configuration in Fluent Bit and update OpenTelemetry request handling 2024-12-05 17:55:59 +00:00
Simon Larsen
06e7228041 Add HTTP input to Fluent Bit configuration and expose port 8889 for telemetry ingestion 2024-12-05 14:43:39 +00:00
Simon Larsen
38ad431b17 Update Fluent Bit Docker configuration and remove obsolete YAML file 2024-12-04 20:09:16 +00:00
Simon Larsen
e0f5d8f1f2 Add Fluent Bit configuration and update probe intervals in Helm chart 2024-12-04 19:23:59 +00:00
Simon Larsen
e947d21060 Add random sleep interval to FetchList worker to reduce server load 2024-12-04 15:57:02 +00:00
Simon Larsen
41d347a1a7 Increase Node.js memory limit in start script for improved performance 2024-12-04 13:59:32 +00:00
Simon Larsen
5dc6ab6bb2 Update Alert and Incident metric type strings to use hyphens for consistency 2024-12-04 13:23:16 +00:00
Simon Larsen
3492e54a9b Refactor error logging and improve code formatting in AlertStateTimelineService and IncidentService 2024-12-04 13:12:49 +00:00
Simon Larsen
adf92f3dc9 Add Alert and Incident metric types, enhance Metric model, and improve error logging in services 2024-12-04 13:02:17 +00:00
Simon Larsen
02b9f77e7c Add new service types to Metric model and clean up IncidentService 2024-12-04 11:35:25 +00:00
Simon Larsen
396f435755 Add cron jobs to delete incident and alert metrics older than 180 days 2024-12-04 11:16:53 +00:00
Simon Larsen
5796db03f9 Add Incident and Alert service types to Metric model 2024-12-04 11:03:16 +00:00
Simon Larsen
4029d72967 Send early empty success response in OTelIngest to prevent timeouts 2024-12-04 10:39:54 +00:00
Simon Larsen
8d2cf500a0 Update OpenTelemetry endpoint in documentation for accuracy 2024-12-04 10:34:01 +00:00
Simon Larsen
5bfc954076 Refactor isSaving initialization in DashboardToolbar for clearer logic 2024-12-03 18:07:44 +00:00
Simon Larsen
769f468273 Add Loader component to DashboardToolbar for improved saving feedback 2024-12-03 18:04:21 +00:00
Simon Larsen
8d75128603 Add debug logging for updated items in DatabaseService and improve ObjectID equality check 2024-12-03 17:59:16 +00:00
Simon Larsen
ba4795e4b3 Serialize dashboardViewConfig in DashboardViewer for consistent data handling 2024-12-03 17:43:53 +00:00
Simon Larsen
65f9f7c830 Fix key assignment in MoreMenuItem to ensure unique keys for list items 2024-12-03 17:21:28 +00:00
Simon Larsen
99e56f9312 Fix mouse event coordinates in DashboardBaseComponent for accurate positioning 2024-12-03 17:14:36 +00:00
Simon Larsen
b380e6d770 Refactor ConfirmModal and DashboardToolbar for improved code readability and consistency 2024-12-03 16:36:02 +00:00
Simon Larsen
9d0add605d Add closeButtonText prop to modal components; implement confirmation modal for unsaved changes in DashboardToolbar 2024-12-03 16:31:32 +00:00
Simon Larsen
d4737841ce Enhance DashboardChartComponent to improve error handling and display an icon on error; refactor metric query configuration for better readability 2024-12-03 16:25:11 +00:00
Simon Larsen
d6f9971cb6 Refactor DashboardChartComponent and DashboardValueComponent for improved readability; add unit display in DashboardValueComponent 2024-12-03 14:31:22 +00:00
Simon Larsen
8e4733b72f Refactor Dashboard components and BasicForm for improved state management and code readability 2024-12-03 14:18:35 +00:00
Simon Larsen
07c387289a Enhance BasicForm and ArgumentsForm to support dynamic values; update Dashboard components to use ComponentLoader for improved loading state handling 2024-12-03 13:57:05 +00:00
Simon Larsen
956f786d1a Merge branch 'master' of github.com:OneUptime/oneuptime 2024-12-03 13:15:32 +00:00
Simon Larsen
56b2fbfb77 Refactor DashboardTextComponent and DashboardToolbar to improve layout and remove fullscreen state management; enhance DashboardViewer for better fullscreen handling 2024-12-03 13:15:30 +00:00
Simon Larsen
bba67afc36 Merge pull request #1758 from golyalpha/patch-1
Fix alert name links opening invalid/broken page
2024-12-03 13:11:56 +00:00
golyalpha
d1dd0d7774 Update Alert.tsx
Fix route on Alert name link in list of alerts
2024-12-02 21:06:17 +01:00
Simon Larsen
c7c6a54155 Enhance DashboardValueComponent and DashboardTextComponent for improved layout and error handling; add metric query configuration and adjust title height calculation 2024-12-02 18:29:10 +00:00
Simon Larsen
12fc9863d2 Refactor DashboardTextComponent and DashboardValueComponent to use consistent decimal notation for height calculations, improving code clarity 2024-12-02 18:16:49 +00:00
Simon Larsen
4ec718a966 Update DashboardValueComponent to dynamically set font sizes based on component height for improved text display 2024-12-02 18:14:50 +00:00
Simon Larsen
91b2a6e44f Update DashboardTextComponent to adjust text height calculation and apply it as font size for better text display 2024-12-02 18:13:11 +00:00
Simon Larsen
aa2e79bd82 Refactor MetricAlias component layout for improved responsiveness; adjust input widths for better alignment 2024-12-02 18:06:58 +00:00
Simon Larsen
cc62b26002 Refactor DashboardChartComponent and related components for improved code readability and maintainability; add optional title and description properties for enhanced chart configuration 2024-12-02 18:03:38 +00:00
Simon Larsen
6113b10c74 Update DashboardChartComponent to support dynamic legend and legendUnit properties for improved chart configuration 2024-12-02 18:00:57 +00:00
Simon Larsen
52a952f41e Add legendUnit property to DashboardChartComponent and MetricExplorer for enhanced chart configuration 2024-12-02 17:57:34 +00:00
Simon Larsen
257b4283e1 Add legend and legendUnit properties to MetricAliasData; update DashboardChartComponent and related components for legend display and configuration 2024-12-02 17:55:39 +00:00
Simon Larsen
31b4eba73f Update MetricAliasData to allow optional properties; enhance DashboardChartComponent to include chart title and description 2024-12-02 17:46:28 +00:00
Simon Larsen
0dec6255f6 Add optional properties for chart customization in DashboardChartComponent; enhance error handling in Dashboard components 2024-12-02 17:38:00 +00:00
Simon Larsen
baabf84951 Refactor Dashboard components for improved readability; update DashboardTextComponent to dynamically set height and fix formatting in DashboardValueComponent 2024-12-02 17:16:12 +00:00
Simon Larsen
359c36e023 Refactor MetricCharts and LineChart components for improved readability; update DashboardChartComponent to handle dynamic height and adjust DashboardValueComponent for new metric query configuration 2024-12-02 16:37:32 +00:00
Simon Larsen
285fe7f524 Add heightInPx prop to ChartGroup, LineChart, and MetricCharts for dynamic height adjustment 2024-12-02 15:57:50 +00:00
Simon Larsen
093e8e5591 Refactor Dashboard components for improved readability and add hideCard prop to ChartGroup and MetricCharts 2024-12-02 15:42:34 +00:00
Simon Larsen
73ce957b57 Enhance MonitorResourceUtil to include monitorName in attributes and improve error handling in Dashboard components 2024-12-02 15:33:37 +00:00
Simon Larsen
5dbb80457a Fix typos in data retention references across multiple views 2024-11-30 19:02:26 +00:00
Simon Larsen
d53b2d0e1c Add dashboardStartAndEndDate prop to DashboardCanvas and DashboardViewer components 2024-11-29 19:20:53 +00:00
Simon Larsen
c4256a0dea Refactor Dashboard components for improved code consistency and readability 2024-11-29 19:17:47 +00:00
Simon Larsen
b8fc933acb Add start and end date handling to Dashboard components and implement metric result fetching 2024-11-29 19:03:34 +00:00
Simon Larsen
45d447bf2c Add ColorSwatch enum and update Dashboard date range handling 2024-11-29 18:13:58 +00:00
Simon Larsen
a0400be8cd Add start and end date selection functionality to Dashboard components 2024-11-29 17:29:12 +00:00
Simon Larsen
3688381d4a Add max height calculation to DashboardCanvas for improved rendering logic 2024-11-29 13:03:31 +00:00
Simon Larsen
1f5287c2e6 Refactor DuplicateModel component in Settings page for improved readability and consistency 2024-11-29 12:54:17 +00:00
Simon Larsen
3e97d6bba1 Add DuplicateModel component to Settings page for dashboard duplication functionality 2024-11-29 12:50:25 +00:00
Simon Larsen
32c0cbc4ad Add Settings page and update routing and breadcrumbs for dashboard 2024-11-29 12:47:34 +00:00
Simon Larsen
90f267105f Add MetricViewData interface and implement MetricCharts component for enhanced metrics visualization 2024-11-28 21:43:38 +00:00
Simon Larsen
eaa9a5f1a0 Make metricAliasData optional in MetricView component for improved safety and handling 2024-11-28 14:11:13 +00:00
Simon Larsen
70da661041 Update MetricQueryConfigData to make metricAliasData optional and refactor ArgumentsForm and MetricQueryConfig components for improved type handling and conditional rendering 2024-11-28 13:27:31 +00:00
Simon Larsen
b307a74319 Refactor dashboard component argument types and update metrics handling in DashboardCanvas and ComponentSettingsSideOver 2024-11-28 13:16:44 +00:00
Simon Larsen
5c2fa28fff Refactor dashboard components to utilize JSONFunctions for deserialization of dashboard view configurations 2024-11-28 11:50:15 +00:00
Simon Larsen
2f8495e5b5 Add telemetry services loading and filtering to TraceTable component 2024-11-27 13:19:15 +00:00
Simon Larsen
d3d9c46812 Add exception handling to SpanViewer component with detailed display of exceptions 2024-11-27 13:05:59 +00:00
Simon Larsen
9e50d068db Enhance Clickhouse connection handling with improved error responses and status checks 2024-11-27 11:24:30 +00:00
Simon Larsen
7232a3142c Remove unused APIException import from CRUD components for cleaner code 2024-11-27 10:43:19 +00:00
Simon Larsen
a1ca2e3f37 Refactor API component error handling to consistently use errorPort and return detailed error messages 2024-11-27 10:39:40 +00:00
Simon Larsen
a5d993b999 Remove unused load distribution logic in Monitor API 2024-11-27 10:24:36 +00:00
Simon Larsen
854be1ddeb Swap debug ports for OpenTelemetryIngest and Fluent Ingest configurations in launch.json 2024-11-26 17:55:10 +00:00
Simon Larsen
fe5b93f66e Add Project ID field to APIKeyView for enhanced project tracking 2024-11-26 17:09:31 +00:00
Simon Larsen
f259ddecd5 Update TraceTable terminology from "Trace" to "Span" for consistency in terminology 2024-11-26 17:07:52 +00:00
Simon Larsen
680be0e468 Add conditional fetching of aggregated results in MetricView based on hideQueryElements prop 2024-11-26 16:38:49 +00:00
Simon Larsen
488a2b0b57 Add modulo function to QueryHelper and random number generator to NumberUtil for load distribution in monitor fetching 2024-11-26 15:38:00 +00:00
Simon Larsen
e0871e6b16 Remove unnecessary blank lines in QueryHelper class for improved code clarity 2024-11-26 14:05:26 +00:00
Simon Larsen
ab5acdef09 Refactor XAxis precision methods for improved date rounding and remove random sorting method from QueryHelper 2024-11-26 14:04:30 +00:00
Simon Larsen
002c23b2a5 Disable Clickhouse status check in InfrastructureStatus for improved reliability 2024-11-26 13:17:10 +00:00
Simon Larsen
b10134fb30 Add random sorting method to QueryHelper and apply it in Monitor probe fetching 2024-11-26 09:04:19 +00:00
Simon Larsen
93027ec0ae Refactor string to number conversion in AnalyticsDatabaseService for improved readability 2024-11-25 19:10:36 +00:00
Simon Larsen
481b09531f Convert string values to numbers in AnalyticsDatabaseService for aggregate column processing 2024-11-25 19:05:20 +00:00
Simon Larsen
4da1dd3f6b Refactor incomingRequest initialization in CheckHeartbeat for clarity 2024-11-25 18:29:14 +00:00
Simon Larsen
661d44d6b0 Add incomingMonitorRequest to CheckHeartbeat and streamline request initialization 2024-11-25 18:28:30 +00:00
Simon Larsen
d6dacb6493 Update TelemetryException model to use VeryLongText type for message fields and add migration for database schema changes 2024-11-25 16:58:08 +00:00
Simon Larsen
0ad5ee5997 Prevent owner notification for the first monitor status timeline entry 2024-11-25 15:05:01 +00:00
Simon Larsen
5ad8f00388 Refactor validation messages for improved formatting and readability 2024-11-25 14:32:58 +00:00
Simon Larsen
450311de3c Refactor validation messages for improved readability and add visibility check for field validation 2024-11-25 14:32:25 +00:00
Simon Larsen
1bc4f07fa3 Update features table to include new items and adjust existing entries 2024-11-25 14:05:58 +00:00
Simon Larsen
d091c93bfc Increase default navigation timeout for status checks and add new probe ingest tests 2024-11-25 14:00:53 +00:00
Simon Larsen
2ff9b47f1c Refactor retryCount initialization across multiple modules for consistency 2024-11-25 13:53:43 +00:00
Simon Larsen
6b470e671f Implement retry mechanism for infrastructure status checks across multiple modules 2024-11-25 13:49:49 +00:00
Simon Larsen
14c9174e24 Add debug logging for database operations and update feature table with new items 2024-11-25 13:08:47 +00:00
Simon Larsen
e4beb13982 Increase timeoutSeconds for liveness and readiness probes in values.yaml 2024-11-23 07:48:29 +00:00
Simon Larsen
2b006e1765 Update Fluentd configuration with new endpoint and token for production environment 2024-11-22 18:41:37 +00:00
Simon Larsen
f45c7f8d30 Add Nginx location for incoming-request-ingest with proxy settings 2024-11-22 18:24:47 +00:00
Simon Larsen
e3a2f95fc2 Add Nginx locations for fluent-ingest and open-telemetry-ingest with proxy settings 2024-11-22 18:18:11 +00:00
Simon Larsen
d27c161665 Add OFF log level to ConfigLogLevel enum and update documentation in values.yaml 2024-11-22 13:00:06 +00:00
Simon Larsen
b9d6a69f00 Fix typo in upstream block name for incoming requests in Nginx configuration 2024-11-22 12:08:08 +00:00
Simon Larsen
fac334d58a Remove probe port configuration and update related references in Helm chart and Docker setup 2024-11-22 11:37:52 +00:00
Simon Larsen
a4913cc5bf Rename host option to url in ClickhouseConfig for clarity 2024-11-22 10:32:15 +00:00
Simon Larsen
0ad1a34e10 Remove unused import for EJS in FluentIngest index file 2024-11-22 10:28:52 +00:00
Simon Larsen
325fa0eb7a Add SERVER_OPEN_TELEMETRY_INGEST_HOSTNAME to Helm template and update tag replacement in change-release-to-test-tag script 2024-11-22 10:23:56 +00:00
Simon Larsen
c02c1e6808 Update test-release workflow to replace deprecated Docker image deployment step 2024-11-22 10:08:58 +00:00
Simon Larsen
96a4a17320 Remove probe-ingest Docker image deployment steps from test-release workflow 2024-11-21 20:10:19 +00:00
Simon Larsen
23c169c6a3 Update Helm templates to use consistent naming for replicaCount across ingest services 2024-11-21 19:58:47 +00:00
Simon Larsen
6c4a4cad50 Fix replicaCount reference in probe-ingest Helm template 2024-11-21 19:11:27 +00:00
Simon Larsen
34c1af08db Fix import path for FluentIngestAPI in Index.ts 2024-11-21 19:05:12 +00:00
Simon Larsen
128aec9869 Remove protobufjs dependency from ProbeIngest and IncomingRequestIngest; update probe.yaml for consistent service URL structure 2024-11-21 18:13:42 +00:00
Simon Larsen
4fc2029a61 Add backward compatibility for /ingestor route in Nginx and ProbeIngest; update Probe configuration for new URL structure 2024-11-21 17:53:35 +00:00
Simon Larsen
815ae7161d Rename Ingestor to ProbeIngest; update configurations, routes, and Docker support; add new request types and workflows 2024-11-21 17:18:22 +00:00
Simon Larsen
3a1f5c7120 Refactor OpenTelemetry Ingest Dockerfile and configuration; update environment variables and docker-compose for new service integration 2024-11-21 17:08:35 +00:00
Simon Larsen
eec51342de Add configuration files for OpenTelemetry Ingest, including .gitignore, .dockerignore, and nodemon.json; refactor code for consistency and clarity 2024-11-21 16:42:29 +00:00
Simon Larsen
945cef653c Add Incoming Request Ingest service with configuration, Docker support, and tests 2024-11-21 14:41:37 +00:00
Simon Larsen
93154aabc7 Remove FluentIngestAPI from Ingestor routes 2024-11-21 13:36:29 +00:00
Simon Larsen
9244e49e6b Add Fluent Ingest service with configuration, Docker support, and tests 2024-11-21 13:31:11 +00:00
Simon Larsen
74e43f0526 Add debug logging for Clickhouse connection status and fix indentation in nginx.yaml 2024-11-21 12:34:57 +00:00
Simon Larsen
1fba734fd0 Refactor health check configurations to use structured probes in values.yaml and templates 2024-11-21 12:11:17 +00:00
Simon Larsen
197e4e67e0 Merge pull request #1750 from golyalpha/master
Add startupProbe to deployments with healthchecks
2024-11-21 10:56:58 +00:00
Radek Goláň jr.
02afbb19be add startupProbe to deployments with healtchecks 2024-11-21 09:00:27 +01:00
Simon Larsen
972e6cb98f Add logging for infrastructure status checks in Status.ts 2024-11-20 21:33:32 +00:00
Simon Larsen
b14f918d59 Update ClickHouse dependency version to 6.3.2 in Chart.yaml and Chart.lock 2024-11-20 18:58:02 +00:00
Simon Larsen
c05d4a0eea Update live check method in StatusAPI to use liveCheck instead of readyCheck 2024-11-20 18:56:07 +00:00
Simon Larsen
3732a5c95f Remove unnecessary blank line in ProbeAuthorization class 2024-11-20 17:33:40 +00:00
Simon Larsen
1e0f6ff558 Add comment to explain URI encoding in getClusterKey method 2024-11-20 15:29:36 +00:00
Simon Larsen
6a361e5b87 Remove unused cluster key retrieval method from ProbeAuthorization middleware 2024-11-20 15:28:00 +00:00
Simon Larsen
c94ac75a6f Refactor ClusterKeyAuthorization to use class reference for cluster key retrieval 2024-11-20 15:14:34 +00:00
Simon Larsen
b49e40780a Remove unused ObjectID import from ClusterKeyAuthorization middleware 2024-11-20 14:29:48 +00:00
Simon Larsen
dd01fa0a3d Refactor ClusterKeyAuthorization to use a dedicated method for cluster key retrieval and simplify type handling 2024-11-20 14:26:36 +00:00
Simon Larsen
a2218b01d0 Add resourcesPreset configuration to Clickhouse settings in values.yaml 2024-11-20 08:36:35 +00:00
Simon Larsen
8d9d83d679 Downgrade Clickhouse dependency version to 6.1.0 in Chart.yaml and Chart.lock 2024-11-19 17:51:46 +00:00
Simon Larsen
546c74297f Consolidate Clickhouse client imports for improved readability 2024-11-19 17:21:16 +00:00
Simon Larsen
9fc1e73fd3 Add additional Clickhouse service ports for TCP, MySQL, and PostgreSQL 2024-11-19 13:49:32 +00:00
Simon Larsen
64e713f503 Update Clickhouse dependency version to 6.3.2 in Chart.yaml and Chart.lock 2024-11-19 11:26:01 +00:00
Simon Larsen
f254209410 Refactor AnalyticsDatabaseService and ClickhouseDatabase imports for improved clarity 2024-11-18 19:54:30 +00:00
Simon Larsen
2f738f8b58 Refactor Clickhouse configuration imports for improved clarity and type usage 2024-11-18 18:57:36 +00:00
Simon Larsen
e2da9b5bc3 Update @clickhouse/client and @clickhouse/client-common to version 1.8.1 2024-11-18 18:51:45 +00:00
Simon Larsen
04bfaf754a Add health check endpoints for global cache, analytics database, and database 2024-11-18 18:42:31 +00:00
Simon Larsen
ab328b0987 Simplify EmailTitle helper usage in SubscriberIncidentStateChanged template 2024-11-18 15:08:17 +00:00
Simon Larsen
521844a5ff Add liveness and readiness probe configuration options to Helm chart templates 2024-11-18 15:07:51 +00:00
Simon Larsen
c4096e7000 Refactor ArgumentsForm, DashboardView, and DashboardToolbar components for improved readability and consistency 2024-11-15 17:14:56 +00:00
Simon Larsen
8afe8cf7fb Comment out NavBarItem for Dashboards in NavBar component 2024-11-15 17:13:52 +00:00
Simon Larsen
fa8b52fa83 Add DashboardViewConfig type and enhance dashboard saving functionality with loading state 2024-11-15 17:13:18 +00:00
Simon Larsen
a8baa76096 Refactor Dashboard components by renaming and replacing DashboardUnit with BlankDashboardUnit for improved clarity and structure 2024-11-15 14:54:09 +00:00
Simon Larsen
8d5cef72b3 Refactor formatting and spacing in Dashboard components for improved readability 2024-11-15 14:07:51 +00:00
Simon Larsen
ef0f0ffa0b Refactor SideOver and ComponentSettingsSideOver components for improved structure and readability 2024-11-15 14:04:12 +00:00
Simon Larsen
eef4e19dc9 Add component deletion functionality and improve selection handling in Dashboard components 2024-11-15 12:45:04 +00:00
Simon Larsen
5af41891dc Enhance DashboardCanvas and DashboardViewer components with selection handling and state management 2024-11-15 12:08:37 +00:00
Simon Larsen
4539b9d381 Update permissions for ScheduledMaintenanceTemplate to include additional roles for update access 2024-11-15 11:46:32 +00:00
Simon Larsen
c1aadd7ce7 Comment out NavBarItem for "Dashboards" in the DashboardNavbar component 2024-11-14 18:27:06 +00:00
Simon Larsen
3b76b92fcb Refactor interface definitions and formatting for improved consistency and readability 2024-11-14 18:21:55 +00:00
Simon Larsen
fe0dc51bef Add DashboardComponentType enum and refactor dashboard component interfaces for improved type safety 2024-11-14 18:10:03 +00:00
Simon Larsen
e279da47bf Refactor dashboard component interfaces and update argument structures for improved configuration 2024-11-14 17:50:36 +00:00
Simon Larsen
5d93000484 Add new metric-related interfaces and update component props for enhanced metrics configuration 2024-11-14 15:21:26 +00:00
Simon Larsen
b826a78700 Add minimum width and height properties to dashboard components for better layout control 2024-11-14 12:47:48 +00:00
Simon Larsen
eded26d92c Add support for HEAD requests in WebsiteMonitor and update request handling 2024-11-13 16:44:42 +00:00
Simon Larsen
517d00dc9a Integrate Playwright for browser automation and add viewport handling in SyntheticMonitor 2024-11-13 16:13:46 +00:00
Simon Larsen
96752f1473 Update aggregation intervals and refactor MetricView component for improved date handling and performance 2024-11-13 13:04:44 +00:00
Simon Larsen
bbc2e306f4 Add waitUntil option to page.setContent for improved reliability in screenshot capture 2024-11-13 12:14:26 +00:00
Simon Larsen
03e063c35b Merge pull request #1746 from OneUptime/take-screenshot-on-incident-create
Take screenshot on incident create
2024-11-13 12:07:36 +00:00
Simon Larsen
4c6c1381c8 Remove unnecessary blank line in MonitorIncident class for improved code readability 2024-11-13 12:07:12 +00:00
Simon Larsen
4814451277 Remove unused imports and clean up screenshot handling in MonitorResourceUtil 2024-11-13 12:00:51 +00:00
Simon Larsen
0c7b2ead8c Refactor migration files to drop specific indexes and improve code formatting; add keys to MoreMenuItem components in UI 2024-11-13 11:22:23 +00:00
Simon Larsen
6c6b80d3c8 Remove unused index decorators from IncidentStateTimeline and MonitorStatusTimeline models, and add migrations to drop specific indexes 2024-11-12 18:21:06 +00:00
Simon Larsen
76f9537002 Refactor migration files to improve index management and clean up MonitorIncident and MonitorResource utility classes 2024-11-12 17:47:07 +00:00
Simon Larsen
c0994ff055 Remove unused index decorators from Alert and Incident models, and add new migration files to drop specific indexes 2024-11-12 17:43:23 +00:00
Simon Larsen
86694d9627 Add Playwright dependency and update Dockerfile for installation 2024-11-12 15:17:52 +00:00
Simon Larsen
aa95f89b49 Merge pull request #1745 from Hubelia/fix_typo_certificate_provisioning
Fix typo in certificate provisioning
2024-11-12 14:41:27 +00:00
RegisHubelia
628b971dc9 Fix automatically typo in certificate provisioning currently set to automatiucally 2024-11-12 08:25:03 -05:00
Simon Larsen
ae002c0d88 Add validation for start and end date in MetricView to prevent loading without valid dates 2024-11-12 11:42:25 +00:00
Simon Larsen
a98fc6f784 Add Pill component for enabled/disabled status display in Workflow views 2024-11-11 18:43:46 +00:00
Simon Larsen
5c459eede8 Refactor metric handling by removing MonitorMetricsByMinute references, adding service type to metrics, and implementing a job to delete old monitor metrics 2024-11-11 18:06:31 +00:00
Simon Larsen
d9d2b615d2 Refactor code for consistency by standardizing property names and improving formatting across various components 2024-11-11 17:24:05 +00:00
Simon Larsen
86e6bca5e1 Enhance analytics functionality by adding groupBy support in various models and components 2024-11-11 17:01:35 +00:00
Simon Larsen
7cfff4787c Remove unnecessary whitespace and improve formatting in MonitorMetricType utility 2024-11-11 10:16:48 +00:00
Simon Larsen
491a8f05bc Update monitor metric units for consistency and improve metric view legend handling 2024-11-07 18:36:27 +00:00
Simon Larsen
f67f1a64bd Add utility method to determine aggregation type by monitor metric type 2024-11-07 17:48:35 +00:00
Simon Larsen
a31ef122a3 Refactor MetricFilter component for improved readability in metric name dropdown options 2024-11-07 17:45:34 +00:00
Simon Larsen
0a82d940fd Add MetricNameAndUnit interface and implement metrics view in Monitor section 2024-11-07 17:26:31 +00:00
Simon Larsen
6ec658b9a5 Refactor MonitorMetricsElement component for improved code readability 2024-11-07 15:52:05 +00:00
Simon Larsen
4e8de2303f Refactor database service to handle date columns and update monitor metrics querying logic 2024-11-07 14:55:16 +00:00
Simon Larsen
19625d6cef Implement MonitorMetricsElement component for dynamic metric querying and visualization 2024-11-07 13:16:44 +00:00
Simon Larsen
e346b12011 Add MonitorMetrics component and MonitorMetricType enum for enhanced monitoring capabilities 2024-11-06 17:40:16 +00:00
Simon Larsen
2b11f2f2b8 Add MonitorMetricType enum and update monitor metric naming conventions 2024-11-06 16:58:45 +00:00
Simon Larsen
3fb62cb358 Update Metric model description for clarity on service ID usage 2024-11-06 15:26:57 +00:00
Simon Larsen
108dfaccf8 Remove MonitorMetricsByMinute model and related service and job files 2024-11-06 13:42:25 +00:00
Simon Larsen
eb20a3c9a2 Comment out NavBarItem for "Dashboards" in the navigation bar 2024-11-06 12:23:02 +00:00
Simon Larsen
988d828bb6 Refactor Dashboard components for improved readability and consistency in code formatting 2024-11-06 12:20:37 +00:00
Simon Larsen
7fd0000c68 Update documentation for self-hosting OneUptime with clearer endpoint examples 2024-11-06 11:41:41 +00:00
Simon Larsen
6286653dd4 Enhance DashboardBaseComponent to track component position using state and update on dashboard view changes 2024-11-05 19:42:51 +00:00
Simon Larsen
9690a5897b Refactor Dashboard components to use component IDs instead of full component objects for improved performance and clarity 2024-11-05 14:58:42 +00:00
Simon Larsen
eefac8703d Update DashboardBaseComponent to use event.pageX and event.pageY for accurate position calculations 2024-11-01 17:13:54 +00:00
Simon Larsen
077a3aad3b Refactor DashboardBaseComponent to improve coordinate calculation and ensure new positions remain within dashboard bounds 2024-11-01 16:55:17 +00:00
Simon Larsen
3ae72726b8 Fix DashboardBaseComponent position calculations to ensure new coordinates remain within bounds 2024-11-01 14:32:21 +00:00
Simon Larsen
90c0e42eb1 Refactor DashboardCanvas and DashboardBaseComponent to enhance component positioning and sizing logic 2024-11-01 14:22:13 +00:00
Simon Larsen
8877ce6d12 Refactor Dashboard size calculations and update DashboardTextComponent height 2024-11-01 13:15:31 +00:00
Simon Larsen
1af5dae991 Refactor DashboardBaseComponent to use consistent naming conventions for width and height variables 2024-11-01 10:54:31 +00:00
Simon Larsen
ee49f3e6dd Refactor GetHeightOfDashboardComponent and GetWidthOfDashboardComponent functions 2024-10-31 18:31:45 +00:00
1187 changed files with 81836 additions and 9604 deletions

View File

@@ -16,7 +16,7 @@ jobs:
CI_PIPELINE_ID: ${{github.run_number}}
steps:
- name: Checkout
uses: actions/checkout@v2
uses: actions/checkout@v4
- name: Preinstall
run: npm run prerun
@@ -31,7 +31,7 @@ jobs:
CI_PIPELINE_ID: ${{github.run_number}}
steps:
- name: Checkout
uses: actions/checkout@v2
uses: actions/checkout@v4
- name: Preinstall
run: npm run prerun
@@ -46,7 +46,7 @@ jobs:
CI_PIPELINE_ID: ${{github.run_number}}
steps:
- name: Checkout
uses: actions/checkout@v2
uses: actions/checkout@v4
- name: Preinstall
run: npm run prerun
@@ -61,7 +61,7 @@ jobs:
CI_PIPELINE_ID: ${{github.run_number}}
steps:
- name: Checkout
uses: actions/checkout@v2
uses: actions/checkout@v4
- name: Preinstall
run: npm run prerun
@@ -76,7 +76,7 @@ jobs:
CI_PIPELINE_ID: ${{github.run_number}}
steps:
- name: Checkout
uses: actions/checkout@v2
uses: actions/checkout@v4
- name: Preinstall
run: npm run prerun
@@ -91,7 +91,7 @@ jobs:
CI_PIPELINE_ID: ${{github.run_number}}
steps:
- name: Checkout
uses: actions/checkout@v2
uses: actions/checkout@v4
- name: Preinstall
run: npm run prerun
@@ -106,7 +106,7 @@ jobs:
CI_PIPELINE_ID: ${{github.run_number}}
steps:
- name: Checkout
uses: actions/checkout@v2
uses: actions/checkout@v4
- name: Preinstall
run: npm run prerun
@@ -122,7 +122,7 @@ jobs:
CI_PIPELINE_ID: ${{github.run_number}}
steps:
- name: Checkout
uses: actions/checkout@v2
uses: actions/checkout@v4
- name: Preinstall
run: npm run prerun
@@ -137,7 +137,7 @@ jobs:
CI_PIPELINE_ID: ${{github.run_number}}
steps:
- name: Checkout
uses: actions/checkout@v2
uses: actions/checkout@v4
- name: Preinstall
run: npm run prerun
@@ -154,7 +154,7 @@ jobs:
CI_PIPELINE_ID: ${{github.run_number}}
steps:
- name: Checkout
uses: actions/checkout@v2
uses: actions/checkout@v4
- name: Preinstall
run: npm run prerun
@@ -169,7 +169,7 @@ jobs:
CI_PIPELINE_ID: ${{github.run_number}}
steps:
- name: Checkout
uses: actions/checkout@v2
uses: actions/checkout@v4
- name: Preinstall
run: npm run prerun
@@ -185,7 +185,7 @@ jobs:
CI_PIPELINE_ID: ${{github.run_number}}
steps:
- name: Checkout
uses: actions/checkout@v2
uses: actions/checkout@v4
- name: Preinstall
run: npm run prerun
@@ -200,7 +200,7 @@ jobs:
CI_PIPELINE_ID: ${{github.run_number}}
steps:
- name: Checkout
uses: actions/checkout@v2
uses: actions/checkout@v4
- name: Preinstall
run: npm run prerun
@@ -215,7 +215,7 @@ jobs:
CI_PIPELINE_ID: ${{github.run_number}}
steps:
- name: Checkout
uses: actions/checkout@v2
uses: actions/checkout@v4
- name: Preinstall
run: npm run prerun
@@ -231,7 +231,7 @@ jobs:
CI_PIPELINE_ID: ${{github.run_number}}
steps:
- name: Checkout
uses: actions/checkout@v2
uses: actions/checkout@v4
- name: Preinstall
run: npm run prerun
@@ -240,20 +240,80 @@ jobs:
- name: build docker image
run: sudo docker build -f ./Probe/Dockerfile .
docker-build-ingestor:
docker-build-probe-ingest:
runs-on: ubuntu-latest
env:
CI_PIPELINE_ID: ${{github.run_number}}
steps:
- name: Checkout
uses: actions/checkout@v2
uses: actions/checkout@v4
- name: Preinstall
run: npm run prerun
# build image probe api
- name: build docker image
run: sudo docker build -f ./Ingestor/Dockerfile .
run: sudo docker build -f ./ProbeIngest/Dockerfile .
docker-build-server-monitor-ingest:
runs-on: ubuntu-latest
env:
CI_PIPELINE_ID: ${{github.run_number}}
steps:
- name: Checkout
uses: actions/checkout@v4
- name: Preinstall
run: npm run prerun
# build image probe api
- name: build docker image
run: sudo docker build -f ./ServerMonitorIngest/Dockerfile .
docker-build-open-telemetry-ingest:
runs-on: ubuntu-latest
env:
CI_PIPELINE_ID: ${{github.run_number}}
steps:
- name: Checkout
uses: actions/checkout@v4
- name: Preinstall
run: npm run prerun
# build image probe api
- name: build docker image
run: sudo docker build -f ./OpenTelemetryIngest/Dockerfile .
docker-build-incoming-request-ingest:
runs-on: ubuntu-latest
env:
CI_PIPELINE_ID: ${{github.run_number}}
steps:
- name: Checkout
uses: actions/checkout@v4
- name: Preinstall
run: npm run prerun
# build image probe api
- name: build docker image
run: sudo docker build -f ./IncomingRequestIngest/Dockerfile .
docker-build-fluent-ingest:
runs-on: ubuntu-latest
env:
CI_PIPELINE_ID: ${{github.run_number}}
steps:
- name: Checkout
uses: actions/checkout@v4
- name: Preinstall
run: npm run prerun
# build image probe api
- name: build docker image
run: sudo docker build -f ./FluentIngest/Dockerfile .
docker-build-status-page:
runs-on: ubuntu-latest
@@ -261,7 +321,7 @@ jobs:
CI_PIPELINE_ID: ${{github.run_number}}
steps:
- name: Checkout
uses: actions/checkout@v2
uses: actions/checkout@v4
- name: Preinstall
run: npm run prerun
@@ -276,7 +336,7 @@ jobs:
CI_PIPELINE_ID: ${{github.run_number}}
steps:
- name: Checkout
uses: actions/checkout@v2
uses: actions/checkout@v4
- name: Preinstall
run: npm run prerun

View File

@@ -14,7 +14,7 @@ jobs:
CI_PIPELINE_ID: ${{github.run_number}}
steps:
- name: Checkout repo
uses: actions/checkout@v2
uses: actions/checkout@v4
- name: Install Helm
run: |
curl https://raw.githubusercontent.com/helm/helm/main/scripts/get-helm-3 | bash
@@ -28,7 +28,7 @@ jobs:
CI_PIPELINE_ID: ${{github.run_number}}
steps:
- name: Checkout repo
uses: actions/checkout@v2
uses: actions/checkout@v4
- run: sudo apt-get update
- run: sudo apt-get install -y curl gcc
- run: sudo apt-get install -y build-essential

View File

@@ -15,10 +15,10 @@ jobs:
env:
CI_PIPELINE_ID: ${{github.run_number}}
steps:
- uses: actions/checkout@v2
- uses: actions/setup-node@v2
- uses: actions/checkout@v4
- uses: actions/setup-node@v4
with:
node-version: 18.3.0
node-version: latest
- run: cd Common && npm install
- run: cd Accounts && npm install && npm run compile && npm run dep-check
@@ -27,10 +27,10 @@ jobs:
env:
CI_PIPELINE_ID: ${{github.run_number}}
steps:
- uses: actions/checkout@v2
- uses: actions/setup-node@v2
- uses: actions/checkout@v4
- uses: actions/setup-node@v4
with:
node-version: 18.3.0
node-version: latest
- run: cd Common && npm install
- run: cd IsolatedVM && npm install && npm run compile && npm run dep-check
@@ -39,10 +39,10 @@ jobs:
env:
CI_PIPELINE_ID: ${{github.run_number}}
steps:
- uses: actions/checkout@v2
- uses: actions/setup-node@v2
- uses: actions/checkout@v4
- uses: actions/setup-node@v4
with:
node-version: 18.3.0
node-version: latest
- run: cd Common && npm install && npm run compile && npm run dep-check
compile-app:
@@ -50,10 +50,10 @@ jobs:
env:
CI_PIPELINE_ID: ${{github.run_number}}
steps:
- uses: actions/checkout@v2
- uses: actions/setup-node@v2
- uses: actions/checkout@v4
- uses: actions/setup-node@v4
with:
node-version: 18.3.0
node-version: latest
- run: cd Common && npm install
- run: cd App && npm install && npm run compile && npm run dep-check
@@ -62,10 +62,10 @@ jobs:
env:
CI_PIPELINE_ID: ${{github.run_number}}
steps:
- uses: actions/checkout@v2
- uses: actions/setup-node@v2
- uses: actions/checkout@v4
- uses: actions/setup-node@v4
with:
node-version: 18.3.0
node-version: latest
- run: cd Common && npm install
- run: cd Home && npm install && npm run compile && npm run dep-check
@@ -74,10 +74,10 @@ jobs:
env:
CI_PIPELINE_ID: ${{github.run_number}}
steps:
- uses: actions/checkout@v2
- uses: actions/setup-node@v2
- uses: actions/checkout@v4
- uses: actions/setup-node@v4
with:
node-version: 18.3.0
node-version: latest
- run: cd Common && npm install
- run: cd Worker && npm install && npm run compile && npm run dep-check
@@ -86,10 +86,10 @@ jobs:
env:
CI_PIPELINE_ID: ${{github.run_number}}
steps:
- uses: actions/checkout@v2
- uses: actions/setup-node@v2
- uses: actions/checkout@v4
- uses: actions/setup-node@v4
with:
node-version: 18.3.0
node-version: latest
- run: cd Common && npm install
- run: cd Workflow && npm install && npm run compile && npm run dep-check
@@ -98,10 +98,10 @@ jobs:
env:
CI_PIPELINE_ID: ${{github.run_number}}
steps:
- uses: actions/checkout@v2
- uses: actions/setup-node@v2
- uses: actions/checkout@v4
- uses: actions/setup-node@v4
with:
node-version: 18.3.0
node-version: latest
- run: cd Common && npm install
- run: cd APIReference && npm install && npm run compile && npm run dep-check
@@ -110,10 +110,10 @@ jobs:
env:
CI_PIPELINE_ID: ${{github.run_number}}
steps:
- uses: actions/checkout@v2
- uses: actions/setup-node@v2
- uses: actions/checkout@v4
- uses: actions/setup-node@v4
with:
node-version: 18.3.0
node-version: latest
- run: cd Common && npm install
- run: cd Docs && npm install && npm run compile && npm run dep-check
@@ -122,10 +122,10 @@ jobs:
env:
CI_PIPELINE_ID: ${{github.run_number}}
steps:
- uses: actions/checkout@v2
- uses: actions/setup-node@v2
- uses: actions/checkout@v4
- uses: actions/setup-node@v4
with:
node-version: 18.3.0
node-version: latest
- run: cd Common && npm install
- run: cd Copilot && npm install && npm run compile && npm run dep-check
@@ -134,10 +134,10 @@ jobs:
env:
CI_PIPELINE_ID: ${{github.run_number}}
steps:
- uses: actions/checkout@v2
- uses: actions/setup-node@v2
- uses: actions/checkout@v4
- uses: actions/setup-node@v4
with:
node-version: 18.3.0
node-version: latest
- run: cd Common && npm install
- run: cd Nginx && npm install && npm run compile && npm run dep-check
@@ -158,10 +158,10 @@ jobs:
env:
CI_PIPELINE_ID: ${{github.run_number}}
steps:
- uses: actions/checkout@v2
- uses: actions/setup-node@v2
- uses: actions/checkout@v4
- uses: actions/setup-node@v4
with:
node-version: 18.3.0
node-version: latest
- run: cd Common && npm install
- run: cd AdminDashboard && npm install && npm run compile && npm run dep-check
@@ -171,10 +171,10 @@ jobs:
env:
CI_PIPELINE_ID: ${{github.run_number}}
steps:
- uses: actions/checkout@v2
- uses: actions/setup-node@v2
- uses: actions/checkout@v4
- uses: actions/setup-node@v4
with:
node-version: 18.3.0
node-version: latest
- run: cd Common && npm install
- run: cd Dashboard && npm install && npm run compile && npm run dep-check
@@ -185,10 +185,11 @@ jobs:
env:
CI_PIPELINE_ID: ${{github.run_number}}
steps:
- uses: actions/checkout@v2
- uses: actions/setup-node@v2
- uses: actions/checkout@v4
- uses: actions/setup-node@v4
with:
node-version: 18.3.0
node-version: latest
- run: sudo apt-get update
- run: cd Common && npm install
- run: cd E2E && npm install && npm run compile && npm run dep-check
@@ -197,24 +198,73 @@ jobs:
env:
CI_PIPELINE_ID: ${{github.run_number}}
steps:
- uses: actions/checkout@v2
- uses: actions/setup-node@v2
- uses: actions/checkout@v4
- uses: actions/setup-node@v4
with:
node-version: 18.3.0
node-version: latest
- run: cd Common && npm install
- run: cd Probe && npm install && npm run compile && npm run dep-check
compile-ingestor:
compile-probe-ingest:
runs-on: ubuntu-latest
env:
CI_PIPELINE_ID: ${{github.run_number}}
steps:
- uses: actions/checkout@v2
- uses: actions/setup-node@v2
- uses: actions/checkout@v4
- uses: actions/setup-node@v4
with:
node-version: 18.3.0
node-version: latest
- run: cd Common && npm install
- run: cd Ingestor && npm install && npm run compile && npm run dep-check
- run: cd ProbeIngest && npm install && npm run compile && npm run dep-check
compile-server-monitor-ingest:
runs-on: ubuntu-latest
env:
CI_PIPELINE_ID: ${{github.run_number}}
steps:
- uses: actions/checkout@v4
- uses: actions/setup-node@v4
with:
node-version: latest
- run: cd Common && npm install
- run: cd ServerMonitorIngest && npm install && npm run compile && npm run dep-check
compile-open-telemetry-ingest:
runs-on: ubuntu-latest
env:
CI_PIPELINE_ID: ${{github.run_number}}
steps:
- uses: actions/checkout@v4
- uses: actions/setup-node@v4
with:
node-version: latest
- run: cd Common && npm install
- run: cd OpenTelemetryIngest && npm install && npm run compile && npm run dep-check
compile-incoming-request-ingest:
runs-on: ubuntu-latest
env:
CI_PIPELINE_ID: ${{github.run_number}}
steps:
- uses: actions/checkout@v4
- uses: actions/setup-node@v4
with:
node-version: latest
- run: cd Common && npm install
- run: cd IncomingRequestIngest && npm install && npm run compile && npm run dep-check
compile-fluent-ingest:
runs-on: ubuntu-latest
env:
CI_PIPELINE_ID: ${{github.run_number}}
steps:
- uses: actions/checkout@v4
- uses: actions/setup-node@v4
with:
node-version: latest
- run: cd Common && npm install
- run: cd FluentIngest && npm install && npm run compile && npm run dep-check
compile-status-page:
@@ -222,10 +272,10 @@ jobs:
env:
CI_PIPELINE_ID: ${{github.run_number}}
steps:
- uses: actions/checkout@v2
- uses: actions/setup-node@v2
- uses: actions/checkout@v4
- uses: actions/setup-node@v4
with:
node-version: 18.3.0
node-version: latest
- run: cd Common && npm install
- run: cd StatusPage && npm install && npm run compile && npm run dep-check
@@ -235,9 +285,9 @@ jobs:
env:
CI_PIPELINE_ID: ${{github.run_number}}
steps:
- uses: actions/checkout@v2
- uses: actions/setup-node@v2
- uses: actions/checkout@v4
- uses: actions/setup-node@v4
with:
node-version: 18.3.0
node-version: latest
- run: cd Common && npm install
- run: cd TestServer && npm install && npm run compile && npm run dep-check

View File

@@ -87,9 +87,9 @@ jobs:
with:
ref: ${{ github.ref }}
- uses: actions/setup-node@v2
- uses: actions/setup-node@v4
with:
node-version: 18.3.0
node-version: latest
- name: Set up QEMU
uses: docker/setup-qemu-action@v2
@@ -147,9 +147,9 @@ jobs:
with:
ref: ${{ github.ref }}
- uses: actions/setup-node@v2
- uses: actions/setup-node@v4
with:
node-version: 18.3.0
node-version: latest
- name: Set up QEMU
uses: docker/setup-qemu-action@v2
@@ -207,9 +207,9 @@ jobs:
with:
ref: ${{ github.ref }}
- uses: actions/setup-node@v2
- uses: actions/setup-node@v4
with:
node-version: 18.3.0
node-version: latest
- name: Set up QEMU
uses: docker/setup-qemu-action@v2
@@ -267,9 +267,9 @@ jobs:
with:
ref: ${{ github.ref }}
- uses: actions/setup-node@v2
- uses: actions/setup-node@v4
with:
node-version: 18.3.0
node-version: latest
- name: Set up QEMU
uses: docker/setup-qemu-action@v2
@@ -330,9 +330,9 @@ jobs:
with:
ref: ${{ github.ref }}
- uses: actions/setup-node@v2
- uses: actions/setup-node@v4
with:
node-version: 18.3.0
node-version: latest
- name: Set up QEMU
uses: docker/setup-qemu-action@v2
@@ -390,9 +390,9 @@ jobs:
with:
ref: ${{ github.ref }}
- uses: actions/setup-node@v2
- uses: actions/setup-node@v4
with:
node-version: 18.3.0
node-version: latest
- name: Set up QEMU
uses: docker/setup-qemu-action@v2
@@ -452,9 +452,9 @@ jobs:
with:
ref: ${{ github.ref }}
- uses: actions/setup-node@v2
- uses: actions/setup-node@v4
with:
node-version: 18.3.0
node-version: latest
- name: Set up QEMU
uses: docker/setup-qemu-action@v2
@@ -512,9 +512,9 @@ jobs:
with:
ref: ${{ github.ref }}
- uses: actions/setup-node@v2
- uses: actions/setup-node@v4
with:
node-version: 18.3.0
node-version: latest
- name: Set up QEMU
uses: docker/setup-qemu-action@v2
@@ -553,7 +553,7 @@ jobs:
GIT_SHA=${{ github.sha }}
APP_VERSION=7.0.${{needs.generate-build-number.outputs.build_number}}
ingestor-docker-image-deploy:
probe-ingest-docker-image-deploy:
needs: [generate-build-number]
runs-on: ubuntu-latest
steps:
@@ -562,8 +562,8 @@ jobs:
uses: docker/metadata-action@v4
with:
images: |
oneuptime/ingestor
ghcr.io/oneuptime/ingestor
oneuptime/probe-ingest
ghcr.io/oneuptime/probe-ingest
tags: |
type=raw,value=release,enable=true
type=semver,value=7.0.${{needs.generate-build-number.outputs.build_number}},pattern={{version}},enable=true
@@ -572,9 +572,9 @@ jobs:
with:
ref: ${{ github.ref }}
- uses: actions/setup-node@v2
- uses: actions/setup-node@v4
with:
node-version: 18.3.0
node-version: latest
- name: Set up QEMU
uses: docker/setup-qemu-action@v2
@@ -585,7 +585,7 @@ jobs:
- name: Generate Dockerfile from Dockerfile.tpl
run: npm run prerun
# Build and deploy ingestor.
# Build and deploy probe-ingest.
- name: Login to Docker Hub
uses: docker/login-action@v2.2.0
@@ -603,7 +603,251 @@ jobs:
- name: Build and push
uses: docker/build-push-action@v4
with:
file: ./Ingestor/Dockerfile
file: ./ProbeIngest/Dockerfile
context: .
platforms: linux/amd64,linux/arm64
push: true
tags: ${{ steps.meta.outputs.tags }}
labels: ${{ steps.meta.outputs.labels }}
build-args: |
GIT_SHA=${{ github.sha }}
APP_VERSION=7.0.${{needs.generate-build-number.outputs.build_number}}
server-monitor-ingest-docker-image-deploy:
needs: [generate-build-number]
runs-on: ubuntu-latest
steps:
- name: Docker Meta
id: meta
uses: docker/metadata-action@v4
with:
images: |
oneuptime/server-monitor-ingest
ghcr.io/oneuptime/server-monitor-ingest
tags: |
type=raw,value=release,enable=true
type=semver,value=7.0.${{needs.generate-build-number.outputs.build_number}},pattern={{version}},enable=true
- uses: actions/checkout@v4
with:
ref: ${{ github.ref }}
- uses: actions/setup-node@v4
with:
node-version: latest
- name: Set up QEMU
uses: docker/setup-qemu-action@v2
- name: Set up Docker Buildx
uses: docker/setup-buildx-action@v2
- name: Generate Dockerfile from Dockerfile.tpl
run: npm run prerun
# Build and deploy probe-ingest.
- name: Login to Docker Hub
uses: docker/login-action@v2.2.0
with:
username: ${{ secrets.DOCKERHUB_USERNAME }}
password: ${{ secrets.DOCKERHUB_PASSWORD }}
- name: Login to GitHub Container Registry
uses: docker/login-action@v2.2.0
with:
registry: ghcr.io
username: ${{ github.repository_owner }}
password: ${{ secrets.GITHUB_TOKEN }}
- name: Build and push
uses: docker/build-push-action@v4
with:
file: ./ServerMonitorIngest/Dockerfile
context: .
platforms: linux/amd64,linux/arm64
push: true
tags: ${{ steps.meta.outputs.tags }}
labels: ${{ steps.meta.outputs.labels }}
build-args: |
GIT_SHA=${{ github.sha }}
APP_VERSION=7.0.${{needs.generate-build-number.outputs.build_number}}
open-telemetry-ingest-docker-image-deploy:
needs: [generate-build-number]
runs-on: ubuntu-latest
steps:
- name: Docker Meta
id: meta
uses: docker/metadata-action@v4
with:
images: |
oneuptime/open-telemetry-ingest
ghcr.io/oneuptime/open-telemetry-ingest
tags: |
type=raw,value=release,enable=true
type=semver,value=7.0.${{needs.generate-build-number.outputs.build_number}},pattern={{version}},enable=true
- uses: actions/checkout@v4
with:
ref: ${{ github.ref }}
- uses: actions/setup-node@v4
with:
node-version: latest
- name: Set up QEMU
uses: docker/setup-qemu-action@v2
- name: Set up Docker Buildx
uses: docker/setup-buildx-action@v2
- name: Generate Dockerfile from Dockerfile.tpl
run: npm run prerun
# Build and deploy open-telemetry-ingest.
- name: Login to Docker Hub
uses: docker/login-action@v2.2.0
with:
username: ${{ secrets.DOCKERHUB_USERNAME }}
password: ${{ secrets.DOCKERHUB_PASSWORD }}
- name: Login to GitHub Container Registry
uses: docker/login-action@v2.2.0
with:
registry: ghcr.io
username: ${{ github.repository_owner }}
password: ${{ secrets.GITHUB_TOKEN }}
- name: Build and push
uses: docker/build-push-action@v4
with:
file: ./OpenTelemetryIngest/Dockerfile
context: .
platforms: linux/amd64,linux/arm64
push: true
tags: ${{ steps.meta.outputs.tags }}
labels: ${{ steps.meta.outputs.labels }}
build-args: |
GIT_SHA=${{ github.sha }}
APP_VERSION=7.0.${{needs.generate-build-number.outputs.build_number}}
incoming-request-ingest-docker-image-deploy:
needs: [generate-build-number]
runs-on: ubuntu-latest
steps:
- name: Docker Meta
id: meta
uses: docker/metadata-action@v4
with:
images: |
oneuptime/incoming-request-ingest
ghcr.io/oneuptime/incoming-request-ingest
tags: |
type=raw,value=release,enable=true
type=semver,value=7.0.${{needs.generate-build-number.outputs.build_number}},pattern={{version}},enable=true
- uses: actions/checkout@v4
with:
ref: ${{ github.ref }}
- uses: actions/setup-node@v4
with:
node-version: latest
- name: Set up QEMU
uses: docker/setup-qemu-action@v2
- name: Set up Docker Buildx
uses: docker/setup-buildx-action@v2
- name: Generate Dockerfile from Dockerfile.tpl
run: npm run prerun
# Build and deploy incoming-request-ingest.
- name: Login to Docker Hub
uses: docker/login-action@v2.2.0
with:
username: ${{ secrets.DOCKERHUB_USERNAME }}
password: ${{ secrets.DOCKERHUB_PASSWORD }}
- name: Login to GitHub Container Registry
uses: docker/login-action@v2.2.0
with:
registry: ghcr.io
username: ${{ github.repository_owner }}
password: ${{ secrets.GITHUB_TOKEN }}
- name: Build and push
uses: docker/build-push-action@v4
with:
file: ./IncomingRequestIngest/Dockerfile
context: .
platforms: linux/amd64,linux/arm64
push: true
tags: ${{ steps.meta.outputs.tags }}
labels: ${{ steps.meta.outputs.labels }}
build-args: |
GIT_SHA=${{ github.sha }}
APP_VERSION=7.0.${{needs.generate-build-number.outputs.build_number}}
fluent-ingest-docker-image-deploy:
needs: [generate-build-number]
runs-on: ubuntu-latest
steps:
- name: Docker Meta
id: meta
uses: docker/metadata-action@v4
with:
images: |
oneuptime/fluent-ingest
ghcr.io/oneuptime/fluent-ingest
tags: |
type=raw,value=release,enable=true
type=semver,value=7.0.${{needs.generate-build-number.outputs.build_number}},pattern={{version}},enable=true
- uses: actions/checkout@v4
with:
ref: ${{ github.ref }}
- uses: actions/setup-node@v4
with:
node-version: latest
- name: Set up QEMU
uses: docker/setup-qemu-action@v2
- name: Set up Docker Buildx
uses: docker/setup-buildx-action@v2
- name: Generate Dockerfile from Dockerfile.tpl
run: npm run prerun
# Build and deploy fluent-ingest.
- name: Login to Docker Hub
uses: docker/login-action@v2.2.0
with:
username: ${{ secrets.DOCKERHUB_USERNAME }}
password: ${{ secrets.DOCKERHUB_PASSWORD }}
- name: Login to GitHub Container Registry
uses: docker/login-action@v2.2.0
with:
registry: ghcr.io
username: ${{ github.repository_owner }}
password: ${{ secrets.GITHUB_TOKEN }}
- name: Build and push
uses: docker/build-push-action@v4
with:
file: ./FluentIngest/Dockerfile
context: .
platforms: linux/amd64,linux/arm64
push: true
@@ -632,9 +876,9 @@ jobs:
with:
ref: ${{ github.ref }}
- uses: actions/setup-node@v2
- uses: actions/setup-node@v4
with:
node-version: 18.3.0
node-version: latest
- name: Set up QEMU
uses: docker/setup-qemu-action@v2
@@ -693,9 +937,9 @@ jobs:
with:
ref: ${{ github.ref }}
- uses: actions/setup-node@v2
- uses: actions/setup-node@v4
with:
node-version: 18.3.0
node-version: latest
- name: Set up QEMU
uses: docker/setup-qemu-action@v2
@@ -753,9 +997,9 @@ jobs:
with:
ref: ${{ github.ref }}
- uses: actions/setup-node@v2
- uses: actions/setup-node@v4
with:
node-version: 18.3.0
node-version: latest
- name: Set up QEMU
uses: docker/setup-qemu-action@v2
@@ -814,9 +1058,9 @@ jobs:
with:
ref: ${{ github.ref }}
- uses: actions/setup-node@v2
- uses: actions/setup-node@v4
with:
node-version: 18.3.0
node-version: latest
- name: Set up QEMU
uses: docker/setup-qemu-action@v2
@@ -874,9 +1118,9 @@ jobs:
with:
ref: ${{ github.ref }}
- uses: actions/setup-node@v2
- uses: actions/setup-node@v4
with:
node-version: 18.3.0
node-version: latest
- name: Set up QEMU
uses: docker/setup-qemu-action@v2
@@ -935,9 +1179,9 @@ jobs:
with:
ref: ${{ github.ref }}
- uses: actions/setup-node@v2
- uses: actions/setup-node@v4
with:
node-version: 18.3.0
node-version: latest
- name: Set up QEMU
uses: docker/setup-qemu-action@v2
@@ -995,9 +1239,9 @@ jobs:
with:
ref: ${{ github.ref }}
- uses: actions/setup-node@v2
- uses: actions/setup-node@v4
with:
node-version: 18.3.0
node-version: latest
- name: Set up QEMU
uses: docker/setup-qemu-action@v2
@@ -1046,10 +1290,10 @@ jobs:
PACKAGE_VERSION: 7.0.${{needs.generate-build-number.outputs.build_number}}
steps:
- name: Checkout
uses: actions/checkout@v2
uses: actions/checkout@v4
- name: Preinstall
run: npm run prerun
- name: Publish Infrastructure Agent
- name: Publish NPM Packages
run: bash ./Scripts/NPM/PublishAllPackages.sh
@@ -1090,9 +1334,9 @@ jobs:
with:
ref: ${{ github.ref }}
- uses: actions/setup-node@v2
- uses: actions/setup-node@v4
with:
node-version: 18.3.0
node-version: latest
# - name: Setup Git LFS
# run: git lfs install
@@ -1161,9 +1405,9 @@ jobs:
with:
ref: ${{ github.ref }}
- uses: actions/setup-node@v2
- uses: actions/setup-node@v4
with:
node-version: 18.3.0
node-version: latest
- name: Set up QEMU
uses: docker/setup-qemu-action@v2
@@ -1228,9 +1472,9 @@ jobs:
with:
ref: ${{ github.ref }}
- uses: actions/setup-node@v2
- uses: actions/setup-node@v4
with:
node-version: 18.3.0
node-version: latest
- name: Set up QEMU
uses: docker/setup-qemu-action@v2
@@ -1295,9 +1539,9 @@ jobs:
with:
ref: ${{ github.ref }}
- uses: actions/setup-node@v2
- uses: actions/setup-node@v4
with:
node-version: 18.3.0
node-version: latest
- name: Set up QEMU
uses: docker/setup-qemu-action@v2
@@ -1363,9 +1607,9 @@ jobs:
with:
ref: ${{ github.ref }}
- uses: actions/setup-node@v2
- uses: actions/setup-node@v4
with:
node-version: 18.3.0
node-version: latest
- name: Set up QEMU
uses: docker/setup-qemu-action@v2
@@ -1409,7 +1653,7 @@ jobs:
test-e2e-release-saas:
runs-on: ubuntu-latest
needs: [copilot-docker-image-deploy, docs-docker-image-deploy, api-reference-docker-image-deploy, workflow-docker-image-deploy, llm-docker-image-deploy, accounts-docker-image-deploy, admin-dashboard-docker-image-deploy, app-docker-image-deploy, dashboard-docker-image-deploy, haraka-docker-image-deploy, ingestor-docker-image-deploy, isolated-vm-docker-image-deploy, home-docker-image-deploy, worker-docker-image-deploy, otel-collector-docker-image-deploy, probe-docker-image-deploy, status-page-docker-image-deploy, test-docker-image-deploy, test-server-docker-image-deploy, publish-npm-packages, e2e-docker-image-deploy, helm-chart-deploy, generate-build-number, nginx-docker-image-deploy]
needs: [open-telemetry-ingest-docker-image-deploy, copilot-docker-image-deploy, fluent-ingest-docker-image-deploy, docs-docker-image-deploy, api-reference-docker-image-deploy, workflow-docker-image-deploy, llm-docker-image-deploy, accounts-docker-image-deploy, admin-dashboard-docker-image-deploy, app-docker-image-deploy, dashboard-docker-image-deploy, haraka-docker-image-deploy, probe-ingest-docker-image-deploy, server-monitor-ingest-docker-image-deploy, isolated-vm-docker-image-deploy, home-docker-image-deploy, worker-docker-image-deploy, otel-collector-docker-image-deploy, probe-docker-image-deploy, status-page-docker-image-deploy, test-docker-image-deploy, test-server-docker-image-deploy, publish-npm-packages, e2e-docker-image-deploy, helm-chart-deploy, generate-build-number, nginx-docker-image-deploy, incoming-request-ingest-docker-image-deploy]
env:
CI_PIPELINE_ID: ${{github.run_number}}
steps:
@@ -1426,10 +1670,10 @@ jobs:
large-packages: true
docker-images: true
swap-storage: true
- uses: actions/checkout@v2
- uses: actions/setup-node@v2
- uses: actions/checkout@v4
- uses: actions/setup-node@v4
with:
node-version: 18.3.0
node-version: latest
- run: npm run prerun && bash ./Tests/Scripts/enable-billing-env-var.sh
- name: Start Server with release tag
run: npm run start
@@ -1462,7 +1706,7 @@ jobs:
test-e2e-release-self-hosted:
runs-on: ubuntu-latest
# After all the jobs runs
needs: [copilot-docker-image-deploy, docs-docker-image-deploy, api-reference-docker-image-deploy, workflow-docker-image-deploy, llm-docker-image-deploy, accounts-docker-image-deploy, admin-dashboard-docker-image-deploy, app-docker-image-deploy, dashboard-docker-image-deploy, haraka-docker-image-deploy, ingestor-docker-image-deploy, isolated-vm-docker-image-deploy, home-docker-image-deploy, worker-docker-image-deploy, otel-collector-docker-image-deploy, probe-docker-image-deploy, status-page-docker-image-deploy, test-docker-image-deploy, test-server-docker-image-deploy, publish-npm-packages, e2e-docker-image-deploy, helm-chart-deploy, generate-build-number, nginx-docker-image-deploy]
needs: [open-telemetry-ingest-docker-image-deploy, copilot-docker-image-deploy, incoming-request-ingest-docker-image-deploy, fluent-ingest-docker-image-deploy, docs-docker-image-deploy, api-reference-docker-image-deploy, workflow-docker-image-deploy, llm-docker-image-deploy, accounts-docker-image-deploy, admin-dashboard-docker-image-deploy, app-docker-image-deploy, dashboard-docker-image-deploy, haraka-docker-image-deploy, probe-ingest-docker-image-deploy, server-monitor-ingest-docker-image-deploy, isolated-vm-docker-image-deploy, home-docker-image-deploy, worker-docker-image-deploy, otel-collector-docker-image-deploy, probe-docker-image-deploy, status-page-docker-image-deploy, test-docker-image-deploy, test-server-docker-image-deploy, publish-npm-packages, e2e-docker-image-deploy, helm-chart-deploy, generate-build-number, nginx-docker-image-deploy]
env:
CI_PIPELINE_ID: ${{github.run_number}}
steps:
@@ -1479,10 +1723,10 @@ jobs:
large-packages: true
docker-images: true
swap-storage: true
- uses: actions/checkout@v2
- uses: actions/setup-node@v2
- uses: actions/checkout@v4
- uses: actions/setup-node@v4
with:
node-version: 18.3.0
node-version: latest
- run: npm run prerun
- name: Start Server with release tag
run: npm run start
@@ -1549,15 +1793,25 @@ jobs:
uses: actions/setup-go@v4
- name: Install GoReleaser
uses: goreleaser/goreleaser-action@v5
uses: goreleaser/goreleaser-action@v6.1.0
with:
install-only: true
- name: GoReleaser Version
run: goreleaser -v
# This tool is used to generate .rpm and .deb packages
- name: Install NFPM
run: go install github.com/goreleaser/nfpm/v2/cmd/nfpm@latest
- name: Show GoReleaser version
run: goreleaser -v
- name: Run GoReleaser
run: cd InfrastructureAgent && export GORELEASER_CURRENT_TAG=7.0.${{needs.generate-build-number.outputs.build_number}} && goreleaser release --clean --snapshot
- name: Release MSI Images
run: cd InfrastructureAgent && bash build-msi.sh 7.0.${{needs.generate-build-number.outputs.build_number}}
# Upload binaries to github release
- name: Release

View File

@@ -1,5 +1,9 @@
name: Push Test Images to Docker Hub and GitHub Container Registry
concurrency:
group: test-release
cancel-in-progress: true
on:
push:
branches:
@@ -56,9 +60,9 @@ jobs:
with:
ref: ${{ github.ref }}
- uses: actions/setup-node@v2
- uses: actions/setup-node@v4
with:
node-version: 18.3.0
node-version: latest
# - name: Setup Git LFS
# run: git lfs install
@@ -126,9 +130,9 @@ jobs:
with:
ref: ${{ github.ref }}
- uses: actions/setup-node@v2
- uses: actions/setup-node@v4
with:
node-version: 18.3.0
node-version: latest
- name: Set up QEMU
uses: docker/setup-qemu-action@v2
@@ -188,9 +192,9 @@ jobs:
with:
ref: ${{ github.ref }}
- uses: actions/setup-node@v2
- uses: actions/setup-node@v4
with:
node-version: 18.3.0
node-version: latest
- name: Set up QEMU
uses: docker/setup-qemu-action@v2
@@ -249,9 +253,9 @@ jobs:
with:
ref: ${{ github.ref }}
- uses: actions/setup-node@v2
- uses: actions/setup-node@v4
with:
node-version: 18.3.0
node-version: latest
- name: Set up QEMU
uses: docker/setup-qemu-action@v2
@@ -310,9 +314,9 @@ jobs:
with:
ref: ${{ github.ref }}
- uses: actions/setup-node@v2
- uses: actions/setup-node@v4
with:
node-version: 18.3.0
node-version: latest
- name: Set up QEMU
uses: docker/setup-qemu-action@v2
@@ -371,9 +375,9 @@ jobs:
with:
ref: ${{ github.ref }}
- uses: actions/setup-node@v2
- uses: actions/setup-node@v4
with:
node-version: 18.3.0
node-version: latest
- name: Set up QEMU
uses: docker/setup-qemu-action@v2
@@ -432,9 +436,9 @@ jobs:
with:
ref: ${{ github.ref }}
- uses: actions/setup-node@v2
- uses: actions/setup-node@v4
with:
node-version: 18.3.0
node-version: latest
- name: Set up QEMU
uses: docker/setup-qemu-action@v2
@@ -495,9 +499,9 @@ jobs:
with:
ref: ${{ github.ref }}
- uses: actions/setup-node@v2
- uses: actions/setup-node@v4
with:
node-version: 18.3.0
node-version: latest
- name: Set up QEMU
uses: docker/setup-qemu-action@v2
@@ -558,9 +562,9 @@ jobs:
with:
ref: ${{ github.ref }}
- uses: actions/setup-node@v2
- uses: actions/setup-node@v4
with:
node-version: 18.3.0
node-version: latest
- name: Set up QEMU
uses: docker/setup-qemu-action@v2
@@ -599,7 +603,7 @@ jobs:
GIT_SHA=${{ github.sha }}
APP_VERSION=7.0.${{needs.generate-build-number.outputs.build_number}}
ingestor-docker-image-deploy:
probe-ingest-docker-image-deploy:
needs: generate-build-number
runs-on: ubuntu-latest
steps:
@@ -608,8 +612,8 @@ jobs:
uses: docker/metadata-action@v4
with:
images: |
oneuptime/ingestor
ghcr.io/oneuptime/ingestor
oneuptime/probe-ingest
ghcr.io/oneuptime/probe-ingest
tags: |
type=raw,value=test,enable=true
type=semver,value=7.0.${{needs.generate-build-number.outputs.build_number}}-test,pattern={{version}},enable=true
@@ -619,9 +623,9 @@ jobs:
with:
ref: ${{ github.ref }}
- uses: actions/setup-node@v2
- uses: actions/setup-node@v4
with:
node-version: 18.3.0
node-version: latest
- name: Set up QEMU
uses: docker/setup-qemu-action@v2
@@ -632,7 +636,7 @@ jobs:
- name: Generate Dockerfile from Dockerfile.tpl
run: npm run prerun
# Build and deploy ingestor.
# Build and deploy probe-ingest.
- name: Login to Docker Hub
uses: docker/login-action@v2.2.0
@@ -650,7 +654,256 @@ jobs:
- name: Build and push
uses: docker/build-push-action@v4
with:
file: ./Ingestor/Dockerfile
file: ./ProbeIngest/Dockerfile
context: .
platforms: linux/amd64,linux/arm64
push: true
tags: ${{ steps.meta.outputs.tags }}
labels: ${{ steps.meta.outputs.labels }}
build-args: |
GIT_SHA=${{ github.sha }}
APP_VERSION=7.0.${{needs.generate-build-number.outputs.build_number}}
server-monitor-ingest-docker-image-deploy:
needs: generate-build-number
runs-on: ubuntu-latest
steps:
- name: Docker Meta
id: meta
uses: docker/metadata-action@v4
with:
images: |
oneuptime/server-monitor-ingest
ghcr.io/oneuptime/server-monitor-ingest
tags: |
type=raw,value=test,enable=true
type=semver,value=7.0.${{needs.generate-build-number.outputs.build_number}}-test,pattern={{version}},enable=true
- uses: actions/checkout@v4
with:
ref: ${{ github.ref }}
- uses: actions/setup-node@v4
with:
node-version: latest
- name: Set up QEMU
uses: docker/setup-qemu-action@v2
- name: Set up Docker Buildx
uses: docker/setup-buildx-action@v2
- name: Generate Dockerfile from Dockerfile.tpl
run: npm run prerun
# Build and deploy ServerMonitorIngest.
- name: Login to Docker Hub
uses: docker/login-action@v2.2.0
with:
username: ${{ secrets.DOCKERHUB_USERNAME }}
password: ${{ secrets.DOCKERHUB_PASSWORD }}
- name: Login to GitHub Container Registry
uses: docker/login-action@v2.2.0
with:
registry: ghcr.io
username: ${{ github.repository_owner }}
password: ${{ secrets.GITHUB_TOKEN }}
- name: Build and push
uses: docker/build-push-action@v4
with:
file: ./ServerMonitorIngest/Dockerfile
context: .
platforms: linux/amd64,linux/arm64
push: true
tags: ${{ steps.meta.outputs.tags }}
labels: ${{ steps.meta.outputs.labels }}
build-args: |
GIT_SHA=${{ github.sha }}
APP_VERSION=7.0.${{needs.generate-build-number.outputs.build_number}}
incoming-request-ingest-docker-image-deploy:
needs: generate-build-number
runs-on: ubuntu-latest
steps:
- name: Docker Meta
id: meta
uses: docker/metadata-action@v4
with:
images: |
oneuptime/incoming-request-ingest
ghcr.io/oneuptime/incoming-request-ingest
tags: |
type=raw,value=test,enable=true
type=semver,value=7.0.${{needs.generate-build-number.outputs.build_number}}-test,pattern={{version}},enable=true
- uses: actions/checkout@v4
with:
ref: ${{ github.ref }}
- uses: actions/setup-node@v4
with:
node-version: latest
- name: Set up QEMU
uses: docker/setup-qemu-action@v2
- name: Set up Docker Buildx
uses: docker/setup-buildx-action@v2
- name: Generate Dockerfile from Dockerfile.tpl
run: npm run prerun
# Build and deploy incoming-request-ingest.
- name: Login to Docker Hub
uses: docker/login-action@v2.2.0
with:
username: ${{ secrets.DOCKERHUB_USERNAME }}
password: ${{ secrets.DOCKERHUB_PASSWORD }}
- name: Login to GitHub Container Registry
uses: docker/login-action@v2.2.0
with:
registry: ghcr.io
username: ${{ github.repository_owner }}
password: ${{ secrets.GITHUB_TOKEN }}
- name: Build and push
uses: docker/build-push-action@v4
with:
file: ./IncomingRequestIngest/Dockerfile
context: .
platforms: linux/amd64,linux/arm64
push: true
tags: ${{ steps.meta.outputs.tags }}
labels: ${{ steps.meta.outputs.labels }}
build-args: |
GIT_SHA=${{ github.sha }}
APP_VERSION=7.0.${{needs.generate-build-number.outputs.build_number}}
open-telemetry-ingest-docker-image-deploy:
needs: generate-build-number
runs-on: ubuntu-latest
steps:
- name: Docker Meta
id: meta
uses: docker/metadata-action@v4
with:
images: |
oneuptime/open-telemetry-ingest
ghcr.io/oneuptime/open-telemetry-ingest
tags: |
type=raw,value=test,enable=true
type=semver,value=7.0.${{needs.generate-build-number.outputs.build_number}}-test,pattern={{version}},enable=true
- uses: actions/checkout@v4
with:
ref: ${{ github.ref }}
- uses: actions/setup-node@v4
with:
node-version: latest
- name: Set up QEMU
uses: docker/setup-qemu-action@v2
- name: Set up Docker Buildx
uses: docker/setup-buildx-action@v2
- name: Generate Dockerfile from Dockerfile.tpl
run: npm run prerun
# Build and deploy incoming-request-ingest.
- name: Login to Docker Hub
uses: docker/login-action@v2.2.0
with:
username: ${{ secrets.DOCKERHUB_USERNAME }}
password: ${{ secrets.DOCKERHUB_PASSWORD }}
- name: Login to GitHub Container Registry
uses: docker/login-action@v2.2.0
with:
registry: ghcr.io
username: ${{ github.repository_owner }}
password: ${{ secrets.GITHUB_TOKEN }}
- name: Build and push
uses: docker/build-push-action@v4
with:
file: ./OpenTelemetryIngest/Dockerfile
context: .
platforms: linux/amd64,linux/arm64
push: true
tags: ${{ steps.meta.outputs.tags }}
labels: ${{ steps.meta.outputs.labels }}
build-args: |
GIT_SHA=${{ github.sha }}
APP_VERSION=7.0.${{needs.generate-build-number.outputs.build_number}}
fluent-ingest-docker-image-deploy:
needs: generate-build-number
runs-on: ubuntu-latest
steps:
- name: Docker Meta
id: meta
uses: docker/metadata-action@v4
with:
images: |
oneuptime/fluent-ingest
ghcr.io/oneuptime/fluent-ingest
tags: |
type=raw,value=test,enable=true
type=semver,value=7.0.${{needs.generate-build-number.outputs.build_number}}-test,pattern={{version}},enable=true
- uses: actions/checkout@v4
with:
ref: ${{ github.ref }}
- uses: actions/setup-node@v4
with:
node-version: latest
- name: Set up QEMU
uses: docker/setup-qemu-action@v2
- name: Set up Docker Buildx
uses: docker/setup-buildx-action@v2
- name: Generate Dockerfile from Dockerfile.tpl
run: npm run prerun
# Build and deploy probe-ingest.
- name: Login to Docker Hub
uses: docker/login-action@v2.2.0
with:
username: ${{ secrets.DOCKERHUB_USERNAME }}
password: ${{ secrets.DOCKERHUB_PASSWORD }}
- name: Login to GitHub Container Registry
uses: docker/login-action@v2.2.0
with:
registry: ghcr.io
username: ${{ github.repository_owner }}
password: ${{ secrets.GITHUB_TOKEN }}
- name: Build and push
uses: docker/build-push-action@v4
with:
file: ./FluentIngest/Dockerfile
context: .
platforms: linux/amd64,linux/arm64
push: true
@@ -680,9 +933,9 @@ jobs:
with:
ref: ${{ github.ref }}
- uses: actions/setup-node@v2
- uses: actions/setup-node@v4
with:
node-version: 18.3.0
node-version: latest
- name: Set up QEMU
uses: docker/setup-qemu-action@v2
@@ -741,9 +994,9 @@ jobs:
with:
ref: ${{ github.ref }}
- uses: actions/setup-node@v2
- uses: actions/setup-node@v4
with:
node-version: 18.3.0
node-version: latest
- name: Set up QEMU
uses: docker/setup-qemu-action@v2
@@ -802,9 +1055,9 @@ jobs:
with:
ref: ${{ github.ref }}
- uses: actions/setup-node@v2
- uses: actions/setup-node@v4
with:
node-version: 18.3.0
node-version: latest
- name: Set up QEMU
uses: docker/setup-qemu-action@v2
@@ -863,9 +1116,9 @@ jobs:
with:
ref: ${{ github.ref }}
- uses: actions/setup-node@v2
- uses: actions/setup-node@v4
with:
node-version: 18.3.0
node-version: latest
- name: Set up QEMU
uses: docker/setup-qemu-action@v2
@@ -924,9 +1177,9 @@ jobs:
with:
ref: ${{ github.ref }}
- uses: actions/setup-node@v2
- uses: actions/setup-node@v4
with:
node-version: 18.3.0
node-version: latest
- name: Set up QEMU
uses: docker/setup-qemu-action@v2
@@ -988,9 +1241,9 @@ jobs:
with:
ref: ${{ github.ref }}
- uses: actions/setup-node@v2
- uses: actions/setup-node@v4
with:
node-version: 18.3.0
node-version: latest
- name: Set up QEMU
uses: docker/setup-qemu-action@v2
@@ -1051,9 +1304,9 @@ jobs:
with:
ref: ${{ github.ref }}
- uses: actions/setup-node@v2
- uses: actions/setup-node@v4
with:
node-version: 18.3.0
node-version: latest
- name: Set up QEMU
uses: docker/setup-qemu-action@v2
@@ -1112,9 +1365,9 @@ jobs:
with:
ref: ${{ github.ref }}
- uses: actions/setup-node@v2
- uses: actions/setup-node@v4
with:
node-version: 18.3.0
node-version: latest
- name: Set up QEMU
uses: docker/setup-qemu-action@v2
@@ -1173,9 +1426,9 @@ jobs:
with:
ref: ${{ github.ref }}
- uses: actions/setup-node@v2
- uses: actions/setup-node@v4
with:
node-version: 18.3.0
node-version: latest
- name: Set up QEMU
uses: docker/setup-qemu-action@v2
@@ -1235,9 +1488,9 @@ jobs:
with:
ref: ${{ github.ref }}
- uses: actions/setup-node@v2
- uses: actions/setup-node@v4
with:
node-version: 18.3.0
node-version: latest
- name: Set up QEMU
uses: docker/setup-qemu-action@v2
@@ -1297,9 +1550,9 @@ jobs:
with:
ref: ${{ github.ref }}
- uses: actions/setup-node@v2
- uses: actions/setup-node@v4
with:
node-version: 18.3.0
node-version: latest
- name: Set up QEMU
uses: docker/setup-qemu-action@v2
@@ -1343,14 +1596,14 @@ jobs:
test-helm-chart:
runs-on: ubuntu-latest
needs: [llm-docker-image-deploy, copilot-docker-image-deploy, docs-docker-image-deploy, worker-docker-image-deploy, workflow-docker-image-deploy, isolated-vm-docker-image-deploy, home-docker-image-deploy, api-reference-docker-image-deploy, test-server-docker-image-deploy, test-docker-image-deploy, ingestor-docker-image-deploy, probe-docker-image-deploy, haraka-docker-image-deploy, dashboard-docker-image-deploy, admin-dashboard-docker-image-deploy, app-docker-image-deploy, accounts-docker-image-deploy, otel-collector-docker-image-deploy, status-page-docker-image-deploy, nginx-docker-image-deploy, e2e-docker-image-deploy]
needs: [infrastructure-agent-deploy, llm-docker-image-deploy, open-telemetry-ingest-docker-image-deploy, copilot-docker-image-deploy, docs-docker-image-deploy, worker-docker-image-deploy, workflow-docker-image-deploy, isolated-vm-docker-image-deploy, home-docker-image-deploy, api-reference-docker-image-deploy, test-server-docker-image-deploy, test-docker-image-deploy, probe-ingest-docker-image-deploy, server-monitor-ingest-docker-image-deploy, probe-docker-image-deploy, haraka-docker-image-deploy, dashboard-docker-image-deploy, admin-dashboard-docker-image-deploy, app-docker-image-deploy, accounts-docker-image-deploy, otel-collector-docker-image-deploy, status-page-docker-image-deploy, nginx-docker-image-deploy, e2e-docker-image-deploy, fluent-ingest-docker-image-deploy, incoming-request-ingest-docker-image-deploy]
env:
CI_PIPELINE_ID: ${{github.run_number}}
steps:
- uses: actions/checkout@v2
- uses: actions/setup-node@v2
- uses: actions/checkout@v4
- uses: actions/setup-node@v4
with:
node-version: 18.3.0
node-version: latest
- run: cd HelmChart && cd Tests && bash index.sh
test-e2e-test-saas:
@@ -1372,10 +1625,10 @@ jobs:
large-packages: true
docker-images: true
swap-storage: true
- uses: actions/checkout@v2
- uses: actions/setup-node@v2
- uses: actions/checkout@v4
- uses: actions/setup-node@v4
with:
node-version: 18.3.0
node-version: latest
- run: npm run prerun && bash ./Tests/Scripts/change-release-to-test-tag.sh
- name: Start Server with release tag
run: npm run start
@@ -1425,10 +1678,10 @@ jobs:
large-packages: true
docker-images: true
swap-storage: true
- uses: actions/checkout@v2
- uses: actions/setup-node@v2
- uses: actions/checkout@v4
- uses: actions/setup-node@v4
with:
node-version: 18.3.0
node-version: latest
- run: npm run prerun && bash ./Tests/Scripts/change-release-to-test-tag.sh
- name: Start Server with release tag
run: npm run start
@@ -1457,6 +1710,56 @@ jobs:
# Optional. Defaults to repository settings.
retention-days: 7
infrastructure-agent-deploy:
needs: [generate-build-number]
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
with:
ref: ${{ github.ref }}
- name: Set up Go
uses: actions/setup-go@v4
- name: Install GoReleaser
uses: goreleaser/goreleaser-action@v6.1.0
with:
install-only: true
- name: GoReleaser Version
run: goreleaser -v
# This tool is used to generate .rpm and .deb packages
- name: Install NFPM
run: go install github.com/goreleaser/nfpm/v2/cmd/nfpm@latest
- name: Show GoReleaser version
run: goreleaser -v
- name: Run GoReleaser
run: cd InfrastructureAgent && export GORELEASER_CURRENT_TAG=7.0.${{needs.generate-build-number.outputs.build_number}} && goreleaser release --clean --snapshot
- name: Release MSI Images
run: cd InfrastructureAgent && bash build-msi.sh 7.0.${{needs.generate-build-number.outputs.build_number}}
- name: Upload Release Binaries
uses: actions/upload-artifact@v4
# Run this on failure
with:
# Name of the artifact to upload.
# Optional. Default is 'artifact'
name: binaries
# A file, directory or wildcard pattern that describes what to upload
# Required.
path: |
./InfrastructureAgent/dist
# Duration after which artifact will expire in days. 0 means using default retention.
# Minimum 1 day.
# Maximum 90 days unless changed from the repository settings page.
# Optional. Defaults to repository settings.
retention-days: 7

View File

@@ -14,10 +14,10 @@ jobs:
CI_PIPELINE_ID: ${{github.run_number}}
BILLING_PRIVATE_KEY: ${{secrets.TEST_BILLING_PRIVATE_KEY}}
steps:
- uses: actions/checkout@v2
- uses: actions/setup-node@v2
- uses: actions/checkout@v4
- uses: actions/setup-node@v4
with:
node-version: 18.3.0
node-version: latest
- run: cd Common && bash test-setup.sh
- run: cd Common && npm install && rm -rf build && npm run test

View File

@@ -1,58 +0,0 @@
name: E2E Tests
on:
pull_request:
push:
branches-ignore:
- 'hotfix-*' # excludes hotfix branches
- 'release'
jobs:
test:
runs-on: ubuntu-latest
env:
CI_PIPELINE_ID: ${{github.run_number}}
steps:
# Docker compose needs a lot of space to build images, so we need to free up some space first in the GitHub Actions runner
- name: Free Disk Space (Ubuntu)
uses: jlumbroso/free-disk-space@main
with:
# this might remove tools that are actually needed,
# if set to "true" but frees about 6 GB
tool-cache: false
android: true
dotnet: true
haskell: true
large-packages: true
docker-images: true
swap-storage: true
- uses: actions/checkout@v2
- uses: actions/setup-node@v2
with:
node-version: 18.3.0
- run: npm run prerun && bash ./Tests/Scripts/enable-billing-env-var.sh
- run: npm run dev
- name: Wait for server to start
run: bash ./Tests/Scripts/status-check.sh http://localhost
- name: Run E2E Tests. Run docker container e2e in docker compose file
run: export $(grep -v '^#' config.env | xargs) && docker compose -f docker-compose.dev.yml up --exit-code-from e2e --abort-on-container-exit e2e || (docker compose -f docker-compose.dev.yml logs e2e && exit 1)
- name: Upload test results
uses: actions/upload-artifact@v4
# Run this on failure
if: failure()
with:
# Name of the artifact to upload.
# Optional. Default is 'artifact'
name: test-results
# A file, directory or wildcard pattern that describes what to upload
# Required.
path: |
./E2E
# Duration after which artifact will expire in days. 0 means using default retention.
# Minimum 1 day.
# Maximum 90 days unless changed from the repository settings page.
# Optional. Defaults to repository settings.
retention-days: 7

View File

@@ -0,0 +1,20 @@
name: Fluent Ingest Test
on:
pull_request:
push:
branches-ignore:
- 'hotfix-*' # excludes hotfix branches
- 'release'
jobs:
test:
runs-on: ubuntu-latest
env:
CI_PIPELINE_ID: ${{github.run_number}}
steps:
- uses: actions/checkout@v4
- uses: actions/setup-node@v4
with:
node-version: latest
- run: cd FluentIngest && npm install && npm run test

View File

@@ -0,0 +1,21 @@
name: Incoming Request Ingest Test
on:
pull_request:
push:
branches-ignore:
- 'hotfix-*' # excludes hotfix branches
- 'release'
jobs:
test:
runs-on: ubuntu-latest
env:
CI_PIPELINE_ID: ${{github.run_number}}
steps:
- uses: actions/checkout@v4
- uses: actions/setup-node@v4
with:
node-version: latest
- run: cd IncomingRequestIngest && npm install && npm run test

View File

@@ -0,0 +1,21 @@
name: OpenTelemetryIngest Test
on:
pull_request:
push:
branches-ignore:
- 'hotfix-*' # excludes hotfix branches
- 'release'
jobs:
test:
runs-on: ubuntu-latest
env:
CI_PIPELINE_ID: ${{github.run_number}}
steps:
- uses: actions/checkout@v4
- uses: actions/setup-node@v4
with:
node-version: latest
- run: cd OpenTelemetryIngest && npm install && npm run test

View File

@@ -1,4 +1,4 @@
name: Ingestor Test
name: ProbeIngest Test
on:
pull_request:
@@ -13,9 +13,9 @@ jobs:
env:
CI_PIPELINE_ID: ${{github.run_number}}
steps:
- uses: actions/checkout@v2
- uses: actions/setup-node@v2
- uses: actions/checkout@v4
- uses: actions/setup-node@v4
with:
node-version: 18.3.0
- run: cd Ingestor && npm install && npm run test
node-version: latest
- run: cd ProbeIngest && npm install && npm run test

View File

@@ -13,10 +13,10 @@ jobs:
env:
CI_PIPELINE_ID: ${{github.run_number}}
steps:
- uses: actions/checkout@v2
- uses: actions/setup-node@v2
- uses: actions/checkout@v4
- uses: actions/setup-node@v4
with:
node-version: 18.3.0
node-version: latest
- run: cd Common && npm install
- run: cd Probe && npm install
- run: cd Probe && npm run test

View File

@@ -13,10 +13,10 @@ jobs:
env:
CI_PIPELINE_ID: ${{github.run_number}}
steps:
- uses: actions/checkout@v2
- uses: actions/setup-node@v2
- uses: actions/checkout@v4
- uses: actions/setup-node@v4
with:
node-version: 18.3.0
node-version: latest
- run: cd App && npm install && npm run test
test-home:
@@ -24,10 +24,10 @@ jobs:
env:
CI_PIPELINE_ID: ${{github.run_number}}
steps:
- uses: actions/checkout@v2
- uses: actions/setup-node@v2
- uses: actions/checkout@v4
- uses: actions/setup-node@v4
with:
node-version: 18.3.0
node-version: latest
- run: cd Home && npm install && npm run test
test-worker:
@@ -35,8 +35,8 @@ jobs:
env:
CI_PIPELINE_ID: ${{github.run_number}}
steps:
- uses: actions/checkout@v2
- uses: actions/setup-node@v2
- uses: actions/checkout@v4
- uses: actions/setup-node@v4
with:
node-version: 18.3.0
node-version: latest
- run: cd Worker && npm install && npm run test

View File

@@ -1 +1 @@
# Description: Copilot will run this script before we commit the changes to your repository.
# Description: Copilot will run this script before we commit the changes to your repository.

82
.vscode/launch.json vendored
View File

@@ -93,7 +93,7 @@
},
{
"address": "127.0.0.1",
"localRoot": "${workspaceFolder}/Worker",
"localRoot": "${workspaceFolder}/Workflow",
"name": "Workflow: Debug with Docker",
"port": 8735,
"remoteRoot": "/usr/src/app",
@@ -107,7 +107,7 @@
},
{
"address": "127.0.0.1",
"localRoot": "${workspaceFolder}/Worker",
"localRoot": "${workspaceFolder}/Docs",
"name": "Docs: Debug with Docker",
"port": 8738,
"remoteRoot": "/usr/src/app",
@@ -121,7 +121,7 @@
},
{
"address": "127.0.0.1",
"localRoot": "${workspaceFolder}/Worker",
"localRoot": "${workspaceFolder}/APIReference",
"name": "API Reference: Debug with Docker",
"port": 8737,
"remoteRoot": "/usr/src/app",
@@ -151,7 +151,7 @@
"address": "127.0.0.1",
"localRoot": "${workspaceFolder}/Probe",
"name": "Probe: Debug with Docker",
"port": 9655,
"port": 9229,
"remoteRoot": "/usr/src/app",
"request": "attach",
"skipFiles": [
@@ -163,8 +163,8 @@
},
{
"address": "127.0.0.1",
"localRoot": "${workspaceFolder}/Ingestor",
"name": "Ingestor: Debug with Docker",
"localRoot": "${workspaceFolder}/ProbeIngest",
"name": "ProbeIngest: Debug with Docker",
"port": 9932,
"remoteRoot": "/usr/src/app",
"request": "attach",
@@ -175,6 +175,62 @@
"restart": true,
"autoAttachChildProcesses": true
},
{
"address": "127.0.0.1",
"localRoot": "${workspaceFolder}/ServerMonitorIngest",
"name": "ServerMonitorIngest: Debug with Docker",
"port": 9941,
"remoteRoot": "/usr/src/app",
"request": "attach",
"skipFiles": [
"<node_internals>/**"
],
"type": "node",
"restart": true,
"autoAttachChildProcesses": true
},
{
"address": "127.0.0.1",
"localRoot": "${workspaceFolder}/IncomingRequestIngest",
"name": "IncomingRequestIngest: Debug with Docker",
"port": 9933,
"remoteRoot": "/usr/src/app",
"request": "attach",
"skipFiles": [
"<node_internals>/**"
],
"type": "node",
"restart": true,
"autoAttachChildProcesses": true
},
{
"address": "127.0.0.1",
"localRoot": "${workspaceFolder}/OpenTelemetryIngest",
"name": "OpenTelemetryIngest: Debug with Docker",
"port": 9938,
"remoteRoot": "/usr/src/app",
"request": "attach",
"skipFiles": [
"<node_internals>/**"
],
"type": "node",
"restart": true,
"autoAttachChildProcesses": true
},
{
"address": "127.0.0.1",
"localRoot": "${workspaceFolder}/FluentIngest",
"name": "Fluent Ingest: Debug with Docker",
"port": 9937,
"remoteRoot": "/usr/src/app",
"request": "attach",
"skipFiles": [
"<node_internals>/**"
],
"type": "node",
"restart": true,
"autoAttachChildProcesses": true
},
{
"address": "127.0.0.1",
"localRoot": "${workspaceFolder}/IsolatedVM",
@@ -217,20 +273,6 @@
"restart": true,
"autoAttachChildProcesses": true
},
{
"address": "127.0.0.1",
"localRoot": "${workspaceFolder}/Workers",
"name": "Workers: Debug with Docker",
"port": 9654,
"remoteRoot": "/usr/src/app",
"request": "attach",
"skipFiles": [
"<node_internals>/**"
],
"type": "node",
"restart": true,
"autoAttachChildProcesses": true
},
{
"address": "127.0.0.1",
"localRoot": "${workspaceFolder}/StatusPage",

View File

@@ -3,7 +3,7 @@
#
# Pull base image nodejs image.
FROM public.ecr.aws/docker/library/node:21.2-alpine3.18
FROM public.ecr.aws/docker/library/node:23.8-alpine3.21
RUN mkdir /tmp/npm && chmod 2777 /tmp/npm && chown 1000:1000 /tmp/npm && npm config set cache /tmp/npm --global
RUN npm config set fetch-retries 5

View File

@@ -17,10 +17,11 @@ const init: PromiseVoidFunction = async (): Promise<void> => {
const statusCheck: PromiseVoidFunction = async (): Promise<void> => {
// Check the status of infrastructure components
return await InfrastructureStatus.checkStatus({
return await InfrastructureStatus.checkStatusWithRetry({
checkClickhouseStatus: false,
checkPostgresStatus: false,
checkRedisStatus: false,
retryCount: 3,
});
};

View File

@@ -12,14 +12,14 @@
</h2>
<script>
function showPermissions(id){
var permissionsblock = document.getElementById(id+"-permissions");
var viewPermissionsBtn = document.getElementById(id+"-view-permissions");
function showPermissions(id) {
var permissionsblock = document.getElementById(id + "-permissions");
var viewPermissionsBtn = document.getElementById(id + "-view-permissions");
if(permissionsblock.style.display === "none"){
if (permissionsblock.style.display === "none") {
permissionsblock.style.display = "block";
viewPermissionsBtn.innerHTML = "Hide Permissions";
}else{
} else {
permissionsblock.style.display = "none";
viewPermissionsBtn.innerHTML = "View Permissions";
}
@@ -48,11 +48,16 @@
<dt class="sr-only">Description</dt>
<dd class="w-full flex-none text-sm [&amp;>:first-child]:mt-0 [&amp;>:last-child]:mb-0">
<p>
<%= pageData.columns[Object.keys(pageData.columns)[i]].description -%> <a class="text-gray-500 hover:underline cursor-pointer text-xs" id="<%= Object.keys(pageData.columns)[i] -%>-view-permissions" onclick="showPermissions('<%= Object.keys(pageData.columns)[i] -%>')">View Permissions</a>
<%= pageData.columns[Object.keys(pageData.columns)[i]].description -%> <a
class="text-gray-500 hover:underline cursor-pointer text-xs"
id="<%= Object.keys(pageData.columns)[i] -%>-view-permissions"
onclick="showPermissions('<%= Object.keys(pageData.columns)[i] -%>')">View
Permissions</a>
</p>
</dd>
<dd class="font-mono text-xs" style="display: none;" id="<%= Object.keys(pageData.columns)[i] -%>-permissions">
<dd class="font-mono text-xs" style="display: none;"
id="<%= Object.keys(pageData.columns)[i] -%>-permissions">
<div class="mb-3 mt-3">
<span class="text-gray-700 text-xs">Permissions to Create:&nbsp;</span>
@@ -319,8 +324,7 @@
<div class="[&amp;>:first-child]:mt-0 [&amp;>:last-child]:mb-0 xl:sticky xl:top-24">
<%- include('../partials/code', {title: "Example Item Request" , requestUrl:
pageData.apiPath+"/3599ee69-43a7-42d7/get-item", code: pageData.itemRequest, requestType: "POST" })
-%>
pageData.apiPath+"/:id/get-item", code: pageData.itemRequest, requestType: "POST" }) -%>
<%- include('../partials/code', {title: "Example Item Response" , code: pageData.itemResponse,
requestType: "" }) -%>
</div>
@@ -469,11 +473,34 @@
</ul>
</div>
<div class="border border-gray-100 bg-gray-50 rounded-md p-4 text-sm mt-10">
<h4 class="font-semibold text-gray-700 ">For clients that do not support PUT requests<h4>
<p class="text-gray-500 text-xs mt-4">
You can also update an object by sending a POST or GET request to these endpoints with the
same
request headers and body.
</p>
<div class="flex items-center gap-x-3 mt-10"><span
class="font-mono text-[0.625rem] font-semibold leading-6 rounded-lg px-1.5 ring-1 ring-inset ring-sky-300 bg-sky-400/10 text-sky-500 ">POST</span><span
class="h-0.5 w-0.5 rounded-full bg-zinc-300 "></span><span
class="font-mono text-xs text-zinc-400">
<%= pageData.apiPath -%>/:id/update-item
</span></div>
<div class="flex items-center gap-x-3 mt-10"><span
class="font-mono text-[0.625rem] font-semibold leading-6 rounded-lg px-1.5 ring-1 ring-inset ring-emerald-300 bg-emerald-400/10 text-emerald-500 ">GET</span><span
class="h-0.5 w-0.5 rounded-full bg-zinc-300 "></span><span
class="font-mono text-xs text-zinc-400">
<%= pageData.apiPath -%>/:id/update-item
</span></div>
</div>
</div>
<div class="[&amp;>:first-child]:mt-0 [&amp;>:last-child]:mb-0 xl:sticky xl:top-24">
<%- include('../partials/code', {title: "Example Update Request" , requestUrl:
pageData.apiPath+"/3599ee69-43a7-42d7", code: pageData.updateRequest, requestType: "PUT" }) -%>
pageData.apiPath+"/:id", code: pageData.updateRequest, requestType: "PUT" }) -%>
<%- include('../partials/code', {title: "Example Update Response" , code: pageData.updateResponse,
requestType: "" }) -%>
</div>
@@ -498,11 +525,34 @@
<p>This endpoint allows you to delete object by its ID. </p>
<div class="border border-gray-100 bg-gray-50 rounded-md p-4 text-sm mt-10">
<h4 class="font-semibold text-gray-700 ">For clients that do not support DELETE requests<h4>
<p class="text-gray-500 text-xs mt-4">
You can also delete an object by sending a POST or GET request to these endpoints with the
same
request headers and body.
</p>
<div class="flex items-center gap-x-3 mt-10"><span
class="font-mono text-[0.625rem] font-semibold leading-6 rounded-lg px-1.5 ring-1 ring-inset ring-sky-300 bg-sky-400/10 text-sky-500 ">POST</span><span
class="h-0.5 w-0.5 rounded-full bg-zinc-300 "></span><span
class="font-mono text-xs text-zinc-400">
<%= pageData.apiPath -%>/:id/delete-item
</span></div>
<div class="flex items-center gap-x-3 mt-10"><span
class="font-mono text-[0.625rem] font-semibold leading-6 rounded-lg px-1.5 ring-1 ring-inset ring-emerald-300 bg-emerald-400/10 text-emerald-500 ">GET</span><span
class="h-0.5 w-0.5 rounded-full bg-zinc-300 "></span><span
class="font-mono text-xs text-zinc-400">
<%= pageData.apiPath -%>/:id/delete-item
</span></div>
</div>
</div>
<div class="[&amp;>:first-child]:mt-0 [&amp;>:last-child]:mb-0 xl:sticky xl:top-24">
<%- include('../partials/code', {title: "Example Delete Request" , requestUrl:
pageData.apiPath+"/3599ee69-43a7-42d7", code: pageData.deleteRequest, requestType: "DELETE" }) -%>
pageData.apiPath+"/:id", code: pageData.deleteRequest, requestType: "DELETE" }) -%>
<%- include('../partials/code', {title: "Example Delete Response" , code: pageData.deleteResponse,
requestType: "" }) -%>
</div>

View File

@@ -3,7 +3,7 @@
#
# Pull base image nodejs image.
FROM public.ecr.aws/docker/library/node:21.7.3-alpine3.18
FROM public.ecr.aws/docker/library/node:23.8-alpine3.21
RUN mkdir /tmp/npm && chmod 2777 /tmp/npm && chown 1000:1000 /tmp/npm && npm config set cache /tmp/npm --global
RUN npm config set fetch-retries 5

View File

@@ -1,5 +1,5 @@
import App from "./App";
import Telemetry from "Common/UI/Utils/Telemetry";
import Telemetry from "Common/UI/Utils/Telemetry/Telemetry";
import React from "react";
import ReactDOM from "react-dom/client";
import { BrowserRouter } from "react-router-dom";

View File

@@ -179,7 +179,7 @@ const RegisterPage: () => JSX.Element = () => {
]);
if (error) {
return <ErrorMessage error={error} />;
return <ErrorMessage message={error} />;
}
if (isLoading) {

View File

@@ -3,7 +3,7 @@
#
# Pull base image nodejs image.
FROM public.ecr.aws/docker/library/node:21.7.3-alpine3.18
FROM public.ecr.aws/docker/library/node:23.8-alpine3.21
RUN mkdir /tmp/npm && chmod 2777 /tmp/npm && chown 1000:1000 /tmp/npm && npm config set cache /tmp/npm --global
RUN npm config set fetch-retries 5

View File

@@ -137,7 +137,7 @@ const DashboardProjectPicker: FunctionComponent<ComponentProps> = (
minLength: 6,
},
footerElement: getFooter(),
fieldType: FormFieldSchemaType.RadioButton,
fieldType: FormFieldSchemaType.OptionChooserButton,
radioButtonOptions: SubscriptionPlan.getSubscriptionPlans(
getAllEnvVars(),
).map((plan: SubscriptionPlan): RadioButton => {

View File

@@ -1,5 +1,5 @@
import App from "./App";
import Telemetry from "Common/UI/Utils/Telemetry";
import Telemetry from "Common/UI/Utils/Telemetry/Telemetry";
import React from "react";
import ReactDOM from "react-dom/client";
import { BrowserRouter } from "react-router-dom";

View File

@@ -41,7 +41,7 @@ const Logout: FunctionComponent = (): ReactElement => {
]}
>
{!error ? <PageLoader isVisible={true} /> : <></>}
{error ? <ErrorMessage error={error} /> : <></>}
{error ? <ErrorMessage message={error} /> : <></>}
</Page>
);
};

View File

@@ -75,7 +75,7 @@ const Projects: FunctionComponent = (): ReactElement => {
minLength: 6,
},
footerElement: getFooter(),
fieldType: FormFieldSchemaType.RadioButton,
fieldType: FormFieldSchemaType.OptionChooserButton,
radioButtonOptions: SubscriptionPlan.getSubscriptionPlans(
getAllEnvVars(),
).map((plan: SubscriptionPlan): RadioButton => {

View File

@@ -72,9 +72,9 @@ const Settings: FunctionComponent = (): ReactElement => {
},
{
field: {
twilioPhoneNumber: true,
twilioPrimaryPhoneNumber: true,
},
title: "Twilio Phone Number",
title: "Primary Twilio Phone Number",
fieldType: FormFieldSchemaType.Phone,
required: true,
description: "You can find this in your Twilio console.",
@@ -83,6 +83,20 @@ const Settings: FunctionComponent = (): ReactElement => {
minLength: 2,
},
},
{
field: {
twilioSecondaryPhoneNumbers: true,
},
title: "Secondary Twilio Phone Number",
fieldType: FormFieldSchemaType.LongText,
required: true,
description:
"If you have bought more phone numbers from Twilio for specific countries, you can add them here.",
placeholder: "+1234567890, +4444444444",
validation: {
minLength: 2,
},
},
]}
modelDetailProps={{
modelType: GlobalConfig,
@@ -97,12 +111,20 @@ const Settings: FunctionComponent = (): ReactElement => {
},
{
field: {
twilioPhoneNumber: true,
twilioPrimaryPhoneNumber: true,
},
title: "Twilio Phone Number",
title: "Primary Twilio Phone Number",
fieldType: FieldType.Phone,
placeholder: "None",
},
{
field: {
twilioSecondaryPhoneNumbers: true,
},
title: "Secondary Twilio Phone Numbers",
fieldType: FieldType.LongText,
placeholder: "None",
},
],
modelId: ObjectID.getZeroObjectID(),
}}

View File

@@ -61,7 +61,7 @@ const Settings: FunctionComponent = (): ReactElement => {
}
if (error) {
return <ErrorMessage error={error} />;
return <ErrorMessage message={error} />;
}
return (

View File

@@ -99,7 +99,7 @@ const Settings: FunctionComponent = (): ReactElement => {
},
title: "Description",
fieldType: FormFieldSchemaType.LongText,
required: true,
required: false,
placeholder: "This probe is to monitor all the internal services.",
},
@@ -170,6 +170,7 @@ const Settings: FunctionComponent = (): ReactElement => {
field: {
description: true,
},
noValueMessage: "-",
title: "Description",
type: FieldType.Text,
},

View File

@@ -3,7 +3,7 @@
#
# Pull base image nodejs image.
FROM public.ecr.aws/docker/library/node:21.2-alpine3.18
FROM public.ecr.aws/docker/library/node:23.8-alpine3.21
RUN mkdir /tmp/npm && chmod 2777 /tmp/npm && chown 1000:1000 /tmp/npm && npm config set cache /tmp/npm --global
RUN npm config set fetch-retries 5

View File

@@ -10,7 +10,7 @@ import GlobalConfigAPI from "Common/Server/API/GlobalConfigAPI";
import MonitorGroupAPI from "Common/Server/API/MonitorGroupAPI";
import NotificationAPI from "Common/Server/API/NotificationAPI";
import TelemetryAPI from "Common/Server/API/TelemetryAPI";
import Ingestor from "Common/Server/API/ProbeAPI";
import ProbeAPI from "Common/Server/API/ProbeAPI";
import ProjectAPI from "Common/Server/API/ProjectAPI";
import ProjectSsoAPI from "Common/Server/API/ProjectSSO";
@@ -18,6 +18,7 @@ import ProjectSsoAPI from "Common/Server/API/ProjectSSO";
import ResellerPlanAPI from "Common/Server/API/ResellerPlanAPI";
import ShortLinkAPI from "Common/Server/API/ShortLinkAPI";
import StatusPageAPI from "Common/Server/API/StatusPageAPI";
import WorkspaceNotificationRuleAPI from "Common/Server/API/WorkspaceNotificationRuleAPI";
import StatusPageDomainAPI from "Common/Server/API/StatusPageDomainAPI";
import StatusPageSubscriberAPI from "Common/Server/API/StatusPageSubscriberAPI";
import UserCallAPI from "Common/Server/API/UserCallAPI";
@@ -156,9 +157,6 @@ import MonitorGroupOwnerUserService, {
import MonitorGroupResourceService, {
Service as MonitorGroupResourceServiceType,
} from "Common/Server/Services/MonitorGroupResourceService";
import MonitorMetricsByMinuteService, {
MonitorMetricsByMinuteService as MonitorMetricsByMinuteServiceType,
} from "Common/Server/Services/MonitorMetricsByMinuteService";
import MonitorOwnerTeamService, {
Service as MonitorOwnerTeamServiceType,
} from "Common/Server/Services/MonitorOwnerTeamService";
@@ -180,6 +178,11 @@ import MonitorStatusService, {
import MonitorTimelineStatusService, {
Service as MonitorTimelineStatusServiceType,
} from "Common/Server/Services/MonitorStatusTimelineService";
// user override
import OnCallDutyPolicyUserOverrideService, {
Service as OnCallDutyPolicyUserOverrideServiceType,
} from "Common/Server/Services/OnCallDutyPolicyUserOverrideService";
import OnCallDutyPolicyUserOverride from "Common/Models/DatabaseModels/OnCallDutyPolicyUserOverride";
import OnCallDutyPolicyCustomFieldService, {
Service as OnCallDutyPolicyCustomFieldServiceType,
} from "Common/Server/Services/OnCallDutyPolicyCustomFieldService";
@@ -376,7 +379,6 @@ import FeatureSet from "Common/Server/Types/FeatureSet";
import Express, { ExpressApplication } from "Common/Server/Utils/Express";
import Log from "Common/Models/AnalyticsModels/Log";
import Metric from "Common/Models/AnalyticsModels/Metric";
import MonitorMetricsByMinute from "Common/Models/AnalyticsModels/MonitorMetricsByMinute";
import Span from "Common/Models/AnalyticsModels/Span";
import ApiKey from "Common/Models/DatabaseModels/ApiKey";
import ApiKeyPermission from "Common/Models/DatabaseModels/ApiKeyPermission";
@@ -500,6 +502,50 @@ import ScheduledMaintenanceTemplateOwnerUserService, {
} from "Common/Server/Services/ScheduledMaintenanceTemplateOwnerUserService";
import TableView from "Common/Models/DatabaseModels/TableView";
import IncidentFeed from "Common/Models/DatabaseModels/IncidentFeed";
import AlertFeed from "Common/Models/DatabaseModels/AlertFeed";
import ScheduledMaintenanceFeed from "Common/Models/DatabaseModels/ScheduledMaintenanceFeed";
import IncidentFeedService, {
Service as IncidentFeedServiceType,
} from "Common/Server/Services/IncidentFeedService";
import AlertFeedService, {
Service as AlertFeedServiceType,
} from "Common/Server/Services/AlertFeedService";
import ScheduledMaintenanceFeedService, {
Service as ScheduledMaintenanceFeedServiceType,
} from "Common/Server/Services/ScheduledMaintenanceFeedService";
import SlackAPI from "Common/Server/API/SlackAPI";
import WorkspaceProjectAuthToken from "Common/Models/DatabaseModels/WorkspaceProjectAuthToken";
import WorkspaceProjectAuthTokenService, {
Service as WorkspaceProjectAuthTokenServiceType,
} from "Common/Server/Services/WorkspaceProjectAuthTokenService";
import WorkspaceUserAuthToken from "Common/Models/DatabaseModels/WorkspaceUserAuthToken";
import WorkspaceUserAuthTokenService, {
Service as WorkspaceUserAuthTokenServiceType,
} from "Common/Server/Services/WorkspaceUserAuthTokenService";
import WorkspaceSetting from "Common/Models/DatabaseModels/WorkspaceSetting";
import WorkspaceSettingService, {
Service as WorkspaceSettingServiceType,
} from "Common/Server/Services/WorkspaceSettingService";
import ProjectUser from "Common/Models/DatabaseModels/ProjectUser";
import ProjectUserService, {
Service as ProjectUserServiceType,
} from "Common/Server/Services/ProjectUserService";
import MonitorFeed from "Common/Models/DatabaseModels/MonitorFeed";
import MonitorFeedService, {
Service as MonitorFeedServiceType,
} from "Common/Server/Services/MonitorFeedService";
const BaseAPIFeatureSet: FeatureSet = {
init: async (): Promise<void> => {
const app: ExpressApplication = Express.getExpressApp();
@@ -522,6 +568,15 @@ const BaseAPIFeatureSet: FeatureSet = {
).getRouter(),
);
// monitor feed
app.use(
`/${APP_NAME.toLocaleLowerCase()}`,
new BaseAPI<MonitorFeed, MonitorFeedServiceType>(
MonitorFeed,
MonitorFeedService,
).getRouter(),
);
app.use(
`/${APP_NAME.toLocaleLowerCase()}`,
new BaseAPI<MonitorTest, MonitorTestServiceType>(
@@ -530,6 +585,59 @@ const BaseAPIFeatureSet: FeatureSet = {
).getRouter(),
);
app.use(
`/${APP_NAME.toLocaleLowerCase()}`,
new BaseAPI<ProjectUser, ProjectUserServiceType>(
ProjectUser,
ProjectUserService,
).getRouter(),
);
//service provider setting
app.use(
`/${APP_NAME.toLocaleLowerCase()}`,
new BaseAPI<WorkspaceSetting, WorkspaceSettingServiceType>(
WorkspaceSetting,
WorkspaceSettingService,
).getRouter(),
);
app.use(
`/${APP_NAME.toLocaleLowerCase()}`,
new BaseAPI<IncidentFeed, IncidentFeedServiceType>(
IncidentFeed,
IncidentFeedService,
).getRouter(),
);
// user override
app.use(
`/${APP_NAME.toLocaleLowerCase()}`,
new BaseAPI<
OnCallDutyPolicyUserOverride,
OnCallDutyPolicyUserOverrideServiceType
>(
OnCallDutyPolicyUserOverride,
OnCallDutyPolicyUserOverrideService,
).getRouter(),
);
app.use(
`/${APP_NAME.toLocaleLowerCase()}`,
new BaseAPI<AlertFeed, AlertFeedServiceType>(
AlertFeed,
AlertFeedService,
).getRouter(),
);
app.use(
`/${APP_NAME.toLocaleLowerCase()}`,
new BaseAPI<
ScheduledMaintenanceFeed,
ScheduledMaintenanceFeedServiceType
>(ScheduledMaintenanceFeed, ScheduledMaintenanceFeedService).getRouter(),
);
app.use(
`/${APP_NAME.toLocaleLowerCase()}`,
new BaseAPI<AlertNoteTemplate, AlertNoteTemplateServiceType>(
@@ -538,6 +646,26 @@ const BaseAPIFeatureSet: FeatureSet = {
).getRouter(),
);
app.use(
`/${APP_NAME.toLocaleLowerCase()}`,
new BaseAPI<
WorkspaceProjectAuthToken,
WorkspaceProjectAuthTokenServiceType
>(
WorkspaceProjectAuthToken,
WorkspaceProjectAuthTokenService,
).getRouter(),
);
// user auth token
app.use(
`/${APP_NAME.toLocaleLowerCase()}`,
new BaseAPI<WorkspaceUserAuthToken, WorkspaceUserAuthTokenServiceType>(
WorkspaceUserAuthToken,
WorkspaceUserAuthTokenService,
).getRouter(),
);
app.use(
`/${APP_NAME.toLocaleLowerCase()}`,
new BaseAPI<Alert, AlertServiceType>(Alert, AlertService).getRouter(),
@@ -673,14 +801,6 @@ const BaseAPIFeatureSet: FeatureSet = {
).getRouter(),
);
app.use(
`/${APP_NAME.toLocaleLowerCase()}`,
new BaseAnalyticsAPI<
MonitorMetricsByMinute,
MonitorMetricsByMinuteServiceType
>(MonitorMetricsByMinute, MonitorMetricsByMinuteService).getRouter(),
);
app.use(
`/${APP_NAME.toLocaleLowerCase()}`,
new BaseAPI<TelemetryIngestionKey, TelemetryIngestionKeyServiceType>(
@@ -1321,6 +1441,10 @@ const BaseAPIFeatureSet: FeatureSet = {
`/${APP_NAME.toLocaleLowerCase()}`,
new StatusPageAPI().getRouter(),
);
app.use(
`/${APP_NAME.toLocaleLowerCase()}`,
new WorkspaceNotificationRuleAPI().getRouter(),
);
app.use(`/${APP_NAME.toLocaleLowerCase()}`, new FileAPI().getRouter());
app.use(
`/${APP_NAME.toLocaleLowerCase()}`,
@@ -1340,6 +1464,7 @@ const BaseAPIFeatureSet: FeatureSet = {
`/${APP_NAME.toLocaleLowerCase()}`,
new ResellerPlanAPI().getRouter(),
);
app.use(`/${APP_NAME.toLocaleLowerCase()}`, new SlackAPI().getRouter());
app.use(
`/${APP_NAME.toLocaleLowerCase()}`,
new GlobalConfigAPI().getRouter(),
@@ -1371,7 +1496,7 @@ const BaseAPIFeatureSet: FeatureSet = {
);
app.use(`/${APP_NAME.toLocaleLowerCase()}`, new UserEmailAPI().getRouter());
app.use(`/${APP_NAME.toLocaleLowerCase()}`, new UserSMSAPI().getRouter());
app.use(`/${APP_NAME.toLocaleLowerCase()}`, new Ingestor().getRouter());
app.use(`/${APP_NAME.toLocaleLowerCase()}`, new ProbeAPI().getRouter());
app.use(
`/${APP_NAME.toLocaleLowerCase()}`,

View File

@@ -36,6 +36,7 @@ import ProjectSSO from "Common/Models/DatabaseModels/ProjectSso";
import TeamMember from "Common/Models/DatabaseModels/TeamMember";
import User from "Common/Models/DatabaseModels/User";
import xml2js from "xml2js";
import Name from "Common/Types/Name";
const router: ExpressRouter = Express.getRouter();
@@ -45,106 +46,112 @@ const router: ExpressRouter = Express.getRouter();
router.get(
"/service-provider-login",
async (req: ExpressRequest, res: ExpressResponse): Promise<void> => {
if (!req.query["email"]) {
return Response.sendErrorResponse(
req,
res,
new BadRequestException("Email is required"),
);
}
try {
if (!req.query["email"]) {
return Response.sendErrorResponse(
req,
res,
new BadRequestException("Email is required"),
);
}
const email: Email = new Email(req.query["email"] as string);
const email: Email = new Email(req.query["email"] as string);
if (!email) {
return Response.sendErrorResponse(
req,
res,
new BadRequestException("Email is required"),
);
}
if (!email) {
return Response.sendErrorResponse(
req,
res,
new BadRequestException("Email is required"),
);
}
// get sso config for this user.
// get sso config for this user.
const user: User | null = await UserService.findOneBy({
query: { email: email },
select: {
_id: true,
},
props: {
isRoot: true,
},
});
if (!user) {
return Response.sendErrorResponse(
req,
res,
new BadRequestException("No SSO config found for this user"),
);
}
const userId: ObjectID = user.id!;
if (!userId) {
return Response.sendErrorResponse(
req,
res,
new BadRequestException("No SSO config found for this user"),
);
}
const projectUserBelongsTo: Array<ObjectID> = (
await TeamMemberService.findBy({
query: { userId: userId },
const user: User | null = await UserService.findOneBy({
query: { email: email },
select: {
projectId: true,
_id: true,
},
limit: LIMIT_PER_PROJECT,
skip: 0,
props: {
isRoot: true,
},
})
).map((teamMember: TeamMember) => {
return teamMember.projectId!;
});
});
if (projectUserBelongsTo.length === 0) {
return Response.sendErrorResponse(
if (!user) {
return Response.sendErrorResponse(
req,
res,
new BadRequestException("No SSO config found for this user"),
);
}
const userId: ObjectID = user.id!;
if (!userId) {
return Response.sendErrorResponse(
req,
res,
new BadRequestException("No SSO config found for this user"),
);
}
const projectUserBelongsTo: Array<ObjectID> = (
await TeamMemberService.findBy({
query: { userId: userId },
select: {
projectId: true,
},
limit: LIMIT_PER_PROJECT,
skip: 0,
props: {
isRoot: true,
},
})
).map((teamMember: TeamMember) => {
return teamMember.projectId!;
});
if (projectUserBelongsTo.length === 0) {
return Response.sendErrorResponse(
req,
res,
new BadRequestException("No SSO config found for this user"),
);
}
const projectSSOList: Array<ProjectSSO> = await ProjectSSOService.findBy({
query: {
projectId: QueryHelper.any(projectUserBelongsTo),
isEnabled: true,
},
limit: LIMIT_PER_PROJECT,
skip: 0,
select: {
name: true,
description: true,
_id: true,
projectId: true,
project: {
name: true,
} as Select<Project>,
},
props: {
isRoot: true,
},
});
return Response.sendEntityArrayResponse(
req,
res,
new BadRequestException("No SSO config found for this user"),
projectSSOList,
projectSSOList.length,
ProjectSSO,
);
} catch (err) {
logger.error(err);
Response.sendErrorResponse(req, res, err as Exception);
}
const projectSSOList: Array<ProjectSSO> = await ProjectSSOService.findBy({
query: {
projectId: QueryHelper.any(projectUserBelongsTo),
isEnabled: true,
},
limit: LIMIT_PER_PROJECT,
skip: 0,
select: {
name: true,
description: true,
_id: true,
projectId: true,
project: {
name: true,
} as Select<Project>,
},
props: {
isRoot: true,
},
});
return Response.sendEntityArrayResponse(
req,
res,
projectSSOList,
projectSSOList.length,
ProjectSSO,
);
},
);
@@ -153,7 +160,7 @@ router.get(
async (
req: ExpressRequest,
res: ExpressResponse,
next: NextFunction,
_next: NextFunction,
): Promise<void> => {
try {
if (!req.params["projectId"]) {
@@ -227,7 +234,9 @@ router.get(
return Response.redirect(req, res, samlRequestUrl);
} catch (err) {
return next(err);
logger.error(err);
Response.sendErrorResponse(req, res, err as Exception);
}
},
);
@@ -275,6 +284,7 @@ const loginUserWithSso: LoginUserWithSsoFunction = async (
let issuerUrl: string = "";
let email: Email | null = null;
let fullName: Name | null = null;
if (!req.params["projectId"]) {
return Response.sendErrorResponse(
@@ -364,6 +374,7 @@ const loginUserWithSso: LoginUserWithSsoFunction = async (
issuerUrl = SSOUtil.getIssuer(response);
email = SSOUtil.getEmail(response);
fullName = SSOUtil.getUserFullName(response);
} catch (err: unknown) {
if (err instanceof Exception) {
return Response.sendErrorResponse(req, res, err);
@@ -412,6 +423,7 @@ const loginUserWithSso: LoginUserWithSsoFunction = async (
alreadySavedUser = await UserService.createByEmail({
email,
name: fullName || undefined,
isEmailVerified: true,
generateRandomPassword: true,
props: {
@@ -522,7 +534,8 @@ const loginUserWithSso: LoginUserWithSsoFunction = async (
);
} catch (err) {
logger.error(err);
Response.sendErrorResponse(req, res, new ServerException());
Response.sendErrorResponse(req, res, err as Exception);
}
};

View File

@@ -8,6 +8,7 @@ import logger from "Common/Server/Utils/Logger";
import xmlCrypto, { FileKeyInfo } from "xml-crypto";
import xmldom from "xmldom";
import zlib from "zlib";
import Name from "Common/Types/Name";
export default class SSOUtil {
public static createSAMLRequestUrl(data: {
@@ -138,6 +139,88 @@ export default class SSOUtil {
}
}
public static getUserFullName(payload: JSONObject): Name | null {
if (!payload["saml2p:Response"] && !payload["samlp:Response"]) {
return null;
}
payload =
(payload["saml2p:Response"] as JSONObject) ||
(payload["samlp:Response"] as JSONObject) ||
(payload["Response"] as JSONObject);
const samlAssertion: JSONArray =
(payload["saml2:Assertion"] as JSONArray) ||
(payload["saml:Assertion"] as JSONArray) ||
(payload["Assertion"] as JSONArray);
if (!samlAssertion || samlAssertion.length === 0) {
return null;
}
const samlAttributeStatement: JSONArray =
((samlAssertion[0] as JSONObject)[
"saml2:AttributeStatement"
] as JSONArray) ||
((samlAssertion[0] as JSONObject)[
"saml:AttributeStatement"
] as JSONArray) ||
((samlAssertion[0] as JSONObject)["AttributeStatement"] as JSONArray);
if (!samlAttributeStatement || samlAttributeStatement.length === 0) {
return null;
}
const samlAttribute: JSONArray =
((samlAttributeStatement[0] as JSONObject)[
"saml2:Attribute"
] as JSONArray) ||
((samlAttributeStatement[0] as JSONObject)[
"saml:Attribute"
] as JSONArray) ||
((samlAttributeStatement[0] as JSONObject)["Attribute"] as JSONArray);
if (!samlAttribute || samlAttribute.length === 0) {
return null;
}
// get displayName attribute.
// {
// "$": {
// "Name": "http://schemas.microsoft.com/identity/claims/displayname"
// },
// "AttributeValue": [
// "Nawaz Dhandala"
// ]
// },
for (let i: number = 0; i < samlAttribute.length; i++) {
const attribute: JSONObject = samlAttribute[i] as JSONObject;
if (
attribute["$"] &&
(attribute["$"] as JSONObject)["Name"]?.toString()
) {
const name: string | undefined = (attribute["$"] as JSONObject)[
"Name"
]?.toString();
if (
name &&
name === "http://schemas.microsoft.com/identity/claims/displayname" &&
attribute["AttributeValue"] &&
Array.isArray(attribute["AttributeValue"]) &&
attribute["AttributeValue"].length > 0
) {
const fullName: Name = new Name(
attribute["AttributeValue"][0]!.toString() as string,
);
return fullName;
}
}
}
return null;
}
public static getEmail(payload: JSONObject): Email {
if (!payload["saml2p:Response"] && !payload["samlp:Response"]) {
throw new BadRequestException("SAML Response not found.");

View File

@@ -54,7 +54,8 @@ router.post("/test", async (req: ExpressRequest, res: ExpressResponse) => {
_id: true,
twilioAccountSID: true,
twilioAuthToken: true,
twilioPhoneNumber: true,
twilioPrimaryPhoneNumber: true,
twilioSecondaryPhoneNumbers: true,
projectId: true,
},
});
@@ -97,11 +98,11 @@ router.post("/test", async (req: ExpressRequest, res: ExpressResponse) => {
);
}
if (!config.twilioPhoneNumber) {
if (!config.twilioPrimaryPhoneNumber) {
return Response.sendErrorResponse(
req,
res,
new BadDataException("twilioPhoneNumber is required"),
new BadDataException("twilioPrimaryPhoneNumber is required"),
);
}

View File

@@ -53,7 +53,8 @@ router.post("/test", async (req: ExpressRequest, res: ExpressResponse) => {
_id: true,
twilioAccountSID: true,
twilioAuthToken: true,
twilioPhoneNumber: true,
twilioPrimaryPhoneNumber: true,
twilioSecondaryPhoneNumbers: true,
projectId: true,
},
});
@@ -96,11 +97,11 @@ router.post("/test", async (req: ExpressRequest, res: ExpressResponse) => {
);
}
if (!config.twilioPhoneNumber) {
if (!config.twilioPrimaryPhoneNumber) {
return Response.sendErrorResponse(
req,
res,
new BadDataException("twilioPhoneNumber is required"),
new BadDataException("twilioPrimaryPhoneNumber is required"),
);
}

View File

@@ -10,6 +10,7 @@ import GlobalConfigService from "Common/Server/Services/GlobalConfigService";
import GlobalConfig, {
EmailServerType,
} from "Common/Models/DatabaseModels/GlobalConfig";
import Phone from "Common/Types/Phone";
export const InternalSmtpPassword: string =
process.env["INTERNAL_SMTP_PASSWORD"] || "";
@@ -196,7 +197,8 @@ export const getTwilioConfig: GetTwilioConfigFunction =
select: {
twilioAccountSID: true,
twilioAuthToken: true,
twilioPhoneNumber: true,
twilioPrimaryPhoneNumber: true,
twilioSecondaryPhoneNumbers: true,
},
});
@@ -207,7 +209,7 @@ export const getTwilioConfig: GetTwilioConfigFunction =
if (
!globalConfig.twilioAccountSID ||
!globalConfig.twilioAuthToken ||
!globalConfig.twilioPhoneNumber
!globalConfig.twilioPrimaryPhoneNumber
) {
return null;
}
@@ -215,7 +217,16 @@ export const getTwilioConfig: GetTwilioConfigFunction =
return {
accountSid: globalConfig.twilioAccountSID,
authToken: globalConfig.twilioAuthToken,
phoneNumber: globalConfig.twilioPhoneNumber,
primaryPhoneNumber: globalConfig.twilioPrimaryPhoneNumber,
secondaryPhoneNumbers:
globalConfig.twilioSecondaryPhoneNumbers &&
globalConfig.twilioSecondaryPhoneNumbers.length > 0
? globalConfig.twilioSecondaryPhoneNumbers
.split(",")
.map((phoneNumber: string) => {
return new Phone(phoneNumber.trim());
})
: [],
};
};

View File

@@ -26,6 +26,7 @@ import CallLog from "Common/Models/DatabaseModels/CallLog";
import Project from "Common/Models/DatabaseModels/Project";
import Twilio from "twilio";
import { CallInstance } from "twilio/lib/rest/api/v2010/account/call";
import Phone from "Common/Types/Phone";
export default class CallService {
public static async makeCall(
@@ -71,7 +72,14 @@ export default class CallService {
);
callLog.toNumber = callRequest.to;
callLog.fromNumber = twilioConfig.phoneNumber;
const fromNumber: Phone = Phone.pickPhoneNumberToSendSMSOrCallFrom({
to: callRequest.to,
primaryPhoneNumberToPickFrom: twilioConfig.primaryPhoneNumber,
seocndaryPhoneNumbersToPickFrom:
twilioConfig.secondaryPhoneNumbers || [],
});
callLog.fromNumber = fromNumber;
callLog.callData =
options && options.isSensitive
? { message: "This call is sensitive and is not logged" }
@@ -232,7 +240,7 @@ export default class CallService {
const twillioCall: CallInstance = await client.calls.create({
twiml: this.generateTwimlForCall(callRequest),
to: callRequest.to.toString(),
from: twilioConfig.phoneNumber.toString(), // From a valid Twilio number
from: fromNumber.toString(), // From a valid Twilio number
});
logger.debug("Call Request sent successfully.");

View File

@@ -35,6 +35,7 @@ import fsp from "fs/promises";
import Handlebars from "handlebars";
import nodemailer, { Transporter } from "nodemailer";
import Path from "path";
import * as tls from "tls";
export default class MailService {
public static isSMTPConfigValid(obj: JSONObject): boolean {
@@ -204,10 +205,19 @@ export default class MailService {
timeout?: number | undefined;
},
): Transporter {
let tlsOptions: tls.ConnectionOptions | undefined = undefined;
if (!emailServer.secure) {
tlsOptions = {
rejectUnauthorized: false,
};
}
const privateMailer: Transporter = nodemailer.createTransport({
host: emailServer.host.toString(),
port: emailServer.port.toNumber(),
secure: emailServer.secure,
tls: tlsOptions,
auth:
emailServer.username && emailServer.password
? {

View File

@@ -83,7 +83,14 @@ export default class SmsService {
twilioConfig.authToken,
);
smsLog.fromNumber = twilioConfig.phoneNumber;
const fromNumber: Phone = Phone.pickPhoneNumberToSendSMSOrCallFrom({
to: to,
primaryPhoneNumberToPickFrom: twilioConfig.primaryPhoneNumber,
seocndaryPhoneNumbersToPickFrom:
twilioConfig.secondaryPhoneNumbers || [],
});
smsLog.fromNumber = fromNumber;
let project: Project | null = null;
@@ -230,7 +237,7 @@ export default class SmsService {
const twillioMessage: MessageInstance = await client.messages.create({
body: message,
to: to.toString(),
from: twilioConfig.phoneNumber.toString(), // From a valid Twilio number
from: fromNumber.toString(), // From a valid Twilio number
});
smsLog.status = SmsStatus.Success;

View File

@@ -0,0 +1,17 @@
{{> Start this}}
{{> CustomLogo this}}
{{> EmailTitle title=(concat statusPageName " - Please confirm your subscription" ) }}
{{> InfoBlock info="You will be the first to hear from us when there are any incidents, announcements or scheduled maintenance events."}}
{{> ButtonBlock buttonUrl=confirmationUrl buttonText="Confirm Subscription"}}
{{> InfoBlock info="You can also view the status page by visiting this link:"}}
{{> InfoBlock info=statusPageUrl}}
{{> UnsubscribeBlock this}}
{{> VerticalSpace this}}
{{> End this}}

View File

@@ -39,7 +39,7 @@
{{> InfoBlock info="No resources have been added to this status page yet."}}
{{/ifCond}}
{{> InfoBlock info=(concat "This is an automated email sent to you because you are subscribed to " statusPageName) }}
{{> InfoBlock info=(concat subscriberEmailNotificationFooterText "") }}
{{> InfoBlock info="You can visit the status page here:"}}

View File

@@ -3,16 +3,15 @@
{{> CustomLogo this}}
{{> EmailTitle title=(concat "You have been subscribed to status page - " statusPageName) }}
{{> InfoBlock info=(concat "You have been subscribed to status page - " statusPageName)}}
{{> InfoBlock info="You will be the first to hear from us when there are any incidents, announcements or scheduled maintenance events."}}
{{> ButtonBlock buttonUrl=statusPageUrl buttonText="Go to Status Page"}}
{{> InfoBlock info="You can also view the status page by visiting these link:"}}
{{> InfoBlock info="You can also view the status page by visiting this link:"}}
{{> InfoBlock info=statusPageUrl}}
{{> UnsubscribeBlock this}}
{{> VerticalSpace this}}
{{> End this}}
{{> End this}}

View File

@@ -10,7 +10,7 @@
{{> DetailBoxField title="" text=announcementDescription }}
{{> DetailBoxEnd this }}
{{> InfoBlock info=(concat "This is an automated email sent to you because you are subscribed to " statusPageName) }}
{{> InfoBlock info=(concat subscriberEmailNotificationFooterText "") }}
{{> InfoBlock info="You can visit the status page here:"}}

View File

@@ -17,7 +17,7 @@
{{> DetailBoxEnd this }}
{{> InfoBlock info=(concat "This is an automated email sent to you because you are subscribed to " statusPageName) }}
{{> InfoBlock info=(concat subscriberEmailNotificationFooterText "") }}
{{> InfoBlock info="You can visit the status page here:"}}

View File

@@ -14,7 +14,7 @@
{{> DetailBoxEnd this }}
{{> InfoBlock info=(concat "This is an automated email sent to you because you are subscribed to " statusPageName) }}
{{> InfoBlock info=(concat subscriberEmailNotificationFooterText "") }}
{{> InfoBlock info="You can visit the status page here:"}}

View File

@@ -1,7 +1,7 @@
{{> Start this}}
{{> CustomLogo this}}
{{> EmailTitle title=(concat "Incident: " incidentTitle) }}
{{> EmailTitle title=emailTitle }}
{{> InfoBlock info="Incident state has changed. Here are the details: "}}
@@ -14,7 +14,7 @@
{{> DetailBoxField title="" text=incidentDescription }}
{{> DetailBoxEnd this }}
{{> InfoBlock info=(concat "This is an automated email sent to you because you are subscribed to " statusPageName) }}
{{> InfoBlock info=(concat subscriberEmailNotificationFooterText "") }}
{{> InfoBlock info="You can visit the status page here:"}}
{{> InfoBlock info=statusPageUrl}}

View File

@@ -21,7 +21,7 @@
{{> DetailBoxEnd this }}
{{> InfoBlock info=(concat "This is an automated email sent to you because you are subscribed to " statusPageName) }}
{{> InfoBlock info=(concat subscriberEmailNotificationFooterText "") }}
{{> InfoBlock info="You can visit the status page here:"}}

View File

@@ -22,7 +22,7 @@
{{> InfoBlock info=(concat "This is an automated email sent to you because you are subscribed to " statusPageName) }}
{{> InfoBlock info=(concat subscriberEmailNotificationFooterText "") }}
{{> InfoBlock info="You can visit the status page here:"}}

View File

@@ -19,7 +19,7 @@
{{> DetailBoxField title="" text=eventDescription }}
{{> DetailBoxEnd this }}
{{> InfoBlock info=(concat "This is an automated email sent to you because you are subscribed to " statusPageName) }}
{{> InfoBlock info=(concat subscriberEmailNotificationFooterText "") }}
{{> InfoBlock info="You can visit the status page here:"}}

View File

@@ -24,10 +24,42 @@ const init: PromiseVoidFunction = async (): Promise<void> => {
const statusCheck: PromiseVoidFunction = async (): Promise<void> => {
// Check the status of infrastructure components
return await InfrastructureStatus.checkStatus({
return await InfrastructureStatus.checkStatusWithRetry({
checkClickhouseStatus: true,
checkPostgresStatus: true,
checkRedisStatus: true,
retryCount: 3,
});
};
const globalCacheCheck: PromiseVoidFunction = async (): Promise<void> => {
// Check the status of cache
return await InfrastructureStatus.checkStatusWithRetry({
checkClickhouseStatus: false,
checkPostgresStatus: false,
checkRedisStatus: true,
retryCount: 3,
});
};
const analyticsDatabaseCheck: PromiseVoidFunction =
async (): Promise<void> => {
// Check the status of analytics database
return await InfrastructureStatus.checkStatusWithRetry({
checkClickhouseStatus: true,
checkPostgresStatus: false,
checkRedisStatus: false,
retryCount: 3,
});
};
const databaseCheck: PromiseVoidFunction = async (): Promise<void> => {
// Check the status of database
return await InfrastructureStatus.checkStatusWithRetry({
checkClickhouseStatus: false,
checkPostgresStatus: true,
checkRedisStatus: false,
retryCount: 3,
});
};
@@ -37,6 +69,9 @@ const init: PromiseVoidFunction = async (): Promise<void> => {
statusOptions: {
liveCheck: statusCheck,
readyCheck: statusCheck,
globalCacheCheck: globalCacheCheck,
analyticsDatabaseCheck: analyticsDatabaseCheck,
databaseCheck: databaseCheck,
},
});

1778
Clickhouse/config.xml Normal file

File diff suppressed because it is too large Load Diff

View File

@@ -10,7 +10,7 @@ import { SpanStatus } from "./Span";
export default class ExceptionInstance extends AnalyticsBaseModel {
public constructor() {
super({
tableName: "ExceptionInstanceTelemetry",
tableName: "ExceptionItem",
tableEngine: AnalyticsTableEngine.MergeTree,
singularName: "Exception",
pluralName: "Exceptions",
@@ -369,8 +369,8 @@ export default class ExceptionInstance extends AnalyticsBaseModel {
},
}),
],
sortKeys: ["projectId", "serviceId", "fingerprint", "time"],
primaryKeys: ["projectId", "serviceId", "fingerprint"],
sortKeys: ["projectId", "time", "serviceId", "fingerprint"],
primaryKeys: ["projectId", "time", "serviceId", "fingerprint"],
});
}

View File

@@ -1,7 +1,6 @@
import AnalyticsBaseModel from "./AnalyticsBaseModel/AnalyticsBaseModel";
import Log from "./Log";
import Metric from "./Metric";
import MonitorMetricsByMinute from "./MonitorMetricsByMinute";
import Span from "./Span";
import TelemetryAttribute from "./TelemetryAttribute";
import ExceptionInstance from "./ExceptionInstance";
@@ -10,7 +9,6 @@ const AnalyticsModels: Array<{ new (): AnalyticsBaseModel }> = [
Log,
Span,
Metric,
MonitorMetricsByMinute,
TelemetryAttribute,
ExceptionInstance,
];

View File

@@ -11,7 +11,7 @@ import LogSeverity from "../../Types/Log/LogSeverity";
export default class Log extends AnalyticsBaseModel {
public constructor() {
super({
tableName: "LogTelemetry",
tableName: "LogItem",
tableEngine: AnalyticsTableEngine.MergeTree,
singularName: "Log",
enableRealtimeEventsOn: {
@@ -278,8 +278,8 @@ export default class Log extends AnalyticsBaseModel {
},
}),
],
sortKeys: ["projectId", "serviceId", "time"],
primaryKeys: ["projectId", "serviceId"],
sortKeys: ["projectId", "time", "serviceId"],
primaryKeys: ["projectId", "time", "serviceId"],
});
}

View File

@@ -19,10 +19,17 @@ export enum MetricPointType {
ExponentialHistogram = "ExponentialHistogram",
}
export enum ServiceType {
OpenTelemetry = "OpenTelemetry",
Monitor = "Monitor",
Alert = "Alert",
Incident = "Incident",
}
export default class Metric extends AnalyticsBaseModel {
public constructor() {
super({
tableName: "MetricTelemetry",
tableName: "MetricItem",
tableEngine: AnalyticsTableEngine.MergeTree,
singularName: "Metric",
pluralName: "Metrics",
@@ -78,10 +85,11 @@ export default class Metric extends AnalyticsBaseModel {
},
}),
// this can also be the monitor id or the telemetry service id.
new AnalyticsTableColumn({
key: "serviceId",
title: "Service ID",
description: "ID of the Service which created the log",
description: "ID of the Service which created the Metric",
required: true,
type: TableColumnType.ObjectID,
accessControl: {
@@ -101,6 +109,30 @@ export default class Metric extends AnalyticsBaseModel {
},
}),
// this can also be the monitor id or the telemetry service id.
new AnalyticsTableColumn({
key: "serviceType",
title: "Service Type",
description: "Type of the service that this telemetry belongs to",
required: false,
type: TableColumnType.Text,
accessControl: {
read: [
Permission.ProjectOwner,
Permission.ProjectAdmin,
Permission.ProjectMember,
Permission.ReadTelemetryServiceLog,
],
create: [
Permission.ProjectOwner,
Permission.ProjectAdmin,
Permission.ProjectMember,
Permission.CreateTelemetryServiceLog,
],
update: [],
},
}),
// add name and description
new AnalyticsTableColumn({
@@ -522,8 +554,8 @@ export default class Metric extends AnalyticsBaseModel {
},
}),
],
sortKeys: ["projectId", "serviceId", "time"],
primaryKeys: ["projectId", "serviceId"],
sortKeys: ["projectId", "time", "serviceId"],
primaryKeys: ["projectId", "time", "serviceId"],
});
}
@@ -539,6 +571,10 @@ export default class Metric extends AnalyticsBaseModel {
return this.getColumnValue("serviceId") as ObjectID | undefined;
}
public get serviceType(): ServiceType | undefined {
return this.getColumnValue("serviceType") as ServiceType | undefined;
}
public get name(): string | undefined {
return this.getColumnValue("name") as string | undefined;
}
@@ -595,6 +631,10 @@ export default class Metric extends AnalyticsBaseModel {
this.setColumnValue("serviceId", v);
}
public set serviceType(v: ServiceType | undefined) {
this.setColumnValue("serviceType", v);
}
public get time(): Date | undefined {
return this.getColumnValue("time") as Date | undefined;
}

View File

@@ -1,177 +0,0 @@
import AnalyticsBaseModel from "./AnalyticsBaseModel/AnalyticsBaseModel";
import Route from "../../Types/API/Route";
import AnalyticsTableEngine from "../../Types/AnalyticsDatabase/AnalyticsTableEngine";
import AnalyticsTableColumn from "../../Types/AnalyticsDatabase/TableColumn";
import TableColumnType from "../../Types/AnalyticsDatabase/TableColumnType";
import BrowserType from "../../Types/BrowserType";
import { JSONObject } from "../../Types/JSON";
import { CheckOn } from "../../Types/Monitor/CriteriaFilter";
import ObjectID from "../../Types/ObjectID";
import Permission from "../../Types/Permission";
import ScreenSizeType from "../../Types/ScreenSizeType";
export interface MonitorMetricsMiscData {
diskPath?: string;
probeId?: string;
browserType?: BrowserType;
screenSizeType?: ScreenSizeType;
}
export default class MonitorMetricsByMinute extends AnalyticsBaseModel {
public constructor() {
super({
tableName: "MonitorMetrics",
tableEngine: AnalyticsTableEngine.MergeTree,
singularName: "Monitor Metric",
pluralName: "Monitor Metrics",
accessControl: {
read: [
Permission.ProjectOwner,
Permission.ProjectAdmin,
Permission.ProjectMember,
Permission.ReadProjectMonitor,
],
create: [],
update: [],
delete: [],
},
crudApiPath: new Route("/monitor-metrics"),
tableColumns: [
new AnalyticsTableColumn({
key: "projectId",
title: "Project ID",
description: "ID of project",
required: true,
type: TableColumnType.ObjectID,
isTenantId: true,
accessControl: {
read: [
Permission.ProjectOwner,
Permission.ProjectAdmin,
Permission.ProjectMember,
Permission.ReadProjectMonitor,
],
create: [],
update: [],
},
}),
new AnalyticsTableColumn({
key: "monitorId",
title: "Monitor ID",
description: "ID of the Monitor which this metric belongs to",
required: true,
type: TableColumnType.ObjectID,
accessControl: {
read: [
Permission.ProjectOwner,
Permission.ProjectAdmin,
Permission.ProjectMember,
Permission.ReadProjectMonitor,
],
create: [],
update: [],
},
}),
new AnalyticsTableColumn({
key: "metricType",
title: "Metric Type",
description: "Type of metric",
required: true,
type: TableColumnType.Text,
accessControl: {
read: [
Permission.ProjectOwner,
Permission.ProjectAdmin,
Permission.ProjectMember,
Permission.ReadProjectMonitor,
],
create: [],
update: [],
},
}),
new AnalyticsTableColumn({
key: "metricValue",
title: "Metric Value",
description: "Value of the metric",
required: true,
type: TableColumnType.Number,
accessControl: {
read: [
Permission.ProjectOwner,
Permission.ProjectAdmin,
Permission.ProjectMember,
Permission.ReadProjectMonitor,
],
create: [],
update: [],
},
}),
new AnalyticsTableColumn({
key: "miscData",
title: "Misc Data",
description: "Misc data for the metric (if any)",
required: false,
type: TableColumnType.JSON,
accessControl: {
read: [
Permission.ProjectOwner,
Permission.ProjectAdmin,
Permission.ProjectMember,
Permission.ReadProjectMonitor,
],
create: [],
update: [],
},
}),
],
sortKeys: ["projectId", "monitorId", "createdAt"],
primaryKeys: ["projectId", "monitorId"],
});
}
public get projectId(): ObjectID | undefined {
return this.getColumnValue("projectId") as ObjectID | undefined;
}
public set projectId(v: ObjectID | undefined) {
this.setColumnValue("projectId", v);
}
public get monitorId(): ObjectID | undefined {
return this.getColumnValue("monitorId") as ObjectID | undefined;
}
public set monitorId(v: ObjectID | undefined) {
this.setColumnValue("monitorId", v);
}
public get metricType(): CheckOn | undefined {
return this.getColumnValue("metricType") as CheckOn | undefined;
}
public set metricType(v: CheckOn | undefined) {
this.setColumnValue("metricType", v);
}
public get metricValue(): number | undefined {
return this.getColumnValue("metricValue") as number | undefined;
}
public set metricValue(v: number | undefined) {
this.setColumnValue("metricValue", v);
}
public get miscData(): MonitorMetricsMiscData | undefined {
return this.getColumnValue("miscData") as
| MonitorMetricsMiscData
| undefined;
}
public set miscData(v: MonitorMetricsMiscData | undefined) {
this.setColumnValue("miscData", v as JSONObject);
}
}

View File

@@ -42,7 +42,7 @@ export interface SpanLink {
export default class Span extends AnalyticsBaseModel {
public constructor() {
super({
tableName: "SpanTelemetry",
tableName: "SpanItem",
tableEngine: AnalyticsTableEngine.MergeTree,
singularName: "Span",
pluralName: "Spans",
@@ -492,8 +492,8 @@ export default class Span extends AnalyticsBaseModel {
},
}),
],
sortKeys: ["projectId", "serviceId", "traceId", "startTime"],
primaryKeys: ["projectId", "serviceId", "traceId"],
sortKeys: ["projectId", "startTime", "serviceId", "traceId"],
primaryKeys: ["projectId", "startTime", "serviceId", "traceId"],
});
}

View File

@@ -106,11 +106,11 @@ export default class TelemetryAttribute extends AnalyticsBaseModel {
}),
new AnalyticsTableColumn({
key: "attribute",
title: "Attribute",
description: "Attribute",
key: "attributes",
title: "Attributes",
description: "Attributes",
required: true,
type: TableColumnType.Text,
type: TableColumnType.JSONArray,
accessControl: {
read: [
Permission.ProjectOwner,
@@ -153,11 +153,11 @@ export default class TelemetryAttribute extends AnalyticsBaseModel {
this.setColumnValue("telemetryType", v);
}
public get attribute(): string | undefined {
return this.getColumnValue("attribute") as string | undefined;
public get attributes(): Array<string> | undefined {
return this.getColumnValue("attributes") as Array<string> | undefined;
}
public set attribute(v: string | undefined) {
this.setColumnValue("attribute", v);
public set attributes(v: Array<string> | undefined) {
this.setColumnValue("attributes", v);
}
}

View File

@@ -36,6 +36,7 @@ import {
ManyToOne,
} from "typeorm";
import { TelemetryQuery } from "../../Types/Telemetry/TelemetryQuery";
import NotificationRuleWorkspaceChannel from "../../Types/Workspace/NotificationRules/NotificationRuleWorkspaceChannel";
@EnableDocumentation()
@AccessControlColumn("labels")
@@ -801,7 +802,6 @@ export default class Alert extends BaseModel {
],
update: [],
})
@Index()
@TableColumn({
type: TableColumnType.Markdown,
required: false,
@@ -1007,4 +1007,52 @@ export default class Alert extends BaseModel {
nullable: true,
})
public telemetryQuery?: TelemetryQuery = undefined;
@ColumnAccessControl({
create: [
Permission.ProjectOwner,
Permission.ProjectAdmin,
Permission.ProjectMember,
Permission.CreateAlert,
],
read: [
Permission.ProjectOwner,
Permission.ProjectAdmin,
Permission.ProjectMember,
Permission.ReadAlert,
],
update: [],
})
@Index()
@TableColumn({
isDefaultValueColumn: false,
required: false,
type: TableColumnType.Number,
title: "Alert Number",
description: "Alert Number",
})
@Column({
type: ColumnType.Number,
nullable: true,
})
public alertNumber?: number = undefined;
@ColumnAccessControl({
create: [],
read: [],
update: [],
})
@TableColumn({
isDefaultValueColumn: false,
required: false,
type: TableColumnType.JSON,
title: "Post Updates To Workspace Channel Name",
description: "Post Updates To Workspace Channel Name",
})
@Column({
type: ColumnType.JSON,
nullable: true,
})
public postUpdatesToWorkspaceChannels?: Array<NotificationRuleWorkspaceChannel> =
undefined;
}

View File

@@ -0,0 +1,526 @@
import Alert from "./Alert";
import Project from "./Project";
import User from "./User";
import BaseModel from "./DatabaseBaseModel/DatabaseBaseModel";
import Route from "../../Types/API/Route";
import ColumnAccessControl from "../../Types/Database/AccessControl/ColumnAccessControl";
import TableAccessControl from "../../Types/Database/AccessControl/TableAccessControl";
import CanAccessIfCanReadOn from "../../Types/Database/CanAccessIfCanReadOn";
import ColumnType from "../../Types/Database/ColumnType";
import CrudApiEndpoint from "../../Types/Database/CrudApiEndpoint";
import EnableDocumentation from "../../Types/Database/EnableDocumentation";
import EnableWorkflow from "../../Types/Database/EnableWorkflow";
import TableColumn from "../../Types/Database/TableColumn";
import TableColumnType from "../../Types/Database/TableColumnType";
import TableMetadata from "../../Types/Database/TableMetadata";
import TenantColumn from "../../Types/Database/TenantColumn";
import IconProp from "../../Types/Icon/IconProp";
import ObjectID from "../../Types/ObjectID";
import Permission from "../../Types/Permission";
import { Column, Entity, Index, JoinColumn, ManyToOne } from "typeorm";
import ColumnLength from "../../Types/Database/ColumnLength";
import Color from "../../Types/Color";
export enum AlertFeedEventType {
PublicNote = "PublicNote",
SubscriberNotificationSent = "SubscriberNotificationSent",
OwnerNotificationSent = "OwnerNotificationSent",
OwnerUserAdded = "OwnerUserAdded",
OwnerTeamAdded = "OwnerTeamAdded",
AlertCreated = "AlertCreated",
AlertStateChanged = "AlertStateChanged",
PrivateNote = "PrivateNote",
AlertUpdated = "AlertUpdated",
RootCause = "RootCause",
RemediationNotes = "RemediationNotes",
OwnerUserRemoved = "OwnerUserRemoved",
OwnerTeamRemoved = "OwnerTeamRemoved",
OnCallPolicy = "OnCallPolicy",
OnCallNotification = "OnCallNotification",
}
@EnableDocumentation()
@CanAccessIfCanReadOn("alert")
@TenantColumn("projectId")
@TableAccessControl({
create: [
Permission.ProjectOwner,
Permission.ProjectAdmin,
Permission.ProjectMember,
Permission.CreateAlertFeed,
],
read: [
Permission.ProjectOwner,
Permission.ProjectAdmin,
Permission.ProjectMember,
Permission.ReadAlertFeed,
],
delete: [],
update: [],
})
@EnableWorkflow({
create: true,
delete: true,
update: true,
read: true,
})
@CrudApiEndpoint(new Route("/alert-feed"))
@Entity({
name: "AlertFeed",
})
@TableMetadata({
tableName: "AlertFeed",
singularName: "Alert Feed",
pluralName: "Alert Feeds",
icon: IconProp.List,
tableDescription:
"Log of the entire alert state change. This is a log of all the alert state changes, public notes, more etc.",
})
export default class AlertFeed extends BaseModel {
@ColumnAccessControl({
create: [
Permission.ProjectOwner,
Permission.ProjectAdmin,
Permission.ProjectMember,
Permission.CreateAlertFeed,
],
read: [
Permission.ProjectOwner,
Permission.ProjectAdmin,
Permission.ProjectMember,
Permission.ReadAlertFeed,
],
update: [],
})
@TableColumn({
manyToOneRelationColumn: "projectId",
type: TableColumnType.Entity,
modelType: Project,
title: "Project",
description: "Relation to Project Resource in which this object belongs",
})
@ManyToOne(
() => {
return Project;
},
{
eager: false,
nullable: true,
onDelete: "CASCADE",
orphanedRowAction: "nullify",
},
)
@JoinColumn({ name: "projectId" })
public project?: Project = undefined;
@ColumnAccessControl({
create: [
Permission.ProjectOwner,
Permission.ProjectAdmin,
Permission.ProjectMember,
Permission.CreateAlertFeed,
],
read: [
Permission.ProjectOwner,
Permission.ProjectAdmin,
Permission.ProjectMember,
Permission.ReadAlertFeed,
],
update: [],
})
@Index()
@TableColumn({
type: TableColumnType.ObjectID,
required: true,
canReadOnRelationQuery: true,
title: "Project ID",
description: "ID of your OneUptime Project in which this object belongs",
})
@Column({
type: ColumnType.ObjectID,
nullable: false,
transformer: ObjectID.getDatabaseTransformer(),
})
public projectId?: ObjectID = undefined;
@ColumnAccessControl({
create: [
Permission.ProjectOwner,
Permission.ProjectAdmin,
Permission.ProjectMember,
Permission.CreateAlertFeed,
],
read: [
Permission.ProjectOwner,
Permission.ProjectAdmin,
Permission.ProjectMember,
Permission.ReadAlertFeed,
],
update: [],
})
@TableColumn({
manyToOneRelationColumn: "alertId",
type: TableColumnType.Entity,
modelType: Alert,
title: "Alert",
description: "Relation to Alert in which this resource belongs",
})
@ManyToOne(
() => {
return Alert;
},
{
eager: false,
nullable: true,
onDelete: "CASCADE",
orphanedRowAction: "nullify",
},
)
@JoinColumn({ name: "alertId" })
public alert?: Alert = undefined;
@ColumnAccessControl({
create: [
Permission.ProjectOwner,
Permission.ProjectAdmin,
Permission.ProjectMember,
Permission.CreateAlertFeed,
],
read: [
Permission.ProjectOwner,
Permission.ProjectAdmin,
Permission.ProjectMember,
Permission.ReadAlertFeed,
],
update: [],
})
@Index()
@TableColumn({
type: TableColumnType.ObjectID,
required: true,
title: "Alert ID",
description: "Relation to Alert ID in which this resource belongs",
})
@Column({
type: ColumnType.ObjectID,
nullable: false,
transformer: ObjectID.getDatabaseTransformer(),
})
public alertId?: ObjectID = undefined;
@ColumnAccessControl({
create: [
Permission.ProjectOwner,
Permission.ProjectAdmin,
Permission.ProjectMember,
Permission.CreateAlertFeed,
],
read: [
Permission.ProjectOwner,
Permission.ProjectAdmin,
Permission.ProjectMember,
Permission.ReadAlertFeed,
],
update: [],
})
@TableColumn({
manyToOneRelationColumn: "createdByUserId",
type: TableColumnType.Entity,
modelType: User,
title: "Created by User",
description:
"Relation to User who created this object (if this object was created by a User)",
})
@ManyToOne(
() => {
return User;
},
{
eager: false,
nullable: true,
onDelete: "SET NULL",
orphanedRowAction: "nullify",
},
)
@JoinColumn({ name: "createdByUserId" })
public createdByUser?: User = undefined;
@ColumnAccessControl({
create: [
Permission.ProjectOwner,
Permission.ProjectAdmin,
Permission.ProjectMember,
Permission.CreateAlertFeed,
],
read: [
Permission.ProjectOwner,
Permission.ProjectAdmin,
Permission.ProjectMember,
Permission.ReadAlertFeed,
],
update: [],
})
@TableColumn({
type: TableColumnType.ObjectID,
title: "Created by User ID",
description:
"User ID who created this object (if this object was created by a User)",
})
@Column({
type: ColumnType.ObjectID,
nullable: true,
transformer: ObjectID.getDatabaseTransformer(),
})
public createdByUserId?: ObjectID = undefined;
@ColumnAccessControl({
create: [],
read: [],
update: [],
})
@TableColumn({
manyToOneRelationColumn: "deletedByUserId",
type: TableColumnType.Entity,
title: "Deleted by User",
description:
"Relation to User who deleted this object (if this object was deleted by a User)",
})
@ManyToOne(
() => {
return User;
},
{
cascade: false,
eager: false,
nullable: true,
onDelete: "SET NULL",
orphanedRowAction: "nullify",
},
)
@JoinColumn({ name: "deletedByUserId" })
public deletedByUser?: User = undefined;
@ColumnAccessControl({
create: [],
read: [],
update: [],
})
@TableColumn({
type: TableColumnType.ObjectID,
title: "Deleted by User ID",
description:
"User ID who deleted this object (if this object was deleted by a User)",
})
@Column({
type: ColumnType.ObjectID,
nullable: true,
transformer: ObjectID.getDatabaseTransformer(),
})
public deletedByUserId?: ObjectID = undefined;
@ColumnAccessControl({
create: [
Permission.ProjectOwner,
Permission.ProjectAdmin,
Permission.ProjectMember,
Permission.CreateAlertFeed,
],
read: [
Permission.ProjectOwner,
Permission.ProjectAdmin,
Permission.ProjectMember,
Permission.ReadAlertFeed,
],
update: [],
})
@TableColumn({
type: TableColumnType.Markdown,
required: true,
title: "Log (in Markdown)",
description: "Log of the entire alert state change in Markdown",
})
@Column({
type: ColumnType.Markdown,
nullable: false,
unique: false,
})
public feedInfoInMarkdown?: string = undefined;
@ColumnAccessControl({
create: [
Permission.ProjectOwner,
Permission.ProjectAdmin,
Permission.ProjectMember,
Permission.CreateAlertFeed,
],
read: [
Permission.ProjectOwner,
Permission.ProjectAdmin,
Permission.ProjectMember,
Permission.ReadAlertFeed,
],
update: [],
})
@TableColumn({
type: TableColumnType.Markdown,
required: false,
title: "More Information (in Markdown)",
description: "More information in Markdown",
})
@Column({
type: ColumnType.Markdown,
nullable: true,
unique: false,
})
public moreInformationInMarkdown?: string = undefined;
@ColumnAccessControl({
create: [
Permission.ProjectOwner,
Permission.ProjectAdmin,
Permission.ProjectMember,
Permission.CreateAlertFeed,
],
read: [
Permission.ProjectOwner,
Permission.ProjectAdmin,
Permission.ProjectMember,
Permission.ReadAlertFeed,
],
update: [],
})
@TableColumn({
type: TableColumnType.ShortText,
required: true,
title: "Alert Feed Event",
description: "Alert Feed Event",
})
@Column({
type: ColumnType.ShortText,
nullable: false,
unique: false,
})
public alertFeedEventType?: AlertFeedEventType = undefined;
@ColumnAccessControl({
create: [
Permission.ProjectOwner,
Permission.ProjectAdmin,
Permission.ProjectMember,
Permission.CreateAlertFeed,
],
read: [
Permission.ProjectOwner,
Permission.ProjectAdmin,
Permission.ProjectMember,
Permission.ReadAlertFeed,
],
update: [],
})
@TableColumn({
type: TableColumnType.Color,
required: true,
title: "Color",
description: "Display color for the alert log",
})
@Column({
type: ColumnType.Color,
length: ColumnLength.Color,
nullable: false,
unique: false,
transformer: Color.getDatabaseTransformer(),
})
public displayColor?: Color = undefined;
@ColumnAccessControl({
create: [
Permission.ProjectOwner,
Permission.ProjectAdmin,
Permission.ProjectMember,
Permission.CreateAlertFeed,
],
read: [
Permission.ProjectOwner,
Permission.ProjectAdmin,
Permission.ProjectMember,
Permission.ReadAlertFeed,
],
update: [],
})
@TableColumn({
manyToOneRelationColumn: "userId",
type: TableColumnType.Entity,
modelType: User,
title: "User",
description:
"Relation to User who this feed belongs to (if this feed belongs to a User)",
})
@ManyToOne(
() => {
return User;
},
{
eager: false,
nullable: true,
onDelete: "SET NULL",
orphanedRowAction: "nullify",
},
)
@JoinColumn({ name: "userId" })
public user?: User = undefined;
@ColumnAccessControl({
create: [
Permission.ProjectOwner,
Permission.ProjectAdmin,
Permission.ProjectMember,
Permission.CreateAlertFeed,
],
read: [
Permission.ProjectOwner,
Permission.ProjectAdmin,
Permission.ProjectMember,
Permission.ReadAlertFeed,
],
update: [],
})
@TableColumn({
type: TableColumnType.ObjectID,
title: "User ID",
description:
"User who this feed belongs to (if this feed belongs to a User)",
})
@Column({
type: ColumnType.ObjectID,
nullable: true,
transformer: ObjectID.getDatabaseTransformer(),
})
public userId?: ObjectID = undefined;
@ColumnAccessControl({
create: [
Permission.ProjectOwner,
Permission.ProjectAdmin,
Permission.ProjectMember,
Permission.CreateAlertFeed,
],
read: [
Permission.ProjectOwner,
Permission.ProjectAdmin,
Permission.ProjectMember,
Permission.ReadAlertFeed,
],
update: [],
})
@TableColumn({
title: "Feed Posted At",
description: "Date and time when the feed was posted",
type: TableColumnType.Date,
})
@Column({
type: ColumnType.Date,
nullable: true,
unique: false,
})
public postedAt?: Date = undefined;
}

View File

@@ -514,7 +514,7 @@ export default class AlertStateTimeline extends BaseModel {
@TableColumn({
type: TableColumnType.Date,
title: "Starts At",
description: "When did this status change start?",
description: "When did this status change?",
})
@Column({
type: ColumnType.Date,

View File

@@ -232,17 +232,35 @@ export default class GlobalConfig extends GlobalConfigModel {
})
@TableColumn({
type: TableColumnType.Phone,
title: "Twilio Phone Number",
description: "Phone Number for your Twilio account",
title: "Twilio Primary Phone Number",
description: "Secondary Phone Number for your Twilio account",
})
@Column({
type: ColumnType.Phone,
length: ColumnLength.Phone,
nullable: true,
unique: true,
unique: false,
transformer: Phone.getDatabaseTransformer(),
})
public twilioPhoneNumber?: Phone = undefined;
public twilioPrimaryPhoneNumber?: Phone = undefined;
@ColumnAccessControl({
create: [],
read: [],
update: [],
})
@TableColumn({
type: TableColumnType.LongText,
title: "Twilio Secondary Phone Numbers",
description: "Secondary Phone Number for your Twilio account",
})
@Column({
type: ColumnType.LongText,
length: ColumnLength.LongText,
nullable: true,
unique: false,
})
public twilioSecondaryPhoneNumbers?: string = undefined; // phone numbers seperated by comma
@ColumnAccessControl({
create: [],

View File

@@ -37,6 +37,7 @@ import {
ManyToOne,
} from "typeorm";
import { TelemetryQuery } from "../../Types/Telemetry/TelemetryQuery";
import NotificationRuleWorkspaceChannel from "../../Types/Workspace/NotificationRules/NotificationRuleWorkspaceChannel";
@EnableDocumentation()
@AccessControlColumn("labels")
@@ -853,9 +854,13 @@ export default class Incident extends BaseModel {
Permission.ProjectMember,
Permission.ReadProjectIncident,
],
update: [],
update: [
Permission.ProjectOwner,
Permission.ProjectAdmin,
Permission.ProjectMember,
Permission.EditProjectIncident,
],
})
@Index()
@TableColumn({
type: TableColumnType.Markdown,
required: false,
@@ -1087,4 +1092,85 @@ export default class Incident extends BaseModel {
nullable: true,
})
public telemetryQuery?: TelemetryQuery = undefined;
@ColumnAccessControl({
create: [
Permission.ProjectOwner,
Permission.ProjectAdmin,
Permission.ProjectMember,
Permission.CreateProjectIncident,
],
read: [
Permission.ProjectOwner,
Permission.ProjectAdmin,
Permission.ProjectMember,
Permission.ReadProjectIncident,
],
update: [],
})
@Index()
@TableColumn({
isDefaultValueColumn: false,
required: false,
type: TableColumnType.Number,
title: "Incident Number",
description: "Incident Number",
})
@Column({
type: ColumnType.Number,
nullable: true,
})
public incidentNumber?: number = undefined;
@ColumnAccessControl({
create: [],
read: [],
update: [],
})
@TableColumn({
isDefaultValueColumn: false,
required: false,
type: TableColumnType.JSON,
title: "Post Updates To Workspace Channel Name",
description: "Post Updates To Workspace Channel Name",
})
@Column({
type: ColumnType.JSON,
nullable: true,
})
public postUpdatesToWorkspaceChannels?: Array<NotificationRuleWorkspaceChannel> =
undefined;
@ColumnAccessControl({
create: [
Permission.ProjectOwner,
Permission.ProjectAdmin,
Permission.ProjectMember,
Permission.CreateProjectIncident,
],
read: [
Permission.ProjectOwner,
Permission.ProjectAdmin,
Permission.ProjectMember,
Permission.ReadProjectIncident,
],
update: [
Permission.ProjectOwner,
Permission.ProjectAdmin,
Permission.ProjectMember,
Permission.EditProjectIncident,
],
})
@TableColumn({
isDefaultValueColumn: true,
type: TableColumnType.Boolean,
title: "Should be visible on status page?",
description: "Should this incident be visible on the status page?",
})
@Column({
type: ColumnType.Boolean,
default: true,
nullable: true,
})
public isVisibleOnStatusPage?: boolean = undefined;
}

View File

@@ -0,0 +1,526 @@
import Incident from "./Incident";
import Project from "./Project";
import User from "./User";
import BaseModel from "./DatabaseBaseModel/DatabaseBaseModel";
import Route from "../../Types/API/Route";
import ColumnAccessControl from "../../Types/Database/AccessControl/ColumnAccessControl";
import TableAccessControl from "../../Types/Database/AccessControl/TableAccessControl";
import CanAccessIfCanReadOn from "../../Types/Database/CanAccessIfCanReadOn";
import ColumnType from "../../Types/Database/ColumnType";
import CrudApiEndpoint from "../../Types/Database/CrudApiEndpoint";
import EnableDocumentation from "../../Types/Database/EnableDocumentation";
import EnableWorkflow from "../../Types/Database/EnableWorkflow";
import TableColumn from "../../Types/Database/TableColumn";
import TableColumnType from "../../Types/Database/TableColumnType";
import TableMetadata from "../../Types/Database/TableMetadata";
import TenantColumn from "../../Types/Database/TenantColumn";
import IconProp from "../../Types/Icon/IconProp";
import ObjectID from "../../Types/ObjectID";
import Permission from "../../Types/Permission";
import { Column, Entity, Index, JoinColumn, ManyToOne } from "typeorm";
import Color from "../../Types/Color";
import ColumnLength from "../../Types/Database/ColumnLength";
export enum IncidentFeedEventType {
PublicNote = "PublicNote",
SubscriberNotificationSent = "SubscriberNotificationSent",
OwnerNotificationSent = "OwnerNotificationSent",
OwnerUserAdded = "OwnerUserAdded",
OwnerTeamAdded = "OwnerTeamAdded",
IncidentCreated = "IncidentCreated",
IncidentStateChanged = "IncidentStateChanged",
PrivateNote = "PrivateNote",
IncidentUpdated = "IncidentUpdated",
RootCause = "RootCause",
RemediationNotes = "RemediationNotes",
OwnerUserRemoved = "OwnerUserRemoved",
OwnerTeamRemoved = "OwnerTeamRemoved",
OnCallPolicy = "OnCallPolicy",
OnCallNotification = "OnCallNotification",
}
@EnableDocumentation()
@CanAccessIfCanReadOn("incident")
@TenantColumn("projectId")
@TableAccessControl({
create: [
Permission.ProjectOwner,
Permission.ProjectAdmin,
Permission.ProjectMember,
Permission.CreateIncidentFeed,
],
read: [
Permission.ProjectOwner,
Permission.ProjectAdmin,
Permission.ProjectMember,
Permission.ReadIncidentFeed,
],
delete: [],
update: [],
})
@EnableWorkflow({
create: true,
delete: true,
update: true,
read: true,
})
@CrudApiEndpoint(new Route("/incident-feed"))
@Entity({
name: "IncidentFeed",
})
@TableMetadata({
tableName: "IncidentFeed",
singularName: "Incident Feed",
pluralName: "Incident Feeds",
icon: IconProp.List,
tableDescription:
"Log of the entire incident state change. This is a log of all the incident state changes, public notes, more etc.",
})
export default class IncidentFeed extends BaseModel {
@ColumnAccessControl({
create: [
Permission.ProjectOwner,
Permission.ProjectAdmin,
Permission.ProjectMember,
Permission.CreateIncidentFeed,
],
read: [
Permission.ProjectOwner,
Permission.ProjectAdmin,
Permission.ProjectMember,
Permission.ReadIncidentFeed,
],
update: [],
})
@TableColumn({
manyToOneRelationColumn: "projectId",
type: TableColumnType.Entity,
modelType: Project,
title: "Project",
description: "Relation to Project Resource in which this object belongs",
})
@ManyToOne(
() => {
return Project;
},
{
eager: false,
nullable: true,
onDelete: "CASCADE",
orphanedRowAction: "nullify",
},
)
@JoinColumn({ name: "projectId" })
public project?: Project = undefined;
@ColumnAccessControl({
create: [
Permission.ProjectOwner,
Permission.ProjectAdmin,
Permission.ProjectMember,
Permission.CreateIncidentFeed,
],
read: [
Permission.ProjectOwner,
Permission.ProjectAdmin,
Permission.ProjectMember,
Permission.ReadIncidentFeed,
],
update: [],
})
@Index()
@TableColumn({
type: TableColumnType.ObjectID,
required: true,
canReadOnRelationQuery: true,
title: "Project ID",
description: "ID of your OneUptime Project in which this object belongs",
})
@Column({
type: ColumnType.ObjectID,
nullable: false,
transformer: ObjectID.getDatabaseTransformer(),
})
public projectId?: ObjectID = undefined;
@ColumnAccessControl({
create: [
Permission.ProjectOwner,
Permission.ProjectAdmin,
Permission.ProjectMember,
Permission.CreateIncidentFeed,
],
read: [
Permission.ProjectOwner,
Permission.ProjectAdmin,
Permission.ProjectMember,
Permission.ReadIncidentFeed,
],
update: [],
})
@TableColumn({
manyToOneRelationColumn: "incidentId",
type: TableColumnType.Entity,
modelType: Incident,
title: "Incident",
description: "Relation to Incident in which this resource belongs",
})
@ManyToOne(
() => {
return Incident;
},
{
eager: false,
nullable: true,
onDelete: "CASCADE",
orphanedRowAction: "nullify",
},
)
@JoinColumn({ name: "incidentId" })
public incident?: Incident = undefined;
@ColumnAccessControl({
create: [
Permission.ProjectOwner,
Permission.ProjectAdmin,
Permission.ProjectMember,
Permission.CreateIncidentFeed,
],
read: [
Permission.ProjectOwner,
Permission.ProjectAdmin,
Permission.ProjectMember,
Permission.ReadIncidentFeed,
],
update: [],
})
@Index()
@TableColumn({
type: TableColumnType.ObjectID,
required: true,
title: "Incident ID",
description: "Relation to Incident ID in which this resource belongs",
})
@Column({
type: ColumnType.ObjectID,
nullable: false,
transformer: ObjectID.getDatabaseTransformer(),
})
public incidentId?: ObjectID = undefined;
@ColumnAccessControl({
create: [
Permission.ProjectOwner,
Permission.ProjectAdmin,
Permission.ProjectMember,
Permission.CreateIncidentFeed,
],
read: [
Permission.ProjectOwner,
Permission.ProjectAdmin,
Permission.ProjectMember,
Permission.ReadIncidentFeed,
],
update: [],
})
@TableColumn({
manyToOneRelationColumn: "createdByUserId",
type: TableColumnType.Entity,
modelType: User,
title: "Created by User",
description:
"Relation to User who created this object (if this object was created by a User)",
})
@ManyToOne(
() => {
return User;
},
{
eager: false,
nullable: true,
onDelete: "SET NULL",
orphanedRowAction: "nullify",
},
)
@JoinColumn({ name: "createdByUserId" })
public createdByUser?: User = undefined;
@ColumnAccessControl({
create: [
Permission.ProjectOwner,
Permission.ProjectAdmin,
Permission.ProjectMember,
Permission.CreateIncidentFeed,
],
read: [
Permission.ProjectOwner,
Permission.ProjectAdmin,
Permission.ProjectMember,
Permission.ReadIncidentFeed,
],
update: [],
})
@TableColumn({
type: TableColumnType.ObjectID,
title: "Created by User ID",
description:
"User ID who created this object (if this object was created by a User)",
})
@Column({
type: ColumnType.ObjectID,
nullable: true,
transformer: ObjectID.getDatabaseTransformer(),
})
public createdByUserId?: ObjectID = undefined;
@ColumnAccessControl({
create: [],
read: [],
update: [],
})
@TableColumn({
manyToOneRelationColumn: "deletedByUserId",
type: TableColumnType.Entity,
title: "Deleted by User",
description:
"Relation to User who deleted this object (if this object was deleted by a User)",
})
@ManyToOne(
() => {
return User;
},
{
cascade: false,
eager: false,
nullable: true,
onDelete: "SET NULL",
orphanedRowAction: "nullify",
},
)
@JoinColumn({ name: "deletedByUserId" })
public deletedByUser?: User = undefined;
@ColumnAccessControl({
create: [],
read: [],
update: [],
})
@TableColumn({
type: TableColumnType.ObjectID,
title: "Deleted by User ID",
description:
"User ID who deleted this object (if this object was deleted by a User)",
})
@Column({
type: ColumnType.ObjectID,
nullable: true,
transformer: ObjectID.getDatabaseTransformer(),
})
public deletedByUserId?: ObjectID = undefined;
@ColumnAccessControl({
create: [
Permission.ProjectOwner,
Permission.ProjectAdmin,
Permission.ProjectMember,
Permission.CreateIncidentFeed,
],
read: [
Permission.ProjectOwner,
Permission.ProjectAdmin,
Permission.ProjectMember,
Permission.ReadIncidentFeed,
],
update: [],
})
@TableColumn({
type: TableColumnType.Markdown,
required: true,
title: "Log (in Markdown)",
description: "Log of the entire incident state change in Markdown",
})
@Column({
type: ColumnType.Markdown,
nullable: false,
unique: false,
})
public feedInfoInMarkdown?: string = undefined;
@ColumnAccessControl({
create: [
Permission.ProjectOwner,
Permission.ProjectAdmin,
Permission.ProjectMember,
Permission.CreateIncidentFeed,
],
read: [
Permission.ProjectOwner,
Permission.ProjectAdmin,
Permission.ProjectMember,
Permission.ReadIncidentFeed,
],
update: [],
})
@TableColumn({
type: TableColumnType.Markdown,
required: false,
title: "More Information (in Markdown)",
description: "More information in Markdown",
})
@Column({
type: ColumnType.Markdown,
nullable: true,
unique: false,
})
public moreInformationInMarkdown?: string = undefined;
@ColumnAccessControl({
create: [
Permission.ProjectOwner,
Permission.ProjectAdmin,
Permission.ProjectMember,
Permission.CreateIncidentFeed,
],
read: [
Permission.ProjectOwner,
Permission.ProjectAdmin,
Permission.ProjectMember,
Permission.ReadIncidentFeed,
],
update: [],
})
@TableColumn({
type: TableColumnType.ShortText,
required: true,
title: "Incident Feed Event",
description: "Incident Feed Event",
})
@Column({
type: ColumnType.ShortText,
nullable: false,
unique: false,
})
public incidentFeedEventType?: IncidentFeedEventType = undefined;
@ColumnAccessControl({
create: [
Permission.ProjectOwner,
Permission.ProjectAdmin,
Permission.ProjectMember,
Permission.CreateIncidentFeed,
],
read: [
Permission.ProjectOwner,
Permission.ProjectAdmin,
Permission.ProjectMember,
Permission.ReadIncidentFeed,
],
update: [],
})
@TableColumn({
type: TableColumnType.Color,
required: true,
title: "Color",
description: "Display color for the incident log",
})
@Column({
type: ColumnType.Color,
length: ColumnLength.Color,
nullable: false,
unique: false,
transformer: Color.getDatabaseTransformer(),
})
public displayColor?: Color = undefined;
@ColumnAccessControl({
create: [
Permission.ProjectOwner,
Permission.ProjectAdmin,
Permission.ProjectMember,
Permission.CreateScheduledMaintenanceFeed,
],
read: [
Permission.ProjectOwner,
Permission.ProjectAdmin,
Permission.ProjectMember,
Permission.ReadScheduledMaintenanceFeed,
],
update: [],
})
@TableColumn({
manyToOneRelationColumn: "userId",
type: TableColumnType.Entity,
modelType: User,
title: "User",
description:
"Relation to User who this feed belongs to (if this feed belongs to a User)",
})
@ManyToOne(
() => {
return User;
},
{
eager: false,
nullable: true,
onDelete: "SET NULL",
orphanedRowAction: "nullify",
},
)
@JoinColumn({ name: "userId" })
public user?: User = undefined;
@ColumnAccessControl({
create: [
Permission.ProjectOwner,
Permission.ProjectAdmin,
Permission.ProjectMember,
Permission.CreateScheduledMaintenanceFeed,
],
read: [
Permission.ProjectOwner,
Permission.ProjectAdmin,
Permission.ProjectMember,
Permission.ReadScheduledMaintenanceFeed,
],
update: [],
})
@TableColumn({
type: TableColumnType.ObjectID,
title: "User ID",
description:
"User who this feed belongs to (if this feed belongs to a User)",
})
@Column({
type: ColumnType.ObjectID,
nullable: true,
transformer: ObjectID.getDatabaseTransformer(),
})
public userId?: ObjectID = undefined;
@ColumnAccessControl({
create: [
Permission.ProjectOwner,
Permission.ProjectAdmin,
Permission.ProjectMember,
Permission.CreateScheduledMaintenanceFeed,
],
read: [
Permission.ProjectOwner,
Permission.ProjectAdmin,
Permission.ProjectMember,
Permission.ReadScheduledMaintenanceFeed,
],
update: [],
})
@TableColumn({
title: "Feed Posted At",
description: "Date and time when the feed was posted",
type: TableColumnType.Date,
})
@Column({
type: ColumnType.Date,
nullable: true,
unique: false,
})
public postedAt?: Date = undefined;
}

View File

@@ -507,7 +507,6 @@ export default class IncidentStateTimeline extends BaseModel {
],
update: [],
})
@Index()
@TableColumn({
type: TableColumnType.Markdown,
required: false,
@@ -568,7 +567,7 @@ export default class IncidentStateTimeline extends BaseModel {
@TableColumn({
type: TableColumnType.Date,
title: "Starts At",
description: "When did this status change start?",
description: "When did this status change?",
})
@Column({
type: ColumnType.Date,

View File

@@ -20,6 +20,7 @@ import GreenlockCertificate from "./GreenlockCertificate";
import GreenlockChallenge from "./GreenlockChallenge";
// Incidents
import Incident from "./Incident";
import IncidentFeed from "./IncidentFeed";
import IncidentCustomField from "./IncidentCustomField";
import IncidentInternalNote from "./IncidentInternalNote";
import IncidentNoteTemplate from "./IncidentNoteTemplate";
@@ -142,6 +143,7 @@ import ScheduledMaintenanceTemplateOwnerTeam from "./ScheduledMaintenanceTemplat
import ScheduledMaintenanceTemplateOwnerUser from "./ScheduledMaintenanceTemplateOwnerUser";
import BaseModel from "./DatabaseBaseModel/DatabaseBaseModel";
import AlertState from "./AlertState";
import Alert from "./Alert";
import AlertCustomField from "./AlertCustomField";
@@ -151,15 +153,28 @@ import AlertOwnerTeam from "./AlertOwnerTeam";
import AlertOwnerUser from "./AlertOwnerUser";
import AlertSeverity from "./AlertSeverity";
import AlertNoteTemplate from "./AlertNoteTemplate";
import AlertFeed from "./AlertFeed";
import TableView from "./TableView";
import Dashboard from "./Dashboard";
import MonitorTest from "./MonitorTest";
import ScheduledMaintenanceFeed from "./ScheduledMaintenanceFeed";
import WorkspaceUserAuthToken from "./WorkspaceUserAuthToken";
import WorkspaceProjectAuthToken from "./WorkspaceProjectAuthToken";
import WorkspaceSetting from "./WorkspaceSetting";
import WorkspaceNotificationRule from "./WorkspaceNotificationRule";
import ProjectUser from "./ProjectUser";
import OnCallDutyPolicyUserOverride from "./OnCallDutyPolicyUserOverride";
import MonitorFeed from "./MonitorFeed";
const AllModelTypes: Array<{
new (): BaseModel;
}> = [
User,
WorkspaceUserAuthToken,
WorkspaceProjectAuthToken,
Probe,
Project,
EmailVerificationToken,
@@ -179,6 +194,7 @@ const AllModelTypes: Array<{
OnCallDutyPolicyEscalationRuleUser,
OnCallDutyPolicyExecutionLog,
OnCallDutyPolicyExecutionLogTimeline,
OnCallDutyPolicyUserOverride,
Monitor,
MonitorSecret,
@@ -187,6 +203,7 @@ const AllModelTypes: Array<{
IncidentState,
Incident,
IncidentFeed,
IncidentCustomField,
IncidentStateTimeline,
IncidentInternalNote,
@@ -201,6 +218,7 @@ const AllModelTypes: Array<{
AlertState,
Alert,
AlertFeed,
AlertCustomField,
AlertStateTimeline,
AlertInternalNote,
@@ -232,6 +250,7 @@ const AllModelTypes: Array<{
ScheduledMaintenancePublicNote,
ScheduledMaintenanceInternalNote,
ScheduledMaintenanceCustomField,
ScheduledMaintenanceFeed,
BillingPaymentMethods,
BillingInvoice,
@@ -335,6 +354,13 @@ const AllModelTypes: Array<{
Dashboard,
MonitorTest,
WorkspaceSetting,
WorkspaceNotificationRule,
ProjectUser,
MonitorFeed,
];
const modelTypeMap: { [key: string]: { new (): BaseModel } } = {};

View File

@@ -34,6 +34,7 @@ import {
ManyToMany,
ManyToOne,
} from "typeorm";
import NotificationRuleWorkspaceChannel from "../../Types/Workspace/NotificationRules/NotificationRuleWorkspaceChannel";
@EnableDocumentation()
@AccessControlColumn("labels")
@@ -1078,4 +1079,23 @@ export default class Monitor extends BaseModel {
default: false,
})
public isNoProbeEnabledOnThisMonitor?: boolean = undefined;
@ColumnAccessControl({
create: [],
read: [],
update: [],
})
@TableColumn({
isDefaultValueColumn: false,
required: false,
type: TableColumnType.JSON,
title: "Post Updates To Workspace Channel Name",
description: "Post Updates To Workspace Channel Name",
})
@Column({
type: ColumnType.JSON,
nullable: true,
})
public postUpdatesToWorkspaceChannels?: Array<NotificationRuleWorkspaceChannel> =
undefined;
}

View File

@@ -0,0 +1,520 @@
import Monitor from "./Monitor";
import Project from "./Project";
import User from "./User";
import BaseModel from "./DatabaseBaseModel/DatabaseBaseModel";
import Route from "../../Types/API/Route";
import ColumnAccessControl from "../../Types/Database/AccessControl/ColumnAccessControl";
import TableAccessControl from "../../Types/Database/AccessControl/TableAccessControl";
import CanAccessIfCanReadOn from "../../Types/Database/CanAccessIfCanReadOn";
import ColumnType from "../../Types/Database/ColumnType";
import CrudApiEndpoint from "../../Types/Database/CrudApiEndpoint";
import EnableDocumentation from "../../Types/Database/EnableDocumentation";
import EnableWorkflow from "../../Types/Database/EnableWorkflow";
import TableColumn from "../../Types/Database/TableColumn";
import TableColumnType from "../../Types/Database/TableColumnType";
import TableMetadata from "../../Types/Database/TableMetadata";
import TenantColumn from "../../Types/Database/TenantColumn";
import IconProp from "../../Types/Icon/IconProp";
import ObjectID from "../../Types/ObjectID";
import Permission from "../../Types/Permission";
import { Column, Entity, Index, JoinColumn, ManyToOne } from "typeorm";
import Color from "../../Types/Color";
import ColumnLength from "../../Types/Database/ColumnLength";
export enum MonitorFeedEventType {
OwnerNotificationSent = "OwnerNotificationSent",
OwnerUserAdded = "OwnerUserAdded",
OwnerTeamAdded = "OwnerTeamAdded",
MonitorCreated = "MonitorCreated",
MonitorStatusChanged = "MonitorStatusChanged",
MonitorUpdated = "MonitorUpdated",
OwnerTeamRemoved = "OwnerTeamRemoved",
OwnerUserRemoved = "OwnerUserRemoved",
SubscriberNotificationSent = "SubscriberNotificationSent",
}
@EnableDocumentation()
@CanAccessIfCanReadOn("monitor")
@TenantColumn("projectId")
@TableAccessControl({
create: [
Permission.ProjectOwner,
Permission.ProjectAdmin,
Permission.ProjectMember,
Permission.CreateMonitorFeed,
],
read: [
Permission.ProjectOwner,
Permission.ProjectAdmin,
Permission.ProjectMember,
Permission.ReadMonitorFeed,
],
delete: [],
update: [],
})
@EnableWorkflow({
create: true,
delete: true,
update: true,
read: true,
})
@CrudApiEndpoint(new Route("/monitor-feed"))
@Entity({
name: "MonitorFeed",
})
@TableMetadata({
tableName: "MonitorFeed",
singularName: "Monitor Feed",
pluralName: "Monitor Feeds",
icon: IconProp.List,
tableDescription:
"Log of the entire monitor state change. This is a log of all the monitor state changes, public notes, more etc.",
})
export default class MonitorFeed extends BaseModel {
@ColumnAccessControl({
create: [
Permission.ProjectOwner,
Permission.ProjectAdmin,
Permission.ProjectMember,
Permission.CreateMonitorFeed,
],
read: [
Permission.ProjectOwner,
Permission.ProjectAdmin,
Permission.ProjectMember,
Permission.ReadMonitorFeed,
],
update: [],
})
@TableColumn({
manyToOneRelationColumn: "projectId",
type: TableColumnType.Entity,
modelType: Project,
title: "Project",
description: "Relation to Project Resource in which this object belongs",
})
@ManyToOne(
() => {
return Project;
},
{
eager: false,
nullable: true,
onDelete: "CASCADE",
orphanedRowAction: "nullify",
},
)
@JoinColumn({ name: "projectId" })
public project?: Project = undefined;
@ColumnAccessControl({
create: [
Permission.ProjectOwner,
Permission.ProjectAdmin,
Permission.ProjectMember,
Permission.CreateMonitorFeed,
],
read: [
Permission.ProjectOwner,
Permission.ProjectAdmin,
Permission.ProjectMember,
Permission.ReadMonitorFeed,
],
update: [],
})
@Index()
@TableColumn({
type: TableColumnType.ObjectID,
required: true,
canReadOnRelationQuery: true,
title: "Project ID",
description: "ID of your OneUptime Project in which this object belongs",
})
@Column({
type: ColumnType.ObjectID,
nullable: false,
transformer: ObjectID.getDatabaseTransformer(),
})
public projectId?: ObjectID = undefined;
@ColumnAccessControl({
create: [
Permission.ProjectOwner,
Permission.ProjectAdmin,
Permission.ProjectMember,
Permission.CreateMonitorFeed,
],
read: [
Permission.ProjectOwner,
Permission.ProjectAdmin,
Permission.ProjectMember,
Permission.ReadMonitorFeed,
],
update: [],
})
@TableColumn({
manyToOneRelationColumn: "monitorId",
type: TableColumnType.Entity,
modelType: Monitor,
title: "Monitor",
description: "Relation to Monitor in which this resource belongs",
})
@ManyToOne(
() => {
return Monitor;
},
{
eager: false,
nullable: true,
onDelete: "CASCADE",
orphanedRowAction: "nullify",
},
)
@JoinColumn({ name: "monitorId" })
public monitor?: Monitor = undefined;
@ColumnAccessControl({
create: [
Permission.ProjectOwner,
Permission.ProjectAdmin,
Permission.ProjectMember,
Permission.CreateMonitorFeed,
],
read: [
Permission.ProjectOwner,
Permission.ProjectAdmin,
Permission.ProjectMember,
Permission.ReadMonitorFeed,
],
update: [],
})
@Index()
@TableColumn({
type: TableColumnType.ObjectID,
required: true,
title: "Monitor ID",
description: "Relation to Monitor ID in which this resource belongs",
})
@Column({
type: ColumnType.ObjectID,
nullable: false,
transformer: ObjectID.getDatabaseTransformer(),
})
public monitorId?: ObjectID = undefined;
@ColumnAccessControl({
create: [
Permission.ProjectOwner,
Permission.ProjectAdmin,
Permission.ProjectMember,
Permission.CreateMonitorFeed,
],
read: [
Permission.ProjectOwner,
Permission.ProjectAdmin,
Permission.ProjectMember,
Permission.ReadMonitorFeed,
],
update: [],
})
@TableColumn({
manyToOneRelationColumn: "createdByUserId",
type: TableColumnType.Entity,
modelType: User,
title: "Created by User",
description:
"Relation to User who created this object (if this object was created by a User)",
})
@ManyToOne(
() => {
return User;
},
{
eager: false,
nullable: true,
onDelete: "SET NULL",
orphanedRowAction: "nullify",
},
)
@JoinColumn({ name: "createdByUserId" })
public createdByUser?: User = undefined;
@ColumnAccessControl({
create: [
Permission.ProjectOwner,
Permission.ProjectAdmin,
Permission.ProjectMember,
Permission.CreateMonitorFeed,
],
read: [
Permission.ProjectOwner,
Permission.ProjectAdmin,
Permission.ProjectMember,
Permission.ReadMonitorFeed,
],
update: [],
})
@TableColumn({
type: TableColumnType.ObjectID,
title: "Created by User ID",
description:
"User ID who created this object (if this object was created by a User)",
})
@Column({
type: ColumnType.ObjectID,
nullable: true,
transformer: ObjectID.getDatabaseTransformer(),
})
public createdByUserId?: ObjectID = undefined;
@ColumnAccessControl({
create: [],
read: [],
update: [],
})
@TableColumn({
manyToOneRelationColumn: "deletedByUserId",
type: TableColumnType.Entity,
title: "Deleted by User",
description:
"Relation to User who deleted this object (if this object was deleted by a User)",
})
@ManyToOne(
() => {
return User;
},
{
cascade: false,
eager: false,
nullable: true,
onDelete: "SET NULL",
orphanedRowAction: "nullify",
},
)
@JoinColumn({ name: "deletedByUserId" })
public deletedByUser?: User = undefined;
@ColumnAccessControl({
create: [],
read: [],
update: [],
})
@TableColumn({
type: TableColumnType.ObjectID,
title: "Deleted by User ID",
description:
"User ID who deleted this object (if this object was deleted by a User)",
})
@Column({
type: ColumnType.ObjectID,
nullable: true,
transformer: ObjectID.getDatabaseTransformer(),
})
public deletedByUserId?: ObjectID = undefined;
@ColumnAccessControl({
create: [
Permission.ProjectOwner,
Permission.ProjectAdmin,
Permission.ProjectMember,
Permission.CreateMonitorFeed,
],
read: [
Permission.ProjectOwner,
Permission.ProjectAdmin,
Permission.ProjectMember,
Permission.ReadMonitorFeed,
],
update: [],
})
@TableColumn({
type: TableColumnType.Markdown,
required: true,
title: "Log (in Markdown)",
description: "Log of the entire monitor state change in Markdown",
})
@Column({
type: ColumnType.Markdown,
nullable: false,
unique: false,
})
public feedInfoInMarkdown?: string = undefined;
@ColumnAccessControl({
create: [
Permission.ProjectOwner,
Permission.ProjectAdmin,
Permission.ProjectMember,
Permission.CreateMonitorFeed,
],
read: [
Permission.ProjectOwner,
Permission.ProjectAdmin,
Permission.ProjectMember,
Permission.ReadMonitorFeed,
],
update: [],
})
@TableColumn({
type: TableColumnType.Markdown,
required: false,
title: "More Information (in Markdown)",
description: "More information in Markdown",
})
@Column({
type: ColumnType.Markdown,
nullable: true,
unique: false,
})
public moreInformationInMarkdown?: string = undefined;
@ColumnAccessControl({
create: [
Permission.ProjectOwner,
Permission.ProjectAdmin,
Permission.ProjectMember,
Permission.CreateMonitorFeed,
],
read: [
Permission.ProjectOwner,
Permission.ProjectAdmin,
Permission.ProjectMember,
Permission.ReadMonitorFeed,
],
update: [],
})
@TableColumn({
type: TableColumnType.ShortText,
required: true,
title: "Monitor Feed Event",
description: "Monitor Feed Event",
})
@Column({
type: ColumnType.ShortText,
nullable: false,
unique: false,
})
public monitorFeedEventType?: MonitorFeedEventType = undefined;
@ColumnAccessControl({
create: [
Permission.ProjectOwner,
Permission.ProjectAdmin,
Permission.ProjectMember,
Permission.CreateMonitorFeed,
],
read: [
Permission.ProjectOwner,
Permission.ProjectAdmin,
Permission.ProjectMember,
Permission.ReadMonitorFeed,
],
update: [],
})
@TableColumn({
type: TableColumnType.Color,
required: true,
title: "Color",
description: "Display color for the monitor log",
})
@Column({
type: ColumnType.Color,
length: ColumnLength.Color,
nullable: false,
unique: false,
transformer: Color.getDatabaseTransformer(),
})
public displayColor?: Color = undefined;
@ColumnAccessControl({
create: [
Permission.ProjectOwner,
Permission.ProjectAdmin,
Permission.ProjectMember,
Permission.CreateScheduledMaintenanceFeed,
],
read: [
Permission.ProjectOwner,
Permission.ProjectAdmin,
Permission.ProjectMember,
Permission.ReadScheduledMaintenanceFeed,
],
update: [],
})
@TableColumn({
manyToOneRelationColumn: "userId",
type: TableColumnType.Entity,
modelType: User,
title: "User",
description:
"Relation to User who this feed belongs to (if this feed belongs to a User)",
})
@ManyToOne(
() => {
return User;
},
{
eager: false,
nullable: true,
onDelete: "SET NULL",
orphanedRowAction: "nullify",
},
)
@JoinColumn({ name: "userId" })
public user?: User = undefined;
@ColumnAccessControl({
create: [
Permission.ProjectOwner,
Permission.ProjectAdmin,
Permission.ProjectMember,
Permission.CreateScheduledMaintenanceFeed,
],
read: [
Permission.ProjectOwner,
Permission.ProjectAdmin,
Permission.ProjectMember,
Permission.ReadScheduledMaintenanceFeed,
],
update: [],
})
@TableColumn({
type: TableColumnType.ObjectID,
title: "User ID",
description:
"User who this feed belongs to (if this feed belongs to a User)",
})
@Column({
type: ColumnType.ObjectID,
nullable: true,
transformer: ObjectID.getDatabaseTransformer(),
})
public userId?: ObjectID = undefined;
@ColumnAccessControl({
create: [
Permission.ProjectOwner,
Permission.ProjectAdmin,
Permission.ProjectMember,
Permission.CreateScheduledMaintenanceFeed,
],
read: [
Permission.ProjectOwner,
Permission.ProjectAdmin,
Permission.ProjectMember,
Permission.ReadScheduledMaintenanceFeed,
],
update: [],
})
@TableColumn({
title: "Feed Posted At",
description: "Date and time when the feed was posted",
type: TableColumnType.Date,
})
@Column({
type: ColumnType.Date,
nullable: true,
unique: false,
})
public postedAt?: Date = undefined;
}

View File

@@ -455,7 +455,6 @@ export default class MonitorStatusTimeline extends BaseModel {
],
update: [],
})
@Index()
@TableColumn({
type: TableColumnType.Markdown,
required: false,
@@ -516,7 +515,7 @@ export default class MonitorStatusTimeline extends BaseModel {
@TableColumn({
type: TableColumnType.Date,
title: "Starts At",
description: "When did this status change start?",
description: "When did this status change?",
})
@Column({
type: ColumnType.Date,

View File

@@ -442,6 +442,7 @@ export default class MonitorTest extends BaseModel {
})
public monitorStepProbeResponse?: MonitorStepProbeResponse = undefined;
@Index()
@ColumnAccessControl({
create: [
Permission.ProjectOwner,

View File

@@ -35,7 +35,12 @@ import Alert from "./Alert";
@EnableDocumentation()
@TenantColumn("projectId")
@TableAccessControl({
create: [],
create: [
Permission.ProjectOwner,
Permission.ProjectAdmin,
Permission.ProjectMember,
Permission.CreateProjectOnCallDutyPolicyExecutionLog,
],
read: [
Permission.ProjectOwner,
Permission.ProjectAdmin,
@@ -58,7 +63,12 @@ import Alert from "./Alert";
})
export default class OnCallDutyPolicyExecutionLog extends BaseModel {
@ColumnAccessControl({
create: [],
create: [
Permission.ProjectOwner,
Permission.ProjectAdmin,
Permission.ProjectMember,
Permission.CreateProjectOnCallDutyPolicyExecutionLog,
],
read: [
Permission.ProjectOwner,
Permission.ProjectAdmin,
@@ -89,7 +99,12 @@ export default class OnCallDutyPolicyExecutionLog extends BaseModel {
public project?: Project = undefined;
@ColumnAccessControl({
create: [],
create: [
Permission.ProjectOwner,
Permission.ProjectAdmin,
Permission.ProjectMember,
Permission.CreateProjectOnCallDutyPolicyExecutionLog,
],
read: [
Permission.ProjectOwner,
Permission.ProjectAdmin,
@@ -114,7 +129,12 @@ export default class OnCallDutyPolicyExecutionLog extends BaseModel {
public projectId?: ObjectID = undefined;
@ColumnAccessControl({
create: [],
create: [
Permission.ProjectOwner,
Permission.ProjectAdmin,
Permission.ProjectMember,
Permission.CreateProjectOnCallDutyPolicyExecutionLog,
],
read: [
Permission.ProjectOwner,
Permission.ProjectAdmin,
@@ -146,7 +166,12 @@ export default class OnCallDutyPolicyExecutionLog extends BaseModel {
public onCallDutyPolicy?: OnCallDutyPolicy = undefined;
@ColumnAccessControl({
create: [],
create: [
Permission.ProjectOwner,
Permission.ProjectAdmin,
Permission.ProjectMember,
Permission.CreateProjectOnCallDutyPolicyExecutionLog,
],
read: [
Permission.ProjectOwner,
Permission.ProjectAdmin,
@@ -172,7 +197,12 @@ export default class OnCallDutyPolicyExecutionLog extends BaseModel {
public onCallDutyPolicyId?: ObjectID = undefined;
@ColumnAccessControl({
create: [],
create: [
Permission.ProjectOwner,
Permission.ProjectAdmin,
Permission.ProjectMember,
Permission.CreateProjectOnCallDutyPolicyExecutionLog,
],
read: [
Permission.ProjectOwner,
Permission.ProjectAdmin,
@@ -204,7 +234,12 @@ export default class OnCallDutyPolicyExecutionLog extends BaseModel {
public triggeredByIncident?: Incident = undefined;
@ColumnAccessControl({
create: [],
create: [
Permission.ProjectOwner,
Permission.ProjectAdmin,
Permission.ProjectMember,
Permission.CreateProjectOnCallDutyPolicyExecutionLog,
],
read: [
Permission.ProjectOwner,
Permission.ProjectAdmin,
@@ -216,6 +251,7 @@ export default class OnCallDutyPolicyExecutionLog extends BaseModel {
@TableColumn({
type: TableColumnType.ObjectID,
title: "Triggered By Incident ID",
required: false,
description:
"ID of the incident which triggered this on-call escalation policy.",
})
@@ -227,7 +263,12 @@ export default class OnCallDutyPolicyExecutionLog extends BaseModel {
public triggeredByIncidentId?: ObjectID = undefined;
@ColumnAccessControl({
create: [],
create: [
Permission.ProjectOwner,
Permission.ProjectAdmin,
Permission.ProjectMember,
Permission.CreateProjectOnCallDutyPolicyExecutionLog,
],
read: [
Permission.ProjectOwner,
Permission.ProjectAdmin,
@@ -258,7 +299,12 @@ export default class OnCallDutyPolicyExecutionLog extends BaseModel {
public triggeredByAlert?: Alert = undefined;
@ColumnAccessControl({
create: [],
create: [
Permission.ProjectOwner,
Permission.ProjectAdmin,
Permission.ProjectMember,
Permission.CreateProjectOnCallDutyPolicyExecutionLog,
],
read: [
Permission.ProjectOwner,
Permission.ProjectAdmin,
@@ -270,6 +316,7 @@ export default class OnCallDutyPolicyExecutionLog extends BaseModel {
@TableColumn({
type: TableColumnType.ObjectID,
title: "Triggered By Alert ID",
required: false,
description:
"ID of the incident which triggered this on-call escalation policy.",
})
@@ -281,7 +328,12 @@ export default class OnCallDutyPolicyExecutionLog extends BaseModel {
public triggeredByAlertId?: ObjectID = undefined;
@ColumnAccessControl({
create: [],
create: [
Permission.ProjectOwner,
Permission.ProjectAdmin,
Permission.ProjectMember,
Permission.CreateProjectOnCallDutyPolicyExecutionLog,
],
read: [
Permission.ProjectOwner,
Permission.ProjectAdmin,
@@ -305,7 +357,12 @@ export default class OnCallDutyPolicyExecutionLog extends BaseModel {
public status?: OnCallDutyPolicyStatus = undefined;
@ColumnAccessControl({
create: [],
create: [
Permission.ProjectOwner,
Permission.ProjectAdmin,
Permission.ProjectMember,
Permission.CreateProjectOnCallDutyPolicyExecutionLog,
],
read: [
Permission.ProjectOwner,
Permission.ProjectAdmin,
@@ -329,7 +386,12 @@ export default class OnCallDutyPolicyExecutionLog extends BaseModel {
public statusMessage?: string = undefined;
@ColumnAccessControl({
create: [],
create: [
Permission.ProjectOwner,
Permission.ProjectAdmin,
Permission.ProjectMember,
Permission.CreateProjectOnCallDutyPolicyExecutionLog,
],
read: [
Permission.ProjectOwner,
Permission.ProjectAdmin,
@@ -353,7 +415,12 @@ export default class OnCallDutyPolicyExecutionLog extends BaseModel {
public userNotificationEventType?: UserNotificationEventType = undefined;
@ColumnAccessControl({
create: [],
create: [
Permission.ProjectOwner,
Permission.ProjectAdmin,
Permission.ProjectMember,
Permission.CreateProjectOnCallDutyPolicyExecutionLog,
],
read: [
Permission.ProjectOwner,
Permission.ProjectAdmin,
@@ -385,7 +452,12 @@ export default class OnCallDutyPolicyExecutionLog extends BaseModel {
public createdByUser?: User = undefined;
@ColumnAccessControl({
create: [],
create: [
Permission.ProjectOwner,
Permission.ProjectAdmin,
Permission.ProjectMember,
Permission.CreateProjectOnCallDutyPolicyExecutionLog,
],
read: [
Permission.ProjectOwner,
Permission.ProjectAdmin,
@@ -408,7 +480,12 @@ export default class OnCallDutyPolicyExecutionLog extends BaseModel {
public createdByUserId?: ObjectID = undefined;
@ColumnAccessControl({
create: [],
create: [
Permission.ProjectOwner,
Permission.ProjectAdmin,
Permission.ProjectMember,
Permission.CreateProjectOnCallDutyPolicyExecutionLog,
],
read: [],
update: [],
})
@@ -435,7 +512,12 @@ export default class OnCallDutyPolicyExecutionLog extends BaseModel {
public deletedByUser?: User = undefined;
@ColumnAccessControl({
create: [],
create: [
Permission.ProjectOwner,
Permission.ProjectAdmin,
Permission.ProjectMember,
Permission.CreateProjectOnCallDutyPolicyExecutionLog,
],
read: [
Permission.ProjectOwner,
Permission.ProjectAdmin,
@@ -458,7 +540,12 @@ export default class OnCallDutyPolicyExecutionLog extends BaseModel {
public deletedByUserId?: ObjectID = undefined;
@ColumnAccessControl({
create: [],
create: [
Permission.ProjectOwner,
Permission.ProjectAdmin,
Permission.ProjectMember,
Permission.CreateProjectOnCallDutyPolicyExecutionLog,
],
read: [
Permission.ProjectOwner,
Permission.ProjectAdmin,
@@ -491,7 +578,12 @@ export default class OnCallDutyPolicyExecutionLog extends BaseModel {
public acknowledgedByUser?: User = undefined;
@ColumnAccessControl({
create: [],
create: [
Permission.ProjectOwner,
Permission.ProjectAdmin,
Permission.ProjectMember,
Permission.CreateProjectOnCallDutyPolicyExecutionLog,
],
read: [
Permission.ProjectOwner,
Permission.ProjectAdmin,
@@ -514,7 +606,12 @@ export default class OnCallDutyPolicyExecutionLog extends BaseModel {
public acknowledgedByUserId?: ObjectID = undefined;
@ColumnAccessControl({
create: [],
create: [
Permission.ProjectOwner,
Permission.ProjectAdmin,
Permission.ProjectMember,
Permission.CreateProjectOnCallDutyPolicyExecutionLog,
],
read: [
Permission.ProjectOwner,
Permission.ProjectAdmin,
@@ -533,7 +630,12 @@ export default class OnCallDutyPolicyExecutionLog extends BaseModel {
public acknowledgedAt?: Date = undefined;
@ColumnAccessControl({
create: [],
create: [
Permission.ProjectOwner,
Permission.ProjectAdmin,
Permission.ProjectMember,
Permission.CreateProjectOnCallDutyPolicyExecutionLog,
],
read: [],
update: [],
})
@@ -560,7 +662,12 @@ export default class OnCallDutyPolicyExecutionLog extends BaseModel {
public acknowledgedByTeam?: Team = undefined;
@ColumnAccessControl({
create: [],
create: [
Permission.ProjectOwner,
Permission.ProjectAdmin,
Permission.ProjectMember,
Permission.CreateProjectOnCallDutyPolicyExecutionLog,
],
read: [
Permission.ProjectOwner,
Permission.ProjectAdmin,
@@ -583,7 +690,12 @@ export default class OnCallDutyPolicyExecutionLog extends BaseModel {
public acknowledgedByTeamId?: ObjectID = undefined;
@ColumnAccessControl({
create: [],
create: [
Permission.ProjectOwner,
Permission.ProjectAdmin,
Permission.ProjectMember,
Permission.CreateProjectOnCallDutyPolicyExecutionLog,
],
read: [],
update: [],
})
@@ -602,7 +714,12 @@ export default class OnCallDutyPolicyExecutionLog extends BaseModel {
public lastExecutedEscalationRuleOrder?: number = undefined;
@ColumnAccessControl({
create: [],
create: [
Permission.ProjectOwner,
Permission.ProjectAdmin,
Permission.ProjectMember,
Permission.CreateProjectOnCallDutyPolicyExecutionLog,
],
read: [],
update: [],
})
@@ -621,7 +738,12 @@ export default class OnCallDutyPolicyExecutionLog extends BaseModel {
public lastEscalationRuleExecutedAt?: Date = undefined;
@ColumnAccessControl({
create: [],
create: [
Permission.ProjectOwner,
Permission.ProjectAdmin,
Permission.ProjectMember,
Permission.CreateProjectOnCallDutyPolicyExecutionLog,
],
read: [
Permission.ProjectOwner,
Permission.ProjectAdmin,
@@ -653,7 +775,12 @@ export default class OnCallDutyPolicyExecutionLog extends BaseModel {
undefined;
@ColumnAccessControl({
create: [],
create: [
Permission.ProjectOwner,
Permission.ProjectAdmin,
Permission.ProjectMember,
Permission.CreateProjectOnCallDutyPolicyExecutionLog,
],
read: [
Permission.ProjectOwner,
Permission.ProjectAdmin,
@@ -678,7 +805,12 @@ export default class OnCallDutyPolicyExecutionLog extends BaseModel {
public lastExecutedEscalationRuleId?: ObjectID = undefined;
@ColumnAccessControl({
create: [],
create: [
Permission.ProjectOwner,
Permission.ProjectAdmin,
Permission.ProjectMember,
Permission.CreateProjectOnCallDutyPolicyExecutionLog,
],
read: [],
update: [],
})
@@ -698,7 +830,12 @@ export default class OnCallDutyPolicyExecutionLog extends BaseModel {
public executeNextEscalationRuleInMinutes?: number = undefined;
@ColumnAccessControl({
create: [],
create: [
Permission.ProjectOwner,
Permission.ProjectAdmin,
Permission.ProjectMember,
Permission.CreateProjectOnCallDutyPolicyExecutionLog,
],
read: [],
update: [],
})
@@ -717,4 +854,67 @@ export default class OnCallDutyPolicyExecutionLog extends BaseModel {
default: 1,
})
public onCallPolicyExecutionRepeatCount?: number = undefined;
@ColumnAccessControl({
create: [
Permission.ProjectOwner,
Permission.ProjectAdmin,
Permission.ProjectMember,
Permission.CreateProjectOnCallDutyPolicyExecutionLog,
],
read: [
Permission.ProjectOwner,
Permission.ProjectAdmin,
Permission.ProjectMember,
Permission.ReadProjectOnCallDutyPolicyExecutionLog,
],
update: [],
})
@TableColumn({
manyToOneRelationColumn: "triggeredByUserId",
type: TableColumnType.Entity,
modelType: User,
title: "Triggered by User",
description: "Relation to User who triggered on-clal policy",
})
@ManyToOne(
() => {
return User;
},
{
eager: false,
nullable: true,
onDelete: "SET NULL",
orphanedRowAction: "nullify",
},
)
@JoinColumn({ name: "triggeredByUserId" })
public triggeredByUser?: User = undefined;
@ColumnAccessControl({
create: [
Permission.ProjectOwner,
Permission.ProjectAdmin,
Permission.ProjectMember,
Permission.CreateProjectOnCallDutyPolicyExecutionLog,
],
read: [
Permission.ProjectOwner,
Permission.ProjectAdmin,
Permission.ProjectMember,
Permission.ReadProjectOnCallDutyPolicyExecutionLog,
],
update: [],
})
@TableColumn({
type: TableColumnType.ObjectID,
title: "Triggered by User ID",
description: "User ID who triggered this on-call policy",
})
@Column({
type: ColumnType.ObjectID,
nullable: true,
transformer: ObjectID.getDatabaseTransformer(),
})
public triggeredByUserId?: ObjectID = undefined;
}

View File

@@ -26,6 +26,7 @@ import OnCallDutyExecutionLogTimelineStatus from "../../Types/OnCallDutyPolicy/O
import Permission from "../../Types/Permission";
import UserNotificationEventType from "../../Types/UserNotification/UserNotificationEventType";
import { Column, Entity, Index, JoinColumn, ManyToOne } from "typeorm";
import Alert from "./Alert";
@TableBillingAccessControl({
create: PlanType.Growth,
@@ -216,18 +217,74 @@ export default class OnCallDutyPolicyExecutionLogTimeline extends BaseModel {
@Index()
@TableColumn({
type: TableColumnType.ObjectID,
required: true,
required: false,
canReadOnRelationQuery: true,
title: "Incident ID",
description: "ID of your OneUptime Incident in which this object belongs",
})
@Column({
type: ColumnType.ObjectID,
nullable: false,
nullable: true,
transformer: ObjectID.getDatabaseTransformer(),
})
public triggeredByIncidentId?: ObjectID = undefined;
@ColumnAccessControl({
create: [],
read: [
Permission.ProjectOwner,
Permission.ProjectAdmin,
Permission.ProjectMember,
Permission.ReadProjectOnCallDutyPolicyExecutionLogTimeline,
],
update: [],
})
@TableColumn({
manyToOneRelationColumn: "triggeredByAlertId",
type: TableColumnType.Entity,
modelType: Alert,
title: "Alert",
description: "Relation to Alert Resource in which this object belongs",
})
@ManyToOne(
() => {
return Alert;
},
{
eager: false,
nullable: true,
onDelete: "CASCADE",
orphanedRowAction: "nullify",
},
)
@JoinColumn({ name: "triggeredByAlertId" })
public triggeredByAlert?: Alert = undefined;
@ColumnAccessControl({
create: [],
read: [
Permission.ProjectOwner,
Permission.ProjectAdmin,
Permission.ProjectMember,
Permission.ReadProjectOnCallDutyPolicyExecutionLogTimeline,
],
update: [],
})
@Index()
@TableColumn({
type: TableColumnType.ObjectID,
required: false,
canReadOnRelationQuery: true,
title: "Alert ID",
description: "ID of your OneUptime Alert in which this object belongs",
})
@Column({
type: ColumnType.ObjectID,
nullable: true,
transformer: ObjectID.getDatabaseTransformer(),
})
public triggeredByAlertId?: ObjectID = undefined;
@ColumnAccessControl({
create: [],
read: [
@@ -723,4 +780,52 @@ export default class OnCallDutyPolicyExecutionLogTimeline extends BaseModel {
transformer: ObjectID.getDatabaseTransformer(),
})
public deletedByUserId?: ObjectID = undefined;
@ColumnAccessControl({
create: [],
read: [
Permission.ProjectOwner,
Permission.ProjectAdmin,
Permission.ProjectMember,
Permission.ReadProjectOnCallDutyPolicyExecutionLogTimeline,
],
update: [],
})
@TableColumn({
manyToOneRelationColumn: "overridedByUserId",
type: TableColumnType.Entity,
modelType: User,
title: "Overridden by User",
description: "Relation to User who overrode this alert",
})
@ManyToOne(
() => {
return User;
},
{
eager: false,
nullable: true,
onDelete: "CASCADE",
orphanedRowAction: "nullify",
},
)
@JoinColumn({ name: "overridedByUserId" })
public overridedByUser?: User = undefined;
@ColumnAccessControl({
create: [],
read: [Permission.CurrentUser],
update: [],
})
@TableColumn({
type: TableColumnType.ObjectID,
title: "Overridden by User ID",
description: "User ID who overrode this alert",
})
@Column({
type: ColumnType.ObjectID,
nullable: true,
transformer: ObjectID.getDatabaseTransformer(),
})
public overridedByUserId?: ObjectID = undefined;
}

View File

@@ -0,0 +1,502 @@
import OnCallDutyPolicy from "./OnCallDutyPolicy";
import Project from "./Project";
import User from "./User";
import BaseModel from "./DatabaseBaseModel/DatabaseBaseModel";
import Route from "../../Types/API/Route";
import ColumnAccessControl from "../../Types/Database/AccessControl/ColumnAccessControl";
import TableAccessControl from "../../Types/Database/AccessControl/TableAccessControl";
import ColumnType from "../../Types/Database/ColumnType";
import CrudApiEndpoint from "../../Types/Database/CrudApiEndpoint";
import EnableDocumentation from "../../Types/Database/EnableDocumentation";
import TableColumn from "../../Types/Database/TableColumn";
import TableColumnType from "../../Types/Database/TableColumnType";
import TableMetadata from "../../Types/Database/TableMetadata";
import TenantColumn from "../../Types/Database/TenantColumn";
import IconProp from "../../Types/Icon/IconProp";
import ObjectID from "../../Types/ObjectID";
import Permission from "../../Types/Permission";
import { Column, Entity, Index, JoinColumn, ManyToOne } from "typeorm";
import TableBillingAccessControl from "../../Types/Database/AccessControl/TableBillingAccessControl";
import { PlanType } from "../../Types/Billing/SubscriptionPlan";
@EnableDocumentation()
@TableBillingAccessControl({
create: PlanType.Growth,
read: PlanType.Growth,
update: PlanType.Growth,
delete: PlanType.Growth,
})
@TenantColumn("projectId")
@TableAccessControl({
create: [
Permission.ProjectOwner,
Permission.ProjectAdmin,
Permission.ProjectMember,
Permission.CreateOnCallDutyPolicyUserOverride,
],
read: [
Permission.ProjectOwner,
Permission.ProjectAdmin,
Permission.ProjectMember,
Permission.ReadOnCallDutyPolicyUserOverride,
],
delete: [
Permission.ProjectOwner,
Permission.ProjectAdmin,
Permission.ProjectMember,
Permission.DeleteOnCallDutyPolicyUserOverride,
],
update: [
Permission.ProjectOwner,
Permission.ProjectAdmin,
Permission.ProjectMember,
Permission.EditOnCallDutyPolicyUserOverride,
],
})
@CrudApiEndpoint(new Route("/on-call-duty-policy-user-override"))
@Entity({
name: "OnCallDutyPolicyUserOverride",
})
@TableMetadata({
tableName: "OnCallDutyPolicyUserOverride",
singularName: "User Override",
pluralName: "User Overrides",
icon: IconProp.Call,
tableDescription:
"Manage on-call duty user overrides, for example if the user is on leave you can override the on-call duty policy for that user so all the alerts will be routed to the other user.",
})
export default class OnCallDutyPolicyUserOverride extends BaseModel {
@ColumnAccessControl({
create: [
Permission.ProjectOwner,
Permission.ProjectAdmin,
Permission.ProjectMember,
Permission.CreateOnCallDutyPolicyUserOverride,
],
read: [
Permission.ProjectOwner,
Permission.ProjectAdmin,
Permission.ProjectMember,
Permission.ReadOnCallDutyPolicyUserOverride,
],
update: [],
})
@TableColumn({
manyToOneRelationColumn: "projectId",
type: TableColumnType.Entity,
modelType: Project,
title: "Project",
description: "Relation to Project Resource in which this object belongs",
})
@ManyToOne(
() => {
return Project;
},
{
eager: false,
nullable: true,
onDelete: "CASCADE",
orphanedRowAction: "nullify",
},
)
@JoinColumn({ name: "projectId" })
public project?: Project = undefined;
@ColumnAccessControl({
create: [
Permission.ProjectOwner,
Permission.ProjectAdmin,
Permission.ProjectMember,
Permission.CreateOnCallDutyPolicyUserOverride,
],
read: [
Permission.ProjectOwner,
Permission.ProjectAdmin,
Permission.ProjectMember,
Permission.ReadOnCallDutyPolicyUserOverride,
],
update: [],
})
@Index()
@TableColumn({
type: TableColumnType.ObjectID,
required: true,
canReadOnRelationQuery: true,
title: "Project ID",
description: "ID of your OneUptime Project in which this object belongs",
})
@Column({
type: ColumnType.ObjectID,
nullable: false,
transformer: ObjectID.getDatabaseTransformer(),
})
public projectId?: ObjectID = undefined;
// If this is null then it's a global override
// If this is set then it's a policy specific override
// Policy specifc override will take precedence over global override
@ColumnAccessControl({
create: [
Permission.ProjectOwner,
Permission.ProjectAdmin,
Permission.ProjectMember,
Permission.CreateOnCallDutyPolicyUserOverride,
],
read: [
Permission.ProjectOwner,
Permission.ProjectAdmin,
Permission.ProjectMember,
Permission.ReadOnCallDutyPolicyUserOverride,
],
update: [],
})
@TableColumn({
manyToOneRelationColumn: "onCallDutyPolicyId",
type: TableColumnType.Entity,
modelType: OnCallDutyPolicy,
title: "On-Call Policy",
description:
"Relation to On-Call Policy where this escalation rule belongs.",
})
@ManyToOne(
() => {
return OnCallDutyPolicy;
},
{
eager: false,
nullable: true,
onDelete: "CASCADE",
orphanedRowAction: "nullify",
},
)
@JoinColumn({ name: "onCallDutyPolicyId" })
public onCallDutyPolicy?: OnCallDutyPolicy = undefined;
@ColumnAccessControl({
create: [
Permission.ProjectOwner,
Permission.ProjectAdmin,
Permission.ProjectMember,
Permission.CreateOnCallDutyPolicyUserOverride,
],
read: [
Permission.ProjectOwner,
Permission.ProjectAdmin,
Permission.ProjectMember,
Permission.ReadOnCallDutyPolicyUserOverride,
],
update: [],
})
@Index()
@TableColumn({
type: TableColumnType.ObjectID,
required: false,
canReadOnRelationQuery: true,
title: "On-Call Policy ID",
description:
"ID of your On-Call Policy where this escalation rule belongs.",
})
@Column({
type: ColumnType.ObjectID,
nullable: true,
transformer: ObjectID.getDatabaseTransformer(),
})
public onCallDutyPolicyId?: ObjectID = undefined;
@ColumnAccessControl({
create: [
Permission.ProjectOwner,
Permission.ProjectAdmin,
Permission.ProjectMember,
Permission.CreateOnCallDutyPolicyUserOverride,
],
read: [
Permission.ProjectOwner,
Permission.ProjectAdmin,
Permission.ProjectMember,
Permission.ReadOnCallDutyPolicyUserOverride,
],
update: [],
})
@TableColumn({
manyToOneRelationColumn: "createdByUserId",
type: TableColumnType.Entity,
modelType: User,
title: "Created by User",
description:
"Relation to User who created this object (if this object was created by a User)",
})
@ManyToOne(
() => {
return User;
},
{
eager: false,
nullable: true,
onDelete: "SET NULL",
orphanedRowAction: "nullify",
},
)
@JoinColumn({ name: "createdByUserId" })
public createdByUser?: User = undefined;
@ColumnAccessControl({
create: [
Permission.ProjectOwner,
Permission.ProjectAdmin,
Permission.ProjectMember,
Permission.CreateOnCallDutyPolicyUserOverride,
],
read: [
Permission.ProjectOwner,
Permission.ProjectAdmin,
Permission.ProjectMember,
Permission.ReadOnCallDutyPolicyUserOverride,
],
update: [],
})
@TableColumn({
type: TableColumnType.ObjectID,
title: "Created by User ID",
description:
"User ID who created this object (if this object was created by a User)",
})
@Column({
type: ColumnType.ObjectID,
nullable: true,
transformer: ObjectID.getDatabaseTransformer(),
})
public createdByUserId?: ObjectID = undefined;
@ColumnAccessControl({
create: [
Permission.ProjectOwner,
Permission.ProjectAdmin,
Permission.ProjectMember,
Permission.CreateOnCallDutyPolicyUserOverride,
],
read: [
Permission.ProjectOwner,
Permission.ProjectAdmin,
Permission.ProjectMember,
Permission.ReadOnCallDutyPolicyUserOverride,
],
update: [],
})
@TableColumn({
manyToOneRelationColumn: "overrideUserId",
type: TableColumnType.Entity,
modelType: User,
title: "Override User",
description:
"Relation to User who is being overridden by this object (if this object was created by a User)",
})
@ManyToOne(
() => {
return User;
},
{
eager: false,
nullable: true,
onDelete: "SET NULL",
orphanedRowAction: "nullify",
},
)
@JoinColumn({ name: "overrideUserId" })
public overrideUser?: User = undefined;
@ColumnAccessControl({
create: [
Permission.ProjectOwner,
Permission.ProjectAdmin,
Permission.ProjectMember,
Permission.CreateOnCallDutyPolicyUserOverride,
],
read: [
Permission.ProjectOwner,
Permission.ProjectAdmin,
Permission.ProjectMember,
Permission.ReadOnCallDutyPolicyUserOverride,
],
update: [],
})
@TableColumn({
type: TableColumnType.ObjectID,
required: true,
title: "Override User ID",
description:
"User ID who is being overridden by this object (if this object was created by a User)",
})
@Column({
type: ColumnType.ObjectID,
nullable: false,
transformer: ObjectID.getDatabaseTransformer(),
})
public overrideUserId?: ObjectID = undefined;
@ColumnAccessControl({
create: [
Permission.ProjectOwner,
Permission.ProjectAdmin,
Permission.ProjectMember,
Permission.CreateOnCallDutyPolicyUserOverride,
],
read: [
Permission.ProjectOwner,
Permission.ProjectAdmin,
Permission.ProjectMember,
Permission.ReadOnCallDutyPolicyUserOverride,
],
update: [],
})
@TableColumn({
manyToOneRelationColumn: "routeAlertsToUserId",
type: TableColumnType.Entity,
modelType: User,
title: "Route Alerts To User",
description:
"Relation to User who is being overridden by this object (if this object was created by a User)",
})
@ManyToOne(
() => {
return User;
},
{
eager: false,
nullable: true,
onDelete: "SET NULL",
orphanedRowAction: "nullify",
},
)
@JoinColumn({ name: "routeAlertsToUserId" })
public routeAlertsToUser?: User = undefined;
@ColumnAccessControl({
create: [
Permission.ProjectOwner,
Permission.ProjectAdmin,
Permission.ProjectMember,
Permission.CreateOnCallDutyPolicyUserOverride,
],
read: [
Permission.ProjectOwner,
Permission.ProjectAdmin,
Permission.ProjectMember,
Permission.ReadOnCallDutyPolicyUserOverride,
],
update: [],
})
@TableColumn({
type: TableColumnType.ObjectID,
required: true,
title: "Route Alerts To User ID",
description:
"User ID who is being overridden by this object (if this object was created by a User)",
})
@Column({
type: ColumnType.ObjectID,
nullable: false,
transformer: ObjectID.getDatabaseTransformer(),
})
public routeAlertsToUserId?: ObjectID = undefined;
@TableColumn({
title: "Start At",
type: TableColumnType.Date,
required: true,
description: "When does this start?",
})
@ColumnAccessControl({
create: [
Permission.ProjectOwner,
Permission.ProjectAdmin,
Permission.ProjectMember,
Permission.CreateOnCallDutyPolicyUserOverride,
],
read: [
Permission.ProjectOwner,
Permission.ProjectAdmin,
Permission.ProjectMember,
Permission.ReadOnCallDutyPolicyUserOverride,
],
update: [],
})
@Column({
nullable: false,
type: ColumnType.Date,
})
public startsAt?: Date = undefined;
@TableColumn({
title: "Ends At",
type: TableColumnType.Date,
required: true,
description: "When does this end?",
})
@ColumnAccessControl({
create: [
Permission.ProjectOwner,
Permission.ProjectAdmin,
Permission.ProjectMember,
Permission.CreateOnCallDutyPolicyUserOverride,
],
read: [
Permission.ProjectOwner,
Permission.ProjectAdmin,
Permission.ProjectMember,
Permission.ReadOnCallDutyPolicyUserOverride,
],
update: [],
})
@Column({
nullable: false,
type: ColumnType.Date,
})
public endsAt?: Date = undefined;
@ColumnAccessControl({
create: [],
read: [],
update: [],
})
@TableColumn({
manyToOneRelationColumn: "deletedByUserId",
type: TableColumnType.Entity,
title: "Deleted by User",
description:
"Relation to User who deleted this object (if this object was deleted by a User)",
})
@ManyToOne(
() => {
return User;
},
{
cascade: false,
eager: false,
nullable: true,
onDelete: "SET NULL",
orphanedRowAction: "nullify",
},
)
@JoinColumn({ name: "deletedByUserId" })
public deletedByUser?: User = undefined;
@ColumnAccessControl({
create: [],
read: [],
update: [],
})
@TableColumn({
type: TableColumnType.ObjectID,
title: "Deleted by User ID",
description:
"User ID who deleted this object (if this object was deleted by a User)",
})
@Column({
type: ColumnType.ObjectID,
nullable: true,
transformer: ObjectID.getDatabaseTransformer(),
})
public deletedByUserId?: ObjectID = undefined;
}

View File

@@ -416,15 +416,46 @@ export default class ProjectCallSMSConfig extends BaseModel {
})
@TableColumn({
type: TableColumnType.Phone,
title: "Twilio Phone Number",
description: "Phone Number for your Twilio account",
title: "Twilio Primary Phone Number",
description: "Primary Phone Number for your Twilio account",
})
@Column({
type: ColumnType.Phone,
length: ColumnLength.Phone,
nullable: true,
unique: true,
unique: false,
transformer: Phone.getDatabaseTransformer(),
})
public twilioPhoneNumber?: Phone = undefined;
public twilioPrimaryPhoneNumber?: Phone = undefined;
@ColumnAccessControl({
create: [
Permission.ProjectOwner,
Permission.ProjectAdmin,
Permission.CreateProjectCallSMSConfig,
],
read: [
Permission.ProjectOwner,
Permission.ProjectAdmin,
Permission.ProjectMember,
Permission.ReadProjectCallSMSConfig,
],
update: [
Permission.ProjectOwner,
Permission.ProjectAdmin,
Permission.EditProjectCallSMSConfig,
],
})
@TableColumn({
type: TableColumnType.LongText,
title: "Twilio Secondary Phone Numbers",
description: "Secondary Phone Number for your Twilio account",
})
@Column({
type: ColumnType.LongText,
length: ColumnLength.LongText,
nullable: true,
unique: false,
})
public twilioSecondaryPhoneNumbers?: string = undefined; // phone numbers seperated by comma
}

View File

@@ -0,0 +1,335 @@
import Project from "./Project";
import Team from "./Team";
import User from "./User";
import BaseModel from "./DatabaseBaseModel/DatabaseBaseModel";
import Route from "../../Types/API/Route";
import ColumnAccessControl from "../../Types/Database/AccessControl/ColumnAccessControl";
import TableAccessControl from "../../Types/Database/AccessControl/TableAccessControl";
import AllowUserQueryWithoutTenant from "../../Types/Database/AllowUserQueryWithoutTenant";
import ColumnType from "../../Types/Database/ColumnType";
import CrudApiEndpoint from "../../Types/Database/CrudApiEndpoint";
import CurrentUserCanAccessRecordBy from "../../Types/Database/CurrentUserCanAccessRecordBy";
import MultiTenentQueryAllowed from "../../Types/Database/MultiTenentQueryAllowed";
import TableColumn from "../../Types/Database/TableColumn";
import TableColumnType from "../../Types/Database/TableColumnType";
import TableMetadata from "../../Types/Database/TableMetadata";
import TenantColumn from "../../Types/Database/TenantColumn";
import IconProp from "../../Types/Icon/IconProp";
import ObjectID from "../../Types/ObjectID";
import Permission from "../../Types/Permission";
import {
Column,
Entity,
Index,
JoinColumn,
JoinTable,
ManyToMany,
ManyToOne,
} from "typeorm";
@TableAccessControl({
create: [],
read: [
Permission.ProjectOwner,
Permission.ProjectAdmin,
Permission.ProjectMember,
Permission.ReadProjectTeam,
Permission.CurrentUser,
],
delete: [],
update: [],
})
@MultiTenentQueryAllowed(true)
@AllowUserQueryWithoutTenant(true)
@CurrentUserCanAccessRecordBy("userId")
@TenantColumn("projectId")
@CrudApiEndpoint(new Route("/project-user"))
@Entity({
name: "ProjectUser",
})
@TableMetadata({
tableName: "ProjectUser",
singularName: "User",
pluralName: "Users",
icon: IconProp.User,
tableDescription:
"This model connects users and teams. This is an internal table. Its a view on TeamMembers table.",
})
export default class ProjectUser extends BaseModel {
@ColumnAccessControl({
create: [],
read: [
Permission.ProjectOwner,
Permission.ProjectAdmin,
Permission.ProjectMember,
Permission.ReadProjectTeam,
Permission.CurrentUser,
],
update: [],
})
@TableColumn({
required: false,
type: TableColumnType.EntityArray,
modelType: Team,
title: "Teams",
description: "Teams to which this user belongs.",
})
@ManyToMany(
() => {
return Team;
},
{ eager: false },
)
@JoinTable({
name: "ProjectUserAcceptedTeams",
inverseJoinColumn: {
name: "teamId",
referencedColumnName: "_id",
},
joinColumn: {
name: "projectUserId",
referencedColumnName: "_id",
},
})
public acceptedTeams?: Array<Team> = undefined; // user is accepted to these teams. This is a view on TeamMembers table.
@ColumnAccessControl({
create: [],
read: [
Permission.ProjectOwner,
Permission.ProjectAdmin,
Permission.ProjectMember,
Permission.ReadProjectTeam,
Permission.CurrentUser,
],
update: [],
})
@TableColumn({
required: false,
type: TableColumnType.EntityArray,
modelType: Team,
title: "Teams",
description: "Teams to which this user belongs.",
})
@ManyToMany(
() => {
return Team;
},
{ eager: false },
)
@JoinTable({
name: "ProjectUserInvitedTeams",
inverseJoinColumn: {
name: "teamId",
referencedColumnName: "_id",
},
joinColumn: {
name: "projectUserId",
referencedColumnName: "_id",
},
})
public invitedTeams?: Array<Team> = undefined; // user is invited to these teams.
@ColumnAccessControl({
create: [],
read: [
Permission.ProjectOwner,
Permission.ProjectAdmin,
Permission.ProjectMember,
Permission.ReadProjectTeam,
Permission.CurrentUser,
],
update: [],
})
@TableColumn({
manyToOneRelationColumn: "projectId",
type: TableColumnType.Entity,
modelType: Project,
title: "Project",
description: "Relation to Project Resource in which this object belongs",
})
@ManyToOne(
() => {
return Project;
},
{
eager: false,
nullable: true,
onDelete: "CASCADE",
orphanedRowAction: "nullify",
},
)
@JoinColumn({ name: "projectId" })
public project?: Project = undefined;
@ColumnAccessControl({
create: [],
read: [
Permission.ProjectOwner,
Permission.ProjectAdmin,
Permission.ProjectMember,
Permission.ReadProjectTeam,
Permission.CurrentUser,
],
update: [],
})
@Index()
@TableColumn({
type: TableColumnType.ObjectID,
required: true,
canReadOnRelationQuery: true,
title: "Project ID",
description: "ID of your OneUptime Project in which this object belongs",
})
@Column({
type: ColumnType.ObjectID,
nullable: false,
transformer: ObjectID.getDatabaseTransformer(),
})
public projectId?: ObjectID = undefined;
@ColumnAccessControl({
create: [],
read: [
Permission.ProjectOwner,
Permission.ProjectAdmin,
Permission.ReadProjectTeam,
Permission.ProjectMember,
],
update: [],
})
@TableColumn({
manyToOneRelationColumn: "userId",
type: TableColumnType.Entity,
modelType: User,
title: "User",
description: "User who belongs to this team.",
})
@ManyToOne(
() => {
return User;
},
{
eager: false,
nullable: false,
onDelete: "CASCADE",
orphanedRowAction: "nullify",
},
)
@JoinColumn({ name: "userId" })
public user?: User = undefined;
@ColumnAccessControl({
create: [],
read: [
Permission.ProjectOwner,
Permission.ProjectAdmin,
Permission.ProjectMember,
Permission.ReadProjectTeam,
Permission.CurrentUser,
],
update: [],
})
@TableColumn({
type: TableColumnType.ObjectID,
required: true,
title: "User ID",
description: "ID of User who belongs to this team",
})
@Column({
type: ColumnType.ObjectID,
nullable: false,
transformer: ObjectID.getDatabaseTransformer(),
})
public userId?: ObjectID = undefined;
@ColumnAccessControl({
create: [],
read: [],
update: [],
})
@TableColumn({
manyToOneRelationColumn: "createdByUserId",
type: TableColumnType.Entity,
modelType: User,
title: "Created by User",
description:
"Relation to User who created this object (if this object was created by a User)",
})
@ManyToOne(
() => {
return User;
},
{
eager: false,
nullable: true,
onDelete: "SET NULL",
orphanedRowAction: "nullify",
},
)
@JoinColumn({ name: "createdByUserId" })
public createdByUser?: User = undefined;
@ColumnAccessControl({
create: [],
read: [],
update: [],
})
@TableColumn({
type: TableColumnType.ObjectID,
title: "Created by User ID",
description:
"User ID who created this object (if this object was created by a User)",
})
@Column({
type: ColumnType.ObjectID,
nullable: true,
transformer: ObjectID.getDatabaseTransformer(),
})
public createdByUserId?: ObjectID = undefined;
@ColumnAccessControl({
create: [],
read: [],
update: [],
})
@TableColumn({
manyToOneRelationColumn: "deletedByUserId",
type: TableColumnType.Entity,
title: "Deleted by User",
description:
"Relation to User who deleted this object (if this object was deleted by a User)",
})
@ManyToOne(
() => {
return User;
},
{
cascade: false,
eager: false,
nullable: true,
onDelete: "SET NULL",
orphanedRowAction: "nullify",
},
)
@JoinColumn({ name: "deletedByUserId" })
public deletedByUser?: User = undefined;
@ColumnAccessControl({
create: [],
read: [],
update: [],
})
@TableColumn({
type: TableColumnType.ObjectID,
title: "Deleted by User ID",
description:
"User ID who deleted this object (if this object was deleted by a User)",
})
@Column({
type: ColumnType.ObjectID,
nullable: true,
transformer: ObjectID.getDatabaseTransformer(),
})
public deletedByUserId?: ObjectID = undefined;
}

View File

@@ -35,6 +35,7 @@ import {
ManyToOne,
} from "typeorm";
import Recurring from "../../Types/Events/Recurring";
import NotificationRuleWorkspaceChannel from "../../Types/Workspace/NotificationRules/NotificationRuleWorkspaceChannel";
@EnableDocumentation()
@AccessControlColumn("labels")
@@ -917,6 +918,7 @@ export default class ScheduledMaintenance extends BaseModel {
public sendSubscriberNotificationsOnBeforeTheEvent?: Array<Recurring> =
undefined;
@Index()
@ColumnAccessControl({
create: [
Permission.ProjectOwner,
@@ -950,4 +952,85 @@ export default class ScheduledMaintenance extends BaseModel {
nullable: true,
})
public nextSubscriberNotificationBeforeTheEventAt?: Date = undefined;
@ColumnAccessControl({
create: [
Permission.ProjectOwner,
Permission.ProjectAdmin,
Permission.ProjectMember,
Permission.CreateProjectScheduledMaintenance,
],
read: [
Permission.ProjectOwner,
Permission.ProjectAdmin,
Permission.ProjectMember,
Permission.ReadProjectScheduledMaintenance,
],
update: [],
})
@Index()
@TableColumn({
isDefaultValueColumn: false,
required: false,
type: TableColumnType.Number,
title: "Scheduled Maintenance Number",
description: "Scheduled Maintenance Number",
})
@Column({
type: ColumnType.Number,
nullable: true,
})
public scheduledMaintenanceNumber?: number = undefined;
@ColumnAccessControl({
create: [],
read: [],
update: [],
})
@TableColumn({
isDefaultValueColumn: false,
required: false,
type: TableColumnType.JSON,
title: "Post Updates To Workspace Channel Name",
description: "Post Updates To Workspace Channel Name",
})
@Column({
type: ColumnType.JSON,
nullable: true,
})
public postUpdatesToWorkspaceChannels?: Array<NotificationRuleWorkspaceChannel> =
undefined;
@ColumnAccessControl({
create: [
Permission.ProjectOwner,
Permission.ProjectAdmin,
Permission.ProjectMember,
Permission.CreateProjectScheduledMaintenance,
],
read: [
Permission.ProjectOwner,
Permission.ProjectAdmin,
Permission.ProjectMember,
Permission.ReadProjectScheduledMaintenance,
],
update: [
Permission.ProjectOwner,
Permission.ProjectAdmin,
Permission.ProjectMember,
Permission.EditProjectScheduledMaintenance,
],
})
@TableColumn({
isDefaultValueColumn: true,
type: TableColumnType.Boolean,
title: "Should be visible on status page?",
description: "Should this incident be visible on the status page?",
})
@Column({
type: ColumnType.Boolean,
default: true,
nullable: true,
})
public isVisibleOnStatusPage?: boolean = undefined;
}

View File

@@ -0,0 +1,530 @@
import ScheduledMaintenance from "./ScheduledMaintenance";
import Project from "./Project";
import User from "./User";
import BaseModel from "./DatabaseBaseModel/DatabaseBaseModel";
import Route from "../../Types/API/Route";
import ColumnAccessControl from "../../Types/Database/AccessControl/ColumnAccessControl";
import TableAccessControl from "../../Types/Database/AccessControl/TableAccessControl";
import CanAccessIfCanReadOn from "../../Types/Database/CanAccessIfCanReadOn";
import ColumnType from "../../Types/Database/ColumnType";
import CrudApiEndpoint from "../../Types/Database/CrudApiEndpoint";
import EnableDocumentation from "../../Types/Database/EnableDocumentation";
import EnableWorkflow from "../../Types/Database/EnableWorkflow";
import TableColumn from "../../Types/Database/TableColumn";
import TableColumnType from "../../Types/Database/TableColumnType";
import TableMetadata from "../../Types/Database/TableMetadata";
import TenantColumn from "../../Types/Database/TenantColumn";
import IconProp from "../../Types/Icon/IconProp";
import ObjectID from "../../Types/ObjectID";
import Permission from "../../Types/Permission";
import { Column, Entity, Index, JoinColumn, ManyToOne } from "typeorm";
import ColumnLength from "../../Types/Database/ColumnLength";
import Color from "../../Types/Color";
export enum ScheduledMaintenanceFeedEventType {
PublicNote = "PublicNote",
SubscriberNotificationSent = "SubscriberNotificationSent",
OwnerNotificationSent = "OwnerNotificationSent",
OwnerUserAdded = "OwnerUserAdded",
OwnerTeamAdded = "OwnerTeamAdded",
ScheduledMaintenanceCreated = "ScheduledMaintenanceCreated",
ScheduledMaintenanceStateChanged = "ScheduledMaintenanceStateChanged",
PrivateNote = "PrivateNote",
ScheduledMaintenanceUpdated = "ScheduledMaintenanceUpdated",
RootCause = "RootCause",
RemediationNotes = "RemediationNotes",
OwnerUserRemoved = "OwnerUserRemoved",
OwnerTeamRemoved = "OwnerTeamRemoved",
OnCallPolicy = "OnCallPolicy",
OnCallNotification = "OnCallNotification",
}
@EnableDocumentation()
@CanAccessIfCanReadOn("scheduledMaintenance")
@TenantColumn("projectId")
@TableAccessControl({
create: [
Permission.ProjectOwner,
Permission.ProjectAdmin,
Permission.ProjectMember,
Permission.CreateScheduledMaintenanceFeed,
],
read: [
Permission.ProjectOwner,
Permission.ProjectAdmin,
Permission.ProjectMember,
Permission.ReadScheduledMaintenanceFeed,
],
delete: [],
update: [],
})
@EnableWorkflow({
create: true,
delete: true,
update: true,
read: true,
})
@CrudApiEndpoint(new Route("/scheduled-maintenance-feed"))
@Entity({
name: "ScheduledMaintenanceFeed",
})
@TableMetadata({
tableName: "ScheduledMaintenanceFeed",
singularName: "Scheduled Maintenance Feed",
pluralName: "Scheduled Maintenance Feed",
icon: IconProp.List,
tableDescription:
"Log of the entire scheduled maintenance state change. This is a log of all the scheduled maintenance state changes, public notes, more etc.",
})
export default class ScheduledMaintenanceFeed extends BaseModel {
@ColumnAccessControl({
create: [
Permission.ProjectOwner,
Permission.ProjectAdmin,
Permission.ProjectMember,
Permission.CreateScheduledMaintenanceFeed,
],
read: [
Permission.ProjectOwner,
Permission.ProjectAdmin,
Permission.ProjectMember,
Permission.ReadScheduledMaintenanceFeed,
],
update: [],
})
@TableColumn({
manyToOneRelationColumn: "projectId",
type: TableColumnType.Entity,
modelType: Project,
title: "Project",
description: "Relation to Project Resource in which this object belongs",
})
@ManyToOne(
() => {
return Project;
},
{
eager: false,
nullable: true,
onDelete: "CASCADE",
orphanedRowAction: "nullify",
},
)
@JoinColumn({ name: "projectId" })
public project?: Project = undefined;
@ColumnAccessControl({
create: [
Permission.ProjectOwner,
Permission.ProjectAdmin,
Permission.ProjectMember,
Permission.CreateScheduledMaintenanceFeed,
],
read: [
Permission.ProjectOwner,
Permission.ProjectAdmin,
Permission.ProjectMember,
Permission.ReadScheduledMaintenanceFeed,
],
update: [],
})
@Index()
@TableColumn({
type: TableColumnType.ObjectID,
required: true,
canReadOnRelationQuery: true,
title: "Project ID",
description: "ID of your OneUptime Project in which this object belongs",
})
@Column({
type: ColumnType.ObjectID,
nullable: false,
transformer: ObjectID.getDatabaseTransformer(),
})
public projectId?: ObjectID = undefined;
@ColumnAccessControl({
create: [
Permission.ProjectOwner,
Permission.ProjectAdmin,
Permission.ProjectMember,
Permission.CreateScheduledMaintenanceFeed,
],
read: [
Permission.ProjectOwner,
Permission.ProjectAdmin,
Permission.ProjectMember,
Permission.ReadScheduledMaintenanceFeed,
],
update: [],
})
@TableColumn({
manyToOneRelationColumn: "scheduledMaintenanceId",
type: TableColumnType.Entity,
modelType: ScheduledMaintenance,
title: "ScheduledMaintenance",
description:
"Relation to ScheduledMaintenance in which this resource belongs",
})
@ManyToOne(
() => {
return ScheduledMaintenance;
},
{
eager: false,
nullable: true,
onDelete: "CASCADE",
orphanedRowAction: "nullify",
},
)
@JoinColumn({ name: "scheduledMaintenanceId" })
public scheduledMaintenance?: ScheduledMaintenance = undefined;
@ColumnAccessControl({
create: [
Permission.ProjectOwner,
Permission.ProjectAdmin,
Permission.ProjectMember,
Permission.CreateScheduledMaintenanceFeed,
],
read: [
Permission.ProjectOwner,
Permission.ProjectAdmin,
Permission.ProjectMember,
Permission.ReadScheduledMaintenanceFeed,
],
update: [],
})
@Index()
@TableColumn({
type: TableColumnType.ObjectID,
required: true,
title: "ScheduledMaintenance ID",
description:
"Relation to ScheduledMaintenance ID in which this resource belongs",
})
@Column({
type: ColumnType.ObjectID,
nullable: false,
transformer: ObjectID.getDatabaseTransformer(),
})
public scheduledMaintenanceId?: ObjectID = undefined;
@ColumnAccessControl({
create: [
Permission.ProjectOwner,
Permission.ProjectAdmin,
Permission.ProjectMember,
Permission.CreateScheduledMaintenanceFeed,
],
read: [
Permission.ProjectOwner,
Permission.ProjectAdmin,
Permission.ProjectMember,
Permission.ReadScheduledMaintenanceFeed,
],
update: [],
})
@TableColumn({
manyToOneRelationColumn: "createdByUserId",
type: TableColumnType.Entity,
modelType: User,
title: "Created by User",
description:
"Relation to User who created this object (if this object was created by a User)",
})
@ManyToOne(
() => {
return User;
},
{
eager: false,
nullable: true,
onDelete: "SET NULL",
orphanedRowAction: "nullify",
},
)
@JoinColumn({ name: "createdByUserId" })
public createdByUser?: User = undefined;
@ColumnAccessControl({
create: [
Permission.ProjectOwner,
Permission.ProjectAdmin,
Permission.ProjectMember,
Permission.CreateScheduledMaintenanceFeed,
],
read: [
Permission.ProjectOwner,
Permission.ProjectAdmin,
Permission.ProjectMember,
Permission.ReadScheduledMaintenanceFeed,
],
update: [],
})
@TableColumn({
type: TableColumnType.ObjectID,
title: "Created by User ID",
description:
"User ID who created this object (if this object was created by a User)",
})
@Column({
type: ColumnType.ObjectID,
nullable: true,
transformer: ObjectID.getDatabaseTransformer(),
})
public createdByUserId?: ObjectID = undefined;
@ColumnAccessControl({
create: [],
read: [],
update: [],
})
@TableColumn({
manyToOneRelationColumn: "deletedByUserId",
type: TableColumnType.Entity,
title: "Deleted by User",
description:
"Relation to User who deleted this object (if this object was deleted by a User)",
})
@ManyToOne(
() => {
return User;
},
{
cascade: false,
eager: false,
nullable: true,
onDelete: "SET NULL",
orphanedRowAction: "nullify",
},
)
@JoinColumn({ name: "deletedByUserId" })
public deletedByUser?: User = undefined;
@ColumnAccessControl({
create: [],
read: [],
update: [],
})
@TableColumn({
type: TableColumnType.ObjectID,
title: "Deleted by User ID",
description:
"User ID who deleted this object (if this object was deleted by a User)",
})
@Column({
type: ColumnType.ObjectID,
nullable: true,
transformer: ObjectID.getDatabaseTransformer(),
})
public deletedByUserId?: ObjectID = undefined;
@ColumnAccessControl({
create: [
Permission.ProjectOwner,
Permission.ProjectAdmin,
Permission.ProjectMember,
Permission.CreateScheduledMaintenanceFeed,
],
read: [
Permission.ProjectOwner,
Permission.ProjectAdmin,
Permission.ProjectMember,
Permission.ReadScheduledMaintenanceFeed,
],
update: [],
})
@TableColumn({
type: TableColumnType.Markdown,
required: true,
title: "Log (in Markdown)",
description:
"Log of the entire scheduled maintenance state change in Markdown",
})
@Column({
type: ColumnType.Markdown,
nullable: false,
unique: false,
})
public feedInfoInMarkdown?: string = undefined;
@ColumnAccessControl({
create: [
Permission.ProjectOwner,
Permission.ProjectAdmin,
Permission.ProjectMember,
Permission.CreateScheduledMaintenanceFeed,
],
read: [
Permission.ProjectOwner,
Permission.ProjectAdmin,
Permission.ProjectMember,
Permission.ReadScheduledMaintenanceFeed,
],
update: [],
})
@TableColumn({
type: TableColumnType.Markdown,
required: false,
title: "More Information (in Markdown)",
description: "More information in Markdown",
})
@Column({
type: ColumnType.Markdown,
nullable: true,
unique: false,
})
public moreInformationInMarkdown?: string = undefined;
@ColumnAccessControl({
create: [
Permission.ProjectOwner,
Permission.ProjectAdmin,
Permission.ProjectMember,
Permission.CreateScheduledMaintenanceFeed,
],
read: [
Permission.ProjectOwner,
Permission.ProjectAdmin,
Permission.ProjectMember,
Permission.ReadScheduledMaintenanceFeed,
],
update: [],
})
@TableColumn({
type: TableColumnType.ShortText,
required: true,
title: "ScheduledMaintenance Log Event",
description: "ScheduledMaintenance Log Event",
})
@Column({
type: ColumnType.ShortText,
nullable: false,
unique: false,
})
public scheduledMaintenanceFeedEventType?: ScheduledMaintenanceFeedEventType =
undefined;
@ColumnAccessControl({
create: [
Permission.ProjectOwner,
Permission.ProjectAdmin,
Permission.ProjectMember,
Permission.CreateScheduledMaintenanceFeed,
],
read: [
Permission.ProjectOwner,
Permission.ProjectAdmin,
Permission.ProjectMember,
Permission.ReadScheduledMaintenanceFeed,
],
update: [],
})
@TableColumn({
type: TableColumnType.Color,
required: true,
title: "Color",
description: "Display color for this log",
})
@Column({
type: ColumnType.Color,
length: ColumnLength.Color,
nullable: false,
unique: false,
transformer: Color.getDatabaseTransformer(),
})
public displayColor?: Color = undefined;
@ColumnAccessControl({
create: [
Permission.ProjectOwner,
Permission.ProjectAdmin,
Permission.ProjectMember,
Permission.CreateScheduledMaintenanceFeed,
],
read: [
Permission.ProjectOwner,
Permission.ProjectAdmin,
Permission.ProjectMember,
Permission.ReadScheduledMaintenanceFeed,
],
update: [],
})
@TableColumn({
manyToOneRelationColumn: "userId",
type: TableColumnType.Entity,
modelType: User,
title: "User",
description:
"Relation to User who this feed belongs to (if this feed belongs to a User)",
})
@ManyToOne(
() => {
return User;
},
{
eager: false,
nullable: true,
onDelete: "SET NULL",
orphanedRowAction: "nullify",
},
)
@JoinColumn({ name: "userId" })
public user?: User = undefined;
@ColumnAccessControl({
create: [
Permission.ProjectOwner,
Permission.ProjectAdmin,
Permission.ProjectMember,
Permission.CreateScheduledMaintenanceFeed,
],
read: [
Permission.ProjectOwner,
Permission.ProjectAdmin,
Permission.ProjectMember,
Permission.ReadScheduledMaintenanceFeed,
],
update: [],
})
@TableColumn({
type: TableColumnType.ObjectID,
title: "User ID",
description:
"User who this feed belongs to (if this feed belongs to a User)",
})
@Column({
type: ColumnType.ObjectID,
nullable: true,
transformer: ObjectID.getDatabaseTransformer(),
})
public userId?: ObjectID = undefined;
@ColumnAccessControl({
create: [
Permission.ProjectOwner,
Permission.ProjectAdmin,
Permission.ProjectMember,
Permission.CreateScheduledMaintenanceFeed,
],
read: [
Permission.ProjectOwner,
Permission.ProjectAdmin,
Permission.ProjectMember,
Permission.ReadScheduledMaintenanceFeed,
],
update: [],
})
@TableColumn({
title: "Feed Posted At",
description: "Date and time when the feed was posted",
type: TableColumnType.Date,
})
@Column({
type: ColumnType.Date,
nullable: true,
unique: false,
})
public postedAt?: Date = undefined;
}

View File

@@ -516,7 +516,7 @@ export default class ScheduledMaintenanceStateTimeline extends BaseModel {
@TableColumn({
type: TableColumnType.Date,
title: "Starts At",
description: "When did this status change start?",
description: "When did this status change?",
})
@Column({
type: ColumnType.Date,

View File

@@ -789,7 +789,12 @@ export default class ScheduledMaintenanceTemplate extends BaseModel {
Permission.ProjectMember,
Permission.ReadScheduledMaintenanceTemplate,
],
update: [],
update: [
Permission.ProjectOwner,
Permission.ProjectAdmin,
Permission.ProjectMember,
Permission.EditScheduledMaintenanceNoteTemplate,
],
})
@TableColumn({
isDefaultValueColumn: false,
@@ -816,7 +821,12 @@ export default class ScheduledMaintenanceTemplate extends BaseModel {
Permission.ProjectMember,
Permission.ReadScheduledMaintenanceTemplate,
],
update: [],
update: [
Permission.ProjectOwner,
Permission.ProjectAdmin,
Permission.ProjectMember,
Permission.EditScheduledMaintenanceNoteTemplate,
],
})
@TableColumn({
isDefaultValueColumn: false,
@@ -845,7 +855,12 @@ export default class ScheduledMaintenanceTemplate extends BaseModel {
Permission.ProjectMember,
Permission.ReadScheduledMaintenanceTemplate,
],
update: [],
update: [
Permission.ProjectOwner,
Permission.ProjectAdmin,
Permission.ProjectMember,
Permission.EditScheduledMaintenanceNoteTemplate,
],
})
@TableColumn({
isDefaultValueColumn: true,
@@ -873,7 +888,12 @@ export default class ScheduledMaintenanceTemplate extends BaseModel {
Permission.ProjectMember,
Permission.ReadScheduledMaintenanceTemplate,
],
update: [],
update: [
Permission.ProjectOwner,
Permission.ProjectAdmin,
Permission.ProjectMember,
Permission.EditScheduledMaintenanceNoteTemplate,
],
})
@TableColumn({
isDefaultValueColumn: true,
@@ -902,7 +922,12 @@ export default class ScheduledMaintenanceTemplate extends BaseModel {
Permission.ProjectMember,
Permission.ReadScheduledMaintenanceTemplate,
],
update: [],
update: [
Permission.ProjectOwner,
Permission.ProjectAdmin,
Permission.ProjectMember,
Permission.EditScheduledMaintenanceNoteTemplate,
],
})
@TableColumn({
isDefaultValueColumn: true,

View File

@@ -1973,4 +1973,151 @@ export default class StatusPage extends BaseModel {
default: UptimePrecision.TWO_DECIMAL,
})
public overallUptimePercentPrecision?: UptimePrecision = undefined;
@ColumnAccessControl({
create: [
Permission.ProjectOwner,
Permission.ProjectAdmin,
Permission.ProjectMember,
Permission.CreateProjectStatusPage,
],
read: [
Permission.ProjectOwner,
Permission.ProjectAdmin,
Permission.ProjectMember,
Permission.ReadProjectStatusPage,
],
update: [
Permission.ProjectOwner,
Permission.ProjectAdmin,
Permission.ProjectMember,
Permission.EditProjectStatusPage,
],
})
@TableColumn({
required: false,
type: TableColumnType.VeryLongText,
title: "Subscriber Email Notification Footer Text",
description: "Text to send to subscribers in the footer of the email.",
canReadOnRelationQuery: true,
})
@Column({
nullable: true,
type: ColumnType.VeryLongText,
})
public subscriberEmailNotificationFooterText?: string = undefined;
@ColumnAccessControl({
create: [
Permission.ProjectOwner,
Permission.ProjectAdmin,
Permission.ProjectMember,
Permission.CreateProjectStatusPage,
],
read: [
Permission.ProjectOwner,
Permission.ProjectAdmin,
Permission.ProjectMember,
Permission.ReadProjectStatusPage,
],
update: [
Permission.ProjectOwner,
Permission.ProjectAdmin,
Permission.ProjectMember,
Permission.EditProjectStatusPage,
],
})
@TableColumn({
isDefaultValueColumn: true,
type: TableColumnType.Boolean,
title: "Show Incidents on Status Page",
description: "Show Incidents on Status Page?",
})
@Column({
type: ColumnType.Boolean,
default: true,
nullable: false,
})
@ColumnBillingAccessControl({
read: PlanType.Free,
update: PlanType.Growth,
create: PlanType.Free,
})
public showIncidentsOnStatusPage?: boolean = undefined;
@ColumnAccessControl({
create: [
Permission.ProjectOwner,
Permission.ProjectAdmin,
Permission.ProjectMember,
Permission.CreateProjectStatusPage,
],
read: [
Permission.ProjectOwner,
Permission.ProjectAdmin,
Permission.ProjectMember,
Permission.ReadProjectStatusPage,
],
update: [
Permission.ProjectOwner,
Permission.ProjectAdmin,
Permission.ProjectMember,
Permission.EditProjectStatusPage,
],
})
@TableColumn({
isDefaultValueColumn: true,
type: TableColumnType.Boolean,
title: "Show Announcements on Status Page",
description: "Show Announcements on Status Page?",
})
@Column({
type: ColumnType.Boolean,
default: true,
nullable: false,
})
@ColumnBillingAccessControl({
read: PlanType.Free,
update: PlanType.Growth,
create: PlanType.Free,
})
public showAnnouncementsOnStatusPage?: boolean = undefined;
@ColumnAccessControl({
create: [
Permission.ProjectOwner,
Permission.ProjectAdmin,
Permission.ProjectMember,
Permission.CreateProjectStatusPage,
],
read: [
Permission.ProjectOwner,
Permission.ProjectAdmin,
Permission.ProjectMember,
Permission.ReadProjectStatusPage,
],
update: [
Permission.ProjectOwner,
Permission.ProjectAdmin,
Permission.ProjectMember,
Permission.EditProjectStatusPage,
],
})
@TableColumn({
isDefaultValueColumn: true,
type: TableColumnType.Boolean,
title: "Show Scheduled Maintenance Events on Status Page",
description: "Show Scheduled Maintenance Events on Status Page?",
})
@Column({
type: ColumnType.Boolean,
default: true,
nullable: false,
})
@ColumnBillingAccessControl({
read: PlanType.Free,
update: PlanType.Growth,
create: PlanType.Free,
})
public showScheduledMaintenanceEventsOnStatusPage?: boolean = undefined;
}

View File

@@ -164,7 +164,12 @@ export default class StatusPageAnnouncement extends BaseModel {
Permission.ProjectMember,
Permission.ReadStatusPageAnnouncement,
],
update: [],
update: [
Permission.ProjectOwner,
Permission.ProjectAdmin,
Permission.ProjectMember,
Permission.EditStatusPageAnnouncement,
],
})
@TableColumn({
required: false,

View File

@@ -434,6 +434,63 @@ export default class StatusPageSubscriber extends BaseModel {
})
public deletedByUserId?: ObjectID = undefined;
@ColumnAccessControl({
create: [
Permission.ProjectOwner,
Permission.ProjectAdmin,
Permission.ProjectMember,
Permission.CreateStatusPageSubscriber,
Permission.Public,
],
read: [
Permission.ProjectOwner,
Permission.ProjectAdmin,
Permission.ProjectMember,
Permission.ReadStatusPageSubscriber,
],
update: [
Permission.ProjectOwner,
Permission.ProjectAdmin,
Permission.ProjectMember,
Permission.EditStatusPageSubscriber,
],
})
@TableColumn({
isDefaultValueColumn: true,
type: TableColumnType.Boolean,
title: "Is Subscription Confirmed",
description:
"Has subscriber confirmed their subscription? (for example, by clicking on a confirmation link in an email)",
})
@Column({
type: ColumnType.Boolean,
default: false,
})
public isSubscriptionConfirmed?: boolean = undefined;
@ColumnAccessControl({
create: [
Permission.ProjectOwner,
Permission.ProjectAdmin,
Permission.ProjectMember,
Permission.CreateStatusPageSubscriber,
],
read: [],
update: [],
})
@TableColumn({
isDefaultValueColumn: false,
type: TableColumnType.ShortText,
title: "Subscription Confirmation Token",
description:
"Token used to confirm subscription. This is a random token that is sent to the subscriber's email address to confirm their subscription.",
})
@Column({
type: ColumnType.ShortText,
nullable: true,
})
public subscriptionConfirmationToken?: string = undefined;
@ColumnAccessControl({
create: [
Permission.ProjectOwner,

View File

@@ -221,14 +221,14 @@ export default class TelemetryException extends DatabaseBaseModel {
})
@TableColumn({
required: false,
type: TableColumnType.LongText,
type: TableColumnType.VeryLongText,
canReadOnRelationQuery: false,
title: "Exception Message",
description: "Exception message that was thrown by the telemetry service",
})
@Column({
nullable: true,
type: ColumnType.LongText,
type: ColumnType.VeryLongText,
})
public message?: string = undefined;
@@ -252,7 +252,7 @@ export default class TelemetryException extends DatabaseBaseModel {
})
@TableColumn({
required: false,
type: TableColumnType.LongText,
type: TableColumnType.VeryLongText,
canReadOnRelationQuery: false,
title: "Stack Trace",
description:
@@ -260,7 +260,7 @@ export default class TelemetryException extends DatabaseBaseModel {
})
@Column({
nullable: true,
type: ColumnType.LongText,
type: ColumnType.VeryLongText,
})
public stackTrace?: string = undefined;
@@ -284,7 +284,7 @@ export default class TelemetryException extends DatabaseBaseModel {
})
@TableColumn({
required: false,
type: TableColumnType.LongText,
type: TableColumnType.VeryLongText,
canReadOnRelationQuery: false,
title: "Exception Type",
description:
@@ -292,7 +292,7 @@ export default class TelemetryException extends DatabaseBaseModel {
})
@Column({
nullable: true,
type: ColumnType.LongText,
type: ColumnType.VeryLongText,
})
public exceptionType?: string = undefined;

View File

@@ -1,4 +1,5 @@
import IncidentSeverity from "./IncidentSeverity";
import AlertSeverity from "./AlertSeverity";
import Project from "./Project";
import User from "./User";
import UserCall from "./UserCall";
@@ -450,6 +451,55 @@ class UserNotificationRule extends BaseModel {
transformer: ObjectID.getDatabaseTransformer(),
})
public incidentSeverityId?: ObjectID = undefined;
// alert severity.
@ColumnAccessControl({
create: [Permission.CurrentUser],
read: [Permission.CurrentUser],
update: [],
})
@TableColumn({
manyToOneRelationColumn: "alertSeverityId",
type: TableColumnType.Entity,
modelType: AlertSeverity,
title: "Alert Severity",
description:
"Relation to Alert Severity Resource in which this object belongs",
})
@ManyToOne(
() => {
return AlertSeverity;
},
{
eager: false,
nullable: true,
onDelete: "CASCADE",
orphanedRowAction: "nullify",
},
)
@JoinColumn({ name: "alertSeverityId" })
public alertSeverity?: AlertSeverity = undefined;
@ColumnAccessControl({
create: [Permission.CurrentUser],
read: [Permission.CurrentUser],
update: [],
})
@Index()
@TableColumn({
type: TableColumnType.ObjectID,
required: false,
canReadOnRelationQuery: true,
title: "Alert Severity ID",
description: "ID of Alert Severity in which this object belongs",
})
@Column({
type: ColumnType.ObjectID,
nullable: true,
transformer: ObjectID.getDatabaseTransformer(),
})
public alertSeverityId?: ObjectID = undefined;
}
export default UserNotificationRule;

View File

@@ -28,6 +28,7 @@ import Permission from "../../Types/Permission";
import UserNotificationEventType from "../../Types/UserNotification/UserNotificationEventType";
import UserNotificationExecutionStatus from "../../Types/UserNotification/UserNotificationExecutionStatus";
import { Column, Entity, Index, JoinColumn, ManyToOne } from "typeorm";
import Alert from "./Alert";
@EnableDocumentation()
@TenantColumn("projectId")
@@ -368,16 +369,62 @@ export default class UserOnCallLog extends BaseModel {
@TableColumn({
type: TableColumnType.ObjectID,
title: "Triggered By Incident ID",
required: false,
description:
"ID of the incident which triggered this on-call escalation policy.",
})
@Column({
type: ColumnType.ObjectID,
nullable: false,
nullable: true,
transformer: ObjectID.getDatabaseTransformer(),
})
public triggeredByIncidentId?: ObjectID = undefined;
@ColumnAccessControl({
create: [],
read: [Permission.CurrentUser],
update: [],
})
@TableColumn({
manyToOneRelationColumn: "triggeredByAlertId",
type: TableColumnType.Entity,
modelType: Alert,
title: "Triggered By Alert",
description: "Relation to Alert which triggered this on-call duty policy.",
})
@ManyToOne(
() => {
return Alert;
},
{
eager: false,
nullable: true,
onDelete: "CASCADE",
orphanedRowAction: "nullify",
},
)
@JoinColumn({ name: "triggeredByAlertId" })
public triggeredByAlert?: Alert = undefined;
@ColumnAccessControl({
create: [],
read: [Permission.CurrentUser],
update: [],
})
@TableColumn({
type: TableColumnType.ObjectID,
title: "Triggered By Alert ID",
required: false,
description:
"ID of the Alert which triggered this on-call escalation policy.",
})
@Column({
type: ColumnType.ObjectID,
nullable: true,
transformer: ObjectID.getDatabaseTransformer(),
})
public triggeredByAlertId?: ObjectID = undefined;
@ColumnAccessControl({
create: [],
read: [Permission.CurrentUser],
@@ -697,4 +744,47 @@ export default class UserOnCallLog extends BaseModel {
transformer: ObjectID.getDatabaseTransformer(),
})
public onCallDutyScheduleId?: ObjectID = undefined;
@ColumnAccessControl({
create: [],
read: [Permission.CurrentUser],
update: [],
})
@TableColumn({
manyToOneRelationColumn: "overridedByUserId",
type: TableColumnType.Entity,
modelType: User,
title: "Overridden by User",
description: "Relation to User who overrode this alert",
})
@ManyToOne(
() => {
return User;
},
{
eager: false,
nullable: true,
onDelete: "CASCADE",
orphanedRowAction: "nullify",
},
)
@JoinColumn({ name: "overridedByUserId" })
public overridedByUser?: User = undefined;
@ColumnAccessControl({
create: [],
read: [Permission.CurrentUser],
update: [],
})
@TableColumn({
type: TableColumnType.ObjectID,
title: "Overridden by User ID",
description: "User ID who overrode this alert",
})
@Column({
type: ColumnType.ObjectID,
nullable: true,
transformer: ObjectID.getDatabaseTransformer(),
})
public overridedByUserId?: ObjectID = undefined;
}

View File

@@ -1,4 +1,5 @@
import Incident from "./Incident";
import Alert from "./Alert";
import OnCallDutyPolicy from "./OnCallDutyPolicy";
import OnCallDutyPolicyEscalationRule from "./OnCallDutyPolicyEscalationRule";
import OnCallDutyPolicyExecutionLog from "./OnCallDutyPolicyExecutionLog";
@@ -325,18 +326,64 @@ export default class UserOnCallLogTimeline extends BaseModel {
@Index()
@TableColumn({
type: TableColumnType.ObjectID,
required: true,
required: false,
canReadOnRelationQuery: true,
title: "Incident ID",
description: "ID of your OneUptime Incident in which this object belongs",
})
@Column({
type: ColumnType.ObjectID,
nullable: false,
nullable: true,
transformer: ObjectID.getDatabaseTransformer(),
})
public triggeredByIncidentId?: ObjectID = undefined;
@ColumnAccessControl({
create: [],
read: [Permission.CurrentUser],
update: [],
})
@TableColumn({
manyToOneRelationColumn: "triggeredByAlertId",
type: TableColumnType.Entity,
modelType: Alert,
title: "Alert",
description: "Relation to Alert Resource in which this object belongs",
})
@ManyToOne(
() => {
return Alert;
},
{
eager: false,
nullable: true,
onDelete: "CASCADE",
orphanedRowAction: "nullify",
},
)
@JoinColumn({ name: "triggeredByAlertId" })
public triggeredByAlert?: Alert = undefined;
@ColumnAccessControl({
create: [],
read: [Permission.CurrentUser],
update: [],
})
@Index()
@TableColumn({
type: TableColumnType.ObjectID,
required: false,
canReadOnRelationQuery: true,
title: "Alert ID",
description: "ID of your OneUptime Alert in which this object belongs",
})
@Column({
type: ColumnType.ObjectID,
nullable: true,
transformer: ObjectID.getDatabaseTransformer(),
})
public triggeredByAlertId?: ObjectID = undefined;
@ColumnAccessControl({
create: [],
read: [Permission.CurrentUser],

View File

@@ -0,0 +1,469 @@
import Project from "./Project";
import User from "./User";
import BaseModel from "./DatabaseBaseModel/DatabaseBaseModel";
import Route from "../../Types/API/Route";
import AllowAccessIfSubscriptionIsUnpaid from "../../Types/Database/AccessControl/AllowAccessIfSubscriptionIsUnpaid";
import ColumnAccessControl from "../../Types/Database/AccessControl/ColumnAccessControl";
import TableAccessControl from "../../Types/Database/AccessControl/TableAccessControl";
import ColumnLength from "../../Types/Database/ColumnLength";
import ColumnType from "../../Types/Database/ColumnType";
import CrudApiEndpoint from "../../Types/Database/CrudApiEndpoint";
import TableColumn from "../../Types/Database/TableColumn";
import TableColumnType from "../../Types/Database/TableColumnType";
import TableMetadata from "../../Types/Database/TableMetadata";
import TenantColumn from "../../Types/Database/TenantColumn";
import IconProp from "../../Types/Icon/IconProp";
import ObjectID from "../../Types/ObjectID";
import { Column, Entity, Index, JoinColumn, ManyToOne } from "typeorm";
import WorkspaceType from "../../Types/Workspace/WorkspaceType";
import BaseNotificationRule from "../../Types/Workspace/NotificationRules/BaseNotificationRule";
import NotificationRuleEventType from "../../Types/Workspace/NotificationRules/EventType";
import Permission from "../../Types/Permission";
import TableBillingAccessControl from "../../Types/Database/AccessControl/TableBillingAccessControl";
import { PlanType } from "../../Types/Billing/SubscriptionPlan";
@TenantColumn("projectId")
@AllowAccessIfSubscriptionIsUnpaid()
@TableAccessControl({
create: [
Permission.ProjectAdmin,
Permission.ProjectOwner,
Permission.ProjectMember,
Permission.CreateWorkspaceNotificationRule,
],
read: [
Permission.ProjectAdmin,
Permission.ProjectOwner,
Permission.ProjectMember,
Permission.ReadWorkspaceNotificationRule,
],
delete: [
Permission.ProjectAdmin,
Permission.ProjectOwner,
Permission.ProjectMember,
Permission.DeleteWorkspaceNotificationRule,
],
update: [
Permission.ProjectAdmin,
Permission.ProjectOwner,
Permission.ProjectMember,
Permission.EditWorkspaceNotificationRule,
],
})
@TableBillingAccessControl({
create: PlanType.Growth,
read: PlanType.Growth,
update: PlanType.Growth,
delete: PlanType.Growth,
})
@CrudApiEndpoint(new Route("/workspace-notification-rule"))
@Entity({
name: "WorkspaceNotificationRule",
})
@TableMetadata({
tableName: "WorkspaceNotificationRule",
singularName: "Workspace Notification Rule",
pluralName: "Workspace Notification Rules",
icon: IconProp.Logs,
tableDescription: "Notification Rule for Third Party Workspaces",
})
class WorkspaceNotificationRule extends BaseModel {
@ColumnAccessControl({
create: [
Permission.ProjectAdmin,
Permission.ProjectOwner,
Permission.ProjectMember,
Permission.CreateWorkspaceNotificationRule,
],
read: [
Permission.ProjectAdmin,
Permission.ProjectOwner,
Permission.ProjectMember,
Permission.ReadWorkspaceNotificationRule,
],
update: [],
})
@TableColumn({
manyToOneRelationColumn: "projectId",
type: TableColumnType.Entity,
modelType: Project,
title: "Project",
description: "Relation to Project Resource in which this object belongs",
})
@ManyToOne(
() => {
return Project;
},
{
eager: false,
nullable: true,
onDelete: "CASCADE",
orphanedRowAction: "nullify",
},
)
@JoinColumn({ name: "projectId" })
public project?: Project = undefined;
@ColumnAccessControl({
create: [
Permission.ProjectAdmin,
Permission.ProjectOwner,
Permission.ProjectMember,
Permission.CreateWorkspaceNotificationRule,
],
read: [
Permission.ProjectAdmin,
Permission.ProjectOwner,
Permission.ProjectMember,
Permission.ReadWorkspaceNotificationRule,
],
update: [],
})
@Index()
@TableColumn({
type: TableColumnType.ObjectID,
required: true,
canReadOnRelationQuery: true,
title: "Project ID",
description: "ID of your OneUptime Project in which this object belongs",
})
@Column({
type: ColumnType.ObjectID,
nullable: false,
transformer: ObjectID.getDatabaseTransformer(),
})
public projectId?: ObjectID = undefined;
@ColumnAccessControl({
create: [
Permission.ProjectAdmin,
Permission.ProjectOwner,
Permission.ProjectMember,
Permission.CreateWorkspaceNotificationRule,
],
read: [
Permission.ProjectAdmin,
Permission.ProjectOwner,
Permission.ProjectMember,
Permission.ReadWorkspaceNotificationRule,
],
update: [
Permission.ProjectAdmin,
Permission.ProjectOwner,
Permission.ProjectMember,
Permission.EditWorkspaceNotificationRule,
],
})
@TableColumn({
title: "Rule Name",
description: "Name of the Notification Rule",
required: true,
unique: false,
type: TableColumnType.LongText,
canReadOnRelationQuery: true,
})
@Column({
type: ColumnType.LongText,
length: ColumnLength.LongText,
unique: false,
nullable: false,
})
public name?: string = undefined;
@ColumnAccessControl({
create: [
Permission.ProjectAdmin,
Permission.ProjectOwner,
Permission.ProjectMember,
Permission.CreateWorkspaceNotificationRule,
],
read: [
Permission.ProjectAdmin,
Permission.ProjectOwner,
Permission.ProjectMember,
Permission.ReadWorkspaceNotificationRule,
],
update: [
Permission.ProjectAdmin,
Permission.ProjectOwner,
Permission.ProjectMember,
Permission.EditWorkspaceNotificationRule,
],
})
@TableColumn({
title: "Rule Description",
description: "Description of the Notification Rule",
required: false,
unique: false,
type: TableColumnType.LongText,
canReadOnRelationQuery: true,
})
@Column({
type: ColumnType.LongText,
length: ColumnLength.LongText,
unique: false,
nullable: true,
})
public description?: string = undefined;
@ColumnAccessControl({
create: [
Permission.ProjectAdmin,
Permission.ProjectOwner,
Permission.ProjectMember,
Permission.CreateWorkspaceNotificationRule,
],
read: [
Permission.ProjectAdmin,
Permission.ProjectOwner,
Permission.ProjectMember,
Permission.ReadWorkspaceNotificationRule,
],
update: [
Permission.ProjectAdmin,
Permission.ProjectOwner,
Permission.ProjectMember,
Permission.EditWorkspaceNotificationRule,
],
})
@TableColumn({
title: "Workspace Notification Rules",
description: "Notification Rules for the Workspace",
required: true,
unique: false,
type: TableColumnType.JSON,
canReadOnRelationQuery: true,
})
@Column({
type: ColumnType.JSON,
unique: false,
nullable: false,
})
public notificationRule?: BaseNotificationRule = undefined;
@ColumnAccessControl({
create: [
Permission.ProjectAdmin,
Permission.ProjectOwner,
Permission.ProjectMember,
Permission.CreateWorkspaceNotificationRule,
],
read: [
Permission.ProjectAdmin,
Permission.ProjectOwner,
Permission.ProjectMember,
Permission.ReadWorkspaceNotificationRule,
],
update: [
Permission.ProjectAdmin,
Permission.ProjectOwner,
Permission.ProjectMember,
Permission.EditWorkspaceNotificationRule,
],
})
@TableColumn({
title: "Workspace Event Type",
description:
"Event Type for the Workspace like Incident Created, Monitor Status Updated, etc.",
required: true,
unique: false,
type: TableColumnType.ShortText,
canReadOnRelationQuery: true,
})
@Column({
type: ColumnType.ShortText,
unique: false,
nullable: false,
})
public eventType?: NotificationRuleEventType = undefined;
@ColumnAccessControl({
create: [
Permission.ProjectAdmin,
Permission.ProjectOwner,
Permission.ProjectMember,
Permission.CreateWorkspaceNotificationRule,
],
read: [
Permission.ProjectAdmin,
Permission.ProjectOwner,
Permission.ProjectMember,
Permission.ReadWorkspaceNotificationRule,
],
update: [
Permission.ProjectAdmin,
Permission.ProjectOwner,
Permission.ProjectMember,
Permission.EditWorkspaceNotificationRule,
],
})
@TableColumn({
title: "Workspace Type",
description: "Type of Workspace - slack, microsoft teams etc.",
required: true,
unique: false,
type: TableColumnType.LongText,
canReadOnRelationQuery: true,
})
@Column({
type: ColumnType.LongText,
length: ColumnLength.LongText,
unique: false,
nullable: false,
})
public workspaceType?: WorkspaceType = undefined;
@ColumnAccessControl({
create: [
Permission.ProjectAdmin,
Permission.ProjectOwner,
Permission.ProjectMember,
Permission.CreateWorkspaceNotificationRule,
],
read: [
Permission.ProjectAdmin,
Permission.ProjectOwner,
Permission.ProjectMember,
Permission.ReadWorkspaceNotificationRule,
],
update: [
Permission.ProjectAdmin,
Permission.ProjectOwner,
Permission.ProjectMember,
Permission.EditWorkspaceNotificationRule,
],
})
@TableColumn({
manyToOneRelationColumn: "createdByUserId",
type: TableColumnType.Entity,
modelType: User,
title: "Created by User",
description:
"Relation to User who created this object (if this object was created by a User)",
})
@ManyToOne(
() => {
return User;
},
{
eager: false,
nullable: true,
onDelete: "SET NULL",
orphanedRowAction: "nullify",
},
)
@JoinColumn({ name: "createdByUserId" })
public createdByUser?: User = undefined;
@ColumnAccessControl({
create: [
Permission.ProjectAdmin,
Permission.ProjectOwner,
Permission.ProjectMember,
Permission.CreateWorkspaceNotificationRule,
],
read: [
Permission.ProjectAdmin,
Permission.ProjectOwner,
Permission.ProjectMember,
Permission.ReadWorkspaceNotificationRule,
],
update: [
Permission.ProjectAdmin,
Permission.ProjectOwner,
Permission.ProjectMember,
Permission.EditWorkspaceNotificationRule,
],
})
@TableColumn({
type: TableColumnType.ObjectID,
title: "Created by User ID",
description:
"User ID who created this object (if this object was created by a User)",
})
@Column({
type: ColumnType.ObjectID,
nullable: true,
transformer: ObjectID.getDatabaseTransformer(),
})
public createdByUserId?: ObjectID = undefined;
@ColumnAccessControl({
create: [
Permission.ProjectAdmin,
Permission.ProjectOwner,
Permission.ProjectMember,
Permission.CreateWorkspaceNotificationRule,
],
read: [
Permission.ProjectAdmin,
Permission.ProjectOwner,
Permission.ProjectMember,
Permission.ReadWorkspaceNotificationRule,
],
update: [
Permission.ProjectAdmin,
Permission.ProjectOwner,
Permission.ProjectMember,
Permission.EditWorkspaceNotificationRule,
],
})
@TableColumn({
manyToOneRelationColumn: "deletedByUserId",
type: TableColumnType.Entity,
title: "Deleted by User",
description:
"Relation to User who deleted this object (if this object was deleted by a User)",
})
@ManyToOne(
() => {
return User;
},
{
cascade: false,
eager: false,
nullable: true,
onDelete: "SET NULL",
orphanedRowAction: "nullify",
},
)
@JoinColumn({ name: "deletedByUserId" })
public deletedByUser?: User = undefined;
// deleted by userId
@ColumnAccessControl({
create: [
Permission.ProjectAdmin,
Permission.ProjectOwner,
Permission.ProjectMember,
Permission.CreateWorkspaceNotificationRule,
],
read: [
Permission.ProjectAdmin,
Permission.ProjectOwner,
Permission.ProjectMember,
Permission.ReadWorkspaceNotificationRule,
],
update: [
Permission.ProjectAdmin,
Permission.ProjectOwner,
Permission.ProjectMember,
Permission.EditWorkspaceNotificationRule,
],
})
@TableColumn({
type: TableColumnType.ObjectID,
title: "Deleted by User ID",
description:
"User ID who deleted this object (if this object was deleted by a User)",
})
@Column({
type: ColumnType.ObjectID,
nullable: true,
transformer: ObjectID.getDatabaseTransformer(),
})
public deletedByUserId?: ObjectID = undefined;
}
export default WorkspaceNotificationRule;

View File

@@ -0,0 +1,379 @@
import Project from "./Project";
import User from "./User";
import BaseModel from "./DatabaseBaseModel/DatabaseBaseModel";
import Route from "../../Types/API/Route";
import AllowAccessIfSubscriptionIsUnpaid from "../../Types/Database/AccessControl/AllowAccessIfSubscriptionIsUnpaid";
import ColumnAccessControl from "../../Types/Database/AccessControl/ColumnAccessControl";
import TableAccessControl from "../../Types/Database/AccessControl/TableAccessControl";
import ColumnLength from "../../Types/Database/ColumnLength";
import ColumnType from "../../Types/Database/ColumnType";
import CrudApiEndpoint from "../../Types/Database/CrudApiEndpoint";
import TableColumn from "../../Types/Database/TableColumn";
import TableColumnType from "../../Types/Database/TableColumnType";
import TableMetadata from "../../Types/Database/TableMetadata";
import TenantColumn from "../../Types/Database/TenantColumn";
import IconProp from "../../Types/Icon/IconProp";
import ObjectID from "../../Types/ObjectID";
import { Column, Entity, Index, JoinColumn, ManyToOne } from "typeorm";
import WorkspaceType from "../../Types/Workspace/WorkspaceType";
import Permission from "../../Types/Permission";
export interface MiscData {
[key: string]: string;
}
export interface SlackMiscData extends MiscData {
teamId: string;
teamName: string;
botUserId: string;
}
@TenantColumn("projectId")
@AllowAccessIfSubscriptionIsUnpaid()
@TableAccessControl({
create: [
Permission.ProjectOwner,
Permission.ProjectAdmin,
Permission.ProjectMember,
],
read: [
Permission.ProjectOwner,
Permission.ProjectAdmin,
Permission.ProjectMember,
],
delete: [Permission.ProjectOwner, Permission.ProjectAdmin],
update: [
Permission.ProjectOwner,
Permission.ProjectAdmin,
Permission.ProjectMember,
],
})
@CrudApiEndpoint(new Route("/workspace-project-auth-token"))
@Entity({
name: "WorkspaceProjectAuthToken",
})
@TableMetadata({
tableName: "WorkspaceProjectAuthToken",
singularName: "Workspace Project Auth Token",
pluralName: "Workspace Project Auth Tokens",
icon: IconProp.Lock,
tableDescription: "Third Party Auth Token for the Project",
})
class WorkspaceProjectAuthToken extends BaseModel {
@ColumnAccessControl({
create: [
Permission.ProjectOwner,
Permission.ProjectAdmin,
Permission.ProjectMember,
],
read: [
Permission.ProjectOwner,
Permission.ProjectAdmin,
Permission.ProjectMember,
],
update: [],
})
@TableColumn({
manyToOneRelationColumn: "projectId",
type: TableColumnType.Entity,
modelType: Project,
title: "Project",
description: "Relation to Project Resource in which this object belongs",
})
@ManyToOne(
() => {
return Project;
},
{
eager: false,
nullable: true,
onDelete: "CASCADE",
orphanedRowAction: "nullify",
},
)
@JoinColumn({ name: "projectId" })
public project?: Project = undefined;
@ColumnAccessControl({
create: [
Permission.ProjectOwner,
Permission.ProjectAdmin,
Permission.ProjectMember,
],
read: [
Permission.ProjectOwner,
Permission.ProjectAdmin,
Permission.ProjectMember,
],
update: [],
})
@Index()
@TableColumn({
type: TableColumnType.ObjectID,
required: true,
canReadOnRelationQuery: true,
title: "Project ID",
description: "ID of your OneUptime Project in which this object belongs",
})
@Column({
type: ColumnType.ObjectID,
nullable: false,
transformer: ObjectID.getDatabaseTransformer(),
})
public projectId?: ObjectID = undefined;
@ColumnAccessControl({
create: [
Permission.ProjectOwner,
Permission.ProjectAdmin,
Permission.ProjectMember,
],
read: [],
update: [],
})
@TableColumn({
title: "Auth Token",
required: true,
unique: false,
type: TableColumnType.VeryLongText,
canReadOnRelationQuery: true,
})
@Column({
type: ColumnType.VeryLongText,
unique: false,
nullable: false,
})
public authToken?: string = undefined;
@ColumnAccessControl({
create: [
Permission.ProjectOwner,
Permission.ProjectAdmin,
Permission.ProjectMember,
],
read: [
Permission.ProjectOwner,
Permission.ProjectAdmin,
Permission.ProjectMember,
],
update: [],
})
@TableColumn({
title: "Workspace Type",
description: "Type of Workspace - slack, microsoft teams etc.",
required: true,
unique: false,
type: TableColumnType.LongText,
canReadOnRelationQuery: true,
})
@Column({
type: ColumnType.LongText,
length: ColumnLength.LongText,
unique: false,
nullable: false,
})
public workspaceType?: WorkspaceType = undefined;
@ColumnAccessControl({
create: [
Permission.ProjectOwner,
Permission.ProjectAdmin,
Permission.ProjectMember,
],
read: [
Permission.ProjectOwner,
Permission.ProjectAdmin,
Permission.ProjectMember,
],
update: [
Permission.ProjectOwner,
Permission.ProjectAdmin,
Permission.ProjectMember,
],
})
@TableColumn({
title: "Project ID in Workspace",
required: true,
unique: false,
type: TableColumnType.LongText,
canReadOnRelationQuery: true,
})
@Column({
type: ColumnType.LongText,
length: ColumnLength.LongText,
unique: false,
nullable: false,
})
public workspaceProjectId?: string = undefined;
@ColumnAccessControl({
create: [
Permission.ProjectOwner,
Permission.ProjectAdmin,
Permission.ProjectMember,
],
read: [
Permission.ProjectOwner,
Permission.ProjectAdmin,
Permission.ProjectMember,
],
update: [
Permission.ProjectOwner,
Permission.ProjectAdmin,
Permission.ProjectMember,
],
})
@TableColumn({
title: "Misc Data",
required: true,
unique: false,
type: TableColumnType.JSON,
canReadOnRelationQuery: true,
})
@Column({
type: ColumnType.JSON,
unique: false,
nullable: false,
})
public miscData?: MiscData = undefined;
@ColumnAccessControl({
create: [
Permission.ProjectOwner,
Permission.ProjectAdmin,
Permission.ProjectMember,
],
read: [
Permission.ProjectOwner,
Permission.ProjectAdmin,
Permission.ProjectMember,
],
update: [
Permission.ProjectOwner,
Permission.ProjectAdmin,
Permission.ProjectMember,
],
})
@TableColumn({
manyToOneRelationColumn: "createdByUserId",
type: TableColumnType.Entity,
modelType: User,
title: "Created by User",
description:
"Relation to User who created this object (if this object was created by a User)",
})
@ManyToOne(
() => {
return User;
},
{
eager: false,
nullable: true,
onDelete: "SET NULL",
orphanedRowAction: "nullify",
},
)
@JoinColumn({ name: "createdByUserId" })
public createdByUser?: User = undefined;
@ColumnAccessControl({
create: [
Permission.ProjectOwner,
Permission.ProjectAdmin,
Permission.ProjectMember,
],
read: [
Permission.ProjectOwner,
Permission.ProjectAdmin,
Permission.ProjectMember,
],
update: [
Permission.ProjectOwner,
Permission.ProjectAdmin,
Permission.ProjectMember,
],
})
@TableColumn({
type: TableColumnType.ObjectID,
title: "Created by User ID",
description:
"User ID who created this object (if this object was created by a User)",
})
@Column({
type: ColumnType.ObjectID,
nullable: true,
transformer: ObjectID.getDatabaseTransformer(),
})
public createdByUserId?: ObjectID = undefined;
@ColumnAccessControl({
create: [
Permission.ProjectOwner,
Permission.ProjectAdmin,
Permission.ProjectMember,
],
read: [
Permission.ProjectOwner,
Permission.ProjectAdmin,
Permission.ProjectMember,
],
update: [
Permission.ProjectOwner,
Permission.ProjectAdmin,
Permission.ProjectMember,
],
})
@TableColumn({
manyToOneRelationColumn: "deletedByUserId",
type: TableColumnType.Entity,
title: "Deleted by User",
description:
"Relation to User who deleted this object (if this object was deleted by a User)",
})
@ManyToOne(
() => {
return User;
},
{
cascade: false,
eager: false,
nullable: true,
onDelete: "SET NULL",
orphanedRowAction: "nullify",
},
)
@JoinColumn({ name: "deletedByUserId" })
public deletedByUser?: User = undefined;
@ColumnAccessControl({
create: [
Permission.ProjectOwner,
Permission.ProjectAdmin,
Permission.ProjectMember,
],
read: [
Permission.ProjectOwner,
Permission.ProjectAdmin,
Permission.ProjectMember,
],
update: [
Permission.ProjectOwner,
Permission.ProjectAdmin,
Permission.ProjectMember,
],
})
@TableColumn({
type: TableColumnType.ObjectID,
title: "Deleted by User ID",
description:
"User ID who deleted this object (if this object was deleted by a User)",
})
@Column({
type: ColumnType.ObjectID,
nullable: true,
transformer: ObjectID.getDatabaseTransformer(),
})
public deletedByUserId?: ObjectID = undefined;
}
export default WorkspaceProjectAuthToken;

View File

@@ -0,0 +1,230 @@
import Project from "./Project";
import User from "./User";
import BaseModel from "./DatabaseBaseModel/DatabaseBaseModel";
import Route from "../../Types/API/Route";
import AllowAccessIfSubscriptionIsUnpaid from "../../Types/Database/AccessControl/AllowAccessIfSubscriptionIsUnpaid";
import ColumnAccessControl from "../../Types/Database/AccessControl/ColumnAccessControl";
import TableAccessControl from "../../Types/Database/AccessControl/TableAccessControl";
import ColumnLength from "../../Types/Database/ColumnLength";
import ColumnType from "../../Types/Database/ColumnType";
import CrudApiEndpoint from "../../Types/Database/CrudApiEndpoint";
import TableColumn from "../../Types/Database/TableColumn";
import TableColumnType from "../../Types/Database/TableColumnType";
import TableMetadata from "../../Types/Database/TableMetadata";
import TenantColumn from "../../Types/Database/TenantColumn";
import IconProp from "../../Types/Icon/IconProp";
import ObjectID from "../../Types/ObjectID";
import { Column, Entity, Index, JoinColumn, ManyToOne } from "typeorm";
import WorkspaceType from "../../Types/Workspace/WorkspaceType";
export interface Settings {
[key: string]: string;
}
export interface SlackSettings extends Settings {
teamId: string;
teamName: string;
botUserId: string;
}
@TenantColumn("projectId")
@AllowAccessIfSubscriptionIsUnpaid()
@TableAccessControl({
create: [],
read: [],
delete: [],
update: [],
})
@CrudApiEndpoint(new Route("/workspace-setting"))
@Entity({
name: "WorkspaceSetting",
})
@TableMetadata({
tableName: "WorkspaceSetting",
singularName: "Workspace Setting",
pluralName: "Workspace Settings",
icon: IconProp.Settings,
tableDescription: "Settings for Third Party Workspaces",
})
class WorkspaceSetting extends BaseModel {
@ColumnAccessControl({
create: [],
read: [],
update: [],
})
@TableColumn({
manyToOneRelationColumn: "projectId",
type: TableColumnType.Entity,
modelType: Project,
title: "Project",
description: "Relation to Project Resource in which this object belongs",
})
@ManyToOne(
() => {
return Project;
},
{
eager: false,
nullable: true,
onDelete: "CASCADE",
orphanedRowAction: "nullify",
},
)
@JoinColumn({ name: "projectId" })
public project?: Project = undefined;
@ColumnAccessControl({
create: [],
read: [],
update: [],
})
@Index()
@TableColumn({
type: TableColumnType.ObjectID,
required: true,
canReadOnRelationQuery: true,
title: "Project ID",
description: "ID of your OneUptime Project in which this object belongs",
})
@Column({
type: ColumnType.ObjectID,
nullable: false,
transformer: ObjectID.getDatabaseTransformer(),
})
public projectId?: ObjectID = undefined;
@ColumnAccessControl({
create: [],
read: [],
update: [],
})
@TableColumn({
title: "Workspace Settings",
description: "Settings for the Workspace",
required: true,
unique: false,
type: TableColumnType.JSON,
canReadOnRelationQuery: true,
})
@Column({
type: ColumnType.JSON,
unique: false,
nullable: false,
})
public settings?: SlackSettings = undefined;
@ColumnAccessControl({
create: [],
read: [],
update: [],
})
@TableColumn({
title: "Workspace Type",
description: "Type of Workspace - slack, microsoft teams etc.",
required: true,
unique: false,
type: TableColumnType.LongText,
canReadOnRelationQuery: true,
})
@Column({
type: ColumnType.LongText,
length: ColumnLength.LongText,
unique: false,
nullable: false,
})
public workspaceType?: WorkspaceType = undefined;
@ColumnAccessControl({
create: [],
read: [],
update: [],
})
@TableColumn({
manyToOneRelationColumn: "createdByUserId",
type: TableColumnType.Entity,
modelType: User,
title: "Created by User",
description:
"Relation to User who created this object (if this object was created by a User)",
})
@ManyToOne(
() => {
return User;
},
{
eager: false,
nullable: true,
onDelete: "SET NULL",
orphanedRowAction: "nullify",
},
)
@JoinColumn({ name: "createdByUserId" })
public createdByUser?: User = undefined;
@ColumnAccessControl({
create: [],
read: [],
update: [],
})
@TableColumn({
type: TableColumnType.ObjectID,
title: "Created by User ID",
description:
"User ID who created this object (if this object was created by a User)",
})
@Column({
type: ColumnType.ObjectID,
nullable: true,
transformer: ObjectID.getDatabaseTransformer(),
})
public createdByUserId?: ObjectID = undefined;
@ColumnAccessControl({
create: [],
read: [],
update: [],
})
@TableColumn({
manyToOneRelationColumn: "deletedByUserId",
type: TableColumnType.Entity,
title: "Deleted by User",
description:
"Relation to User who deleted this object (if this object was deleted by a User)",
})
@ManyToOne(
() => {
return User;
},
{
cascade: false,
eager: false,
nullable: true,
onDelete: "SET NULL",
orphanedRowAction: "nullify",
},
)
@JoinColumn({ name: "deletedByUserId" })
public deletedByUser?: User = undefined;
// deleted by userId
@ColumnAccessControl({
create: [],
read: [],
update: [],
})
@TableColumn({
type: TableColumnType.ObjectID,
title: "Deleted by User ID",
description:
"User ID who deleted this object (if this object was deleted by a User)",
})
@Column({
type: ColumnType.ObjectID,
nullable: true,
transformer: ObjectID.getDatabaseTransformer(),
})
public deletedByUserId?: ObjectID = undefined;
}
export default WorkspaceSetting;

View File

@@ -0,0 +1,312 @@
import Project from "./Project";
import User from "./User";
import BaseModel from "./DatabaseBaseModel/DatabaseBaseModel";
import Route from "../../Types/API/Route";
import AllowAccessIfSubscriptionIsUnpaid from "../../Types/Database/AccessControl/AllowAccessIfSubscriptionIsUnpaid";
import ColumnAccessControl from "../../Types/Database/AccessControl/ColumnAccessControl";
import TableAccessControl from "../../Types/Database/AccessControl/TableAccessControl";
import ColumnLength from "../../Types/Database/ColumnLength";
import ColumnType from "../../Types/Database/ColumnType";
import CrudApiEndpoint from "../../Types/Database/CrudApiEndpoint";
import CurrentUserCanAccessRecordBy from "../../Types/Database/CurrentUserCanAccessRecordBy";
import TableColumn from "../../Types/Database/TableColumn";
import TableColumnType from "../../Types/Database/TableColumnType";
import TableMetadata from "../../Types/Database/TableMetadata";
import TenantColumn from "../../Types/Database/TenantColumn";
import IconProp from "../../Types/Icon/IconProp";
import ObjectID from "../../Types/ObjectID";
import Permission from "../../Types/Permission";
import { Column, Entity, Index, JoinColumn, ManyToOne } from "typeorm";
import WorkspaceType from "../../Types/Workspace/WorkspaceType";
export interface MiscData {
[key: string]: any;
}
export interface SlackMiscData extends MiscData {
userId: string;
}
@TenantColumn("projectId")
@AllowAccessIfSubscriptionIsUnpaid()
@TableAccessControl({
create: [Permission.CurrentUser],
read: [Permission.CurrentUser],
delete: [Permission.CurrentUser],
update: [Permission.CurrentUser],
})
@CrudApiEndpoint(new Route("/workspace-user-auth-token"))
@Entity({
name: "WorkspaceUserAuthToken",
})
@TableMetadata({
tableName: "WorkspaceUserAuthToken",
singularName: "Workspace User Auth Token",
pluralName: "Workspace User Auth Tokens",
icon: IconProp.Lock,
tableDescription: "Third Party Auth Token for the User",
})
@CurrentUserCanAccessRecordBy("userId")
class WorkspaceUserAuthToken extends BaseModel {
@ColumnAccessControl({
create: [Permission.CurrentUser],
read: [Permission.CurrentUser],
update: [],
})
@TableColumn({
manyToOneRelationColumn: "projectId",
type: TableColumnType.Entity,
modelType: Project,
title: "Project",
description: "Relation to Project Resource in which this object belongs",
})
@ManyToOne(
() => {
return Project;
},
{
eager: false,
nullable: true,
onDelete: "CASCADE",
orphanedRowAction: "nullify",
},
)
@JoinColumn({ name: "projectId" })
public project?: Project = undefined;
@ColumnAccessControl({
create: [Permission.CurrentUser],
read: [Permission.CurrentUser],
update: [],
})
@Index()
@TableColumn({
type: TableColumnType.ObjectID,
required: true,
canReadOnRelationQuery: true,
title: "Project ID",
description: "ID of your OneUptime Project in which this object belongs",
})
@Column({
type: ColumnType.ObjectID,
nullable: false,
transformer: ObjectID.getDatabaseTransformer(),
})
public projectId?: ObjectID = undefined;
@ColumnAccessControl({
create: [Permission.CurrentUser],
read: [],
update: [],
})
@TableColumn({
title: "Auth Token",
required: true,
unique: false,
type: TableColumnType.VeryLongText,
canReadOnRelationQuery: true,
})
@Column({
type: ColumnType.VeryLongText,
unique: false,
nullable: false,
})
public authToken?: string = undefined;
@ColumnAccessControl({
create: [Permission.CurrentUser],
read: [Permission.CurrentUser],
update: [],
})
@TableColumn({
title: "User ID in Service",
description: "User ID in the Workspace",
required: true,
unique: false,
type: TableColumnType.LongText,
canReadOnRelationQuery: true,
})
@Column({
type: ColumnType.LongText,
length: ColumnLength.LongText,
unique: false,
nullable: false,
})
public workspaceUserId?: string = undefined;
@ColumnAccessControl({
create: [Permission.CurrentUser],
read: [Permission.CurrentUser],
update: [],
})
@TableColumn({
title: "Workspace Type",
description: "Type of Workspace - slack, microsoft teams etc.",
required: true,
unique: false,
type: TableColumnType.LongText,
canReadOnRelationQuery: true,
})
@Column({
type: ColumnType.LongText,
length: ColumnLength.LongText,
unique: false,
nullable: false,
})
public workspaceType?: WorkspaceType = undefined;
@ColumnAccessControl({
create: [Permission.CurrentUser],
read: [Permission.CurrentUser],
update: [],
})
@TableColumn({
title: "Misc Data",
required: true,
unique: false,
type: TableColumnType.JSON,
canReadOnRelationQuery: true,
})
@Column({
type: ColumnType.JSON,
unique: false,
nullable: false,
})
public miscData?: MiscData = undefined;
@ColumnAccessControl({
create: [Permission.CurrentUser],
read: [Permission.CurrentUser],
update: [],
})
@TableColumn({
manyToOneRelationColumn: "user",
type: TableColumnType.Entity,
modelType: User,
title: "User",
description: "Relation to User who this email belongs to",
})
@ManyToOne(
() => {
return User;
},
{
eager: false,
nullable: true,
onDelete: "CASCADE",
orphanedRowAction: "nullify",
},
)
@JoinColumn({ name: "userId" })
public user?: User = undefined;
@ColumnAccessControl({
create: [Permission.CurrentUser],
read: [Permission.CurrentUser],
update: [],
})
@TableColumn({
type: TableColumnType.ObjectID,
title: "User ID",
description: "User ID who this email belongs to",
})
@Column({
type: ColumnType.ObjectID,
nullable: true,
transformer: ObjectID.getDatabaseTransformer(),
})
@Index()
public userId?: ObjectID = undefined;
@ColumnAccessControl({
create: [Permission.CurrentUser],
read: [Permission.CurrentUser],
update: [],
})
@TableColumn({
manyToOneRelationColumn: "createdByUserId",
type: TableColumnType.Entity,
modelType: User,
title: "Created by User",
description:
"Relation to User who created this object (if this object was created by a User)",
})
@ManyToOne(
() => {
return User;
},
{
eager: false,
nullable: true,
onDelete: "SET NULL",
orphanedRowAction: "nullify",
},
)
@JoinColumn({ name: "createdByUserId" })
public createdByUser?: User = undefined;
@ColumnAccessControl({
create: [Permission.CurrentUser],
read: [Permission.CurrentUser],
update: [],
})
@TableColumn({
type: TableColumnType.ObjectID,
title: "Created by User ID",
description:
"User ID who created this object (if this object was created by a User)",
})
@Column({
type: ColumnType.ObjectID,
nullable: true,
transformer: ObjectID.getDatabaseTransformer(),
})
public createdByUserId?: ObjectID = undefined;
@ColumnAccessControl({
create: [],
read: [],
update: [],
})
@TableColumn({
manyToOneRelationColumn: "deletedByUserId",
type: TableColumnType.Entity,
title: "Deleted by User",
description:
"Relation to User who deleted this object (if this object was deleted by a User)",
})
@ManyToOne(
() => {
return User;
},
{
cascade: false,
eager: false,
nullable: true,
onDelete: "SET NULL",
orphanedRowAction: "nullify",
},
)
@JoinColumn({ name: "deletedByUserId" })
public deletedByUser?: User = undefined;
@ColumnAccessControl({
create: [],
read: [],
update: [],
})
@TableColumn({
type: TableColumnType.ObjectID,
title: "Deleted by User ID",
description:
"User ID who deleted this object (if this object was deleted by a User)",
})
@Column({
type: ColumnType.ObjectID,
nullable: true,
transformer: ObjectID.getDatabaseTransformer(),
})
public deletedByUserId?: ObjectID = undefined;
}
export default WorkspaceUserAuthToken;

View File

@@ -13,6 +13,7 @@ import Express, {
OneUptimeRequest,
} from "../Utils/Express";
import Response from "../Utils/Response";
import CaptureSpan from "../Utils/Telemetry/CaptureSpan";
import CommonAPI from "./CommonAPI";
import BaseModel from "Common/Models/DatabaseModels/DatabaseBaseModel/DatabaseBaseModel";
import DatabaseCommonInteractionProps from "Common/Types/BaseDatabase/DatabaseCommonInteractionProps";
@@ -131,6 +132,30 @@ export default class BaseAPI<
},
);
router.post(
`${new this.entityType().getCrudApiPath()?.toString()}/:id/update-item`,
UserMiddleware.getUserMiddleware,
async (req: ExpressRequest, res: ExpressResponse, next: NextFunction) => {
try {
await this.updateItem(req, res);
} catch (err) {
next(err);
}
},
);
router.get(
`${new this.entityType().getCrudApiPath()?.toString()}/:id/update-item`,
UserMiddleware.getUserMiddleware,
async (req: ExpressRequest, res: ExpressResponse, next: NextFunction) => {
try {
await this.updateItem(req, res);
} catch (err) {
next(err);
}
},
);
// Delete
router.delete(
`${new this.entityType().getCrudApiPath()?.toString()}/:id`,
@@ -144,10 +169,35 @@ export default class BaseAPI<
},
);
router.post(
`${new this.entityType().getCrudApiPath()?.toString()}/:id/delete-item`,
UserMiddleware.getUserMiddleware,
async (req: ExpressRequest, res: ExpressResponse, next: NextFunction) => {
try {
await this.deleteItem(req, res);
} catch (err) {
next(err);
}
},
);
router.get(
`${new this.entityType().getCrudApiPath()?.toString()}/:id/delete-item`,
UserMiddleware.getUserMiddleware,
async (req: ExpressRequest, res: ExpressResponse, next: NextFunction) => {
try {
await this.deleteItem(req, res);
} catch (err) {
next(err);
}
},
);
this.router = router;
this.service = service;
}
@CaptureSpan()
public async getPermissionsForTenant(
req: ExpressRequest,
): Promise<Array<UserPermission>> {
@@ -178,6 +228,7 @@ export default class BaseAPI<
return null;
}
@CaptureSpan()
public async getList(
req: ExpressRequest,
res: ExpressResponse,
@@ -254,6 +305,7 @@ export default class BaseAPI<
);
}
@CaptureSpan()
public async count(req: ExpressRequest, res: ExpressResponse): Promise<void> {
let query: Query<BaseModel> = {};
@@ -276,6 +328,7 @@ export default class BaseAPI<
});
}
@CaptureSpan()
public async getItem(
req: ExpressRequest,
res: ExpressResponse,
@@ -299,6 +352,7 @@ export default class BaseAPI<
return Response.sendEntityResponse(req, res, item, this.entityType);
}
@CaptureSpan()
public async deleteItem(
req: ExpressRequest,
res: ExpressResponse,
@@ -314,6 +368,7 @@ export default class BaseAPI<
return Response.sendEmptySuccessResponse(req, res);
}
@CaptureSpan()
public async updateItem(
req: ExpressRequest,
res: ExpressResponse,
@@ -340,6 +395,7 @@ export default class BaseAPI<
return Response.sendEmptySuccessResponse(req, res);
}
@CaptureSpan()
public async createItem(
req: ExpressRequest,
res: ExpressResponse,

View File

@@ -28,6 +28,7 @@ import ObjectID from "Common/Types/ObjectID";
import { UserPermission } from "Common/Types/Permission";
import PositiveNumber from "Common/Types/PositiveNumber";
import AggregatedResult from "Common/Types/BaseDatabase/AggregatedResult";
import CaptureSpan from "../Utils/Telemetry/CaptureSpan";
export default class BaseAnalyticsAPI<
TAnalyticsDataModel extends AnalyticsDataModel,
@@ -178,6 +179,7 @@ export default class BaseAnalyticsAPI<
this.service = service;
}
@CaptureSpan()
public async getPermissionsForTenant(
req: ExpressRequest,
): Promise<Array<UserPermission>> {
@@ -208,6 +210,7 @@ export default class BaseAnalyticsAPI<
return null;
}
@CaptureSpan()
public async getList(
req: ExpressRequest,
res: ExpressResponse,
@@ -277,6 +280,7 @@ export default class BaseAnalyticsAPI<
);
}
@CaptureSpan()
public async getAggregate(
req: ExpressRequest,
res: ExpressResponse,
@@ -291,6 +295,17 @@ export default class BaseAnalyticsAPI<
) as any;
}
let groupBy: GroupBy<AnalyticsDataModel> | null =
req.body["groupBy"] || null;
if (groupBy && Object.keys(groupBy).length > 0) {
groupBy = JSONFunctions.deserialize(groupBy as JSONObject) as any;
}
if (groupBy && Object.keys(groupBy).length === 0) {
groupBy = null;
}
if (!aggregateBy) {
throw new BadRequestException("AggregateBy is required");
}
@@ -308,6 +323,7 @@ export default class BaseAnalyticsAPI<
});
}
@CaptureSpan()
public async count(req: ExpressRequest, res: ExpressResponse): Promise<void> {
let query: Query<AnalyticsDataModel> = {};
@@ -330,6 +346,7 @@ export default class BaseAnalyticsAPI<
});
}
@CaptureSpan()
public async getItem(
req: ExpressRequest,
res: ExpressResponse,
@@ -353,6 +370,7 @@ export default class BaseAnalyticsAPI<
return Response.sendEntityResponse(req, res, item, this.entityType);
}
@CaptureSpan()
public async deleteItem(
req: ExpressRequest,
res: ExpressResponse,
@@ -370,6 +388,7 @@ export default class BaseAnalyticsAPI<
return Response.sendEmptySuccessResponse(req, res);
}
@CaptureSpan()
public async updateItem(
req: ExpressRequest,
res: ExpressResponse,
@@ -400,6 +419,7 @@ export default class BaseAnalyticsAPI<
return Response.sendEmptySuccessResponse(req, res);
}
@CaptureSpan()
public async createItem(
req: ExpressRequest,
res: ExpressResponse,

View File

@@ -14,7 +14,6 @@ import {
import Response from "../Utils/Response";
import BaseAPI from "./BaseAPI";
import BaseModel from "Common/Models/DatabaseModels/DatabaseBaseModel/DatabaseBaseModel";
import SubscriptionStatus from "Common/Types/Billing/SubscriptionStatus";
import BadDataException from "Common/Types/Exception/BadDataException";
import { JSONObject } from "Common/Types/JSON";
import Permission, { UserPermission } from "Common/Types/Permission";
@@ -127,37 +126,8 @@ export default class UserAPI extends BaseAPI<
},
});
// refresh subscription status.
const subscriptionState: SubscriptionStatus =
await BillingService.getSubscriptionStatus(
project.paymentProviderSubscriptionId as string,
);
const meteredSubscriptionState: SubscriptionStatus =
await BillingService.getSubscriptionStatus(
project.paymentProviderMeteredSubscriptionId as string,
);
// if subscription is cancelled, create a new subscription and update project.
if (
meteredSubscriptionState === SubscriptionStatus.Canceled ||
subscriptionState === SubscriptionStatus.Canceled
) {
await ProjectService.reactiveSubscription(project.id!);
}
await ProjectService.updateOneById({
id: project.id!,
data: {
paymentProviderSubscriptionStatus: subscriptionState,
paymentProviderMeteredSubscriptionStatus:
meteredSubscriptionState,
},
props: {
isRoot: true,
ignoreHooks: true,
},
await BillingInvoiceService.refreshSubscriptionStatus({
projectId: project.id!,
});
return Response.sendEmptySuccessResponse(req, res);

View File

@@ -4,8 +4,10 @@ import { ExpressRequest, OneUptimeRequest } from "../Utils/Express";
import DatabaseCommonInteractionProps from "Common/Types/BaseDatabase/DatabaseCommonInteractionProps";
import { PlanType } from "Common/Types/Billing/SubscriptionPlan";
import UserType from "Common/Types/UserType";
import CaptureSpan from "../Utils/Telemetry/CaptureSpan";
export default class CommonAPI {
@CaptureSpan()
public static async getDatabaseCommonInteractionProps(
req: ExpressRequest,
): Promise<DatabaseCommonInteractionProps> {

View File

@@ -13,7 +13,7 @@ import LIMIT_MAX from "Common/Types/Database/LimitMax";
import PositiveNumber from "Common/Types/PositiveNumber";
import Probe from "Common/Models/DatabaseModels/Probe";
export default class Ingestor extends BaseAPI<Probe, ProbeServiceType> {
export default class ProbeAPI extends BaseAPI<Probe, ProbeServiceType> {
public constructor() {
super(Probe, ProbeService);

View File

@@ -0,0 +1,418 @@
import Express, {
ExpressRequest,
ExpressResponse,
ExpressRouter,
} from "../Utils/Express";
import Response from "../Utils/Response";
import SlackAuthorization from "../Middleware/SlackAuthorization";
import BadRequestException from "../../Types/Exception/BadRequestException";
import logger from "../Utils/Logger";
import { JSONObject } from "../../Types/JSON";
import BadDataException from "../../Types/Exception/BadDataException";
import {
AppApiClientUrl,
DashboardClientUrl,
Host,
HttpProtocol,
SlackAppClientId,
SlackAppClientSecret,
} from "../EnvironmentConfig";
import SlackAppManifest from "../Utils/Workspace/Slack/app-manifest.json";
import URL from "../../Types/API/URL";
import HTTPErrorResponse from "../../Types/API/HTTPErrorResponse";
import HTTPResponse from "../../Types/API/HTTPResponse";
import API from "../../Utils/API";
import WorkspaceProjectAuthTokenService from "../Services/WorkspaceProjectAuthTokenService";
import ObjectID from "../../Types/ObjectID";
import WorkspaceUserAuthTokenService from "../Services/WorkspaceUserAuthTokenService";
import WorkspaceType from "../../Types/Workspace/WorkspaceType";
import SlackAuthAction, {
SlackRequest,
} from "../Utils/Workspace/Slack/Actions/Auth";
import SlackIncidentActions from "../Utils/Workspace/Slack/Actions/Incident";
import SlackAlertActions from "../Utils/Workspace/Slack/Actions/Alert";
import SlackScheduledMaintenanceActions from "../Utils/Workspace/Slack/Actions/ScheduledMaintenance";
import LIMIT_MAX from "../../Types/Database/LimitMax";
import SlackMonitorActions from "../Utils/Workspace/Slack/Actions/Monitor";
export default class SlackAPI {
public getRouter(): ExpressRouter {
const router: ExpressRouter = Express.getRouter();
router.get(
"/slack/app-manifest",
(req: ExpressRequest, res: ExpressResponse) => {
// return app manifest for slack app
let ServerURL: string = new URL(HttpProtocol, Host).toString();
//remove trailing slash if present.
if (ServerURL.endsWith("/")) {
ServerURL = ServerURL.slice(0, -1);
}
// replace SERVER_URL in the manifest with the actual server url.
const manifestInString: string = JSON.stringify(
SlackAppManifest,
).replace(/{{SERVER_URL}}/g, ServerURL.toString());
// convert it back to json.
const manifest: JSONObject = JSON.parse(manifestInString);
return Response.sendJsonObjectResponse(req, res, manifest);
},
);
router.get(
"/slack/auth/:projectId/:userId",
async (req: ExpressRequest, res: ExpressResponse) => {
if (!SlackAppClientId) {
return Response.sendErrorResponse(
req,
res,
new BadDataException("Slack App Client ID is not set"),
);
}
if (!SlackAppClientSecret) {
return Response.sendErrorResponse(
req,
res,
new BadDataException("Slack App Client Secret is not set"),
);
}
const projectId: string | undefined =
req.params["projectId"]?.toString();
const userId: string | undefined = req.params["userId"]?.toString();
if (!projectId) {
return Response.sendErrorResponse(
req,
res,
new BadDataException("Invalid ProjectID in request"),
);
}
if (!userId) {
return Response.sendErrorResponse(
req,
res,
new BadDataException("Invalid UserID in request"),
);
}
// if there's an error query param.
const error: string | undefined = req.query["error"]?.toString();
const slackIntegrationPageUrl: URL = URL.fromString(
DashboardClientUrl.toString() +
`/${projectId.toString()}/settings/slack-integration`,
);
if (error) {
return Response.redirect(
req,
res,
slackIntegrationPageUrl.addQueryParam("error", error),
);
}
// slack returns the code on successful auth.
const code: string | undefined = req.query["code"]?.toString();
if (!code) {
return Response.sendErrorResponse(
req,
res,
new BadRequestException("Invalid request"),
);
}
// get access token from slack api.
const redirectUri: URL = URL.fromString(
`${AppApiClientUrl.toString()}/slack/auth/${projectId}/${userId}`,
);
const requestBody: JSONObject = {
code: code,
client_id: SlackAppClientId,
client_secret: SlackAppClientSecret,
redirect_uri: redirectUri.toString(),
};
logger.debug("Slack Auth Request Body: ");
logger.debug(requestBody);
// send the request to slack api to get the access token https://slack.com/api/oauth.v2.access
const response: HTTPErrorResponse | HTTPResponse<JSONObject> =
await API.post(
URL.fromString("https://slack.com/api/oauth.v2.access"),
requestBody,
{
"Content-Type": "application/x-www-form-urlencoded",
},
);
if (response instanceof HTTPErrorResponse) {
throw response;
}
const responseBody: JSONObject = response.data;
logger.debug("Slack Auth Request Body: ");
logger.debug(responseBody);
let slackTeamId: string | undefined = undefined;
let slackBotAccessToken: string | undefined = undefined;
let slackUserId: string | undefined = undefined;
let slackTeamName: string | undefined = undefined;
let botUserId: string | undefined = undefined;
let slackUserAccessToken: string | undefined = undefined;
// ReponseBody is in this format.
// {
// "ok": true,
// "access_token": "sample-token",
// "token_type": "bot",
// "scope": "commands,incoming-webhook",
// "bot_user_id": "U0KRQLJ9H",
// "app_id": "A0KRD7HC3",
// "team": {
// "name": "Slack Pickleball Team",
// "id": "T9TK3CUKW"
// },
// "enterprise": {
// "name": "slack-pickleball",
// "id": "E12345678"
// },
// "authed_user": {
// "id": "U1234",
// "scope": "chat:write",
// "access_token": "sample-token",
// "token_type": "user"
// }
// }
if (responseBody["ok"] !== true) {
return Response.sendErrorResponse(
req,
res,
new BadRequestException("Invalid request"),
);
}
if (
responseBody["team"] &&
(responseBody["team"] as JSONObject)["id"]
) {
slackTeamId = (responseBody["team"] as JSONObject)["id"]?.toString();
}
if (responseBody["access_token"]) {
slackBotAccessToken = responseBody["access_token"]?.toString();
}
if (
responseBody["authed_user"] &&
(responseBody["authed_user"] as JSONObject)["id"]
) {
slackUserId = (responseBody["authed_user"] as JSONObject)[
"id"
]?.toString();
}
if (
responseBody["authed_user"] &&
(responseBody["authed_user"] as JSONObject)["access_token"]
) {
slackUserAccessToken = (responseBody["authed_user"] as JSONObject)[
"access_token"
]?.toString();
}
if (
responseBody["team"] &&
(responseBody["team"] as JSONObject)["name"]
) {
slackTeamName = (responseBody["team"] as JSONObject)[
"name"
]?.toString();
}
if (responseBody["bot_user_id"]) {
botUserId = responseBody["bot_user_id"]?.toString();
}
await WorkspaceProjectAuthTokenService.refreshAuthToken({
projectId: new ObjectID(projectId),
workspaceType: WorkspaceType.Slack,
authToken: slackBotAccessToken || "",
workspaceProjectId: slackTeamId || "",
miscData: {
teamId: slackTeamId || "",
teamName: slackTeamName || "",
botUserId: botUserId || "",
},
});
await WorkspaceUserAuthTokenService.refreshAuthToken({
projectId: new ObjectID(projectId),
userId: new ObjectID(userId),
workspaceType: WorkspaceType.Slack,
authToken: slackUserAccessToken || "",
workspaceUserId: slackUserId || "",
miscData: {
userId: slackUserId || "",
},
});
// return back to dashboard after successful auth.
Response.redirect(req, res, slackIntegrationPageUrl);
},
);
router.post(
"/slack/interactive",
SlackAuthorization.isAuthorizedSlackRequest,
async (req: ExpressRequest, res: ExpressResponse) => {
logger.debug("Slack Interactive Request: ");
const authResult: SlackRequest = await SlackAuthAction.isAuthorized({
req: req,
});
logger.debug("Slack Interactive Auth Result: ");
logger.debug(authResult);
// if slack uninstall app then,
if (authResult.payloadType === "app_uninstall") {
logger.debug("Slack App Uninstall Request: ");
// remove the project auth and user auth.
// delete all user auth tokens for this project.
await WorkspaceUserAuthTokenService.deleteBy({
query: {
projectId: authResult.projectId,
workspaceType: WorkspaceType.Slack,
},
limit: LIMIT_MAX,
skip: 0,
props: {
isRoot: true,
},
});
await WorkspaceProjectAuthTokenService.deleteBy({
query: {
projectId: authResult.projectId,
workspaceType: WorkspaceType.Slack,
},
limit: 1,
skip: 0,
props: {
isRoot: true,
},
});
logger.debug("Slack App Uninstall Request: Deleted all auth tokens.");
// return empty response.
return Response.sendTextResponse(req, res, "");
}
if (authResult.isAuthorized === false) {
// return empty response if not authorized. Do nothing in this case.
return Response.sendTextResponse(req, res, "");
}
for (const action of authResult.actions || []) {
if (!action.actionType) {
return Response.sendErrorResponse(
req,
res,
new BadRequestException("Invalid request"),
);
}
if (
SlackIncidentActions.isIncidentAction({
actionType: action.actionType,
})
) {
return SlackIncidentActions.handleIncidentAction({
slackRequest: authResult,
action: action,
req: req,
res: res,
});
}
if (
SlackAlertActions.isAlertAction({
actionType: action.actionType,
})
) {
return SlackAlertActions.handleAlertAction({
slackRequest: authResult,
action: action,
req: req,
res: res,
});
}
if (
SlackMonitorActions.isMonitorAction({
actionType: action.actionType,
})
) {
return SlackMonitorActions.handleMonitorAction({
slackRequest: authResult,
action: action,
req: req,
res: res,
});
}
if (
SlackScheduledMaintenanceActions.isScheduledMaintenanceAction({
actionType: action.actionType,
})
) {
return SlackScheduledMaintenanceActions.handleScheduledMaintenanceAction(
{
slackRequest: authResult,
action: action,
req: req,
res: res,
},
);
}
}
return Response.sendErrorResponse(
req,
res,
new BadRequestException("Invalid request"),
);
},
);
// options load endpoint.
router.post(
"/slack/options-load",
SlackAuthorization.isAuthorizedSlackRequest,
(req: ExpressRequest, res: ExpressResponse) => {
return Response.sendJsonObjectResponse(req, res, {
response_action: "clear",
});
},
);
return router;
}
}

View File

@@ -1,3 +1,4 @@
import BadRequestException from "../../Types/Exception/BadRequestException";
import LocalCache from "../Infrastructure/LocalCache";
import Express, {
ExpressRequest,
@@ -6,16 +7,21 @@ import Express, {
} from "../Utils/Express";
import logger from "../Utils/Logger";
import Response from "../Utils/Response";
import Telemetry, { Span, TelemetryCounter } from "../Utils/Telemetry";
import Telemetry, { TelemetryCounter } from "../Utils/Telemetry";
import Exception from "Common/Types/Exception/Exception";
import ServerException from "Common/Types/Exception/ServerException";
import CaptureSpan from "../Utils/Telemetry/CaptureSpan";
export interface StatusAPIOptions {
readyCheck: () => Promise<void>;
liveCheck: () => Promise<void>;
globalCacheCheck?: (() => Promise<void>) | undefined;
analyticsDatabaseCheck?: (() => Promise<void>) | undefined;
databaseCheck?: (() => Promise<void>) | undefined;
}
export default class StatusAPI {
@CaptureSpan()
public static init(options: StatusAPIOptions): ExpressRouter {
const statusCheckSuccessCounter: TelemetryCounter = Telemetry.getCounter({
name: "status.check.success",
@@ -64,65 +70,196 @@ export default class StatusAPI {
});
//Healthy probe
router.get(
"/status/ready",
async (req: ExpressRequest, res: ExpressResponse) => {
return Telemetry.startActiveSpan({
name: "/status/ready",
fn: async (span: Span) => {
try {
logger.debug("Ready check");
await options.readyCheck();
logger.info("Ready check: ok");
stausReadySuccess.add(1);
router.get("/status/ready", (req: ExpressRequest, res: ExpressResponse) => {
return this.handleReadyCheck(
options,
stausReadySuccess,
stausReadyFailed,
req,
res,
);
});
Response.sendJsonObjectResponse(req, res, {
status: "ok",
});
span.end();
} catch (e) {
span.recordException(e as Exception);
stausReadyFailed.add(1);
Response.sendErrorResponse(
req,
res,
e instanceof Exception
? e
: new ServerException("Server is not ready"),
);
span.end();
}
},
});
//Liveness probe
router.get("/status/live", (req: ExpressRequest, res: ExpressResponse) => {
return this.handleLiveCheck(
options,
stausLiveSuccess,
stausLiveFailed,
req,
res,
);
});
// Global cache check
router.get(
"/status/global-cache",
(req: ExpressRequest, res: ExpressResponse) => {
return this.handleGlobalCacheCheck(options, req, res);
},
);
//Liveness probe
// Analytics database check
router.get(
"/status/live",
async (req: ExpressRequest, res: ExpressResponse) => {
try {
logger.debug("Live check");
await options.readyCheck();
logger.info("Live check: ok");
stausLiveSuccess.add(1);
"/status/analytics-database",
(req: ExpressRequest, res: ExpressResponse) => {
return this.handleAnalyticsDatabaseCheck(options, req, res);
},
);
Response.sendJsonObjectResponse(req, res, {
status: "ok",
});
} catch (e) {
stausLiveFailed.add(1);
Response.sendErrorResponse(
req,
res,
e instanceof Exception
? e
: new ServerException("Server is not ready"),
);
}
// Database check
router.get(
"/status/database",
(req: ExpressRequest, res: ExpressResponse) => {
return this.handleDatabaseCheck(options, req, res);
},
);
return router;
}
@CaptureSpan()
private static async handleReadyCheck(
options: StatusAPIOptions,
stausReadySuccess: TelemetryCounter,
stausReadyFailed: TelemetryCounter,
req: ExpressRequest,
res: ExpressResponse,
): Promise<void> {
try {
logger.debug("Ready check");
await options.readyCheck();
logger.info("Ready check: ok");
stausReadySuccess.add(1);
Response.sendJsonObjectResponse(req, res, {
status: "ok",
});
} catch (e) {
stausReadyFailed.add(1);
Response.sendErrorResponse(
req,
res,
e instanceof Exception ? e : new ServerException("Server is not ready"),
);
}
}
@CaptureSpan()
private static async handleLiveCheck(
options: StatusAPIOptions,
stausLiveSuccess: TelemetryCounter,
stausLiveFailed: TelemetryCounter,
req: ExpressRequest,
res: ExpressResponse,
): Promise<void> {
try {
logger.debug("Live check");
await options.liveCheck();
logger.info("Live check: ok");
stausLiveSuccess.add(1);
Response.sendJsonObjectResponse(req, res, {
status: "ok",
});
} catch (e) {
stausLiveFailed.add(1);
Response.sendErrorResponse(
req,
res,
e instanceof Exception ? e : new ServerException("Server is not ready"),
);
}
}
@CaptureSpan()
private static async handleGlobalCacheCheck(
options: StatusAPIOptions,
req: ExpressRequest,
res: ExpressResponse,
): Promise<void> {
try {
logger.debug("Global cache check");
if (options.globalCacheCheck) {
await options.globalCacheCheck();
} else {
throw new BadRequestException("Global cache check not implemented");
}
logger.info("Global cache check: ok");
Response.sendJsonObjectResponse(req, res, {
status: "ok",
});
} catch (e) {
Response.sendErrorResponse(
req,
res,
e instanceof Exception
? e
: new ServerException("Global cache is not ready"),
);
}
}
@CaptureSpan()
private static async handleAnalyticsDatabaseCheck(
options: StatusAPIOptions,
req: ExpressRequest,
res: ExpressResponse,
): Promise<void> {
try {
logger.debug("Analytics database check");
if (options.analyticsDatabaseCheck) {
await options.analyticsDatabaseCheck();
} else {
throw new BadRequestException(
"Analytics database check not implemented",
);
}
logger.info("Analytics database check: ok");
Response.sendJsonObjectResponse(req, res, {
status: "ok",
});
} catch (e) {
Response.sendErrorResponse(
req,
res,
e instanceof Exception
? e
: new ServerException("Analytics database is not ready"),
);
}
}
@CaptureSpan()
private static async handleDatabaseCheck(
options: StatusAPIOptions,
req: ExpressRequest,
res: ExpressResponse,
): Promise<void> {
try {
logger.debug("Database check");
if (options.databaseCheck) {
await options.databaseCheck();
} else {
throw new BadRequestException("Database check not implemented");
}
logger.info("Database check: ok");
Response.sendJsonObjectResponse(req, res, {
status: "ok",
});
} catch (e) {
Response.sendErrorResponse(
req,
res,
e instanceof Exception
? e
: new ServerException("Database is not ready"),
);
}
}
}

File diff suppressed because it is too large Load Diff

View File

@@ -11,7 +11,6 @@ import CommonAPI from "./CommonAPI";
import DatabaseCommonInteractionProps from "Common/Types/BaseDatabase/DatabaseCommonInteractionProps";
import TelemetryType from "Common/Types/Telemetry/TelemetryType";
import TelemetryAttributeService from "../Services/TelemetryAttributeService";
import ArrayUtil from "Common/Utils/Array";
const router: ExpressRouter = Express.getRouter();
@@ -72,12 +71,11 @@ const getAttributes: GetAttributesFunction = async (
);
}
const attributes: string[] = ArrayUtil.removeDuplicates(
const attributes: string[] =
await TelemetryAttributeService.fetchAttributes({
projectId: databaseProps.tenantId,
telemetryType,
}),
);
});
return Response.sendJsonObjectResponse(req, res, {
attributes: attributes,

View File

@@ -10,7 +10,7 @@ import {
} from "../Utils/Express";
import Response from "../Utils/Response";
import BaseAPI from "./BaseAPI";
import { DashboardRoute } from "Common/ServiceRoute";
import { AppApiRoute, DashboardRoute } from "Common/ServiceRoute";
import Hostname from "Common/Types/API/Hostname";
import Protocol from "Common/Types/API/Protocol";
import URL from "Common/Types/API/URL";
@@ -20,6 +20,7 @@ import { JSONObject } from "Common/Types/JSON";
import ObjectID from "Common/Types/ObjectID";
import UserNotificationStatus from "Common/Types/UserNotification/UserNotificationStatus";
import UserOnCallLogTimeline from "Common/Models/DatabaseModels/UserOnCallLogTimeline";
import Route from "../../Types/API/Route";
export default class UserNotificationLogTimelineAPI extends BaseAPI<
UserOnCallLogTimeline,
@@ -55,6 +56,7 @@ export default class UserNotificationLogTimelineAPI extends BaseAPI<
_id: true,
projectId: true,
triggeredByIncidentId: true,
triggeredByAlertId: true,
},
props: {
isRoot: true,
@@ -91,6 +93,84 @@ export default class UserNotificationLogTimelineAPI extends BaseAPI<
},
);
// We have this ack page to show the user a confirmation page before acknowledging the notification.
// this is because email clients automatically make a get request to the url in the email and ack the notification automatically which is not what we want.
// so we need to create this page for the user to confirm that they want to acknowledge the notification.
this.router.get(
`${new this.entityType()
.getCrudApiPath()
?.toString()}/acknowledge-page/:itemId`,
async (req: ExpressRequest, res: ExpressResponse) => {
req = req as OneUptimeRequest;
if (!req.params["itemId"]) {
return Response.sendErrorResponse(
req,
res,
new BadDataException("Item ID is required"),
);
}
const itemId: ObjectID = new ObjectID(req.params["itemId"]);
const timelineItem: UserOnCallLogTimeline | null =
await this.service.findOneById({
id: itemId,
select: {
_id: true,
projectId: true,
triggeredByIncidentId: true,
triggeredByIncident: {
title: true,
description: true,
},
triggeredByAlertId: true,
triggeredByAlert: {
title: true,
description: true,
},
},
props: {
isRoot: true,
},
});
if (!timelineItem) {
return Response.sendErrorResponse(
req,
res,
new BadDataException("Invalid item Id"),
);
}
const notificationType: string = timelineItem.triggeredByIncidentId
? "Incident"
: "Alert";
const host: Hostname = await DatabaseConfig.getHost();
const httpProtocol: Protocol = await DatabaseConfig.getHttpProtocol();
return Response.render(
req,
res,
"/usr/src/Common/Server/Views/AcknowledgeUserOnCallNotification.ejs",
{
title: `Acknowledge ${notificationType} - ${timelineItem.triggeredByIncident?.title || timelineItem.triggeredByAlert?.title}`,
message: `Do you want to acknowledge this ${notificationType}?`,
acknowledgeText: `Acknowledge ${notificationType}`,
acknowledgeUrl: new URL(
httpProtocol,
host,
new Route(AppApiRoute.toString())
.addRoute(new UserOnCallLogTimeline().crudApiPath!)
.addRoute("/acknowledge/" + itemId.toString()),
).toString(),
},
);
},
);
// This is the link that actually acknowledges the notification.
this.router.get(
`${new this.entityType()
.getCrudApiPath()
@@ -115,6 +195,15 @@ export default class UserNotificationLogTimelineAPI extends BaseAPI<
_id: true,
projectId: true,
triggeredByIncidentId: true,
triggeredByAlertId: true,
triggeredByAlert: {
title: true,
},
triggeredByIncident: {
title: true,
},
acknowledgedAt: true,
isAcknowledged: true,
},
props: {
isRoot: true,
@@ -129,6 +218,33 @@ export default class UserNotificationLogTimelineAPI extends BaseAPI<
);
}
const host: Hostname = await DatabaseConfig.getHost();
const httpProtocol: Protocol = await DatabaseConfig.getHttpProtocol();
if (timelineItem.isAcknowledged) {
// already acknowledged. Then show already acknowledged page with view details button.
const viewDetailsUrl: URL = new URL(
httpProtocol,
host,
DashboardRoute.addRoute(
`/${timelineItem.projectId?.toString()}/${timelineItem.triggeredByIncidentId ? "incidents" : "alerts"}/${timelineItem.triggeredByIncidentId ? timelineItem.triggeredByIncidentId!.toString() : timelineItem.triggeredByAlertId!.toString()}`,
),
);
return Response.render(
req,
res,
"/usr/src/Common/Server/Views/ViewMessage.ejs",
{
title: `Notification Already Acknowledged - ${timelineItem.triggeredByIncident?.title || timelineItem.triggeredByAlert?.title}`,
message: `This notification has already been acknowledged.`,
viewDetailsText: `View ${timelineItem.triggeredByIncidentId ? "Incident" : "Alert"}`,
viewDetailsUrl: viewDetailsUrl.toString(),
},
);
}
await this.service.updateOneById({
id: itemId,
data: {
@@ -144,19 +260,38 @@ export default class UserNotificationLogTimelineAPI extends BaseAPI<
// redirect to dashboard to incidents page.
const host: Hostname = await DatabaseConfig.getHost();
const httpProtocol: Protocol = await DatabaseConfig.getHttpProtocol();
if (timelineItem.triggeredByIncidentId) {
return Response.redirect(
req,
res,
new URL(
httpProtocol,
host,
DashboardRoute.addRoute(
`/${timelineItem.projectId?.toString()}/incidents/${timelineItem.triggeredByIncidentId!.toString()}`,
),
),
);
}
return Response.redirect(
if (timelineItem.triggeredByAlertId) {
return Response.redirect(
req,
res,
new URL(
httpProtocol,
host,
DashboardRoute.addRoute(
`/${timelineItem.projectId?.toString()}/alerts/${timelineItem.triggeredByAlertId!.toString()}`,
),
),
);
}
return Response.sendErrorResponse(
req,
res,
new URL(
httpProtocol,
host,
DashboardRoute.addRoute(
`/${timelineItem.projectId?.toString()}/incidents/${timelineItem.triggeredByIncidentId!.toString()}`,
),
),
new BadDataException("Invalid item Id"),
);
},
);

Some files were not shown because too many files have changed in this diff Show More