Compare commits

...

321 Commits

Author SHA1 Message Date
Simon Larsen
9b83202e58 refactor: Add occuranceCount field to ExceptionsTable and ExceptionExplorer components 2024-08-29 12:29:44 +01:00
Simon Larsen
3ca4d5d481 refactor: Remove unused code and optimize imports in ExceptionInstance and TraceElement components 2024-08-29 11:57:24 +01:00
Simon Larsen
5c4d4b2c63 refactor: Add exception span status code and name to ExceptionInstance model 2024-08-29 11:25:43 +01:00
Simon Larsen
fd0a95d436 refactor: Add Unarchive icon and handle archived exceptions in TelemetryExceptionElement 2024-08-29 10:32:40 +01:00
Simon Larsen
23c65cecf0 refactor: Update Telemetry class to handle metricReader being undefined 2024-08-28 12:34:15 +01:00
Simon Larsen
5c3dcf7bc9 refactor: Improve SSL ordering for domains in StatusPageCerts job 2024-08-28 12:25:04 +01:00
Simon Larsen
108940678f refactor: Update TraceExplorer to handle rootSpan with null or undefined parentSpanId 2024-08-28 12:00:45 +01:00
Simon Larsen
3df72091a2 refactor: Update Telemetry class to import TelemetryCounter from Utils/Telemetry 2024-08-28 10:26:26 +01:00
Simon Larsen
b1de73a16a refactor: Update telemetry dependencies and improve SSL ordering in StatusAPI and Telemetry classes 2024-08-28 10:21:22 +01:00
Simon Larsen
f715b14b74 refactor: Update telemetry dependencies and improve SSL ordering in Telemetry class 2024-08-28 09:42:26 +01:00
Simon Larsen
17eef6408e refactor: Update telemetry dependencies and improve SSL ordering in StatusPageCerts job 2024-08-27 20:32:02 +01:00
Simon Larsen
bc288100c0 refactor: Update telemetry dependencies to latest versions 2024-08-27 18:53:48 +01:00
Simon Larsen
c4a01058b7 refactor: Improve SSL ordering for domains in StatusPageCerts job 2024-08-27 18:43:02 +01:00
Simon Larsen
cb10647285 fix depreated prop 2024-08-27 18:42:39 +01:00
Simon Larsen
fb8b00d383 refactor: Update startActiveSpan method in Telemetry class 2024-08-27 14:51:38 +01:00
Simon Larsen
4563f42794 chore: Update timeout handling in Cron and Queue classes 2024-08-27 13:33:15 +01:00
Simon Larsen
a6072634f2 refactor: Improve error handling and logging in Cron and Queue classes 2024-08-27 13:10:40 +01:00
Simon Larsen
646908e66b refactor: Remove unused timeoutInMs property in Cron and Queue classes 2024-08-27 11:12:39 +01:00
Simon Larsen
ed150c1482 refactor: Remove unused timeoutInMs property in Cron and Queue classes 2024-08-27 11:09:00 +01:00
Simon Larsen
fac59332ed refactor: Update CNAME verification logging in StatusPageDomainService 2024-08-27 11:05:07 +01:00
Simon Larsen
64725b3973 refactor: Update code and field types for telemetry exceptions 2024-08-26 20:38:39 +01:00
Simon Larsen
3636b160fb refactor: Update telemetry exception view layout components 2024-08-26 16:48:20 +01:00
Simon Larsen
fee3264350 refactor: Improve CNAME verification logging in StatusPageDomainService 2024-08-26 14:55:52 +01:00
Simon Larsen
5bcd451bc8 Merge branch 'error-tracking' 2024-08-26 14:35:29 +01:00
Simon Larsen
7c2d6dc9e5 refactor: Remove BadDataException from StatusAPI 2024-08-26 14:34:55 +01:00
Simon Larsen
185eb20d1b refactor: Update telemetry exception view layout components 2024-08-26 14:33:01 +01:00
Simon Larsen
cc7696f481 refactor: Update telemetry exception view layout components 2024-08-26 08:58:45 +01:00
Simon Larsen
a3856588bb refactor: Enable telemetry for the app service 2024-08-26 07:40:54 +01:00
Simon Larsen
1a9668a877 refactor: Update telemetry exception view layout components 2024-08-26 07:10:03 +01:00
Simon Larsen
92e519c49e refactor: Update telemetry exception view layout components 2024-08-26 06:45:33 +01:00
Simon Larsen
3c296f72d8 refactor: Update exceptions table messages and routes 2024-08-25 23:25:21 +01:00
Simon Larsen
f0e701c5bb refactor: Update telemetry exception view layout components 2024-08-25 22:52:50 +01:00
Simon Larsen
7fa461e652 refactor: Improve CNAME verification logging in StatusPageDomainService 2024-08-25 22:36:01 +01:00
Simon Larsen
66b4fbded1 refactor: Remove TelemetryExceptionStatusService and ExceptionService 2024-08-25 22:35:06 +01:00
Simon Larsen
e7fc9bb9a5 refactor: Remove TelemetryExceptionStatusService and ExceptionService 2024-08-25 19:42:47 +01:00
Simon Larsen
2f3dbebe9a refactor: Add TelemetryExceptionStatusService to handle telemetry exception status in the database 2024-08-25 19:29:25 +01:00
Simon Larsen
a6a5f189c3 refactor: Add TelemetryExceptionStatus model to DatabaseModels and update Permission enum with Telemetry Exception permissions 2024-08-25 18:40:40 +01:00
Simon Larsen
67f1ad9ef1 Merge pull request #1653 from Johncs2d/master
Add debug logging to StatusPageDomainService.ts for debugging failing…
2024-08-23 15:44:21 +01:00
Johncs2d
4e7d1d5c7a Add debug logging to StatusPageDomainService.ts for debugging failing domain verification requests. 2024-08-23 22:36:41 +08:00
Simon Larsen
b9dd9eb8de refactor: Add Crypto class for MD5 and SHA256 hashing 2024-08-23 14:49:04 +01:00
Simon Larsen
3c86293864 refactor: Add Exception model to AnalyticsModels and update Permission enum with Telemetry Service Exception permissions 2024-08-23 12:32:39 +01:00
Simon Larsen
b202b07353 refactor: Add syncId prop to LineChart component for syncing multiple charts 2024-08-21 19:01:21 +01:00
Simon Larsen
9db1c59893 refactor: Update LineChart component to use new curve prop and add missing type annotations 2024-08-21 18:37:22 +01:00
Simon Larsen
ac7d4f974b refactor: Update ChartCurve enum and LineChart component to use new curve prop 2024-08-21 17:30:07 +01:00
Simon Larsen
6251dfe482 refactor: Update ChartColors and GetYAxisDomain utility functions 2024-08-21 14:57:15 +01:00
Simon Larsen
dbdca789d4 refactor: Update YAxisOptions interface to include a precision property 2024-08-21 14:49:47 +01:00
Simon Larsen
12e766e9d4 refactor: Update YAxisOptions interface to include a precision property 2024-08-21 14:06:19 +01:00
Simon Larsen
ba2a480d4f refactor: Update XAxisOptions interface to include a formatter function 2024-08-21 13:55:57 +01:00
Simon Larsen
3b141d7e90 refactor: Update XAxisOptions interface to include a formatter function 2024-08-21 13:10:46 +01:00
Simon Larsen
61541ac7c9 Merge branch 'master' into tremor-graphs-refactor 2024-08-20 22:04:56 +01:00
Simon Larsen
abde6ee7cb Merge pull request #1651 from OneUptime/bull-board-ui
feat: Add Bull Board for monitoring and managing queues
2024-08-20 22:00:32 +01:00
Simon Larsen
9aae86cc78 feat: Add Bull Board for monitoring and managing queues 2024-08-20 21:59:26 +01:00
Simon Larsen
222027f2e0 refactor: Increase concurrency for running workers to 100 2024-08-20 21:21:39 +01:00
Simon Larsen
adfb3e1db4 refactor: Update logging in CheckHeartbeat.ts and Telemetry.ts 2024-08-20 20:57:33 +01:00
Simon Larsen
fe8aa54f1c feat: Add API endpoint to get count of pending incoming request monitors 2024-08-20 18:27:04 +01:00
Simon Larsen
5237384d08 refactor: Update PostgresAppInstance to use static methods and properties 2024-08-20 17:37:45 +01:00
Simon Larsen
aca766a252 Merge branch 'master' into tremor-graphs-refactor 2024-08-20 16:27:05 +01:00
Simon Larsen
ee29277cb9 refactor: Add SortOrder import and update query sorting in CheckHeartbeat.ts 2024-08-20 16:26:31 +01:00
Simon Larsen
310ca572ff Update XAxisOptions interface to include a formatter function 2024-08-20 16:19:14 +01:00
Simon Larsen
3d13620a28 refactor: Update chart colors in LineChart and BrandColors files 2024-08-20 14:46:26 +01:00
Simon Larsen
1c069c60fc refactor: Update types for X and Y values in Charts 2024-08-19 19:44:25 +01:00
Simon Larsen
7146b341c5 chore: Add new types for X and Y values in Charts 2024-08-19 19:42:57 +01:00
Simon Larsen
8f8e40aa71 Merge branch 'master' into tremor-graphs-refactor 2024-08-19 17:54:17 +01:00
Simon Larsen
0e9c752aae Merge pull request #1649 from OneUptime/add-more-conds
refactor: Update description for Input 2 in Condition component
2024-08-19 17:30:19 +01:00
Simon Larsen
d37f8a4049 refactor: Update description for Input 2 in Condition component 2024-08-19 17:29:38 +01:00
Simon Larsen
26dd72eea2 Merge pull request #1648 from OneUptime/add-more-conds
refactor: Add support for additional condition operators in IfElse co…
2024-08-19 17:24:05 +01:00
Simon Larsen
462105c6fd refactor: Add support for additional condition operators in IfElse component 2024-08-19 17:23:50 +01:00
Simon Larsen
5662d45826 Merge pull request #1647 from OneUptime/make-graphs-beautiful
Make graphs beautiful
2024-08-19 16:55:58 +01:00
Simon Larsen
32ebb26960 refactor: Update chart colors in LineChart and BrandColors files 2024-08-19 16:55:38 +01:00
Simon Larsen
235fed6f17 refactor: Update chart colors in LineChart and BrandColors files 2024-08-19 16:53:04 +01:00
Simon Larsen
a51c0c45e4 chore: Add @tremor/react dependency to package.json 2024-08-19 16:23:37 +01:00
Simon Larsen
8ea54108c1 Merge pull request #1646 from OneUptime/incoming-request-heartbeat-check
Incoming request heartbeat check
2024-08-19 16:18:10 +01:00
Simon Larsen
cba6e9e2a0 refactor: Add incomingRequestMonitorHeartbeatCheckedAt property to MonitorView and Summary components 2024-08-19 16:17:07 +01:00
Simon Larsen
bd1e1792e4 Merge pull request #1645 from OneUptime/refactor-query-types
Refactor query typescript types
2024-08-19 15:33:24 +01:00
Simon Larsen
e5c9b20c64 refactor: Update aggregationType property name in AggregateBy interface and related files 2024-08-19 15:33:04 +01:00
Simon Larsen
8145f07e51 refactor: Update projectId usage in multiple files to use non-null assertion operator 2024-08-19 14:10:03 +01:00
Simon Larsen
56654085a4 refactor: Update projectId usage in multiple files to use non-null assertion operator 2024-08-19 14:06:09 +01:00
Simon Larsen
a6ddba16ec refactor: Update projectId usage in multiple files to use non-null assertion operator 2024-08-19 13:19:26 +01:00
Simon Larsen
b3cf198649 refactor: Update QueryOperator class to extend SerializableObject 2024-08-19 13:15:17 +01:00
Simon Larsen
4dd7285c13 Merge pull request #1644 from OneUptime/Fix-error-message
refactor: Improve error message for no summary available in SummaryIn…
2024-08-19 11:14:43 +01:00
Simon Larsen
5347b5c109 refactor: Improve error message for no summary available in SummaryInfo component 2024-08-19 11:14:11 +01:00
Simon Larsen
24b956c55f Merge pull request #1643 from OneUptime/africa-domain
Add .africa TLD
2024-08-19 10:43:02 +01:00
Simon Larsen
32c9d6d2df add africa tld 2024-08-19 10:42:28 +01:00
Simon Larsen
c883ce6a34 refactor: Improve overall uptime precision display in StatusPageSettings 2024-08-17 10:09:46 +01:00
Simon Larsen
3851c1f963 refactor: Update UptimePrecision enum to separate file for reusability 2024-08-17 09:53:46 +01:00
Simon Larsen
dd5cb900ff refactor: Update workflow dependencies in release.yml 2024-08-15 20:54:18 +01:00
Simon Larsen
47a4fe1937 Merge branch 'release' of github.com:OneUptime/oneuptime into release 2024-08-15 18:43:09 +01:00
Simon Larsen
0d0e64f633 refactor: Update BillingService.test.ts to use OneUptimeDate.getCurrentDate() for mockDate 2024-08-15 18:42:33 +01:00
Simon Larsen
cc432dfa1c refactor: Update QR code description for two-factor authentication 2024-08-15 17:37:57 +01:00
Simon Larsen
0fd161d251 refactor: Update JSON deserialization logic in DatabaseBaseModel 2024-08-15 17:19:00 +01:00
Simon Larsen
a6cb80f640 refactor: Update JSON deserialization logic in DatabaseBaseModel 2024-08-15 16:57:59 +01:00
Simon Larsen
5dbd8b9b35 refactor: Update environment variable name for billing private key in test.common.yaml and test-setup.sh 2024-08-15 16:39:15 +01:00
Simon Larsen
3df855c52a refactor: Add getSpanStatusText method to SpanUtil for retrieving span status text 2024-08-15 16:36:48 +01:00
Simon Larsen
183ff170ae refactor: Update telemetry service fetching logic in MonitorStepElement 2024-08-15 16:34:25 +01:00
Simon Larsen
946e53b5c5 refactor: Update Dropdown component to improve code readability and formatting 2024-08-15 16:12:59 +01:00
Simon Larsen
c8f8b79cea refactor: Improve code readability and formatting in Dropdown component and test-setup.sh 2024-08-15 15:57:46 +01:00
Simon Larsen
cf71ba0c72 refactor: Improve code readability and formatting in QueryUtil 2024-08-15 15:33:12 +01:00
Simon Larsen
90ffb7233d refactor: Update test-setup.sh to set test environment variables and billing keys 2024-08-15 15:31:24 +01:00
Simon Larsen
7742318b74 refactor: Improve code readability and formatting in DropdownUtil and QueryUtil 2024-08-15 15:25:59 +01:00
Simon Larsen
5a1705cf12 refactor: Update watch paths in nodemon.json files and add test-setup.sh script 2024-08-15 14:12:30 +01:00
Simon Larsen
fe55d39d14 refactor: Update table container class name in BaseModelTable and Table components 2024-08-15 12:40:21 +01:00
Simon Larsen
a820b53d65 refactor: Update config.env with test billing private key 2024-08-15 12:16:57 +01:00
Simon Larsen
d2a9d9fed4 reafactor: fix team member tests 2024-08-15 00:05:40 +01:00
Simon Larsen
c9a69db7f2 refactor: Update import paths for ObjectID and OneUptimeDate in various service files 2024-08-14 22:51:29 +01:00
Simon Larsen
69dd24128a feat: Add PATCH method support to API components 2024-08-14 16:42:07 +01:00
Simon Larsen
7c2238eac7 refactor: Update code to handle missing teamMembers in AccessTokenService 2024-08-14 15:42:03 +01:00
Simon Larsen
2e850ed6ab refactor: Update PostgresDatabase.ts and UserService.ts to use explicit type annotations 2024-08-14 13:52:42 +01:00
Simon Larsen
7e54fc33ae refactor: Update ProjectTestService to allow generating random projects with seat limit 2024-08-14 10:11:08 +01:00
Simon Larsen
bc15416103 refactor: Remove unused imports and update error message in ScheduledMaintenanceService 2024-08-14 10:10:22 +01:00
Simon Larsen
b61fb75e36 refactor: Remove unused imports and update error message in ScheduledMaintenanceService 2024-08-13 19:18:27 +01:00
Simon Larsen
a2d2ed038b refactor: Update ScheduledMaintenanceService error message for missing ProjectId 2024-08-13 19:16:56 +01:00
Simon Larsen
f36ea78168 refactor: Update Database class to initialize dataSourceOptions and dataSource as null 2024-08-13 15:10:40 +01:00
Simon Larsen
14cf7f047f refactor: Remove unused imports in ServiceRoute.ts, Index.ts, and various service files 2024-08-13 14:54:29 +01:00
Simon Larsen
c64c3d7012 refactor: Remove unused imports in ServiceRoute.ts, Index.ts, and various service files 2024-08-13 14:37:23 +01:00
Simon Larsen
8cb15df390 refactor: Update ServiceRoute.ts, BillingService.test.ts, ProjectService.ts, ProjectSsoService.ts, DomainService.ts, GlobalConfigService.ts, ProbeService.ts, AcmeChallengeService.ts, CopilotActionService.ts, StatusPageSsoService.ts, ApiKeyService.ts, ResellerService.ts, and ProbeOwnerTeamService.ts 2024-08-13 14:16:53 +01:00
Simon Larsen
32da3f7c94 refactor: Update ProjectAPI and DatabaseService to use explicit type annotations 2024-08-13 13:31:00 +01:00
Simon Larsen
9355f185a9 refactor: Update pricing page with new feature description 2024-08-13 12:12:17 +01:00
Simon Larsen
c53584e9d5 should generate a string of random numbers of specified length 2024-08-12 22:57:36 +01:00
Simon Larsen
01be73612d refactor: Update TestDatabase to use pg-mem for in-memory database in tests 2024-08-09 09:53:22 -06:00
Simon Larsen
99a80ab9b6 refactor: Update PostgresDatabase.ts to use async/await for createDatabase and dropDatabase methods 2024-08-09 09:28:09 -06:00
Simon Larsen
95dca8e8c6 refactor: Update Statement.ts to use explicit type annotations for isNumberArray 2024-08-09 08:38:28 -06:00
Simon Larsen
eddc5f1845 refactor: Update DropdownUtil to return dropdownOptions directly 2024-08-09 08:34:00 -06:00
Simon Larsen
c965c18943 refactor: Update test.common.yaml to install npm dependencies in Common directory 2024-08-08 16:22:37 -06:00
Simon Larsen
3c20f424e9 refactor: Update test-setup.sh to export environment variables and start PostgreSQL in docker-compose 2024-08-08 16:05:37 -06:00
Simon Larsen
0ef7ca93f8 refactor: Update JSONFunctions and Table component to support custom classNames 2024-08-08 16:04:14 -06:00
Simon Larsen
ca7c55b557 refactor: Update test-setup.sh path in test.common.yaml 2024-08-08 14:36:27 -06:00
Simon Larsen
a72373994a refactor: Update test-setup.sh for running database in docker-compose 2024-08-08 14:36:05 -06:00
Simon Larsen
fc0071162e refactor: Update span count and query in MonitorTelemetryMonitor.ts 2024-08-08 12:00:48 -06:00
Simon Larsen
3eef55a29d refactor: Update import statements for CommonUI to use Common/UI 2024-08-08 11:52:34 -06:00
Simon Larsen
aa5dc27427 refactor: Update PostgresDatabase.ts to use async/await for createDatabase and dropDatabase methods 2024-08-08 11:42:30 -06:00
Simon Larsen
900e567748 refactor: Update Slug.ts to use getRandomNumbers method in Faker 2024-08-08 10:45:30 -06:00
Simon Larsen
a88b14747c refactor: Update values.yaml and config.example.env for Let's Encrypt integration 2024-08-08 09:56:15 -06:00
Simon Larsen
1619b23996 refactor: Update Statement.ts to support numbers in finalValue map 2024-08-08 08:35:12 -06:00
Simon Larsen
6ed7e19538 refactor: Update QueryHelper to support numbers in any() method 2024-08-08 08:28:23 -06:00
Simon Larsen
41a3bc8a72 refactor: Add support for monitoring trace counts 2024-08-07 21:11:16 -06:00
Simon Larsen
2621dc7cc2 refactor: Update type name in PostgresDatabase.ts 2024-08-07 19:57:23 -06:00
Simon Larsen
c40ec85ce3 refactor: Remove moduleNameMapper for axios in jest.config.json 2024-08-07 19:52:37 -06:00
Simon Larsen
ff6369389c refactor: Update import statements for axios in jest.config.json 2024-08-07 19:31:17 -06:00
Simon Larsen
9211c91510 refactor: Update import statements for CommonUI to use Common/UI 2024-08-07 18:11:30 -06:00
Simon Larsen
3e778fe503 refactor: Update mockRequest.cookies assignment in Cookie.test.ts 2024-08-07 17:38:56 -06:00
Simon Larsen
77308cd9b7 refactor: Fix formatting and indentation in ProjectAuthorization.test.ts 2024-08-07 16:58:35 -06:00
Simon Larsen
60a33b5b0c Merge pull request #1636 from OneUptime/refactor-common-ui
Refactor common UI
2024-08-07 16:48:04 -06:00
Simon Larsen
679649e7ac refactor: Update import statements for axios in jest.config.json 2024-08-07 16:47:14 -06:00
Simon Larsen
719272e360 refactor: Update import statements for CommonUI to use Common/UI 2024-08-07 16:43:50 -06:00
Simon Larsen
ca7907973a refactor: Update test-setup.sh to use relative path for changing directory 2024-08-07 16:16:11 -06:00
Simon Larsen
86e5a33bd9 refactor: Update import statements for CommonUI to use Common/UI 2024-08-07 16:14:31 -06:00
Simon Larsen
3eb6f4da5f refactor: Update import statements for CommonUI to use Common/UI 2024-08-07 15:58:06 -06:00
Simon Larsen
dea6c55365 refactor: Update import statements for CommonUI to use Common/UI 2024-08-07 15:50:32 -06:00
Simon Larsen
ce9e449ba1 Merge pull request #1637 from OneUptime/master
Release
2024-08-07 15:40:50 -06:00
Simon Larsen
12530a1d0d refactor: Update Date.test.ts to use Date objects instead of formatted strings 2024-08-07 15:26:07 -06:00
Simon Larsen
4e81ed92f2 refactor: Remove node_modules from the Common project 2024-08-07 13:40:10 -06:00
Simon Larsen
21047e77b1 refactor: Remove CommonUI from package.json dependencies 2024-08-07 13:37:29 -06:00
Simon Larsen
67a326e6af refactor: Update import statements for CommonUI to use Common/UI 2024-08-07 13:36:13 -06:00
Simon Larsen
23318f093f refactor: Update import statements for CommonUI to use Common/UI 2024-08-07 13:34:27 -06:00
Simon Larsen
805a9b928f refactor: Update import statements for test files to use relative paths 2024-08-07 13:32:16 -06:00
Simon Larsen
63202cc51f refactor: Update import statements for UserProfile component to use FileUtil.getFileRoute instead of FileUtil.getFileURL 2024-08-07 13:30:33 -06:00
Simon Larsen
bb646bbcf1 refactor: Update Date.test.ts to use Date objects instead of formatted strings 2024-08-07 13:24:19 -06:00
Simon Larsen
000012cd03 refactor: Update Date.test.ts to use Date objects instead of formatted strings 2024-08-07 13:11:48 -06:00
Simon Larsen
1ed9dfc429 refactor: Update Date.test.ts to use Date objects instead of formatted strings 2024-08-07 12:50:45 -06:00
Simon Larsen
491b89cbb4 Merge branch 'merge-dir' 2024-08-07 10:43:17 -06:00
Simon Larsen
bfc8619095 refactor: Update import statements for UserProfile component to use FileUtil.getFileRoute instead of FileUtil.getFileURL 2024-08-07 10:42:47 -06:00
Simon Larsen
8ec5e4bb8a chore: Add telemetry logs viewer to IncidentView page 2024-08-07 09:33:41 -06:00
Simon Larsen
c0c596346c refactor: Update import statements for UserProfile component to use FileUtil.getFileRoute instead of FileUtil.getFileURL 2024-08-07 09:20:19 -06:00
Simon Larsen
e27d47e5bb Merge pull request #1633 from OneUptime/merge-dir
Add Log Monitors
2024-08-06 22:10:56 -06:00
Simon Larsen
524863dff3 refactor: Update import statements for UserProfile component to use FileUtil.getFileRoute instead of FileUtil.getFileURL 2024-08-06 19:38:47 -06:00
Simon Larsen
5bc054504a refactor: Update import statements for UserProfile component to use FileUtil.getFileRoute instead of FileUtil.getFileURL 2024-08-06 17:57:27 -06:00
Simon Larsen
6fd43622a3 refactor: Update import statements for UserProfile component to use FileUtil.getFileRoute instead of FileUtil.getFileURL 2024-08-06 17:47:18 -06:00
Simon Larsen
725a58d5fb refactor: Update import statements for ProbeMonitor and ServerMonitor to use ProbeMonitorResponse and ServerMonitorResponse 2024-08-06 17:47:14 -06:00
Simon Larsen
9bf3856c95 refactor: Update import statements for ProbeMonitor and ServerMonitor to use ProbeMonitorResponse and ServerMonitorResponse 2024-08-06 14:02:28 -06:00
Simon Larsen
5fc95eb02e refactor: Update import statements for ProbeMonitor and ServerMonitor to use ProbeMonitorResponse and ServerMonitorResponse 2024-08-06 11:26:13 -06:00
Simon Larsen
3f7cfa3110 refactor: Update import statements for ProbeMonitor and ServerMonitor to use ProbeMonitorResponse and ServerMonitorResponse 2024-08-06 09:20:10 -06:00
Simon Larsen
bca44b5faf refactor: Update import statements for ProbeMonitor and ServerMonitor to use ProbeMonitorResponse and ServerMonitorResponse 2024-08-05 15:41:32 -06:00
Simon Larsen
02f91d26ff refactor: Update import statements for ProbeMonitor and ServerMonitor to use ProbeMonitorResponse and ServerMonitorResponse 2024-08-05 15:40:20 -06:00
Simon Larsen
5221c20ee2 refactor: Remove commented out code and unused monitor types in MonitorTypeHelper 2024-08-05 15:11:54 -06:00
Simon Larsen
ea0d1a479f Merge pull request #1626 from OneUptime/merge-dir
refactor: Update import statements for ProbeMonitor and ServerMonitor…
2024-08-05 14:59:54 -06:00
Simon Larsen
ea3c357be1 refactor: Remove unused "Model" dependency from package.json files 2024-08-05 14:58:52 -06:00
Simon Larsen
b1c3a9e3c8 refactor: Update import statements for ProbeMonitor and ServerMonitor to use ProbeMonitorResponse and ServerMonitorResponse 2024-08-05 14:34:48 -06:00
Simon Larsen
9ec136bf78 chore: Update npm dependencies and remove unnecessary npm install commands 2024-08-05 13:15:36 -06:00
Simon Larsen
c4611848e3 refactor: Update import statement for NestedModel in StatementGenerator.test.ts 2024-08-05 13:13:06 -06:00
Simon Larsen
a096591c52 refactor: Update import statements for ProbeMonitor and ServerMonitor to use ProbeMonitorResponse and ServerMonitorResponse 2024-08-05 13:05:53 -06:00
Simon Larsen
b29fb6e833 refactor: Update import statements for ProbeMonitor and ServerMonitor to use ProbeMonitorResponse and ServerMonitorResponse 2024-08-05 13:00:31 -06:00
Simon Larsen
2e2ade0b16 refactor: Update import statements for BaseModel in JSONFunctions and BaseModel in UserModel 2024-08-05 12:08:45 -06:00
Simon Larsen
525ad8c664 refactor: Update import statements for ProbeMonitor and ServerMonitor to use ProbeMonitorResponse and ServerMonitorResponse 2024-08-05 11:46:35 -06:00
Simon Larsen
434c55f88f refactor: Update import statements for ProbeMonitor and ServerMonitor to use ProbeMonitorResponse and ServerMonitorResponse 2024-08-05 11:44:52 -06:00
Simon Larsen
c968156fa7 refactor: Update import statements for ProbeMonitor and ServerMonitor to use ProbeMonitorResponse and ServerMonitorResponse 2024-08-05 11:43:45 -06:00
Simon Larsen
36a0dad41c refactor: Update import statements for ProbeMonitor and ServerMonitor to use ProbeMonitorResponse and ServerMonitorResponse 2024-08-05 11:35:45 -06:00
Simon Larsen
52630b16d1 refactor: Update import statements for ProbeMonitor and ServerMonitor to use ProbeMonitorResponse and ServerMonitorResponse 2024-08-05 10:06:53 -06:00
Simon Larsen
7b994675c8 Merge pull request #1625 from OneUptime/log-monitors
Log monitors
2024-08-05 09:56:26 -06:00
Simon Larsen
d0692ebc8f refactor: Remove unnecessary whitespace in code 2024-08-04 20:44:30 -06:00
Simon Larsen
63197d263f refactor: Update monitor interfaces to use consistent naming 2024-08-04 20:33:16 -06:00
Simon Larsen
13b1998261 refactor: Update import statements for ProbeMonitor and ServerMonitor to use ProbeMonitorResponse and ServerMonitorResponse 2024-08-04 19:56:45 -06:00
Simon Larsen
29764ae7c7 refactor: Update monitor interfaces to use consistent naming 2024-08-04 19:39:36 -06:00
Simon Larsen
5c3175f9e7 refactor: Update monitor interfaces to use consistent naming
```
2024-08-04 18:01:04 -06:00
Simon Larsen
8caac12041 refactor: Update LogSeverity enum to use string values instead of enum values 2024-08-04 17:29:38 -06:00
Simon Larsen
d84cf5b8ec refactor: Update LogSeverity enum to use string values instead of enum values
This refactor updates the LogSeverity enum to use string values instead of enum values. This change allows for better compatibility and flexibility when working with log severity levels. The enum values have been replaced with corresponding string values.

Files modified:
- Common/Types/Log/LogSeverity.ts
- Ingestor/API/OTelIngest.ts
- Ingestor/API/FluentIngest.ts
- Model/AnalyticsModels/Log.ts
- CommonUI/src/Components/LogsViewer/LogItem.tsx
- CommonUI/src/Components/LogsViewer/LogsViewer.tsx
- CommonUI/src/Components/Filters/DropdownFilter.tsx
- Common/Types/ObjectID.ts
- CommonUI/src/Components/Filters/FiltersForm.tsx
2024-08-04 16:41:07 -06:00
Simon Larsen
a49709992c refactor: Update docker-compose commands to use "docker compose" instead of "docker-compose" 2024-08-03 20:07:56 -06:00
Simon Larsen
21b078040c refactor: Update proudly-open-source.ejs to include GitHub repo link 2024-08-03 14:34:51 -06:00
Simon Larsen
70371a32af feat: Add imagePullSecrets to Helm chart templates 2024-08-03 14:25:26 -06:00
Simon Larsen
f45985e0ce Merge pull request #1624 from kruchkov-alexandr/feature/add-imagepullsecret-to-chart
Add imagePullSecrets to chart
2024-08-03 14:18:25 -06:00
AlexK
f1d7e0d13f add imagePullSecrets to chart 2024-08-03 15:02:44 +02:00
Simon Larsen
3f8a5291f0 refactor: Initialize telemetry with correct service name in Telemetry and InfrastructureStatus 2024-08-02 16:50:13 -06:00
Simon Larsen
e60b06d014 refactor: Initialize telemetry with correct service name in Telemetry and InfrastructureStatus
This refactor updates the Telemetry and InfrastructureStatus components to initialize telemetry with the correct service name. By using the APP_NAME constant defined in the Index.ts file, the service name is now dynamically set, ensuring accurate telemetry tracking.

Files modified:
- App/Index.ts
- CommonServer/Utils/Telemetry.ts
2024-08-02 16:47:55 -06:00
Simon Larsen
c9e67311e7 refactor: Update TelemetryIngestor and Probe to initialize telemetry with the correct service name 2024-08-02 16:37:23 -06:00
Simon Larsen
0b10880f58 refactor: Update TelemetryIngestor and Probe to initialize telemetry with the correct service name
This refactor updates the TelemetryIngestor and Probe components to initialize telemetry with the correct service name. Previously, the service name was hardcoded or set to a default value, which could lead to inconsistencies and confusion. By using the APP_NAME constant defined in each component, the service name is now dynamically set, ensuring accurate telemetry tracking.

Files modified:
- TelemetryIngestor/Index.ts
- Probe/Index.ts
2024-08-02 16:35:09 -06:00
Simon Larsen
d49a6ce009 refactor: Update OneUptime chart to use probes instead of probe for probe configuration 2024-08-02 14:02:55 -06:00
Simon Larsen
9b8a5c9c43 feat: Add lazy loading for images in SettingsRoutes 2024-08-02 13:44:59 -06:00
Simon Larsen
9dc31fe536 refactor: Update APIKeyView and TelemetryIngestionKeyView to use RouteUtil.populateRouteParams
This refactor updates the APIKeyView and TelemetryIngestionKeyView components to use the RouteUtil.populateRouteParams function when navigating to other routes. This ensures that route parameters are properly populated, improving the reliability and consistency of the navigation logic.
2024-08-02 12:06:29 -06:00
Simon Larsen
0d40be3db1 refactor: Update APIKeyView and TelemetryIngestionKeyView to use RouteUtil.populateRouteParams
This refactor updates the APIKeyView and TelemetryIngestionKeyView components to use the RouteUtil.populateRouteParams function when navigating to other routes. This ensures that route parameters are properly populated, improving the reliability and consistency of the navigation logic.

Files modified:
- Dashboard/src/Pages/Settings/APIKeyView.tsx
- Dashboard/src/Pages/Settings/TelemetryIngestionKeyView.tsx
2024-08-01 20:43:41 -06:00
Simon Larsen
6754167e57 Update Docker Compose files to use OPENTELEMETRY_EXPORTER_OTLP_ENDPOINT consistently across all services. This change ensures that the OpenTelemetry exporter endpoint is set uniformly for all services, improving consistency and reducing potential configuration errors.
Files modified:
- docker-compose.base.yml
- config.example.env
2024-08-01 19:40:56 -06:00
Simon Larsen
3bf74edae4 feat: Update OneUptime chart to use probes instead of probe for probe configuration 2024-08-01 19:37:46 -06:00
Simon Larsen
8a77ae977e refactor: Update OneUptime chart to use probes instead of probe for probe configuration 2024-08-01 19:25:54 -06:00
Simon Larsen
6fbca4b6cb refactor: Remove deprecated Service Token field
The deprecated Service Token field in the TelemetryService model and related components was removed. This improves code cleanliness and removes unnecessary dependencies.

Files modified:
- Dashboard/src/Pages/Telemetry/Services/View/Index.tsx
- Dashboard/src/Pages/Telemetry/Services/View/Settings.tsx
- Model/Models/TelemetryService.ts
2024-08-01 15:46:14 -06:00
Simon Larsen
5cf1a7f675 chore: Remove unused ResetObjectID component
The ResetObjectID component in the Settings page was removed as it is no longer needed. This improves code cleanliness and reduces unnecessary dependencies.

Files modified:
- Dashboard/src/Pages/Telemetry/Services/View/Settings.tsx
2024-08-01 15:41:55 -06:00
Simon Larsen
7339f4873b feat: Add lazy loading for images in SettingsRoutes
Update SettingsRoutes to include lazy loading for images in the telemetry ingestion key view. This improves page load performance by loading images only when they are in the viewport.

Files modified:
- Dashboard/src/Routes/SettingsRoutes.tsx
2024-08-01 15:38:31 -06:00
Simon Larsen
0872b1e8a2 feat: Add Telemetry Ingestion Keys page to Settings 2024-08-01 14:26:35 -06:00
Simon Larsen
8307f4deca feat: Add Telemetry Ingestion Keys page to Settings
This commit adds a new page, "Telemetry Ingestion Keys," to the Settings section of the dashboard. The page allows users to manage and view the telemetry ingestion keys used for data collection. It includes a list of keys and their associated details, such as name and creation date. This enhancement provides users with better control and visibility over their telemetry data.

Files modified:
- Dashboard/src/Utils/PageMap.ts
- Dashboard/src/Pages/Settings/SideMenu.tsx
- Dashboard/src/Routes/SettingsRoutes.tsx
2024-08-01 14:23:02 -06:00
Simon Larsen
0ac88b3679 refactor: Update Copilot module styling and content
This commit updates the styling and content of the Copilot module on the home page. The changes include adding a border-radius to the module, improving the visual appearance. Additionally, the text content of the module is modified to provide a clearer description of the services offered by OneUptime. These updates enhance the overall user experience and make the Copilot module more visually appealing.

Files modified:
- App/FeatureSet/Home/Views/Partials/copilot.ejs
2024-08-01 12:48:39 -06:00
Simon Larsen
2c5bbbb6da feat: Update OneUptime chart to use probes instead of probe for probe configuration
This commit modifies the OneUptime chart to use the `probes` parameter instead of the `probe` parameter for configuring probes. The `probes` parameter now accepts a key-value pair where the key represents the probe name and the value contains the probe configuration details. This change improves the clarity and consistency of the chart configuration, making it easier to manage and maintain.

Files modified:
- HelmChart/Public/oneuptime/README.md
2024-08-01 08:22:51 -06:00
Simon Larsen
88216cdebb Update OneUptime chart to include secure probe keys
This commit adds a new configurable parameter `probe.<key>.key` to the OneUptime chart. It is recommended to set this parameter to a long random string to secure the probes. This enhancement improves the security of the OneUptime application by ensuring that only authorized entities can access and use the probes.

Files modified:
- HelmChart/Public/oneuptime/README.md
2024-08-01 08:18:28 -06:00
Simon Larsen
a24822bd56 refactor: Include Reviews module on home page 2024-07-31 20:51:23 -06:00
Simon Larsen
8f4538a75c refactor: Include Copilot module in home page 2024-07-31 17:36:16 -06:00
Simon Larsen
14be322ef7 refactor: Update home page to include Reviews module 2024-07-31 17:28:18 -06:00
Simon Larsen
b50f05b290 Merge branch 'release' of github.com:OneUptime/oneuptime into release 2024-07-31 17:02:45 -06:00
Simon Larsen
e215b5b1ba Merge branch 'master' into release 2024-07-31 17:02:34 -06:00
Simon Larsen
c93f58227f refactor: Update home page to include Reviews module
This commit updates the home page to include the Reviews module. The Reviews module displays a list of reviews from customers, providing social proof and enhancing the user experience. The necessary changes are made to the index.ejs file and the include statements for the Reviews module. This improvement showcases positive feedback and builds trust with potential customers.

Files modified:
- App/FeatureSet/Home/Views/index.ejs
- App/FeatureSet/Home/Views/Partials/reviews.ejs
2024-07-31 17:02:09 -06:00
Simon Larsen
538e40c4ae refactor: Add Reviews module and update home page to display reviews
This commit adds a new Reviews module to the Home feature set. The Reviews module contains a list of reviews that will be displayed on the home page. The home page is updated to include the Reviews module and pass the reviews list to the view template. This enhancement improves the user experience by showcasing positive feedback from customers.

Files modified:
- App/FeatureSet/Home/Index.ts
- App/FeatureSet/Home/Views/Partials/proudly-open-source.ejs
- App/FeatureSet/Home/Views/Partials/review.ejs
- App/FeatureSet/Home/Utils/Reviews.ts
2024-07-31 16:49:48 -06:00
Simon Larsen
4a03abe3d5 refactor: Update about page content and add values section 2024-07-31 16:01:54 -06:00
Simon Larsen
c218a6f209 refactor: Update about page content and add values section 2024-07-31 15:37:45 -06:00
Simon Larsen
a8f04a8204 refactor: Update about page content and add values section
This commit updates the content of the about page to better reflect the goals and vision of the project. It also adds a new section called "Our values" that highlights the principles that the company cares deeply about. This change improves the clarity and messaging of the about page, providing a better understanding of the project's purpose and values.

Files modified:
- App/FeatureSet/Home/Views/about.ejs
2024-07-30 16:52:24 -06:00
Simon Larsen
642b1616ca refactor: Rename telemetry tables and update related code 2024-07-30 15:07:53 -06:00
Simon Larsen
9afbac2cbc refactor: Rename telemetry tables and update related code
This commit renames the telemetry tables in the AnalyticsModels directory to have a "Telemetry" suffix (e.g., Log -> LogTelemetry, Metric -> MetricTelemetry, Span -> SpanTelemetry). It also updates the related code in the TelemetryAttribute, StatementGenerator, and DataMigrations files to reflect the table name changes. This change improves the clarity and consistency of the telemetry-related code.

Files modified:
- Model/AnalyticsModels/TelemetryAttribute.ts
- Model/AnalyticsModels/Log.ts
- Model/AnalyticsModels/Metric.ts
- Model/AnalyticsModels/Span.ts
- CommonServer/Tests/Services/AnalyticsDatabaseService.test.ts
- CommonServer/Tests/Utils/AnalyticsDatabase/StatementGenerator.test.ts
- App/FeatureSet/Workers/DataMigrations/Index.ts
- App/FeatureSet/Workers/DataMigrations/DeleteOldTelelmetryTable.ts
2024-07-30 14:35:30 -06:00
Simon Larsen
b6b49a1255 Merge pull request #1615 from OneUptime/master
feat: Add support for displaying Open Source Friends
2024-07-30 12:10:45 -06:00
Simon Larsen
1cd89851bb feat: Add support for displaying Open Source Friends 2024-07-30 10:50:26 -06:00
Simon Larsen
229b5cd772 feat: Add ArrayUtil import to TelemetryAPI
This commit adds the import statement for the ArrayUtil module to the TelemetryAPI file. The ArrayUtil module is used to remove duplicate attributes fetched from the server. This import ensures that the ArrayUtil functions can be used in the TelemetryAPI module, improving the efficiency and accuracy of attribute handling in the telemetry system.
2024-07-30 09:39:19 -06:00
Simon Larsen
2b1ad303d9 feat: Update MetricsTable to fetch and display attributes
This commit updates the MetricsTable component to fetch and display attributes for each metric. It adds a new API request to retrieve the attributes from the server and updates the component's state to store the fetched attributes. The attributes are then passed to the AnalyticsModelTable component to be displayed in the "Attributes" column. This enhancement improves the visibility and analysis capabilities of the metrics data.

Files modified:
- Dashboard/src/Components/Metrics/MetricsTable.tsx
2024-07-29 17:12:39 -06:00
Simon Larsen
54b0f355dc feat: Update OTelIngest to index attributes for telemetry types
This commit updates the OTelIngest module to index attributes for different telemetry types (Trace, Metric, and Log). It adds the necessary code to extract attributes from spans, metrics, and logs, and sends them to the OTelIngestService.indexAttributes() function. This ensures that the attributes are properly indexed for each telemetry type, improving the search and analysis capabilities of the system.

Files modified:
- Ingestor/API/OTelIngest.ts
- Ingestor/Service/OTelIngest.ts
2024-07-29 16:53:23 -06:00
Simon Larsen
10ed38197e feat: Update TwoFactorAuth utility class to use otpauth library 2024-07-29 16:45:14 -06:00
Simon Larsen
cc4dab2dcf feat: Add email verification to two-factor authentication
This commit adds the user's email to the two-factor authentication process. When verifying the two-factor authentication code, the user's email is now passed as an additional parameter. This enhances the security of the authentication process by ensuring that the code is associated with the correct user. The email is retrieved from the user object and passed to the TwoFactorAuth.verifyToken() function.

Files modified:
- App/FeatureSet/Identity/API/Authentication.ts
- CommonServer/API/UserTwoFactorAuthAPI.ts
2024-07-29 15:27:54 -06:00
Simon Larsen
8852e2ab61 feat: Update TwoFactorAuth utility class to use otpauth library
This commit updates the TwoFactorAuth utility class to use the otpauth library instead of the speakeasy library for generating and verifying two-factor authentication tokens. The otpauth library provides a more modern and maintained solution for handling OTP generation and verification. This change improves the security and reliability of the two-factor authentication feature.

Files modified:
- CommonServer/Utils/TwoFactorAuth.ts
- CommonServer/package.json
2024-07-29 14:23:19 -06:00
Simon Larsen
50b6a746f4 feat: Add support for displaying Open Source Friends 2024-07-29 13:18:26 -06:00
Simon Larsen
df8d2f25ee feat: Enable two-factor authentication on login page 2024-07-28 19:37:33 -06:00
Simon Larsen
ee3de663b5 feat: Add two-factor authentication support to login page
This commit adds support for two-factor authentication on the login page. It includes the necessary code changes to display the two-factor authentication UI elements when the user has enabled it. The login form now includes a field for entering the two-factor authentication code. Additionally, the API endpoint for verifying the two-factor authentication code has been implemented. This feature enhances the security of the login process by adding an extra layer of authentication.

Files modified:
- Accounts/src/Pages/Login.tsx
- App/FeatureSet/Identity/API/Authentication.ts
- CommonServer/Utils/TwoFactorAuth.ts
2024-07-28 12:29:55 -06:00
Simon Larsen
a4d1ed7f01 feat: Add BadDataException for two-factor authentication
This commit adds the BadDataException class to handle errors related to two-factor authentication. It is imported and used in the UserService and UserTwoFactorAuthService files to throw an exception when necessary. This improves the error handling and provides more specific error messages for two-factor authentication related issues.

Files modified:
- CommonServer/Services/UserService.ts
- CommonServer/Services/UserTwoFactorAuthService.ts
2024-07-28 11:49:59 -06:00
Simon Larsen
05a26d0b3f feat: Add VERIFY_TWO_FACTOR_AUTH_API_URL constant
This commit adds the VERIFY_TWO_FACTOR_AUTH_API_URL constant to the ApiPaths module in order to provide a URL for verifying two-factor authentication. This constant is used in the Authentication module to make API requests for verifying the user's two-factor authentication. The constant is constructed using the IDENTITY_URL and a new route "/verify-two-factor-auth". This addition enables the implementation of the two-factor authentication verification feature.

Files modified:
- Accounts/src/Utils/ApiPaths.ts
2024-07-28 10:52:11 -06:00
Simon Larsen
0a5094db37 feat: Enable lazy loading of QR code generation in QR component 2024-07-28 09:52:38 -06:00
Simon Larsen
2f2c4891e3 feat: Enable lazy loading of QR code generation in QR component 2024-07-27 10:43:14 -06:00
Simon Larsen
83cb3b66e0 feat: Enable lazy loading of QR code generation in QR component
This commit updates the QR component to use React hooks and lazy load the QR code generation. By utilizing functional components and the useState and useEffect hooks, the QR code is now only generated when needed, improving performance by reducing unnecessary computations. The code changes also include error handling to display an error message if there is an issue generating the QR code.

Files modified:
- CommonUI/src/Components/QR/QR.tsx
2024-07-27 10:18:02 -06:00
Simon Larsen
63575f3065 Update QR component to use React hooks and lazy load QR code generation. This improves performance by only generating the QR code when needed, reducing unnecessary computations. The code changes include replacing class components with functional components and utilizing the useState and useEffect hooks. The QR code generation is now triggered when the props.text value changes. Additionally, error handling has been added to display an error message if there is an issue generating the QR code.
Files modified:
- CommonUI/src/Components/QR/QR.tsx
2024-07-27 09:25:01 -06:00
Simon Larsen
bf031f64fa feat: Add support for two-factor authentication in user profile
This commit adds support for two-factor authentication in the user profile. It includes the necessary code changes to enable the "Two Factor Auth Enabled" feature in the User model, as well as the addition of the "USER_TWO_FACTOR_AUTH" page in the PageMap and the corresponding route in the RouteMap. The UserTwoFactorAuth model, service, and controller have also been added to handle the logic and API endpoints related to two-factor authentication.

See the following files for more details:
- Common/Types/Icon/IconProp.ts
- Dashboard/src/Utils/PageMap.ts
- Dashboard/src/Utils/RouteMap.ts
- Model/Models/Index.ts
- Model/Models/User.ts
- CommonServer/Services/Index.ts
- CommonServer/package.json
- CommonUI/package.json
- CommonServer/Infrastructure/Postgres/SchemaMigrations/Index.ts
- Dashboard/src/App.tsx
2024-07-26 19:55:40 -06:00
Simon Larsen
04f1cfe414 chore: Remove unused ChartGroupInterval enum
The ChartGroupInterval enum was removed from the ChartGroup component in order to simplify the code and remove unnecessary complexity. This enum was not being used anywhere in the codebase.
2024-07-26 13:57:42 -06:00
Simon Larsen
f11863df0f chore: Add startsAt and endsAt fields to MonitorGroupService 2024-07-26 11:02:39 -06:00
Simon Larsen
599fc23c1a Merge branch 'master' of github.com:OneUptime/oneuptime 2024-07-26 10:48:47 -06:00
Simon Larsen
fa03d9296c increase mem on ingestor 2024-07-26 10:48:45 -06:00
Simon Larsen
df9bb5184f Merge pull request #1606 from OneUptime/snyk-upgrade-3639c2517f779bcc4d9569e58993034b
[Snyk] Upgrade reactflow from 11.11.3 to 11.11.4
2024-07-26 10:37:34 -06:00
Simon Larsen
ca7b06d4bc chore: Update StatusPageSubscriberReport template
The StatusPageSubscriberReport template has been updated to display a more detailed report instead of listing the monitored resources. This change improves the clarity and usefulness of the report.

See this file in the repository:
`App/FeatureSet/Notification/Templates/StatusPageSubscriberReport.hbs`
2024-07-26 10:36:11 -06:00
Simon Larsen
59d6ef240f chore: Add error handling for missing SMTP configuration
This commit adds error handling to the `getGlobalSMTPConfig` function in the `Config.ts` file. If any required SMTP configuration values are missing, a `BadDataException` is thrown with a message instructing the user to set the missing values in the Admin Dashboard.

See this file in the repository:
`App/FeatureSet/Notification/Config.ts`
2024-07-26 10:20:47 -06:00
Simon Larsen
5ae034ffdf chore: Add iputils-ping package to Dockerfile
The Dockerfile has been modified to include the installation of the `iputils-ping` package. This change ensures that the `ping` command is available within the Docker container.

See this file in the repository:
`Probe/Dockerfile.tpl`
2024-07-26 10:03:26 -06:00
Simon Larsen
be75960aff Merge pull request #1603 from OneUptime/snyk-upgrade-c18c73e17c875fc14eb8aef47fdb9cd3
[Snyk] Upgrade react-router-dom from 6.23.1 to 6.24.1
2024-07-26 08:37:36 -06:00
Simon Larsen
708f104dfc Merge pull request #1604 from OneUptime/snyk-upgrade-a8c089139458fb3596d95f5fecc84367
[Snyk] Upgrade react-spinners from 0.13.8 to 0.14.1
2024-07-26 08:37:30 -06:00
Simon Larsen
23c34cc71a Merge pull request #1605 from OneUptime/snyk-upgrade-4502b9e038edcb78602d9e97157e6fb9
[Snyk] Upgrade @opentelemetry/instrumentation-fetch from 0.52.0 to 0.52.1
2024-07-26 08:37:22 -06:00
Simon Larsen
3bf76168f1 Merge pull request #1607 from OneUptime/snyk-upgrade-5a4c450f5a959cd973684a5461ecf859
[Snyk] Upgrade playwright from 1.44.1 to 1.45.1
2024-07-26 08:36:36 -06:00
snyk-bot
3499850c6d fix: upgrade playwright from 1.44.1 to 1.45.1
Snyk has created this PR to upgrade playwright from 1.44.1 to 1.45.1.

See this package in npm:
playwright

See this project in Snyk:
https://app.snyk.io/org/oneuptime-RsC2nshvQ2Vnr35jHvMnMP/project/49c81d9c-12c2-4e8e-b9e8-72f98b1b595c?utm_source=github&utm_medium=referral&page=upgrade-pr
2024-07-26 06:41:49 +00:00
snyk-bot
273a153311 fix: upgrade reactflow from 11.11.3 to 11.11.4
Snyk has created this PR to upgrade reactflow from 11.11.3 to 11.11.4.

See this package in npm:
reactflow

See this project in Snyk:
https://app.snyk.io/org/oneuptime-RsC2nshvQ2Vnr35jHvMnMP/project/47001ef1-7b3a-49c2-88cd-8025c56346d0?utm_source=github&utm_medium=referral&page=upgrade-pr
2024-07-26 06:30:58 +00:00
snyk-bot
b248dc324d fix: upgrade @opentelemetry/instrumentation-fetch from 0.52.0 to 0.52.1
Snyk has created this PR to upgrade @opentelemetry/instrumentation-fetch from 0.52.0 to 0.52.1.

See this package in npm:
@opentelemetry/instrumentation-fetch

See this project in Snyk:
https://app.snyk.io/org/oneuptime-RsC2nshvQ2Vnr35jHvMnMP/project/47001ef1-7b3a-49c2-88cd-8025c56346d0?utm_source=github&utm_medium=referral&page=upgrade-pr
2024-07-26 06:30:54 +00:00
snyk-bot
7d7b4110a7 fix: upgrade react-spinners from 0.13.8 to 0.14.1
Snyk has created this PR to upgrade react-spinners from 0.13.8 to 0.14.1.

See this package in npm:
react-spinners

See this project in Snyk:
https://app.snyk.io/org/oneuptime-RsC2nshvQ2Vnr35jHvMnMP/project/47001ef1-7b3a-49c2-88cd-8025c56346d0?utm_source=github&utm_medium=referral&page=upgrade-pr
2024-07-26 06:30:49 +00:00
snyk-bot
262436f906 fix: upgrade react-router-dom from 6.23.1 to 6.24.1
Snyk has created this PR to upgrade react-router-dom from 6.23.1 to 6.24.1.

See this package in npm:
react-router-dom

See this project in Snyk:
https://app.snyk.io/org/oneuptime-RsC2nshvQ2Vnr35jHvMnMP/project/47001ef1-7b3a-49c2-88cd-8025c56346d0?utm_source=github&utm_medium=referral&page=upgrade-pr
2024-07-26 06:30:46 +00:00
Simon Larsen
2c7b845cb6 refactor: Initialize countPositive with a default value of 0 in AnalyticsDatabaseService
This commit modifies the AnalyticsDatabaseService by initializing the countPositive variable with a default value of 0 when the strResult is null or undefined. This change ensures that countPositive is always assigned a value, even when there is no valid strResult.

The modification improves the reliability of the countPositive variable and prevents potential errors when using it in subsequent calculations.

Co-authored-by: [Author Name]
2024-07-25 17:57:33 -06:00
Simon Larsen
3c9284915a Merge branch 'release' of github.com:OneUptime/oneuptime into release 2024-07-25 17:25:48 -06:00
Simon Larsen
ba97a1e14b refactor: Update npm dependency to latest stable version 2024-07-25 17:25:16 -06:00
Simon Larsen
e552a8130f Merge pull request #1602 from OneUptime/master
Release
2024-07-25 16:21:30 -06:00
Simon Larsen
1ed2548be2 refactor: Improve handling of status page resources in subscriber report
This commit refactors the code related to the status page subscriber report. The changes include updating the email template and resource handling in the `StatusPageSubscriberReport.hbs` file. The resource table is now rendered based on whether there are any resources to display. If there are no resources, a message indicating the absence of resources is shown.

Additionally, the `SendReportsToSubscribers.ts` file in the `Workers/Jobs/StatusPage` directory has been modified to handle the case where there are no status page resources. If there are no resources, the email report is not sent, and an error is logged.

These changes improve the handling of resources in the status page subscriber report and ensure that the email report is only sent when there are resources to include.
2024-07-25 15:30:10 -06:00
Simon Larsen
5c697105f3 refactor: Update email template and resource handling in StatusPageSubscriberReport
The code changes in the `StatusPageSubscriberReport.hbs` template file update the rendering of the resource table based on whether there are any resources to display. If there are resources, the table is rendered with the resource details. If there are no resources, a message is displayed indicating that no resources have been added yet.

In addition, the `SendReportsToSubscribers.ts` file in the `Workers/Jobs/StatusPage` directory has been modified to handle the case where there are no status page resources. If there are no resources, the email report is not sent and an error is logged.

These changes improve the handling of resources in the status page subscriber report and ensure that the email report is only sent when there are resources to include.
2024-07-25 15:23:56 -06:00
Simon Larsen
b2bdd5d1af refactor: Update import paths for UptimeEvent and CommonMonitorEvent 2024-07-25 15:00:10 -06:00
Simon Larsen
72e0f200f7 refactor: Update Monitor model and EmailTemplateType enum 2024-07-25 14:46:15 -06:00
Simon Larsen
3f0d75d799 refactor: Update Monitor model and EmailTemplateType enum
- Add 'canReadOnRelationQuery' property to the 'Monitor' model in order to allow reading on relation queries.
- Rename 'StatusPageReport' email template to 'StatusPageSubscriberReport' in the 'EmailTemplateType' enum.
2024-07-25 14:39:53 -06:00
Simon Larsen
519f2ef312 chore: Update dependencies in CommonProject package.json 2024-07-25 10:53:24 -06:00
Simon Larsen
cfbe92e40a refactor: Update MailService to handle JSON objects in vars parameter 2024-07-25 07:56:20 -06:00
Simon Larsen
8ef66650fb chore: Update package.json dependencies for CommonProject 2024-07-25 07:42:45 -06:00
Simon Larsen
07973e85a3 chore: Update package.json dependencies for CommonProject 2024-07-24 19:10:40 -06:00
Simon Larsen
34ca901007 refactor: Update import paths for UptimeEvent and CommonMonitorEvent 2024-07-24 19:09:39 -06:00
Simon Larsen
09883b1129 chore: Update Dockerfile templates to include CommonProject dependencies 2024-07-24 19:04:25 -06:00
Simon Larsen
b94b775e46 Merge remote-tracking branch 'origin/snyk-upgrade-aba1a472386457b0d6d03fface45e612' 2024-07-24 17:36:02 -06:00
Simon Larsen
1c3b7d9982 update otel api 2024-07-24 17:34:53 -06:00
Simon Larsen
ff062cb6a2 Merge branch 'master' of github.com:OneUptime/oneuptime 2024-07-24 17:33:26 -06:00
Simon Larsen
2cabc922a0 Merge pull request #1581 from OneUptime/snyk-upgrade-0283fc9cc9679e8dddceee913aa83b7d
[Snyk] Upgrade protobufjs from 7.3.0 to 7.3.2
2024-07-24 17:30:24 -06:00
Simon Larsen
b6aaea8ae4 Merge pull request #1576 from OneUptime/oneuptime-app-oneuptime-app-improve-comments-KWwHc
[OneUptime Copilot] Improve Comments on /App/FeatureSet/Docs/Index.ts
2024-07-24 17:27:41 -06:00
Simon Larsen
886aa086ec Merge pull request #1584 from OneUptime/snyk-upgrade-fa996be2aefbed98f1693310998c2799
[Snyk] Upgrade @opentelemetry/instrumentation-xml-http-request from 0.52.0 to 0.52.1
2024-07-24 17:27:12 -06:00
Simon Larsen
6c44201e1c Merge pull request #1583 from OneUptime/snyk-upgrade-b91af40dda1ae21dd8df7c2e11b2673d
[Snyk] Upgrade posthog-js from 1.139.3 to 1.139.6
2024-07-24 17:26:25 -06:00
Simon Larsen
3a72c5d04f Merge pull request #1585 from OneUptime/oneuptime-copilot-oneuptime-copilot-improve-comments-xTNiR
[OneUptime Copilot] Improve Comments on /App/Index.ts
2024-07-24 17:26:16 -06:00
Simon Larsen
ea162322d2 Merge pull request #1587 from OneUptime/oneuptime-copilot-oneuptime-copilot-improve-comments-CXUJA
[OneUptime Copilot] Improve Comments on /App/FeatureSet/ApiReference/Index.ts
2024-07-24 17:25:53 -06:00
Simon Larsen
222c857354 Merge pull request #1588 from OneUptime/oneuptime-copilot-oneuptime-copilot-improve-comments-fjDHl
[OneUptime Copilot] Improve Comments on /App/FeatureSet/ApiReference/Service/Authentication.ts
2024-07-24 17:25:30 -06:00
Simon Larsen
d2d705783e Merge pull request #1589 from OneUptime/oneuptime-copilot-oneuptime-copilot-improve-comments-ZbMDm
[OneUptime Copilot] Improve Comments on /App/FeatureSet/ApiReference/Service/Errors.ts
2024-07-24 17:25:13 -06:00
Simon Larsen
75a7308647 Merge pull request #1595 from OneUptime/snyk-fix-cd71497a021e2dc5ca5ae7a982b1e2b4
[Snyk] Security upgrade node from 22.3.0 to 22.5
2024-07-24 17:24:47 -06:00
Simon Larsen
d61ade1eb4 Merge branch 'master' into snyk-fix-cd71497a021e2dc5ca5ae7a982b1e2b4 2024-07-24 17:24:25 -06:00
Simon Larsen
55e1f6b504 Merge pull request #1597 from OneUptime/snyk-fix-93589e9f7114ade2a7233d978fd63baa
[Snyk] Security upgrade node from 22.3.0 to 22.4.1
2024-07-24 17:23:58 -06:00
Simon Larsen
8b95f2887c Merge branch 'master' into snyk-fix-93589e9f7114ade2a7233d978fd63baa 2024-07-24 17:23:49 -06:00
Simon Larsen
2bd1693d1f Merge pull request #1598 from OneUptime/snyk-fix-75abf0e36ba39e30ccfc89f6bf348215
[Snyk] Security upgrade node from 22.3.0 to 22.5.0
2024-07-24 17:23:26 -06:00
Simon Larsen
b1eaded3fd refactor: Update StatusPageSubscriberReport template to display downtime in hours and minutes
This commit updates the StatusPageSubscriberReport template to display the downtime in hours and minutes instead of seconds. The fields "totalDowntime" and "averageUptime" are replaced with "totalDowntimeInHoursAndMinutes" and "averageUptimePercent" respectively. This change improves the readability and usability of the report for users.
2024-07-24 16:29:46 -06:00
Simon Larsen
7e486d34ae ```text
refactor: Update UptimeUtil and MonitorEvent imports

This commit updates the imports in the UptimeUtil and MonitorEvent files to use double quotes instead of single quotes. This change ensures consistency in the codebase and follows the established import style.
2024-07-24 16:18:22 -06:00
Simon Larsen
c930caa2bb refactor: Add support for reportDataInDays and isReportEnabled in StatusPageSubscriberService 2024-07-24 13:23:38 -06:00
Simon Larsen
e654b65e71 refactor: Add support for reportDataInDays and isReportEnabled in StatusPageSubscriberService 2024-07-24 12:53:18 -06:00
Simon Larsen
a145b346a4 refactor: Add support for reportDataInDays in StatusPage model
This commit adds the `reportDataInDays` property to the `StatusPage` model in the `StatusPage.ts` file. The `reportDataInDays` property allows users to specify the number of days of data to include in the report. This change enhances the reporting functionality of the application by providing more flexibility in generating reports for status pages.
2024-07-23 19:43:10 -06:00
Simon Larsen
f090654ab6 refactor: Add support for StatusPage reports 2024-07-23 17:56:45 -06:00
Simon Larsen
c2e14c378b refactor: Update StatusPageService to calculate and set the next report date
This commit modifies the StatusPageService in the StatusPageService.ts file. It adds logic to calculate and set the next report date based on the report start date and recurring interval. This change enhances the functionality of the StatusPage report feature by ensuring that the next report is scheduled correctly.
2024-07-23 13:29:02 -06:00
Simon Larsen
77996b2066 refactor: Add support for StatusPage reports
This commit adds support for generating and managing reports for the StatusPage feature. It includes database changes, such as adding new columns to the "StatusPage" table, and updates to various components and routes. The new functionality allows users to configure and schedule reports, enhancing the reporting capabilities of the application.
2024-07-23 13:06:12 -06:00
Simon Larsen
5fce72fe59 refactor: Add migration for StatusPage report functionality
This commit adds a migration file (1721754545771-MigrationName.ts) to implement the necessary database changes for the StatusPage report functionality. It adds new columns to the "StatusPage" table, including "isReportEnabled" (boolean), "reportStartDateTime" (timestamp with time zone), "reportRecurringInterval" (JSON), and "sendNextReportBy" (timestamp with time zone). These columns enable the configuration and scheduling of reports for the StatusPage feature. This change enhances the functionality and flexibility of the application when generating and managing reports for status pages.
2024-07-23 11:15:57 -06:00
Simon Larsen
9f8764d741 refactor: Add canReadOnRelationQuery property to TelemetryService's serviceColor
This commit adds the `canReadOnRelationQuery` property to the `serviceColor` field in the `TelemetryService` model. The `canReadOnRelationQuery` property allows for reading the `serviceColor` field when querying related data. This change enhances the functionality and flexibility of the `TelemetryService` model when working with related data.
2024-07-23 09:50:15 -06:00
Simon Larsen
9ce44cc416 refactor: Update BlogTitleAndDescription styling for better readability
This commit updates the styling of the BlogTitleAndDescription component in the BlogTitleAndDescription.ejs file. The font size, font weight, and line height of the title and description elements are adjusted to improve readability and visual hierarchy. This change enhances the overall user experience when viewing blog titles and descriptions on the home page.
2024-07-22 20:09:27 -06:00
snyk-bot
738fb77773 fix: Probe/Dockerfile.tpl to reduce vulnerabilities
The following vulnerabilities are fixed with an upgrade:
- https://snyk.io/vuln/SNYK-DEBIAN12-GIT-6846203
- https://snyk.io/vuln/SNYK-DEBIAN12-GIT-6846203
- https://snyk.io/vuln/SNYK-DEBIAN12-ZLIB-6008963
- https://snyk.io/vuln/SNYK-DEBIAN12-ZLIB-6008963
- https://snyk.io/vuln/SNYK-DEBIAN12-KRB5-7411314
2024-07-21 06:22:59 +00:00
snyk-bot
a464723729 fix: Probe/Dockerfile.tpl to reduce vulnerabilities
The following vulnerabilities are fixed with an upgrade:
- https://snyk.io/vuln/SNYK-DEBIAN12-GIT-6846203
- https://snyk.io/vuln/SNYK-DEBIAN12-GIT-6846203
- https://snyk.io/vuln/SNYK-DEBIAN12-ZLIB-6008963
- https://snyk.io/vuln/SNYK-DEBIAN12-ZLIB-6008963
- https://snyk.io/vuln/SNYK-DEBIAN12-KRB5-7411314
2024-07-20 06:22:55 +00:00
snyk-bot
8f86a4651e fix: Probe/Dockerfile.tpl to reduce vulnerabilities
The following vulnerabilities are fixed with an upgrade:
- https://snyk.io/vuln/SNYK-DEBIAN12-GIT-6846203
- https://snyk.io/vuln/SNYK-DEBIAN12-GIT-6846203
- https://snyk.io/vuln/SNYK-DEBIAN12-ZLIB-6008963
- https://snyk.io/vuln/SNYK-DEBIAN12-ZLIB-6008963
- https://snyk.io/vuln/SNYK-DEBIAN12-KRB5-7411315
2024-07-19 07:47:19 +00:00
OneUptime Copilot
84740444ec OneUptime Copilot: Improve Comments on /App/FeatureSet/ApiReference/Service/Errors.ts 2024-07-15 14:31:34 +00:00
OneUptime Copilot
3881ad163c OneUptime Copilot: Improve Comments on /App/FeatureSet/ApiReference/Service/Authentication.ts 2024-07-15 14:27:15 +00:00
OneUptime Copilot
f7f43ed16c OneUptime Copilot: Improve Comments on /App/FeatureSet/ApiReference/Index.ts 2024-07-15 14:26:24 +00:00
OneUptime Copilot
7e05939977 OneUptime Copilot: Improve Comments on /App/Index.ts 2024-07-14 21:37:48 +00:00
snyk-bot
e5c608e20b fix: upgrade @opentelemetry/instrumentation-xml-http-request from 0.52.0 to 0.52.1
Snyk has created this PR to upgrade @opentelemetry/instrumentation-xml-http-request from 0.52.0 to 0.52.1.

See this package in npm:
@opentelemetry/instrumentation-xml-http-request

See this project in Snyk:
https://app.snyk.io/org/oneuptime-RsC2nshvQ2Vnr35jHvMnMP/project/47001ef1-7b3a-49c2-88cd-8025c56346d0?utm_source=github&utm_medium=referral&page=upgrade-pr
2024-07-12 04:41:38 +00:00
snyk-bot
8a41d48941 fix: upgrade posthog-js from 1.139.3 to 1.139.6
Snyk has created this PR to upgrade posthog-js from 1.139.3 to 1.139.6.

See this package in npm:
posthog-js

See this project in Snyk:
https://app.snyk.io/org/oneuptime-RsC2nshvQ2Vnr35jHvMnMP/project/f6446ec8-d441-487e-b58f-38373430e213?utm_source=github&utm_medium=referral&page=upgrade-pr
2024-07-12 04:37:12 +00:00
snyk-bot
6286c203fe fix: upgrade protobufjs from 7.3.0 to 7.3.2
Snyk has created this PR to upgrade protobufjs from 7.3.0 to 7.3.2.

See this package in npm:
protobufjs

See this project in Snyk:
https://app.snyk.io/org/oneuptime-RsC2nshvQ2Vnr35jHvMnMP/project/89d21457-97ad-4d10-9b37-253f0b4cc388?utm_source=github&utm_medium=referral&page=upgrade-pr
2024-07-11 06:53:35 +00:00
snyk-bot
5271bcd49f fix: upgrade @types/lodash from 4.17.4 to 4.17.5
Snyk has created this PR to upgrade @types/lodash from 4.17.4 to 4.17.5.

See this package in npm:
@types/lodash

See this project in Snyk:
https://app.snyk.io/org/oneuptime-RsC2nshvQ2Vnr35jHvMnMP/project/c3622982-05c8-495c-809c-20f301c75f92?utm_source=github&utm_medium=referral&page=upgrade-pr
2024-07-11 06:34:52 +00:00
simlarsen
75ad6697cd OneUptime Copilot: Improve Comments on /App/FeatureSet/Docs/Index.ts 2024-07-10 21:00:05 +00:00
snyk-bot
45d327e55d fix: upgrade @opentelemetry/instrumentation-fetch from 0.51.1 to 0.52.0
Snyk has created this PR to upgrade @opentelemetry/instrumentation-fetch from 0.51.1 to 0.52.0.

See this package in npm:
@opentelemetry/instrumentation-fetch

See this project in Snyk:
https://app.snyk.io/org/oneuptime-RsC2nshvQ2Vnr35jHvMnMP/project/47001ef1-7b3a-49c2-88cd-8025c56346d0?utm_source=github&utm_medium=referral&page=upgrade-pr
2024-07-10 06:06:13 +00:00
1900 changed files with 39609 additions and 100095 deletions

View File

@@ -20,9 +20,6 @@ jobs:
with:
node-version: 18.3.0
- run: cd Common && npm install
- run: cd Model && npm install
- run: cd CommonServer && npm install
- run: cd CommonUI && npm install --force
- run: cd Accounts && npm install && npm run compile && npm run dep-check
compile-isolated-vm:
@@ -35,35 +32,8 @@ jobs:
with:
node-version: 18.3.0
- run: cd Common && npm install
- run: cd CommonServer && npm install
- run: cd IsolatedVM && npm install && npm run compile && npm run dep-check
compile-common-server:
runs-on: ubuntu-latest
env:
CI_PIPELINE_ID: ${{github.run_number}}
steps:
- uses: actions/checkout@v2
- uses: actions/setup-node@v2
with:
node-version: 18.3.0
- run: cd Common && npm install
- run: cd Model && npm install
- run: cd CommonServer && npm install && npm run compile && npm run dep-check
compile-common-ui:
runs-on: ubuntu-latest
env:
CI_PIPELINE_ID: ${{github.run_number}}
steps:
- uses: actions/checkout@v2
- uses: actions/setup-node@v2
with:
node-version: 18.3.0
- run: cd Common && npm install
- run: cd Model && npm install
- run: cd CommonUI && npm install --force && npm run compile && npm run dep-check
compile-common:
runs-on: ubuntu-latest
env:
@@ -73,8 +43,7 @@ jobs:
- uses: actions/setup-node@v2
with:
node-version: 18.3.0
- run: cd Common && npm install
- run: cd Model && npm install && npm run compile && npm run dep-check
- run: cd Common && npm install && npm run compile && npm run dep-check
compile-app:
runs-on: ubuntu-latest
@@ -86,9 +55,7 @@ jobs:
with:
node-version: 18.3.0
- run: cd Common && npm install
- run: cd Model && npm install
- run: cd CommonServer && npm install
- run: cd CommonUI && npm install --force
- run: cd App && npm install && npm run compile && npm run dep-check
compile-copilot:
@@ -101,8 +68,6 @@ jobs:
with:
node-version: 18.3.0
- run: cd Common && npm install
- run: cd Model && npm install
- run: cd CommonServer && npm install
- run: cd Copilot && npm install && npm run compile && npm run dep-check
compile-nginx:
@@ -115,9 +80,7 @@ jobs:
with:
node-version: 18.3.0
- run: cd Common && npm install
- run: cd Model && npm install
- run: cd CommonServer && npm install
- run: cd CommonUI && npm install --force
- run: cd Nginx && npm install && npm run compile && npm run dep-check
compile-infrastructure-agent:
@@ -141,9 +104,7 @@ jobs:
with:
node-version: 18.3.0
- run: cd Common && npm install
- run: cd Model && npm install
- run: cd CommonServer && npm install
- run: cd CommonUI && npm install --force
- run: cd AdminDashboard && npm install && npm run compile && npm run dep-check
compile-dashboard:
@@ -156,25 +117,10 @@ jobs:
with:
node-version: 18.3.0
- run: cd Common && npm install
- run: cd Model && npm install
- run: cd CommonServer && npm install
- run: cd CommonUI && npm install --force
- run: cd Dashboard && npm install && npm run compile && npm run dep-check
compile-model:
runs-on: ubuntu-latest
env:
CI_PIPELINE_ID: ${{github.run_number}}
steps:
- uses: actions/checkout@v2
- uses: actions/setup-node@v2
with:
node-version: 18.3.0
- run: cd Common && npm install
- run: cd Model && npm install
- run: cd Model && npm install && npm run compile && npm run dep-check
compile-e2e:
runs-on: ubuntu-latest
env:
@@ -197,8 +143,6 @@ jobs:
with:
node-version: 18.3.0
- run: cd Common && npm install
- run: cd Model && npm install
- run: cd CommonServer && npm install
- run: cd Probe && npm install && npm run compile && npm run dep-check
compile-ingestor:
@@ -211,8 +155,6 @@ jobs:
with:
node-version: 18.3.0
- run: cd Common && npm install
- run: cd Model && npm install
- run: cd CommonServer && npm install
- run: cd Ingestor && npm install && npm run compile && npm run dep-check
@@ -226,9 +168,7 @@ jobs:
with:
node-version: 18.3.0
- run: cd Common && npm install
- run: cd Model && npm install
- run: cd CommonServer && npm install
- run: cd CommonUI && npm install --force
- run: cd StatusPage && npm install && npm run compile && npm run dep-check
compile-test-server:
@@ -241,6 +181,4 @@ jobs:
with:
node-version: 18.3.0
- run: cd Common && npm install
- run: cd Model && npm install
- run: cd CommonServer && npm install
- run: cd TestServer && npm install && npm run compile && npm run dep-check

View File

@@ -1133,7 +1133,7 @@ jobs:
test-e2e-release-self-hosted:
runs-on: ubuntu-latest
# After all the jobs runs
needs: [copilot-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, 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: [copilot-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, 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:

View File

@@ -20,7 +20,7 @@ jobs:
steps:
# Run Reliability Copilot in Doker Container
# Run Reliability Copilot in Docker Container
- name: Run Copilot
run: |
docker run --rm \

View File

@@ -1067,7 +1067,7 @@ jobs:
- 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)
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
@@ -1120,7 +1120,7 @@ jobs:
- 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)
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

View File

@@ -1,24 +0,0 @@
name: Common Server 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@v2
- uses: actions/setup-node@v2
with:
node-version: 18.3.0
- run: cd Common && npm install
- run: cd Model && npm install
- run: cd CommonServer && npm install
- run: cd CommonServer && bash test-setup.sh
- run: export $(grep -v '^#' config.env | xargs) && cd CommonServer && rm -rf build && npm run test

View File

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

View File

@@ -1,23 +0,0 @@
name: CommonUI 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@v2
- uses: actions/setup-node@v2
with:
node-version: 18.3.0
- run: cd Common && npm install
- run: cd Model && npm install
- run: cd CommonUI && npm install --force && npm run test

View File

@@ -1,23 +0,0 @@
name: Model 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@v2
- uses: actions/setup-node@v2
with:
node-version: 18.3.0
- run: cd Common && npm install
- run: cd Model && npm install
- run: cd Model && npm install && npm run test

View File

@@ -18,7 +18,6 @@ jobs:
with:
node-version: 18.3.0
- run: cd Common && npm install
- run: cd CommonServer && npm install
- run: cd Probe && npm install
- run: cd Probe && npm run test

View File

@@ -51,6 +51,3 @@ licenses/*
certifications/*
ApiReference/public/assets/*
JavaScriptSDK/src/cli/server-monitor/out/scripts/prettify/*
CommonServer/Tests/TestingUtils/__mocks__/Stripe.mock.ts

4
.vscode/launch.json vendored
View File

@@ -218,12 +218,12 @@
"autoAttachChildProcesses": true
},
{
"name": "CommonServer: Debug Tests",
"name": "Common: Debug Tests",
"type": "node",
"restart": true,
"autoAttachChildProcesses": true,
"request": "launch",
"cwd": "${workspaceRoot}/CommonServer",
"cwd": "${workspaceRoot}/Common",
"runtimeExecutable": "npm",
"runtimeArgs": [
"run-script",

View File

@@ -36,33 +36,17 @@ COPY ./Common /usr/src/Common
WORKDIR /usr/src/Model
COPY ./Model/package*.json /usr/src/Model/
# Set version in ./Model/package.json to the APP_VERSION
RUN sed -i "s/\"version\": \".*\"/\"version\": \"$APP_VERSION\"/g" /usr/src/Model/package.json
RUN npm install
COPY ./Model /usr/src/Model
WORKDIR /usr/src/CommonServer
COPY ./CommonServer/package*.json /usr/src/CommonServer/
# Set version in ./CommonServer/package.json to the APP_VERSION
RUN sed -i "s/\"version\": \".*\"/\"version\": \"$APP_VERSION\"/g" /usr/src/CommonServer/package.json
RUN npm install
COPY ./CommonServer /usr/src/CommonServer
# Install CommonUI
WORKDIR /usr/src/CommonUI
COPY ./CommonUI/package*.json /usr/src/CommonUI/
# Set version in ./CommonUI/package.json to the APP_VERSION
RUN sed -i "s/\"version\": \".*\"/\"version\": \"$APP_VERSION\"/g" /usr/src/CommonUI/package.json
RUN npm install --force
COPY ./CommonUI /usr/src/CommonUI

View File

@@ -1,7 +1,7 @@
import { PromiseVoidFunction } from "Common/Types/FunctionTypes";
import Express, { ExpressApplication } from "CommonServer/Utils/Express";
import logger from "CommonServer/Utils/Logger";
import App from "CommonServer/Utils/StartServer";
import Express, { ExpressApplication } from "Common/Server/Utils/Express";
import logger from "Common/Server/Utils/Logger";
import App from "Common/Server/Utils/StartServer";
export const APP_NAME: string = "accounts";

View File

@@ -9,13 +9,11 @@
"version": "0.1.0",
"dependencies": {
"Common": "file:../Common",
"CommonServer": "file:../CommonServer",
"CommonUI": "file:../CommonUI",
"css-loader": "^6.11.0",
"dotenv": "^16.4.5",
"express": "^4.19.2",
"file-loader": "^6.2.0",
"Model": "file:../Model",
"react": "^18.3.1",
"react-dom": "^18.3.1",
"react-router-dom": "^6.23.1",
@@ -39,25 +37,81 @@
"version": "1.0.0",
"license": "Apache-2.0",
"dependencies": {
"@babel/runtime": "^7.24.6",
"@monaco-editor/react": "^4.4.6",
"@nivo/core": "^0.87.0",
"@nivo/line": "^0.87.0",
"@opentelemetry/api": "^1.9.0",
"@opentelemetry/context-zone": "^1.25.0",
"@opentelemetry/exporter-trace-otlp-http": "^0.52.0",
"@opentelemetry/instrumentation": "^0.52.0",
"@opentelemetry/instrumentation-fetch": "^0.52.1",
"@opentelemetry/instrumentation-xml-http-request": "^0.52.1",
"@opentelemetry/resources": "^1.25.0",
"@opentelemetry/sdk-trace-web": "^1.23.0",
"@opentelemetry/semantic-conventions": "^1.25.0",
"@tippyjs/react": "^4.2.6",
"@types/crypto-js": "^4.2.2",
"@types/qrcode": "^1.5.5",
"@types/react-highlight": "^0.12.8",
"@types/react-syntax-highlighter": "^15.5.13",
"@types/uuid": "^8.3.4",
"axios": "^1.6.8",
"axios": "^1.7.2",
"Common": "file:../Common",
"crypto-js": "^4.1.1",
"formik": "^2.4.6",
"history": "^5.3.0",
"json5": "^2.2.3",
"jwt-decode": "^4.0.0",
"lodash": "^4.17.21",
"moment": "^2.30.1",
"moment-timezone": "^0.5.45",
"posthog-js": "^1.116.6",
"posthog-js": "^1.139.6",
"prop-types": "^15.8.1",
"qrcode": "^1.5.3",
"react": "^18.3.1",
"react-beautiful-dnd": "^13.1.1",
"react-big-calendar": "^1.13.0",
"react-color": "^2.19.3",
"react-dom": "^18.3.1",
"react-dropzone": "^14.2.2",
"react-error-boundary": "^4.0.13",
"react-highlight": "^0.15.0",
"react-markdown": "^8.0.3",
"react-router-dom": "^6.24.1",
"react-select": "^5.4.0",
"react-spinners": "^0.14.1",
"react-syntax-highlighter": "^15.5.0",
"react-toggle": "^4.1.3",
"reactflow": "^11.11.4",
"reflect-metadata": "^0.2.2",
"remark-gfm": "^3.0.1",
"slugify": "^1.6.5",
"socket.io-client": "^4.7.5",
"tippy.js": "^6.3.7",
"typeorm": "^0.3.20",
"universal-cookie": "^4.0.4",
"use-async-effect": "^2.2.6",
"uuid": "^8.3.2"
},
"devDependencies": {
"@faker-js/faker": "^8.0.2",
"@types/jest": "^27.5.2",
"@types/node": "^17.0.22",
"jest": "^27.5.1",
"ts-jest": "^27.1.4"
"@testing-library/jest-dom": "^5.16.5",
"@testing-library/react": "^13.3.0",
"@testing-library/user-event": "^14.4.3",
"@types/jest": "^28.1.4",
"@types/lodash": "^4.14.202",
"@types/node": "^17.0.45",
"@types/react": "^18.2.38",
"@types/react-beautiful-dnd": "^13.1.2",
"@types/react-big-calendar": "^1.8.5",
"@types/react-color": "^3.0.6",
"@types/react-test-renderer": "^18.0.0",
"@types/react-toggle": "^4.0.3",
"jest": "^28.1.1",
"jest-environment-jsdom": "^29.7.0",
"react-test-renderer": "^18.2.0",
"ts-jest": "^28.0.5"
}
},
"../CommonServer": {
@@ -78,6 +132,7 @@
"@opentelemetry/sdk-metrics": "^1.21.0",
"@opentelemetry/sdk-node": "^0.48.0",
"@opentelemetry/sdk-trace-node": "^1.21.0",
"@types/crypto-js": "^4.2.2",
"acme-client": "^5.3.0",
"airtable": "^0.12.2",
"bullmq": "^5.3.3",
@@ -85,17 +140,19 @@
"cookie-parser": "^1.4.6",
"cors": "^2.8.5",
"cron-parser": "^4.8.1",
"crypto-js": "^4.2.0",
"dotenv": "^16.4.4",
"ejs": "^3.1.10",
"express": "^4.19.2",
"ioredis": "^5.3.2",
"json2csv": "^5.0.7",
"jsonwebtoken": "^9.0.0",
"markdown-it": "^13.0.1",
"Model": "file:../Model",
"marked": "^12.0.2",
"node-cron": "^3.0.3",
"nodemailer": "^6.9.10",
"otpauth": "^9.3.1",
"pg": "^8.7.3",
"redis-semaphore": "^5.5.1",
"socket.io": "^4.7.4",
"stripe": "^10.17.0",
"twilio": "^4.22.0",
@@ -111,7 +168,6 @@
"@types/jest": "^27.4.1",
"@types/json2csv": "^5.0.3",
"@types/jsonwebtoken": "^8.5.9",
"@types/markdown-it": "^12.2.3",
"@types/node": "^17.0.22",
"@types/node-cron": "^3.0.7",
"@types/nodemailer": "^6.4.7",
@@ -123,44 +179,49 @@
"../CommonUI": {
"name": "@oneuptime/common-ui",
"version": "1.0.0",
"extraneous": true,
"license": "Apache-2.0",
"dependencies": {
"@babel/runtime": "^7.24.1",
"@babel/runtime": "^7.24.6",
"@monaco-editor/react": "^4.4.6",
"@nivo/core": "^0.85.1",
"@nivo/line": "^0.85.1",
"@opentelemetry/api": "^1.8.0",
"@opentelemetry/context-zone": "^1.22.0",
"@opentelemetry/exporter-trace-otlp-http": "^0.49.1",
"@opentelemetry/instrumentation": "^0.49.1",
"@opentelemetry/instrumentation-fetch": "^0.49.1",
"@opentelemetry/instrumentation-xml-http-request": "^0.49.1",
"@opentelemetry/resources": "^1.21.0",
"@opentelemetry/sdk-trace-web": "^1.21.0",
"@opentelemetry/semantic-conventions": "^1.21.0",
"@nivo/core": "^0.87.0",
"@nivo/line": "^0.87.0",
"@opentelemetry/api": "^1.9.0",
"@opentelemetry/context-zone": "^1.25.0",
"@opentelemetry/exporter-trace-otlp-http": "^0.52.0",
"@opentelemetry/instrumentation": "^0.52.0",
"@opentelemetry/instrumentation-fetch": "^0.52.0",
"@opentelemetry/instrumentation-xml-http-request": "^0.52.1",
"@opentelemetry/resources": "^1.25.0",
"@opentelemetry/sdk-trace-web": "^1.23.0",
"@opentelemetry/semantic-conventions": "^1.25.0",
"@tippyjs/react": "^4.2.6",
"@types/react-highlight": "^0.12.8",
"@types/react-syntax-highlighter": "^15.5.13",
"Common": "file:../Common",
"formik": "^2.2.9",
"CommonProject": "file:../CommonProject",
"formik": "^2.4.6",
"history": "^5.3.0",
"jwt-decode": "^4.0.0",
"lodash": "^4.17.21",
"Model": "file:../Model",
"moment-timezone": "^0.5.45",
"prop-types": "^15.8.1",
"react": "^18.2.0",
"react": "^18.3.1",
"react-beautiful-dnd": "^13.1.1",
"react-big-calendar": "^1.11.2",
"react-big-calendar": "^1.13.0",
"react-color": "^2.19.3",
"react-dom": "^18.1.0",
"react-dom": "^18.3.1",
"react-dropzone": "^14.2.2",
"react-error-boundary": "^4.0.13",
"react-highlight": "^0.15.0",
"react-markdown": "^8.0.3",
"react-router-dom": "^6.22.3",
"react-router-dom": "^6.23.1",
"react-select": "^5.4.0",
"react-spinners": "^0.13.6",
"react-syntax-highlighter": "^15.5.0",
"react-toggle": "^4.1.3",
"reactflow": "^11.10.4",
"reactflow": "^11.11.1",
"remark-gfm": "^3.0.1",
"socket.io-client": "^4.7.5",
"tippy.js": "^6.3.7",
@@ -190,6 +251,7 @@
"../Model": {
"name": "@oneuptime/model",
"version": "1.0.0",
"extraneous": true,
"license": "Apache-2.0",
"dependencies": {
"Common": "file:../Common",
@@ -898,10 +960,6 @@
"resolved": "../CommonServer",
"link": true
},
"node_modules/CommonUI": {
"resolved": "../CommonUI",
"link": true
},
"node_modules/concat-map": {
"version": "0.0.1",
"resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz",
@@ -1742,10 +1800,6 @@
"node": "*"
}
},
"node_modules/Model": {
"resolved": "../Model",
"link": true
},
"node_modules/ms": {
"version": "2.1.3",
"resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz",

View File

@@ -27,13 +27,10 @@
},
"dependencies": {
"Common": "file:../Common",
"CommonServer": "file:../CommonServer",
"CommonUI": "file:../CommonUI",
"css-loader": "^6.11.0",
"dotenv": "^16.4.5",
"express": "^4.19.2",
"file-loader": "^6.2.0",
"Model": "file:../Model",
"react": "^18.3.1",
"react-dom": "^18.3.1",
"react-router-dom": "^6.23.1",

View File

@@ -5,7 +5,7 @@ import NotFound from "./Pages/NotFound";
import RegisterPage from "./Pages/Register";
import ResetPasswordPage from "./Pages/ResetPassword";
import VerifyEmail from "./Pages/VerifyEmail";
import Navigation from "CommonUI/src/Utils/Navigation";
import Navigation from "Common/UI/Utils/Navigation";
import React, { ReactElement } from "react";
import {
Route,

View File

@@ -1,11 +1,11 @@
import App from "./App";
import Telemetry from "CommonUI/src/Utils/Telemetry";
import Telemetry from "Common/UI/Utils/Telemetry";
import React from "react";
import ReactDOM from "react-dom/client";
import { BrowserRouter } from "react-router-dom";
Telemetry.init({
serviceName: "Accounts",
serviceName: "accounts",
});
const root: any = ReactDOM.createRoot(

View File

@@ -1,11 +1,11 @@
import { FORGOT_PASSWORD_API_URL } from "../Utils/ApiPaths";
import Route from "Common/Types/API/Route";
import URL from "Common/Types/API/URL";
import ModelForm, { FormType } from "CommonUI/src/Components/Forms/ModelForm";
import FormFieldSchemaType from "CommonUI/src/Components/Forms/Types/FormFieldSchemaType";
import Link from "CommonUI/src/Components/Link/Link";
import OneUptimeLogo from "CommonUI/src/Images/logos/OneUptimeSVG/3-transparent.svg";
import User from "Model/Models/User";
import ModelForm, { FormType } from "Common/UI/Components/Forms/ModelForm";
import FormFieldSchemaType from "Common/UI/Components/Forms/Types/FormFieldSchemaType";
import Link from "Common/UI/Components/Link/Link";
import OneUptimeLogo from "Common/UI/Images/logos/OneUptimeSVG/3-transparent.svg";
import User from "Common/Models/DatabaseModels/User";
import React, { useState } from "react";
const ForgotPassword: () => JSX.Element = () => {

View File

@@ -1,19 +1,28 @@
import { LOGIN_API_URL } from "../Utils/ApiPaths";
import {
LOGIN_API_URL,
VERIFY_TWO_FACTOR_AUTH_API_URL,
} from "../Utils/ApiPaths";
import Route from "Common/Types/API/Route";
import URL from "Common/Types/API/URL";
import { JSONObject } from "Common/Types/JSON";
import ModelForm, { FormType } from "CommonUI/src/Components/Forms/ModelForm";
import FormFieldSchemaType from "CommonUI/src/Components/Forms/Types/FormFieldSchemaType";
import Link from "CommonUI/src/Components/Link/Link";
import { DASHBOARD_URL } from "CommonUI/src/Config";
import OneUptimeLogo from "CommonUI/src/Images/logos/OneUptimeSVG/3-transparent.svg";
import UiAnalytics from "CommonUI/src/Utils/Analytics";
import LoginUtil from "CommonUI/src/Utils/Login";
import Navigation from "CommonUI/src/Utils/Navigation";
import UserUtil from "CommonUI/src/Utils/User";
import User from "Model/Models/User";
import { JSONArray, JSONObject } from "Common/Types/JSON";
import ModelForm, { FormType } from "Common/UI/Components/Forms/ModelForm";
import FormFieldSchemaType from "Common/UI/Components/Forms/Types/FormFieldSchemaType";
import Link from "Common/UI/Components/Link/Link";
import { DASHBOARD_URL } from "Common/UI/Config";
import OneUptimeLogo from "Common/UI/Images/logos/OneUptimeSVG/3-transparent.svg";
import UiAnalytics from "Common/UI/Utils/Analytics";
import LoginUtil from "Common/UI/Utils/Login";
import UserTwoFactorAuth from "Common/Models/DatabaseModels/UserTwoFactorAuth";
import Navigation from "Common/UI/Utils/Navigation";
import UserUtil from "Common/UI/Utils/User";
import User from "Common/Models/DatabaseModels/User";
import React from "react";
import useAsyncEffect from "use-async-effect";
import StaticModelList from "Common/UI/Components/ModelList/StaticModelList";
import BasicForm from "Common/UI/Components/Forms/BasicForm";
import API from "Common/UI/Utils/API/API";
import HTTPErrorResponse from "Common/Types/API/HTTPErrorResponse";
import HTTPResponse from "Common/Types/API/HTTPResponse";
const LoginPage: () => JSX.Element = () => {
const apiUrl: URL = LOGIN_API_URL;
@@ -24,6 +33,22 @@ const LoginPage: () => JSX.Element = () => {
const [initialValues, setInitialValues] = React.useState<JSONObject>({});
const [showTwoFactorAuth, setShowTwoFactorAuth] =
React.useState<boolean>(false);
const [twoFactorAuthList, setTwoFactorAuthList] = React.useState<
UserTwoFactorAuth[]
>([]);
const [selectedTwoFactorAuth, setSelectedTwoFactorAuth] = React.useState<
UserTwoFactorAuth | undefined
>(undefined);
const [isTwoFactorAuthLoading, setIsTwoFactorAuthLoading] =
React.useState<boolean>(false);
const [twofactorAuthError, setTwoFactorAuthError] =
React.useState<string>("");
useAsyncEffect(async () => {
if (Navigation.getQueryStringByName("email")) {
setInitialValues({
@@ -32,6 +57,20 @@ const LoginPage: () => JSX.Element = () => {
}
}, []);
type LoginFunction = (user: User, miscData: JSONObject) => void;
const login: LoginFunction = (user: User, miscData: JSONObject): void => {
if (user instanceof User && user && user.email) {
UiAnalytics.userAuth(user.email);
UiAnalytics.capture("accounts/login");
}
LoginUtil.login({
user: user,
token: miscData ? miscData["token"] : undefined,
});
};
return (
<div className="flex min-h-full flex-col justify-center py-12 sm:px-6 lg:px-8">
<div className="">
@@ -40,89 +79,211 @@ const LoginPage: () => JSX.Element = () => {
src={OneUptimeLogo}
alt="OneUptime"
/>
<h2 className="mt-6 text-center text-2xl tracking-tight text-gray-900">
Sign in to your account
</h2>
<p className="mt-2 text-center text-sm text-gray-600">
Join thousands of business that use OneUptime to help them stay online
all the time.
</p>
{!showTwoFactorAuth && (
<>
<h2 className="mt-6 text-center text-2xl tracking-tight text-gray-900">
Sign in to your account
</h2>
<p className="mt-2 text-center text-sm text-gray-600">
Join thousands of business that use OneUptime to help them stay
online all the time.
</p>
</>
)}
{showTwoFactorAuth && (
<>
<h2 className="mt-6 text-center text-2xl tracking-tight text-gray-900">
Two Factor Authentication
</h2>
<p className="mt-2 text-center text-sm text-gray-600">
Select two factor authentication method. You will be asked to
enter a code from the selected method.
</p>
</>
)}
</div>
<div className="mt-8 sm:mx-auto sm:w-full sm:max-w-md">
<div className="bg-white py-8 px-4 shadow sm:rounded-lg sm:px-10">
<ModelForm<User>
modelType={User}
id="login-form"
name="Login"
fields={[
{
field: {
email: true,
{!showTwoFactorAuth && (
<ModelForm<User>
modelType={User}
id="login-form"
name="Login"
fields={[
{
field: {
email: true,
},
fieldType: FormFieldSchemaType.Email,
placeholder: "jeff@example.com",
required: true,
disabled: Boolean(initialValues && initialValues["email"]),
title: "Email",
dataTestId: "email",
},
fieldType: FormFieldSchemaType.Email,
placeholder: "jeff@example.com",
required: true,
disabled: Boolean(initialValues && initialValues["email"]),
title: "Email",
dataTestId: "email",
},
{
field: {
password: true,
{
field: {
password: true,
},
title: "Password",
required: true,
validation: {
minLength: 6,
},
fieldType: FormFieldSchemaType.Password,
sideLink: {
text: "Forgot password?",
url: new Route("/accounts/forgot-password"),
openLinkInNewTab: false,
},
dataTestId: "password",
},
title: "Password",
required: true,
validation: {
minLength: 6,
},
fieldType: FormFieldSchemaType.Password,
sideLink: {
text: "Forgot password?",
url: new Route("/accounts/forgot-password"),
openLinkInNewTab: false,
},
dataTestId: "password",
},
]}
createOrUpdateApiUrl={apiUrl}
formType={FormType.Create}
submitButtonText={"Login"}
onSuccess={(value: User, miscData: JSONObject | undefined) => {
if (value && value.email) {
UiAnalytics.userAuth(value.email);
UiAnalytics.capture("accounts/login");
}
]}
createOrUpdateApiUrl={apiUrl}
formType={FormType.Create}
submitButtonText={"Login"}
onBeforeCreate={(data: User) => {
setInitialValues(User.toJSON(data, User));
return Promise.resolve(data);
}}
onSuccess={(
value: User | JSONObject,
miscData: JSONObject | undefined,
) => {
if (
miscData &&
(miscData as JSONObject)["twoFactorAuth"] === true
) {
const twoFactorAuthList: Array<UserTwoFactorAuth> =
UserTwoFactorAuth.fromJSONArray(
(miscData as JSONObject)[
"twoFactorAuthList"
] as JSONArray,
UserTwoFactorAuth,
);
setTwoFactorAuthList(twoFactorAuthList);
setShowTwoFactorAuth(true);
return;
}
LoginUtil.login({
user: value,
token: miscData ? miscData["token"] : undefined,
});
}}
maxPrimaryButtonWidth={true}
footer={
<div className="actions text-center mt-4 hover:underline fw-semibold">
<div>
<Link to={new Route("/accounts/sso")}>
<div className="text-indigo-500 hover:text-indigo-900 cursor-pointer text-sm">
Use single sign-on (SSO) instead
</div>
</Link>
login(value as User, miscData as JSONObject);
}}
maxPrimaryButtonWidth={true}
footer={
<div className="actions text-center mt-4 hover:underline fw-semibold">
<div>
<Link to={new Route("/accounts/sso")}>
<div className="text-indigo-500 hover:text-indigo-900 cursor-pointer text-sm">
Use single sign-on (SSO) instead
</div>
</Link>
</div>
</div>
</div>
}
/>
}
/>
)}
{showTwoFactorAuth && !selectedTwoFactorAuth && (
<StaticModelList<UserTwoFactorAuth>
titleField="name"
descriptionField=""
selectedItems={[]}
list={twoFactorAuthList}
onClick={(item: UserTwoFactorAuth) => {
setSelectedTwoFactorAuth(item);
}}
/>
)}
{showTwoFactorAuth && selectedTwoFactorAuth && (
<BasicForm
id="two-factor-auth-form"
name="Two Factor Auth"
fields={[
{
field: {
code: true,
},
title: "Code",
description: "Enter the code from your authenticator app",
required: true,
dataTestId: "code",
fieldType: FormFieldSchemaType.Text,
},
]}
submitButtonText={"Login"}
maxPrimaryButtonWidth={true}
isLoading={isTwoFactorAuthLoading}
error={twofactorAuthError}
onSubmit={async (data: JSONObject) => {
setIsTwoFactorAuthLoading(true);
try {
const code: string = data["code"] as string;
const twoFactorAuthId: string =
selectedTwoFactorAuth.id?.toString() as string;
const result: HTTPErrorResponse | HTTPResponse<JSONObject> =
await API.post(VERIFY_TWO_FACTOR_AUTH_API_URL, {
data: {
...initialValues,
code: code,
twoFactorAuthId: twoFactorAuthId,
},
});
if (result instanceof HTTPErrorResponse) {
throw result;
}
const user: User = User.fromJSON(
result["data"] as JSONObject,
User,
) as User;
const miscData: JSONObject = (result["data"] as JSONObject)[
"miscData"
] as JSONObject;
login(user as User, miscData as JSONObject);
} catch (error) {
setTwoFactorAuthError(
API.getFriendlyErrorMessage(error as Error),
);
}
setIsTwoFactorAuthLoading(false);
}}
/>
)}
</div>
<div className="mt-10 text-center">
<div className="text-muted mb-0 text-gray-500">
Don&apos;t have an account?{" "}
<Link
to={new Route("/accounts/register")}
className="text-indigo-500 hover:text-indigo-900 cursor-pointer"
>
Register.
</Link>
</div>
{!selectedTwoFactorAuth && (
<div className="text-muted mb-0 text-gray-500">
Don&apos;t have an account?{" "}
<Link
to={new Route("/accounts/register")}
className="text-indigo-500 hover:text-indigo-900 cursor-pointer"
>
Register.
</Link>
</div>
)}
{selectedTwoFactorAuth ? (
<div className="text-muted mb-0 text-gray-500">
<Link
onClick={() => {
setSelectedTwoFactorAuth(undefined);
}}
className="text-indigo-500 hover:text-indigo-900 cursor-pointer"
>
Select a different two factor authentication method
</Link>
</div>
) : (
<></>
)}
</div>
</div>
</div>

View File

@@ -2,22 +2,22 @@ import { SERVICE_PROVIDER_LOGIN_URL } from "../Utils/ApiPaths";
import Route from "Common/Types/API/Route";
import URL from "Common/Types/API/URL";
import { JSONArray, JSONObject } from "Common/Types/JSON";
import FormFieldSchemaType from "CommonUI/src/Components/Forms/Types/FormFieldSchemaType";
import Link from "CommonUI/src/Components/Link/Link";
import { DASHBOARD_URL, IDENTITY_URL } from "CommonUI/src/Config";
import OneUptimeLogo from "CommonUI/src/Images/logos/OneUptimeSVG/3-transparent.svg";
import Navigation from "CommonUI/src/Utils/Navigation";
import UserUtil from "CommonUI/src/Utils/User";
import User from "Model/Models/User";
import FormFieldSchemaType from "Common/UI/Components/Forms/Types/FormFieldSchemaType";
import Link from "Common/UI/Components/Link/Link";
import { DASHBOARD_URL, IDENTITY_URL } from "Common/UI/Config";
import OneUptimeLogo from "Common/UI/Images/logos/OneUptimeSVG/3-transparent.svg";
import Navigation from "Common/UI/Utils/Navigation";
import UserUtil from "Common/UI/Utils/User";
import User from "Common/Models/DatabaseModels/User";
import React, { ReactElement, useState } from "react";
import ProjectSSO from "Model/Models/ProjectSso";
import PageLoader from "CommonUI/src/Components/Loader/PageLoader";
import API from "CommonUI/src/Utils/API/API";
import BasicForm from "CommonUI/src/Components/Forms/BasicForm";
import ProjectSSO from "Common/Models/DatabaseModels/ProjectSso";
import PageLoader from "Common/UI/Components/Loader/PageLoader";
import API from "Common/UI/Utils/API/API";
import BasicForm from "Common/UI/Components/Forms/BasicForm";
import Email from "Common/Types/Email";
import HTTPErrorResponse from "Common/Types/API/HTTPErrorResponse";
import HTTPResponse from "Common/Types/API/HTTPResponse";
import StaticModelList from "CommonUI/src/Components/ModelList/StaticModelList";
import StaticModelList from "Common/UI/Components/ModelList/StaticModelList";
const LoginPage: () => JSX.Element = () => {
const apiUrl: URL = SERVICE_PROVIDER_LOGIN_URL;

View File

@@ -3,23 +3,23 @@ import Route from "Common/Types/API/Route";
import URL from "Common/Types/API/URL";
import Dictionary from "Common/Types/Dictionary";
import { JSONObject } from "Common/Types/JSON";
import ErrorMessage from "CommonUI/src/Components/ErrorMessage/ErrorMessage";
import ModelForm, { FormType } from "CommonUI/src/Components/Forms/ModelForm";
import Fields from "CommonUI/src/Components/Forms/Types/Fields";
import FormFieldSchemaType from "CommonUI/src/Components/Forms/Types/FormFieldSchemaType";
import Link from "CommonUI/src/Components/Link/Link";
import PageLoader from "CommonUI/src/Components/Loader/PageLoader";
import { BILLING_ENABLED, DASHBOARD_URL } from "CommonUI/src/Config";
import OneUptimeLogo from "CommonUI/src/Images/logos/OneUptimeSVG/3-transparent.svg";
import BaseAPI from "CommonUI/src/Utils/API/API";
import UiAnalytics from "CommonUI/src/Utils/Analytics";
import LocalStorage from "CommonUI/src/Utils/LocalStorage";
import LoginUtil from "CommonUI/src/Utils/Login";
import ModelAPI, { ListResult } from "CommonUI/src/Utils/ModelAPI/ModelAPI";
import Navigation from "CommonUI/src/Utils/Navigation";
import UserUtil from "CommonUI/src/Utils/User";
import Reseller from "Model/Models/Reseller";
import User from "Model/Models/User";
import ErrorMessage from "Common/UI/Components/ErrorMessage/ErrorMessage";
import ModelForm, { FormType } from "Common/UI/Components/Forms/ModelForm";
import Fields from "Common/UI/Components/Forms/Types/Fields";
import FormFieldSchemaType from "Common/UI/Components/Forms/Types/FormFieldSchemaType";
import Link from "Common/UI/Components/Link/Link";
import PageLoader from "Common/UI/Components/Loader/PageLoader";
import { BILLING_ENABLED, DASHBOARD_URL } from "Common/UI/Config";
import OneUptimeLogo from "Common/UI/Images/logos/OneUptimeSVG/3-transparent.svg";
import BaseAPI from "Common/UI/Utils/API/API";
import UiAnalytics from "Common/UI/Utils/Analytics";
import LocalStorage from "Common/UI/Utils/LocalStorage";
import LoginUtil from "Common/UI/Utils/Login";
import ModelAPI, { ListResult } from "Common/UI/Utils/ModelAPI/ModelAPI";
import Navigation from "Common/UI/Utils/Navigation";
import UserUtil from "Common/UI/Utils/User";
import Reseller from "Common/Models/DatabaseModels/Reseller";
import User from "Common/Models/DatabaseModels/User";
import React, { useState } from "react";
import useAsyncEffect from "use-async-effect";

View File

@@ -1,12 +1,12 @@
import { RESET_PASSWORD_API_URL } from "../Utils/ApiPaths";
import Route from "Common/Types/API/Route";
import URL from "Common/Types/API/URL";
import ModelForm, { FormType } from "CommonUI/src/Components/Forms/ModelForm";
import FormFieldSchemaType from "CommonUI/src/Components/Forms/Types/FormFieldSchemaType";
import Link from "CommonUI/src/Components/Link/Link";
import OneUptimeLogo from "CommonUI/src/Images/logos/OneUptimeSVG/3-transparent.svg";
import Navigation from "CommonUI/src/Utils/Navigation";
import User from "Model/Models/User";
import ModelForm, { FormType } from "Common/UI/Components/Forms/ModelForm";
import FormFieldSchemaType from "Common/UI/Components/Forms/Types/FormFieldSchemaType";
import Link from "Common/UI/Components/Link/Link";
import OneUptimeLogo from "Common/UI/Images/logos/OneUptimeSVG/3-transparent.svg";
import Navigation from "Common/UI/Utils/Navigation";
import User from "Common/Models/DatabaseModels/User";
import React, { useState } from "react";
const RegisterPage: () => JSX.Element = () => {

View File

@@ -3,14 +3,14 @@ import Route from "Common/Types/API/Route";
import URL from "Common/Types/API/URL";
import { PromiseVoidFunction } from "Common/Types/FunctionTypes";
import ObjectID from "Common/Types/ObjectID";
import { FormType } from "CommonUI/src/Components/Forms/ModelForm";
import Link from "CommonUI/src/Components/Link/Link";
import PageLoader from "CommonUI/src/Components/Loader/PageLoader";
import OneUptimeLogo from "CommonUI/src/Images/logos/OneUptimeSVG/3-transparent.svg";
import API from "CommonUI/src/Utils/API/API";
import ModelAPI from "CommonUI/src/Utils/ModelAPI/ModelAPI";
import Navigation from "CommonUI/src/Utils/Navigation";
import EmailVerificationToken from "Model/Models/EmailVerificationToken";
import { FormType } from "Common/UI/Components/Forms/ModelForm";
import Link from "Common/UI/Components/Link/Link";
import PageLoader from "Common/UI/Components/Loader/PageLoader";
import OneUptimeLogo from "Common/UI/Images/logos/OneUptimeSVG/3-transparent.svg";
import API from "Common/UI/Utils/API/API";
import ModelAPI from "Common/UI/Utils/ModelAPI/ModelAPI";
import Navigation from "Common/UI/Utils/Navigation";
import EmailVerificationToken from "Common/Models/DatabaseModels/EmailVerificationToken";
import React, { useEffect, useState } from "react";
const VerifyEmail: () => JSX.Element = () => {

View File

@@ -1,6 +1,6 @@
import Route from "Common/Types/API/Route";
import URL from "Common/Types/API/URL";
import { IDENTITY_URL } from "CommonUI/src/Config";
import { IDENTITY_URL } from "Common/UI/Config";
export const SIGNUP_API_URL: URL = URL.fromURL(IDENTITY_URL).addRoute(
new Route("/signup"),
@@ -9,6 +9,10 @@ export const LOGIN_API_URL: URL = URL.fromURL(IDENTITY_URL).addRoute(
new Route("/login"),
);
export const VERIFY_TWO_FACTOR_AUTH_API_URL: URL = URL.fromURL(
IDENTITY_URL,
).addRoute(new Route("/verify-two-factor-auth"));
export const SERVICE_PROVIDER_LOGIN_URL: URL = URL.fromURL(
IDENTITY_URL,
).addRoute(new Route("/service-provider-login"));

View File

@@ -35,33 +35,17 @@ RUN npm install
COPY ./Common /usr/src/Common
WORKDIR /usr/src/Model
COPY ./Model/package*.json /usr/src/Model/
# Set version in ./Model/package.json to the APP_VERSION
RUN sed -i "s/\"version\": \".*\"/\"version\": \"$APP_VERSION\"/g" /usr/src/Model/package.json
RUN npm install
COPY ./Model /usr/src/Model
WORKDIR /usr/src/CommonServer
COPY ./CommonServer/package*.json /usr/src/CommonServer/
# Set version in ./CommonServer/package.json to the APP_VERSION
RUN sed -i "s/\"version\": \".*\"/\"version\": \"$APP_VERSION\"/g" /usr/src/CommonServer/package.json
RUN npm install
COPY ./CommonServer /usr/src/CommonServer
# Install CommonUI
WORKDIR /usr/src/CommonUI
COPY ./CommonUI/package*.json /usr/src/CommonUI/
# Set version in ./CommonUI/package.json to the APP_VERSION
RUN sed -i "s/\"version\": \".*\"/\"version\": \"$APP_VERSION\"/g" /usr/src/CommonUI/package.json
RUN npm install --force
COPY ./CommonUI /usr/src/CommonUI

View File

@@ -1,7 +1,7 @@
import { PromiseVoidFunction } from "Common/Types/FunctionTypes";
import Express, { ExpressApplication } from "CommonServer/Utils/Express";
import logger from "CommonServer/Utils/Logger";
import App from "CommonServer/Utils/StartServer";
import Express, { ExpressApplication } from "Common/Server/Utils/Express";
import logger from "Common/Server/Utils/Logger";
import App from "Common/Server/Utils/StartServer";
export const APP_NAME: string = "admin";

View File

@@ -9,11 +9,9 @@
"version": "0.1.0",
"dependencies": {
"Common": "file:../Common",
"CommonServer": "file:../CommonServer",
"CommonUI": "file:../CommonUI",
"dotenv": "^16.4.5",
"file-loader": "^6.2.0",
"Model": "file:../Model",
"react": "^18.3.1",
"react-dom": "^18.3.1",
"react-router-dom": "^6.23.1",
@@ -39,25 +37,81 @@
"version": "1.0.0",
"license": "Apache-2.0",
"dependencies": {
"@babel/runtime": "^7.24.6",
"@monaco-editor/react": "^4.4.6",
"@nivo/core": "^0.87.0",
"@nivo/line": "^0.87.0",
"@opentelemetry/api": "^1.9.0",
"@opentelemetry/context-zone": "^1.25.0",
"@opentelemetry/exporter-trace-otlp-http": "^0.52.0",
"@opentelemetry/instrumentation": "^0.52.0",
"@opentelemetry/instrumentation-fetch": "^0.52.1",
"@opentelemetry/instrumentation-xml-http-request": "^0.52.1",
"@opentelemetry/resources": "^1.25.0",
"@opentelemetry/sdk-trace-web": "^1.23.0",
"@opentelemetry/semantic-conventions": "^1.25.0",
"@tippyjs/react": "^4.2.6",
"@types/crypto-js": "^4.2.2",
"@types/qrcode": "^1.5.5",
"@types/react-highlight": "^0.12.8",
"@types/react-syntax-highlighter": "^15.5.13",
"@types/uuid": "^8.3.4",
"axios": "^1.6.8",
"axios": "^1.7.2",
"Common": "file:../Common",
"crypto-js": "^4.1.1",
"formik": "^2.4.6",
"history": "^5.3.0",
"json5": "^2.2.3",
"jwt-decode": "^4.0.0",
"lodash": "^4.17.21",
"moment": "^2.30.1",
"moment-timezone": "^0.5.45",
"posthog-js": "^1.130.1",
"posthog-js": "^1.139.6",
"prop-types": "^15.8.1",
"qrcode": "^1.5.3",
"react": "^18.3.1",
"react-beautiful-dnd": "^13.1.1",
"react-big-calendar": "^1.13.0",
"react-color": "^2.19.3",
"react-dom": "^18.3.1",
"react-dropzone": "^14.2.2",
"react-error-boundary": "^4.0.13",
"react-highlight": "^0.15.0",
"react-markdown": "^8.0.3",
"react-router-dom": "^6.24.1",
"react-select": "^5.4.0",
"react-spinners": "^0.14.1",
"react-syntax-highlighter": "^15.5.0",
"react-toggle": "^4.1.3",
"reactflow": "^11.11.4",
"reflect-metadata": "^0.2.2",
"remark-gfm": "^3.0.1",
"slugify": "^1.6.5",
"socket.io-client": "^4.7.5",
"tippy.js": "^6.3.7",
"typeorm": "^0.3.20",
"universal-cookie": "^4.0.4",
"use-async-effect": "^2.2.6",
"uuid": "^8.3.2"
},
"devDependencies": {
"@faker-js/faker": "^8.0.2",
"@types/jest": "^27.5.2",
"@types/node": "^17.0.22",
"jest": "^27.5.1",
"ts-jest": "^27.1.4"
"@testing-library/jest-dom": "^5.16.5",
"@testing-library/react": "^13.3.0",
"@testing-library/user-event": "^14.4.3",
"@types/jest": "^28.1.4",
"@types/lodash": "^4.14.202",
"@types/node": "^17.0.45",
"@types/react": "^18.2.38",
"@types/react-beautiful-dnd": "^13.1.2",
"@types/react-big-calendar": "^1.8.5",
"@types/react-color": "^3.0.6",
"@types/react-test-renderer": "^18.0.0",
"@types/react-toggle": "^4.0.3",
"jest": "^28.1.1",
"jest-environment-jsdom": "^29.7.0",
"react-test-renderer": "^18.2.0",
"ts-jest": "^28.0.5"
}
},
"../CommonServer": {
@@ -78,6 +132,7 @@
"@opentelemetry/sdk-metrics": "^1.21.0",
"@opentelemetry/sdk-node": "^0.48.0",
"@opentelemetry/sdk-trace-node": "^1.21.0",
"@types/crypto-js": "^4.2.2",
"acme-client": "^5.3.0",
"airtable": "^0.12.2",
"bullmq": "^5.3.3",
@@ -85,6 +140,7 @@
"cookie-parser": "^1.4.6",
"cors": "^2.8.5",
"cron-parser": "^4.8.1",
"crypto-js": "^4.2.0",
"dotenv": "^16.4.4",
"ejs": "^3.1.10",
"express": "^4.19.2",
@@ -92,9 +148,9 @@
"json2csv": "^5.0.7",
"jsonwebtoken": "^9.0.0",
"marked": "^12.0.2",
"Model": "file:../Model",
"node-cron": "^3.0.3",
"nodemailer": "^6.9.10",
"otpauth": "^9.3.1",
"pg": "^8.7.3",
"redis-semaphore": "^5.5.1",
"socket.io": "^4.7.4",
@@ -123,42 +179,47 @@
"../CommonUI": {
"name": "@oneuptime/common-ui",
"version": "1.0.0",
"extraneous": true,
"license": "Apache-2.0",
"dependencies": {
"@babel/runtime": "^7.24.1",
"@babel/runtime": "^7.24.6",
"@monaco-editor/react": "^4.4.6",
"@nivo/core": "^0.86.0",
"@nivo/line": "^0.86.0",
"@opentelemetry/api": "^1.8.0",
"@opentelemetry/context-zone": "^1.23.0",
"@opentelemetry/exporter-trace-otlp-http": "^0.51.0",
"@opentelemetry/instrumentation": "^0.51.0",
"@opentelemetry/instrumentation-fetch": "^0.51.0",
"@opentelemetry/instrumentation-xml-http-request": "^0.51.0",
"@opentelemetry/resources": "^1.23.0",
"@nivo/core": "^0.87.0",
"@nivo/line": "^0.87.0",
"@opentelemetry/api": "^1.9.0",
"@opentelemetry/context-zone": "^1.25.0",
"@opentelemetry/exporter-trace-otlp-http": "^0.52.0",
"@opentelemetry/instrumentation": "^0.52.0",
"@opentelemetry/instrumentation-fetch": "^0.52.0",
"@opentelemetry/instrumentation-xml-http-request": "^0.52.1",
"@opentelemetry/resources": "^1.25.0",
"@opentelemetry/sdk-trace-web": "^1.23.0",
"@opentelemetry/semantic-conventions": "^1.23.0",
"@opentelemetry/semantic-conventions": "^1.25.0",
"@tippyjs/react": "^4.2.6",
"@types/react-highlight": "^0.12.8",
"@types/react-syntax-highlighter": "^15.5.13",
"Common": "file:../Common",
"CommonProject": "file:../CommonProject",
"formik": "^2.4.6",
"history": "^5.3.0",
"jwt-decode": "^4.0.0",
"lodash": "^4.17.21",
"Model": "file:../Model",
"moment-timezone": "^0.5.45",
"prop-types": "^15.8.1",
"react": "^18.3.1",
"react-beautiful-dnd": "^13.1.1",
"react-big-calendar": "^1.11.2",
"react-big-calendar": "^1.13.0",
"react-color": "^2.19.3",
"react-dom": "^18.3.1",
"react-dropzone": "^14.2.2",
"react-error-boundary": "^4.0.13",
"react-highlight": "^0.15.0",
"react-markdown": "^8.0.3",
"react-router-dom": "^6.22.3",
"react-router-dom": "^6.23.1",
"react-select": "^5.4.0",
"react-spinners": "^0.13.6",
"react-syntax-highlighter": "^15.5.0",
"react-toggle": "^4.1.3",
"reactflow": "^11.11.1",
"remark-gfm": "^3.0.1",
@@ -190,6 +251,7 @@
"../Model": {
"name": "@oneuptime/model",
"version": "1.0.0",
"extraneous": true,
"license": "Apache-2.0",
"dependencies": {
"Common": "file:../Common",
@@ -6874,10 +6936,6 @@
"resolved": "../CommonServer",
"link": true
},
"node_modules/CommonUI": {
"resolved": "../CommonUI",
"link": true
},
"node_modules/compressible": {
"version": "2.0.18",
"resolved": "https://registry.npmjs.org/compressible/-/compressible-2.0.18.tgz",
@@ -14250,10 +14308,6 @@
"mkdirp": "bin/cmd.js"
}
},
"node_modules/Model": {
"resolved": "../Model",
"link": true
},
"node_modules/ms": {
"version": "2.1.3",
"resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz",

View File

@@ -4,11 +4,9 @@
"private": false,
"dependencies": {
"Common": "file:../Common",
"CommonServer": "file:../CommonServer",
"CommonUI": "file:../CommonUI",
"dotenv": "^16.4.5",
"file-loader": "^6.2.0",
"Model": "file:../Model",
"react": "^18.3.1",
"react-dom": "^18.3.1",
"react-router-dom": "^6.23.1",

View File

@@ -12,9 +12,9 @@ import Users from "./Pages/Users/Index";
import PageMap from "./Utils/PageMap";
import RouteMap from "./Utils/RouteMap";
import URL from "Common/Types/API/URL";
import { ACCOUNTS_URL, DASHBOARD_URL } from "CommonUI/src/Config";
import Navigation from "CommonUI/src/Utils/Navigation";
import User from "CommonUI/src/Utils/User";
import { ACCOUNTS_URL, DASHBOARD_URL } from "Common/UI/Config";
import Navigation from "Common/UI/Utils/Navigation";
import User from "Common/UI/Utils/User";
import React from "react";
import {
Route as PageRoute,
@@ -23,6 +23,10 @@ import {
useNavigate,
useParams,
} from "react-router-dom";
import UserView from "./Pages/Users/View/Index";
import UserDelete from "./Pages/Users/View/Delete";
import ProjectView from "./Pages/Projects/View/Index";
import ProjectDelete from "./Pages/Projects/View/Delete";
const App: () => JSX.Element = () => {
Navigation.setNavigateHook(useNavigate());
@@ -61,6 +65,26 @@ const App: () => JSX.Element = () => {
element={<Users />}
/>
<PageRoute
path={RouteMap[PageMap.USER_VIEW]?.toString() || ""}
element={<UserView />}
/>
<PageRoute
path={RouteMap[PageMap.USER_DELETE]?.toString() || ""}
element={<UserDelete />}
/>
<PageRoute
path={RouteMap[PageMap.PROJECT_VIEW]?.toString() || ""}
element={<ProjectView />}
/>
<PageRoute
path={RouteMap[PageMap.PROJECT_DELETE]?.toString() || ""}
element={<ProjectDelete />}
/>
<PageRoute
path={RouteMap[PageMap.LOGOUT]?.toString() || ""}
element={<Logout />}

View File

@@ -5,9 +5,9 @@ import BadDataException from "Common/Types/Exception/BadDataException";
import { PromiseVoidFunction } from "Common/Types/FunctionTypes";
import { JSONObject } from "Common/Types/JSON";
import API from "Common/Utils/API";
import Footer from "CommonUI/src/Components/Footer/Footer";
import ConfirmModal from "CommonUI/src/Components/Modal/ConfirmModal";
import { HOST, HTTP_PROTOCOL } from "CommonUI/src/Config";
import Footer from "Common/UI/Components/Footer/Footer";
import ConfirmModal from "Common/UI/Components/Modal/ConfirmModal";
import { HOST, HTTP_PROTOCOL } from "Common/UI/Config";
import React from "react";
const DashboardFooter: () => JSX.Element = () => {

View File

@@ -1,10 +1,10 @@
import Help from "./Help";
import Logo from "./Logo";
import UserProfile from "./UserProfile";
import Button, { ButtonStyleType } from "CommonUI/src/Components/Button/Button";
import Header from "CommonUI/src/Components/Header/Header";
import { DASHBOARD_URL } from "CommonUI/src/Config";
import Navigation from "CommonUI/src/Utils/Navigation";
import Button, { ButtonStyleType } from "Common/UI/Components/Button/Button";
import Header from "Common/UI/Components/Header/Header";
import { DASHBOARD_URL } from "Common/UI/Config";
import Navigation from "Common/UI/Utils/Navigation";
import React, { FunctionComponent, ReactElement } from "react";
const DashboardHeader: FunctionComponent = (): ReactElement => {

View File

@@ -1,9 +1,9 @@
import URL from "Common/Types/API/URL";
import IconProp from "Common/Types/Icon/IconProp";
import HeaderIconDropdownButton from "CommonUI/src/Components/Header/HeaderIconDropdownButton";
import IconDropdownItem from "CommonUI/src/Components/Header/IconDropdown/IconDropdownItem";
import IconDropdownMenu from "CommonUI/src/Components/Header/IconDropdown/IconDropdownMenu";
import IconDropdownRow from "CommonUI/src/Components/Header/IconDropdown/IconDropdownRow";
import HeaderIconDropdownButton from "Common/UI/Components/Header/HeaderIconDropdownButton";
import IconDropdownItem from "Common/UI/Components/Header/IconDropdown/IconDropdownItem";
import IconDropdownMenu from "Common/UI/Components/Header/IconDropdown/IconDropdownMenu";
import IconDropdownRow from "Common/UI/Components/Header/IconDropdown/IconDropdownRow";
import React, { ReactElement, useState } from "react";
const Help: () => JSX.Element = (): ReactElement => {

View File

@@ -1,7 +1,7 @@
// Tailwind
import Route from "Common/Types/API/Route";
import Image from "CommonUI/src/Components/Image/Image";
import OneUptimeLogo from "CommonUI/src/Images/logos/OneUptimeSVG/3-transparent.svg";
import Image from "Common/UI/Components/Image/Image";
import OneUptimeLogo from "Common/UI/Images/logos/OneUptimeSVG/3-transparent.svg";
import React, { FunctionComponent, ReactElement } from "react";
export interface ComponentProps {

View File

@@ -1,7 +1,7 @@
import IconProp from "Common/Types/Icon/IconProp";
import HeaderIconDropdownButton from "CommonUI/src/Components/Header/HeaderIconDropdownButton";
import NotificationItem from "CommonUI/src/Components/Header/Notifications/NotificationItem";
import Notifications from "CommonUI/src/Components/Header/Notifications/Notifications";
import HeaderIconDropdownButton from "Common/UI/Components/Header/HeaderIconDropdownButton";
import NotificationItem from "Common/UI/Components/Header/Notifications/NotificationItem";
import Notifications from "Common/UI/Components/Header/Notifications/Notifications";
import React, { ReactElement, useState } from "react";
const DashboardHeader: () => JSX.Element = (): ReactElement => {

View File

@@ -1,16 +1,16 @@
import SubscriptionPlan from "Common/Types/Billing/SubscriptionPlan";
import IconProp from "Common/Types/Icon/IconProp";
import { FormType } from "CommonUI/src/Components/Forms/ModelForm";
import Field from "CommonUI/src/Components/Forms/Types/Field";
import FormFieldSchemaType from "CommonUI/src/Components/Forms/Types/FormFieldSchemaType";
import ProjectPicker from "CommonUI/src/Components/Header/ProjectPicker/ProjectPicker";
import ModelFormModal from "CommonUI/src/Components/ModelFormModal/ModelFormModal";
import { RadioButton } from "CommonUI/src/Components/RadioButtons/GroupRadioButtons";
import Toggle from "CommonUI/src/Components/Toggle/Toggle";
import { BILLING_ENABLED, getAllEnvVars } from "CommonUI/src/Config";
import { GetReactElementFunction } from "CommonUI/src/Types/FunctionTypes";
import ProjectUtil from "CommonUI/src/Utils/Project";
import Project from "Model/Models/Project";
import { FormType } from "Common/UI/Components/Forms/ModelForm";
import Field from "Common/UI/Components/Forms/Types/Field";
import FormFieldSchemaType from "Common/UI/Components/Forms/Types/FormFieldSchemaType";
import ProjectPicker from "Common/UI/Components/Header/ProjectPicker/ProjectPicker";
import ModelFormModal from "Common/UI/Components/ModelFormModal/ModelFormModal";
import { RadioButton } from "Common/UI/Components/RadioButtons/GroupRadioButtons";
import Toggle from "Common/UI/Components/Toggle/Toggle";
import { BILLING_ENABLED, getAllEnvVars } from "Common/UI/Config";
import { GetReactElementFunction } from "Common/UI/Types/FunctionTypes";
import ProjectUtil from "Common/UI/Utils/Project";
import Project from "Common/Models/DatabaseModels/Project";
import React, {
FunctionComponent,
ReactElement,

View File

@@ -1,5 +1,5 @@
import SearchBox from "CommonUI/src/Components/Header/SearchBox";
import Project from "Model/Models/Project";
import SearchBox from "Common/UI/Components/Header/SearchBox";
import Project from "Common/Models/DatabaseModels/Project";
import React, { FunctionComponent, ReactElement } from "react";
export interface ComponentProps {

View File

@@ -2,13 +2,13 @@ import PageMap from "../../Utils/PageMap";
import RouteMap, { RouteUtil } from "../../Utils/RouteMap";
import Route from "Common/Types/API/Route";
import IconProp from "Common/Types/Icon/IconProp";
import HeaderIconDropdownButton from "CommonUI/src/Components/Header/HeaderIconDropdownButton";
import IconDropdownItem from "CommonUI/src/Components/Header/IconDropdown/IconDropdownItem";
import IconDropdownMenu from "CommonUI/src/Components/Header/IconDropdown/IconDropdownMenu";
import { DASHBOARD_URL } from "CommonUI/src/Config";
import BlankProfilePic from "CommonUI/src/Images/users/blank-profile.svg";
import Navigation from "CommonUI/src/Utils/Navigation";
import User from "CommonUI/src/Utils/User";
import HeaderIconDropdownButton from "Common/UI/Components/Header/HeaderIconDropdownButton";
import IconDropdownItem from "Common/UI/Components/Header/IconDropdown/IconDropdownItem";
import IconDropdownMenu from "Common/UI/Components/Header/IconDropdown/IconDropdownMenu";
import { DASHBOARD_URL } from "Common/UI/Config";
import BlankProfilePic from "Common/UI/Images/users/blank-profile.svg";
import Navigation from "Common/UI/Utils/Navigation";
import User from "Common/UI/Utils/User";
import React, { FunctionComponent, ReactElement, useState } from "react";
const DashboardUserProfile: FunctionComponent = (): ReactElement => {

View File

@@ -1,8 +1,8 @@
import Footer from "../Footer/Footer";
import Header from "../Header/Header";
import NavBar from "../NavBar/NavBar";
import MasterPage from "CommonUI/src/Components/MasterPage/MasterPage";
import TopAlert from "CommonUI/src/Components/TopAlert/TopAlert";
import MasterPage from "Common/UI/Components/MasterPage/MasterPage";
import TopAlert from "Common/UI/Components/TopAlert/TopAlert";
import React, { FunctionComponent, ReactElement } from "react";
export interface ComponentProps {

View File

@@ -2,8 +2,8 @@ import PageMap from "../../Utils/PageMap";
import RouteMap, { RouteUtil } from "../../Utils/RouteMap";
import Route from "Common/Types/API/Route";
import IconProp from "Common/Types/Icon/IconProp";
import NavBar from "CommonUI/src/Components/Navbar/NavBar";
import NavBarItem from "CommonUI/src/Components/Navbar/NavBarItem";
import NavBar from "Common/UI/Components/Navbar/NavBar";
import NavBarItem from "Common/UI/Components/Navbar/NavBarItem";
import React, { FunctionComponent, ReactElement } from "react";
const DashboardNavbar: FunctionComponent = (): ReactElement => {

View File

@@ -1,11 +1,11 @@
import App from "./App";
import Telemetry from "CommonUI/src/Utils/Telemetry";
import Telemetry from "Common/UI/Utils/Telemetry";
import React from "react";
import ReactDOM from "react-dom/client";
import { BrowserRouter } from "react-router-dom";
Telemetry.init({
serviceName: "AdminDashboard",
serviceName: "admin-dashboard",
});
const root: any = ReactDOM.createRoot(

View File

@@ -1,8 +1,8 @@
import PageMap from "../../Utils/PageMap";
import RouteMap from "../../Utils/RouteMap";
import PageLoader from "CommonUI/src/Components/Loader/PageLoader";
import Page from "CommonUI/src/Components/Page/Page";
import Navigation from "CommonUI/src/Utils/Navigation";
import PageLoader from "Common/UI/Components/Loader/PageLoader";
import Page from "Common/UI/Components/Page/Page";
import Navigation from "Common/UI/Utils/Navigation";
import React, { FunctionComponent, ReactElement, useEffect } from "react";
const Init: FunctionComponent = (): ReactElement => {

View File

@@ -2,13 +2,13 @@ import PageMap from "../../Utils/PageMap";
import RouteMap, { RouteUtil } from "../../Utils/RouteMap";
import Route from "Common/Types/API/Route";
import { PromiseVoidFunction } from "Common/Types/FunctionTypes";
import ErrorMessage from "CommonUI/src/Components/ErrorMessage/ErrorMessage";
import PageLoader from "CommonUI/src/Components/Loader/PageLoader";
import Page from "CommonUI/src/Components/Page/Page";
import { ACCOUNTS_URL } from "CommonUI/src/Config";
import UiAnalytics from "CommonUI/src/Utils/Analytics";
import Navigation from "CommonUI/src/Utils/Navigation";
import UserUtil from "CommonUI/src/Utils/User";
import ErrorMessage from "Common/UI/Components/ErrorMessage/ErrorMessage";
import PageLoader from "Common/UI/Components/Loader/PageLoader";
import Page from "Common/UI/Components/Page/Page";
import { ACCOUNTS_URL } from "Common/UI/Config";
import UiAnalytics from "Common/UI/Utils/Analytics";
import Navigation from "Common/UI/Utils/Navigation";
import UserUtil from "Common/UI/Utils/User";
import React, { FunctionComponent, ReactElement, useEffect } from "react";
const Logout: FunctionComponent = (): ReactElement => {

View File

@@ -3,18 +3,18 @@ import PageMap from "../../Utils/PageMap";
import RouteMap, { RouteUtil } from "../../Utils/RouteMap";
import Route from "Common/Types/API/Route";
import SubscriptionPlan from "Common/Types/Billing/SubscriptionPlan";
import Field from "CommonUI/src/Components/Forms/Types/Field";
import FormFieldSchemaType from "CommonUI/src/Components/Forms/Types/FormFieldSchemaType";
import ModelTable from "CommonUI/src/Components/ModelTable/ModelTable";
import Page from "CommonUI/src/Components/Page/Page";
import { RadioButton } from "CommonUI/src/Components/RadioButtons/GroupRadioButtons";
import Toggle from "CommonUI/src/Components/Toggle/Toggle";
import FieldType from "CommonUI/src/Components/Types/FieldType";
import { BILLING_ENABLED, getAllEnvVars } from "CommonUI/src/Config";
import { GetReactElementFunction } from "CommonUI/src/Types/FunctionTypes";
import Navigation from "CommonUI/src/Utils/Navigation";
import Project from "Model/Models/Project";
import User from "Model/Models/User";
import Field from "Common/UI/Components/Forms/Types/Field";
import FormFieldSchemaType from "Common/UI/Components/Forms/Types/FormFieldSchemaType";
import ModelTable from "Common/UI/Components/ModelTable/ModelTable";
import Page from "Common/UI/Components/Page/Page";
import { RadioButton } from "Common/UI/Components/RadioButtons/GroupRadioButtons";
import Toggle from "Common/UI/Components/Toggle/Toggle";
import FieldType from "Common/UI/Components/Types/FieldType";
import { BILLING_ENABLED, getAllEnvVars } from "Common/UI/Config";
import { GetReactElementFunction } from "Common/UI/Types/FunctionTypes";
import Navigation from "Common/UI/Utils/Navigation";
import Project from "Common/Models/DatabaseModels/Project";
import User from "Common/Models/DatabaseModels/User";
import React, {
FunctionComponent,
ReactElement,
@@ -187,7 +187,7 @@ const Projects: FunctionComponent = (): ReactElement => {
isEditable={false}
isCreateable={true}
name="Projects"
isViewable={false}
isViewable={true}
cardProps={{
title: "Projects",
description: "Here is a list of proejcts in OneUptime.",

View File

@@ -0,0 +1,52 @@
import PageMap from "../../../Utils/PageMap";
import RouteMap, { RouteUtil } from "../../../Utils/RouteMap";
import Route from "Common/Types/API/Route";
import ObjectID from "Common/Types/ObjectID";
import ModelDelete from "Common/UI/Components/ModelDelete/ModelDelete";
import Navigation from "Common/UI/Utils/Navigation";
import React, { FunctionComponent, ReactElement } from "react";
import SideMenuComponent from "./SideMenu";
import Project from "Common/Models/DatabaseModels/Project";
import ModelPage from "Common/UI/Components/Page/ModelPage";
const DeletePage: FunctionComponent = (): ReactElement => {
const modelId: ObjectID = Navigation.getLastParamAsObjectID(1);
return (
<ModelPage<Project>
modelId={modelId}
modelNameField="name"
modelType={Project}
title={"Project"}
breadcrumbLinks={[
{
title: "Admin Dashboard",
to: RouteUtil.populateRouteParams(RouteMap[PageMap.HOME] as Route),
},
{
title: "Projects",
to: RouteUtil.populateRouteParams(
RouteMap[PageMap.PROJECTS] as Route,
),
},
{
title: "Project",
to: RouteUtil.populateRouteParams(
RouteMap[PageMap.PROJECT_VIEW] as Route,
),
},
]}
sideMenu={<SideMenuComponent modelId={modelId} />}
>
<ModelDelete
modelType={Project}
modelId={modelId}
onDeleteSuccess={() => {
Navigation.navigate(RouteMap[PageMap.PROJECTS] as Route);
}}
/>
</ModelPage>
);
};
export default DeletePage;

View File

@@ -0,0 +1,90 @@
import ObjectID from "Common/Types/ObjectID";
import PageMap from "../../../Utils/PageMap";
import RouteMap, { RouteUtil } from "../../../Utils/RouteMap";
import Route from "Common/Types/API/Route";
import Navigation from "Common/UI/Utils/Navigation";
import Project from "Common/Models/DatabaseModels/Project";
import React, { FunctionComponent, ReactElement } from "react";
import CardModelDetail from "Common/UI/Components/ModelDetail/CardModelDetail";
import FormFieldSchemaType from "Common/UI/Components/Forms/Types/FormFieldSchemaType";
import FieldType from "Common/UI/Components/Types/FieldType";
import ModelPage from "Common/UI/Components/Page/ModelPage";
import SideMenuComponent from "./SideMenu";
const Projects: FunctionComponent = (): ReactElement => {
const modelId: ObjectID = Navigation.getLastParamAsObjectID();
return (
<ModelPage
modelId={modelId}
modelNameField="name"
modelType={Project}
title={"Project"}
breadcrumbLinks={[
{
title: "Admin Dashboard",
to: RouteUtil.populateRouteParams(RouteMap[PageMap.HOME] as Route),
},
{
title: "Projects",
to: RouteUtil.populateRouteParams(
RouteMap[PageMap.PROJECTS] as Route,
),
},
{
title: "Project",
to: RouteUtil.populateRouteParams(
RouteMap[PageMap.PROJECT_VIEW] as Route,
),
},
]}
sideMenu={<SideMenuComponent modelId={modelId} />}
>
<div>
<CardModelDetail<Project>
name="Project"
cardProps={{
title: "Project",
description: "Project details",
}}
isEditable={true}
editButtonText="Edit Project"
formFields={[
{
field: {
name: true,
},
title: "Name",
fieldType: FormFieldSchemaType.Text,
required: true,
},
]}
modelDetailProps={{
modelType: Project,
id: "model-detail-user",
fields: [
{
field: {
_id: true,
},
title: "Project ID",
fieldType: FieldType.Text,
placeholder: "-",
},
{
field: {
name: true,
},
title: "Name",
fieldType: FieldType.Text,
},
],
modelId: modelId,
}}
/>
</div>
</ModelPage>
);
};
export default Projects;

View File

@@ -0,0 +1,53 @@
import PageMap from "../../../Utils/PageMap";
import RouteMap, { RouteUtil } from "../../../Utils/RouteMap";
import Route from "Common/Types/API/Route";
import IconProp from "Common/Types/Icon/IconProp";
import ObjectID from "Common/Types/ObjectID";
import SideMenu from "Common/UI/Components/SideMenu/SideMenu";
import SideMenuItem from "Common/UI/Components/SideMenu/SideMenuItem";
import SideMenuSection from "Common/UI/Components/SideMenu/SideMenuSection";
import React, { FunctionComponent, ReactElement } from "react";
export interface SideMenuProps {
modelId: ObjectID;
}
const SideMenuComponent: FunctionComponent<SideMenuProps> = (
props: SideMenuProps,
): ReactElement => {
return (
<SideMenu>
<SideMenuSection title="Basic">
<SideMenuItem
link={{
title: "Overview",
to: RouteUtil.populateRouteParams(
RouteMap[PageMap.PROJECT_VIEW] as Route,
{
modelId: props.modelId,
},
),
}}
icon={IconProp.Info}
/>
</SideMenuSection>
<SideMenuSection title="Advanced">
<SideMenuItem
link={{
title: "Delete",
to: RouteUtil.populateRouteParams(
RouteMap[PageMap.PROJECT_DELETE] as Route,
{
modelId: props.modelId,
},
),
}}
icon={IconProp.Trash}
/>
</SideMenuSection>
</SideMenu>
);
};
export default SideMenuComponent;

View File

@@ -3,11 +3,11 @@ import RouteMap, { RouteUtil } from "../../../Utils/RouteMap";
import DashboardSideMenu from "../SideMenu";
import Route from "Common/Types/API/Route";
import ObjectID from "Common/Types/ObjectID";
import FormFieldSchemaType from "CommonUI/src/Components/Forms/Types/FormFieldSchemaType";
import CardModelDetail from "CommonUI/src/Components/ModelDetail/CardModelDetail";
import Page from "CommonUI/src/Components/Page/Page";
import FieldType from "CommonUI/src/Components/Types/FieldType";
import GlobalConfig from "Model/Models/GlobalConfig";
import FormFieldSchemaType from "Common/UI/Components/Forms/Types/FormFieldSchemaType";
import CardModelDetail from "Common/UI/Components/ModelDetail/CardModelDetail";
import Page from "Common/UI/Components/Page/Page";
import FieldType from "Common/UI/Components/Types/FieldType";
import GlobalConfig from "Common/Models/DatabaseModels/GlobalConfig";
import React, { FunctionComponent, ReactElement } from "react";
const Settings: FunctionComponent = (): ReactElement => {

View File

@@ -3,11 +3,11 @@ import RouteMap, { RouteUtil } from "../../../Utils/RouteMap";
import DashboardSideMenu from "../SideMenu";
import Route from "Common/Types/API/Route";
import ObjectID from "Common/Types/ObjectID";
import FormFieldSchemaType from "CommonUI/src/Components/Forms/Types/FormFieldSchemaType";
import CardModelDetail from "CommonUI/src/Components/ModelDetail/CardModelDetail";
import Page from "CommonUI/src/Components/Page/Page";
import FieldType from "CommonUI/src/Components/Types/FieldType";
import GlobalConfig from "Model/Models/GlobalConfig";
import FormFieldSchemaType from "Common/UI/Components/Forms/Types/FormFieldSchemaType";
import CardModelDetail from "Common/UI/Components/ModelDetail/CardModelDetail";
import Page from "Common/UI/Components/Page/Page";
import FieldType from "Common/UI/Components/Types/FieldType";
import GlobalConfig from "Common/Models/DatabaseModels/GlobalConfig";
import React, { FunctionComponent, ReactElement } from "react";
const Settings: FunctionComponent = (): ReactElement => {

View File

@@ -3,11 +3,11 @@ import RouteMap, { RouteUtil } from "../../../Utils/RouteMap";
import DashboardSideMenu from "../SideMenu";
import Route from "Common/Types/API/Route";
import ObjectID from "Common/Types/ObjectID";
import FormFieldSchemaType from "CommonUI/src/Components/Forms/Types/FormFieldSchemaType";
import CardModelDetail from "CommonUI/src/Components/ModelDetail/CardModelDetail";
import Page from "CommonUI/src/Components/Page/Page";
import FieldType from "CommonUI/src/Components/Types/FieldType";
import GlobalConfig from "Model/Models/GlobalConfig";
import FormFieldSchemaType from "Common/UI/Components/Forms/Types/FormFieldSchemaType";
import CardModelDetail from "Common/UI/Components/ModelDetail/CardModelDetail";
import Page from "Common/UI/Components/Page/Page";
import FieldType from "Common/UI/Components/Types/FieldType";
import GlobalConfig from "Common/Models/DatabaseModels/GlobalConfig";
import React, { FunctionComponent, ReactElement } from "react";
const Settings: FunctionComponent = (): ReactElement => {

View File

@@ -5,16 +5,18 @@ import Route from "Common/Types/API/Route";
import { Green, Red } from "Common/Types/BrandColors";
import { PromiseVoidFunction } from "Common/Types/FunctionTypes";
import ObjectID from "Common/Types/ObjectID";
import ErrorMessage from "CommonUI/src/Components/ErrorMessage/ErrorMessage";
import FormFieldSchemaType from "CommonUI/src/Components/Forms/Types/FormFieldSchemaType";
import PageLoader from "CommonUI/src/Components/Loader/PageLoader";
import CardModelDetail from "CommonUI/src/Components/ModelDetail/CardModelDetail";
import Page from "CommonUI/src/Components/Page/Page";
import Pill from "CommonUI/src/Components/Pill/Pill";
import FieldType from "CommonUI/src/Components/Types/FieldType";
import DropdownUtil from "CommonUI/src/Utils/Dropdown";
import ModelAPI from "CommonUI/src/Utils/ModelAPI/ModelAPI";
import GlobalConfig, { EmailServerType } from "Model/Models/GlobalConfig";
import ErrorMessage from "Common/UI/Components/ErrorMessage/ErrorMessage";
import FormFieldSchemaType from "Common/UI/Components/Forms/Types/FormFieldSchemaType";
import PageLoader from "Common/UI/Components/Loader/PageLoader";
import CardModelDetail from "Common/UI/Components/ModelDetail/CardModelDetail";
import Page from "Common/UI/Components/Page/Page";
import Pill from "Common/UI/Components/Pill/Pill";
import FieldType from "Common/UI/Components/Types/FieldType";
import DropdownUtil from "Common/UI/Utils/Dropdown";
import ModelAPI from "Common/UI/Utils/ModelAPI/ModelAPI";
import GlobalConfig, {
EmailServerType,
} from "Common/Models/DatabaseModels/GlobalConfig";
import React, { FunctionComponent, ReactElement, useEffect } from "react";
const Settings: FunctionComponent = (): ReactElement => {

View File

@@ -7,16 +7,16 @@ import IsNull from "Common/Types/BaseDatabase/IsNull";
import { Green, Red } from "Common/Types/BrandColors";
import OneUptimeDate from "Common/Types/Date";
import { ErrorFunction, VoidFunction } from "Common/Types/FunctionTypes";
import Banner from "CommonUI/src/Components/Banner/Banner";
import { ButtonStyleType } from "CommonUI/src/Components/Button/Button";
import FormFieldSchemaType from "CommonUI/src/Components/Forms/Types/FormFieldSchemaType";
import ConfirmModal from "CommonUI/src/Components/Modal/ConfirmModal";
import ModelTable from "CommonUI/src/Components/ModelTable/ModelTable";
import Page from "CommonUI/src/Components/Page/Page";
import ProbeElement from "CommonUI/src/Components/Probe/Probe";
import Statusbubble from "CommonUI/src/Components/StatusBubble/StatusBubble";
import FieldType from "CommonUI/src/Components/Types/FieldType";
import Probe from "Model/Models/Probe";
import Banner from "Common/UI/Components/Banner/Banner";
import { ButtonStyleType } from "Common/UI/Components/Button/Button";
import FormFieldSchemaType from "Common/UI/Components/Forms/Types/FormFieldSchemaType";
import ConfirmModal from "Common/UI/Components/Modal/ConfirmModal";
import ModelTable from "Common/UI/Components/ModelTable/ModelTable";
import Page from "Common/UI/Components/Page/Page";
import ProbeElement from "Common/UI/Components/Probe/Probe";
import Statusbubble from "Common/UI/Components/StatusBubble/StatusBubble";
import FieldType from "Common/UI/Components/Types/FieldType";
import Probe from "Common/Models/DatabaseModels/Probe";
import React, { FunctionComponent, ReactElement, useState } from "react";
const Settings: FunctionComponent = (): ReactElement => {

View File

@@ -2,9 +2,9 @@ import PageMap from "../../Utils/PageMap";
import RouteMap, { RouteUtil } from "../../Utils/RouteMap";
import Route from "Common/Types/API/Route";
import IconProp from "Common/Types/Icon/IconProp";
import SideMenu from "CommonUI/src/Components/SideMenu/SideMenu";
import SideMenuItem from "CommonUI/src/Components/SideMenu/SideMenuItem";
import SideMenuSection from "CommonUI/src/Components/SideMenu/SideMenuSection";
import SideMenu from "Common/UI/Components/SideMenu/SideMenu";
import SideMenuItem from "Common/UI/Components/SideMenu/SideMenuItem";
import SideMenuSection from "Common/UI/Components/SideMenu/SideMenuSection";
import React, { ReactElement } from "react";
const DashboardSideMenu: () => JSX.Element = (): ReactElement => {

View File

@@ -1,31 +1,15 @@
import PageMap from "../../Utils/PageMap";
import RouteMap, { RouteUtil } from "../../Utils/RouteMap";
import Route from "Common/Types/API/Route";
import { ErrorFunction } from "Common/Types/FunctionTypes";
import { ButtonStyleType } from "CommonUI/src/Components/Button/Button";
import FormFieldSchemaType from "CommonUI/src/Components/Forms/Types/FormFieldSchemaType";
import ConfirmModal from "CommonUI/src/Components/Modal/ConfirmModal";
import ModelTable from "CommonUI/src/Components/ModelTable/ModelTable";
import Page from "CommonUI/src/Components/Page/Page";
import FieldType from "CommonUI/src/Components/Types/FieldType";
import API from "CommonUI/src/Utils/API/API";
import ModelAPI from "CommonUI/src/Utils/ModelAPI/ModelAPI";
import Navigation from "CommonUI/src/Utils/Navigation";
import User from "Model/Models/User";
import React, { FunctionComponent, ReactElement, useState } from "react";
import FormFieldSchemaType from "Common/UI/Components/Forms/Types/FormFieldSchemaType";
import ModelTable from "Common/UI/Components/ModelTable/ModelTable";
import Page from "Common/UI/Components/Page/Page";
import FieldType from "Common/UI/Components/Types/FieldType";
import Navigation from "Common/UI/Utils/Navigation";
import User from "Common/Models/DatabaseModels/User";
import React, { FunctionComponent, ReactElement } from "react";
const Users: FunctionComponent = (): ReactElement => {
const [showConfirmVerifyEmailModal, setShowConfirmVerifyEmailModal] =
useState<boolean>(false);
const [selectedUser, setSelectedUser] = useState<User | null>(null);
const [error, setError] = useState<string | null>(null);
const [isConfimModalLoading, setIsConfirmModalLoading] =
useState<boolean>(false);
const [refreshItemsTrigger, setRefreshItemsTrigger] =
useState<boolean>(false);
return (
<Page
title={"Users"}
@@ -46,38 +30,13 @@ const Users: FunctionComponent = (): ReactElement => {
isDeleteable={false}
isEditable={false}
showViewIdButton={true}
refreshToggle={refreshItemsTrigger}
isCreateable={true}
name="Users"
isViewable={false}
isViewable={true}
cardProps={{
title: "Users",
description: "Here is a list of users in OneUptime.",
}}
actionButtons={[
{
title: "Verify Email",
buttonStyleType: ButtonStyleType.NORMAL,
isVisible: (item: User) => {
return !item.isEmailVerified;
},
onClick: async (
item: User,
onCompleteAction: VoidFunction,
onError: ErrorFunction,
) => {
try {
setSelectedUser(item);
setShowConfirmVerifyEmailModal(true);
onCompleteAction();
} catch (err) {
onCompleteAction();
onError(err as Error);
}
},
},
]}
noItemsMessage={"No users found."}
formFields={[
{
@@ -164,53 +123,6 @@ const Users: FunctionComponent = (): ReactElement => {
},
]}
/>
{error ? (
<ConfirmModal
title={`Error`}
description={error}
submitButtonText={"Close"}
onSubmit={async () => {
setError(null);
}}
submitButtonType={ButtonStyleType.NORMAL}
/>
) : (
<></>
)}
{showConfirmVerifyEmailModal && selectedUser ? (
<ConfirmModal
title={`Verify Email`}
description={`Are you sure you want to verify the email - ${selectedUser.email}?`}
isLoading={isConfimModalLoading}
submitButtonText={"Verify Email"}
onClose={async () => {
setShowConfirmVerifyEmailModal(false);
setSelectedUser(null);
}}
onSubmit={async () => {
try {
setIsConfirmModalLoading(true);
await ModelAPI.updateById<User>({
modelType: User,
id: selectedUser.id!,
data: {
isEmailVerified: true,
},
});
} catch (err) {
setError(API.getFriendlyMessage(err as Error));
}
setRefreshItemsTrigger(!refreshItemsTrigger);
setIsConfirmModalLoading(false);
setShowConfirmVerifyEmailModal(false);
}}
/>
) : (
<></>
)}
</Page>
);
};

View File

@@ -0,0 +1,50 @@
import PageMap from "../../../Utils/PageMap";
import RouteMap, { RouteUtil } from "../../../Utils/RouteMap";
import Route from "Common/Types/API/Route";
import ObjectID from "Common/Types/ObjectID";
import ModelDelete from "Common/UI/Components/ModelDelete/ModelDelete";
import Navigation from "Common/UI/Utils/Navigation";
import React, { FunctionComponent, ReactElement } from "react";
import SideMenuComponent from "./SideMenu";
import User from "Common/Models/DatabaseModels/User";
import ModelPage from "Common/UI/Components/Page/ModelPage";
const DeletePage: FunctionComponent = (): ReactElement => {
const modelId: ObjectID = Navigation.getLastParamAsObjectID(1);
return (
<ModelPage
modelId={modelId}
modelNameField="email"
modelType={User}
title={"User"}
breadcrumbLinks={[
{
title: "Admin Dashboard",
to: RouteUtil.populateRouteParams(RouteMap[PageMap.HOME] as Route),
},
{
title: "Users",
to: RouteUtil.populateRouteParams(RouteMap[PageMap.USERS] as Route),
},
{
title: "User",
to: RouteUtil.populateRouteParams(
RouteMap[PageMap.USER_VIEW] as Route,
),
},
]}
sideMenu={<SideMenuComponent modelId={modelId} />}
>
<ModelDelete
modelType={User}
modelId={modelId}
onDeleteSuccess={() => {
Navigation.navigate(RouteMap[PageMap.USERS] as Route);
}}
/>
</ModelPage>
);
};
export default DeletePage;

View File

@@ -0,0 +1,136 @@
import ObjectID from "Common/Types/ObjectID";
import PageMap from "../../../Utils/PageMap";
import RouteMap, { RouteUtil } from "../../../Utils/RouteMap";
import Route from "Common/Types/API/Route";
import Navigation from "Common/UI/Utils/Navigation";
import User from "Common/Models/DatabaseModels/User";
import React, { FunctionComponent, ReactElement } from "react";
import CardModelDetail from "Common/UI/Components/ModelDetail/CardModelDetail";
import FormFieldSchemaType from "Common/UI/Components/Forms/Types/FormFieldSchemaType";
import FieldType from "Common/UI/Components/Types/FieldType";
import ModelPage from "Common/UI/Components/Page/ModelPage";
import SideMenuComponent from "./SideMenu";
const Users: FunctionComponent = (): ReactElement => {
const modelId: ObjectID = Navigation.getLastParamAsObjectID();
return (
<ModelPage
modelId={modelId}
modelNameField="email"
modelType={User}
title={"User"}
breadcrumbLinks={[
{
title: "Admin Dashboard",
to: RouteUtil.populateRouteParams(RouteMap[PageMap.HOME] as Route),
},
{
title: "Users",
to: RouteUtil.populateRouteParams(RouteMap[PageMap.USERS] as Route),
},
{
title: "User",
to: RouteUtil.populateRouteParams(
RouteMap[PageMap.USER_VIEW] as Route,
),
},
]}
sideMenu={<SideMenuComponent modelId={modelId} />}
>
<div>
<CardModelDetail<User>
name="User"
cardProps={{
title: "User",
description: "User details",
}}
isEditable={true}
editButtonText="Edit User"
formFields={[
{
field: {
name: true,
},
title: "Name",
fieldType: FormFieldSchemaType.Text,
required: true,
},
{
field: {
email: true,
},
title: "Email",
fieldType: FormFieldSchemaType.Email,
required: true,
},
{
field: {
isEmailVerified: true,
},
title: "Email Verified",
fieldType: FormFieldSchemaType.Toggle,
required: false,
},
{
field: {
enableTwoFactorAuth: true,
},
title: "Two Factor Auth Enabled",
fieldType: FormFieldSchemaType.Toggle,
required: false,
},
]}
modelDetailProps={{
modelType: User,
id: "model-detail-user",
fields: [
{
field: {
_id: true,
},
title: "User ID",
fieldType: FieldType.Text,
placeholder: "-",
},
{
field: {
name: true,
},
title: "Name",
fieldType: FieldType.Text,
},
{
field: {
email: true,
},
title: "Email",
fieldType: FieldType.Email,
placeholder: "-",
},
{
field: {
isEmailVerified: true,
},
title: "Email Verified",
fieldType: FieldType.Boolean,
placeholder: "No",
},
{
field: {
enableTwoFactorAuth: true,
},
title: "Two Factor Auth Enabled",
fieldType: FieldType.Boolean,
placeholder: "No",
},
],
modelId: modelId,
}}
/>
</div>
</ModelPage>
);
};
export default Users;

View File

@@ -0,0 +1,53 @@
import PageMap from "../../../Utils/PageMap";
import RouteMap, { RouteUtil } from "../../../Utils/RouteMap";
import Route from "Common/Types/API/Route";
import IconProp from "Common/Types/Icon/IconProp";
import ObjectID from "Common/Types/ObjectID";
import SideMenu from "Common/UI/Components/SideMenu/SideMenu";
import SideMenuItem from "Common/UI/Components/SideMenu/SideMenuItem";
import SideMenuSection from "Common/UI/Components/SideMenu/SideMenuSection";
import React, { FunctionComponent, ReactElement } from "react";
export interface SideMenuProps {
modelId: ObjectID;
}
const SideMenuComponent: FunctionComponent<SideMenuProps> = (
props: SideMenuProps,
): ReactElement => {
return (
<SideMenu>
<SideMenuSection title="Basic">
<SideMenuItem
link={{
title: "Overview",
to: RouteUtil.populateRouteParams(
RouteMap[PageMap.USER_VIEW] as Route,
{
modelId: props.modelId,
},
),
}}
icon={IconProp.Info}
/>
</SideMenuSection>
<SideMenuSection title="Advanced">
<SideMenuItem
link={{
title: "Delete",
to: RouteUtil.populateRouteParams(
RouteMap[PageMap.USER_DELETE] as Route,
{
modelId: props.modelId,
},
),
}}
icon={IconProp.Trash}
/>
</SideMenuSection>
</SideMenu>
);
};
export default SideMenuComponent;

View File

@@ -1,5 +1,5 @@
import Dictionary from "Common/Types/Dictionary";
import ModelAPI from "CommonUI/src/Utils/ModelAPI/ModelAPI";
import ModelAPI from "Common/UI/Utils/ModelAPI/ModelAPI";
export default class AdminModelAPI extends ModelAPI {
public static override getCommonHeaders(): Dictionary<string> {

View File

@@ -3,8 +3,14 @@ enum PageMap {
HOME = "HOME",
LOGOUT = "LOGOUT",
SETTINGS = "SETTINGS",
USERS = "USERS",
USER_VIEW = "USER_VIEW",
USER_DELETE = "USER_DELETE",
PROJECTS = "PROJECTS",
PROJECT_VIEW = "PROJECT_VIEW",
PROJECT_DELETE = "PROJECT_DELETE",
SETTINGS_HOST = "SETTINGS_HOST",
SETTINGS_SMTP = "SETTINGS_SMTP",

View File

@@ -9,8 +9,19 @@ const RouteMap: Dictionary<Route> = {
[PageMap.HOME]: new Route(`/admin`),
[PageMap.LOGOUT]: new Route(`/admin/logout`),
[PageMap.SETTINGS]: new Route(`/admin/settings/host`),
[PageMap.PROJECTS]: new Route(`/admin/projects`),
[PageMap.PROJECT_VIEW]: new Route(`/admin/projects/${RouteParams.ModelID}`),
[PageMap.PROJECT_DELETE]: new Route(
`/admin/projects/${RouteParams.ModelID}/delete`,
),
[PageMap.USERS]: new Route(`/admin/users`),
[PageMap.USER_VIEW]: new Route(`/admin/users/${RouteParams.ModelID}`),
[PageMap.USER_DELETE]: new Route(
`/admin/users/${RouteParams.ModelID}/delete`,
),
[PageMap.SETTINGS_HOST]: new Route(`/admin/settings/host`),
[PageMap.SETTINGS_SMTP]: new Route(`/admin/settings/smtp`),
[PageMap.SETTINGS_CALL_AND_SMS]: new Route(`/admin/settings/call-and-sms`),

View File

@@ -38,25 +38,6 @@ RUN sed -i "s/\"version\": \".*\"/\"version\": \"$APP_VERSION\"/g" /usr/src/Comm
RUN npm install
COPY ./Common /usr/src/Common
WORKDIR /usr/src/Model
COPY ./Model/package*.json /usr/src/Model/
# Set version in ./Model/package.json to the APP_VERSION
RUN sed -i "s/\"version\": \".*\"/\"version\": \"$APP_VERSION\"/g" /usr/src/Model/package.json
RUN npm install
COPY ./Model /usr/src/Model
WORKDIR /usr/src/CommonServer
COPY ./CommonServer/package*.json /usr/src/CommonServer/
# Set version in ./CommonServer/package.json to the APP_VERSION
RUN sed -i "s/\"version\": \".*\"/\"version\": \"$APP_VERSION\"/g" /usr/src/CommonServer/package.json
RUN npm install
COPY ./CommonServer /usr/src/CommonServer
ENV PRODUCTION=true
WORKDIR /usr/src/app

View File

@@ -10,13 +10,13 @@ import StatusServiceHandler from "./Service/Status";
import { StaticPath } from "./Utils/Config";
import ResourceUtil, { ModelDocumentation } from "./Utils/Resources";
import Dictionary from "Common/Types/Dictionary";
import FeatureSet from "CommonServer/Types/FeatureSet";
import FeatureSet from "Common/Server/Types/FeatureSet";
import Express, {
ExpressApplication,
ExpressRequest,
ExpressResponse,
ExpressStatic,
} from "CommonServer/Utils/Express";
} from "Common/Server/Utils/Express";
const APIReferenceFeatureSet: FeatureSet = {
init: async (): Promise<void> => {
@@ -25,13 +25,15 @@ const APIReferenceFeatureSet: FeatureSet = {
const app: ExpressApplication = Express.getExpressApp();
// Serve static files for the API reference with a cache max age of 30 days
app.use("/reference", ExpressStatic(StaticPath, { maxAge: 2592000 }));
// Index page
// Redirect index page to the introduction page
app.get(["/reference"], (_req: ExpressRequest, res: ExpressResponse) => {
return res.redirect("/reference/introduction");
});
// Handle "Page Not Found" page
app.get(
["/reference/page-not-found"],
(req: ExpressRequest, res: ExpressResponse) => {
@@ -39,7 +41,7 @@ const APIReferenceFeatureSet: FeatureSet = {
},
);
// All Pages
// Handle all other pages based on the "page" parameter
app.get(
["/reference/:page"],
(req: ExpressRequest, res: ExpressResponse) => {
@@ -52,6 +54,7 @@ const APIReferenceFeatureSet: FeatureSet = {
const currentResource: ModelDocumentation | undefined =
ResourceDictionary[page];
// Execute the appropriate service handler based on the "page" parameter
if (req.params["page"] === "permissions") {
return PermissionServiceHandler.executeResponse(req, res);
} else if (req.params["page"] === "authentication") {

View File

@@ -1,7 +1,8 @@
import { ViewsPath } from "../Utils/Config";
import ResourceUtil, { ModelDocumentation } from "../Utils/Resources";
import { ExpressRequest, ExpressResponse } from "CommonServer/Utils/Express";
import { ExpressRequest, ExpressResponse } from "Common/Server/Utils/Express";
// Retrieve resources documentation
const Resources: Array<ModelDocumentation> = ResourceUtil.getResources();
export default class ServiceHandler {
@@ -11,12 +12,16 @@ export default class ServiceHandler {
): Promise<void> {
let pageTitle: string = "";
let pageDescription: string = "";
// Extract page parameter from request
const page: string | undefined = req.params["page"];
const pageData: any = {};
// Set default page title and description for the authentication page
pageTitle = "Authentication";
pageDescription = "Learn how to authenticate requests with OneUptime API";
// Render the index page with the specified parameters
return res.render(`${ViewsPath}/pages/index`, {
page: page,
resources: Resources,

View File

@@ -1,8 +1,8 @@
import { CodeExamplesPath, ViewsPath } from "../Utils/Config";
import ResourceUtil, { ModelDocumentation } from "../Utils/Resources";
import LocalCache from "CommonServer/Infrastructure/LocalCache";
import { ExpressRequest, ExpressResponse } from "CommonServer/Utils/Express";
import LocalFile from "CommonServer/Utils/LocalFile";
import LocalCache from "Common/Server/Infrastructure/LocalCache";
import { ExpressRequest, ExpressResponse } from "Common/Server/Utils/Express";
import LocalFile from "Common/Server/Utils/LocalFile";
const Resources: Array<ModelDocumentation> = ResourceUtil.getResources();

View File

@@ -1,22 +1,28 @@
import { ViewsPath } from "../Utils/Config";
import ResourceUtil, { ModelDocumentation } from "../Utils/Resources";
import { ExpressRequest, ExpressResponse } from "CommonServer/Utils/Express";
import { ExpressRequest, ExpressResponse } from "Common/Server/Utils/Express";
// Fetch a list of resources used in the application
const Resources: Array<ModelDocumentation> = ResourceUtil.getResources();
export default class ServiceHandler {
// Handles the HTTP response for a given request
public static async executeResponse(
req: ExpressRequest,
res: ExpressResponse,
): Promise<void> {
let pageTitle: string = "";
let pageDescription: string = "";
// Get the 'page' parameter from the request
const page: string | undefined = req.params["page"];
const pageData: any = {};
// Set the default page title and description
pageTitle = "Errors";
pageDescription = "Learn more about how we return errors from API";
// Render the response using the given view and data
return res.render(`${ViewsPath}/pages/index`, {
page: page,
resources: Resources,

View File

@@ -1,6 +1,6 @@
import { ViewsPath } from "../Utils/Config";
import ResourceUtil, { ModelDocumentation } from "../Utils/Resources";
import { ExpressRequest, ExpressResponse } from "CommonServer/Utils/Express";
import { ExpressRequest, ExpressResponse } from "Common/Server/Utils/Express";
// Get all resources and featured resources from ResourceUtil
const Resources: Array<ModelDocumentation> = ResourceUtil.getResources();

View File

@@ -10,9 +10,9 @@ import Permission, {
PermissionHelper,
PermissionProps,
} from "Common/Types/Permission";
import LocalCache from "CommonServer/Infrastructure/LocalCache";
import { ExpressRequest, ExpressResponse } from "CommonServer/Utils/Express";
import LocalFile from "CommonServer/Utils/LocalFile";
import LocalCache from "Common/Server/Infrastructure/LocalCache";
import { ExpressRequest, ExpressResponse } from "Common/Server/Utils/Express";
import LocalFile from "Common/Server/Utils/LocalFile";
// Get all resources and resource dictionary
const Resources: Array<ModelDocumentation> = ResourceUtil.getResources();

View File

@@ -1,6 +1,6 @@
import { ViewsPath } from "../Utils/Config";
import ResourceUtil, { ModelDocumentation } from "../Utils/Resources";
import { ExpressRequest, ExpressResponse } from "CommonServer/Utils/Express";
import { ExpressRequest, ExpressResponse } from "Common/Server/Utils/Express";
const Resources: Array<ModelDocumentation> = ResourceUtil.getResources(); // Get an array of model documentation resources

View File

@@ -1,8 +1,8 @@
import { CodeExamplesPath, ViewsPath } from "../Utils/Config";
import ResourceUtil, { ModelDocumentation } from "../Utils/Resources";
import LocalCache from "CommonServer/Infrastructure/LocalCache";
import { ExpressRequest, ExpressResponse } from "CommonServer/Utils/Express";
import LocalFile from "CommonServer/Utils/LocalFile";
import LocalCache from "Common/Server/Infrastructure/LocalCache";
import { ExpressRequest, ExpressResponse } from "Common/Server/Utils/Express";
import LocalFile from "Common/Server/Utils/LocalFile";
const Resources: Array<ModelDocumentation> = ResourceUtil.getResources(); // Get all resources from ResourceUtil

View File

@@ -1,7 +1,7 @@
import { ViewsPath } from "../Utils/Config";
import ResourceUtil, { ModelDocumentation } from "../Utils/Resources";
import { PermissionHelper, PermissionProps } from "Common/Types/Permission";
import { ExpressRequest, ExpressResponse } from "CommonServer/Utils/Express";
import { ExpressRequest, ExpressResponse } from "Common/Server/Utils/Express";
const Resources: Array<ModelDocumentation> = ResourceUtil.getResources();

View File

@@ -1,6 +1,6 @@
import { ViewsPath } from "../Utils/Config";
import ResourceUtil, { ModelDocumentation } from "../Utils/Resources";
import { ExpressRequest, ExpressResponse } from "CommonServer/Utils/Express";
import { ExpressRequest, ExpressResponse } from "Common/Server/Utils/Express";
const resources: Array<ModelDocumentation> = ResourceUtil.getResources(); // Get resources from ResourceUtil

View File

@@ -1,8 +1,8 @@
import BaseModel from "Common/Models/BaseModel";
import BaseModel from "Common/Models/DatabaseModels/DatabaseBaseModel/DatabaseBaseModel";
import ArrayUtil from "Common/Types/ArrayUtil";
import Dictionary from "Common/Types/Dictionary";
import { IsBillingEnabled } from "CommonServer/EnvironmentConfig";
import Models from "Model/Models/Index";
import { IsBillingEnabled } from "Common/Server/EnvironmentConfig";
import Models from "Common/Models/DatabaseModels/Index";
export interface ModelDocumentation {
name: string;

View File

@@ -1,409 +1,430 @@
import BaseAPI from "CommonServer/API/BaseAPI";
import BaseAnalyticsAPI from "CommonServer/API/BaseAnalyticsAPI";
import BillingInvoiceAPI from "CommonServer/API/BillingInvoiceAPI";
import BillingPaymentMethodAPI from "CommonServer/API/BillingPaymentMethodAPI";
import CopilotCodeRepositoryAPI from "CommonServer/API/CopilotCodeRepositoryAPI";
import CopilotActionAPI from "CommonServer/API/CopilotActionAPI";
import CopilotPullRequestAPI from "CommonServer/API/CopilotPullRequestAPI";
import FileAPI from "CommonServer/API/FileAPI";
import GlobalConfigAPI from "CommonServer/API/GlobalConfigAPI";
import MonitorGroupAPI from "CommonServer/API/MonitorGroupAPI";
import NotificationAPI from "CommonServer/API/NotificationAPI";
import TelemetryAPI from "CommonServer/API/TelemetryAPI";
import Ingestor from "CommonServer/API/ProbeAPI";
import ProjectAPI from "CommonServer/API/ProjectAPI";
import ProjectSsoAPI from "CommonServer/API/ProjectSSO";
import BaseAPI from "Common/Server/API/BaseAPI";
import BaseAnalyticsAPI from "Common/Server/API/BaseAnalyticsAPI";
import BillingInvoiceAPI from "Common/Server/API/BillingInvoiceAPI";
import BillingPaymentMethodAPI from "Common/Server/API/BillingPaymentMethodAPI";
import CopilotCodeRepositoryAPI from "Common/Server/API/CopilotCodeRepositoryAPI";
import CopilotActionAPI from "Common/Server/API/CopilotActionAPI";
import CopilotPullRequestAPI from "Common/Server/API/CopilotPullRequestAPI";
import FileAPI from "Common/Server/API/FileAPI";
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 ProjectAPI from "Common/Server/API/ProjectAPI";
import ProjectSsoAPI from "Common/Server/API/ProjectSSO";
// Import API
import ResellerPlanAPI from "CommonServer/API/ResellerPlanAPI";
import ShortLinkAPI from "CommonServer/API/ShortLinkAPI";
import StatusPageAPI from "CommonServer/API/StatusPageAPI";
import StatusPageDomainAPI from "CommonServer/API/StatusPageDomainAPI";
import StatusPageSubscriberAPI from "CommonServer/API/StatusPageSubscriberAPI";
import UserCallAPI from "CommonServer/API/UserCallAPI";
import ResellerPlanAPI from "Common/Server/API/ResellerPlanAPI";
import ShortLinkAPI from "Common/Server/API/ShortLinkAPI";
import StatusPageAPI from "Common/Server/API/StatusPageAPI";
import StatusPageDomainAPI from "Common/Server/API/StatusPageDomainAPI";
import StatusPageSubscriberAPI from "Common/Server/API/StatusPageSubscriberAPI";
import UserCallAPI from "Common/Server/API/UserCallAPI";
import UserTwoFactorAuthAPI from "Common/Server/API/UserTwoFactorAuthAPI";
// User Notification methods.
import UserEmailAPI from "CommonServer/API/UserEmailAPI";
import UserNotificationLogTimelineAPI from "CommonServer/API/UserOnCallLogTimelineAPI";
import UserSMSAPI from "CommonServer/API/UserSmsAPI";
import UserEmailAPI from "Common/Server/API/UserEmailAPI";
import UserNotificationLogTimelineAPI from "Common/Server/API/UserOnCallLogTimelineAPI";
import UserSMSAPI from "Common/Server/API/UserSmsAPI";
import ApiKeyPermissionService, {
Service as ApiKeyPermissionServiceType,
} from "CommonServer/Services/ApiKeyPermissionService";
} from "Common/Server/Services/ApiKeyPermissionService";
import ApiKeyService, {
Service as ApiKeyServiceType,
} from "CommonServer/Services/ApiKeyService";
} from "Common/Server/Services/ApiKeyService";
import CallLogService, {
Service as CallLogServiceType,
} from "CommonServer/Services/CallLogService";
} from "Common/Server/Services/CallLogService";
import DomainService, {
Service as DomainServiceType,
} from "CommonServer/Services/DomainService";
} from "Common/Server/Services/DomainService";
import EmailLogService, {
Service as EmailLogServiceType,
} from "CommonServer/Services/EmailLogService";
} from "Common/Server/Services/EmailLogService";
import TelemetryIngestionKeyService, {
Service as TelemetryIngestionKeyServiceType,
} from "Common/Server/Services/TelemetryIngestionKeyService";
import EmailVerificationTokenService, {
Service as EmailVerificationTokenServiceType,
} from "CommonServer/Services/EmailVerificationTokenService";
} from "Common/Server/Services/EmailVerificationTokenService";
import IncidentCustomFieldService, {
Service as IncidentCustomFieldServiceType,
} from "CommonServer/Services/IncidentCustomFieldService";
} from "Common/Server/Services/IncidentCustomFieldService";
import IncidentInternalNoteService, {
Service as IncidentInternalNoteServiceType,
} from "CommonServer/Services/IncidentInternalNoteService";
} from "Common/Server/Services/IncidentInternalNoteService";
import IncidentNoteTemplateService, {
Service as IncidentNoteTemplateServiceType,
} from "CommonServer/Services/IncidentNoteTemplateService";
} from "Common/Server/Services/IncidentNoteTemplateService";
import IncidentOwnerTeamService, {
Service as IncidentOwnerTeamServiceType,
} from "CommonServer/Services/IncidentOwnerTeamService";
} from "Common/Server/Services/IncidentOwnerTeamService";
import IncidentOwnerUserService, {
Service as IncidentOwnerUserServiceType,
} from "CommonServer/Services/IncidentOwnerUserService";
} from "Common/Server/Services/IncidentOwnerUserService";
import IncidentPublicNoteService, {
Service as IncidentPublicNoteServiceType,
} from "CommonServer/Services/IncidentPublicNoteService";
} from "Common/Server/Services/IncidentPublicNoteService";
import IncidentService, {
Service as IncidentServiceType,
} from "CommonServer/Services/IncidentService";
} from "Common/Server/Services/IncidentService";
import IncidentSeverityService, {
Service as IncidentSeverityServiceType,
} from "CommonServer/Services/IncidentSeverityService";
} from "Common/Server/Services/IncidentSeverityService";
import IncidentStateService, {
Service as IncidentStateServiceType,
} from "CommonServer/Services/IncidentStateService";
} from "Common/Server/Services/IncidentStateService";
import IncidentStateTimelineService, {
Service as IncidentStateTimelineServiceType,
} from "CommonServer/Services/IncidentStateTimelineService";
} from "Common/Server/Services/IncidentStateTimelineService";
import IncidentTemplateOwnerTeamService, {
Service as IncidentTemplateOwnerTeamServiceType,
} from "CommonServer/Services/IncidentTemplateOwnerTeamService";
} from "Common/Server/Services/IncidentTemplateOwnerTeamService";
import IncidentTemplateOwnerUserService, {
Service as IncidentTemplateOwnerUserServiceType,
} from "CommonServer/Services/IncidentTemplateOwnerUserService";
} from "Common/Server/Services/IncidentTemplateOwnerUserService";
import IncidentTemplateService, {
Service as IncidentTemplateServiceType,
} from "CommonServer/Services/IncidentTemplateService";
} from "Common/Server/Services/IncidentTemplateService";
import LabelService, {
Service as LabelServiceType,
} from "CommonServer/Services/LabelService";
} from "Common/Server/Services/LabelService";
import LogService, {
LogService as LogServiceType,
} from "CommonServer/Services/LogService";
} from "Common/Server/Services/LogService";
import TelemetryAttributeService, {
TelemetryAttributeService as TelemetryAttributeServiceType,
} from "Common/Server/Services/TelemetryAttributeService";
import MetricService, {
MetricService as MetricServiceType,
} from "CommonServer/Services/MetricService";
} from "Common/Server/Services/MetricService";
import MonitorCustomFieldService, {
Service as MonitorCustomFieldServiceType,
} from "CommonServer/Services/MonitorCustomFieldService";
} from "Common/Server/Services/MonitorCustomFieldService";
import MonitorGroupOwnerTeamService, {
Service as MonitorGroupOwnerTeamServiceType,
} from "CommonServer/Services/MonitorGroupOwnerTeamService";
} from "Common/Server/Services/MonitorGroupOwnerTeamService";
import MonitorGroupOwnerUserService, {
Service as MonitorGroupOwnerUserServiceType,
} from "CommonServer/Services/MonitorGroupOwnerUserService";
} from "Common/Server/Services/MonitorGroupOwnerUserService";
import MonitorGroupResourceService, {
Service as MonitorGroupResourceServiceType,
} from "CommonServer/Services/MonitorGroupResourceService";
} from "Common/Server/Services/MonitorGroupResourceService";
import MonitorMetricsByMinuteService, {
MonitorMetricsByMinuteService as MonitorMetricsByMinuteServiceType,
} from "CommonServer/Services/MonitorMetricsByMinuteService";
} from "Common/Server/Services/MonitorMetricsByMinuteService";
import MonitorOwnerTeamService, {
Service as MonitorOwnerTeamServiceType,
} from "CommonServer/Services/MonitorOwnerTeamService";
} from "Common/Server/Services/MonitorOwnerTeamService";
import MonitorOwnerUserService, {
Service as MonitorOwnerUserServiceType,
} from "CommonServer/Services/MonitorOwnerUserService";
} from "Common/Server/Services/MonitorOwnerUserService";
import MonitorProbeService, {
Service as MonitorProbeServiceType,
} from "CommonServer/Services/MonitorProbeService";
} from "Common/Server/Services/MonitorProbeService";
import MonitorSecretService, {
Service as MonitorSecretServiceType,
} from "CommonServer/Services/MonitorSecretService";
} from "Common/Server/Services/MonitorSecretService";
import MonitorService, {
Service as MonitorServiceType,
} from "CommonServer/Services/MonitorService";
} from "Common/Server/Services/MonitorService";
import MonitorStatusService, {
Service as MonitorStatusServiceType,
} from "CommonServer/Services/MonitorStatusService";
} from "Common/Server/Services/MonitorStatusService";
import MonitorTimelineStatusService, {
Service as MonitorTimelineStatusServiceType,
} from "CommonServer/Services/MonitorStatusTimelineService";
} from "Common/Server/Services/MonitorStatusTimelineService";
import OnCallDutyPolicyCustomFieldService, {
Service as OnCallDutyPolicyCustomFieldServiceType,
} from "CommonServer/Services/OnCallDutyPolicyCustomFieldService";
} from "Common/Server/Services/OnCallDutyPolicyCustomFieldService";
import OnCallDutyPolicyEscalationRuleScheduleService, {
Service as OnCallDutyPolicyEscalationRuleScheduleServiceType,
} from "CommonServer/Services/OnCallDutyPolicyEscalationRuleScheduleService";
} from "Common/Server/Services/OnCallDutyPolicyEscalationRuleScheduleService";
import OnCallDutyPolicyEscalationRuleService, {
Service as OnCallDutyPolicyEscalationRuleServiceType,
} from "CommonServer/Services/OnCallDutyPolicyEscalationRuleService";
} from "Common/Server/Services/OnCallDutyPolicyEscalationRuleService";
import OnCallDutyPolicyEscalationRuleTeamService, {
Service as OnCallDutyPolicyEscalationRuleTeamServiceType,
} from "CommonServer/Services/OnCallDutyPolicyEscalationRuleTeamService";
} from "Common/Server/Services/OnCallDutyPolicyEscalationRuleTeamService";
import OnCallDutyPolicyEscalationRuleUserService, {
Service as OnCallDutyPolicyEscalationRuleUserServiceType,
} from "CommonServer/Services/OnCallDutyPolicyEscalationRuleUserService";
} from "Common/Server/Services/OnCallDutyPolicyEscalationRuleUserService";
import OnCallDutyPolicyExecutionLogService, {
Service as OnCallDutyPolicyExecutionLogServiceType,
} from "CommonServer/Services/OnCallDutyPolicyExecutionLogService";
} from "Common/Server/Services/OnCallDutyPolicyExecutionLogService";
import OnCallDutyPolicyExecutionLogTimelineService, {
Service as OnCallDutyPolicyExecutionLogTimelineServiceType,
} from "CommonServer/Services/OnCallDutyPolicyExecutionLogTimelineService";
} from "Common/Server/Services/OnCallDutyPolicyExecutionLogTimelineService";
import OnCallDutyPolicyScheduleLayerService, {
Service as OnCallDutyPolicyScheduleLayerServiceType,
} from "CommonServer/Services/OnCallDutyPolicyScheduleLayerService";
} from "Common/Server/Services/OnCallDutyPolicyScheduleLayerService";
import OnCallDutyPolicyScheduleLayerUserService, {
Service as OnCallDutyPolicyScheduleLayerUserServiceType,
} from "CommonServer/Services/OnCallDutyPolicyScheduleLayerUserService";
} from "Common/Server/Services/OnCallDutyPolicyScheduleLayerUserService";
import OnCallDutyPolicyScheduleService, {
Service as OnCallDutyPolicyScheduleServiceType,
} from "CommonServer/Services/OnCallDutyPolicyScheduleService";
} from "Common/Server/Services/OnCallDutyPolicyScheduleService";
import OnCallDutyPolicyService, {
Service as OnCallDutyPolicyServiceType,
} from "CommonServer/Services/OnCallDutyPolicyService";
} from "Common/Server/Services/OnCallDutyPolicyService";
import ProjectCallSMSConfigService, {
Service as ProjectCallSMSConfigServiceType,
} from "CommonServer/Services/ProjectCallSMSConfigService";
} from "Common/Server/Services/ProjectCallSMSConfigService";
import ProjectSmtpConfigService, {
Service as ProjectSMTPConfigServiceType,
} from "CommonServer/Services/ProjectSmtpConfigService";
} from "Common/Server/Services/ProjectSmtpConfigService";
import PromoCodeService, {
Service as PromoCodeServiceType,
} from "CommonServer/Services/PromoCodeService";
} from "Common/Server/Services/PromoCodeService";
import ResellerService, {
Service as ResellerServiceType,
} from "CommonServer/Services/ResellerService";
} from "Common/Server/Services/ResellerService";
import ScheduledMaintenanceCustomFieldService, {
Service as ScheduledMaintenanceCustomFieldServiceType,
} from "CommonServer/Services/ScheduledMaintenanceCustomFieldService";
} from "Common/Server/Services/ScheduledMaintenanceCustomFieldService";
import ScheduledMaintenanceInternalNoteService, {
Service as ScheduledMaintenanceInternalNoteServiceType,
} from "CommonServer/Services/ScheduledMaintenanceInternalNoteService";
} from "Common/Server/Services/ScheduledMaintenanceInternalNoteService";
import ScheduledMaintenanceNoteTemplateService, {
Service as ScheduledMaintenanceNoteTemplateServiceType,
} from "CommonServer/Services/ScheduledMaintenanceNoteTemplateService";
} from "Common/Server/Services/ScheduledMaintenanceNoteTemplateService";
import ScheduledMaintenanceOwnerTeamService, {
Service as ScheduledMaintenanceOwnerTeamServiceType,
} from "CommonServer/Services/ScheduledMaintenanceOwnerTeamService";
} from "Common/Server/Services/ScheduledMaintenanceOwnerTeamService";
import ScheduledMaintenanceOwnerUserService, {
Service as ScheduledMaintenanceOwnerUserServiceType,
} from "CommonServer/Services/ScheduledMaintenanceOwnerUserService";
} from "Common/Server/Services/ScheduledMaintenanceOwnerUserService";
import ScheduledMaintenancePublicNoteService, {
Service as ScheduledMaintenancePublicNoteServiceType,
} from "CommonServer/Services/ScheduledMaintenancePublicNoteService";
} from "Common/Server/Services/ScheduledMaintenancePublicNoteService";
import ScheduledMaintenanceService, {
Service as ScheduledMaintenanceServiceType,
} from "CommonServer/Services/ScheduledMaintenanceService";
} from "Common/Server/Services/ScheduledMaintenanceService";
import ScheduledMaintenanceStateService, {
Service as ScheduledMaintenanceStateServiceType,
} from "CommonServer/Services/ScheduledMaintenanceStateService";
} from "Common/Server/Services/ScheduledMaintenanceStateService";
import ScheduledMaintenanceStateTimelineService, {
Service as ScheduledMaintenanceStateTimelineServiceType,
} from "CommonServer/Services/ScheduledMaintenanceStateTimelineService";
} from "Common/Server/Services/ScheduledMaintenanceStateTimelineService";
import ServiceCatalogOwnerTeamService, {
Service as ServiceCatalogOwnerTeamServiceType,
} from "CommonServer/Services/ServiceCatalogOwnerTeamService";
} from "Common/Server/Services/ServiceCatalogOwnerTeamService";
import ServiceCatalogOwnerUserService, {
Service as ServiceCatalogOwnerUserServiceType,
} from "CommonServer/Services/ServiceCatalogOwnerUserService";
} from "Common/Server/Services/ServiceCatalogOwnerUserService";
import ServiceCatalogService, {
Service as ServiceCatalogServiceType,
} from "CommonServer/Services/ServiceCatalogService";
} from "Common/Server/Services/ServiceCatalogService";
import ServiceCopilotCodeRepositoryService, {
Service as ServiceCopilotCodeRepositoryType,
} from "CommonServer/Services/ServiceCopilotCodeRepositoryService";
} from "Common/Server/Services/ServiceCopilotCodeRepositoryService";
import ServiceCatalogDependencyService, {
Service as ServiceCatalogDependencyServiceType,
} from "CommonServer/Services/ServiceCatalogDependencyService";
import ServiceCatalogMonitor from "Model/Models/ServiceCatalogMonitor";
} from "Common/Server/Services/ServiceCatalogDependencyService";
import ServiceCatalogMonitor from "Common/Models/DatabaseModels/ServiceCatalogMonitor";
import ServiceCatalogMonitorService, {
Service as ServiceCatalogMonitorServiceType,
} from "CommonServer/Services/ServiceCatalogMonitorService";
} from "Common/Server/Services/ServiceCatalogMonitorService";
import ServiceCatalogTelemetryService from "Model/Models/ServiceCatalogTelemetryService";
import ServiceCatalogTelemetryService from "Common/Models/DatabaseModels/ServiceCatalogTelemetryService";
import ServiceCatalogTelemetryServiceService, {
Service as ServiceCatalogTelemetryServiceServiceType,
} from "CommonServer/Services/ServiceCatalogTelemetryServiceService";
} from "Common/Server/Services/ServiceCatalogTelemetryServiceService";
import ShortLinkService, {
Service as ShortLinkServiceType,
} from "CommonServer/Services/ShortLinkService";
} from "Common/Server/Services/ShortLinkService";
import SmsLogService, {
Service as SmsLogServiceType,
} from "CommonServer/Services/SmsLogService";
} from "Common/Server/Services/SmsLogService";
import SpanService, {
SpanService as SpanServiceType,
} from "CommonServer/Services/SpanService";
} from "Common/Server/Services/SpanService";
import StatusPageAnnouncementService, {
Service as StatusPageAnnouncementServiceType,
} from "CommonServer/Services/StatusPageAnnouncementService";
} from "Common/Server/Services/StatusPageAnnouncementService";
import StatusPageCustomFieldService, {
Service as StatusPageCustomFieldServiceType,
} from "CommonServer/Services/StatusPageCustomFieldService";
} from "Common/Server/Services/StatusPageCustomFieldService";
import StatusPageFooterLinkService, {
Service as StatusPageFooterLinkServiceType,
} from "CommonServer/Services/StatusPageFooterLinkService";
} from "Common/Server/Services/StatusPageFooterLinkService";
import StatusPageGroupService, {
Service as StatusPageGroupServiceType,
} from "CommonServer/Services/StatusPageGroupService";
} from "Common/Server/Services/StatusPageGroupService";
import StatusPageHeaderLinkService, {
Service as StatusPageHeaderLinkServiceType,
} from "CommonServer/Services/StatusPageHeaderLinkService";
} from "Common/Server/Services/StatusPageHeaderLinkService";
import StatusPageHistoryChartBarColorRuleService, {
Service as StatusPageHistoryChartBarColorRuleServiceType,
} from "CommonServer/Services/StatusPageHistoryChartBarColorRuleService";
} from "Common/Server/Services/StatusPageHistoryChartBarColorRuleService";
import StatusPageOwnerTeamService, {
Service as StatusPageOwnerTeamServiceType,
} from "CommonServer/Services/StatusPageOwnerTeamService";
} from "Common/Server/Services/StatusPageOwnerTeamService";
import StatusPageOwnerUserService, {
Service as StatusPageOwnerUserServiceType,
} from "CommonServer/Services/StatusPageOwnerUserService";
} from "Common/Server/Services/StatusPageOwnerUserService";
import StatusPagePrivateUserService, {
Service as StatusPagePrivateUserServiceType,
} from "CommonServer/Services/StatusPagePrivateUserService";
} from "Common/Server/Services/StatusPagePrivateUserService";
import StatusPageResourceService, {
Service as StatusPageResourceServiceType,
} from "CommonServer/Services/StatusPageResourceService";
} from "Common/Server/Services/StatusPageResourceService";
import StatusPageSSOService, {
Service as StatusPageSSOServiceType,
} from "CommonServer/Services/StatusPageSsoService";
} from "Common/Server/Services/StatusPageSsoService";
import TeamMemberService, {
TeamMemberService as TeamMemberServiceType,
} from "CommonServer/Services/TeamMemberService";
} from "Common/Server/Services/TeamMemberService";
import TeamPermissionService, {
Service as TeamPermissionServiceType,
} from "CommonServer/Services/TeamPermissionService";
} from "Common/Server/Services/TeamPermissionService";
import TeamService, {
Service as TeamServiceType,
} from "CommonServer/Services/TeamService";
} from "Common/Server/Services/TeamService";
import TelemetryServiceService, {
Service as TelemetryServiceServiceType,
} from "CommonServer/Services/TelemetryServiceService";
} from "Common/Server/Services/TelemetryServiceService";
import TelemetryUsageBillingService, {
Service as TelemetryUsageBillingServiceType,
} from "CommonServer/Services/TelemetryUsageBillingService";
} from "Common/Server/Services/TelemetryUsageBillingService";
import UserNotificationRuleService, {
Service as UserNotificationRuleServiceType,
} from "CommonServer/Services/UserNotificationRuleService";
} from "Common/Server/Services/UserNotificationRuleService";
import UserNotificationSettingService, {
Service as UserNotificationSettingServiceType,
} from "CommonServer/Services/UserNotificationSettingService";
} from "Common/Server/Services/UserNotificationSettingService";
import UserOnCallLogService, {
Service as UserNotificationLogServiceType,
} from "CommonServer/Services/UserOnCallLogService";
} from "Common/Server/Services/UserOnCallLogService";
import UserService, {
Service as UserServiceType,
} from "CommonServer/Services/UserService";
} from "Common/Server/Services/UserService";
import WorkflowLogService, {
Service as WorkflowLogServiceType,
} from "CommonServer/Services/WorkflowLogService";
} from "Common/Server/Services/WorkflowLogService";
import WorkflowService, {
Service as WorkflowServiceType,
} from "CommonServer/Services/WorkflowService";
} from "Common/Server/Services/WorkflowService";
import WorkflowVariableService, {
Service as WorkflowVariableServiceType,
} from "CommonServer/Services/WorkflowVariableService";
} from "Common/Server/Services/WorkflowVariableService";
import ProbeOwnerTeamService, {
Service as ProbeOwnerTeamServiceType,
} from "CommonServer/Services/ProbeOwnerTeamService";
} from "Common/Server/Services/ProbeOwnerTeamService";
import ProbeOwnerUserService, {
Service as ProbeOwnerUserServiceType,
} from "CommonServer/Services/ProbeOwnerUserService";
} from "Common/Server/Services/ProbeOwnerUserService";
import FeatureSet from "CommonServer/Types/FeatureSet";
import Express, { ExpressApplication } from "CommonServer/Utils/Express";
import Log from "Model/AnalyticsModels/Log";
import Metric from "Model/AnalyticsModels/Metric";
import MonitorMetricsByMinute from "Model/AnalyticsModels/MonitorMetricsByMinute";
import Span from "Model/AnalyticsModels/Span";
import ApiKey from "Model/Models/ApiKey";
import ApiKeyPermission from "Model/Models/ApiKeyPermission";
import CallLog from "Model/Models/CallLog";
import Domain from "Model/Models/Domain";
import EmailLog from "Model/Models/EmailLog";
import EmailVerificationToken from "Model/Models/EmailVerificationToken";
import Incident from "Model/Models/Incident";
import IncidentCustomField from "Model/Models/IncidentCustomField";
import IncidentInternalNote from "Model/Models/IncidentInternalNote";
import IncidentNoteTemplate from "Model/Models/IncidentNoteTemplate";
import IncidentOwnerTeam from "Model/Models/IncidentOwnerTeam";
import IncidentOwnerUser from "Model/Models/IncidentOwnerUser";
import IncidentPublicNote from "Model/Models/IncidentPublicNote";
import IncidentSeverity from "Model/Models/IncidentSeverity";
import IncidentState from "Model/Models/IncidentState";
import IncidentStateTimeline from "Model/Models/IncidentStateTimeline";
import IncidentTemplate from "Model/Models/IncidentTemplate";
import IncidentTemplateOwnerTeam from "Model/Models/IncidentTemplateOwnerTeam";
import IncidentTemplateOwnerUser from "Model/Models/IncidentTemplateOwnerUser";
import Label from "Model/Models/Label";
import Monitor from "Model/Models/Monitor";
import MonitorCustomField from "Model/Models/MonitorCustomField";
import MonitorGroupOwnerTeam from "Model/Models/MonitorGroupOwnerTeam";
import MonitorGroupOwnerUser from "Model/Models/MonitorGroupOwnerUser";
import MonitorGroupResource from "Model/Models/MonitorGroupResource";
import MonitorOwnerTeam from "Model/Models/MonitorOwnerTeam";
import MonitorOwnerUser from "Model/Models/MonitorOwnerUser";
import MonitorProbe from "Model/Models/MonitorProbe";
import MonitorSecret from "Model/Models/MonitorSecret";
import MonitorStatus from "Model/Models/MonitorStatus";
import MonitorTimelineStatus from "Model/Models/MonitorStatusTimeline";
import OnCallDutyPolicy from "Model/Models/OnCallDutyPolicy";
import OnCallDutyPolicyCustomField from "Model/Models/OnCallDutyPolicyCustomField";
import OnCallDutyPolicyEscalationRule from "Model/Models/OnCallDutyPolicyEscalationRule";
import OnCallDutyPolicyEscalationRuleSchedule from "Model/Models/OnCallDutyPolicyEscalationRuleSchedule";
import OnCallDutyPolicyEscalationRuleTeam from "Model/Models/OnCallDutyPolicyEscalationRuleTeam";
import OnCallDutyPolicyEscalationRuleUser from "Model/Models/OnCallDutyPolicyEscalationRuleUser";
import OnCallDutyPolicyExecutionLog from "Model/Models/OnCallDutyPolicyExecutionLog";
import OnCallDutyPolicyExecutionLogTimeline from "Model/Models/OnCallDutyPolicyExecutionLogTimeline";
import OnCallDutyPolicySchedule from "Model/Models/OnCallDutyPolicySchedule";
import OnCallDutyPolicyScheduleLayer from "Model/Models/OnCallDutyPolicyScheduleLayer";
import OnCallDutyPolicyScheduleLayerUser from "Model/Models/OnCallDutyPolicyScheduleLayerUser";
import ProjectCallSMSConfig from "Model/Models/ProjectCallSMSConfig";
import ProjectSmtpConfig from "Model/Models/ProjectSmtpConfig";
import PromoCode from "Model/Models/PromoCode";
import Reseller from "Model/Models/Reseller";
import ScheduledMaintenance from "Model/Models/ScheduledMaintenance";
import ScheduledMaintenanceCustomField from "Model/Models/ScheduledMaintenanceCustomField";
import ScheduledMaintenanceInternalNote from "Model/Models/ScheduledMaintenanceInternalNote";
import ScheduledMaintenanceNoteTemplate from "Model/Models/ScheduledMaintenanceNoteTemplate";
import ScheduledMaintenanceOwnerTeam from "Model/Models/ScheduledMaintenanceOwnerTeam";
import ScheduledMaintenanceOwnerUser from "Model/Models/ScheduledMaintenanceOwnerUser";
import ScheduledMaintenancePublicNote from "Model/Models/ScheduledMaintenancePublicNote";
import ScheduledMaintenanceState from "Model/Models/ScheduledMaintenanceState";
import ScheduledMaintenanceStateTimeline from "Model/Models/ScheduledMaintenanceStateTimeline";
import ServiceCatalog from "Model/Models/ServiceCatalog";
import ServiceCatalogOwnerTeam from "Model/Models/ServiceCatalogOwnerTeam";
import ServiceCatalogOwnerUser from "Model/Models/ServiceCatalogOwnerUser";
import ServiceCopilotCodeRepository from "Model/Models/ServiceCopilotCodeRepository";
import ShortLink from "Model/Models/ShortLink";
import SmsLog from "Model/Models/SmsLog";
import StatusPageAnnouncement from "Model/Models/StatusPageAnnouncement";
import TelemetryExceptionService, {
Service as TelemetryExceptionServiceType,
} from "Common/Server/Services/TelemetryExceptionService";
import ExceptionInstanceService, {
ExceptionInstanceService as ExceptionInstanceServiceType,
} from "Common/Server/Services/ExceptionInstanceService";
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";
import CallLog from "Common/Models/DatabaseModels/CallLog";
import Domain from "Common/Models/DatabaseModels/Domain";
import EmailLog from "Common/Models/DatabaseModels/EmailLog";
import EmailVerificationToken from "Common/Models/DatabaseModels/EmailVerificationToken";
import Incident from "Common/Models/DatabaseModels/Incident";
import IncidentCustomField from "Common/Models/DatabaseModels/IncidentCustomField";
import IncidentInternalNote from "Common/Models/DatabaseModels/IncidentInternalNote";
import IncidentNoteTemplate from "Common/Models/DatabaseModels/IncidentNoteTemplate";
import IncidentOwnerTeam from "Common/Models/DatabaseModels/IncidentOwnerTeam";
import IncidentOwnerUser from "Common/Models/DatabaseModels/IncidentOwnerUser";
import IncidentPublicNote from "Common/Models/DatabaseModels/IncidentPublicNote";
import IncidentSeverity from "Common/Models/DatabaseModels/IncidentSeverity";
import IncidentState from "Common/Models/DatabaseModels/IncidentState";
import IncidentStateTimeline from "Common/Models/DatabaseModels/IncidentStateTimeline";
import IncidentTemplate from "Common/Models/DatabaseModels/IncidentTemplate";
import IncidentTemplateOwnerTeam from "Common/Models/DatabaseModels/IncidentTemplateOwnerTeam";
import IncidentTemplateOwnerUser from "Common/Models/DatabaseModels/IncidentTemplateOwnerUser";
import Label from "Common/Models/DatabaseModels/Label";
import Monitor from "Common/Models/DatabaseModels/Monitor";
import MonitorCustomField from "Common/Models/DatabaseModels/MonitorCustomField";
import MonitorGroupOwnerTeam from "Common/Models/DatabaseModels/MonitorGroupOwnerTeam";
import MonitorGroupOwnerUser from "Common/Models/DatabaseModels/MonitorGroupOwnerUser";
import MonitorGroupResource from "Common/Models/DatabaseModels/MonitorGroupResource";
import MonitorOwnerTeam from "Common/Models/DatabaseModels/MonitorOwnerTeam";
import MonitorOwnerUser from "Common/Models/DatabaseModels/MonitorOwnerUser";
import MonitorProbe from "Common/Models/DatabaseModels/MonitorProbe";
import MonitorSecret from "Common/Models/DatabaseModels/MonitorSecret";
import MonitorStatus from "Common/Models/DatabaseModels/MonitorStatus";
import MonitorTimelineStatus from "Common/Models/DatabaseModels/MonitorStatusTimeline";
import OnCallDutyPolicy from "Common/Models/DatabaseModels/OnCallDutyPolicy";
import OnCallDutyPolicyCustomField from "Common/Models/DatabaseModels/OnCallDutyPolicyCustomField";
import OnCallDutyPolicyEscalationRule from "Common/Models/DatabaseModels/OnCallDutyPolicyEscalationRule";
import OnCallDutyPolicyEscalationRuleSchedule from "Common/Models/DatabaseModels/OnCallDutyPolicyEscalationRuleSchedule";
import OnCallDutyPolicyEscalationRuleTeam from "Common/Models/DatabaseModels/OnCallDutyPolicyEscalationRuleTeam";
import OnCallDutyPolicyEscalationRuleUser from "Common/Models/DatabaseModels/OnCallDutyPolicyEscalationRuleUser";
import OnCallDutyPolicyExecutionLog from "Common/Models/DatabaseModels/OnCallDutyPolicyExecutionLog";
import OnCallDutyPolicyExecutionLogTimeline from "Common/Models/DatabaseModels/OnCallDutyPolicyExecutionLogTimeline";
import OnCallDutyPolicySchedule from "Common/Models/DatabaseModels/OnCallDutyPolicySchedule";
import OnCallDutyPolicyScheduleLayer from "Common/Models/DatabaseModels/OnCallDutyPolicyScheduleLayer";
import OnCallDutyPolicyScheduleLayerUser from "Common/Models/DatabaseModels/OnCallDutyPolicyScheduleLayerUser";
import ProjectCallSMSConfig from "Common/Models/DatabaseModels/ProjectCallSMSConfig";
import ProjectSmtpConfig from "Common/Models/DatabaseModels/ProjectSmtpConfig";
import PromoCode from "Common/Models/DatabaseModels/PromoCode";
import Reseller from "Common/Models/DatabaseModels/Reseller";
import ScheduledMaintenance from "Common/Models/DatabaseModels/ScheduledMaintenance";
import ScheduledMaintenanceCustomField from "Common/Models/DatabaseModels/ScheduledMaintenanceCustomField";
import ScheduledMaintenanceInternalNote from "Common/Models/DatabaseModels/ScheduledMaintenanceInternalNote";
import ScheduledMaintenanceNoteTemplate from "Common/Models/DatabaseModels/ScheduledMaintenanceNoteTemplate";
import ScheduledMaintenanceOwnerTeam from "Common/Models/DatabaseModels/ScheduledMaintenanceOwnerTeam";
import ScheduledMaintenanceOwnerUser from "Common/Models/DatabaseModels/ScheduledMaintenanceOwnerUser";
import ScheduledMaintenancePublicNote from "Common/Models/DatabaseModels/ScheduledMaintenancePublicNote";
import ScheduledMaintenanceState from "Common/Models/DatabaseModels/ScheduledMaintenanceState";
import ScheduledMaintenanceStateTimeline from "Common/Models/DatabaseModels/ScheduledMaintenanceStateTimeline";
import ServiceCatalog from "Common/Models/DatabaseModels/ServiceCatalog";
import ServiceCatalogOwnerTeam from "Common/Models/DatabaseModels/ServiceCatalogOwnerTeam";
import ServiceCatalogOwnerUser from "Common/Models/DatabaseModels/ServiceCatalogOwnerUser";
import ServiceCopilotCodeRepository from "Common/Models/DatabaseModels/ServiceCopilotCodeRepository";
import ShortLink from "Common/Models/DatabaseModels/ShortLink";
import SmsLog from "Common/Models/DatabaseModels/SmsLog";
import StatusPageAnnouncement from "Common/Models/DatabaseModels/StatusPageAnnouncement";
// Custom Fields API
import StatusPageCustomField from "Model/Models/StatusPageCustomField";
import StatusPageFooterLink from "Model/Models/StatusPageFooterLink";
import StatusPageGroup from "Model/Models/StatusPageGroup";
import StatusPageHeaderLink from "Model/Models/StatusPageHeaderLink";
import StatusPageHistoryChartBarColorRule from "Model/Models/StatusPageHistoryChartBarColorRule";
import StatusPageOwnerTeam from "Model/Models/StatusPageOwnerTeam";
import StatusPageOwnerUser from "Model/Models/StatusPageOwnerUser";
import StatusPagePrivateUser from "Model/Models/StatusPagePrivateUser";
import StatusPageResource from "Model/Models/StatusPageResource";
import StatusPageSSO from "Model/Models/StatusPageSso";
import Team from "Model/Models/Team";
import TeamMember from "Model/Models/TeamMember";
import TeamPermission from "Model/Models/TeamPermission";
import TelemetryService from "Model/Models/TelemetryService";
import TelemetryUsageBilling from "Model/Models/TelemetryUsageBilling";
import User from "Model/Models/User";
import UserNotificationRule from "Model/Models/UserNotificationRule";
import UserNotificationSetting from "Model/Models/UserNotificationSetting";
import UserOnCallLog from "Model/Models/UserOnCallLog";
import Workflow from "Model/Models/Workflow";
import WorkflowLog from "Model/Models/WorkflowLog";
import WorkflowVariable from "Model/Models/WorkflowVariable";
import ProbeOwnerTeam from "Model/Models/ProbeOwnerTeam";
import ProbeOwnerUser from "Model/Models/ProbeOwnerUser";
import ServiceCatalogDependency from "Model/Models/ServiceCatalogDependency";
import StatusPageCustomField from "Common/Models/DatabaseModels/StatusPageCustomField";
import StatusPageFooterLink from "Common/Models/DatabaseModels/StatusPageFooterLink";
import StatusPageGroup from "Common/Models/DatabaseModels/StatusPageGroup";
import StatusPageHeaderLink from "Common/Models/DatabaseModels/StatusPageHeaderLink";
import TelemetryIngestionKey from "Common/Models/DatabaseModels/TelemetryIngestionKey";
import StatusPageHistoryChartBarColorRule from "Common/Models/DatabaseModels/StatusPageHistoryChartBarColorRule";
import StatusPageOwnerTeam from "Common/Models/DatabaseModels/StatusPageOwnerTeam";
import StatusPageOwnerUser from "Common/Models/DatabaseModels/StatusPageOwnerUser";
import StatusPagePrivateUser from "Common/Models/DatabaseModels/StatusPagePrivateUser";
import StatusPageResource from "Common/Models/DatabaseModels/StatusPageResource";
import StatusPageSSO from "Common/Models/DatabaseModels/StatusPageSso";
import Team from "Common/Models/DatabaseModels/Team";
import TeamMember from "Common/Models/DatabaseModels/TeamMember";
import TeamPermission from "Common/Models/DatabaseModels/TeamPermission";
import TelemetryService from "Common/Models/DatabaseModels/TelemetryService";
import TelemetryUsageBilling from "Common/Models/DatabaseModels/TelemetryUsageBilling";
import User from "Common/Models/DatabaseModels/User";
import UserNotificationRule from "Common/Models/DatabaseModels/UserNotificationRule";
import UserNotificationSetting from "Common/Models/DatabaseModels/UserNotificationSetting";
import UserOnCallLog from "Common/Models/DatabaseModels/UserOnCallLog";
import Workflow from "Common/Models/DatabaseModels/Workflow";
import WorkflowLog from "Common/Models/DatabaseModels/WorkflowLog";
import WorkflowVariable from "Common/Models/DatabaseModels/WorkflowVariable";
import ProbeOwnerTeam from "Common/Models/DatabaseModels/ProbeOwnerTeam";
import ProbeOwnerUser from "Common/Models/DatabaseModels/ProbeOwnerUser";
import ServiceCatalogDependency from "Common/Models/DatabaseModels/ServiceCatalogDependency";
import TelemetryAttribute from "Common/Models/AnalyticsModels/TelemetryAttribute";
import ExceptionInstance from "Common/Models/AnalyticsModels/ExceptionInstance";
import TelemetyException from "Common/Models/DatabaseModels/TelemetryException";
const BaseAPIFeatureSet: FeatureSet = {
init: async (): Promise<void> => {
@@ -411,6 +432,30 @@ const BaseAPIFeatureSet: FeatureSet = {
const APP_NAME: string = "api";
app.use(
`/${APP_NAME.toLocaleLowerCase()}`,
new BaseAnalyticsAPI<TelemetryAttribute, TelemetryAttributeServiceType>(
TelemetryAttribute,
TelemetryAttributeService,
).getRouter(),
);
app.use(
`/${APP_NAME.toLocaleLowerCase()}`,
new BaseAnalyticsAPI<ExceptionInstance, ExceptionInstanceServiceType>(
ExceptionInstance,
ExceptionInstanceService,
).getRouter(),
);
app.use(
`/${APP_NAME.toLocaleLowerCase()}`,
new BaseAPI<TelemetyException, TelemetryExceptionServiceType>(
TelemetyException,
TelemetryExceptionService,
).getRouter(),
);
app.use(
`/${APP_NAME.toLocaleLowerCase()}`,
new BaseAnalyticsAPI<Log, LogServiceType>(Log, LogService).getRouter(),
@@ -432,6 +477,14 @@ const BaseAPIFeatureSet: FeatureSet = {
>(MonitorMetricsByMinute, MonitorMetricsByMinuteService).getRouter(),
);
app.use(
`/${APP_NAME.toLocaleLowerCase()}`,
new BaseAPI<TelemetryIngestionKey, TelemetryIngestionKeyServiceType>(
TelemetryIngestionKey,
TelemetryIngestionKeyService,
).getRouter(),
);
app.use(
`/${APP_NAME.toLocaleLowerCase()}`,
new BaseAnalyticsAPI<Span, SpanServiceType>(
@@ -1100,6 +1153,10 @@ const BaseAPIFeatureSet: FeatureSet = {
new UserNotificationLogTimelineAPI().getRouter(),
);
app.use(`/${APP_NAME.toLocaleLowerCase()}`, new UserCallAPI().getRouter());
app.use(
`/${APP_NAME.toLocaleLowerCase()}`,
new UserTwoFactorAuthAPI().getRouter(),
);
app.use(`/${APP_NAME.toLocaleLowerCase()}`, new UserEmailAPI().getRouter());
app.use(`/${APP_NAME.toLocaleLowerCase()}`, new UserSMSAPI().getRouter());
app.use(`/${APP_NAME.toLocaleLowerCase()}`, new Ingestor().getRouter());

View File

@@ -48,7 +48,7 @@ llm:
Run the following command to start the LLM Server:
```bash
docker-compose up -d
docker compose up -d
```
You can now access the LLM Server at `http://localhost:8547`.

View File

@@ -107,7 +107,7 @@ jobs:
steps:
# Run Reliability Copilot in Doker Container
# Run Reliability Copilot in Docker Container
- name: Run Copilot
run: |
docker run --rm \

View File

@@ -49,7 +49,7 @@ npm start
If you don't like to use npm or do not have it installed, run this instead:
```
# Read env vars from config.env file and run docker-compose up.
# Read env vars from config.env file and run docker compose up.
(export $(grep -v '^#' config.env | xargs) && docker compose up --remove-orphans -d)
# Use sudo if you're having permission issues with binding ports.

View File

@@ -38,7 +38,7 @@ services:
Then run the following command:
```
docker-compose up -d
docker compose up -d
```
If you are self hosting OneUptime, you can change `ONEUPTIME_URL` to your custom self hosted instance.

View File

@@ -32,23 +32,25 @@ You can find the full list of supported sources [here](https://www.fluentd.org/d
- **Step 1: Install Fluentd on your system** - You can install Fluentd using the instructions provided [here](https://docs.fluentd.org/installation)
- **Step 2: Sign up for OneUptime account** - You can sign up for a free account [here](https://oneuptime.com). Please note while the account is free, log ingestion is a paid feature. You can find more details about the pricing [here](https://oneuptime.com/pricing).
- **Step 3: Create OneUptime Project** - Once you have the account, you can create a project from the OneUptime dashboard. If you need any help with creating a project or have any questions, please reach out to us at support@oneuptime.com
- **Step 4: Create a OneUptime Telemetry Service on OneUptime Dashboard**
- **Step 4: Create Telemetry Ingestion Token** - Once you have created a OneUptime account, you can create a telemetry ingestion token to ingest logs, metrics and traces from your application.
On the telemetry service page, click on "Create Telemetry Service" button.
After you sign up to OneUptime and create a project. Click on "More" in the Navigation bar and click on "Project Settings".
![Create Service](/docs/static/images/CreateService.png)
On the Telemetry Ingestion Key page, click on "Create Ingestion Key" to create a token.
Once you create a telemetry service, click on "View Service" and you will be redirected to the telemetry service page.
![Create Service](/docs/static/images/TelemetryIngestionKeys.png)
Click on View Service Token and copy the token. You will need this token to configure the telemetry service. **Please keep this token safe.**
Once you created a token, click on "View" to view the token.
![View Service](/docs/static/images/ViewServiceToken.png)
![View Service](/docs/static/images/TelemetryIngestionKeyView.png)
## Configuration
You can use the following configuration to send the telemetry data to the OneUptime HTTP Source. You can add this configuration to the fluentd configuration file. The configuration file is usually located at `/etc/fluentd/fluent.conf` or `/etc/td-agent/td-agent.conf`.
You need to replace the `YOUR_SERVICE_TOKEN` with the token you created in the previous step. You also need to replace the `YOUR_SERVICE_NAME` with the name of your service. name of the service can be any name you like. If the service does not exist in OneUptime, it will be created automatically.
```yaml
# Match all patterns
<match **>
@@ -57,7 +59,7 @@ You can use the following configuration to send the telemetry data to the OneUpt
endpoint https://oneuptime.com/fluentd/logs
open_timeout 2
headers {"x-oneuptime-service-token":"<YOUR_SERVICE_TOKEN>"}
headers {"x-oneuptime-token":"YOUR_SERVICE_TOKEN", "x-oneuptime-service-name":"YOUR_SERVICE_NAME"}
content_type application/json
json_array true
@@ -93,7 +95,7 @@ An example of full configuration file is shown below:
endpoint https://oneuptime.com/fluentd/logs
open_timeout 2
headers {"x-oneuptime-service-token":"<YOUR_SERVICE_TOKEN>"}
headers {"x-oneuptime-token":"YOUR_SERVICE_TOKEN", "x-oneuptime-service-name":"YOUR_SERVICE_NAME"}
content_type application/json
json_array true

View File

@@ -1,20 +1,18 @@
# Integrate OpenTelemetry (logging, metrics and traces) with OneUptime.
### Step 1 - Create a OneUptime Telemetry Service.
### Step 1 - Create Telemetry Ingestion Token.
Once you have created a OneUptime account, you can create a telemetry service by clicking on the "Add Service" button.
Once you have created a OneUptime account, you can create a telemetry ingestion token to ingest logs, metrics and traces from your application.
After you sign up to OneUptime and create a project. Click on more in the Navigation bar and click on "Telemetry".
After you sign up to OneUptime and create a project. Click on "More" in the Navigation bar and click on "Project Settings".
On the telemetry service page, click on "Create Telemetry Service" button.
On the Telemetry Ingestion Key page, click on "Create Ingestion Key" to create a token.
![Create Service](/docs/static/images/CreateService.png)
![Create Service](/docs/static/images/TelemetryIngestionKeys.png)
Once you create a telemetry service, click on "View Service" and you will be redirected to the telemetry service page.
Once you created a token, click on "View" to view the token.
Click on View Service Token and copy the token. You will need this token to configure the telemetry service. Please keep this token safe.
![View Service](/docs/static/images/ViewServiceToken.png)
![View Service](/docs/static/images/TelemetryIngestionKeyView.png)
### Step 2 - Configure the telemetry service in your application.
@@ -42,14 +40,17 @@ Once you have configured the telemetry service in your application, you can inte
| Environment Variable | Value |
| --- | --- |
| OTEL_EXPORTER_OTLP_HEADERS | x-oneuptime-service-token=<YOUR_ONEUPTIME_SERVICE_TOKEN> |
| OTEL_EXPORTER_OTLP_HEADERS | x-oneuptime-token=YOUR_ONEUPTIME_SERVICE_TOKEN |
| OTEL_EXPORTER_OTLP_ENDPOINT | https://otlp.oneuptime.com |
| OTEL_SERVICE_NAME | NAME_OF_YOUR_SERVICE |
**Example**
```bash
export OTEL_EXPORTER_OTLP_HEADERS=x-oneuptime-service-token=9c8806e0-a4aa-11ee-be95-010d5967b068
export OTEL_EXPORTER_OTLP_HEADERS=x-oneuptime-token=9c8806e0-a4aa-11ee-be95-010d5967b068
export OTEL_EXPORTER_OTLP_ENDPOINT=https://otlp.oneuptime.com
export OTEL_SERVICE_NAME=my-service
```
If you're self-hosting oneuptime, this can be changed to your self hosted OpenTelemetry collector endpoint (eg: `http(s)://<your-oneuptime-host>/otlp`)

View File

@@ -1,16 +1,16 @@
import { ContentPath, StaticPath, ViewsPath } from "./Utils/Config";
import DocsNav, { NavGroup, NavLink } from "./Utils/Nav";
import DocsRender from "./Utils/Render";
import FeatureSet from "CommonServer/Types/FeatureSet";
import FeatureSet from "Common/Server/Types/FeatureSet";
import Express, {
ExpressApplication,
ExpressRequest,
ExpressResponse,
ExpressStatic,
} from "CommonServer/Utils/Express";
import Response from "CommonServer/Utils/Response";
import LocalFile from "CommonServer/Utils/LocalFile";
import logger from "CommonServer/Utils/Logger";
} from "Common/Server/Utils/Express";
import Response from "Common/Server/Utils/Response";
import LocalFile from "Common/Server/Utils/LocalFile";
import logger from "Common/Server/Utils/Logger";
import "ejs";
const DocsFeatureSet: FeatureSet = {
@@ -21,6 +21,7 @@ const DocsFeatureSet: FeatureSet = {
res.redirect("/docs/introduction/getting-started");
});
// Handle requests to specific documentation pages
app.get(
"/docs/as-markdown/:categorypath/:pagepath",
async (req: ExpressRequest, res: ExpressResponse) => {
@@ -49,18 +50,19 @@ const DocsFeatureSet: FeatureSet = {
const fullPath: string =
`${_req.params["categorypath"]}/${_req.params["pagepath"]}`.toLowerCase();
// read file from Content folder.
// Read Markdown file from content folder
let contentInMarkdown: string = await LocalFile.read(
`${ContentPath}/${fullPath}.md`,
);
// remove first line from content because we dont want to show title in content. Title is already in nav.
// Remove first line (title) from content as it is already present in the navigation
contentInMarkdown = contentInMarkdown.split("\n").slice(1).join("\n");
// Render Markdown content to HTML
const renderedContent: string =
await DocsRender.render(contentInMarkdown);
// Find the current category and link from DocsNav
const currentCategory: NavGroup | undefined = DocsNav.find(
(category: NavGroup) => {
return category.links.find((link: NavLink) => {
@@ -74,6 +76,7 @@ const DocsFeatureSet: FeatureSet = {
return link.url.toLocaleLowerCase().includes(fullPath);
});
// If no category or nav link matches the path, render 'not found'
if (!currentCategory || !currrentNavLink) {
// render not found.

Binary file not shown.

After

Width:  |  Height:  |  Size: 115 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 187 KiB

View File

@@ -1,4 +1,4 @@
import Markdown, { MarkdownContentType } from "CommonServer/Types/Markdown";
import Markdown, { MarkdownContentType } from "Common/Server/Types/Markdown";
// This class is responsible for rendering markdown content to HTML
export default class DocsRender {

View File

@@ -7,8 +7,8 @@ import Express, {
ExpressApplication,
ExpressRequest,
ExpressResponse,
} from "CommonServer/Utils/Express";
import logger from "CommonServer/Utils/Logger";
} from "Common/Server/Utils/Express";
import logger from "Common/Server/Utils/Logger";
const app: ExpressApplication = Express.getExpressApp();

View File

@@ -10,16 +10,18 @@ import OneUptimeDate from "Common/Types/Date";
import Dictionary from "Common/Types/Dictionary";
import { JSONObject } from "Common/Types/JSON";
import API from "Common/Utils/API";
import FeatureSet from "CommonServer/Types/FeatureSet";
import FeatureSet from "Common/Server/Types/FeatureSet";
import Express, {
ExpressApplication,
ExpressRequest,
ExpressResponse,
ExpressStatic,
} from "CommonServer/Utils/Express";
} from "Common/Server/Utils/Express";
import "ejs";
import builder from "xmlbuilder2";
import { XMLBuilder } from "xmlbuilder2/lib/interfaces";
import OSSFriends, { OSSFriend } from "./Utils/OSSFriends";
import Reviews from "./Utils/Reviews";
const HomeFeatureSet: FeatureSet = {
init: async (): Promise<void> => {
@@ -27,12 +29,17 @@ const HomeFeatureSet: FeatureSet = {
//Routes
app.get("/", (_req: ExpressRequest, res: ExpressResponse) => {
const { reviewsList1, reviewsList2, reviewsList3 } = Reviews;
res.render(`${ViewsPath}/index`, {
support: false,
footerCards: true,
cta: true,
blackLogo: false,
requestDemoCta: false,
reviewsList1,
reviewsList2,
reviewsList3,
});
});
@@ -50,6 +57,20 @@ const HomeFeatureSet: FeatureSet = {
res.render(`${ViewsPath}/support`);
});
app.get(
"/oss-friends",
async (_req: ExpressRequest, res: ExpressResponse) => {
res.render(`${ViewsPath}/oss-friends`, {
ossFriends: OSSFriends.map((friend: OSSFriend) => {
return {
...friend,
repositoryUrl: friend.repositoryUrl.toString(),
};
}),
});
},
);
app.get("/pricing", (_req: ExpressRequest, res: ExpressResponse) => {
const pricing: Array<JSONObject> = [
{

Binary file not shown.

After

Width:  |  Height:  |  Size: 118 KiB

View File

@@ -1,5 +1,5 @@
import AnalyticsBaseModel from "Common/AnalyticsModels/BaseModel";
import BaseModel from "Common/Models/BaseModel";
import AnalyticsBaseModel from "Common/Models/AnalyticsModels/AnalyticsBaseModel/AnalyticsBaseModel";
import BaseModel from "Common/Models/DatabaseModels/DatabaseBaseModel/DatabaseBaseModel";
import HTTPErrorResponse from "Common/Types/API/HTTPErrorResponse";
import HTTPResponse from "Common/Types/API/HTTPResponse";
import URL from "Common/Types/API/URL";
@@ -9,8 +9,8 @@ import { JSONArray, JSONObject, JSONObjectOrArray } from "Common/Types/JSON";
import JSONFunctions from "Common/Types/JSONFunctions";
import Text from "Common/Types/Text";
import API from "Common/Utils/API";
import LocalCache from "CommonServer/Infrastructure/LocalCache";
import Markdown, { MarkdownContentType } from "CommonServer/Types/Markdown";
import LocalCache from "Common/Server/Infrastructure/LocalCache";
import Markdown, { MarkdownContentType } from "Common/Server/Types/Markdown";
export interface BlogPostAuthor {
username: string;

View File

@@ -1,5 +1,5 @@
import { ViewsPath } from "./Config";
import { ExpressResponse } from "CommonServer/Utils/Express";
import { ExpressResponse } from "Common/Server/Utils/Express";
export default class NotFoundUtil {
public static renderNotFound(res: ExpressResponse): void {

View File

@@ -0,0 +1,48 @@
import URL from "Common/Types/API/URL";
export interface OSSFriend {
name: string;
description: string;
repositoryUrl: URL;
}
const OSSFriends: OSSFriend[] = [
{
name: "Airbyte",
description:
"Airbyte is an open-source EL(T) platform that helps you replicate your data in your warehouses, lakes, and databases.",
repositoryUrl: URL.fromString("https://github.com/airbytehq/airbyte"),
},
{
name: "Cal.com",
description:
"Open Source Scheduling: Send a link and meet or build an entire marketplace for humans to connect.",
repositoryUrl: URL.fromString("https://github.com/calcom/cal.com"),
},
{
name: "Infiscal",
description:
"Infisical is an open-source end-to-end platform to manage secrets and configuration across your team and infrastructure.",
repositoryUrl: URL.fromString("https://github.com/Infisical/infisical"),
},
{
name: "Metabase",
description:
"Metabase is the easy, open-source way for everyone in your company to ask questions and learn from data.",
repositoryUrl: URL.fromString("https://github.com/metabase/metabase"),
},
{
name: "Posthog",
description:
"PostHog is open-source product analytics, built for developers.",
repositoryUrl: URL.fromString("https://github.com/PostHog/posthog"),
},
{
name: "Twenty",
description:
"Twenty is building an open-source modern CRM. It's alternative to Salesforce and HubSpot.",
repositoryUrl: URL.fromString("https://github.com/twentyhq/twenty"),
},
];
export default OSSFriends;

View File

@@ -0,0 +1,270 @@
export interface Review {
name: string;
text: string;
title: string;
}
const reviews: Review[] = [
{
name: "Charlie",
text: "I love the on-call rotation setup. It has made scheduling so much easier.",
title: "Great on-call rotation",
},
{
name: "Diana",
text: "The performance tracking and log analysis tools are very powerful. Highly recommend!",
title: "Powerful tools",
},
{
name: "Ethan",
text: "OneUptime's dashboard is very user-friendly and intuitive.",
title: "User-friendly dashboard",
},
{
name: "Fiona",
text: "The uptime monitoring is very reliable. We haven't missed a single alert.",
title: "Reliable monitoring",
},
{
name: "George",
text: "The customer support team is very responsive and helpful.",
title: "Excellent customer support",
},
{
name: "Hannah",
text: "Setting up tests and securing our services has never been easier.",
title: "Easy setup and security",
},
{
name: "Ian",
text: "The status page feature is fantastic. Our customers appreciate the transparency.",
title: "Fantastic status page",
},
{
name: "Jenna",
text: "OneUptime has improved our incident response time dramatically.",
title: "Improved response time",
},
{
name: "Kevin",
text: "The integration with our existing tools was seamless.",
title: "Seamless integration",
},
{
name: "Laura",
text: "The alerts are very customizable, which is great for our specific needs.",
title: "Customizable alerts",
},
{
name: "Mike",
text: "The performance tracking has helped us identify and fix issues quickly.",
title: "Quick issue resolution",
},
{
name: "Nina",
text: "The log analysis feature is very detailed and insightful.",
title: "Detailed log analysis",
},
{
name: "Anderson, GK2 Cloud",
text: "Thanks for building OneUptime, it really is fantastic. We are getting more excited every day!",
title: "OneUptime is fantastic!",
},
{
name: "Reg, Skillable",
text: "We use OneUptime to reliably monitor endpoint availability globally, and it delivers.",
title: "OneUptime delivers!",
},
{
name: "Oscar",
text: "OneUptime has made our monitoring process much more efficient.",
title: "Efficient monitoring",
},
{
name: "Paula",
text: "The incident management workflow is very well thought out.",
title: "Well-designed workflow",
},
{
name: "Quinn",
text: "The on-call rotation feature has reduced our scheduling headaches.",
title: "Reduced scheduling headaches",
},
{
name: "Rachel",
text: "The status page is very professional and easy to update.",
title: "Professional status page",
},
{
name: "Sam",
text: "The alerts are very accurate and timely.",
title: "Accurate alerts",
},
{
name: "Tina",
text: "The customer support is always ready to help with any issues.",
title: "Supportive customer service",
},
{
name: "Umar",
text: "The performance tracking has given us great insights into our system's health.",
title: "Great insights",
},
{
name: "Vera",
text: "The log analysis has helped us debug errors much faster.",
title: "Faster debugging",
},
{
name: "Will",
text: "The uptime monitoring is very dependable.",
title: "Dependable monitoring",
},
{
name: "Xena",
text: "The incident management tools have streamlined our processes.",
title: "Streamlined processes",
},
{
name: "Yara",
text: "The on-call rotation setup is very flexible.",
title: "Flexible rotation setup",
},
{
name: "Zane",
text: "The status page has improved our communication with customers.",
title: "Improved communication",
},
{
name: "Aiden",
text: "The alerts are very precise and help us stay on top of issues.",
title: "Precise alerts",
},
{
name: "Bella",
text: "The performance tracking tools are very comprehensive.",
title: "Comprehensive tools",
},
{
name: "Carter",
text: "The log analysis feature is very user-friendly.",
title: "User-friendly log analysis",
},
{
name: "Daisy",
text: "OneUptime has made our monitoring and management tasks much easier.",
title: "Easier management",
},
{
name: "Eli",
text: "The incident management feature is very effective.",
title: "Effective incident management",
},
{
name: "Faith",
text: "The on-call rotation has improved our team's efficiency.",
title: "Improved efficiency",
},
{
name: "Gabe",
text: "The status page is very easy to set up and maintain.",
title: "Easy setup",
},
{
name: "Holly",
text: "The alerts are very reliable and timely.",
title: "Reliable alerts",
},
{
name: "Isaac",
text: "The performance tracking has helped us optimize our system.",
title: "Optimized system",
},
{
name: "Jade",
text: "The log analysis tools are very detailed and helpful.",
title: "Helpful log analysis",
},
{
name: "Kyle",
text: "OneUptime has made our monitoring process much more streamlined.",
title: "Streamlined monitoring",
},
{
name: "Lily",
text: "The incident management workflow is very efficient.",
title: "Efficient workflow",
},
{
name: "Mason",
text: "The on-call rotation feature is very user-friendly.",
title: "User-friendly rotation",
},
{
name: "Nora",
text: "The status page has been a great addition to our communication tools.",
title: "Great addition",
},
{
name: "Owen",
text: "The alerts are very accurate and help us respond quickly.",
title: "Quick response",
},
{
name: "Piper",
text: "The performance tracking tools are very insightful.",
title: "Insightful tools",
},
{
name: "Quincy",
text: "The log analysis feature is very comprehensive.",
title: "Comprehensive log analysis",
},
{
name: "Riley",
text: "OneUptime has made our incident management process much smoother.",
title: "Smoother process",
},
{
name: "Sophie",
text: "The on-call rotation setup is very efficient.",
title: "Efficient setup",
},
{
name: "Tyler",
text: "The status page is very professional and easy to use.",
title: "Professional and easy",
},
{
name: "Uma",
text: "The alerts are very timely and help us stay on top of issues.",
title: "Timely alerts",
},
{
name: "Victor",
text: "The performance tracking has given us great insights into our system.",
title: "Great system insights",
},
{
name: "Wendy",
text: "The log analysis tools are very detailed and useful.",
title: "Useful log analysis",
},
];
// divide reviews array into three equal lists. This is helpful for the UI
const reviewsList1: Array<Review> = [];
const reviewsList2: Array<Review> = [];
const reviewsList3: Array<Review> = [];
for (let i: number = 0; i < reviews.length; i++) {
if (i % 3 === 0) {
reviewsList1.push(reviews[i]!);
} else if (i % 3 === 1) {
reviewsList2.push(reviews[i]!);
} else {
reviewsList3.push(reviews[i]!);
}
}
export default { reviewsList1, reviewsList2, reviewsList3 };

View File

@@ -1,5 +1,5 @@
import { ViewsPath } from "./Config";
import { ExpressResponse } from "CommonServer/Utils/Express";
import { ExpressResponse } from "Common/Server/Utils/Express";
export default class ServerErrorUtil {
public static renderServerError(res: ExpressResponse): void {

View File

@@ -20,7 +20,7 @@
<div class="relative isolate overflow-hidden bg-white">
<div class="py-24 sm:py-32">
<%- include('./Partials/BlogTitleAndDescription', { title: 'Engineering Uptime - Blog by OneUptime', description: 'Latest posts on Observability, Monitoring, Reliability and more.' }) -%>
<%- include('./Partials/BlogTitleAndDescription', { title: 'Engineering Uptime', smallTitle: '- Blog by OneUptime', description: 'Latest posts on Observability, Monitoring, Reliability and more.' }) -%>
<div class="mx-auto max-w-7xl px-6 lg:px-8">

View File

@@ -20,7 +20,7 @@
<div class="relative isolate overflow-hidden bg-white">
<div class="py-24 sm:py-32">
<%- include('./Partials/BlogTitleAndDescription', { title: 'Latest posts on '+tagName, description: 'Here are some of the latest posts on '+tagName }) -%>
<%- include('./Partials/BlogTitleAndDescription', { title: 'Latest posts on '+tagName, smallTitle: "", description: 'Here are some of the latest posts on '+tagName }) -%>
<div class="mx-auto max-w-7xl px-6 lg:px-8">

View File

@@ -5,7 +5,7 @@
<div class="mx-auto max-w-8xl px-6 lg:px-8">
<div class="mx-auto max-w-4xl text-center">
<h1 class="text-3xl font-bold tracking-tight text-gray-900">OneUptime is open source observability platform.</h1>
<p class="mt-6 text-lg leading-8 text-gray-600">Monitor, Observe, Debug, Resolve. Everything you need to build reliable software in one open source platform. Get started for free today.</p>
<p class="mt-6 text-lg leading-8 text-gray-600">Monitor, Observe, Debug, Resolve. Everything you need to build reliable software in one open source platform. Get started today.</p>
<div class="mt-10 flex items-center justify-center gap-x-6">
<a href="/accounts/register" class="rounded-md bg-indigo-600 px-3.5 py-2.5 text-sm font-semibold text-white shadow-sm hover:bg-indigo-500 focus-visible:outline focus-visible:outline-2 focus-visible:outline-offset-2 focus-visible:outline-indigo-600">Get started</a>
<a href="/enterprise/demo" class="text-sm font-semibold leading-6 text-gray-900">Request Demo <span aria-hidden="true">→</span></a>

View File

@@ -1,10 +1,17 @@
<div class="mb-24">
<div class="mx-auto flex justify-center text-center ">
<h1 class="max-w-2xl text-center text-4xl font-bold tracking-tight text-gray-900">
<h1 class="max-w-5xl text-center text-6xl font-bold text-gray-900 leading-tight">
<%= title %>
</h1>
</div>
<div class="mx-auto flex justify-center text-center ">
<% if(smallTitle){ %>
<h3 class="max-w-5xl mt-5 text-center text-2xl font-medium text-gray-900 leading-tight">
<%= smallTitle %>
</h3>
<% } %>
</div>
<p class="text-xl text-center leading-8 text-gray-600 mt-8">
<p class="text-2xl text-center leading-8 text-gray-600 mt-8 leading-normal">
<%= description %>
</p>
</div>

View File

@@ -73,7 +73,7 @@
<div class="py-24 sm:py-32">
<div class="mx-auto max-w-7xl px-6 lg:px-8">
<%- include('./Partials/BlogTitleAndDescription', { title: blogPost.title , description:
<%- include('./Partials/BlogTitleAndDescription', { title: blogPost.title , smallTitle: "", description:
blogPost.description }) -%>

View File

@@ -0,0 +1,126 @@
<style>
.highlight {
background-color: yellow;
padding-left: 15px;
padding-right: 15px;
border-radius: 20px;
}
</style>
<section class="mb-32 border-gray-100 border-t-2">
<div class="relative isolate overflow-hidden bg-white px-6 py-24 sm:py-32 lg:overflow-visible lg:px-0">
<div
class="mx-auto grid max-w-2xl grid-cols-1 gap-x-8 gap-y-16 lg:mx-0 lg:max-w-none lg:grid-cols-2 lg:items-start lg:gap-y-10">
<div
class="lg:col-span-2 lg:col-start-1 lg:row-start-1 lg:mx-auto lg:grid lg:w-full lg:max-w-7xl lg:grid-cols-2 lg:gap-x-8 lg:px-8">
<div class="lg:pr-4">
<div class="lg:max-w-lg">
<div class="inline-flex space-x-6 mb-5">
<span
class="rounded-full bg-indigo-600/10 px-3 py-1 text-sm font-semibold leading-6 text-indigo-600 ring-1 ring-inset ring-indigo-600/10">Reliability
Copilot</span>
</div>
<h1 class="mt-2 text-3xl font-bold tracking-tight text-gray-900 sm:text-4xl">Spending days debugging?</h1>
<p class="mt-6 text-xl leading-8 text-gray-700 ">
OneUptime is building next frontier in software observability.
<span class="highlight">We not only find issues with your software, but also fix it for you
automatically.</span>
</p>
</div>
</div>
</div>
<div class="-ml-12 -mt-12 p-12 lg:sticky lg:top-4 lg:col-start-2 lg:row-span-2 lg:row-start-1 lg:overflow-hidden">
<img class="w-[48rem] max-w-none rounded-xl bg-gray-900 shadow-xl ring-1 ring-gray-400/10 sm:w-[57rem]"
src="/img/copilot.png" alt="">
</div>
<div
class="lg:col-span-2 lg:col-start-1 lg:row-start-2 lg:mx-auto lg:grid lg:w-full lg:max-w-7xl lg:grid-cols-2 lg:gap-x-8 lg:px-8">
<div class="lg:pr-4">
<div class="max-w-xl text-base leading-7 text-gray-700 lg:max-w-lg">
<p>
OneUptime integrates with OpenTelemetry to collect logs, metrics, traces from your software and
infrastructure. We then use generative AI to fix the issues
in your code.
<span class="highlight">All you see is a pull request with the fixes and a detailed report of what was
fixed waiting to be reviewed and merged.</span>
</p>
<ul role="list" class="mt-8 space-y-8 text-gray-600">
<li class="flex gap-x-3">
<svg class="mt-1 h-5 w-5 flex-none text-indigo-600" viewBox="0 0 20 20" fill="currentColor"
aria-hidden="true">
<path stroke-linecap="round" stroke-linejoin="round"
d="m3.75 13.5 10.5-11.25L12 10.5h8.25L9.75 21.75 12 13.5H3.75Z" />
</svg>
<span><strong class="font-semibold text-gray-900">
Automatically add telemetry code.
</strong>
No need to manually add it. Add tracing, metrics, and logs to your codebase with a single
click.
</span>
</li>
<li class="flex gap-x-3">
<svg class="mt-1 h-5 w-5 flex-none text-indigo-600" xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24" stroke-width="2.5" stroke="currentColor" class="size-6">
<path stroke-linecap="round" stroke-linejoin="round" d="M7.5 3.75H6A2.25 2.25 0 0 0 3.75 6v1.5M16.5 3.75H18A2.25 2.25 0 0 1 20.25 6v1.5m0 9V18A2.25 2.25 0 0 1 18 20.25h-1.5m-9 0H6A2.25 2.25 0 0 1 3.75 18v-1.5M15 12a3 3 0 1 1-6 0 3 3 0 0 1 6 0Z" />
</svg>
<span><strong class="font-semibold text-gray-900">Fix exceptions automatically.</strong>
When we notice exceptions in your traces or logs, we automatically fix the issue in your codebase.
</span>
</li>
<li class="flex gap-x-3">
<svg class="mt-1 h-5 w-5 flex-none text-indigo-600" viewBox="0 0 20 20" fill="currentColor"
aria-hidden="true">
<path stroke-linecap="round" stroke-linejoin="round"
d="M3 13.125C3 12.504 3.504 12 4.125 12h2.25c.621 0 1.125.504 1.125 1.125v6.75C7.5 20.496 6.996 21 6.375 21h-2.25A1.125 1.125 0 0 1 3 19.875v-6.75ZM9.75 8.625c0-.621.504-1.125 1.125-1.125h2.25c.621 0 1.125.504 1.125 1.125v11.25c0 .621-.504 1.125-1.125 1.125h-2.25a1.125 1.125 0 0 1-1.125-1.125V8.625ZM16.5 4.125c0-.621.504-1.125 1.125-1.125h2.25C20.496 3 21 3.504 21 4.125v15.75c0 .621-.504 1.125-1.125 1.125h-2.25a1.125 1.125 0 0 1-1.125-1.125V4.125Z" />
</svg>
<span><strong class="font-semibold text-gray-900">Improve performance automatically</strong>
We look at the traces that take the longest time to execute and and automatically create a pull
request with a fix.
</span>
</li>
</ul>
<p class="mt-8">
Less time looking at graphs and charts (like in other obervability tools), more time reviewing at fixed code.
</p>
<h2 class="mt-16 text-2xl font-bold tracking-tight text-gray-900">
Enterprise? We have you covered.
</h2>
<p class="mt-6">
<ul role="list" class="mt-8 space-y-8 text-gray-600">
<li class="flex gap-x-3">
<svg class="mt-1 h-5 w-5 flex-none text-indigo-600" xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24" stroke-width="2.5" stroke="currentColor" class="size-6">
<path stroke-linecap="round" stroke-linejoin="round" d="m21 7.5-9-5.25L3 7.5m18 0-9 5.25m9-5.25v9l-9 5.25M3 7.5l9 5.25M3 7.5v9l9 5.25m0-9v9" />
</svg>
<span><strong class="font-semibold text-gray-900">
Use AI model of your choice.
</strong>
OneUptime works with any AI model of your choice. Self host your AI model and no data or code is sent
to us.
</span>
</li>
<li class="flex gap-x-3">
<svg class="mt-1 h-5 w-5 flex-none text-indigo-600" xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24" stroke-width="2.5" stroke="currentColor" class="size-6">
<path stroke-linecap="round" stroke-linejoin="round" d="M17.25 6.75 22.5 12l-5.25 5.25m-10.5 0L1.5 12l5.25-5.25m7.5-3-4.5 16.5" />
</svg>
<span><strong class="font-semibold text-gray-900">
We don't see, store or train on your code.
</strong>
Regardless whether you are on the free tier or enterprise tier, we don't store or train on your code. No part of your code is sent to us.
</span>
</li>
</ul>
</p>
</div>
</div>
</div>
</div>
</div>
</section>

View File

@@ -0,0 +1,83 @@
<section class="mb-32 border-gray-100 border-t-2">
<div class="mx-auto max-w-7xl px-4 sm:px-6 lg:px-8 mb-20 mt-20">
<div class="mx-auto max-w-5xl sm:text-center">
<h1 class="text-4xl font-semibold tracking-tight text-gray-900 sm:text-center">Enterprise grade, at scale.
</h1>
<p class="mt-5 text-xl text-gray-500 sm:text-center">Built to support enterprise-grade demands for security,
availability, and scale and this is why thousands of our customers trust us every day.</p>
</div>
<ul role="list"
class="mx-auto mt-16 grid max-w-2xl grid-cols-1 gap-6 text-sm sm:mt-20 sm:grid-cols-2 md:gap-y-10 lg:max-w-none lg:grid-cols-3">
<li class="rounded-2xl border border-gray-200 p-8">
<svg fill="none" viewBox="0 0 32 32" aria-hidden="true" stroke-width="1.5" stroke="currentColor"
class="h-10 w-10">
<path stroke-linecap="round" stroke-linejoin="round"
d="M16.5 10.5V6.75a4.5 4.5 0 1 0-9 0v3.75m-.75 11.25h10.5a2.25 2.25 0 0 0 2.25-2.25v-6.75a2.25 2.25 0 0 0-2.25-2.25H6.75a2.25 2.25 0 0 0-2.25 2.25v6.75a2.25 2.25 0 0 0 2.25 2.25Z" />
</svg>
<h3 class="mt-6 font-semibold text-gray-900">SSO / SAML Auth</h3>
<p class="mt-2 text-gray-700">
Use SSO and SAML authentication and integrate with your existing identity provider.
</p>
</li>
<li class="rounded-2xl border border-gray-200 p-8">
<svg fill="none" viewBox="0 0 32 32" aria-hidden="true" stroke-width="1.5" stroke="currentColor"
class="h-10 w-10">
<path stroke-linecap="round" stroke-linejoin="round"
d="M10.5 6h9.75M10.5 6a1.5 1.5 0 1 1-3 0m3 0a1.5 1.5 0 1 0-3 0M3.75 6H7.5m3 12h9.75m-9.75 0a1.5 1.5 0 0 1-3 0m3 0a1.5 1.5 0 0 0-3 0m-3.75 0H7.5m9-6h3.75m-3.75 0a1.5 1.5 0 0 1-3 0m3 0a1.5 1.5 0 0 0-3 0m-9.75 0h9.75" />
</svg>
<h3 class="mt-6 font-semibold text-gray-900">Advanced Access Controls</h3>
<p class="mt-2 text-gray-700">
Access controls lets you set fine grained permissions for individual users or teams.
</p>
</li>
<li class="rounded-2xl border border-gray-200 p-8">
<svg fill="none" viewBox="0 0 32 32" aria-hidden="true" stroke-width="1.5" stroke="currentColor"
class="h-10 w-10">
<path stroke-linecap="round" stroke-linejoin="round"
d="M18 18.72a9.094 9.094 0 0 0 3.741-.479 3 3 0 0 0-4.682-2.72m.94 3.198.001.031c0 .225-.012.447-.037.666A11.944 11.944 0 0 1 12 21c-2.17 0-4.207-.576-5.963-1.584A6.062 6.062 0 0 1 6 18.719m12 0a5.971 5.971 0 0 0-.941-3.197m0 0A5.995 5.995 0 0 0 12 12.75a5.995 5.995 0 0 0-5.058 2.772m0 0a3 3 0 0 0-4.681 2.72 8.986 8.986 0 0 0 3.74.477m.94-3.197a5.971 5.971 0 0 0-.94 3.197M15 6.75a3 3 0 1 1-6 0 3 3 0 0 1 6 0Zm6 3a2.25 2.25 0 1 1-4.5 0 2.25 2.25 0 0 1 4.5 0Zm-13.5 0a2.25 2.25 0 1 1-4.5 0 2.25 2.25 0 0 1 4.5 0Z" />
</svg>
<h3 class="mt-6 font-semibold text-gray-900">Dedicated Engineer and Support</h3>
<p class="mt-2 text-gray-700">
Our team are here to help you with any issues you may have - 24/7/365.
</p>
</li>
<li class="rounded-2xl border border-gray-200 p-8"><svg fill="none" viewBox="0 0 32 32" aria-hidden="true"
stroke-width="1.5" stroke="currentColor" class="h-10 w-10">
<path stroke-linecap="round" stroke-linejoin="round"
d="M3.75 12h16.5m-16.5 3.75h16.5M3.75 19.5h16.5M5.625 4.5h12.75a1.875 1.875 0 0 1 0 3.75H5.625a1.875 1.875 0 0 1 0-3.75Z" />
</svg>
<h3 class="mt-6 font-semibold text-gray-900">Audit Events and Logs</h3>
<p class="mt-2 text-gray-700">
Document user activities and system events, crucial for security and compliance.
</p>
</li>
<li class="rounded-2xl border border-gray-200 p-8">
<svg fill="none" viewBox="0 0 32 32" aria-hidden="true" stroke-width="1.5" stroke="currentColor"
class="h-10 w-10">
<path stroke-linecap="round" stroke-linejoin="round"
d="M20.25 6.375c0 2.278-3.694 4.125-8.25 4.125S3.75 8.653 3.75 6.375m16.5 0c0-2.278-3.694-4.125-8.25-4.125S3.75 4.097 3.75 6.375m16.5 0v11.25c0 2.278-3.694 4.125-8.25 4.125s-8.25-1.847-8.25-4.125V6.375m16.5 0v3.75m-16.5-3.75v3.75m16.5 0v3.75C20.25 16.153 16.556 18 12 18s-8.25-1.847-8.25-4.125v-3.75m16.5 0c0 2.278-3.694 4.125-8.25 4.125s-8.25-1.847-8.25-4.125" />
</svg>
<h3 class="mt-6 font-semibold text-gray-900">Custom Data Residency</h3>
<p class="mt-2 text-gray-700">You control your data. Store it on-prem or pick from our US or EU
datacenter.</p>
</li>
<li class="rounded-2xl border border-gray-200 p-8">
<svg fill="none" viewBox="0 0 32 32" aria-hidden="true" stroke-width="1.5" stroke="currentColor"
class="h-10 w-10">
<path stroke-linecap="round" stroke-linejoin="round"
d="M9 12.75 11.25 15 15 9.75m-3-7.036A11.959 11.959 0 0 1 3.598 6 11.99 11.99 0 0 0 3 9.749c0 5.592 3.824 10.29 9 11.623 5.176-1.332 9-6.03 9-11.622 0-1.31-.21-2.571-.598-3.751h-.152c-3.196 0-6.1-1.248-8.25-3.285Z" />
</svg>
<h3 class="mt-6 font-semibold text-gray-900">SOC 2 Type 2 &amp; ISO Compliant</h3>
<p class="mt-2 text-gray-700">We are SOC 2/3, ISO, PCI, HIPAA, CCPA and GDPR Compliant. </p>
</li>
</ul>
</div>
</section>

View File

@@ -1,6 +1,6 @@
<div class="relative overflow-hidden bg-white pt-32 pb-32">
<div class="max-w-3xl1 px-6">
<p class="text-5xl font-bold tracking-tight text-gray-900 sm:text-center">OneUptime is 8+ tools combined
<p class="text-4xl font-semibold tracking-tight text-gray-900 sm:text-center">OneUptime is 8+ tools combined
into one.</p>
<p class="mt-5 text-xl text-gray-500 sm:text-center mb-12">Everything from monitoring, status pages,
incident management, on-call schedules - we've got it and we are just getting started!</p>

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