Compare commits

..

786 Commits

Author SHA1 Message Date
Simon Larsen
7f81ae4009 fix common server tests 2023-07-26 12:48:54 +01:00
Simon Larsen
cd8f090a5e add HTTP Head request 2023-07-26 12:38:00 +01:00
Simon Larsen
35f483c650 add type to result 2023-07-26 11:06:39 +01:00
Simon Larsen
8238ce4c5d fix json serilization issue 2023-07-26 11:01:37 +01:00
Simon Larsen
39ab39b024 make workflow code more readable 2023-07-26 10:44:39 +01:00
Simon Larsen
7e3f911225 fix json serialization issue with workflows 2023-07-25 15:12:18 +01:00
Simon Larsen
8a8f975369 fix blank page issues 2023-07-25 11:10:27 +01:00
Simon Larsen
bef9411dcc Merge branch 'master' of github.com-simon:OneUptime/oneuptime 2023-07-24 21:52:38 +01:00
Simon Larsen
e861f4b53c update readme in config.example 2023-07-24 21:52:19 +01:00
Simon Larsen
757a66bafa add readme in config. 2023-07-24 21:47:54 +01:00
Simon Larsen
217ec6bcfc change default username to postgres 2023-07-24 21:26:20 +01:00
Simon Larsen
dd4f518a79 Merge branch 'master' into release 2023-07-24 21:06:46 +01:00
Simon Larsen
c87e1513d9 Merge pull request #552 from ckd/typo-emptystate
rename EmnptyState component
2023-07-24 20:51:56 +01:00
Carl Downing
b4e4eb7043 rename EnmptyState component 2023-07-24 12:20:47 -07:00
Simon Larsen
26a4ba606e fix issues with summary detail. 2023-07-24 20:02:20 +01:00
Simon Larsen
88cf88d125 Merge pull request #551 from ckd/more-copy-edits
More copy edits
2023-07-24 17:47:15 +01:00
Carl Downing
499dec5b95 here are 2023-07-24 09:43:59 -07:00
Carl Downing
9a107188aa grammar/copy 2023-07-24 09:41:03 -07:00
Carl Downing
6822dc4f3e request 2023-07-24 09:39:17 -07:00
Carl Downing
6977aec52d requests 2023-07-24 09:38:15 -07:00
Carl Downing
c9a3c23302 correct role descriptions 2023-07-24 09:37:47 -07:00
Simon Larsen
066f055a74 Merge pull request #550 from ckd/copy-edits
Copy edits
2023-07-24 17:15:06 +01:00
Carl Downing
1da7b9747f renaming hasReosurce 2023-07-24 09:08:08 -07:00
Carl Downing
e29af13b73 renaming getReosurceDictionaryByPath 2023-07-24 09:06:55 -07:00
Carl Downing
3e4074ef4b resources 2023-07-24 09:04:07 -07:00
Carl Downing
0f8330d110 copyedit 2023-07-24 08:43:43 -07:00
Carl Downing
4cba9d6042 open source 2023-07-24 08:41:47 -07:00
Carl Downing
556283e7f7 copyedit 2023-07-24 08:40:42 -07:00
Carl Downing
696a3b5fee grammar 2023-07-24 08:38:17 -07:00
Carl Downing
cdd2f241c7 grammar 2023-07-24 08:38:02 -07:00
Carl Downing
2a9978b539 grammar 2023-07-24 08:36:34 -07:00
Simon Larsen
e1917f1fd7 Merge branch 'master' into release 2023-07-24 16:15:42 +01:00
Simon Larsen
cb547790cf fix createdAt null check 2023-07-24 16:15:32 +01:00
Simon Larsen
c754101194 Merge pull request #547 from andersmmg/spelling-fix
Fix misspelled "propogate"
2023-07-24 10:35:41 +01:00
Simon Larsen
a1b772bda1 Merge pull request #548 from ckd/spelling-corrections
Spelling corrections
2023-07-24 10:35:21 +01:00
Carl Downing
a0e4b6b5c7 typos 2023-07-23 21:14:07 -07:00
Carl Downing
02cb4474a3 fix URL typo 2023-07-23 21:01:09 -07:00
Carl Downing
2db09a3aba consistent punctuation 2023-07-23 21:00:27 -07:00
Carl Downing
e09efd5917 consistent punctuation 2023-07-23 20:59:49 -07:00
Carl Downing
b45a47e167 consistent punctuation 2023-07-23 20:56:22 -07:00
Carl Downing
fab4be14dc on-call 2023-07-23 20:54:16 -07:00
Carl Downing
b717f0e09e grammar 2023-07-23 20:52:21 -07:00
Carl Downing
89fc67831c typo: integrate 2023-07-23 20:50:43 -07:00
Joshua Anderson
a504ac95d8 Fix misspelled "propogate" 2023-07-23 20:34:00 -06:00
Simon Larsen
a4f2206c83 Merge branch 'master' into release 2023-07-22 18:51:35 +01:00
Simon Larsen
271535d89f add env to gitignore 2023-07-22 18:51:21 +01:00
Simon Larsen
13f0723405 Merge pull request #546 from OneUptime/notification-settings
Notification settings
2023-07-22 18:50:01 +01:00
Simon Larsen
2159332317 fix fmt 2023-07-22 18:48:32 +01:00
Simon Larsen
3757ecb104 fix incidentservice 2023-07-22 18:33:45 +01:00
Simon Larsen
a40986d51b fix env in dev 2023-07-22 18:14:00 +01:00
Simon Larsen
d5aa9529fa fix docker compose files 2023-07-22 17:57:10 +01:00
Simon Larsen
edc7362fcd fix env in docker compose file for dev 2023-07-22 17:45:12 +01:00
Simon Larsen
e9de7fae51 fix env in docker compose for dev 2023-07-22 17:40:23 +01:00
Simon Larsen
8877536c14 fix fmt 2023-07-22 17:33:22 +01:00
Simon Larsen
5f0be6298c fix fmt 2023-07-22 17:31:57 +01:00
Simon Larsen
3d533db7c0 fix docker files for UI containers 2023-07-22 17:03:13 +01:00
Simon Larsen
46b14a4792 fix send email to subscribers 2023-07-22 16:22:21 +01:00
Simon Larsen
a0b203d9b8 fix notification events 2023-07-22 16:13:32 +01:00
Simon Larsen
b55b20a55f remove global config service 2023-07-22 16:09:51 +01:00
Simon Larsen
b91104e7bd fix compile err 2023-07-22 16:00:51 +01:00
Simon Larsen
478b4dc381 add base servicve 2023-07-22 15:33:24 +01:00
Simon Larsen
8d7c88d4d0 fix filters 2023-07-22 14:46:31 +01:00
Simon Larsen
9c35c26558 add workflow id to logs 2023-07-22 14:42:41 +01:00
Simon Larsen
16166a70f8 fix docker compose 2023-07-22 14:35:31 +01:00
Simon Larsen
42b80bab3c fix email log 2023-07-22 14:33:50 +01:00
Simon Larsen
2724f4eeed add mailservice 2023-07-22 14:14:54 +01:00
Simon Larsen
b6f67f8faa add logging to mailservice. 2023-07-22 14:13:40 +01:00
Simon Larsen
a0bfa75e55 fix send email to subscribers 2023-07-22 13:51:40 +01:00
Simon Larsen
1e0b19efd4 fix mail resources 2023-07-22 13:36:02 +01:00
Simon Larsen
e83d63c07e add more alerts to scheduled maintenance 2023-07-21 17:23:30 +01:00
Simon Larsen
7eb0b79d7b add email logs in project settings 2023-07-21 17:10:46 +01:00
Simon Larsen
2156c8f5d5 add notificatios to state changes 2023-07-21 16:52:25 +01:00
Simon Larsen
9564e57208 add message send service 2023-07-21 16:43:17 +01:00
Simon Larsen
2ba91d6ddf rename api 2023-07-21 14:18:49 +01:00
Simon Larsen
668c88db52 fix lint 2023-07-21 14:17:39 +01:00
Simon Larsen
e4faa3c995 update routemap 2023-07-21 14:15:59 +01:00
Simon Larsen
d86f3a0a33 notification log -> on call log 2023-07-21 14:15:33 +01:00
Simon Larsen
4dda09b406 fix fmt 2023-07-21 14:05:53 +01:00
Simon Larsen
ef605f1248 remove notification settings when the user is removed from the projct 2023-07-21 14:01:32 +01:00
Simon Larsen
632365da7f rename files 2023-07-21 13:48:35 +01:00
Simon Larsen
6ca3d003f7 rename files 2023-07-21 13:48:30 +01:00
Simon Larsen
889b6e00c4 add unsubscribe help text 2023-07-21 13:39:38 +01:00
Simon Larsen
dfa8591562 add unsubscribe help text 2023-07-21 13:39:32 +01:00
Simon Larsen
85d073f110 add migration job 2023-07-21 13:33:53 +01:00
Simon Larsen
55f6faaa60 fix UI issues 2023-07-21 13:23:34 +01:00
Simon Larsen
6939ee1f0d make env work in development. 2023-07-21 12:09:46 +01:00
Simon Larsen
316ef6ff53 add settings model 2023-07-20 20:28:47 +01:00
Simon Larsen
9fe2395796 remove comment 2023-07-20 18:58:48 +01:00
Simon Larsen
7b2a31ef96 remove overflow scroll 2023-07-20 14:14:03 +01:00
Simon Larsen
7971bb2abb Merge branch 'master' of github.com-simon:OneUptime/oneuptime 2023-07-20 11:24:17 +01:00
Simon Larsen
5eacc2a18e bake template into nginx image 2023-07-20 11:24:01 +01:00
Simon Larsen
70d18ba49e Merge pull request #545 from OneUptime/release
add read env var
2023-07-20 07:24:16 +01:00
Simon Larsen
3c9628abdb add read env var 2023-07-20 07:14:34 +01:00
Simon Larsen
9793d95b80 remove flag 2023-07-19 22:07:07 +01:00
Simon Larsen
881b190fd8 fix fmt 2023-07-19 22:06:11 +01:00
Simon Larsen
e30565bce3 Merge pull request #543 from OneUptime/dependabot/npm_and_yarn/Common/word-wrap-1.2.4
Bump word-wrap from 1.2.3 to 1.2.4 in /Common
2023-07-19 20:33:58 +01:00
Simon Larsen
f9517412e5 Merge pull request #544 from OneUptime/dependabot/npm_and_yarn/Accounts/word-wrap-1.2.4
Bump word-wrap from 1.2.3 to 1.2.4 in /Accounts
2023-07-19 20:33:53 +01:00
dependabot[bot]
ed6d2faa8d Bump word-wrap from 1.2.3 to 1.2.4 in /Accounts
Bumps [word-wrap](https://github.com/jonschlinkert/word-wrap) from 1.2.3 to 1.2.4.
- [Release notes](https://github.com/jonschlinkert/word-wrap/releases)
- [Commits](https://github.com/jonschlinkert/word-wrap/compare/1.2.3...1.2.4)

---
updated-dependencies:
- dependency-name: word-wrap
  dependency-type: indirect
...

Signed-off-by: dependabot[bot] <support@github.com>
2023-07-19 19:33:30 +00:00
Simon Larsen
a1ce939ffc Merge pull request #534 from OneUptime/dependabot/npm_and_yarn/Dashboard/word-wrap-1.2.4
Bump word-wrap from 1.2.3 to 1.2.4 in /Dashboard
2023-07-19 20:33:20 +01:00
Simon Larsen
b34cd86f05 Merge pull request #535 from OneUptime/dependabot/npm_and_yarn/CommonServer/word-wrap-1.2.4
Bump word-wrap from 1.2.3 to 1.2.4 in /CommonServer
2023-07-19 20:33:08 +01:00
dependabot[bot]
45e752cabf Bump word-wrap from 1.2.3 to 1.2.4 in /Common
Bumps [word-wrap](https://github.com/jonschlinkert/word-wrap) from 1.2.3 to 1.2.4.
- [Release notes](https://github.com/jonschlinkert/word-wrap/releases)
- [Commits](https://github.com/jonschlinkert/word-wrap/compare/1.2.3...1.2.4)

---
updated-dependencies:
- dependency-name: word-wrap
  dependency-type: indirect
...

Signed-off-by: dependabot[bot] <support@github.com>
2023-07-19 19:33:04 +00:00
Simon Larsen
fa89f9d1a5 Merge pull request #536 from OneUptime/dependabot/npm_and_yarn/TestServer/word-wrap-1.2.4
Bump word-wrap from 1.2.3 to 1.2.4 in /TestServer
2023-07-19 20:33:00 +01:00
Simon Larsen
9db08a9347 Merge pull request #537 from OneUptime/dependabot/npm_and_yarn/ProbeAPI/word-wrap-1.2.4
Bump word-wrap from 1.2.3 to 1.2.4 in /ProbeAPI
2023-07-19 20:32:52 +01:00
Simon Larsen
24c4d37b2c Merge pull request #538 from OneUptime/dependabot/npm_and_yarn/Model/word-wrap-1.2.4
Bump word-wrap from 1.2.3 to 1.2.4 in /Model
2023-07-19 20:32:43 +01:00
Simon Larsen
1f866ee325 Merge pull request #539 from OneUptime/dependabot/npm_and_yarn/CommonUI/word-wrap-1.2.4
Bump word-wrap from 1.2.3 to 1.2.4 in /CommonUI
2023-07-19 20:32:34 +01:00
Simon Larsen
70a0087344 Merge pull request #540 from OneUptime/dependabot/npm_and_yarn/StatusPage/word-wrap-1.2.4
Bump word-wrap from 1.2.3 to 1.2.4 in /StatusPage
2023-07-19 20:32:25 +01:00
Simon Larsen
3dea55f035 Merge pull request #541 from OneUptime/dependabot/npm_and_yarn/Scripts/word-wrap-1.2.4
Bump word-wrap from 1.2.3 to 1.2.4 in /Scripts
2023-07-19 20:32:17 +01:00
Simon Larsen
f47a6e7c6b update readme 2023-07-19 20:30:18 +01:00
Simon Larsen
788e8363ef remove self signed certs generation 2023-07-19 20:29:29 +01:00
Simon Larsen
c9d1c95b38 remove ssl certs from nginx 2023-07-19 20:28:38 +01:00
Simon Larsen
b3a18d69cb add comment 2023-07-19 20:21:55 +01:00
Simon Larsen
3b9e982c35 fix nginx template 2023-07-19 20:20:31 +01:00
Simon Larsen
b28a832ba7 env var for nginx domain 2023-07-19 20:16:43 +01:00
Simon Larsen
38b96e86c3 add nginx to prod and dev docker 2023-07-19 20:02:14 +01:00
Simon Larsen
dafcd001f7 add nginx files 2023-07-19 20:00:53 +01:00
Simon Larsen
7882897466 fix typo 2023-07-19 19:47:08 +01:00
Simon Larsen
3e62082ac2 fix typo 2023-07-19 19:36:26 +01:00
Simon Larsen
e8d790925b Merge branch 'master' of github.com-simon:OneUptime/oneuptime 2023-07-19 18:37:51 +01:00
Simon Larsen
83061b1ca8 fix typo in readme 2023-07-19 18:27:26 +01:00
Simon Larsen
554f353990 Merge pull request #542 from OneUptime/release
fix test script
2023-07-19 18:11:23 +01:00
Simon Larsen
d857de0406 fix test script 2023-07-19 18:07:33 +01:00
Simon Larsen
e4d4bbb680 expose postrges port 2023-07-19 16:34:20 +01:00
Simon Larsen
4e8631cec9 add dev readme 2023-07-19 16:33:17 +01:00
Simon Larsen
1f96504c34 package.json 2023-07-19 15:13:05 +01:00
Simon Larsen
c0153f0ecb fix docker compose files 2023-07-19 15:10:47 +01:00
Simon Larsen
42f8a90eeb add code mounts 2023-07-19 14:51:39 +01:00
Simon Larsen
090d68f4e1 add status response to link shortner 2023-07-19 14:27:41 +01:00
Simon Larsen
dcd04ddaa1 add networks 2023-07-19 14:25:00 +01:00
Simon Larsen
906438c325 refactor status check script 2023-07-19 14:21:39 +01:00
Simon Larsen
53ce3537e9 fix spaces 2023-07-19 13:06:39 +01:00
Simon Larsen
550d7f2621 fix probe config 2023-07-19 12:59:10 +01:00
Simon Larsen
b1707a28f8 add 443 port for external status apges 2023-07-19 12:54:37 +01:00
Simon Larsen
3eb15af79c update readme 2023-07-19 12:44:29 +01:00
Simon Larsen
bddd932eb8 remove sudo 2023-07-19 12:42:33 +01:00
Simon Larsen
8a73a7c7ab fix install script 2023-07-19 12:34:59 +01:00
Simon Larsen
a7b6f70ed4 remove secret generation 2023-07-19 12:29:54 +01:00
Simon Larsen
3dea88a97b add test setup 2023-07-19 12:25:50 +01:00
Simon Larsen
5728c1a18c fix test file 2023-07-19 12:16:29 +01:00
Simon Larsen
7da678e82b Merge branch 'master' of github.com-simon:OneUptime/oneuptime 2023-07-19 12:01:20 +01:00
Simon Larsen
7b7cbbe6b8 fix config.example 2023-07-19 12:01:09 +01:00
dependabot[bot]
658b359c2c Bump word-wrap from 1.2.3 to 1.2.4 in /Scripts
Bumps [word-wrap](https://github.com/jonschlinkert/word-wrap) from 1.2.3 to 1.2.4.
- [Release notes](https://github.com/jonschlinkert/word-wrap/releases)
- [Commits](https://github.com/jonschlinkert/word-wrap/compare/1.2.3...1.2.4)

---
updated-dependencies:
- dependency-name: word-wrap
  dependency-type: indirect
...

Signed-off-by: dependabot[bot] <support@github.com>
2023-07-19 10:43:45 +00:00
dependabot[bot]
ff9f97f095 Bump word-wrap from 1.2.3 to 1.2.4 in /StatusPage
Bumps [word-wrap](https://github.com/jonschlinkert/word-wrap) from 1.2.3 to 1.2.4.
- [Release notes](https://github.com/jonschlinkert/word-wrap/releases)
- [Commits](https://github.com/jonschlinkert/word-wrap/compare/1.2.3...1.2.4)

---
updated-dependencies:
- dependency-name: word-wrap
  dependency-type: indirect
...

Signed-off-by: dependabot[bot] <support@github.com>
2023-07-19 10:43:35 +00:00
dependabot[bot]
558f963648 Bump word-wrap from 1.2.3 to 1.2.4 in /CommonUI
Bumps [word-wrap](https://github.com/jonschlinkert/word-wrap) from 1.2.3 to 1.2.4.
- [Release notes](https://github.com/jonschlinkert/word-wrap/releases)
- [Commits](https://github.com/jonschlinkert/word-wrap/compare/1.2.3...1.2.4)

---
updated-dependencies:
- dependency-name: word-wrap
  dependency-type: indirect
...

Signed-off-by: dependabot[bot] <support@github.com>
2023-07-19 10:43:30 +00:00
dependabot[bot]
f5883d4840 Bump word-wrap from 1.2.3 to 1.2.4 in /Model
Bumps [word-wrap](https://github.com/jonschlinkert/word-wrap) from 1.2.3 to 1.2.4.
- [Release notes](https://github.com/jonschlinkert/word-wrap/releases)
- [Commits](https://github.com/jonschlinkert/word-wrap/compare/1.2.3...1.2.4)

---
updated-dependencies:
- dependency-name: word-wrap
  dependency-type: indirect
...

Signed-off-by: dependabot[bot] <support@github.com>
2023-07-19 10:43:27 +00:00
dependabot[bot]
bfdecac3ba Bump word-wrap from 1.2.3 to 1.2.4 in /TestServer
Bumps [word-wrap](https://github.com/jonschlinkert/word-wrap) from 1.2.3 to 1.2.4.
- [Release notes](https://github.com/jonschlinkert/word-wrap/releases)
- [Commits](https://github.com/jonschlinkert/word-wrap/compare/1.2.3...1.2.4)

---
updated-dependencies:
- dependency-name: word-wrap
  dependency-type: indirect
...

Signed-off-by: dependabot[bot] <support@github.com>
2023-07-19 10:43:26 +00:00
dependabot[bot]
43a765479a Bump word-wrap from 1.2.3 to 1.2.4 in /ProbeAPI
Bumps [word-wrap](https://github.com/jonschlinkert/word-wrap) from 1.2.3 to 1.2.4.
- [Release notes](https://github.com/jonschlinkert/word-wrap/releases)
- [Commits](https://github.com/jonschlinkert/word-wrap/compare/1.2.3...1.2.4)

---
updated-dependencies:
- dependency-name: word-wrap
  dependency-type: indirect
...

Signed-off-by: dependabot[bot] <support@github.com>
2023-07-19 10:43:26 +00:00
dependabot[bot]
07b33b68ab Bump word-wrap from 1.2.3 to 1.2.4 in /CommonServer
Bumps [word-wrap](https://github.com/jonschlinkert/word-wrap) from 1.2.3 to 1.2.4.
- [Release notes](https://github.com/jonschlinkert/word-wrap/releases)
- [Commits](https://github.com/jonschlinkert/word-wrap/compare/1.2.3...1.2.4)

---
updated-dependencies:
- dependency-name: word-wrap
  dependency-type: indirect
...

Signed-off-by: dependabot[bot] <support@github.com>
2023-07-19 10:43:24 +00:00
dependabot[bot]
e83b118904 Bump word-wrap from 1.2.3 to 1.2.4 in /Dashboard
Bumps [word-wrap](https://github.com/jonschlinkert/word-wrap) from 1.2.3 to 1.2.4.
- [Release notes](https://github.com/jonschlinkert/word-wrap/releases)
- [Commits](https://github.com/jonschlinkert/word-wrap/compare/1.2.3...1.2.4)

---
updated-dependencies:
- dependency-name: word-wrap
  dependency-type: indirect
...

Signed-off-by: dependabot[bot] <support@github.com>
2023-07-19 10:43:22 +00:00
Nawaz Dhandala
fb798290a5 Merge pull request #529 from TobiasGrether/master
use overflow-x-scroll to stop nav bar from operlapping on mobile dashboard
2023-07-19 11:43:07 +01:00
Nawaz Dhandala
46c33b4d1e Merge pull request #533 from OneUptime/dependabot/npm_and_yarn/word-wrap-1.2.4
Bump word-wrap from 1.2.3 to 1.2.4
2023-07-19 11:42:36 +01:00
Simon Larsen
3492e7f949 Merge branch 'master' of github.com-simon:OneUptime/oneuptime 2023-07-19 11:41:34 +01:00
Simon Larsen
5a5b861f69 expose port in local dev 2023-07-19 11:41:32 +01:00
dependabot[bot]
17938ddb3f Bump word-wrap from 1.2.3 to 1.2.4
Bumps [word-wrap](https://github.com/jonschlinkert/word-wrap) from 1.2.3 to 1.2.4.
- [Release notes](https://github.com/jonschlinkert/word-wrap/releases)
- [Commits](https://github.com/jonschlinkert/word-wrap/compare/1.2.3...1.2.4)

---
updated-dependencies:
- dependency-name: word-wrap
  dependency-type: indirect
...

Signed-off-by: dependabot[bot] <support@github.com>
2023-07-19 08:24:35 +00:00
Nawaz Dhandala
3ea065a620 Merge pull request #531 from TobiasGrether/patch-1
Add docker network to docker-compose.yml
2023-07-18 17:02:57 +01:00
Tobias Grether
2f6f8044b8 Add docker network to docker-compose.yml 2023-07-18 10:16:13 +02:00
Tobias Grether
7a17eb12dc feat: use overflow-x-scroll to stop nav bar from operlapping on mobile dashboard 2023-07-18 09:25:59 +02:00
Nawaz Dhandala
dd8d9b3e3f Merge pull request #526 from OneUptime/dependabot/npm_and_yarn/CommonServer/fast-xml-parser-and-aws-sdk/credential-providers-4.2.5
Bump fast-xml-parser and @aws-sdk/credential-providers in /CommonServer
2023-07-17 20:49:22 +01:00
Nawaz Dhandala
22fc04f06a Merge pull request #527 from TobiasGrether/master
Use docker network instead of exposing all ports manually
2023-07-17 20:44:35 +01:00
Tobias Grether
9a121ec62e feat: use docker network instead of exposing all ports manually 2023-07-17 21:39:38 +02:00
Simon Larsen
7909bc95ee bash -> source 2023-07-17 20:33:19 +01:00
Simon Larsen
cad11997f4 bash -> source 2023-07-17 20:33:08 +01:00
Simon Larsen
908a7a2695 fix script 2023-07-17 20:17:30 +01:00
Simon Larsen
d5b4bdbf6b remove env tpl 2023-07-17 20:06:01 +01:00
Simon Larsen
bc482345ce add common vars to nginx 2023-07-17 19:56:14 +01:00
Simon Larsen
a04416e7e7 add default conf file 2023-07-17 19:54:44 +01:00
Simon Larsen
a04eb341e1 add docker compose name 2023-07-17 19:50:48 +01:00
Simon Larsen
687c1bbb67 fix fmt 2023-07-17 19:47:14 +01:00
Simon Larsen
4462ee9bc2 remove company name and phone from OSS install 2023-07-17 19:46:48 +01:00
Simon Larsen
2379a6fd86 read env vars from bash 2023-07-17 19:30:10 +01:00
Simon Larsen
99462978cc edit readme 2023-07-17 17:59:15 +01:00
Simon Larsen
ae7c32a32d makr coookie accepted as false and hide the banner 2023-07-17 17:56:59 +01:00
Simon Larsen
6e4b23293f update readme to make it only docker compose 2023-07-17 17:54:58 +01:00
Simon Larsen
21a017a8ba add docs around external cname 2023-07-17 17:45:07 +01:00
Simon Larsen
5a99e66427 add debugging ports 2023-07-17 17:38:15 +01:00
Simon Larsen
786e88eef5 change protocol to http 2023-07-17 17:32:38 +01:00
Simon Larsen
bb45041dec fix probe prod file 2023-07-17 17:29:57 +01:00
Simon Larsen
0f92ba3e63 add activate 2023-07-17 17:29:13 +01:00
Simon Larsen
25b065eef4 fix common tests 2023-07-17 17:18:56 +01:00
Simon Larsen
dcd35b4686 fix env var 2023-07-17 16:09:18 +01:00
Simon Larsen
a9fc2305eb fix configure 2023-07-17 16:06:22 +01:00
Simon Larsen
7f741cec1b add docker compose file 2023-07-17 16:05:38 +01:00
Simon Larsen
c03e8f2d67 fix configure script 2023-07-17 16:03:05 +01:00
Simon Larsen
4691444545 fix preinstall script 2023-07-17 15:59:56 +01:00
Simon Larsen
970e6c4af2 fix lint. 2023-07-17 15:57:05 +01:00
Simon Larsen
31e0376e62 fix script 2023-07-17 14:30:58 +01:00
Simon Larsen
cc24dad2cd fix package.json 2023-07-17 14:30:31 +01:00
Simon Larsen
74a36c6918 fix env config 2023-07-17 13:30:20 +01:00
Simon Larsen
ab0472005e Merge branch 'master' of github.com-simon:OneUptime/oneuptime 2023-07-17 13:28:31 +01:00
Simon Larsen
e171a8c845 fix err in docker compose 2023-07-17 13:28:29 +01:00
Simon Larsen
5de055a350 add config.example.env 2023-07-17 13:08:02 +01:00
dependabot[bot]
3c04194dfd Bump fast-xml-parser and @aws-sdk/credential-providers in /CommonServer
Bumps [fast-xml-parser](https://github.com/NaturalIntelligence/fast-xml-parser) and [@aws-sdk/credential-providers](https://github.com/aws/aws-sdk-js-v3/tree/HEAD/packages/credential-providers). These dependencies needed to be updated together.

Updates `fast-xml-parser` from 4.2.4 to 4.2.5
- [Release notes](https://github.com/NaturalIntelligence/fast-xml-parser/releases)
- [Changelog](https://github.com/NaturalIntelligence/fast-xml-parser/blob/master/CHANGELOG.md)
- [Commits](https://github.com/NaturalIntelligence/fast-xml-parser/compare/v4.2.4...v4.2.5)

Updates `@aws-sdk/credential-providers` from 3.347.1 to 3.370.0
- [Release notes](https://github.com/aws/aws-sdk-js-v3/releases)
- [Changelog](https://github.com/aws/aws-sdk-js-v3/blob/main/packages/credential-providers/CHANGELOG.md)
- [Commits](https://github.com/aws/aws-sdk-js-v3/commits/v3.370.0/packages/credential-providers)

---
updated-dependencies:
- dependency-name: fast-xml-parser
  dependency-type: indirect
- dependency-name: "@aws-sdk/credential-providers"
  dependency-type: indirect
...

Signed-off-by: dependabot[bot] <support@github.com>
2023-07-17 11:50:21 +00:00
Nawaz Dhandala
aee54309d8 Merge pull request #525 from OneUptime/dependabot/npm_and_yarn/Accounts/tough-cookie-4.1.3
Bump tough-cookie from 4.1.2 to 4.1.3 in /Accounts
2023-07-17 12:49:11 +01:00
dependabot[bot]
5831fdfa3e Bump tough-cookie from 4.1.2 to 4.1.3 in /Accounts
Bumps [tough-cookie](https://github.com/salesforce/tough-cookie) from 4.1.2 to 4.1.3.
- [Release notes](https://github.com/salesforce/tough-cookie/releases)
- [Changelog](https://github.com/salesforce/tough-cookie/blob/master/CHANGELOG.md)
- [Commits](https://github.com/salesforce/tough-cookie/compare/v4.1.2...v4.1.3)

---
updated-dependencies:
- dependency-name: tough-cookie
  dependency-type: indirect
...

Signed-off-by: dependabot[bot] <support@github.com>
2023-07-16 21:46:47 +00:00
Nawaz Dhandala
5267cdfbeb Merge pull request #522 from OneUptime/dependabot/npm_and_yarn/Common/tough-cookie-4.1.3
Bump tough-cookie from 4.1.2 to 4.1.3 in /Common
2023-07-16 22:45:52 +01:00
Simon Larsen
6094b577ef Merge branch 'master' of github.com-simon:OneUptime/oneuptime 2023-07-15 13:43:28 +01:00
Simon Larsen
b1f734166f add poorts to docker compose base 2023-07-15 11:32:30 +01:00
Simon Larsen
52060d1393 add env var to docker compose base 2023-07-15 11:28:50 +01:00
Nawaz Dhandala
9a1589259f Merge pull request #523 from OneUptime/nzdhandala-patch-1
Create IPAddress.md
2023-07-14 21:01:05 +01:00
Nawaz Dhandala
12ae9a1b74 Create IPAddress.md 2023-07-14 21:00:56 +01:00
dependabot[bot]
ed7395db70 Bump tough-cookie from 4.1.2 to 4.1.3 in /Common
Bumps [tough-cookie](https://github.com/salesforce/tough-cookie) from 4.1.2 to 4.1.3.
- [Release notes](https://github.com/salesforce/tough-cookie/releases)
- [Changelog](https://github.com/salesforce/tough-cookie/blob/master/CHANGELOG.md)
- [Commits](https://github.com/salesforce/tough-cookie/compare/v4.1.2...v4.1.3)

---
updated-dependencies:
- dependency-name: tough-cookie
  dependency-type: indirect
...

Signed-off-by: dependabot[bot] <support@github.com>
2023-07-14 17:19:43 +00:00
Nawaz Dhandala
6a63556fd2 Merge pull request #521 from OneUptime/dependabot/npm_and_yarn/CommonServer/tough-cookie-4.1.3
Bump tough-cookie from 4.1.2 to 4.1.3 in /CommonServer
2023-07-14 18:19:01 +01:00
Simon Larsen
4ecfce4a5d fix grammar 2023-07-13 12:34:39 +01:00
Simon Larsen
6f827a68c0 Merge branch 'master' of github.com-simon:OneUptime/oneuptime 2023-07-13 12:29:40 +01:00
Simon Larsen
8afdf966f3 fix fmt 2023-07-13 12:29:13 +01:00
Simon Larsen
e9e5533372 fix on call page 2023-07-13 12:26:34 +01:00
Simon Larsen
e8acdad270 fix logo on status page 2023-07-13 12:08:28 +01:00
dependabot[bot]
d11116544c Bump tough-cookie from 4.1.2 to 4.1.3 in /CommonServer
Bumps [tough-cookie](https://github.com/salesforce/tough-cookie) from 4.1.2 to 4.1.3.
- [Release notes](https://github.com/salesforce/tough-cookie/releases)
- [Changelog](https://github.com/salesforce/tough-cookie/blob/master/CHANGELOG.md)
- [Commits](https://github.com/salesforce/tough-cookie/compare/v4.1.2...v4.1.3)

---
updated-dependencies:
- dependency-name: tough-cookie
  dependency-type: indirect
...

Signed-off-by: dependabot[bot] <support@github.com>
2023-07-13 09:34:58 +00:00
Nawaz Dhandala
4741028cc2 Merge pull request #518 from OneUptime/dependabot/npm_and_yarn/Playwright/semver-6.3.1
Bump semver from 6.3.0 to 6.3.1 in /Playwright
2023-07-13 10:34:16 +01:00
Nawaz Dhandala
56af44885d Merge pull request #512 from OneUptime/dependabot/npm_and_yarn/Dashboard/tough-cookie-4.1.3
Bump tough-cookie from 4.1.2 to 4.1.3 in /Dashboard
2023-07-13 10:34:00 +01:00
Nawaz Dhandala
cc30864ada Merge pull request #513 from OneUptime/dependabot/npm_and_yarn/CommonUI/tough-cookie-4.1.3
Bump tough-cookie from 4.1.2 to 4.1.3 in /CommonUI
2023-07-13 10:33:52 +01:00
Nawaz Dhandala
5291f78895 Merge pull request #517 from OneUptime/dependabot/npm_and_yarn/Accounts/semver-5.7.2
Bump semver from 5.7.1 to 5.7.2 in /Accounts
2023-07-13 10:33:47 +01:00
Nawaz Dhandala
731f4da92a Merge pull request #519 from OneUptime/dependabot/npm_and_yarn/CommonServer/semver-6.3.1
Bump semver from 6.3.0 to 6.3.1 in /CommonServer
2023-07-13 10:33:36 +01:00
Simon Larsen
da6615ad6f finish workflow page 2023-07-13 10:30:53 +01:00
Simon Larsen
251c763245 remove svg on the sides 2023-07-12 14:22:39 +01:00
Simon Larsen
ac29692485 add workflow images 2023-07-12 14:20:24 +01:00
Simon Larsen
2e0e8f6956 add workflow page 2023-07-12 13:36:13 +01:00
Simon Larsen
74e1532079 fix fmt 2023-07-12 12:15:44 +01:00
Simon Larsen
2657bca277 fix shortlinks 2023-07-12 11:53:08 +01:00
Simon Larsen
9704adba03 fix sms and calls for verification code. 2023-07-12 11:46:35 +01:00
Simon Larsen
a1960cb749 add PG_DBNAME env var 2023-07-12 11:38:40 +01:00
Simon Larsen
b288117b4f fix fmt 2023-07-12 11:03:50 +01:00
Simon Larsen
c22f3f3191 fix bug with logging on-call 2023-07-12 11:02:33 +01:00
Simon Larsen
3b4e0a8dbc add comments in timeout jobs 2023-07-12 10:24:22 +01:00
Simon Larsen
6ef9445b46 fix fmt in timeout jobs 2023-07-12 10:20:30 +01:00
Simon Larsen
55856e9ff0 add timeout jobs 2023-07-12 10:18:57 +01:00
Simon Larsen
8b8585f86c fix issues with service 2023-07-12 09:58:52 +01:00
Simon Larsen
ad427fa6b4 Merge branch 'release' 2023-07-12 09:32:01 +01:00
Simon Larsen
3d4519e2bd add https port 2023-07-12 09:31:50 +01:00
Simon Larsen
d0f0454a0c add docker base 2023-07-12 09:29:36 +01:00
Simon Larsen
e0601e75fa remove nginx docker build 2023-07-11 22:32:38 +01:00
Simon Larsen
a4951a264b add docker base 2023-07-11 22:31:38 +01:00
dependabot[bot]
b8485a1c3e Bump semver from 6.3.0 to 6.3.1 in /CommonServer
Bumps [semver](https://github.com/npm/node-semver) from 6.3.0 to 6.3.1.
- [Release notes](https://github.com/npm/node-semver/releases)
- [Changelog](https://github.com/npm/node-semver/blob/v6.3.1/CHANGELOG.md)
- [Commits](https://github.com/npm/node-semver/compare/v6.3.0...v6.3.1)

---
updated-dependencies:
- dependency-name: semver
  dependency-type: indirect
...

Signed-off-by: dependabot[bot] <support@github.com>
2023-07-11 21:17:03 +00:00
dependabot[bot]
54b4f47b6a Bump semver from 6.3.0 to 6.3.1 in /Playwright
Bumps [semver](https://github.com/npm/node-semver) from 6.3.0 to 6.3.1.
- [Release notes](https://github.com/npm/node-semver/releases)
- [Changelog](https://github.com/npm/node-semver/blob/v6.3.1/CHANGELOG.md)
- [Commits](https://github.com/npm/node-semver/compare/v6.3.0...v6.3.1)

---
updated-dependencies:
- dependency-name: semver
  dependency-type: indirect
...

Signed-off-by: dependabot[bot] <support@github.com>
2023-07-11 21:16:58 +00:00
Simon Larsen
c558909fd0 remove nginx jobs 2023-07-11 22:16:09 +01:00
Simon Larsen
da3f02f855 add nginx official container 2023-07-11 22:15:34 +01:00
dependabot[bot]
f1ea93719c Bump semver from 5.7.1 to 5.7.2 in /Accounts
Bumps [semver](https://github.com/npm/node-semver) from 5.7.1 to 5.7.2.
- [Release notes](https://github.com/npm/node-semver/releases)
- [Changelog](https://github.com/npm/node-semver/blob/v5.7.2/CHANGELOG.md)
- [Commits](https://github.com/npm/node-semver/compare/v5.7.1...v5.7.2)

---
updated-dependencies:
- dependency-name: semver
  dependency-type: indirect
...

Signed-off-by: dependabot[bot] <support@github.com>
2023-07-11 21:03:13 +00:00
Simon Larsen
fc59f65fca add env folder 2023-07-11 20:26:35 +01:00
Simon Larsen
bddf072511 add data folder 2023-07-11 20:22:17 +01:00
Simon Larsen
f5a4cc3c1d remove lets encrypt to make deployment simpler 2023-07-11 11:57:54 +01:00
Nawaz Dhandala
a7e1430898 Merge pull request #516 from OneUptime/on-call-fixes
fix shortlink logs
2023-07-11 09:47:27 +01:00
Simon Larsen
d0cb4b5b17 fix shortlink logs 2023-07-11 09:28:16 +01:00
Nawaz Dhandala
f5055d744e Merge pull request #515 from OneUptime/on-call-fixes
On call fixes
2023-07-10 21:31:24 +01:00
Simon Larsen
8d308b0a7c fix workflow status 2023-07-10 19:23:44 +01:00
Simon Larsen
1515cd7478 running - executing 2023-07-10 19:23:11 +01:00
Simon Larsen
604a5c0c9f Merge branch 'master' of github.com-simon:OneUptime/oneuptime 2023-07-10 08:28:43 +01:00
Simon Larsen
ba46931979 add docker jobs for link shortner 2023-07-10 08:28:23 +01:00
dependabot[bot]
7d620595d2 Bump tough-cookie from 4.1.2 to 4.1.3 in /CommonUI
Bumps [tough-cookie](https://github.com/salesforce/tough-cookie) from 4.1.2 to 4.1.3.
- [Release notes](https://github.com/salesforce/tough-cookie/releases)
- [Changelog](https://github.com/salesforce/tough-cookie/blob/master/CHANGELOG.md)
- [Commits](https://github.com/salesforce/tough-cookie/compare/v4.1.2...v4.1.3)

---
updated-dependencies:
- dependency-name: tough-cookie
  dependency-type: indirect
...

Signed-off-by: dependabot[bot] <support@github.com>
2023-07-09 19:59:16 +00:00
dependabot[bot]
d186adbbbb Bump tough-cookie from 4.1.2 to 4.1.3 in /Dashboard
Bumps [tough-cookie](https://github.com/salesforce/tough-cookie) from 4.1.2 to 4.1.3.
- [Release notes](https://github.com/salesforce/tough-cookie/releases)
- [Changelog](https://github.com/salesforce/tough-cookie/blob/master/CHANGELOG.md)
- [Commits](https://github.com/salesforce/tough-cookie/compare/v4.1.2...v4.1.3)

---
updated-dependencies:
- dependency-name: tough-cookie
  dependency-type: indirect
...

Signed-off-by: dependabot[bot] <support@github.com>
2023-07-09 19:57:56 +00:00
Nawaz Dhandala
3bc6794948 Merge pull request #511 from OneUptime/dependabot/npm_and_yarn/StatusPage/tough-cookie-4.1.3
Bump tough-cookie from 4.1.2 to 4.1.3 in /StatusPage
2023-07-09 20:57:20 +01:00
Nawaz Dhandala
f5e0f90e11 Merge pull request #510 from OneUptime/dependabot/npm_and_yarn/TestServer/tough-cookie-4.1.3
Bump tough-cookie from 4.1.2 to 4.1.3 in /TestServer
2023-07-09 20:57:12 +01:00
Nawaz Dhandala
536e0e3cf8 Merge pull request #509 from OneUptime/dependabot/npm_and_yarn/Model/tough-cookie-4.1.3
Bump tough-cookie from 4.1.2 to 4.1.3 in /Model
2023-07-09 20:57:04 +01:00
Nawaz Dhandala
b82c2acf67 Merge pull request #507 from OneUptime/dependabot/npm_and_yarn/ProbeAPI/tough-cookie-4.1.3
Bump tough-cookie from 4.1.2 to 4.1.3 in /ProbeAPI
2023-07-09 20:56:58 +01:00
Nawaz Dhandala
bd46971ad8 Merge pull request #506 from OneUptime/dependabot/npm_and_yarn/Scripts/tough-cookie-4.1.3
Bump tough-cookie from 4.1.2 to 4.1.3 in /Scripts
2023-07-09 20:56:49 +01:00
dependabot[bot]
61cbae6a3f Bump tough-cookie from 4.1.2 to 4.1.3 in /StatusPage
Bumps [tough-cookie](https://github.com/salesforce/tough-cookie) from 4.1.2 to 4.1.3.
- [Release notes](https://github.com/salesforce/tough-cookie/releases)
- [Changelog](https://github.com/salesforce/tough-cookie/blob/master/CHANGELOG.md)
- [Commits](https://github.com/salesforce/tough-cookie/compare/v4.1.2...v4.1.3)

---
updated-dependencies:
- dependency-name: tough-cookie
  dependency-type: indirect
...

Signed-off-by: dependabot[bot] <support@github.com>
2023-07-09 19:46:34 +00:00
dependabot[bot]
d9c13333ed Bump tough-cookie from 4.1.2 to 4.1.3 in /TestServer
Bumps [tough-cookie](https://github.com/salesforce/tough-cookie) from 4.1.2 to 4.1.3.
- [Release notes](https://github.com/salesforce/tough-cookie/releases)
- [Changelog](https://github.com/salesforce/tough-cookie/blob/master/CHANGELOG.md)
- [Commits](https://github.com/salesforce/tough-cookie/compare/v4.1.2...v4.1.3)

---
updated-dependencies:
- dependency-name: tough-cookie
  dependency-type: indirect
...

Signed-off-by: dependabot[bot] <support@github.com>
2023-07-09 19:46:29 +00:00
dependabot[bot]
6716339317 Bump tough-cookie from 4.1.2 to 4.1.3 in /Model
Bumps [tough-cookie](https://github.com/salesforce/tough-cookie) from 4.1.2 to 4.1.3.
- [Release notes](https://github.com/salesforce/tough-cookie/releases)
- [Changelog](https://github.com/salesforce/tough-cookie/blob/master/CHANGELOG.md)
- [Commits](https://github.com/salesforce/tough-cookie/compare/v4.1.2...v4.1.3)

---
updated-dependencies:
- dependency-name: tough-cookie
  dependency-type: indirect
...

Signed-off-by: dependabot[bot] <support@github.com>
2023-07-09 19:46:14 +00:00
Nawaz Dhandala
49b4388491 Merge pull request #508 from OneUptime/nzdhandala-patch-1
Update README.md
2023-07-09 20:45:59 +01:00
Nawaz Dhandala
6300416593 Update README.md 2023-07-09 20:45:43 +01:00
dependabot[bot]
c7aa6123b2 Bump tough-cookie from 4.1.2 to 4.1.3 in /ProbeAPI
Bumps [tough-cookie](https://github.com/salesforce/tough-cookie) from 4.1.2 to 4.1.3.
- [Release notes](https://github.com/salesforce/tough-cookie/releases)
- [Changelog](https://github.com/salesforce/tough-cookie/blob/master/CHANGELOG.md)
- [Commits](https://github.com/salesforce/tough-cookie/compare/v4.1.2...v4.1.3)

---
updated-dependencies:
- dependency-name: tough-cookie
  dependency-type: indirect
...

Signed-off-by: dependabot[bot] <support@github.com>
2023-07-09 19:45:41 +00:00
dependabot[bot]
df17c47dd4 Bump tough-cookie from 4.1.2 to 4.1.3 in /Scripts
Bumps [tough-cookie](https://github.com/salesforce/tough-cookie) from 4.1.2 to 4.1.3.
- [Release notes](https://github.com/salesforce/tough-cookie/releases)
- [Changelog](https://github.com/salesforce/tough-cookie/blob/master/CHANGELOG.md)
- [Commits](https://github.com/salesforce/tough-cookie/compare/v4.1.2...v4.1.3)

---
updated-dependencies:
- dependency-name: tough-cookie
  dependency-type: indirect
...

Signed-off-by: dependabot[bot] <support@github.com>
2023-07-09 19:45:35 +00:00
Nawaz Dhandala
5e8962917b Merge pull request #501 from OneUptime/on-call-duty
On call duty
2023-07-09 20:44:57 +01:00
Simon Larsen
112b72d2ed fix issues with on-call 2023-07-09 20:44:40 +01:00
Simon Larsen
3d3bf1d092 fix regex to include longer phone numbers 2023-07-09 19:49:43 +01:00
Simon Larsen
e5f7fc4cef fix domain and include za 2023-07-09 19:47:30 +01:00
Simon Larsen
bf82694b6e add sent states 2023-07-09 17:14:44 +01:00
Simon Larsen
d1fa52c8dc fix model required fields. 2023-07-09 17:06:10 +01:00
Simon Larsen
577d1dceea add resource notifictions 2023-07-09 16:31:53 +01:00
Simon Larsen
9b4e3172c3 add sidemenu 2023-07-09 15:52:20 +01:00
Simon Larsen
b7db3a42b5 underline on hover 2023-07-09 15:21:36 +01:00
Simon Larsen
a8292e5183 fix fmt 2023-07-09 15:14:22 +01:00
Simon Larsen
bf2b95fda7 fix fmt 2023-07-09 15:13:09 +01:00
Simon Larsen
3f1550096c fix sso docs 2023-07-09 15:11:01 +01:00
Simon Larsen
860beafd74 filter by severity 2023-07-09 13:39:46 +01:00
Simon Larsen
66839a01d6 fix filter 2023-07-09 13:27:14 +01:00
Simon Larsen
cf4fbdc8fc fix date filter 2023-07-09 13:19:29 +01:00
Simon Larsen
f2a1a0596d fix enum status 2023-07-09 13:04:46 +01:00
Simon Larsen
40e72a4c00 add pricing for on-call 2023-07-09 12:53:50 +01:00
Simon Larsen
30cae266b0 refactor into a table component 2023-07-08 22:43:29 +01:00
Simon Larsen
d54708b2c4 fix sidemenu style 2023-07-08 22:22:13 +01:00
Simon Larsen
f33d35a45b fix issues with oncall 2023-07-08 15:16:37 +01:00
Simon Larsen
de1f64aa6b add pricing to home 2023-07-08 14:56:46 +01:00
Simon Larsen
a325b66034 add call and sms pricing to home 2023-07-08 14:51:54 +01:00
Simon Larsen
031ed59108 refactor home project 2023-07-08 14:18:05 +01:00
Simon Larsen
8e78d74568 fix execution log view 2023-07-08 13:16:56 +01:00
Simon Larsen
1c3b462a8f add on call log ui 2023-07-07 22:14:24 +01:00
Simon Larsen
ee25e8f218 add notification timeline page. 2023-07-07 19:21:43 +01:00
Simon Larsen
573c074aef add new fields to timeline 2023-07-07 14:34:55 +01:00
Simon Larsen
53b55ac7f6 add notification logs page 2023-07-07 14:13:59 +01:00
Simon Larsen
f054b131e4 add notification logs page 2023-07-05 22:18:19 +01:00
Simon Larsen
f80ae8e806 fix infinate type 2023-07-05 21:18:48 +01:00
Simon Larsen
5464fed1a8 add workers for timelines 2023-07-05 20:20:46 +01:00
Simon Larsen
b4311d02d4 add dotdash logo 2023-07-05 09:41:15 +01:00
Simon Larsen
7778182f02 add types 2023-07-04 12:49:59 +01:00
Simon Larsen
b5fb766f3d add notification id to notification service 2023-07-04 12:42:22 +01:00
Simon Larsen
d236131171 add ack of incident 2023-07-04 12:26:49 +01:00
Simon Larsen
f88c0d5161 add call handler api 2023-07-03 22:15:17 +01:00
Simon Larsen
9eab1cd1c1 Merge branch 'master' into on-call-duty 2023-07-03 20:40:54 +01:00
Simon Larsen
a68cefd27c fix adding triggr node 2023-07-03 17:14:51 +01:00
Simon Larsen
71ce42476b add run to webhook 2023-07-03 17:07:34 +01:00
Simon Larsen
e795470ea7 add success port to webhook 2023-07-03 17:05:32 +01:00
Simon Larsen
f87f721487 add timelne service and events. 2023-07-02 22:28:37 +01:00
Simon Larsen
962c79e3dc add user notification rule 2023-07-02 13:39:51 +01:00
Simon Larsen
2ef0c9334d fix fmt 2023-07-01 13:08:50 +01:00
Simon Larsen
f18bb3a3de add url shortner 2023-07-01 12:58:59 +01:00
Simon Larsen
d724932660 link shortner 2023-07-01 12:01:54 +01:00
Simon Larsen
4de9a308bd add link shortner service 2023-07-01 11:57:53 +01:00
Simon Larsen
1760731fab add new fields in on-call-ex-log 2023-06-30 13:45:36 +01:00
Simon Larsen
88e554d26b add on call policy to incident 2023-06-30 12:32:02 +01:00
Simon Larsen
50dac60b65 fix fmt 2023-06-30 11:48:40 +01:00
Simon Larsen
c2fb75cdc5 add monitors 2023-06-30 11:27:06 +01:00
Simon Larsen
560acb7626 select on call policy 2023-06-30 10:56:01 +01:00
Simon Larsen
394571144d fix display of users and teams 2023-06-29 19:36:46 +01:00
Simon Larsen
35fef64623 add list props in table 2023-06-29 12:56:55 +01:00
Simon Larsen
fdaca5f804 fix sort order 2023-06-29 12:02:23 +01:00
Simon Larsen
716fe16487 enable drag and drop on list 2023-06-29 11:35:20 +01:00
Simon Larsen
7d63433f65 add err in findOneById 2023-06-28 13:53:10 +01:00
Simon Larsen
ea122c0e77 fix issue with fetching id. 2023-06-28 13:46:57 +01:00
Simon Larsen
f0d71bc65b fix link in on-call duty 2023-06-27 20:46:03 +01:00
Simon Larsen
c33b2b0946 add order to on-call escalation rule 2023-06-27 20:24:57 +01:00
Simon Larsen
0475c18b0f fix typo 2023-06-26 18:55:41 +01:00
Simon Larsen
8396d7cbd7 do not show view id btn causes confusion 2023-06-26 17:59:03 +01:00
Simon Larsen
66e34014b9 fix fmt 2023-06-26 12:00:25 +01:00
Simon Larsen
908c108116 add log statements to domain verification 2023-06-26 11:59:03 +01:00
Simon Larsen
8130bb3bb7 fix issues with incident auto-resolve 2023-06-26 11:50:45 +01:00
Simon Larsen
0813f1425f relaod bash 2023-06-26 11:09:58 +01:00
Simon Larsen
3f9ca54c61 add probe monitor response. 2023-06-25 20:09:22 +01:00
Simon Larsen
03c49bc5cc add id generation 2023-06-25 19:06:43 +01:00
Simon Larsen
7007834394 add auto resolve incident in montor response 2023-06-25 19:02:43 +01:00
Simon Larsen
e7ee37c218 add incident id 2023-06-25 17:03:31 +01:00
Simon Larsen
5590b4fde2 fix fmt 2023-06-25 15:16:39 +01:00
Simon Larsen
1750692328 add root casuse messages 2023-06-25 15:14:54 +01:00
Simon Larsen
03ceda4f77 fix grammar 2023-06-25 15:03:50 +01:00
Simon Larsen
110f596cf6 fix incident and monitor service 2023-06-25 14:56:14 +01:00
Simon Larsen
63288ab589 fix fmt 2023-06-25 14:51:38 +01:00
Simon Larsen
c9480bea8f fix permissions and root cause 2023-06-25 14:46:32 +01:00
Simon Larsen
3a78307c2e add root cause 2023-06-25 14:33:49 +01:00
Simon Larsen
89ed205b50 add root cause 2023-06-25 14:11:59 +01:00
Simon Larsen
490edf1859 add root cause to monitoring 2023-06-25 13:34:25 +01:00
Simon Larsen
5fb42b9c6d add logs to status timeline 2023-06-25 11:24:23 +01:00
Simon Larsen
d5e07fc788 add logs to monitor probe 2023-06-25 10:23:42 +01:00
Simon Larsen
c3c871f9cc add auto resolve types 2023-06-23 17:30:37 +01:00
Simon Larsen
72635b8c8f fix deserlization 2023-06-23 11:22:51 +01:00
Simon Larsen
057d895aaf add type checking 2023-06-23 11:00:51 +01:00
Simon Larsen
407fc1240a add pricing controls 2023-06-22 20:53:38 +01:00
Simon Larsen
2bc307c564 add column access pricing controls 2023-06-22 20:41:03 +01:00
Simon Larsen
c42790e6f2 center loader 2023-06-22 20:20:04 +01:00
Simon Larsen
ecdbea2aab remove company name from user settings 2023-06-22 20:12:12 +01:00
Simon Larsen
7cb98456b1 ad owner fields to project model 2023-06-22 20:03:21 +01:00
Simon Larsen
4f80317b14 add disabled settings 2023-06-22 18:55:55 +01:00
Simon Larsen
7a589d65a3 add disable monitor page 2023-06-22 18:07:07 +01:00
Simon Larsen
acd5d04ee9 fix createdAt 2023-06-22 17:56:16 +01:00
Simon Larsen
998c85e393 update project last active 2023-06-22 17:51:28 +01:00
Simon Larsen
70478bd1fa fix createdAt not populating 2023-06-22 17:41:19 +01:00
Simon Larsen
4c06feeb50 fix fmt 2023-06-21 19:40:44 +01:00
Simon Larsen
2acd6d5ce0 add disable monitoring 2023-06-21 19:39:17 +01:00
Simon Larsen
56e7c0c7d0 fix monitor type enum 2023-06-21 19:00:23 +01:00
Simon Larsen
7948070be6 add user limit 2023-06-21 18:47:35 +01:00
Nawaz Dhandala
a9139fcca0 Merge pull request #484 from OneUptime/on-call
On-Call Duty -> On Call Duty Policy
2023-06-21 15:57:16 +01:00
Simon Larsen
99b3dc65a7 rename file with typo 2023-06-21 14:25:32 +01:00
Simon Larsen
599c7a175e fix 2023-06-21 14:25:17 +01:00
Simon Larsen
0a03dc652c fix migrations 2023-06-21 14:20:00 +01:00
Simon Larsen
53f72c2192 fix case 2023-06-21 13:39:24 +01:00
Simon Larsen
53334ad3dc make notiifction rule work properly 2023-06-20 15:41:54 +01:00
Simon Larsen
4d7ddf7be1 add notification rule 2023-06-20 15:34:33 +01:00
Simon Larsen
9dfdd0841f add delete trigger to call email and sms 2023-06-20 12:47:26 +01:00
Simon Larsen
7f662291e4 fix rule 2023-06-20 12:03:22 +01:00
Simon Larsen
9bbd32424e Merge branch 'master' into on-call 2023-06-20 11:53:49 +01:00
Simon Larsen
41b5fe3a19 fix null issue with select 2023-06-20 11:51:54 +01:00
Simon Larsen
d35195a591 fix notification types 2023-06-20 11:43:54 +01:00
Simon Larsen
ee229d3711 fix relation fetch in table 2023-06-20 10:05:41 +01:00
Simon Larsen
9eb12a5348 fix issues with table 2023-06-20 10:02:11 +01:00
Simon Larsen
0bb8343f0b fix typo 2023-06-19 20:27:43 +01:00
Simon Larsen
d5c13f5c26 fix fmt 2023-06-19 19:52:24 +01:00
Simon Larsen
9e57fe1531 add notification rule 2023-06-19 19:49:15 +01:00
Simon Larsen
8b10e0d9f0 fix fmt 2023-06-19 19:40:38 +01:00
Simon Larsen
45d7dc90b3 add donation in readme 2023-06-19 19:06:51 +01:00
Simon Larsen
da2683391d add notification rule 2023-06-19 17:57:48 +01:00
Simon Larsen
ea50830dae add notification rule model. 2023-06-19 17:52:49 +01:00
Simon Larsen
985a7ca973 fix side menu link 2023-06-19 13:11:48 +01:00
Simon Larsen
2c649bed07 fix on call custom fields 2023-06-19 13:06:22 +01:00
Simon Larsen
78fad54d6a Merge branch 'master' into on-call 2023-06-19 12:31:44 +01:00
Simon Larsen
05c583fd81 add plan name in project model 2023-06-19 12:30:52 +01:00
Simon Larsen
b99912abd6 add plan name to project 2023-06-19 12:27:10 +01:00
Simon Larsen
c3a5a8a4e8 add custom fields 2023-06-19 12:07:53 +01:00
Simon Larsen
ad451fd9c9 Merge branch 'master' into on-call 2023-06-19 11:29:39 +01:00
Simon Larsen
ce31e0cfff Merge pull request #489 from OneUptime/created-at-refactor
fix createdat
2023-06-19 11:24:40 +01:00
Simon Larsen
545dcea3e8 fix createdat 2023-06-19 11:24:25 +01:00
Simon Larsen
29accb2e6f Merge branch 'master' into release 2023-06-19 10:35:28 +01:00
Simon Larsen
8cb8a1ed72 Merge pull request #488 from OneUptime/standard-workflows
add select clause to trigger
2023-06-19 10:34:02 +01:00
Simon Larsen
a8beed5c5c add select clause to trigger 2023-06-19 10:32:54 +01:00
Simon Larsen
8d59fdc732 Merge pull request #487 from OneUptime/master
Staus Page redirection fix
2023-06-16 19:45:16 +01:00
Simon Larsen
a7fe18fd65 fix rounded corners 2023-06-16 18:25:18 +01:00
Simon Larsen
e80835c380 Merge branch 'master' into on-call 2023-06-16 18:13:21 +01:00
Simon Larsen
bbd60075fa fix preview selector 2023-06-16 18:11:25 +01:00
Simon Larsen
622bb87b89 add call logs 2023-06-16 14:04:57 +01:00
Simon Larsen
3d3c9876eb add env var 2023-06-16 14:00:40 +01:00
Simon Larsen
ea588be0f7 Merge branch 'master' into on-call 2023-06-16 13:32:34 +01:00
Simon Larsen
0fe1779ce4 fix gtetId() 2023-06-16 13:30:06 +01:00
Simon Larsen
71f2d3b87a add side menu item 2023-06-16 13:29:11 +01:00
Simon Larsen
8d0670d05c add call log 2023-06-16 13:26:32 +01:00
Simon Larsen
1b6eccfb36 fix fmt 2023-06-16 12:33:16 +01:00
Simon Larsen
9a7c2cedf5 add call service 2023-06-16 12:25:37 +01:00
Simon Larsen
55b9a6bf9f Merge branch 'master' into on-call 2023-06-16 12:22:05 +01:00
Simon Larsen
9ddca843c8 refactor status page 2023-06-16 12:13:57 +01:00
Simon Larsen
2a1786147b fix status page set 2023-06-16 11:45:28 +01:00
Simon Larsen
1bc572c4be fix lint 2023-06-16 11:32:23 +01:00
Simon Larsen
f961796c7c fix sttaus page redirection 2023-06-16 11:14:32 +01:00
Simon Larsen
ff1f564527 add call config 2023-06-16 10:40:27 +01:00
Simon Larsen
6ef61221bf ad sms service 2023-06-15 15:07:34 +01:00
Simon Larsen
1b7d17fb9e fix terms in sla and make them clearer 2023-06-15 12:21:56 +01:00
Simon Larsen
04f7d1f8bf fix typo 2023-06-15 12:18:36 +01:00
Simon Larsen
2edbe0df08 add resend verifiction code 2023-06-14 21:16:07 +01:00
Simon Larsen
a96dc90104 fix template 2023-06-14 21:05:43 +01:00
Simon Larsen
3e8b966dc8 fix models 2023-06-14 21:02:10 +01:00
Simon Larsen
1ee94f10c4 fix fmt 2023-06-14 20:13:24 +01:00
Simon Larsen
74866edadb add workflow help banner 2023-06-14 20:07:44 +01:00
Simon Larsen
e402ebc14c Merge branch 'master' into on-call 2023-06-14 20:04:00 +01:00
Simon Larsen
4297cead16 fix fmt 2023-06-14 19:59:26 +01:00
Simon Larsen
da021bbd10 add logs for api monitor 2023-06-14 19:53:50 +01:00
Simon Larsen
ab48de6e9b add user settings 2023-06-14 19:41:03 +01:00
Simon Larsen
314b905e8f add api for user notification methods 2023-06-14 14:56:47 +01:00
Simon Larsen
db60c0fefb add more icons 2023-06-14 14:38:35 +01:00
Simon Larsen
713d9464a2 add default value capability 2023-06-14 14:04:32 +01:00
Simon Larsen
84cc4a35d4 fix user email 2023-06-14 13:55:38 +01:00
Simon Larsen
6a64b8658a add user emails for notifications. 2023-06-14 13:47:01 +01:00
Simon Larsen
b8ee827068 fix lint 2023-06-14 12:28:54 +01:00
Simon Larsen
8fea1b6e3d fix sidemenu 2023-06-14 12:19:03 +01:00
Simon Larsen
96934f5f22 fix app.tsx 2023-06-14 12:17:45 +01:00
Simon Larsen
a2ad4d30e7 fix populate route params 2023-06-14 12:11:53 +01:00
Simon Larsen
0623588019 fix lint. 2023-06-14 11:30:09 +01:00
Simon Larsen
f1d087da44 add services and api 2023-06-13 17:03:38 +01:00
Simon Larsen
5dca4a0fd3 add services 2023-06-13 16:57:02 +01:00
Simon Larsen
7d085274de add models of on-call 2023-06-13 16:46:25 +01:00
Simon Larsen
1da9184a14 Merge branch 'master' into on-call 2023-06-13 10:47:06 +01:00
Simon Larsen
12c429597c fix entity name 2023-06-13 10:44:23 +01:00
Simon Larsen
314a9ef61c fix company in legal 2023-06-13 10:37:24 +01:00
Simon Larsen
5961504577 fix redirect issue 2023-06-13 10:01:08 +01:00
Simon Larsen
a7757e547c On-Call Duty -> On Call Duty Policy 2023-06-12 19:59:38 +01:00
Simon Larsen
6a4e2cfcb7 make bool 2023-06-12 18:18:56 +01:00
Simon Larsen
6744c92cf3 fix issue with status api 2023-06-12 17:05:31 +01:00
Simon Larsen
7c4f2c3279 fix select type 2023-06-12 17:01:30 +01:00
Simon Larsen
d68b066127 fix lint 2023-06-12 16:50:03 +01:00
Simon Larsen
236fdbe8ab remove dup keys 2023-06-12 15:00:06 +01:00
Simon Larsen
92a5710055 fix getItem 2023-06-12 14:58:17 +01:00
Simon Larsen
f2715f7637 fix get list 2023-06-12 14:57:35 +01:00
Simon Larsen
4339abe9d6 fix get list 2023-06-12 14:57:30 +01:00
Simon Larsen
341f30e6a5 fix common ui 2023-06-12 14:51:56 +01:00
Simon Larsen
17967a691d remove populate 2023-06-12 14:45:53 +01:00
Simon Larsen
333160db8a remove populate 2023-06-12 14:45:47 +01:00
Simon Larsen
bb5ac117d8 populate -> SelectRelation 2023-06-12 14:15:13 +01:00
Simon Larsen
4277b8c1c4 fix workflow miss issue 2023-06-12 12:34:42 +01:00
Simon Larsen
8bd9bf4136 fix redirect issue 2023-06-12 11:15:47 +01:00
Simon Larsen
b5ac6c7f01 preinstall -> configure 2023-06-12 10:42:43 +01:00
Simon Larsen
829a97ffbb fix if name is null err 2023-06-12 10:10:53 +01:00
Simon Larsen
bc50e4f330 Merge branch 'release' 2023-06-12 10:10:05 +01:00
Simon Larsen
28c01a9d9f fix lint 2023-06-12 10:04:16 +01:00
Simon Larsen
94bcbc7c6a fix perms with billing payment method 2023-06-12 10:02:53 +01:00
Simon Larsen
6fb2b3d3ac add update script 2023-06-11 15:26:52 +01:00
Simon Larsen
d0ae06119f Update README.md 2023-06-10 13:08:01 +01:00
Simon Larsen
c68b41089a Update README.md 2023-06-10 13:07:34 +01:00
Simon Larsen
68d35d94de Merge pull request #483 from OneUptime/simlarsen-patch-1
Update README.md
2023-06-10 10:00:13 +01:00
Simon Larsen
72d5b4c186 Update README.md 2023-06-10 10:00:03 +01:00
Simon Larsen
e3c613c1a1 make manual recharge work 2023-06-09 18:42:24 +01:00
Simon Larsen
ded0e2638b make manual recharge work 2023-06-09 18:20:53 +01:00
Simon Larsen
bb609e2ccc add manual recharge option 2023-06-09 18:16:31 +01:00
Simon Larsen
ecbd725fb2 Merge branch 'master' into sms-service 2023-06-09 16:58:44 +01:00
Simon Larsen
3b5c2b2cc6 Merge branch 'release' 2023-06-09 16:56:37 +01:00
Simon Larsen
38000fdbec make api error message more descriptive. 2023-06-09 16:56:26 +01:00
Simon Larsen
f07d68c049 make error message more descriptive. 2023-06-09 16:55:01 +01:00
Simon Larsen
99a782e0e9 fix typo 2023-06-09 16:40:56 +01:00
Simon Larsen
05138909ca Merge branch 'master' of github.com-simon:OneUptime/oneuptime 2023-06-09 14:03:21 +01:00
Simon Larsen
c495f3295e fix grammar 2023-06-09 14:03:18 +01:00
Simon Larsen
e2c99bd4e2 Merge pull request #481 from bionemesis/patch-4
Update SSO.tsx
2023-06-09 14:01:04 +01:00
Simon Larsen
9e695e5117 fix typo staus -> status 2023-06-09 13:58:56 +01:00
Simon Larsen
7c6100ff69 fix fmt 2023-06-09 13:57:31 +01:00
Simon Larsen
22361ea3a1 fix typo from staus to status 2023-06-09 13:56:15 +01:00
bionemesis
ff9706b3e4 Update SSO.tsx
Fix typo: staus > status
2023-06-09 06:52:55 -06:00
Simon Larsen
0b02f6027f Merge pull request #480 from bionemesis/patch-3
Update index.ejs
2023-06-09 13:51:49 +01:00
bionemesis
ac44e21db7 Update index.ejs
Fix typo: staus > status
2023-06-09 06:48:38 -06:00
Simon Larsen
e036492296 Merge branch 'master' of github.com-simon:OneUptime/oneuptime 2023-06-09 13:43:46 +01:00
Simon Larsen
4b49297e2a fix fmt in billing service 2023-06-09 13:43:25 +01:00
Simon Larsen
6e09a95431 Merge pull request #478 from bionemesis/patch-2
Update Groups.tsx
2023-06-09 13:42:20 +01:00
Simon Larsen
8110cca424 remove worker test 2023-06-09 13:41:38 +01:00
Simon Larsen
11bc9654ab Merge pull request #477 from bionemesis/patch-1
Update CriteriaFilter.ts
2023-06-09 13:40:37 +01:00
bionemesis
5d08a20a7d Update Groups.tsx
Fix typo: staus > status
2023-06-09 06:40:29 -06:00
Simon Larsen
1ed51a6dc2 implement emails for erorr states 2023-06-09 13:39:20 +01:00
bionemesis
3027f11164 Update CriteriaFilter.ts
Fix typo: staus > status
2023-06-09 06:38:24 -06:00
Simon Larsen
7baafd0db6 Merge branch 'sms-service' 2023-06-09 12:26:43 +01:00
Simon Larsen
d0f7831505 fix notification service 2023-06-09 12:25:17 +01:00
Simon Larsen
457a457eee fix bugs with auto recharge 2023-06-08 21:55:48 +01:00
Simon Larsen
f7ef0a8e96 Merge pull request #474 from OneUptime/dependabot/npm_and_yarn/CommonServer/fast-xml-parser-and-aws-sdk/credential-providers-4.2.4
Bump fast-xml-parser and @aws-sdk/credential-providers in /CommonServer
2023-06-08 20:59:26 +01:00
Simon Larsen
d3d0fa1593 dleet workflow logs older than 30 days 2023-06-08 20:55:57 +01:00
Simon Larsen
edc4e472e9 fix preinstall script 2023-06-08 20:52:25 +01:00
Simon Larsen
39c6e36e2f fix basic form 2023-06-08 20:52:10 +01:00
Simon Larsen
eeb5cf1cce fix fmt 2023-06-08 18:00:44 +01:00
Simon Larsen
c018f95e70 fix issue with dropdown 2023-06-08 17:38:43 +01:00
Simon Larsen
125c6417cf fix billing service 2023-06-08 17:32:30 +01:00
Simon Larsen
19be9f42b6 add payment method 2023-06-08 17:21:14 +01:00
Simon Larsen
4b17d3a125 fix issue in project service 2023-06-08 17:15:20 +01:00
Simon Larsen
d7c8edd598 hard delete tiems in the database 2023-06-08 17:14:05 +01:00
Simon Larsen
b0f4083297 fix project service 2023-06-08 16:19:04 +01:00
Simon Larsen
b840f78d1d refactor notification service 2023-06-08 15:55:32 +01:00
Simon Larsen
83289cc80e fix if cond 2023-06-08 14:42:53 +01:00
Simon Larsen
2a7f18fa60 fix fmt 2023-06-08 14:41:59 +01:00
Simon Larsen
aed03ffcb3 add invoice service 2023-06-08 14:38:55 +01:00
Simon Larsen
673f97404b fix sms service 2023-06-08 13:53:04 +01:00
Simon Larsen
8459e2873c send sms service 2023-06-08 13:40:03 +01:00
Simon Larsen
3b0904a01d add sms service 2023-06-08 13:34:34 +01:00
Simon Larsen
3f53053e1f add usd cents field 2023-06-08 12:05:43 +01:00
Simon Larsen
9a1e27db5c send sms 2023-06-08 11:58:58 +01:00
Simon Larsen
82849c28ce fix lint 2023-06-07 19:51:41 +01:00
Simon Larsen
08bd171b2f fix sms 2023-06-07 19:47:51 +01:00
Simon Larsen
844611d176 add service 2023-06-07 19:38:11 +01:00
Simon Larsen
aaa3b9af3e make logs page work 2023-06-07 19:26:42 +01:00
Simon Larsen
6c10f81226 add call and sms settings. 2023-06-07 19:17:16 +01:00
Simon Larsen
c2fe4d3e5e add sms log models. 2023-06-07 14:59:44 +01:00
Simon Larsen
fd3bc4dd86 add new fields in project 2023-06-07 14:41:09 +01:00
Simon Larsen
05d20e200f add support for arrays in workflows 2023-06-07 11:39:44 +01:00
Simon Larsen
7a2e44a404 fix config template 2023-06-07 10:55:28 +01:00
Simon Larsen
0eb28ee669 remove alert from nginx 2023-06-07 10:47:40 +01:00
Simon Larsen
77ac490b71 fix rmeove orphans 2023-06-07 10:45:34 +01:00
dependabot[bot]
a018b9fa94 Bump fast-xml-parser and @aws-sdk/credential-providers in /CommonServer
Bumps [fast-xml-parser](https://github.com/NaturalIntelligence/fast-xml-parser) and [@aws-sdk/credential-providers](https://github.com/aws/aws-sdk-js-v3/tree/HEAD/packages/credential-providers). These dependencies needed to be updated together.

Updates `fast-xml-parser` from 4.1.2 to 4.2.4
- [Release notes](https://github.com/NaturalIntelligence/fast-xml-parser/releases)
- [Changelog](https://github.com/NaturalIntelligence/fast-xml-parser/blob/master/CHANGELOG.md)
- [Commits](https://github.com/NaturalIntelligence/fast-xml-parser/compare/v4.1.2...v4.2.4)

Updates `@aws-sdk/credential-providers` from 3.315.0 to 3.347.1
- [Release notes](https://github.com/aws/aws-sdk-js-v3/releases)
- [Changelog](https://github.com/aws/aws-sdk-js-v3/blob/main/packages/credential-providers/CHANGELOG.md)
- [Commits](https://github.com/aws/aws-sdk-js-v3/commits/v3.347.1/packages/credential-providers)

---
updated-dependencies:
- dependency-name: fast-xml-parser
  dependency-type: indirect
- dependency-name: "@aws-sdk/credential-providers"
  dependency-type: indirect
...

Signed-off-by: dependabot[bot] <support@github.com>
2023-06-07 09:11:33 +00:00
Simon Larsen
d16cf40914 Merge pull request #473 from OneUptime/refactor-notification-service
Refactor notification service
2023-06-07 10:06:56 +01:00
Simon Larsen
e0e6678f65 remove alert from docker compose 2023-06-07 09:52:08 +01:00
Simon Larsen
387f3a366e fix lint 2023-06-07 09:06:41 +01:00
Simon Larsen
e446583376 fix subject 2023-06-06 21:45:16 +01:00
Simon Larsen
85a1ee8ae7 add other features to notification service. 2023-06-06 21:36:32 +01:00
Simon Larsen
2a5c7cfbfe change port 2023-06-06 21:32:18 +01:00
Simon Larsen
fdbfcef3c0 fix env names 2023-06-06 21:31:42 +01:00
Simon Larsen
db50d12d8a rename config 2023-06-06 21:25:45 +01:00
Simon Larsen
0a07ad6cd3 rename mailservice 2023-06-06 21:23:56 +01:00
Simon Larsen
0970f453e4 remove alert service 2023-06-06 21:17:58 +01:00
Simon Larsen
742ee7c3cf fix fmt 2023-06-06 20:56:08 +01:00
Simon Larsen
05199efd12 fix labels and add logs for ping 2023-06-06 20:54:57 +01:00
Simon Larsen
c931698fd6 add hostname to ping monitor 2023-06-06 20:48:21 +01:00
Simon Larsen
39455e86eb fix var 2023-06-06 20:35:41 +01:00
Simon Larsen
057369ad4a Merge pull request #467 from beejay141/test/CommonServer/UserAuthorization
test: added unit test for file CommonServer/Middleware/UserAuthorization
2023-06-06 20:33:18 +01:00
Abolaji Oyerinde
c4ef932e13 fix: changed 'this' referecence to static functions to Class name 2023-06-06 14:52:52 +01:00
Simon Larsen
8523da6628 Merge pull request #465 from beejay141/test/CommonServer/Middleware
test: added unit tests for CommonServer/Middleware
2023-06-06 09:15:20 +01:00
Simon Larsen
42f94a468a Merge pull request #469 from beejay141/test/CommonUI/Card
test: added unit tests for Card Component
2023-06-06 09:07:28 +01:00
Simon Larsen
6ee03152f8 Merge pull request #471 from beejay141/test/CommonUI/SideOver
test: added unit tests for SideOver component
2023-06-06 09:06:54 +01:00
Simon Larsen
571b5d6ece fix typo 2023-06-06 09:05:38 +01:00
Abolaji Oyerinde
ce415d16e4 test: added unit tests for SideOver component 2023-06-05 15:03:50 +01:00
Abolaji Oyerinde
6f88062add test: added unit tests for Card Component 2023-06-05 13:26:27 +01:00
Abolaji Oyerinde
bf31b15930 test: refactored and added more unit tests 2023-06-04 21:00:19 +01:00
Abolaji Oyerinde
0426a86f62 refactor: splitted function getUserMiddleware into sub-functions 2023-06-04 14:57:37 +01:00
Abolaji Oyerinde
ad907aa854 refactor: changed hard-coded accessToken to ObjectID generated value 2023-06-03 22:26:14 +01:00
Abolaji Oyerinde
641b27101f test: added unit test for file CommonServer/Middleware/UserAuthorization 2023-06-03 22:07:01 +01:00
Abolaji Oyerinde
f0e77de240 test: added unit tests for CommonServer/Middleware 2023-06-02 23:11:23 +01:00
Simon Larsen
639c4b13ae fix issue with sending probe-id 2023-06-02 15:32:11 +01:00
Simon Larsen
e9af3e0b48 fix subprocessors 2023-06-02 09:35:35 +01:00
Simon Larsen
41b4092428 make redirect work 2023-06-01 20:19:27 +01:00
Simon Larsen
5f54f76698 fix probe-api conf 2023-06-01 19:58:43 +01:00
Simon Larsen
75e7a720f7 make url work 2023-06-01 08:03:38 +01:00
Simon Larsen
63211a69d8 fix email url 2023-06-01 08:02:12 +01:00
Simon Larsen
0efaec6b7b fix hidden text 2023-06-01 07:58:26 +01:00
Simon Larsen
39a00e9fc2 make terms clear 2023-05-27 09:35:18 +01:00
Simon Larsen
22ccdf444f remove posthog analytics 2023-05-26 19:26:24 +01:00
Simon Larsen
6372caeadf fix app name in probe 2023-05-26 00:20:06 +01:00
Simon Larsen
95c6cee3e2 add retry on probe 2023-05-25 23:44:20 +01:00
Simon Larsen
ab25a98372 fix issue with IP 2023-05-25 21:56:48 +01:00
Simon Larsen
5618f02992 add overview description to status page 2023-05-25 20:35:47 +01:00
Simon Larsen
932101677b fix render error 2023-05-25 09:47:43 +01:00
Simon Larsen
b3beca8c14 Merge branch 'master' of github.com-simon:OneUptime/oneuptime 2023-05-24 13:22:21 +01:00
Simon Larsen
bbbfb45cde fix regex in route 2023-05-24 13:21:47 +01:00
Simon Larsen
bc0085c330 Merge pull request #458 from OneUptime/dependabot/npm_and_yarn/ProbeAPI/socket.io-parser-4.2.3
Bump socket.io-parser from 4.2.2 to 4.2.3 in /ProbeAPI
2023-05-24 12:38:58 +01:00
Simon Larsen
dc0108939c Merge pull request #453 from OneUptime/dependabot/npm_and_yarn/Common/posthog-js-1.57.2
Bump posthog-js from 1.38.1 to 1.57.2 in /Common
2023-05-24 12:38:44 +01:00
dependabot[bot]
092449fdd3 Bump socket.io-parser from 4.2.2 to 4.2.3 in /ProbeAPI
Bumps [socket.io-parser](https://github.com/socketio/socket.io-parser) from 4.2.2 to 4.2.3.
- [Release notes](https://github.com/socketio/socket.io-parser/releases)
- [Changelog](https://github.com/socketio/socket.io-parser/blob/main/CHANGELOG.md)
- [Commits](https://github.com/socketio/socket.io-parser/compare/4.2.2...4.2.3)

---
updated-dependencies:
- dependency-name: socket.io-parser
  dependency-type: indirect
...

Signed-off-by: dependabot[bot] <support@github.com>
2023-05-24 11:38:39 +00:00
Simon Larsen
ce44710365 Merge pull request #454 from OneUptime/dependabot/npm_and_yarn/TestServer/posthog-js-1.57.2
Bump posthog-js from 1.38.1 to 1.57.2 in /TestServer
2023-05-24 12:38:38 +01:00
Simon Larsen
c55bdfc80d Merge pull request #455 from OneUptime/dependabot/npm_and_yarn/ProbeAPI/posthog-js-1.57.2
Bump posthog-js from 1.38.1 to 1.57.2 in /ProbeAPI
2023-05-24 12:38:31 +01:00
Simon Larsen
5897dfe598 Merge pull request #456 from OneUptime/dependabot/npm_and_yarn/Realtime/socket.io-parser-4.2.3
Bump socket.io-parser from 4.2.1 to 4.2.3 in /Realtime
2023-05-24 12:38:22 +01:00
Simon Larsen
2f60006f9c Merge pull request #457 from OneUptime/dependabot/npm_and_yarn/CommonServer/socket.io-parser-4.2.3
Bump socket.io-parser from 4.2.2 to 4.2.3 in /CommonServer
2023-05-24 12:38:12 +01:00
Simon Larsen
d5721524d0 Merge pull request #459 from OneUptime/dependabot/npm_and_yarn/TestServer/socket.io-parser-4.2.3
Bump socket.io-parser from 4.2.2 to 4.2.3 in /TestServer
2023-05-24 12:38:00 +01:00
dependabot[bot]
258efa9f1b Bump socket.io-parser from 4.2.2 to 4.2.3 in /TestServer
Bumps [socket.io-parser](https://github.com/socketio/socket.io-parser) from 4.2.2 to 4.2.3.
- [Release notes](https://github.com/socketio/socket.io-parser/releases)
- [Changelog](https://github.com/socketio/socket.io-parser/blob/main/CHANGELOG.md)
- [Commits](https://github.com/socketio/socket.io-parser/compare/4.2.2...4.2.3)

---
updated-dependencies:
- dependency-name: socket.io-parser
  dependency-type: indirect
...

Signed-off-by: dependabot[bot] <support@github.com>
2023-05-24 02:09:41 +00:00
dependabot[bot]
5627eae96b Bump socket.io-parser from 4.2.2 to 4.2.3 in /CommonServer
Bumps [socket.io-parser](https://github.com/socketio/socket.io-parser) from 4.2.2 to 4.2.3.
- [Release notes](https://github.com/socketio/socket.io-parser/releases)
- [Changelog](https://github.com/socketio/socket.io-parser/blob/main/CHANGELOG.md)
- [Commits](https://github.com/socketio/socket.io-parser/compare/4.2.2...4.2.3)

---
updated-dependencies:
- dependency-name: socket.io-parser
  dependency-type: indirect
...

Signed-off-by: dependabot[bot] <support@github.com>
2023-05-24 01:30:07 +00:00
dependabot[bot]
98e7a6a5f2 Bump socket.io-parser from 4.2.1 to 4.2.3 in /Realtime
Bumps [socket.io-parser](https://github.com/socketio/socket.io-parser) from 4.2.1 to 4.2.3.
- [Release notes](https://github.com/socketio/socket.io-parser/releases)
- [Changelog](https://github.com/socketio/socket.io-parser/blob/main/CHANGELOG.md)
- [Commits](https://github.com/socketio/socket.io-parser/compare/4.2.1...4.2.3)

---
updated-dependencies:
- dependency-name: socket.io-parser
  dependency-type: indirect
...

Signed-off-by: dependabot[bot] <support@github.com>
2023-05-24 00:51:28 +00:00
dependabot[bot]
681d3cc276 Bump posthog-js from 1.38.1 to 1.57.2 in /ProbeAPI
Bumps [posthog-js](https://github.com/PostHog/posthog-js) from 1.38.1 to 1.57.2.
- [Release notes](https://github.com/PostHog/posthog-js/releases)
- [Changelog](https://github.com/PostHog/posthog-js/blob/master/CHANGELOG.md)
- [Commits](https://github.com/PostHog/posthog-js/compare/v1.38.1...v1.57.2)

---
updated-dependencies:
- dependency-name: posthog-js
  dependency-type: indirect
...

Signed-off-by: dependabot[bot] <support@github.com>
2023-05-22 20:36:49 +00:00
dependabot[bot]
f41fd6f17f Bump posthog-js from 1.38.1 to 1.57.2 in /TestServer
Bumps [posthog-js](https://github.com/PostHog/posthog-js) from 1.38.1 to 1.57.2.
- [Release notes](https://github.com/PostHog/posthog-js/releases)
- [Changelog](https://github.com/PostHog/posthog-js/blob/master/CHANGELOG.md)
- [Commits](https://github.com/PostHog/posthog-js/compare/v1.38.1...v1.57.2)

---
updated-dependencies:
- dependency-name: posthog-js
  dependency-type: indirect
...

Signed-off-by: dependabot[bot] <support@github.com>
2023-05-22 20:36:48 +00:00
dependabot[bot]
9015e74371 Bump posthog-js from 1.38.1 to 1.57.2 in /Common
Bumps [posthog-js](https://github.com/PostHog/posthog-js) from 1.38.1 to 1.57.2.
- [Release notes](https://github.com/PostHog/posthog-js/releases)
- [Changelog](https://github.com/PostHog/posthog-js/blob/master/CHANGELOG.md)
- [Commits](https://github.com/PostHog/posthog-js/compare/v1.38.1...v1.57.2)

---
updated-dependencies:
- dependency-name: posthog-js
  dependency-type: direct:production
...

Signed-off-by: dependabot[bot] <support@github.com>
2023-05-22 20:36:39 +00:00
Simon Larsen
61a149c839 add protections for emails 2023-05-19 17:11:13 +01:00
Simon Larsen
020af0084c enfore project id in finding owners 2023-05-19 17:05:53 +01:00
Simon Larsen
856ba620cf fix state emails 2023-05-19 17:03:21 +01:00
Simon Larsen
369a65d46b disable emails 2023-05-19 16:56:59 +01:00
Simon Larsen
7375e6e528 add annnouncement email 2023-05-19 14:08:57 +01:00
Simon Larsen
adea15b069 fix date in detail 2023-05-19 13:57:59 +01:00
Simon Larsen
97217de1b8 make note created emails work 2023-05-19 13:50:27 +01:00
Simon Larsen
5733917fee make emails work 2023-05-19 13:50:20 +01:00
Simon Larsen
4e80778275 add note posted emails. 2023-05-19 13:23:11 +01:00
Simon Larsen
57e03bc3db fix incident service 2023-05-19 11:52:31 +01:00
Simon Larsen
4bb76db00c make scheduled maintenance emails work 2023-05-19 11:51:41 +01:00
Simon Larsen
57913a674d add state change emails 2023-05-19 11:39:10 +01:00
Simon Larsen
449e194aad add scheduled event state change email 2023-05-19 11:37:43 +01:00
Simon Larsen
6de0854892 fix incident state emails 2023-05-19 11:32:37 +01:00
Simon Larsen
7ec5e50b54 add history days in status page 2023-05-19 10:17:23 +01:00
Simon Larsen
f67e3a54a0 remove project admin 2023-05-19 09:39:32 +01:00
Simon Larsen
9b6a7915af fix billing payment certs 2023-05-19 09:33:16 +01:00
Simon Larsen
06ca30fcc7 fix issue with billing payment methods. 2023-05-19 09:31:50 +01:00
Simon Larsen
f8e3a3544f fix link in url 2023-05-19 09:17:12 +01:00
Simon Larsen
eb7002960d fix lint 2023-05-18 21:16:54 +01:00
Simon Larsen
4229561790 add owner emails 2023-05-18 21:15:24 +01:00
Simon Larsen
6241d701da add owner added emails 2023-05-18 18:13:27 +01:00
Simon Larsen
3c16c2c535 add owner email 2023-05-18 18:10:33 +01:00
Simon Larsen
a9e315ff15 add resource creation emails. 2023-05-18 17:22:44 +01:00
Simon Larsen
cff210d5df add resource created email 2023-05-18 17:13:22 +01:00
Simon Larsen
726bbf9c0d fix email 2023-05-18 15:25:31 +01:00
Simon Larsen
a3daff2a83 add monitor creation emails 2023-05-18 15:11:37 +01:00
Simon Larsen
435c8f083b add ownership email columns 2023-05-18 13:03:40 +01:00
Simon Larsen
759ffe72c8 fix plan 2023-05-18 10:37:10 +01:00
Simon Larsen
cd9f68d67c remove plan from growth 2023-05-18 10:33:37 +01:00
Simon Larsen
f5102f3e55 fix fmt 2023-05-17 21:27:19 +01:00
Simon Larsen
ac9eb27691 fix refactor 2023-05-17 20:15:07 +01:00
Simon Larsen
f3eb085986 Merge branch 'master' of github.com-simon:OneUptime/oneuptime 2023-05-17 20:14:41 +01:00
Simon Larsen
86e80e6084 fix email subject 2023-05-17 20:14:00 +01:00
Simon Larsen
2ad76f0a83 Merge pull request #450 from OneUptime/simlarsen-patch-1
Update README.md
2023-05-17 20:06:10 +01:00
Simon Larsen
e9e39ed1e4 Update README.md 2023-05-17 20:05:59 +01:00
Simon Larsen
9492674578 Add logos 2023-05-17 20:04:44 +01:00
Simon Larsen
9f60b59ec9 fix emails 2023-05-17 20:02:50 +01:00
Simon Larsen
c01600b32a fix parse err with emails 2023-05-17 20:02:06 +01:00
Simon Larsen
0a243381d6 staus page email edits 2023-05-17 19:54:04 +01:00
Simon Larsen
397bbfd3bf fix unsub block 2023-05-17 19:48:58 +01:00
Simon Larsen
bc2d5d5cac fix issue with sp loading 2023-05-17 19:47:46 +01:00
Simon Larsen
cdf025d326 refactor emails 2023-05-17 19:25:01 +01:00
Simon Larsen
e2f0dda07c refactor all emails 2023-05-17 18:32:31 +01:00
Simon Larsen
6ec237ec9d remove white paper 2023-05-17 18:07:08 +01:00
Simon Larsen
df97a2a67e remove unneeded files 2023-05-17 14:24:17 +01:00
Simon Larsen
8c8acb083a refactor emails. 2023-05-17 14:16:21 +01:00
Simon Larsen
c64161a52d refactor emails 2023-05-17 12:50:51 +01:00
Simon Larsen
d0fd03c180 fix types 2023-05-17 12:38:13 +01:00
Simon Larsen
307141b835 refactor emails 2023-05-17 12:33:30 +01:00
Simon Larsen
833f0504d0 add info email 2023-05-17 12:07:29 +01:00
Simon Larsen
9439fb337e refactor emails 2023-05-17 12:03:22 +01:00
Simon Larsen
89d45ea99a move labels to growth plan 2023-05-17 10:49:58 +01:00
Simon Larsen
adbda5ff9a custom smtp config on growth plan 2023-05-17 10:42:30 +01:00
Simon Larsen
4b5ea139d4 Merge branch 'owners-in-form' 2023-05-16 16:11:04 +01:00
Simon Larsen
51d28b0af5 fix issue with wizard form 2023-05-16 16:10:38 +01:00
Simon Larsen
06375f478e add owners to form 2023-05-16 15:32:24 +01:00
Simon Larsen
b72dcc691a skip py tests 2023-05-16 14:19:44 +01:00
Simon Larsen
4090fc9bd1 add in form. 2023-05-16 14:19:04 +01:00
Simon Larsen
008655b6eb fix fmt 2023-05-16 13:40:42 +01:00
Simon Larsen
73bf0a26c7 add more fields 2023-05-16 13:38:43 +01:00
Simon Larsen
fb3153cf2e clean up e2e tests 2023-05-16 12:19:59 +01:00
Simon Larsen
193508c0c7 fix fmt 2023-05-16 12:15:35 +01:00
Simon Larsen
64fa6e68ea fix playwright tests 2023-05-16 12:12:31 +01:00
Simon Larsen
c6de2b7514 fix run server in docker 2023-05-16 11:58:08 +01:00
Simon Larsen
489757dc96 refactor base url 2023-05-16 11:56:26 +01:00
Simon Larsen
3c9216755a rename 2023-05-16 11:54:56 +01:00
Simon Larsen
5c78bbb456 rename 2023-05-16 11:54:36 +01:00
Simon Larsen
965d731b25 Merge pull request #446 from OneUptime/dependabot/npm_and_yarn/CommonServer/vm2-3.9.18
Bump vm2 from 3.9.17 to 3.9.18 in /CommonServer
2023-05-16 11:26:58 +01:00
Simon Larsen
18595722f0 Merge pull request #447 from OneUptime/dependabot/npm_and_yarn/Workflow/vm2-3.9.18
Bump vm2 from 3.9.17 to 3.9.18 in /Workflow
2023-05-16 11:26:45 +01:00
Simon Larsen
1dfa269d2d Merge pull request #448 from OneUptime/dependabot/npm_and_yarn/ProbeAPI/vm2-3.9.18
Bump vm2 from 3.9.17 to 3.9.18 in /ProbeAPI
2023-05-16 11:26:37 +01:00
Simon Larsen
c833806441 Merge pull request #449 from OneUptime/dependabot/npm_and_yarn/TestServer/vm2-3.9.18
Bump vm2 from 3.9.17 to 3.9.18 in /TestServer
2023-05-16 11:26:29 +01:00
Simon Larsen
8a3099d85d Merge pull request #445 from OneUptime/resource-owners
Resource owners
2023-05-16 11:26:13 +01:00
Simon Larsen
04bf2bd1e4 add owners page to resources 2023-05-16 11:25:37 +01:00
Simon Larsen
f5e79ebd2e make owners work. 2023-05-16 11:12:06 +01:00
Simon Larsen
e4bb7b4019 fix basic form 2023-05-16 10:11:49 +01:00
Simon Larsen
31b0d6cb06 fix lint. 2023-05-16 10:07:02 +01:00
Simon Larsen
d5ef79de33 refactor basic form 2023-05-16 10:04:12 +01:00
dependabot[bot]
e7fd6dae3a Bump vm2 from 3.9.17 to 3.9.18 in /ProbeAPI
Bumps [vm2](https://github.com/patriksimek/vm2) from 3.9.17 to 3.9.18.
- [Release notes](https://github.com/patriksimek/vm2/releases)
- [Changelog](https://github.com/patriksimek/vm2/blob/master/CHANGELOG.md)
- [Commits](https://github.com/patriksimek/vm2/compare/3.9.17...3.9.18)

---
updated-dependencies:
- dependency-name: vm2
  dependency-type: indirect
...

Signed-off-by: dependabot[bot] <support@github.com>
2023-05-15 21:36:45 +00:00
dependabot[bot]
6eec2b54f7 Bump vm2 from 3.9.17 to 3.9.18 in /TestServer
Bumps [vm2](https://github.com/patriksimek/vm2) from 3.9.17 to 3.9.18.
- [Release notes](https://github.com/patriksimek/vm2/releases)
- [Changelog](https://github.com/patriksimek/vm2/blob/master/CHANGELOG.md)
- [Commits](https://github.com/patriksimek/vm2/compare/3.9.17...3.9.18)

---
updated-dependencies:
- dependency-name: vm2
  dependency-type: indirect
...

Signed-off-by: dependabot[bot] <support@github.com>
2023-05-15 21:36:45 +00:00
dependabot[bot]
8dbb768056 Bump vm2 from 3.9.17 to 3.9.18 in /Workflow
Bumps [vm2](https://github.com/patriksimek/vm2) from 3.9.17 to 3.9.18.
- [Release notes](https://github.com/patriksimek/vm2/releases)
- [Changelog](https://github.com/patriksimek/vm2/blob/master/CHANGELOG.md)
- [Commits](https://github.com/patriksimek/vm2/compare/3.9.17...3.9.18)

---
updated-dependencies:
- dependency-name: vm2
  dependency-type: direct:production
...

Signed-off-by: dependabot[bot] <support@github.com>
2023-05-15 21:34:05 +00:00
dependabot[bot]
01d26b08a2 Bump vm2 from 3.9.17 to 3.9.18 in /CommonServer
Bumps [vm2](https://github.com/patriksimek/vm2) from 3.9.17 to 3.9.18.
- [Release notes](https://github.com/patriksimek/vm2/releases)
- [Changelog](https://github.com/patriksimek/vm2/blob/master/CHANGELOG.md)
- [Commits](https://github.com/patriksimek/vm2/compare/3.9.17...3.9.18)

---
updated-dependencies:
- dependency-name: vm2
  dependency-type: direct:production
...

Signed-off-by: dependabot[bot] <support@github.com>
2023-05-15 21:27:59 +00:00
Simon Larsen
6e432d67e7 fix owners 2023-05-15 20:23:31 +01:00
Simon Larsen
d77381652a rename service 2023-05-15 17:58:57 +01:00
Simon Larsen
26d69b4a07 add owners page 2023-05-15 17:49:22 +01:00
Simon Larsen
d6fd7a47e5 Merge branch 'master' into resource-owners 2023-05-15 17:38:35 +01:00
Simon Larsen
2beb2414e6 add owners 2023-05-15 17:36:19 +01:00
Simon Larsen
05540db978 fix fmt 2023-05-15 17:28:42 +01:00
Simon Larsen
1a40e9af8e add owners page 2023-05-15 17:26:31 +01:00
Simon Larsen
63c89f5b1a add services 2023-05-15 17:10:40 +01:00
Simon Larsen
f7b1f5fa9a add services 2023-05-15 17:04:19 +01:00
Simon Larsen
e1f3b454ce fix workflow file 2023-05-15 16:47:24 +01:00
Simon Larsen
fa04df806c fix typo 2023-05-15 16:45:49 +01:00
Simon Larsen
749d1f0228 fix release 2023-05-15 16:41:46 +01:00
Simon Larsen
fde6c94351 fix build number 2023-05-15 16:39:20 +01:00
Simon Larsen
3810821fc2 fix version 2023-05-15 16:29:35 +01:00
Simon Larsen
74aa7c60b4 fix build number 2023-05-15 14:14:45 +01:00
Simon Larsen
39d56d13d5 add owners to scheduled event 2023-05-15 12:50:48 +01:00
Simon Larsen
2148ec7462 add models 2023-05-15 12:44:23 +01:00
Simon Larsen
303c68476e add models 2023-05-15 12:44:19 +01:00
Simon Larsen
cb797be1be fix release 2023-05-15 12:31:36 +01:00
Simon Larsen
d314c6fdbd fix tag 2023-05-15 11:55:52 +01:00
Simon Larsen
82ca306fbe fix tag version 2023-05-15 11:53:56 +01:00
Simon Larsen
095a29b39d quotes 2023-05-15 11:53:07 +01:00
Simon Larsen
e04c2f328c add echo 2023-05-15 11:34:41 +01:00
Simon Larsen
24b35de5b2 fix build number 2023-05-15 11:33:17 +01:00
Simon Larsen
278aea59d5 generate unique build number 2023-05-15 11:29:29 +01:00
Simon Larsen
ed42c36bbf fix status page issue 2023-05-15 11:15:52 +01:00
Simon Larsen
b4e1404828 Merge branch 'master' of github.com-simon:OneUptime/oneuptime 2023-05-15 10:55:00 +01:00
Simon Larsen
48edfd9812 Merge pull request #442 from OneUptime/monitoring
Monitoring
2023-05-14 21:27:37 +01:00
Simon Larsen
e494fabd48 Merge pull request #443 from OneUptime/dependabot/npm_and_yarn/Probe/xml2js--removed
Bump xml2js from 0.4.23 to  in /Probe
2023-05-12 18:57:39 +01:00
dependabot[bot]
dec65d701a Bump xml2js from 0.4.23 to in /Probe
Bumps [xml2js](https://github.com/Leonidas-from-XIV/node-xml2js) from 0.4.23 to .
- [Commits](https://github.com/Leonidas-from-XIV/node-xml2js/commits)

---
updated-dependencies:
- dependency-name: xml2js
  dependency-type: indirect
...

Signed-off-by: dependabot[bot] <support@github.com>
2023-05-12 10:59:19 +00:00
Simon Larsen
ed8f9ea839 Merge pull request #389 from munyanezaarmel/home-test
home tests
2023-05-12 11:50:27 +01:00
Simon Larsen
e3421a72df Delete DockerFile 2023-05-12 11:02:43 +01:00
Simon Larsen
6868fc299e Update playwright.yml 2023-05-12 11:01:28 +01:00
Simon Larsen
4362923ff6 Merge pull request #437 from Sillyboi2001/Common/Billing
Test cases for Common/Billing
2023-05-12 11:00:38 +01:00
Silas Okpugie
e25995c617 made some changes 2023-05-10 12:31:01 +01:00
Silas Okpugie
72ebe62b86 Test cases for Common/Billing 2023-05-08 18:40:31 +01:00
Munyaneza Armel
ce32efd51d added dockerfile 2023-05-01 18:38:10 +02:00
Munyaneza Armel
0c1425f430 Update playwright.yml 2023-04-26 16:34:54 +02:00
Munyaneza Armel
27f38db033 fixing errors 2023-04-26 15:52:14 +02:00
Munyaneza Armel
9059fa530e added tests 2023-04-22 14:17:12 +02:00
Munyaneza Armel
7f32989720 added tests 2023-04-22 14:07:01 +02:00
armel
527026d7b4 added tests 2023-04-22 13:54:38 +02:00
armel
34101de6d0 fixed lint 2023-04-20 10:52:00 +02:00
armel
5d82d7d619 fix lint 2023-04-20 10:27:14 +02:00
armel
1f7b124594 fixing errors 2023-04-19 17:08:58 +02:00
armel
6d5d9416f8 fixed workfile 2023-04-19 16:47:08 +02:00
armel
d0d2162a51 fixed env 2023-04-19 16:33:58 +02:00
armel
69d93e4330 fixing env 2023-04-19 16:29:49 +02:00
armel
0cb2a98047 fixing env 2023-04-19 16:29:09 +02:00
armel
5fc4fa60ed fixing env variables 2023-04-19 16:29:09 +02:00
armel
24c30f884e added environment variables 2023-04-19 16:29:07 +02:00
armel
4f823062c5 fixing tests 2023-04-19 16:29:07 +02:00
armel
95f324fa80 fixing tests 2023-04-19 16:29:07 +02:00
armel
6cab95c41b fixing tests 2023-04-19 16:29:06 +02:00
armel
46bbc2cf96 fixing workfile 2023-04-19 16:29:03 +02:00
armel
b354cd0f25 fixing workfile 2023-04-19 16:29:02 +02:00
armel
173d2c7cde fixing workfile 2023-04-19 16:29:02 +02:00
armel
cf795c1633 fixing workfile 2023-04-19 16:29:02 +02:00
armel
ab31200f45 running localhost 2023-04-19 16:29:00 +02:00
armel
d5d4da389f running on localhost 2023-04-19 16:28:59 +02:00
unknown
b288dbb694 fix errors 2023-04-19 16:28:58 +02:00
unknown
ccdc3f92dd fixed errors 2023-04-19 16:28:57 +02:00
unknown
af3a6b2f3f fixed errors 2023-04-19 16:28:57 +02:00
unknown
99da78d7db fixed errors 2023-04-19 16:28:56 +02:00
unknown
254bae0956 fixed errors 2023-04-19 16:28:53 +02:00
unknown
2c1f094acd npm to yarn 2023-04-19 16:28:52 +02:00
unknown
49563e9cbe added test script 2023-04-19 16:28:52 +02:00
unknown
bf506e23d7 added playwright in dev 2023-04-19 16:28:51 +02:00
unknown
f9645979c2 fixed package.json 2023-04-19 16:28:51 +02:00
unknown
cf2ff65de5 added playwright in dev 2023-04-19 16:28:50 +02:00
unknown
6a248478d2 added playwright workflow 2023-04-19 16:28:50 +02:00
unknown
bc593b18e0 home tests 2023-04-19 16:28:49 +02:00
unknown
6182d84d57 home tests 2023-04-19 16:28:49 +02:00
aphilas
87ee6674c7 Clean up tests
- Flatten nested describe calls
- Replace it with test
2023-04-19 16:28:48 +02:00
aphilas
78f2b0b4c5 Delete Common/Types/Role 2023-04-19 16:28:48 +02:00
aphilas
70bcc80b5e Add test Common/Types/JSON 2023-04-19 16:28:48 +02:00
aphilas
8bffd8a9b7 Add test Common/Types/ListData 2023-04-19 16:28:42 +02:00
aphilas
0e6a365046 Add test Common/Types/PositiveNumber 2023-04-19 16:28:41 +02:00
aphilas
ad70f1e09d Add test Common/Types/Role 2023-04-19 16:28:41 +02:00
aphilas
4ff2b5a2da Add test Common/Types/Sleep 2023-04-19 16:28:40 +02:00
aphilas
39801c9c0d Add test Common/Types/Typeof 2023-04-19 16:28:40 +02:00
aphilas
75bb276349 Add test Common/Types/ArrayUtil 2023-04-19 16:28:40 +02:00
Simon Larsen
72ca3ac51e fix lint. 2023-04-19 16:28:40 +02:00
Simon Larsen
d1decf9143 update lock and docker compose 2023-04-19 16:28:40 +02:00
Simon Larsen
ddaea04182 fix preinstall script 2023-04-19 16:28:40 +02:00
Simon Larsen
d0ca7d9067 make scripts docker compatible. 2023-04-19 16:28:39 +02:00
Simon Larsen
837de39cf7 make script support docker 2023-04-19 16:28:39 +02:00
Simon Larsen
4fb07bfa83 Make docker file for OneUptime 2023-04-19 16:28:39 +02:00
Simon Larsen
b292c61341 add notes email 2023-04-19 16:28:39 +02:00
Simon Larsen
46cf642b8f add more email types 2023-04-19 16:28:39 +02:00
Simon Larsen
9e1fa1e008 fix fmt 2023-04-19 16:28:39 +02:00
Simon Larsen
1631836e29 add model columns 2023-04-19 16:28:38 +02:00
Simon Larsen
c1b2e1ef83 fix job name 2023-04-19 16:28:38 +02:00
Simon Larsen
0806fbe36e Update README.md 2023-04-19 16:28:38 +02:00
Simon Larsen
1ba205b4d6 Update README.md 2023-04-19 16:28:37 +02:00
Simon Larsen
3381931fed fix typo 2023-04-19 16:28:37 +02:00
Simon Larsen
57e3a50e41 fix ip type 2023-04-19 16:28:35 +02:00
Simon Larsen
4238dbd651 fix ip tests 2023-04-19 16:28:35 +02:00
Simon Larsen
3beb60362d fix ip address tests 2023-04-19 16:28:35 +02:00
dependabot[bot]
856f46cfce Bump vm2 from 3.9.15 to 3.9.16 in /Workflow
Bumps [vm2](https://github.com/patriksimek/vm2) from 3.9.15 to 3.9.16.
- [Release notes](https://github.com/patriksimek/vm2/releases)
- [Changelog](https://github.com/patriksimek/vm2/blob/master/CHANGELOG.md)
- [Commits](https://github.com/patriksimek/vm2/compare/3.9.15...3.9.16)

---
updated-dependencies:
- dependency-name: vm2
  dependency-type: direct:production
...

Signed-off-by: dependabot[bot] <support@github.com>
2023-04-19 16:28:35 +02:00
dependabot[bot]
4de9193e28 Bump vm2 from 3.9.15 to 3.9.16 in /CommonServer
Bumps [vm2](https://github.com/patriksimek/vm2) from 3.9.15 to 3.9.16.
- [Release notes](https://github.com/patriksimek/vm2/releases)
- [Changelog](https://github.com/patriksimek/vm2/blob/master/CHANGELOG.md)
- [Commits](https://github.com/patriksimek/vm2/compare/3.9.15...3.9.16)

---
updated-dependencies:
- dependency-name: vm2
  dependency-type: direct:production
...

Signed-off-by: dependabot[bot] <support@github.com>
2023-04-19 16:28:35 +02:00
dependabot[bot]
bf0f2d2f79 Bump vm2 from 3.9.15 to 3.9.16 in /Probe
Bumps [vm2](https://github.com/patriksimek/vm2) from 3.9.15 to 3.9.16.
- [Release notes](https://github.com/patriksimek/vm2/releases)
- [Changelog](https://github.com/patriksimek/vm2/blob/master/CHANGELOG.md)
- [Commits](https://github.com/patriksimek/vm2/compare/3.9.15...3.9.16)

---
updated-dependencies:
- dependency-name: vm2
  dependency-type: direct:production
...

Signed-off-by: dependabot[bot] <support@github.com>
2023-04-19 16:28:35 +02:00
Munyaneza Armel
f0483c9df6 Merge branch 'OneUptime:master' into home-test 2023-04-19 15:36:40 +02:00
armel
fa524ed2e1 fixing tests 2023-04-18 18:12:06 +02:00
armel
9e272ff85b fixing tests 2023-04-18 17:47:23 +02:00
armel
7b3249155e fixing tests 2023-04-18 17:31:43 +02:00
armel
fe655b0e3a fixing workfile 2023-04-18 17:23:01 +02:00
armel
9e987fd899 fixing workfile 2023-04-18 17:14:24 +02:00
armel
f428ae12aa fixing workfile 2023-04-18 17:11:47 +02:00
armel
7d75f9eed2 fixing workfile 2023-04-18 17:09:27 +02:00
armel
5cd0fc9853 running localhost 2023-04-18 16:56:27 +02:00
armel
73c1eb2b78 running on localhost 2023-04-18 16:36:24 +02:00
unknown
ddda137c12 fix errors 2023-03-20 14:41:57 +02:00
unknown
0d44b0ca13 fixed errors 2023-03-19 21:24:11 +02:00
unknown
001a4b153b fixed errors 2023-03-19 21:14:55 +02:00
unknown
4556a7e322 fixed errors 2023-03-19 20:52:15 +02:00
unknown
bf7707b2a9 fixed errors 2023-03-19 20:35:02 +02:00
unknown
a834045b00 npm to yarn 2023-03-19 20:17:56 +02:00
unknown
155af6e9a8 added test script 2023-03-19 19:44:32 +02:00
unknown
59ae6d7e56 added playwright in dev 2023-03-19 19:23:50 +02:00
unknown
d4c3e287a6 fixed package.json 2023-03-19 19:16:53 +02:00
unknown
3c5e169b58 added playwright in dev 2023-03-19 19:06:14 +02:00
unknown
f4000b1dd3 added playwright workflow 2023-03-19 18:46:54 +02:00
unknown
89fd950af9 home tests 2023-03-19 18:32:08 +02:00
unknown
4fca7fc0ee home tests 2023-03-19 12:16:37 +02:00
919 changed files with 107268 additions and 61385 deletions

View File

@@ -25,20 +25,6 @@ jobs:
- run: cd CommonUI && npm install --force
- run: cd Accounts && npm install && npm run compile
compile-alert:
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 Alert && npm install && npm run compile
compile-api-reference:
runs-on: ubuntu-latest
env:
@@ -53,6 +39,20 @@ jobs:
- run: cd CommonServer && npm install
- run: cd ApiReference && npm install && npm run compile
compile-link-shortner:
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 LinkShortner && npm install && npm run compile
compile-common-server:
runs-on: ubuntu-latest
env:
@@ -205,7 +205,7 @@ jobs:
- run: cd CommonServer && npm install
- run: cd Licensing && npm install && npm run compile
compile-mail:
compile-notification:
runs-on: ubuntu-latest
env:
CI_PIPELINE_ID: ${{github.run_number}}
@@ -217,7 +217,7 @@ jobs:
- run: cd Common && npm install
- run: cd Model && npm install
- run: cd CommonServer && npm install
- run: cd Mail && npm install && npm run compile
- run: cd Notification && npm install && npm run compile
compile-model:
runs-on: ubuntu-latest

View File

@@ -25,7 +25,7 @@ jobs:
- name: build docker image
run: sudo docker build -f ./Accounts/Dockerfile .
docker-build-alert:
docker-build-link-shortner:
runs-on: ubuntu-latest
env:
CI_PIPELINE_ID: ${{github.run_number}}
@@ -35,10 +35,10 @@ jobs:
- name: Preinstall
run: npm run prerun
# build image for mail service
# build image for accounts service
- name: build docker image
run: sudo docker build -f ./Alert/Dockerfile .
run: sudo docker build -f ./LinkShortner/Dockerfile .
docker-build-api-reference:
runs-on: ubuntu-latest
@@ -191,7 +191,7 @@ jobs:
- name: build docker image
run: sudo docker build -f ./Licensing/Dockerfile .
docker-build-mail:
docker-build-notification:
runs-on: ubuntu-latest
env:
CI_PIPELINE_ID: ${{github.run_number}}
@@ -204,22 +204,8 @@ jobs:
# build image for mail service
- name: build docker image
run: sudo docker build -f ./Mail/Dockerfile .
run: sudo docker build -f ./Notification/Dockerfile .
docker-build-nginx:
runs-on: ubuntu-latest
env:
CI_PIPELINE_ID: ${{github.run_number}}
steps:
- name: Checkout
uses: actions/checkout@v2
- name: Preinstall
run: npm run prerun
# build image for mail service
- name: build docker image
run: sudo docker build -f ./Nginx/Dockerfile ./Nginx
docker-build-probe:
runs-on: ubuntu-latest

View File

@@ -8,6 +8,8 @@ jobs:
test:
timeout-minutes: 60
runs-on: ubuntu-latest
env:
BASE_URL: http://localhost
steps:
- uses: actions/checkout@v3
- uses: actions/setup-node@v3
@@ -15,10 +17,12 @@ jobs:
node-version: 16
- name: Install dependencies
run: npm ci
- name: Run Server in Docker
run: npm run dev
- name: Install Playwright Browsers
run: npx playwright install --with-deps
- name: Run Playwright tests
run: npx playwright test
run: cd Playwright && npm install && npx playwright install && npx playwright test
- uses: actions/upload-artifact@v3
if: always()
with:

View File

@@ -7,16 +7,30 @@ on:
jobs:
generate-build-number:
runs-on: ubuntu-latest
outputs:
build_number: ${{ steps.buildnumber.outputs.build_number }}
steps:
- name: Generate build number
id: buildnumber
uses: onyxmueller/build-tag-number@v1.0.2
with:
token: ${{secrets.github_token}}
- run: echo "Build number is ${{ steps.buildnumber.outputs.build_number }}"
github-release:
needs: generate-build-number
runs-on: ubuntu-latest
permissions:
contents: write
env:
ONEUPTIME_VERSION: 6.0.${{github.run_number}}
ONEUPTIME_VERSION: "7.0.${{needs.generate-build-number.outputs.build_number}}"
steps:
- uses: actions/checkout@v3
with:
ref: release
- run: echo "${{needs.generate-build-number.outputs.build_number}}"
- name: "Build Changelog"
id: build_changelog
uses: mikepenz/release-changelog-builder-action@v3.7.1
@@ -27,13 +41,38 @@ jobs:
body: |
${{steps.build_changelog.outputs.changelog}}
test-server-docker-image-deploy:
nginx-docker-image-deploy:
needs: generate-build-number
runs-on: ubuntu-latest
env:
DOCKERHUB_PASSWORD: ${{secrets.DOCKERHUB_PASSWORD}}
DOCKERHUB_USERNAME: ${{secrets.DOCKERHUB_USERNAME}}
ONEUPTIME_VERSION: 6.0.${{github.run_number}}
ONEUPTIME_VERSION: "7.0.${{needs.generate-build-number.outputs.build_number}}"
steps:
- uses: actions/checkout@v3
with:
ref: release
- uses: actions/setup-node@v2
with:
node-version: 18.3.0
- run: npm run prerun
- run: sudo docker run --rm --privileged docker/binfmt:820fdd95a9972a5308930a2bdfb8573dd4447ad3
# Build and deploy accounts.
- run: sudo docker login --username $DOCKERHUB_USERNAME --password $DOCKERHUB_PASSWORD
- run: sudo docker buildx create --use
- run: sudo docker buildx build --platform linux/amd64,linux/arm64 --tag oneuptime/nginx:$ONEUPTIME_VERSION --tag oneuptime/nginx:release --push -f ./Nginx/Dockerfile .
test-server-docker-image-deploy:
needs: generate-build-number
runs-on: ubuntu-latest
env:
DOCKERHUB_PASSWORD: ${{secrets.DOCKERHUB_PASSWORD}}
DOCKERHUB_USERNAME: ${{secrets.DOCKERHUB_USERNAME}}
ONEUPTIME_VERSION: "7.0.${{needs.generate-build-number.outputs.build_number}}"
steps:
- uses: actions/checkout@v3
with:
@@ -51,11 +90,12 @@ jobs:
workflow-docker-image-deploy:
needs: generate-build-number
runs-on: ubuntu-latest
env:
DOCKERHUB_PASSWORD: ${{secrets.DOCKERHUB_PASSWORD}}
DOCKERHUB_USERNAME: ${{secrets.DOCKERHUB_USERNAME}}
ONEUPTIME_VERSION: 6.0.${{github.run_number}}
ONEUPTIME_VERSION: "7.0.${{needs.generate-build-number.outputs.build_number}}"
steps:
- uses: actions/checkout@v3
with:
@@ -71,12 +111,35 @@ jobs:
- run: sudo docker buildx create --use
- run: sudo docker buildx build --platform linux/amd64,linux/arm64 --tag oneuptime/workflow:$ONEUPTIME_VERSION --tag oneuptime/workflow:release --push -f ./Workflow/Dockerfile .
workers-docker-image-deploy:
link-shortner-docker-image-deploy:
needs: generate-build-number
runs-on: ubuntu-latest
env:
DOCKERHUB_PASSWORD: ${{secrets.DOCKERHUB_PASSWORD}}
DOCKERHUB_USERNAME: ${{secrets.DOCKERHUB_USERNAME}}
ONEUPTIME_VERSION: 6.0.${{github.run_number}}
ONEUPTIME_VERSION: "7.0.${{needs.generate-build-number.outputs.build_number}}"
steps:
- uses: actions/checkout@v3
with:
ref: release
- uses: actions/setup-node@v2
with:
node-version: 18.3.0
- run: npm run prerun
- run: sudo docker run --rm --privileged docker/binfmt:820fdd95a9972a5308930a2bdfb8573dd4447ad3
# Build and deploy accounts.
- run: sudo docker login --username $DOCKERHUB_USERNAME --password $DOCKERHUB_PASSWORD
- run: sudo docker buildx create --use
- run: sudo docker buildx build --platform linux/amd64,linux/arm64 --tag oneuptime/link-shortner:$ONEUPTIME_VERSION --tag oneuptime/link-shortner:release --push -f ./LinkShortner/Dockerfile .
workers-docker-image-deploy:
needs: generate-build-number
runs-on: ubuntu-latest
env:
DOCKERHUB_PASSWORD: ${{secrets.DOCKERHUB_PASSWORD}}
DOCKERHUB_USERNAME: ${{secrets.DOCKERHUB_USERNAME}}
ONEUPTIME_VERSION: "7.0.${{needs.generate-build-number.outputs.build_number}}"
steps:
- uses: actions/checkout@v3
with:
@@ -92,12 +155,13 @@ jobs:
- run: sudo docker buildx create --use
- run: sudo docker buildx build --platform linux/amd64,linux/arm64 --tag oneuptime/workers:$ONEUPTIME_VERSION --tag oneuptime/workers:release --push -f ./Workers/Dockerfile .
staus-page-docker-image-deploy:
status-page-docker-image-deploy:
needs: generate-build-number
runs-on: ubuntu-latest
env:
DOCKERHUB_PASSWORD: ${{secrets.DOCKERHUB_PASSWORD}}
DOCKERHUB_USERNAME: ${{secrets.DOCKERHUB_USERNAME}}
ONEUPTIME_VERSION: 6.0.${{github.run_number}}
ONEUPTIME_VERSION: "7.0.${{needs.generate-build-number.outputs.build_number}}"
steps:
- uses: actions/checkout@v3
with:
@@ -114,11 +178,12 @@ jobs:
- run: sudo docker buildx build --platform linux/amd64,linux/arm64 --tag oneuptime/status-page:$ONEUPTIME_VERSION --tag oneuptime/status-page:release --push -f ./StatusPage/Dockerfile .
realtime-docker-image-deploy:
needs: generate-build-number
runs-on: ubuntu-latest
env:
DOCKERHUB_PASSWORD: ${{secrets.DOCKERHUB_PASSWORD}}
DOCKERHUB_USERNAME: ${{secrets.DOCKERHUB_USERNAME}}
ONEUPTIME_VERSION: 6.0.${{github.run_number}}
ONEUPTIME_VERSION: "7.0.${{needs.generate-build-number.outputs.build_number}}"
steps:
- uses: actions/checkout@v3
with:
@@ -136,11 +201,12 @@ jobs:
probe-api-docker-image-deploy:
needs: generate-build-number
runs-on: ubuntu-latest
env:
DOCKERHUB_PASSWORD: ${{secrets.DOCKERHUB_PASSWORD}}
DOCKERHUB_USERNAME: ${{secrets.DOCKERHUB_USERNAME}}
ONEUPTIME_VERSION: 6.0.${{github.run_number}}
ONEUPTIME_VERSION: "7.0.${{needs.generate-build-number.outputs.build_number}}"
steps:
- uses: actions/checkout@v3
with:
@@ -156,34 +222,15 @@ jobs:
- run: sudo docker buildx create --use
- run: sudo docker buildx build --platform linux/amd64,linux/arm64 --tag oneuptime/probe-api:$ONEUPTIME_VERSION --tag oneuptime/probe-api:release --push -f ./ProbeAPI/Dockerfile .
nginx-docker-image-deploy:
runs-on: ubuntu-latest
env:
DOCKERHUB_PASSWORD: ${{secrets.DOCKERHUB_PASSWORD}}
DOCKERHUB_USERNAME: ${{secrets.DOCKERHUB_USERNAME}}
ONEUPTIME_VERSION: 6.0.${{github.run_number}}
steps:
- uses: actions/checkout@v3
with:
ref: release
- uses: actions/setup-node@v2
with:
node-version: 18.3.0
- run: npm run prerun
- run: sudo docker run --rm --privileged docker/binfmt:820fdd95a9972a5308930a2bdfb8573dd4447ad3
# Build and deploy accounts.
- run: sudo docker login --username $DOCKERHUB_USERNAME --password $DOCKERHUB_PASSWORD
- run: sudo docker buildx create --use
- run: sudo docker buildx build --platform linux/amd64,linux/arm64 --tag oneuptime/nginx:$ONEUPTIME_VERSION --tag oneuptime/nginx:release --push -f ./Nginx/Dockerfile .
mail-docker-image-deploy:
notification-docker-image-deploy:
needs: generate-build-number
runs-on: ubuntu-latest
env:
DOCKERHUB_PASSWORD: ${{secrets.DOCKERHUB_PASSWORD}}
DOCKERHUB_USERNAME: ${{secrets.DOCKERHUB_USERNAME}}
ONEUPTIME_VERSION: 6.0.${{github.run_number}}
ONEUPTIME_VERSION: "7.0.${{needs.generate-build-number.outputs.build_number}}"
steps:
- uses: actions/checkout@v3
with:
@@ -196,15 +243,16 @@ jobs:
# Build and deploy accounts.
- run: sudo docker login --username $DOCKERHUB_USERNAME --password $DOCKERHUB_PASSWORD
- run: sudo docker buildx create --use
- run: sudo docker buildx build --platform linux/amd64,linux/arm64 --tag oneuptime/mail:$ONEUPTIME_VERSION --tag oneuptime/mail:release --push -f ./Mail/Dockerfile .
- run: sudo docker buildx build --platform linux/amd64,linux/arm64 --tag oneuptime/notification:$ONEUPTIME_VERSION --tag oneuptime/notification:release --push -f ./Notification/Dockerfile .
licensing-docker-image-deploy:
needs: generate-build-number
runs-on: ubuntu-latest
env:
DOCKERHUB_PASSWORD: ${{secrets.DOCKERHUB_PASSWORD}}
DOCKERHUB_USERNAME: ${{secrets.DOCKERHUB_USERNAME}}
ONEUPTIME_VERSION: 6.0.${{github.run_number}}
ONEUPTIME_VERSION: "7.0.${{needs.generate-build-number.outputs.build_number}}"
steps:
- uses: actions/checkout@v3
with:
@@ -221,11 +269,12 @@ jobs:
- run: sudo docker buildx build --platform linux/amd64,linux/arm64 --tag oneuptime/licensing:$ONEUPTIME_VERSION --tag oneuptime/licensing:release --push -f ./Licensing/Dockerfile .
integrations-docker-image-deploy:
needs: generate-build-number
runs-on: ubuntu-latest
env:
DOCKERHUB_PASSWORD: ${{secrets.DOCKERHUB_PASSWORD}}
DOCKERHUB_USERNAME: ${{secrets.DOCKERHUB_USERNAME}}
ONEUPTIME_VERSION: 6.0.${{github.run_number}}
ONEUPTIME_VERSION: "7.0.${{needs.generate-build-number.outputs.build_number}}"
steps:
- uses: actions/checkout@v3
with:
@@ -243,11 +292,12 @@ jobs:
probe-docker-image-deploy:
needs: generate-build-number
runs-on: ubuntu-latest
env:
DOCKERHUB_PASSWORD: ${{secrets.DOCKERHUB_PASSWORD}}
DOCKERHUB_USERNAME: ${{secrets.DOCKERHUB_USERNAME}}
ONEUPTIME_VERSION: 6.0.${{github.run_number}}
ONEUPTIME_VERSION: "7.0.${{needs.generate-build-number.outputs.build_number}}"
steps:
- uses: actions/checkout@v3
with:
@@ -264,11 +314,12 @@ jobs:
- run: sudo docker buildx build --platform linux/amd64,linux/arm64 --tag oneuptime/probe:$ONEUPTIME_VERSION --tag oneuptime/probe:release --push -f ./Probe/Dockerfile .
identity-docker-image-deploy:
needs: generate-build-number
runs-on: ubuntu-latest
env:
DOCKERHUB_PASSWORD: ${{secrets.DOCKERHUB_PASSWORD}}
DOCKERHUB_USERNAME: ${{secrets.DOCKERHUB_USERNAME}}
ONEUPTIME_VERSION: 6.0.${{github.run_number}}
ONEUPTIME_VERSION: "7.0.${{needs.generate-build-number.outputs.build_number}}"
steps:
- uses: actions/checkout@v3
with:
@@ -286,11 +337,12 @@ jobs:
home-docker-image-deploy:
needs: generate-build-number
runs-on: ubuntu-latest
env:
DOCKERHUB_PASSWORD: ${{secrets.DOCKERHUB_PASSWORD}}
DOCKERHUB_USERNAME: ${{secrets.DOCKERHUB_USERNAME}}
ONEUPTIME_VERSION: 6.0.${{github.run_number}}
ONEUPTIME_VERSION: "7.0.${{needs.generate-build-number.outputs.build_number}}"
steps:
- uses: actions/checkout@v3
with:
@@ -308,11 +360,12 @@ jobs:
helm-chart-docker-image-deploy:
needs: generate-build-number
runs-on: ubuntu-latest
env:
DOCKERHUB_PASSWORD: ${{secrets.DOCKERHUB_PASSWORD}}
DOCKERHUB_USERNAME: ${{secrets.DOCKERHUB_USERNAME}}
ONEUPTIME_VERSION: 6.0.${{github.run_number}}
ONEUPTIME_VERSION: "7.0.${{needs.generate-build-number.outputs.build_number}}"
steps:
- uses: actions/checkout@v3
with:
@@ -330,11 +383,12 @@ jobs:
haraka-docker-image-deploy:
needs: generate-build-number
runs-on: ubuntu-latest
env:
DOCKERHUB_PASSWORD: ${{secrets.DOCKERHUB_PASSWORD}}
DOCKERHUB_USERNAME: ${{secrets.DOCKERHUB_USERNAME}}
ONEUPTIME_VERSION: 6.0.${{github.run_number}}
ONEUPTIME_VERSION: "7.0.${{needs.generate-build-number.outputs.build_number}}"
steps:
- uses: actions/checkout@v3
with:
@@ -351,11 +405,12 @@ jobs:
- run: sudo docker buildx build --platform linux/amd64,linux/arm64 --tag oneuptime/haraka:$ONEUPTIME_VERSION --tag oneuptime/haraka:release --push -f ./Haraka/Dockerfile .
file-docker-image-deploy:
needs: generate-build-number
runs-on: ubuntu-latest
env:
DOCKERHUB_PASSWORD: ${{secrets.DOCKERHUB_PASSWORD}}
DOCKERHUB_USERNAME: ${{secrets.DOCKERHUB_USERNAME}}
ONEUPTIME_VERSION: 6.0.${{github.run_number}}
ONEUPTIME_VERSION: "7.0.${{needs.generate-build-number.outputs.build_number}}"
steps:
- uses: actions/checkout@v3
with:
@@ -373,11 +428,12 @@ jobs:
dashboard-docker-image-deploy:
needs: generate-build-number
runs-on: ubuntu-latest
env:
DOCKERHUB_PASSWORD: ${{secrets.DOCKERHUB_PASSWORD}}
DOCKERHUB_USERNAME: ${{secrets.DOCKERHUB_USERNAME}}
ONEUPTIME_VERSION: 6.0.${{github.run_number}}
ONEUPTIME_VERSION: "7.0.${{needs.generate-build-number.outputs.build_number}}"
steps:
- uses: actions/checkout@v3
with:
@@ -397,11 +453,12 @@ jobs:
dashboard-api-docker-image-deploy:
needs: generate-build-number
runs-on: ubuntu-latest
env:
DOCKERHUB_PASSWORD: ${{secrets.DOCKERHUB_PASSWORD}}
DOCKERHUB_USERNAME: ${{secrets.DOCKERHUB_USERNAME}}
ONEUPTIME_VERSION: 6.0.${{github.run_number}}
ONEUPTIME_VERSION: "7.0.${{needs.generate-build-number.outputs.build_number}}"
steps:
- uses: actions/checkout@v3
with:
@@ -421,11 +478,12 @@ jobs:
api-reference-docker-image-deploy:
needs: generate-build-number
runs-on: ubuntu-latest
env:
DOCKERHUB_PASSWORD: ${{secrets.DOCKERHUB_PASSWORD}}
DOCKERHUB_USERNAME: ${{secrets.DOCKERHUB_USERNAME}}
ONEUPTIME_VERSION: 6.0.${{github.run_number}}
ONEUPTIME_VERSION: "7.0.${{needs.generate-build-number.outputs.build_number}}"
steps:
- uses: actions/checkout@v3
with:
@@ -443,37 +501,13 @@ jobs:
alert-docker-image-deploy:
runs-on: ubuntu-latest
env:
DOCKERHUB_PASSWORD: ${{secrets.DOCKERHUB_PASSWORD}}
DOCKERHUB_USERNAME: ${{secrets.DOCKERHUB_USERNAME}}
ONEUPTIME_VERSION: 6.0.${{github.run_number}}
steps:
- uses: actions/checkout@v3
with:
ref: release
- uses: actions/setup-node@v2
with:
node-version: 18.3.0
- run: npm run prerun
- run: sudo docker run --rm --privileged docker/binfmt:820fdd95a9972a5308930a2bdfb8573dd4447ad3
# Build and deploy accounts.
- run: sudo docker login --username $DOCKERHUB_USERNAME --password $DOCKERHUB_PASSWORD
- run: sudo docker buildx create --use
- run: sudo docker buildx build --platform linux/amd64,linux/arm64 --tag oneuptime/alert:$ONEUPTIME_VERSION --tag oneuptime/alert:release --push -f ./Alert/Dockerfile .
accounts-docker-image-deploy:
needs: generate-build-number
runs-on: ubuntu-latest
env:
DOCKERHUB_PASSWORD: ${{secrets.DOCKERHUB_PASSWORD}}
DOCKERHUB_USERNAME: ${{secrets.DOCKERHUB_USERNAME}}
ONEUPTIME_VERSION: 6.0.${{github.run_number}}
ONEUPTIME_VERSION: "7.0.${{needs.generate-build-number.outputs.build_number}}"
steps:
- uses: actions/checkout@v3
with:

View File

@@ -6,13 +6,45 @@ on:
- "master"
jobs:
test-server-test-docker-image-deploy:
nginx-test-docker-image-deploy:
needs: generate-build-number
runs-on: ubuntu-latest
env:
DOCKERHUB_PASSWORD: ${{secrets.DOCKERHUB_PASSWORD}}
DOCKERHUB_USERNAME: ${{secrets.DOCKERHUB_USERNAME}}
ONEUPTIME_VERSION: 6.0.${{github.run_number}}
ONEUPTIME_VERSION: "7.0.${{needs.generate-build-number.outputs.build_number}}"
steps:
- uses: actions/checkout@v2
- uses: actions/setup-node@v2
with:
node-version: 18.3.0
- run: npm run prerun
- run: sudo docker run --rm --privileged docker/binfmt:820fdd95a9972a5308930a2bdfb8573dd4447ad3
# Build and deploy accounts.
- run: sudo docker login --username $DOCKERHUB_USERNAME --password $DOCKERHUB_PASSWORD
- run: sudo docker buildx create --use
- run: sudo docker buildx build --platform linux/amd64,linux/arm64 --tag oneuptime/nginx:$ONEUPTIME_VERSION-test --tag oneuptime/nginx:test --push -f ./Nginx/Dockerfile .
generate-build-number:
runs-on: ubuntu-latest
outputs:
build_number: ${{ steps.buildnumber.outputs.build_number }}
steps:
- name: Generate build number
id: buildnumber
uses: onyxmueller/build-tag-number@v1.0.2
with:
token: ${{secrets.github_token}}
- run: echo "Build number is ${{ steps.buildnumber.outputs.build_number }}"
test-server-test-docker-image-deploy:
needs: generate-build-number
runs-on: ubuntu-latest
env:
DOCKERHUB_PASSWORD: ${{secrets.DOCKERHUB_PASSWORD}}
DOCKERHUB_USERNAME: ${{secrets.DOCKERHUB_USERNAME}}
ONEUPTIME_VERSION: "7.0.${{needs.generate-build-number.outputs.build_number}}"
steps:
- uses: actions/checkout@v2
- uses: actions/setup-node@v2
@@ -26,12 +58,33 @@ jobs:
- run: sudo docker buildx create --use
- run: sudo docker buildx build --platform linux/amd64,linux/arm64 --tag oneuptime/test-server:$ONEUPTIME_VERSION-test --tag oneuptime/test-server:test --push -f ./TestServer/Dockerfile .
workflow-test-docker-image-deploy:
link-shortner-test-docker-image-deploy:
needs: generate-build-number
runs-on: ubuntu-latest
env:
DOCKERHUB_PASSWORD: ${{secrets.DOCKERHUB_PASSWORD}}
DOCKERHUB_USERNAME: ${{secrets.DOCKERHUB_USERNAME}}
ONEUPTIME_VERSION: 6.0.${{github.run_number}}
ONEUPTIME_VERSION: "7.0.${{needs.generate-build-number.outputs.build_number}}"
steps:
- uses: actions/checkout@v2
- uses: actions/setup-node@v2
with:
node-version: 18.3.0
- run: npm run prerun
- run: sudo docker run --rm --privileged docker/binfmt:820fdd95a9972a5308930a2bdfb8573dd4447ad3
# Build and deploy accounts.
- run: sudo docker login --username $DOCKERHUB_USERNAME --password $DOCKERHUB_PASSWORD
- run: sudo docker buildx create --use
- run: sudo docker buildx build --platform linux/amd64,linux/arm64 --tag oneuptime/link-shortner:$ONEUPTIME_VERSION-test --tag oneuptime/link-shortner:test --push -f ./LinkShortner/Dockerfile .
workflow-test-docker-image-deploy:
needs: generate-build-number
runs-on: ubuntu-latest
env:
DOCKERHUB_PASSWORD: ${{secrets.DOCKERHUB_PASSWORD}}
DOCKERHUB_USERNAME: ${{secrets.DOCKERHUB_USERNAME}}
ONEUPTIME_VERSION: "7.0.${{needs.generate-build-number.outputs.build_number}}"
steps:
- uses: actions/checkout@v2
- uses: actions/setup-node@v2
@@ -46,11 +99,12 @@ jobs:
- run: sudo docker buildx build --platform linux/amd64,linux/arm64 --tag oneuptime/workflow:$ONEUPTIME_VERSION-test --tag oneuptime/workflow:test --push -f ./Workflow/Dockerfile .
workers-test-docker-image-deploy:
needs: generate-build-number
runs-on: ubuntu-latest
env:
DOCKERHUB_PASSWORD: ${{secrets.DOCKERHUB_PASSWORD}}
DOCKERHUB_USERNAME: ${{secrets.DOCKERHUB_USERNAME}}
ONEUPTIME_VERSION: 6.0.${{github.run_number}}
ONEUPTIME_VERSION: "7.0.${{needs.generate-build-number.outputs.build_number}}"
steps:
- uses: actions/checkout@v2
- uses: actions/setup-node@v2
@@ -64,12 +118,13 @@ jobs:
- run: sudo docker buildx create --use
- run: sudo docker buildx build --platform linux/amd64,linux/arm64 --tag oneuptime/workers:$ONEUPTIME_VERSION-test --tag oneuptime/workers:test --push -f ./Workers/Dockerfile .
staus-page-test-docker-image-deploy:
status-page-test-docker-image-deploy:
needs: generate-build-number
runs-on: ubuntu-latest
env:
DOCKERHUB_PASSWORD: ${{secrets.DOCKERHUB_PASSWORD}}
DOCKERHUB_USERNAME: ${{secrets.DOCKERHUB_USERNAME}}
ONEUPTIME_VERSION: 6.0.${{github.run_number}}
ONEUPTIME_VERSION: "7.0.${{needs.generate-build-number.outputs.build_number}}"
steps:
- uses: actions/checkout@v2
- uses: actions/setup-node@v2
@@ -84,11 +139,12 @@ jobs:
- run: sudo docker buildx build --platform linux/amd64,linux/arm64 --tag oneuptime/status-page:$ONEUPTIME_VERSION-test --tag oneuptime/status-page:test --push -f ./StatusPage/Dockerfile .
realtime-test-docker-image-deploy:
needs: generate-build-number
runs-on: ubuntu-latest
env:
DOCKERHUB_PASSWORD: ${{secrets.DOCKERHUB_PASSWORD}}
DOCKERHUB_USERNAME: ${{secrets.DOCKERHUB_USERNAME}}
ONEUPTIME_VERSION: 6.0.${{github.run_number}}
ONEUPTIME_VERSION: "7.0.${{needs.generate-build-number.outputs.build_number}}"
steps:
- uses: actions/checkout@v2
- uses: actions/setup-node@v2
@@ -104,11 +160,12 @@ jobs:
probe-test-docker-image-deploy:
needs: generate-build-number
runs-on: ubuntu-latest
env:
DOCKERHUB_PASSWORD: ${{secrets.DOCKERHUB_PASSWORD}}
DOCKERHUB_USERNAME: ${{secrets.DOCKERHUB_USERNAME}}
ONEUPTIME_VERSION: 6.0.${{github.run_number}}
ONEUPTIME_VERSION: "7.0.${{needs.generate-build-number.outputs.build_number}}"
steps:
- uses: actions/checkout@v2
- uses: actions/setup-node@v2
@@ -123,11 +180,12 @@ jobs:
- run: sudo docker buildx build --platform linux/amd64,linux/arm64 --tag oneuptime/probe:$ONEUPTIME_VERSION-test --tag oneuptime/probe:test --push -f ./Probe/Dockerfile .
probe-api-test-docker-image-deploy:
needs: generate-build-number
runs-on: ubuntu-latest
env:
DOCKERHUB_PASSWORD: ${{secrets.DOCKERHUB_PASSWORD}}
DOCKERHUB_USERNAME: ${{secrets.DOCKERHUB_USERNAME}}
ONEUPTIME_VERSION: 6.0.${{github.run_number}}
ONEUPTIME_VERSION: "7.0.${{needs.generate-build-number.outputs.build_number}}"
steps:
- uses: actions/checkout@v2
- uses: actions/setup-node@v2
@@ -140,33 +198,15 @@ jobs:
- run: sudo docker login --username $DOCKERHUB_USERNAME --password $DOCKERHUB_PASSWORD
- run: sudo docker buildx create --use
- run: sudo docker buildx build --platform linux/amd64,linux/arm64 --tag oneuptime/probe-api:$ONEUPTIME_VERSION-test --tag oneuptime/probe-api:test --push -f ./ProbeAPI/Dockerfile .
nginx-test-docker-image-deploy:
runs-on: ubuntu-latest
env:
DOCKERHUB_PASSWORD: ${{secrets.DOCKERHUB_PASSWORD}}
DOCKERHUB_USERNAME: ${{secrets.DOCKERHUB_USERNAME}}
ONEUPTIME_VERSION: 6.0.${{github.run_number}}
steps:
- uses: actions/checkout@v2
- uses: actions/setup-node@v2
with:
node-version: 18.3.0
- run: npm run prerun
- run: sudo docker run --rm --privileged docker/binfmt:820fdd95a9972a5308930a2bdfb8573dd4447ad3
# Build and deploy accounts.
- run: sudo docker login --username $DOCKERHUB_USERNAME --password $DOCKERHUB_PASSWORD
- run: sudo docker buildx create --use
- run: sudo docker buildx build --platform linux/amd64,linux/arm64 --tag oneuptime/nginx:$ONEUPTIME_VERSION-test --tag oneuptime/nginx:test --push -f ./Nginx/Dockerfile .
mail-test-docker-image-deploy:
notification-test-docker-image-deploy:
needs: generate-build-number
runs-on: ubuntu-latest
env:
DOCKERHUB_PASSWORD: ${{secrets.DOCKERHUB_PASSWORD}}
DOCKERHUB_USERNAME: ${{secrets.DOCKERHUB_USERNAME}}
ONEUPTIME_VERSION: 6.0.${{github.run_number}}
ONEUPTIME_VERSION: "7.0.${{needs.generate-build-number.outputs.build_number}}"
steps:
- uses: actions/checkout@v2
- uses: actions/setup-node@v2
@@ -177,15 +217,16 @@ jobs:
# Build and deploy accounts.
- run: sudo docker login --username $DOCKERHUB_USERNAME --password $DOCKERHUB_PASSWORD
- run: sudo docker buildx create --use
- run: sudo docker buildx build --platform linux/amd64,linux/arm64 --tag oneuptime/mail:$ONEUPTIME_VERSION-test --tag oneuptime/mail:test --push -f ./Mail/Dockerfile .
- run: sudo docker buildx build --platform linux/amd64,linux/arm64 --tag oneuptime/notification:$ONEUPTIME_VERSION-test --tag oneuptime/notification:test --push -f ./Notification/Dockerfile .
licensing-test-docker-image-deploy:
needs: generate-build-number
runs-on: ubuntu-latest
env:
DOCKERHUB_PASSWORD: ${{secrets.DOCKERHUB_PASSWORD}}
DOCKERHUB_USERNAME: ${{secrets.DOCKERHUB_USERNAME}}
ONEUPTIME_VERSION: 6.0.${{github.run_number}}
ONEUPTIME_VERSION: "7.0.${{needs.generate-build-number.outputs.build_number}}"
steps:
- uses: actions/checkout@v2
- uses: actions/setup-node@v2
@@ -200,11 +241,12 @@ jobs:
- run: sudo docker buildx build --platform linux/amd64,linux/arm64 --tag oneuptime/licensing:$ONEUPTIME_VERSION-test --tag oneuptime/licensing:test --push -f ./Licensing/Dockerfile .
integrations-test-docker-image-deploy:
needs: generate-build-number
runs-on: ubuntu-latest
env:
DOCKERHUB_PASSWORD: ${{secrets.DOCKERHUB_PASSWORD}}
DOCKERHUB_USERNAME: ${{secrets.DOCKERHUB_USERNAME}}
ONEUPTIME_VERSION: 6.0.${{github.run_number}}
ONEUPTIME_VERSION: "7.0.${{needs.generate-build-number.outputs.build_number}}"
steps:
- uses: actions/checkout@v2
- uses: actions/setup-node@v2
@@ -222,11 +264,12 @@ jobs:
identity-test-docker-image-deploy:
needs: generate-build-number
runs-on: ubuntu-latest
env:
DOCKERHUB_PASSWORD: ${{secrets.DOCKERHUB_PASSWORD}}
DOCKERHUB_USERNAME: ${{secrets.DOCKERHUB_USERNAME}}
ONEUPTIME_VERSION: 6.0.${{github.run_number}}
ONEUPTIME_VERSION: "7.0.${{needs.generate-build-number.outputs.build_number}}"
steps:
- uses: actions/checkout@v2
- uses: actions/setup-node@v2
@@ -242,11 +285,12 @@ jobs:
home-test-docker-image-deploy:
needs: generate-build-number
runs-on: ubuntu-latest
env:
DOCKERHUB_PASSWORD: ${{secrets.DOCKERHUB_PASSWORD}}
DOCKERHUB_USERNAME: ${{secrets.DOCKERHUB_USERNAME}}
ONEUPTIME_VERSION: 6.0.${{github.run_number}}
ONEUPTIME_VERSION: "7.0.${{needs.generate-build-number.outputs.build_number}}"
steps:
- uses: actions/checkout@v2
- uses: actions/setup-node@v2
@@ -262,11 +306,12 @@ jobs:
helm-chart-test-docker-image-deploy:
needs: generate-build-number
runs-on: ubuntu-latest
env:
DOCKERHUB_PASSWORD: ${{secrets.DOCKERHUB_PASSWORD}}
DOCKERHUB_USERNAME: ${{secrets.DOCKERHUB_USERNAME}}
ONEUPTIME_VERSION: 6.0.${{github.run_number}}
ONEUPTIME_VERSION: "7.0.${{needs.generate-build-number.outputs.build_number}}"
steps:
- uses: actions/checkout@v2
- uses: actions/setup-node@v2
@@ -282,11 +327,12 @@ jobs:
haraka-test-docker-image-deploy:
needs: generate-build-number
runs-on: ubuntu-latest
env:
DOCKERHUB_PASSWORD: ${{secrets.DOCKERHUB_PASSWORD}}
DOCKERHUB_USERNAME: ${{secrets.DOCKERHUB_USERNAME}}
ONEUPTIME_VERSION: 6.0.${{github.run_number}}
ONEUPTIME_VERSION: "7.0.${{needs.generate-build-number.outputs.build_number}}"
steps:
- uses: actions/checkout@v2
- uses: actions/setup-node@v2
@@ -301,11 +347,12 @@ jobs:
- run: sudo docker buildx build --platform linux/amd64,linux/arm64 --tag oneuptime/haraka:$ONEUPTIME_VERSION-test --tag oneuptime/haraka:test --push -f ./Haraka/Dockerfile .
file-test-docker-image-deploy:
needs: generate-build-number
runs-on: ubuntu-latest
env:
DOCKERHUB_PASSWORD: ${{secrets.DOCKERHUB_PASSWORD}}
DOCKERHUB_USERNAME: ${{secrets.DOCKERHUB_USERNAME}}
ONEUPTIME_VERSION: 6.0.${{github.run_number}}
ONEUPTIME_VERSION: "7.0.${{needs.generate-build-number.outputs.build_number}}"
steps:
- uses: actions/checkout@v2
- uses: actions/setup-node@v2
@@ -321,11 +368,12 @@ jobs:
dashboard-test-docker-image-deploy:
needs: generate-build-number
runs-on: ubuntu-latest
env:
DOCKERHUB_PASSWORD: ${{secrets.DOCKERHUB_PASSWORD}}
DOCKERHUB_USERNAME: ${{secrets.DOCKERHUB_USERNAME}}
ONEUPTIME_VERSION: 6.0.${{github.run_number}}
ONEUPTIME_VERSION: "7.0.${{needs.generate-build-number.outputs.build_number}}"
steps:
- uses: actions/checkout@v2
- uses: actions/setup-node@v2
@@ -343,11 +391,12 @@ jobs:
dashboard-api-test-docker-image-deploy:
needs: generate-build-number
runs-on: ubuntu-latest
env:
DOCKERHUB_PASSWORD: ${{secrets.DOCKERHUB_PASSWORD}}
DOCKERHUB_USERNAME: ${{secrets.DOCKERHUB_USERNAME}}
ONEUPTIME_VERSION: 6.0.${{github.run_number}}
ONEUPTIME_VERSION: "7.0.${{needs.generate-build-number.outputs.build_number}}"
steps:
- uses: actions/checkout@v2
- uses: actions/setup-node@v2
@@ -365,11 +414,12 @@ jobs:
api-reference-test-docker-image-deploy:
needs: generate-build-number
runs-on: ubuntu-latest
env:
DOCKERHUB_PASSWORD: ${{secrets.DOCKERHUB_PASSWORD}}
DOCKERHUB_USERNAME: ${{secrets.DOCKERHUB_USERNAME}}
ONEUPTIME_VERSION: 6.0.${{github.run_number}}
ONEUPTIME_VERSION: "7.0.${{needs.generate-build-number.outputs.build_number}}"
steps:
- uses: actions/checkout@v2
- uses: actions/setup-node@v2
@@ -384,36 +434,17 @@ jobs:
- run: sudo docker buildx build --platform linux/amd64,linux/arm64 --tag oneuptime/api-reference:$ONEUPTIME_VERSION-test --tag oneuptime/api-reference:test --push -f ./ApiReference/Dockerfile .
alert-test-docker-image-deploy:
runs-on: ubuntu-latest
env:
DOCKERHUB_PASSWORD: ${{secrets.DOCKERHUB_PASSWORD}}
DOCKERHUB_USERNAME: ${{secrets.DOCKERHUB_USERNAME}}
ONEUPTIME_VERSION: 6.0.${{github.run_number}}
steps:
- uses: actions/checkout@v2
- uses: actions/setup-node@v2
with:
node-version: 18.3.0
- run: npm run prerun
- run: sudo docker run --rm --privileged docker/binfmt:820fdd95a9972a5308930a2bdfb8573dd4447ad3
# Build and deploy accounts.
- run: sudo docker login --username $DOCKERHUB_USERNAME --password $DOCKERHUB_PASSWORD
- run: sudo docker buildx create --use
- run: sudo docker buildx build --platform linux/amd64,linux/arm64 --tag oneuptime/alert:$ONEUPTIME_VERSION-test --tag oneuptime/alert:test --push -f ./Alert/Dockerfile .
accounts-test-docker-image-deploy:
needs: generate-build-number
runs-on: ubuntu-latest
env:
DOCKERHUB_PASSWORD: ${{secrets.DOCKERHUB_PASSWORD}}
DOCKERHUB_USERNAME: ${{secrets.DOCKERHUB_USERNAME}}
ONEUPTIME_VERSION: 6.0.${{github.run_number}}
ONEUPTIME_VERSION: "7.0.${{needs.generate-build-number.outputs.build_number}}"
steps:
- uses: actions/checkout@v2
- uses: actions/setup-node@v2

View File

@@ -20,4 +20,4 @@ jobs:
- run: cd Common && npm install
- run: cd Model && npm install
- run: cd CommonServer && bash test-setup.sh
- run: cd CommonServer && npm install && npm run test
- run: export $(grep -v '^#' config.env | xargs) && cd CommonServer && npm install && npm run test

4
.gitignore vendored
View File

@@ -69,12 +69,10 @@ secret.env
config.env
config.env.tmp
config.env.temp
docker-compose.yml
logs.txt
*/Cert.crt
*/Key.key
Nginx/default.conf
Certs/StatusPageCerts/*.crt
Certs/StatusPageCerts/*.key
@@ -85,3 +83,5 @@ Certs/ServerCerts/*.key
Backups/*.backup
Backups/*.sql
Backups/*.tar
.env

50
.vscode/launch.json vendored
View File

@@ -41,6 +41,34 @@
"restart": true,
"autoAttachChildProcesses": true
},
{
"address": "127.0.0.1",
"localRoot": "${workspaceFolder}/ApiReference",
"name": "API Reference: Debug with Docker",
"port": 9178,
"remoteRoot": "/usr/src/app",
"request": "attach",
"skipFiles": [
"<node_internals>/**"
],
"type": "node",
"restart": true,
"autoAttachChildProcesses": true
},
{
"address": "127.0.0.1",
"localRoot": "${workspaceFolder}/LinkShortner",
"name": "Link Shortner: Debug with Docker",
"port": 9826,
"remoteRoot": "/usr/src/app",
"request": "attach",
"skipFiles": [
"<node_internals>/**"
],
"type": "node",
"restart": true,
"autoAttachChildProcesses": true
},
{
"address": "127.0.0.1",
"localRoot": "${workspaceFolder}/TestServer",
@@ -58,7 +86,7 @@
{
"address": "127.0.0.1",
"localRoot": "${workspaceFolder}/Probe",
"name": "Dashboard API: Debug with Docker",
"name": "Probe: Debug with Docker",
"port": 9655,
"remoteRoot": "/usr/src/app",
"request": "attach",
@@ -113,9 +141,9 @@
},
{
"address": "127.0.0.1",
"localRoot": "${workspaceFolder}/Mail",
"name": "Mail: Debug with Docker",
"port": 9110,
"localRoot": "${workspaceFolder}/Notification",
"name": "Notification: Debug with Docker",
"port": 9111,
"remoteRoot": "/usr/src/app",
"request": "attach",
"skipFiles": [
@@ -307,20 +335,6 @@
"restart": true,
"autoAttachChildProcesses": true
},
{
"address": "127.0.0.1",
"localRoot": "${workspaceFolder}/probe",
"name": "Probe: Debug with Docker",
"port": 9238,
"remoteRoot": "/usr/src/app",
"request": "attach",
"skipFiles": [
"<node_internals>/**"
],
"type": "node",
"restart": true,
"autoAttachChildProcesses": true
},
{
"name": "CommonServer: Debug Tests",
"type": "node",

View File

@@ -1 +0,0 @@
PORT=3003

View File

@@ -1 +0,0 @@
PORT={{ .Env.ACCOUNTS_PORT }}

View File

@@ -73,6 +73,8 @@ EXPOSE 3003
{{ if eq .Env.ENVIRONMENT "development" }}
RUN mkdir /usr/src/app/dev-env
RUN touch /usr/src/app/dev-env/.env
#Run the app
CMD [ "npm", "run", "dev" ]
{{ else }}

View File

@@ -0,0 +1 @@
This is where env will be stored for the dev environment. This is where you will find the .env file when you exec into the container.

View File

@@ -1,4 +1,4 @@
{
"watch": ["webpack.config.js"],
"exec": "export DEBUG=express:* && webpack-dev-server --port=3003 --mode=development"
"exec": "export DEBUG=express:* && printenv > /usr/src/app/dev-env/.env && webpack-dev-server --port=3003 --mode=development"
}

View File

@@ -7,7 +7,6 @@
"": {
"name": "accounts",
"version": "0.1.0",
"hasInstallScript": true,
"dependencies": {
"Common": "file:../Common",
"CommonServer": "file:../CommonServer",
@@ -57,6 +56,7 @@
"@types/uuid": "^8.3.4",
"axios": "^0.26.1",
"crypto-js": "^4.1.1",
"json5": "^2.2.3",
"moment": "^2.29.2",
"moment-timezone": "^0.5.40",
"nanoid": "^3.3.2",
@@ -88,12 +88,14 @@
"@types/ejs": "^3.1.1",
"@types/gridfs-stream": "^0.5.35",
"@types/json2csv": "^5.0.3",
"@types/markdown-it": "^12.2.3",
"@types/nodemailer": "^6.4.7",
"airtable": "^0.11.3",
"axios": "^1.3.3",
"bullmq": "^3.6.6",
"Common": "file:../Common",
"cors": "^2.8.5",
"cron-parser": "^4.8.1",
"dotenv": "^16.0.0",
"ejs": "^3.1.8",
"express": "^4.17.3",
@@ -101,6 +103,7 @@
"handlebars": "^4.7.7",
"json2csv": "^5.0.7",
"jsonwebtoken": "^9.0.0",
"markdown-it": "^13.0.1",
"Model": "file:../Model",
"node-device-detector": "^2.0.0",
"nodemailer": "^6.7.3",
@@ -109,6 +112,7 @@
"redis": "^4.2.0",
"socket.io": "^4.4.1",
"stripe": "^10.17.0",
"twilio": "^4.13.0",
"typeorm": "^0.3.10",
"typeorm-extension": "^2.2.13",
"vm2": "^3.9.14",
@@ -283,9 +287,9 @@
}
},
"node_modules/@babel/core/node_modules/semver": {
"version": "6.3.0",
"resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz",
"integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==",
"version": "6.3.1",
"resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz",
"integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==",
"bin": {
"semver": "bin/semver.js"
}
@@ -316,9 +320,9 @@
}
},
"node_modules/@babel/eslint-parser/node_modules/semver": {
"version": "6.3.0",
"resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz",
"integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==",
"version": "6.3.1",
"resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz",
"integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==",
"bin": {
"semver": "bin/semver.js"
}
@@ -390,9 +394,9 @@
}
},
"node_modules/@babel/helper-compilation-targets/node_modules/semver": {
"version": "6.3.0",
"resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz",
"integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==",
"version": "6.3.1",
"resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz",
"integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==",
"bin": {
"semver": "bin/semver.js"
}
@@ -449,9 +453,9 @@
}
},
"node_modules/@babel/helper-define-polyfill-provider/node_modules/semver": {
"version": "6.3.0",
"resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz",
"integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==",
"version": "6.3.1",
"resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz",
"integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==",
"bin": {
"semver": "bin/semver.js"
}
@@ -1782,9 +1786,9 @@
}
},
"node_modules/@babel/plugin-transform-runtime/node_modules/semver": {
"version": "6.3.0",
"resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz",
"integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==",
"version": "6.3.1",
"resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz",
"integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==",
"bin": {
"semver": "bin/semver.js"
}
@@ -1994,9 +1998,9 @@
}
},
"node_modules/@babel/preset-env/node_modules/semver": {
"version": "6.3.0",
"resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz",
"integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==",
"version": "6.3.1",
"resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz",
"integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==",
"bin": {
"semver": "bin/semver.js"
}
@@ -4836,9 +4840,9 @@
}
},
"node_modules/babel-plugin-polyfill-corejs2/node_modules/semver": {
"version": "6.3.0",
"resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz",
"integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==",
"version": "6.3.1",
"resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz",
"integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==",
"bin": {
"semver": "bin/semver.js"
}
@@ -7060,9 +7064,9 @@
}
},
"node_modules/eslint-plugin-jsx-a11y/node_modules/semver": {
"version": "6.3.0",
"resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz",
"integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==",
"version": "6.3.1",
"resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz",
"integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==",
"bin": {
"semver": "bin/semver.js"
}
@@ -7134,9 +7138,9 @@
}
},
"node_modules/eslint-plugin-react/node_modules/semver": {
"version": "6.3.0",
"resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz",
"integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==",
"version": "6.3.1",
"resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz",
"integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==",
"bin": {
"semver": "bin/semver.js"
}
@@ -9150,9 +9154,9 @@
}
},
"node_modules/istanbul-lib-instrument/node_modules/semver": {
"version": "6.3.0",
"resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz",
"integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==",
"version": "6.3.1",
"resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz",
"integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==",
"bin": {
"semver": "bin/semver.js"
}
@@ -10430,9 +10434,9 @@
}
},
"node_modules/make-dir/node_modules/semver": {
"version": "6.3.0",
"resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz",
"integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==",
"version": "6.3.1",
"resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz",
"integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==",
"bin": {
"semver": "bin/semver.js"
}
@@ -10796,9 +10800,9 @@
}
},
"node_modules/nodemon/node_modules/semver": {
"version": "5.7.1",
"resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz",
"integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==",
"version": "5.7.2",
"resolved": "https://registry.npmjs.org/semver/-/semver-5.7.2.tgz",
"integrity": "sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g==",
"dev": true,
"bin": {
"semver": "bin/semver"
@@ -12886,9 +12890,9 @@
}
},
"node_modules/react-app-rewired/node_modules/semver": {
"version": "5.7.1",
"resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz",
"integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==",
"version": "5.7.2",
"resolved": "https://registry.npmjs.org/semver/-/semver-5.7.2.tgz",
"integrity": "sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g==",
"dev": true,
"bin": {
"semver": "bin/semver"
@@ -13647,9 +13651,9 @@
}
},
"node_modules/semver": {
"version": "7.3.8",
"resolved": "https://registry.npmjs.org/semver/-/semver-7.3.8.tgz",
"integrity": "sha512-NB1ctGL5rlHrPJtFDVIVzTyQylMLu9N9VICA6HSFJo8MCGVTMW6gfpicwKmmK/dAjTOrqu5l63JJOpDSrAis3A==",
"version": "7.5.4",
"resolved": "https://registry.npmjs.org/semver/-/semver-7.5.4.tgz",
"integrity": "sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==",
"dependencies": {
"lru-cache": "^6.0.0"
},
@@ -14647,9 +14651,9 @@
}
},
"node_modules/tough-cookie": {
"version": "4.1.2",
"resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-4.1.2.tgz",
"integrity": "sha512-G9fqXWoYFZgTc2z8Q5zaHy/vJMjm+WV0AkAeHxVCQiEB1b+dGvWzFW6QV07cY5jQ5gRkeid2qIkzkxUnmoQZUQ==",
"version": "4.1.3",
"resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-4.1.3.tgz",
"integrity": "sha512-aX/y5pVRkfRnfmuX+OdbSdXvPe6ieKX/G2s7e98f4poJHnqH3281gDPm/metm6E/WRamfx7WC4HUqkWHfQHprw==",
"dependencies": {
"psl": "^1.1.33",
"punycode": "^2.1.1",
@@ -15645,9 +15649,9 @@
"dev": true
},
"node_modules/word-wrap": {
"version": "1.2.3",
"resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.3.tgz",
"integrity": "sha512-Hz/mrNwitNRh/HUAtM/VT/5VH+ygD6DV7mYKZAtHOrbs8U7lvPS6xf7EJKMF0uW1KJCl0H701g3ZGus+muE5vQ==",
"version": "1.2.4",
"resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.4.tgz",
"integrity": "sha512-2V81OA4ugVo5pRo46hAoD2ivUJx8jXmWXfUkY4KFNw0hEptvN0QfH3K4nHiwzGeKl5rFKedV48QVoqYavy4YpA==",
"engines": {
"node": ">=0.10.0"
}
@@ -16135,9 +16139,9 @@
},
"dependencies": {
"semver": {
"version": "6.3.0",
"resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz",
"integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw=="
"version": "6.3.1",
"resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz",
"integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA=="
}
}
},
@@ -16157,9 +16161,9 @@
"integrity": "sha512-0rSmRBzXgDzIsD6mGdJgevzgezI534Cer5L/vyMX0kHzT/jiB43jRhd9YUlMGYLQy2zprNmoT8qasCGtY+QaKw=="
},
"semver": {
"version": "6.3.0",
"resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz",
"integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw=="
"version": "6.3.1",
"resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz",
"integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA=="
}
}
},
@@ -16214,9 +16218,9 @@
},
"dependencies": {
"semver": {
"version": "6.3.0",
"resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz",
"integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw=="
"version": "6.3.1",
"resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz",
"integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA=="
}
}
},
@@ -16257,9 +16261,9 @@
},
"dependencies": {
"semver": {
"version": "6.3.0",
"resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz",
"integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw=="
"version": "6.3.1",
"resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz",
"integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA=="
}
}
},
@@ -17120,9 +17124,9 @@
},
"dependencies": {
"semver": {
"version": "6.3.0",
"resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz",
"integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw=="
"version": "6.3.1",
"resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz",
"integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA=="
}
}
},
@@ -17277,9 +17281,9 @@
},
"dependencies": {
"semver": {
"version": "6.3.0",
"resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz",
"integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw=="
"version": "6.3.1",
"resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz",
"integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA=="
}
}
},
@@ -19339,9 +19343,9 @@
},
"dependencies": {
"semver": {
"version": "6.3.0",
"resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz",
"integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw=="
"version": "6.3.1",
"resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz",
"integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA=="
}
}
},
@@ -19848,6 +19852,7 @@
"axios": "^0.26.1",
"crypto-js": "^4.1.1",
"jest": "^27.5.1",
"json5": "^2.2.3",
"moment": "^2.29.2",
"moment-timezone": "^0.5.40",
"nanoid": "^3.3.2",
@@ -19891,6 +19896,7 @@
"@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/nodemailer": "^6.4.7",
"airtable": "^0.11.3",
@@ -19898,6 +19904,7 @@
"bullmq": "^3.6.6",
"Common": "file:../Common",
"cors": "^2.8.5",
"cron-parser": "^4.8.1",
"dotenv": "^16.0.0",
"ejs": "^3.1.8",
"express": "^4.17.3",
@@ -19906,6 +19913,7 @@
"jest": "^27.5.1",
"json2csv": "^5.0.7",
"jsonwebtoken": "^9.0.0",
"markdown-it": "^13.0.1",
"Model": "file:../Model",
"node-device-detector": "^2.0.0",
"nodemailer": "^6.7.3",
@@ -19915,6 +19923,7 @@
"socket.io": "^4.4.1",
"stripe": "^10.17.0",
"ts-jest": "^27.1.4",
"twilio": "^4.13.0",
"typeorm": "^0.3.10",
"typeorm-extension": "^2.2.13",
"vm2": "^3.9.14",
@@ -21163,9 +21172,9 @@
}
},
"semver": {
"version": "6.3.0",
"resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz",
"integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw=="
"version": "6.3.1",
"resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz",
"integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA=="
}
}
},
@@ -21210,9 +21219,9 @@
}
},
"semver": {
"version": "6.3.0",
"resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz",
"integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw=="
"version": "6.3.1",
"resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz",
"integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA=="
}
}
},
@@ -22615,9 +22624,9 @@
},
"dependencies": {
"semver": {
"version": "6.3.0",
"resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz",
"integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw=="
"version": "6.3.1",
"resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz",
"integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA=="
}
}
},
@@ -23597,9 +23606,9 @@
},
"dependencies": {
"semver": {
"version": "6.3.0",
"resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz",
"integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw=="
"version": "6.3.1",
"resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz",
"integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA=="
}
}
},
@@ -23879,9 +23888,9 @@
"dev": true
},
"semver": {
"version": "5.7.1",
"resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz",
"integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==",
"version": "5.7.2",
"resolved": "https://registry.npmjs.org/semver/-/semver-5.7.2.tgz",
"integrity": "sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g==",
"dev": true
},
"supports-color": {
@@ -25195,9 +25204,9 @@
},
"dependencies": {
"semver": {
"version": "5.7.1",
"resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz",
"integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==",
"version": "5.7.2",
"resolved": "https://registry.npmjs.org/semver/-/semver-5.7.2.tgz",
"integrity": "sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g==",
"dev": true
}
}
@@ -25728,9 +25737,9 @@
}
},
"semver": {
"version": "7.3.8",
"resolved": "https://registry.npmjs.org/semver/-/semver-7.3.8.tgz",
"integrity": "sha512-NB1ctGL5rlHrPJtFDVIVzTyQylMLu9N9VICA6HSFJo8MCGVTMW6gfpicwKmmK/dAjTOrqu5l63JJOpDSrAis3A==",
"version": "7.5.4",
"resolved": "https://registry.npmjs.org/semver/-/semver-7.5.4.tgz",
"integrity": "sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==",
"requires": {
"lru-cache": "^6.0.0"
}
@@ -26499,9 +26508,9 @@
}
},
"tough-cookie": {
"version": "4.1.2",
"resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-4.1.2.tgz",
"integrity": "sha512-G9fqXWoYFZgTc2z8Q5zaHy/vJMjm+WV0AkAeHxVCQiEB1b+dGvWzFW6QV07cY5jQ5gRkeid2qIkzkxUnmoQZUQ==",
"version": "4.1.3",
"resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-4.1.3.tgz",
"integrity": "sha512-aX/y5pVRkfRnfmuX+OdbSdXvPe6ieKX/G2s7e98f4poJHnqH3281gDPm/metm6E/WRamfx7WC4HUqkWHfQHprw==",
"requires": {
"psl": "^1.1.33",
"punycode": "^2.1.1",
@@ -27202,9 +27211,9 @@
"dev": true
},
"word-wrap": {
"version": "1.2.3",
"resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.3.tgz",
"integrity": "sha512-Hz/mrNwitNRh/HUAtM/VT/5VH+ygD6DV7mYKZAtHOrbs8U7lvPS6xf7EJKMF0uW1KJCl0H701g3ZGus+muE5vQ=="
"version": "1.2.4",
"resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.4.tgz",
"integrity": "sha512-2V81OA4ugVo5pRo46hAoD2ivUJx8jXmWXfUkY4KFNw0hEptvN0QfH3K4nHiwzGeKl5rFKedV48QVoqYavy4YpA=="
},
"workbox-background-sync": {
"version": "6.5.4",

View File

@@ -24,7 +24,7 @@
"compile": "tsc",
"start": "node --require ts-node/register Serve.ts",
"audit": "npm audit --audit-level=low",
"preinstall": "npx npm-force-resolutions || echo 'No package-lock.json file. Skipping force resolutions'",
"configure": "npx npm-force-resolutions || echo 'No package-lock.json file. Skipping force resolutions'",
"dep-check": "depcheck ./ --skip-missing=true'"
},
"browserslist": {

View File

@@ -65,7 +65,7 @@ const ForgotPassword: FunctionComponent = () => {
formType={FormType.Create}
maxPrimaryButtonWidth={true}
footer={
<div className="actions pointer text-center mt-4 underline-on-hover fw-semibold">
<div className="actions pointer text-center mt-4 hover:underline fw-semibold">
<p>
<Link
to={new Route('/accounts/login')}

View File

@@ -79,7 +79,7 @@ const LoginPage: FunctionComponent = () => {
}}
maxPrimaryButtonWidth={true}
footer={
<div className="actions pointer text-center mt-4 underline-on-hover fw-semibold">
<div className="actions pointer text-center mt-4 hover:underline fw-semibold">
<p>
{!showSsoTip && (
<div

View File

@@ -9,9 +9,10 @@ import LoginUtil from '../Utils/Login';
import { JSONObject } from 'Common/Types/JSON';
import UserUtil from 'CommonUI/src/Utils/User';
import Navigation from 'CommonUI/src/Utils/Navigation';
import { DASHBOARD_URL } from 'CommonUI/src/Config';
import { BILLING_ENABLED, DASHBOARD_URL } from 'CommonUI/src/Config';
import URL from 'Common/Types/API/URL';
import { SIGNUP_API_URL } from '../Utils/ApiPaths';
import Fields from 'CommonUI/src/Components/Forms/Types/Fields';
const RegisterPage: FunctionComponent = () => {
const apiUrl: URL = SIGNUP_API_URL;
@@ -20,6 +21,80 @@ const RegisterPage: FunctionComponent = () => {
Navigation.navigate(DASHBOARD_URL);
}
let formFields: Fields<User> = [
{
field: {
email: true,
},
fieldType: FormFieldSchemaType.Email,
placeholder: 'jeff@example.com',
required: true,
title: 'Email',
},
{
field: {
name: true,
},
fieldType: FormFieldSchemaType.Text,
placeholder: 'Jeff Smith',
required: true,
title: 'Full Name',
},
];
if (BILLING_ENABLED) {
formFields = formFields.concat([
{
field: {
companyName: true,
},
fieldType: FormFieldSchemaType.Text,
placeholder: 'Acme, Inc.',
required: true,
title: 'Company Name',
},
{
field: {
companyPhoneNumber: true,
},
fieldType: FormFieldSchemaType.Phone,
required: true,
placeholder: '+11234567890',
title: 'Phone Number',
},
]);
}
formFields = formFields.concat([
{
field: {
password: true,
},
fieldType: FormFieldSchemaType.Password,
validation: {
minLength: 6,
},
placeholder: 'Password',
title: 'Password',
required: true,
},
{
field: {
confirmPassword: true,
} as any,
validation: {
minLength: 6,
toMatchField: 'password',
},
fieldType: FormFieldSchemaType.Password,
placeholder: 'Confirm Password',
title: 'Confirm Password',
overideFieldKey: 'confirmPassword',
required: true,
forceShow: true,
},
]);
return (
<div className="flex min-h-full flex-col justify-center py-12 sm:px-6 lg:px-8">
<div className="sm:mx-auto sm:w-full sm:max-w-md">
@@ -56,70 +131,7 @@ const RegisterPage: FunctionComponent = () => {
password: '',
confirmPassword: '',
}}
fields={[
{
field: {
email: true,
},
fieldType: FormFieldSchemaType.Email,
placeholder: 'jeff@example.com',
required: true,
title: 'Email',
},
{
field: {
name: true,
},
fieldType: FormFieldSchemaType.Text,
placeholder: 'Jeff Smith',
required: true,
title: 'Full Name',
},
{
field: {
companyName: true,
},
fieldType: FormFieldSchemaType.Text,
placeholder: 'Acme, Inc.',
required: true,
title: 'Company Name',
},
{
field: {
companyPhoneNumber: true,
},
fieldType: FormFieldSchemaType.Phone,
required: true,
placeholder: '+11234567890',
title: 'Phone Number',
},
{
field: {
password: true,
},
fieldType: FormFieldSchemaType.Password,
validation: {
minLength: 6,
},
placeholder: 'Password',
title: 'Password',
required: true,
},
{
field: {
password: true,
},
validation: {
minLength: 6,
toMatchField: 'password',
},
fieldType: FormFieldSchemaType.Password,
placeholder: 'Confirm Password',
title: 'Confirm Password',
overideFieldKey: 'confirmPassword',
required: true,
},
]}
fields={formFields}
apiUrl={apiUrl}
formType={FormType.Create}
submitButtonText={'Sign Up'}

View File

@@ -68,7 +68,7 @@ const VerifyEmail: FunctionComponent = () => {
<div className="d-flex flex-column h-100">
<div className="auth-content my-auto">
<div
className="mt-4 text-center"
className="mt-4 text-center flex justify-center"
style={{ marginBottom: '40px' }}
>
<img
@@ -109,7 +109,7 @@ const VerifyEmail: FunctionComponent = () => {
'/accounts/login'
)
}
className="underline-on-hover text-primary fw-semibold"
className="hover:underline text-primary fw-semibold"
>
Login.
</Link>

View File

@@ -38,9 +38,7 @@ module.exports = {
new webpack.DefinePlugin({
'process': {
'env': {
...readEnvFile('../Common/.env'),
...readEnvFile('../CommonUI/.env'),
...readEnvFile('./.env')
...readEnvFile('/usr/src/app/dev-env/.env')
}
}
}),

View File

@@ -1 +0,0 @@
PORT={{ .Env.ALERT_PORT }}

7749
Alert/package-lock.json generated

File diff suppressed because it is too large Load Diff

View File

@@ -1 +0,0 @@
PORT={{ .Env.API_DOCS_PORT }}

View File

@@ -20,7 +20,7 @@ import DataTypeServiceHandler from './Service/DataType';
import Dictionary from 'Common/Types/Dictionary';
const ResourceDictionary: Dictionary<ModelDocumentation> =
ResourceUtil.getReosurceDictionaryByPath();
ResourceUtil.getResourceDictionaryByPath();
const APP_NAME: string = 'reference';

View File

@@ -15,7 +15,7 @@ import PageNotFoundServiceHandler from './PageNotFound';
const Resources: Array<ModelDocumentation> = ResourceUtil.getResources();
const ResourceDictionary: Dictionary<ModelDocumentation> =
ResourceUtil.getReosurceDictionaryByPath();
ResourceUtil.getResourceDictionaryByPath();
const PermissionDictionary: Dictionary<PermissionProps> =
PermissionHelper.getAllPermissionPropsAsDictionary();

View File

@@ -52,7 +52,7 @@ export default class ResourceUtil {
);
}
public static getReosurceDictionaryByPath(): Dictionary<ModelDocumentation> {
public static getResourceDictionaryByPath(): Dictionary<ModelDocumentation> {
const dict: Dictionary<ModelDocumentation> = {};
const resources: Array<ModelDocumentation> =

View File

@@ -2,7 +2,7 @@
"name": "oneuptime-homepage",
"version": "3.0.0",
"scripts": {
"preinstall": "npx npm-force-resolutions || echo 'No package-lock.json file. Skipping force resolutions'",
"configure": "npx npm-force-resolutions || echo 'No package-lock.json file. Skipping force resolutions'",
"start": "node --require ts-node/register Index.ts",
"compile": "tsc",
"dev": "npx nodemon",

View File

@@ -30,7 +30,7 @@
</div>
</div>
<h1 class="font-bold text-xl">API Documentation</h1>
<p class="lead">Use the OneUptime API to access any reosurce in your projects, create automated
<p class="lead">Use the OneUptime API to access any resource in your projects, create automated
workflows, and more
and
seamlessly integrate your project into the other tools and services you use in your

View File

@@ -1,4 +0,0 @@
CLICKHOUSE_USER={{ .Env.CLICKHOUSE_USER }}
CLICKHOUSE_PASSWORD={{ .Env.CLICKHOUSE_PASSWORD }}
CLICKHOUSE_DB=oneuptime
CLICKHOUSE_DEFAULT_ACCESS_MANAGEMENT=1

3
Clickhouse/README.md Normal file
View File

@@ -0,0 +1,3 @@
# Clickhouse
This folder is for clickhouse related files.

View File

@@ -1,9 +0,0 @@
NODE_ENV={{ .Env.ENVIRONMENT }}
BILLING_ENABLED={{ .Env.BILLING_ENABLED }}
BILLING_PUBLIC_KEY={{ .Env.BILLING_PUBLIC_KEY }}
SUBSCRIPTION_PLAN_BASIC={{ .Env.SUBSCRIPTION_PLAN_BASIC }}
SUBSCRIPTION_PLAN_GROWTH={{ .Env.SUBSCRIPTION_PLAN_GROWTH }}
SUBSCRIPTION_PLAN_SCALE={{ .Env.SUBSCRIPTION_PLAN_SCALE }}
SUBSCRIPTION_PLAN_ENTERPRISE={{ .Env.SUBSCRIPTION_PLAN_ENTERPRISE }}
METERED_PLAN_ACTIVE_MONITORING={{ .Env.METERED_PLAN_ACTIVE_MONITORING }}
DOMAIN={{ .Env.DOMAIN }}

View File

@@ -28,13 +28,17 @@ import Permission, {
UserPermission,
UserTenantAccessPermission,
} from '../Types/Permission';
import { ColumnAccessControl } from '../Types/Database/AccessControl/AccessControl';
import {
ColumnAccessControl,
ColumnBillingAccessControl,
} from '../Types/Database/AccessControl/AccessControl';
import { getColumnAccessControlForAllColumns } from '../Types/Database/AccessControl/ColumnAccessControl';
import BadDataException from '../Types/Exception/BadDataException';
import { PlanSelect } from '../Types/Billing/SubscriptionPlan';
import { EnableWorkflowOn } from '../Types/Model/EnableWorkflow';
import IconProp from '../Types/Icon/IconProp';
import Text from '../Types/Text';
import { getColumnBillingAccessControlForAllColumns } from '../Types/Database/AccessControl/ColumnBillingAccessControl';
export type DbTypes =
| string
@@ -45,6 +49,7 @@ export type DbTypes =
| URL
| Phone
| JSONObject
| ObjectID
| JSONArray
| Buffer;
@@ -201,6 +206,14 @@ export default class BaseModel extends BaseEntity {
return dictionary[columnName] as TableColumnMetadata;
}
public getColumnBillingAccessControl(
columnName: string
): ColumnBillingAccessControl {
const dictionary: Dictionary<ColumnBillingAccessControl> =
getColumnBillingAccessControlForAllColumns(this);
return dictionary[columnName] as ColumnBillingAccessControl;
}
public getColumnAccessControlFor(
columnName: string
): ColumnAccessControl | null {

View File

@@ -28,7 +28,7 @@ export default class FileModel extends BaseModel {
@TableColumn({
required: true,
type: TableColumnType.File,
canReadOnPopulate: true,
canReadOnRelationQuery: true,
})
@Column({
nullable: false,
@@ -46,7 +46,7 @@ export default class FileModel extends BaseModel {
type: TableColumnType.ShortText,
title: 'Name',
description: 'Any friendly name of this object',
canReadOnPopulate: true,
canReadOnRelationQuery: true,
})
@Column({
nullable: false,
@@ -63,7 +63,7 @@ export default class FileModel extends BaseModel {
@TableColumn({
required: true,
type: TableColumnType.ShortText,
canReadOnPopulate: true,
canReadOnRelationQuery: true,
})
@Column({
nullable: false,
@@ -81,7 +81,7 @@ export default class FileModel extends BaseModel {
required: true,
unique: true,
type: TableColumnType.Slug,
canReadOnPopulate: true,
canReadOnRelationQuery: true,
})
@Column({
nullable: false,
@@ -99,7 +99,7 @@ export default class FileModel extends BaseModel {
required: true,
isDefaultValueColumn: true,
type: TableColumnType.Slug,
canReadOnPopulate: true,
canReadOnRelationQuery: true,
})
@Column({
nullable: false,

View File

@@ -0,0 +1,298 @@
import SubscriptionPlan, {
PlanSelect,
} from '../../../Types/Billing/SubscriptionPlan';
import { JSONObject } from '../../../Types/JSON';
import BadDataException from '../../../Types/Exception/BadDataException';
describe('SubscriptionPlan', () => {
const monthlyPlanId: string = 'monthly_plan_id';
const yearlyPlanId: string = 'yearly_plan_id';
const name: string = 'Test Plan';
const monthlySubscriptionAmountInUSD: number = 0;
const yearlySubscriptionAmountInUSD: number = 0;
const order: number = 1;
const trialPeriodInDays: number = 30;
const env: JSONObject = {
SUBSCRIPTION_PLAN_1: 'Free,monthly_plan_id,yearly_plan_id,0,0,1,7',
SUBSCRIPTION_PLAN_2:
'Growth,growth_monthly_plan_id,growth_yearly_plan_id,9,99,2,14',
};
describe('constructor', () => {
it('should create a new SubscriptionPlan object', () => {
const plan: SubscriptionPlan = new SubscriptionPlan(
monthlyPlanId,
yearlyPlanId,
name,
monthlySubscriptionAmountInUSD,
yearlySubscriptionAmountInUSD,
order,
trialPeriodInDays
);
expect(plan.getMonthlyPlanId()).toEqual(monthlyPlanId);
expect(plan.getYearlyPlanId()).toEqual(yearlyPlanId);
expect(plan.getName()).toEqual(name);
expect(plan.getPlanOrder()).toEqual(order);
expect(plan.getTrialPeriod()).toEqual(trialPeriodInDays);
});
});
describe('getMonthlyPlanId', () => {
it('should return the monthly plan ID', () => {
const getMonthlyPlanId: string = 'monthly_plan_id';
expect(getMonthlyPlanId).toEqual(monthlyPlanId);
});
});
describe('getYearlyPlanId', () => {
it('should return the yearly plan ID', () => {
const getYearlyPlanId: string = 'yearly_plan_id';
expect(getYearlyPlanId).toEqual(yearlyPlanId);
});
});
describe('getPlanOrder', () => {
it('should return the plan order', () => {
const getPlanOrder: number = 1;
expect(getPlanOrder).toEqual(order);
});
});
describe('getTrialPeriod', () => {
it('should return the trial period in days', () => {
const getTrialPeriod: number = 30;
expect(getTrialPeriod).toEqual(trialPeriodInDays);
});
});
describe('getName', () => {
it('should return the plan name', () => {
const getName: string = 'Test Plan';
expect(getName).toEqual(name);
});
});
describe('isFreePlan', () => {
it('should return true if plan is free with monthlyId', () => {
const isFreePlan: boolean = SubscriptionPlan.isFreePlan(
'monthly_plan_id',
env
);
expect(isFreePlan).toBe(true);
});
it('should return true if plan is free with yearlyId', () => {
const isFreePlan: boolean = SubscriptionPlan.isFreePlan(
'yearly_plan_id',
env
);
expect(isFreePlan).toBe(true);
});
});
describe('isCustomPricingPlan', () => {
it('should return false if plan is not custom pricing', () => {
const isCustomPricingPlan: boolean =
SubscriptionPlan.isCustomPricingPlan(monthlyPlanId, env);
expect(isCustomPricingPlan).toBe(false);
});
});
describe('getSubscriptionPlans', () => {
it('should return an array of SubscriptionPlan objects', () => {
const subscriptionPlans: SubscriptionPlan[] =
SubscriptionPlan.getSubscriptionPlans(env);
expect(subscriptionPlans.length).toBe(2);
expect(subscriptionPlans?.[0]?.getName()).toBe('Free');
expect(subscriptionPlans?.[0]?.getYearlyPlanId()).toBe(
'yearly_plan_id'
);
});
});
describe('isValidPlanId', () => {
it('should return true if plan ID is valid', () => {
const isValidPlanId: boolean = SubscriptionPlan.isValidPlanId(
'growth_monthly_plan_id',
env
);
expect(isValidPlanId).toBe(true);
});
});
describe('getPlanSelect', () => {
it('should return the plan name if valid planId is passed', () => {
new SubscriptionPlan(
monthlyPlanId,
'yearly_plan_id',
PlanSelect.Free,
0,
0,
2,
30
);
const result: PlanSelect = SubscriptionPlan.getPlanSelect(
monthlyPlanId,
env
);
expect(result).toBe(PlanSelect.Free);
});
it('should throw an error if invalid PlanId is passed', () => {
SubscriptionPlan.getSubscriptionPlanById = jest
.fn()
.mockReturnValue(undefined);
expect(() => {
SubscriptionPlan.getPlanSelect('invalid-plan-id', env);
}).toThrow(BadDataException);
});
});
describe('getYearlySubscriptionAmountInUSD', () => {
it('should return the yearly subscription amount', () => {
const getYearlySubscriptionAmountInUSD: number = 0;
expect(getYearlySubscriptionAmountInUSD).toEqual(
yearlySubscriptionAmountInUSD
);
});
});
describe('getMonthlySubscriptionAmountInUSD', () => {
it('should return the yearly subscription amount', () => {
const getMonthlySubscriptionAmountInUSD: number = 0;
expect(getMonthlySubscriptionAmountInUSD).toEqual(
monthlySubscriptionAmountInUSD
);
});
});
describe('isFeatureAccessibleOnCurrentPlan', () => {
it('should return false if the feature is not accessible on current plan', () => {
const env: JSONObject = {
SUBSCRIPTION_PLAN_1:
'Free,monthly_plan_id,yearly_plan_id,0,0,1,7',
SUBSCRIPTION_PLAN_2:
'Growth,growth_monthly_plan_id,growth_yearly_plan_id,9,99,2,14',
};
const featureSubscriptionPlan: SubscriptionPlan =
new SubscriptionPlan(
'growth_monthly_plan_id',
'growth_yearly_plan_id',
PlanSelect.Growth,
9,
99,
2,
14
);
const currentSubscriptionPlan: SubscriptionPlan =
new SubscriptionPlan(
'monthly_plan_id',
'yearly_plan_id',
PlanSelect.Free,
0,
0,
1,
7
);
const result: boolean =
SubscriptionPlan.isFeatureAccessibleOnCurrentPlan(
PlanSelect.Growth,
PlanSelect.Free,
env
);
expect(featureSubscriptionPlan.getPlanOrder()).toBeGreaterThan(
currentSubscriptionPlan.getPlanOrder()
);
expect(result).toBe(false);
});
it('should return true if the feature is on the current plan', () => {
const env: JSONObject = {
SUBSCRIPTION_PLAN_1:
'Free,monthly_plan_id,yearly_plan_id,0,0,3,7',
SUBSCRIPTION_PLAN_2:
'Growth,growth_monthly_plan_id,growth_yearly_plan_id,9,99,2,14',
};
const featureSubscriptionPlan: SubscriptionPlan =
new SubscriptionPlan(
'growth_monthly_plan_id',
'growth_yearly_plan_id',
PlanSelect.Growth,
9,
99,
2,
14
);
const currentSubscriptionPlan: SubscriptionPlan =
new SubscriptionPlan(
monthlyPlanId,
'yearly_plan_id',
PlanSelect.Free,
0,
0,
3,
7
);
const result: boolean =
SubscriptionPlan.isFeatureAccessibleOnCurrentPlan(
PlanSelect.Growth,
PlanSelect.Free,
env
);
expect(featureSubscriptionPlan.getPlanOrder()).toBeLessThan(
currentSubscriptionPlan.getPlanOrder()
);
expect(result).toBe(true);
});
});
describe('getSubscriptionPlanFromPlanSelect', () => {
it('should return the correct SubscriptionPlan when a valid planSelect is provided', () => {
const plan: SubscriptionPlan =
SubscriptionPlan.getSubscriptionPlanFromPlanSelect(
PlanSelect.Growth,
env
);
expect(plan).toEqual(plan);
expect(plan.getName()).toEqual(PlanSelect.Growth);
});
it('should throw a BadDataException when an invalid planSelect is provided', () => {
const planSelect: PlanSelect = PlanSelect.Scale;
SubscriptionPlan.getSubscriptionPlans = jest
.fn()
.mockReturnValue([]);
expect(() => {
SubscriptionPlan.getSubscriptionPlanFromPlanSelect(
planSelect,
env
);
}).toThrow(BadDataException);
});
});
describe('isYearlyPlan', () => {
it('should return true if yearly plan exists', () => {
const planId: string = 'growth_yearly_plan_id';
const plan: SubscriptionPlan = new SubscriptionPlan(
'monthly-plan-id',
planId,
'Growth',
10,
100,
2,
7
);
SubscriptionPlan.getSubscriptionPlanById(planId, env);
expect(plan?.getYearlyPlanId()).toBe(planId);
});
});
describe('isUnpaid', () => {
it('should return true if the subscription status is unpaid', () => {
const subscriptionStatus: string =
'incomplete' ||
'ncomplete_expired' ||
'past_due' ||
'canceled' ||
'unpaid';
const result: boolean =
SubscriptionPlan.isUnpaid(subscriptionStatus);
expect(result).toBe(true);
});
it('should return false if the subscription status is active', () => {
const subscriptionStatus: string = 'active';
const result: boolean =
SubscriptionPlan.isUnpaid(subscriptionStatus);
expect(result).toBe(false);
});
});
});

View File

@@ -3,6 +3,7 @@ enum HTTPMethod {
POST = 'POST',
DELETE = 'DELETE',
PUT = 'PUT',
HEAD = 'HEAD',
}
export default HTTPMethod;

View File

@@ -23,7 +23,9 @@ export default class Hostname extends DatabaseProperty {
if (Hostname.isValid(value)) {
this._route = value;
} else {
throw new BadDataException('Hostname is not in valid format.');
throw new BadDataException(
'Hostname ' + value + ' is not in valid format.'
);
}
}

View File

@@ -10,7 +10,7 @@ export default class Route extends DatabaseProperty {
}
public set route(v: string) {
const matchRouteCharacters: RegExp =
/^[a-zA-Z_\d\-!#$&'()*+,./:;=?@[\]]*$/;
/^[a-zA-Z_\d\-!#$%&'()*+,./:;=?@[\]]*$/;
if (v && !matchRouteCharacters.test(v)) {
throw new BadDataException(`Invalid route: ${v}`);
}

View File

@@ -24,7 +24,7 @@ export default class StatusCode {
return this.statusCode.toNumber();
}
public static isValidStausCode(statusCode: number | string): boolean {
public static isValidStatusCode(statusCode: number | string): boolean {
try {
if (typeof statusCode === Typeof.String) {
statusCode = parseInt(statusCode as string);

View File

@@ -99,7 +99,7 @@ export default class URL extends DatabaseProperty {
let urlString: string = `${this.protocol}${
this.hostname || this.email
}`;
if (!this.email) {
if (!this.email && !urlString.startsWith('mailto:')) {
if (this.route && this.route.toString().startsWith('/')) {
if (urlString.endsWith('/')) {
urlString = urlString.substring(0, urlString.length - 1);

View File

@@ -26,4 +26,29 @@ export default class ArrayUtil {
return 0;
};
}
public static distinctByFieldName(
array: Array<any>,
fieldName: string
): Array<any> {
// Get the distinct values by field name of the array
const distinctValues: Array<any> = array
.map((item: any) => {
return item[fieldName];
})
.filter((value: any, index: number, self: Array<any>) => {
return self.indexOf(value) === index;
});
// Create a new array with the distinct values
const distinctArray: Array<any> = [];
for (const value of distinctValues) {
const item: any = array.find((item: any) => {
return item[fieldName] === value;
});
distinctArray.push(item);
}
return distinctArray;
}
}

View File

@@ -0,0 +1,30 @@
import URL from '../API/URL';
import Phone from '../Phone';
export interface Say {
sayMessage: string;
}
export interface OnCallInputRequest {
[x: string]: Say; // input.
default: Say; // what if there is no input or invalid input.
}
export interface GatherInput {
introMessage: string;
numDigits: number;
timeoutInSeconds: number;
noInputMessage: string;
onInputCallRequest: OnCallInputRequest;
responseUrl: URL;
}
export enum CallAction {}
export interface CallRequestMessage {
data: Array<Say | CallAction | GatherInput>;
}
export default interface CallRequest extends CallRequestMessage {
to: Phone;
}

View File

@@ -0,0 +1,9 @@
enum CallStatus {
Success = 'Success',
Error = 'Error',
LowBalance = 'Low Balance',
MissedCall = 'Missed Call',
Busy = 'Busy',
}
export default CallStatus;

View File

@@ -17,3 +17,9 @@ export interface BillingAccessControl {
update: PlanSelect;
delete: PlanSelect;
}
export interface ColumnBillingAccessControl {
create: PlanSelect;
read: PlanSelect;
update: PlanSelect;
}

View File

@@ -0,0 +1,45 @@
import 'reflect-metadata';
import BaseModel from '../../../Models/BaseModel';
import Dictionary from '../../Dictionary';
import { ReflectionMetadataType } from '../../Reflection';
import { ColumnBillingAccessControl } from './AccessControl';
const accessControlSymbol: Symbol = Symbol('ColumnBillingAccessControl');
export default (
accessControl: ColumnBillingAccessControl
): ReflectionMetadataType => {
return Reflect.metadata(accessControlSymbol, accessControl);
};
export const getColumnBillingAccessControl: Function = (
target: BaseModel,
propertyKey: string
): ColumnBillingAccessControl => {
return Reflect.getMetadata(
accessControlSymbol,
target,
propertyKey
) as ColumnBillingAccessControl;
};
export const getColumnBillingAccessControlForAllColumns: Function = <
T extends BaseModel
>(
target: T
): Dictionary<ColumnBillingAccessControl> => {
const dictonary: Dictionary<ColumnBillingAccessControl> = {};
const keys: Array<string> = Object.keys(target);
for (const key of keys) {
if (Reflect.getMetadata(accessControlSymbol, target, key)) {
dictonary[key] = Reflect.getMetadata(
accessControlSymbol,
target,
key
) as ColumnBillingAccessControl;
}
}
return dictonary;
};

View File

@@ -17,8 +17,9 @@ export interface TableColumnMetadata {
encrypted?: boolean;
manyToOneRelationColumn?: string;
type: TableColumnType;
canReadOnPopulate?: boolean;
canReadOnRelationQuery?: boolean;
modelType?: { new (): BaseModel };
forceGetDefaultValueOnCreate?: () => string | number | boolean; // overwrites any value that is being passed and generates a new one. Useful for generating OTPs, etc.
}
export default (props: TableColumnMetadata): ReflectionMetadataType => {

View File

@@ -1,5 +1,6 @@
import InBetween from './Database/InBetween';
import BadDataException from './Exception/BadDataException';
import { JSONObject } from './JSON';
import { JSONObject, ObjectType } from './JSON';
import PositiveNumber from './PositiveNumber';
import moment from 'moment-timezone';
@@ -65,6 +66,21 @@ export default class OneUptimeDate {
return YYYY + '-' + MM + '-' + DD + 'T' + HH + ':' + II + ':' + SS;
}
public static fromJSON(json: JSONObject): Date {
if (json['_type'] === ObjectType.DateTime) {
return OneUptimeDate.fromString(json['value'] as string);
}
throw new BadDataException('Invalid JSON: ' + JSON.stringify(json));
}
public static toJSON(date: Date): JSONObject {
return {
_type: ObjectType.DateTime,
value: OneUptimeDate.toString(date),
};
}
public static addRemoveMinutes(date: Date, minutes: number): Date {
date = this.fromString(date);
return moment(date).add(minutes, 'minutes').toDate();
@@ -364,6 +380,82 @@ export default class OneUptimeDate {
);
}
public static getDifferenceInMinutes(date: Date, date2: Date): number {
date = this.fromString(date);
date2 = this.fromString(date2);
const minutes: number = moment(date).diff(moment(date2), 'minutes');
if (minutes < 0) {
return minutes * -1;
}
return minutes;
}
public static getDateAsFormattedArrayInMultipleTimezones(
date: string | Date,
onlyShowDate?: boolean
): Array<string> {
date = this.fromString(date);
let formatstring: string = 'MMM DD YYYY, HH:mm';
if (onlyShowDate) {
formatstring = 'MMM DD, YYYY';
}
// convert this date into GMT, EST, PST, IST, ACT with moment
const timezoneDates: Array<string> = [];
timezoneDates.push(
moment(date).tz('UTC').format(formatstring) +
' ' +
(onlyShowDate ? '' : 'GMT')
);
timezoneDates.push(
moment(date).tz('America/New_York').format(formatstring) +
' ' +
(onlyShowDate ? '' : 'EST')
);
timezoneDates.push(
moment(date).tz('America/Los_Angeles').format(formatstring) +
' ' +
(onlyShowDate ? '' : 'PST')
);
timezoneDates.push(
moment(date).tz('Asia/Kolkata').format(formatstring) +
' ' +
(onlyShowDate ? '' : 'IST')
);
timezoneDates.push(
moment(date).tz('Australia/Sydney').format(formatstring) +
' ' +
(onlyShowDate ? '' : 'AEST')
);
return timezoneDates;
}
public static getDateAsFormattedHTMLInMultipleTimezones(
date: string | Date,
onlyShowDate?: boolean
): string {
return this.getDateAsFormattedArrayInMultipleTimezones(
date,
onlyShowDate
).join('<br/>');
}
public static getDateAsFormattedStringInMultipleTimezones(
date: string | Date,
onlyShowDate?: boolean
): string {
return this.getDateAsFormattedArrayInMultipleTimezones(
date,
onlyShowDate
).join('\n');
}
public static getDateAsLocalFormattedString(
date: string | Date,
onlyShowDate?: boolean
@@ -385,6 +477,10 @@ export default class OneUptimeDate {
);
}
public static getDayInSeconds(): number {
return 24 * 60 * 60;
}
public static getCurrentTimezoneString(): string {
return moment.tz(moment.tz.guess()).zoneAbbr();
}
@@ -431,4 +527,13 @@ export default class OneUptimeDate {
const formatstring: string = 'YYYY-MM-DD';
return moment(date).local().format(formatstring);
}
public static asFilterDateForDatabaseQuery(date: string | Date): InBetween {
date = this.fromString(date);
const formattedDate: Date = moment(date).toDate();
return new InBetween(
OneUptimeDate.getStartOfDay(formattedDate),
OneUptimeDate.getEndOfDay(formattedDate)
);
}
}

View File

@@ -26,7 +26,7 @@ export default class Domain extends DatabaseProperty {
'|'
);
const secondTLDs: Array<string> =
'ac|academy|accountant|accountants|actor|adult|ag|agency|ai|airforce|am|amsterdam|apartments|app|archi|army|art|asia|associates|at|attorney|au|auction|auto|autos|baby|band|bar|barcelona|bargains|basketball|bayern|be|beauty|beer|berlin|best|bet|bid|bike|bingo|bio|biz|biz.pl|black|blog|blue|boats|boston|boutique|broker|build|builders|business|buzz|bz|ca|cab|cafe|camera|camp|capital|car|cards|care|careers|cars|casa|cash|casino|catering|cc|center|ceo|ch|charity|chat|cheap|church|city|cl|claims|cleaning|clinic|clothing|cloud|club|cn|co|co.in|co.jp|co.kr|co.nz|co.uk|co.za|coach|codes|coffee|college|com|com.ag|com.au|com.br|com.bz|com.cn|com.co|com.es|com.ky|com.mx|com.pe|com.ph|com.pl|com.ru|com.tw|community|company|computer|condos|construction|consulting|contact|contractors|cooking|cool|country|coupons|courses|credit|creditcard|cricket|cruises|cymru|cz|dance|date|dating|de|deals|degree|delivery|democrat|dental|dentist|design|dev|diamonds|digital|direct|directory|discount|dk|doctor|dog|domains|download|earth|education|email|energy|engineer|engineering|enterprises|equipment|es|estate|eu|events|exchange|expert|exposed|express|fail|faith|family|fan|fans|farm|fashion|film|finance|financial|firm.in|fish|fishing|fit|fitness|flights|florist|fm|football|forsale|foundation|fr|fun|fund|furniture|futbol|fyi|gallery|games|garden|gay|gen.in|gg|gifts|gives|giving|glass|global|gmbh|gold|golf|graphics|gratis|green|gripe|group|gs|guide|guru|hair|haus|health|healthcare|hockey|holdings|holiday|homes|horse|hospital|host|house|idv.tw|immo|immobilien|in|inc|ind.in|industries|info|info.pl|ink|institute|insure|international|investments|io|irish|ist|istanbul|it|jetzt|jewelry|jobs|jp|kaufen|kids|kim|kitchen|kiwi|kr|ky|la|land|lat|law|lawyer|lease|legal|lgbt|life|lighting|limited|limo|live|llc|llp|loan|loans|london|love|ltd|ltda|luxury|maison|makeup|management|market|marketing|mba|me|me.uk|media|melbourne|memorial|men|menu|miami|mobi|moda|moe|money|monster|mortgage|motorcycles|movie|ms|music|mx|nagoya|name|navy|ne.kr|net|net.ag|net.au|net.br|net.bz|net.cn|net.co|net.in|net.ky|net.nz|net.pe|net.ph|net.pl|net.ru|network|news|ninja|nl|no|nom.co|nom.es|nom.pe|nrw|nyc|okinawa|one|onl|online|org|org.ag|org.au|org.cn|org.es|org.in|org.ky|org.nz|org.pe|org.ph|org.pl|org.ru|org.uk|organic|page|paris|partners|parts|party|pe|pet|ph|photography|photos|pictures|pink|pizza|pl|place|plumbing|plus|poker|porn|press|pro|productions|promo|properties|protection|pub|pw|quebec|quest|racing|re.kr|realestate|recipes|red|rehab|reise|reisen|rent|rentals|repair|report|republican|rest|restaurant|review|reviews|rich|rip|rocks|rodeo|rugby|run|ryukyu|sale|salon|sarl|school|schule|science|se|security|services|sex|sg|sh|shiksha|shoes|shop|shopping|show|singles|site|ski|skin|soccer|social|software|solar|solutions|space|storage|store|stream|studio|study|style|supplies|supply|support|surf|surgery|sydney|systems|tax|taxi|team|tech|technology|tel|tennis|theater|theatre|tickets|tienda|tips|tires|today|tokyo|tools|tours|town|toys|trade|trading|training|travel|tube|tv|tw|uk|university|uno|us|vacations|vc|vegas|ventures|vet|viajes|video|villas|vin|vip|vision|vodka|vote|voto|voyage|wales|watch|web|webcam|website|wedding|wiki|win|wine|work|works|world|ws|wtf|xxx|xyz|yachts|yoga|yokohama|zone|移动|dev|com|edu|gov|net|mil|org|nom|sch|caa|res|off|gob|int|tur|ip6|uri|urn|asn|act|nsw|qld|tas|vic|pro|biz|adm|adv|agr|arq|art|ato|bio|bmd|cim|cng|cnt|ecn|eco|emp|eng|esp|etc|eti|far|fnd|fot|fst|g12|ggf|imb|ind|inf|jor|jus|leg|lel|mat|med|mus|not|ntr|odo|ppg|psc|psi|qsl|rec|slg|srv|teo|tmp|trd|vet|zlg|web|ltd|sld|pol|fin|k12|lib|pri|aip|fie|eun|sci|prd|cci|pvt|mod|idv|rel|sex|gen|nic|abr|bas|cal|cam|emr|fvg|laz|lig|lom|mar|mol|pmn|pug|sar|sic|taa|tos|umb|vao|vda|ven|mie|北海道|和歌山|神奈川|鹿児島|ass|rep|tra|per|ngo|soc|grp|plc|its|air|and|bus|can|ddr|jfk|mad|nrw|nyc|ski|spy|tcm|ulm|usa|war|fhs|vgs|dep|eid|fet|fla|flå|gol|hof|hol|sel|vik|cri|iwi|ing|abo|fam|gok|gon|gop|gos|aid|atm|gsm|sos|elk|waw|est|aca|bar|cpa|jur|law|sec|plo|www|bir|cbg|jar|khv|msk|nov|nsk|ptz|rnd|spb|stv|tom|tsk|udm|vrn|cmw|kms|nkz|snz|pub|fhv|red|ens|nat|rns|rnu|bbs|tel|bel|kep|nhs|dni|fed|isa|nsn|gub|e12|tec|орг|обр|упр|alt|nis|jpn|mex|ath|iki|nid|gda|inc'.split(
'ac|academy|accountant|accountants|actor|adult|ag|agency|ai|airforce|am|amsterdam|apartments|app|archi|army|art|asia|associates|at|attorney|au|auction|auto|autos|baby|band|bar|barcelona|bargains|basketball|bayern|be|beauty|beer|berlin|best|bet|bid|bike|bingo|bio|biz|biz.pl|black|blog|blue|boats|boston|boutique|broker|build|builders|business|buzz|bz|ca|cab|cafe|camera|camp|capital|car|cards|care|careers|cars|casa|cash|casino|catering|cc|center|ceo|ch|charity|chat|cheap|church|city|cl|claims|cleaning|clinic|clothing|cloud|club|cn|co|co.in|co.jp|co.kr|co.nz|co.uk|co.za|coach|codes|coffee|college|com|com.ag|com.au|com.br|com.bz|com.cn|com.co|com.es|com.ky|com.mx|com.pe|com.ph|com.pl|com.ru|com.tw|community|company|computer|condos|construction|consulting|contact|contractors|cooking|cool|country|coupons|courses|credit|creditcard|cricket|cruises|cymru|cz|dance|date|dating|de|deals|degree|delivery|democrat|dental|dentist|design|dev|diamonds|digital|direct|directory|discount|dk|doctor|dog|domains|download|earth|education|email|energy|engineer|engineering|enterprises|equipment|es|estate|eu|events|exchange|expert|exposed|express|fail|faith|family|fan|fans|farm|fashion|film|finance|financial|firm.in|fish|fishing|fit|fitness|flights|florist|fm|football|forsale|foundation|fr|fun|fund|furniture|futbol|fyi|gallery|games|garden|gay|gen.in|gg|gifts|gives|giving|glass|global|gmbh|gold|golf|graphics|gratis|green|gripe|group|gs|guide|guru|hair|haus|health|healthcare|hockey|holdings|holiday|homes|horse|hospital|host|house|idv.tw|immo|immobilien|in|inc|ind.in|industries|info|info.pl|ink|institute|insure|international|investments|io|irish|ist|istanbul|it|jetzt|jewelry|jobs|jp|kaufen|kids|kim|kitchen|kiwi|kr|ky|la|land|lat|law|lawyer|lease|legal|lgbt|life|lighting|limited|limo|live|llc|llp|loan|loans|london|love|ltd|ltda|luxury|maison|makeup|management|market|marketing|mba|me|me.uk|media|melbourne|memorial|men|menu|miami|mobi|moda|moe|money|monster|mortgage|motorcycles|movie|ms|music|mx|nagoya|name|navy|ne.kr|net|net.ag|net.au|net.br|net.bz|net.cn|net.co|net.in|net.ky|net.nz|net.pe|net.ph|net.pl|net.ru|network|news|ninja|nl|no|nom.co|nom.es|nom.pe|nrw|nyc|okinawa|one|onl|online|org|org.ag|org.au|org.cn|org.es|org.in|org.ky|org.nz|org.pe|org.ph|org.pl|org.ru|org.uk|organic|page|paris|partners|parts|party|pe|pet|ph|photography|photos|pictures|pink|pizza|pl|place|plumbing|plus|poker|porn|press|pro|productions|promo|properties|protection|pub|pw|quebec|quest|racing|re.kr|realestate|recipes|red|rehab|reise|reisen|rent|rentals|repair|report|republican|rest|restaurant|review|reviews|rich|rip|rocks|rodeo|rugby|run|ryukyu|sale|salon|sarl|school|schule|science|se|security|services|sex|sg|sh|shiksha|shoes|shop|shopping|show|singles|site|ski|skin|soccer|social|software|solar|solutions|space|storage|store|stream|studio|study|style|supplies|supply|support|surf|surgery|sydney|systems|tax|taxi|team|tech|technology|tel|tennis|theater|theatre|tickets|tienda|tips|tires|today|tokyo|tools|tours|town|toys|trade|trading|training|travel|tube|tv|tw|uk|university|uno|us|vacations|vc|vegas|ventures|vet|viajes|video|villas|vin|vip|vision|vodka|vote|voto|voyage|wales|watch|web|webcam|website|wedding|wiki|win|wine|work|works|world|ws|wtf|xxx|xyz|yachts|yoga|yokohama|zone|移动|dev|com|edu|gov|net|mil|org|nom|sch|caa|res|off|gob|int|tur|ip6|uri|urn|asn|act|nsw|qld|tas|vic|pro|biz|adm|adv|agr|arq|art|ato|bio|bmd|cim|cng|cnt|ecn|eco|emp|eng|esp|etc|eti|far|fnd|fot|fst|g12|ggf|imb|ind|inf|jor|jus|leg|lel|mat|med|mus|not|ntr|odo|ppg|psc|psi|qsl|rec|slg|srv|teo|tmp|trd|vet|zlg|web|ltd|sld|pol|fin|k12|lib|pri|aip|fie|eun|sci|prd|cci|pvt|mod|idv|rel|sex|gen|nic|abr|bas|cal|cam|emr|fvg|laz|lig|lom|mar|mol|pmn|pug|sar|sic|taa|tos|umb|vao|vda|ven|mie|北海道|和歌山|神奈川|鹿児島|ass|rep|tra|per|ngo|soc|grp|plc|its|air|and|bus|can|ddr|jfk|mad|nrw|nyc|ski|spy|tcm|ulm|usa|war|fhs|vgs|dep|eid|fet|fla|flå|gol|hof|hol|sel|vik|cri|iwi|ing|abo|fam|gok|gon|gop|gos|aid|atm|gsm|sos|elk|waw|est|aca|bar|cpa|jur|law|sec|plo|www|bir|cbg|jar|khv|msk|nov|nsk|ptz|rnd|spb|stv|tom|tsk|udm|vrn|cmw|kms|nkz|snz|pub|fhv|red|ens|nat|rns|rnu|bbs|tel|bel|kep|nhs|dni|fed|isa|nsn|gub|e12|tec|орг|обр|упр|alt|nis|jpn|mex|ath|iki|nid|gda|inc|za'.split(
'|'
);

View File

@@ -2,10 +2,13 @@ import Email from '../Email';
import Dictionary from '../Dictionary';
import EmailTemplateType from './EmailTemplateType';
export default interface EmailMessage {
toEmail: Email;
export interface EmailEnvelope {
subject: string;
templateType?: EmailTemplateType;
vars: Dictionary<string>;
body?: string;
}
export default interface EmailMessage extends EmailEnvelope {
toEmail: Email;
}

View File

@@ -1,8 +1,10 @@
import Email from '../Email';
import Port from '../Port';
import Hostname from '../API/Hostname';
import ObjectID from '../ObjectID';
export default interface EmailServer {
id?: ObjectID | undefined; // If this is custom SMTP, this is the ID of the SMTP config. Otherwise, it's undefined
host: Hostname;
port: Port;
username: string;

View File

@@ -17,6 +17,23 @@ enum EmailTemplateType {
StatusPageWelcomeEmail = 'StatusPageWelcomeEmail.hbs',
SubscriberScheduledMaintenanceEventNoteCreated = 'SubscriberScheduledMaintenanceEventNoteCreated.hbs',
SMTPTest = 'SMTPTest.hbs',
MonitorOwnerAdded = 'MonitorOwnerAdded.hbs',
MonitorOwnerResourceCreated = 'MonitorOwnerResourceCreated.hbs',
MonitorOwnerStatusChanged = 'MonitorOwnerStatusChanged.hbs',
IncidentOwnerAdded = 'IncidentOwnerAdded.hbs',
IncidentOwnerStateChanged = 'IncidentOwnerStateChanged.hbs',
IncidentOwnerNotePosted = 'IncidentOwnerNotePosted.hbs',
IncidentOwnerResourceCreated = 'IncidentOwnerResourceCreated.hbs',
ScheduledMaintenanceOwnerNotePosted = 'ScheduledMaintenanceOwnerNotePosted.hbs',
ScheduledMaintenanceOwnerAdded = 'ScheduledMaintenanceOwnerAdded.hbs',
ScheduledMaintenanceOwnerStateChanged = 'ScheduledMaintenanceOwnerStateChanged.hbs',
ScheduledMaintenanceOwnerResourceCreated = 'ScheduledMaintenanceOwnerResourceCreated.hbs',
StatusPageOwnerResourceCreated = 'StatusPageOwnerResourceCreated.hbs',
StatusPageOwnerAdded = 'StatusPageOwnerAdded.hbs',
StatusPageOwnerAnnouncementPosted = 'StatusPageOwnerAnnouncementPosted.hbs',
SimpleMessage = 'SimpleMessage.hbs',
VerificationCode = 'VerificationCode.hbs',
AcknowledgeIncident = 'AcknowledgeIncident.hbs',
}
export default EmailTemplateType;

View File

@@ -1,7 +1,7 @@
import { FindOperator } from 'typeorm';
import DatabaseProperty from '../Database/DatabaseProperty';
import BadDataException from '../Exception/BadDataException';
import { JSONObject } from '../JSON';
import { JSONObject, ObjectType } from '../JSON';
import Typeof from '../Typeof';
import IPType from './IPType';
@@ -73,11 +73,11 @@ export default class IP extends DatabaseProperty {
}
public static override fromJSON(json: JSONObject): IP {
if (json && json['_type'] !== 'IP') {
if (json && json['_type'] !== ObjectType.IP) {
throw new BadDataException('Invalid JSON for IP');
}
if (json && json['value'] && typeof json['value'] === Typeof.String) {
if (json && json['value'] && typeof json['value'] !== Typeof.String) {
throw new BadDataException('Invalid JSON for IP');
}
@@ -87,7 +87,7 @@ export default class IP extends DatabaseProperty {
public override toJSON(): JSONObject {
return {
value: this.toString(),
_type: 'IP',
_type: ObjectType.IP,
};
}

View File

@@ -94,6 +94,14 @@ enum IconProp {
TransparentCube = 'TransparentCube',
Logs = 'Logs',
Bolt = 'Bolt',
BarsArrowUp = 'BarsArrowUp',
BarsArrowDown = 'BarsArrowDown',
Bell = 'Bell',
BellRinging = 'BellRinging',
AdjustmentVertical = 'AdjustmentVertical',
AdjustmentHorizontal = 'AdjustmentHorizontal',
Minus = 'Minus',
MinusSmall = 'MinusSmall',
}
export default IconProp;

View File

@@ -22,6 +22,7 @@ import { BaseEntity } from 'typeorm';
import EqualToOrNull from './Database/EqualToOrNull';
import NotEqual from './Database/NotEqual';
import { CheckOn, FilterType } from './Monitor/CriteriaFilter';
import CallRequest from './Call/CallRequest';
export enum ObjectType {
ObjectID = 'ObjectID',
@@ -37,6 +38,7 @@ export enum ObjectType {
Color = 'Color',
Domain = 'Domain',
Version = 'Version',
IP = 'IP',
Route = 'Route',
URL = 'URL',
Permission = 'Permission',
@@ -121,6 +123,7 @@ export type JSONValue =
| Array<JSONValue>
| Array<Permission>
| Array<JSONValue>
| CallRequest
| undefined
| null;

View File

@@ -159,9 +159,13 @@ export default class JSONFunctions {
}
public static fromJSONObject<T extends BaseModel>(
json: JSONObject,
json: JSONObject | T,
type: { new (): T }
): T {
if (json instanceof BaseModel) {
return json;
}
return this.fromJSON<T>(json, type) as T;
}

View File

@@ -0,0 +1,6 @@
enum MailStatus {
Success = 'Success',
Error = 'Error',
}
export default MailStatus;

View File

@@ -1,6 +1,6 @@
export enum CheckOn {
ResponseTime = 'Response Time (in ms)',
ResponseStatusCode = 'Response Staus Code',
ResponseStatusCode = 'Response Status Code',
ResponseHeader = 'Response Header',
ResponseHeaderValue = 'Response Header Value',
ResponseBody = 'Response Body',

View File

@@ -4,4 +4,7 @@ export interface CriteriaIncident {
title: string;
description: string;
incidentSeverityId?: ObjectID | undefined;
autoResolveIncident?: boolean | undefined;
id: string;
onCallPolicyIds?: Array<ObjectID> | undefined;
}

View File

@@ -117,6 +117,9 @@ export default class MonitorCriteriaInstance extends DatabaseProperty {
title: `${arg.monitorType} monitor is offline`,
description: `${arg.monitorType} monitor is currently offline.`,
incidentSeverityId: arg.incidentSeverityId,
autoResolveIncident: true,
id: ObjectID.generate().toString(),
onCallPolicyIds: [],
},
],
changeMonitorStatus: true,
@@ -151,6 +154,9 @@ export default class MonitorCriteriaInstance extends DatabaseProperty {
title: `${arg.monitorType} monitor is offline`,
description: `${arg.monitorType} monitor is currently offline.`,
incidentSeverityId: arg.incidentSeverityId,
autoResolveIncident: true,
id: ObjectID.generate().toString(),
onCallPolicyIds: [],
},
],
changeMonitorStatus: true,

View File

@@ -10,10 +10,11 @@ import Dictionary from '../Dictionary';
import ObjectID from '../ObjectID';
import MonitorType from './MonitorType';
import JSONFunctions from '../JSONFunctions';
import Hostname from '../API/Hostname';
export interface MonitorStepType {
id: string;
monitorDestination?: URL | IP | undefined;
monitorDestination?: URL | IP | Hostname | undefined;
monitorCriteria: MonitorCriteria;
requestType: HTTPMethod;
requestHeaders?: Dictionary<string> | undefined;
@@ -83,7 +84,9 @@ export default class MonitorStep extends DatabaseProperty {
return this;
}
public setMonitorDestination(monitorDestination: URL | IP): MonitorStep {
public setMonitorDestination(
monitorDestination: URL | IP | Hostname
): MonitorStep {
this.data!.monitorDestination = monitorDestination;
return this;
}
@@ -176,12 +179,13 @@ export default class MonitorStep extends DatabaseProperty {
json = json['value'] as JSONObject;
let monitorDestination: URL | IP | undefined = undefined;
let monitorDestination: URL | IP | Hostname | undefined = undefined;
if (
json &&
json['monitorDestination'] &&
(json['monitorDestination'] as JSONObject)['_type'] === 'URL'
(json['monitorDestination'] as JSONObject)['_type'] ===
ObjectType.URL
) {
monitorDestination = URL.fromJSON(
json['monitorDestination'] as JSONObject
@@ -191,7 +195,19 @@ export default class MonitorStep extends DatabaseProperty {
if (
json &&
json['monitorDestination'] &&
(json['monitorDestination'] as JSONObject)['_type'] === 'IP'
(json['monitorDestination'] as JSONObject)['_type'] ===
ObjectType.Hostname
) {
monitorDestination = Hostname.fromJSON(
json['monitorDestination'] as JSONObject
);
}
if (
json &&
json['monitorDestination'] &&
(json['monitorDestination'] as JSONObject)['_type'] ===
ObjectType.IP
) {
monitorDestination = IP.fromJSON(
json['monitorDestination'] as JSONObject

View File

@@ -0,0 +1,7 @@
enum NoticationRuleType {
ON_CALL_INCIDENT_CREATED = 'When incident is created during on call',
WHEN_USER_GOES_ON_CALL = 'When user goes on call',
WHEN_USER_GOES_OFF_CALL = 'When user goes off call',
}
export default NoticationRuleType;

View File

@@ -0,0 +1,25 @@
enum NotificationSettingEventType {
// Incident
SEND_INCIDENT_CREATED_OWNER_NOTIFICATION = 'Send incident created notification when I am the owner of the incident',
SEND_INCIDENT_NOTE_POSTED_OWNER_NOTIFICATION = 'Send incident note posted notification when I am the owner of the incident',
SEND_INCIDENT_STATE_CHANGED_OWNER_NOTIFICATION = 'Send incident state changed notification when I am the owner of the incident',
SEND_INCIDENT_OWNER_ADDED_NOTIFICATION = 'Send notification when I am added as a owner to the incident',
// Monitors
SEND_MONITOR_OWNER_ADDED_NOTIFICATION = 'Send notification when I am added as a owner to the monitor',
SEND_MONITOR_CREATED_OWNER_NOTIFICATION = 'Send monitor created notification when I am the owner of the monitor',
SEND_MONITOR_STATUS_CHANGED_OWNER_NOTIFICATION = 'Send monitor status changed notification when I am the owner of the monitor',
// Scheduled Maintenance
SEND_SCHEDULED_MAINTENANCE_CREATED_OWNER_NOTIFICATION = 'Send scheduled maintenance created notification when I am the owner of the scheduled maintenance',
SEND_SCHEDULED_MAINTENANCE_NOTE_POSTED_OWNER_NOTIFICATION = 'Send scheduled maintenance note posted notification when I am the owner of the scheduled maintenance',
SEND_SCHEDULED_MAINTENANCE_OWNER_ADDED_NOTIFICATION = 'Send notification when I am added as a owner to the scheduled maintenance',
SEND_SCHEDULED_MAINTENANCE_STATE_CHANGED_OWNER_NOTIFICATION = 'Send scheduled maintenance state changed notification when I am the owner of the scheduled maintenance',
// Status Page
SEND_STATUS_PAGE_ANNOUNCEMENT_CREATED_OWNER_NOTIFICATION = 'Send status page announcement created notification when I am the owner of the status page',
SEND_STATUS_PAGE_CREATED_OWNER_NOTIFICATION = 'Send status page created notification when I am the owner of the status page',
SEND_STATUS_PAGE_OWNER_ADDED_NOTIFICATION = 'Send notification when I am added as a owner to the status page',
}
export default NotificationSettingEventType;

View File

@@ -19,6 +19,10 @@ export default class ObjectID extends DatabaseProperty {
this.id = id;
}
public equals(other: ObjectID): boolean {
return this.id.toString() === other.id.toString();
}
public override toString(): string {
return this.id;
}

View File

@@ -0,0 +1,10 @@
enum OnCallDutyExecutionLogTimelineStatus {
Skipped = 'Skipped',
Started = 'Started',
Executing = 'Executing',
SuccessfullyAcknowledged = 'Successfully Acknowledged',
NotificationSent = 'Notification Sent',
Error = 'Error',
}
export default OnCallDutyExecutionLogTimelineStatus;

View File

@@ -0,0 +1,7 @@
enum OnCallDutyPolicyStatus {
SuccessfullyAcknowledged = 'Successfully Acknowledged',
FailedToAcknowledge = 'Failed to Acknowledge',
Error = 'Error',
}
export default OnCallDutyPolicyStatus;

View File

@@ -0,0 +1,9 @@
enum OnCallDutyPolicyStatus {
Scheduled = 'Scheduled',
Started = 'Started',
Executing = 'Executing',
Completed = 'Execution Completed',
Error = 'Error',
}
export default OnCallDutyPolicyStatus;

View File

@@ -63,6 +63,11 @@ enum Permission {
CanEditMonitorCustomField = 'CanEditMonitorCustomField',
CanReadMonitorCustomField = 'CanReadMonitorCustomField',
CanCreateOnCallDutyPolicyCustomField = 'CanCreateOnCallDutyPolicyCustomField',
CanDeleteOnCallDutyPolicyCustomField = 'CanDeleteOnCallDutyPolicyCustomField',
CanEditOnCallDutyPolicyCustomField = 'CanEditOnCallDutyPolicyCustomField',
CanReadOnCallDutyPolicyCustomField = 'CanReadOnCallDutyPolicyCustomField',
CanCreateScheduledMaintenanceCustomField = 'CanCreateScheduledMaintenanceCustomField',
CanDeleteScheduledMaintenanceCustomField = 'CanDeleteScheduledMaintenanceCustomField',
CanEditScheduledMaintenanceCustomField = 'CanEditScheduledMaintenanceCustomField',
@@ -73,6 +78,50 @@ enum Permission {
CanEditMonitorProbe = 'CanEditMonitorProbe',
CanReadMonitorProbe = 'CanReadMonitorProbe',
CanReadSmsLog = 'CanReadSmsLog',
CanReadEmailLog = 'CanReadEmailLog',
CanReadCallLog = 'CanReadCallLog',
CanCreateIncidentOwnerTeam = 'CanCreateIncidentOwnerTeam',
CanDeleteIncidentOwnerTeam = 'CanDeleteIncidentOwnerTeam',
CanEditIncidentOwnerTeam = 'CanEditIncidentOwnerTeam',
CanReadIncidentOwnerTeam = 'CanReadIncidentOwnerTeam',
CanCreateIncidentOwnerUser = 'CanCreateIncidentOwner',
CanDeleteIncidentOwnerUser = 'CanDeleteIncidentOwnerUser',
CanEditIncidentOwnerUser = 'CanEditIncidentOwnerUser',
CanReadIncidentOwnerUser = 'CanReadIncidentOwnerUser',
CanCreateScheduledMaintenanceOwnerTeam = 'CanCreateScheduledMaintenanceOwnerTeam',
CanDeleteScheduledMaintenanceOwnerTeam = 'CanDeleteScheduledMaintenanceOwnerTeam',
CanEditScheduledMaintenanceOwnerTeam = 'CanEditScheduledMaintenanceOwnerTeam',
CanReadScheduledMaintenanceOwnerTeam = 'CanReadScheduledMaintenanceOwnerTeam',
CanCreateScheduledMaintenanceOwnerUser = 'CanCreateScheduledMaintenanceOwner',
CanDeleteScheduledMaintenanceOwnerUser = 'CanDeleteScheduledMaintenanceOwnerUser',
CanEditScheduledMaintenanceOwnerUser = 'CanEditScheduledMaintenanceOwnerUser',
CanReadScheduledMaintenanceOwnerUser = 'CanReadScheduledMaintenanceOwnerUser',
CanCreateStatusPageOwnerTeam = 'CanCreateStatusPageOwnerTeam',
CanDeleteStatusPageOwnerTeam = 'CanDeleteStatusPageOwnerTeam',
CanEditStatusPageOwnerTeam = 'CanEditStatusPageOwnerTeam',
CanReadStatusPageOwnerTeam = 'CanReadStatusPageOwnerTeam',
CanCreateStatusPageOwnerUser = 'CanCreateStatusPageOwner',
CanDeleteStatusPageOwnerUser = 'CanDeleteStatusPageOwnerUser',
CanEditStatusPageOwnerUser = 'CanEditStatusPageOwnerUser',
CanReadStatusPageOwnerUser = 'CanReadStatusPageOwnerUser',
CanCreateMonitorOwnerTeam = 'CanCreateMonitorOwnerTeam',
CanDeleteMonitorOwnerTeam = 'CanDeleteMonitorOwnerTeam',
CanEditMonitorOwnerTeam = 'CanEditMonitorOwnerTeam',
CanReadMonitorOwnerTeam = 'CanReadMonitorOwnerTeam',
CanCreateMonitorOwnerUser = 'CanCreateMonitorOwner',
CanDeleteMonitorOwnerUser = 'CanDeleteMonitorOwnerUser',
CanEditMonitorOwnerUser = 'CanEditMonitorOwnerUser',
CanReadMonitorOwnerUser = 'CanReadMonitorOwnerUser',
CanCreateStatusPageCustomField = 'CanCreateStatusPageCustomField',
CanDeleteStatusPageCustomField = 'CanDeleteStatusPageCustomField',
CanEditStatusPageCustomField = 'CanEditStatusPageCustomField',
@@ -206,6 +255,12 @@ enum Permission {
CanReadIncidentStateTimeline = 'CanReadIncidentStateTimeline',
CanDeleteIncidentStateTimeline = 'CanDeleteIncidentStateTimeline',
// Incident Status Permissions (Owner + Admin Permission by default)
CanCreateMonitorStatusTimeline = 'CanCreateMonitorStatusTimeline',
CanEditMonitorStatusTimeline = 'CanEditMonitorStatusTimeline',
CanReadMonitorStatusTimeline = 'CanReadMonitorStatusTimeline',
CanDeleteMonitorStatusTimeline = 'CanDeleteMonitorStatusTimeline',
// MonitorStatus Permissions (Owner + Admin Permission by default)
CanCreateProjectMonitorStatus = 'CanCreateProjectMonitorStatus',
CanEditProjectMonitorStatus = 'CanEditProjectMonitorStatus',
@@ -251,10 +306,31 @@ enum Permission {
CanReadProjectStatusPage = 'CanReadProjectStatusPage',
// Resource Permissions (Team Permission)
CanCreateProjectOnCallDuty = 'CanCreateProjectOnCallDuty',
CanEditProjectOnCallDuty = 'CanEditProjectOnCallDuty',
CanDeleteProjectOnCallDuty = 'CanDeleteProjectOnCallDuty',
CanReadProjectOnCallDuty = 'CanReadProjectOnCallDuty',
CanCreateProjectOnCallDutyPolicy = 'CanCreateProjectOnCallDutyPolicy',
CanEditProjectOnCallDutyPolicy = 'CanEditProjectOnCallDutyPolicy',
CanDeleteProjectOnCallDutyPolicy = 'CanDeleteProjectOnCallDutyPolicy',
CanReadProjectOnCallDutyPolicy = 'CanReadProjectOnCallDutyPolicy',
CanReadProjectOnCallDutyPolicyExecutionLogTimeline = 'CanReadProjectOnCallDutyPolicyExecutionLogTimeline',
CanReadProjectOnCallDutyPolicyExecutionLog = 'CanReadProjectOnCallDutyPolicyExecutionLog',
// Resource Permissions (Team Permission)
CanCreateProjectOnCallDutyPolicyEscalationRule = 'CanCreateProjectOnCallDutyPolicyEscalationRule',
CanEditProjectOnCallDutyPolicyEscalationRule = 'CanEditProjectOnCallDutyPolicyEscalationRule',
CanDeleteProjectOnCallDutyPolicyEscalationRule = 'CanDeleteProjectOnCallDutyPolicyEscalationRule',
CanReadProjectOnCallDutyPolicyEscalationRule = 'CanReadProjectOnCallDutyPolicyEscalationRule',
// Resource Permissions (Team Permission)
CanCreateProjectOnCallDutyPolicyEscalationRuleUser = 'CanCreateProjectOnCallDutyPolicyEscalationRuleUser',
CanEditProjectOnCallDutyPolicyEscalationRuleUser = 'CanEditProjectOnCallDutyPolicyEscalationRuleUser',
CanDeleteProjectOnCallDutyPolicyEscalationRuleUser = 'CanDeleteProjectOnCallDutyPolicyEscalationRuleUser',
CanReadProjectOnCallDutyPolicyEscalationRuleUser = 'CanReadProjectOnCallDutyPolicyEscalationRuleUser',
// Resource Permissions (Team Permission)
CanCreateProjectOnCallDutyPolicyEscalationRuleTeam = 'CanCreateProjectOnCallDutyPolicyEscalationRuleTeam',
CanEditProjectOnCallDutyPolicyEscalationRuleTeam = 'CanEditProjectOnCallDutyPolicyEscalationRuleTeam',
CanDeleteProjectOnCallDutyPolicyEscalationRuleTeam = 'CanDeleteProjectOnCallDutyPolicyEscalationRuleTeam',
CanReadProjectOnCallDutyPolicyEscalationRuleTeam = 'CanReadProjectOnCallDutyPolicyEscalationRuleTeam',
// Project SMTP Config (Team Permission)
CanCreateProjectSMTPConfig = 'CanCreateProjectSMTPConfig',
@@ -404,7 +480,7 @@ export class PermissionHelper {
permission: Permission.ProjectOwner,
title: 'Project Owner',
description:
'Owner of this project, manages billing, inviting other admins to this project, and can delete this project.',
'Owner of this project. Manages billing, inviting other admins to this project, and can delete this project.',
isAssignableToTenant: true,
isAccessControlPermission: false,
},
@@ -420,7 +496,14 @@ export class PermissionHelper {
permission: Permission.ProjectAdmin,
title: 'Project Admin',
description:
'Owner of this project, manages billing, inviting other admins to this project, and can delete this project.',
'Admin of this project. Manages team members in this project, however cannot manage billing or delete this project.',
isAssignableToTenant: true,
isAccessControlPermission: false,
},
{
permission: Permission.ProjectUser,
title: 'Project User',
description: 'User of this project.',
isAssignableToTenant: true,
isAccessControlPermission: false,
},
@@ -609,6 +692,39 @@ export class PermissionHelper {
isAccessControlPermission: false,
},
{
permission: Permission.CanCreateMonitorStatusTimeline,
title: 'Can Create Monitor Status Timeline',
description:
'This permission can create Monitor Status history of an incident in this project.',
isAssignableToTenant: true,
isAccessControlPermission: false,
},
{
permission: Permission.CanDeleteMonitorStatusTimeline,
title: 'Can Delete Monitor Status Timeline',
description:
'This permission can delete Monitor Status history of an incident in this project.',
isAssignableToTenant: true,
isAccessControlPermission: false,
},
{
permission: Permission.CanEditMonitorStatusTimeline,
title: 'Can Edit Monitor Status Timeline',
description:
'This permission can edit Monitor Status history of an incident in this project.',
isAssignableToTenant: true,
isAccessControlPermission: false,
},
{
permission: Permission.CanReadMonitorStatusTimeline,
title: 'Can Read Monitor Status Timeline',
description:
'This permission can read Monitor Status history of an incident in this project.',
isAssignableToTenant: true,
isAccessControlPermission: false,
},
{
permission: Permission.CanCreateProjectMonitorStatus,
title: 'Can Create Monitor Status',
@@ -1401,32 +1517,163 @@ export class PermissionHelper {
},
{
permission: Permission.CanCreateProjectOnCallDuty,
title: 'Can Create On-Call Duty',
permission:
Permission.CanReadProjectOnCallDutyPolicyExecutionLogTimeline,
title: 'Can Read On-Call Duty Policy Execution Log Timeline',
description:
'This permission can read teams in on-call duty execution log timeline.',
isAssignableToTenant: true,
isAccessControlPermission: true,
},
{
permission:
Permission.CanReadProjectOnCallDutyPolicyExecutionLog,
title: 'Can Read On-Call Duty Policy Execution Log',
description:
'This permission can read teams in on-call duty execution log.',
isAssignableToTenant: true,
isAccessControlPermission: true,
},
{
permission:
Permission.CanCreateProjectOnCallDutyPolicyEscalationRuleTeam,
title: 'Can Create On-Call Duty Policy Escalation Rule',
description:
'This permission can create teams in on-call duty escalation rule this project.',
isAssignableToTenant: true,
isAccessControlPermission: true,
},
{
permission:
Permission.CanDeleteProjectOnCallDutyPolicyEscalationRuleTeam,
title: 'Can Delete On-Call Duty Policy Escalation Rule Team',
description:
'This permission can delete teams in on-call duty escalation rule of this project.',
isAssignableToTenant: true,
isAccessControlPermission: true,
},
{
permission:
Permission.CanEditProjectOnCallDutyPolicyEscalationRuleTeam,
title: 'Can Edit On-Call Duty Policy Escalation Rule Team',
description:
'This permission can edit teams in on-call duty escalation rule of this project.',
isAssignableToTenant: true,
isAccessControlPermission: true,
},
{
permission:
Permission.CanReadProjectOnCallDutyPolicyEscalationRuleTeam,
title: 'Can Read On-Call Duty Policy Escalation Rule Team',
description:
'This permission can read teams in on-call duty escalation rule of this project.',
isAssignableToTenant: true,
isAccessControlPermission: true,
},
{
permission:
Permission.CanCreateProjectOnCallDutyPolicyEscalationRuleUser,
title: 'Can Create On-Call Duty Policy Escalation Rule User',
description:
'This permission can create on-call duty escalation rule this project.',
isAssignableToTenant: true,
isAccessControlPermission: true,
},
{
permission:
Permission.CanDeleteProjectOnCallDutyPolicyEscalationRuleUser,
title: 'Can Delete On-Call Duty Policy Escalation Rule User',
description:
'This permission can delete on-call duty escalation rule of this project.',
isAssignableToTenant: true,
isAccessControlPermission: true,
},
{
permission:
Permission.CanEditProjectOnCallDutyPolicyEscalationRuleUser,
title: 'Can Edit On-Call Duty Policy Escalation Rule User',
description:
'This permission can edit on-call duty escalation rule of this project.',
isAssignableToTenant: true,
isAccessControlPermission: true,
},
{
permission:
Permission.CanReadProjectOnCallDutyPolicyEscalationRuleUser,
title: 'Can Read On-Call Duty Policy Escalation Rule User',
description:
'This permission can read on-call duty escalation rule of this project.',
isAssignableToTenant: true,
isAccessControlPermission: true,
},
{
permission:
Permission.CanCreateProjectOnCallDutyPolicyEscalationRule,
title: 'Can Create On-Call Duty Policy Escalation Rule',
description:
'This permission can create on-call duty escalation rule this project.',
isAssignableToTenant: true,
isAccessControlPermission: true,
},
{
permission:
Permission.CanDeleteProjectOnCallDutyPolicyEscalationRule,
title: 'Can Delete On-Call Duty Policy Escalation Rule',
description:
'This permission can delete on-call duty escalation rule of this project.',
isAssignableToTenant: true,
isAccessControlPermission: true,
},
{
permission:
Permission.CanEditProjectOnCallDutyPolicyEscalationRule,
title: 'Can Edit On-Call Duty Policy Escalation Rule',
description:
'This permission can edit on-call duty escalation rule of this project.',
isAssignableToTenant: true,
isAccessControlPermission: true,
},
{
permission:
Permission.CanReadProjectOnCallDutyPolicyEscalationRule,
title: 'Can Read On-Call Duty Policy Escalation Rule',
description:
'This permission can read on-call duty escalation rule of this project.',
isAssignableToTenant: true,
isAccessControlPermission: true,
},
{
permission: Permission.CanCreateProjectOnCallDutyPolicy,
title: 'Can Create On-Call Duty Policy',
description:
'This permission can create on-call duty this project.',
isAssignableToTenant: true,
isAccessControlPermission: true,
},
{
permission: Permission.CanDeleteProjectOnCallDuty,
title: 'Can Delete On-Call Duty',
permission: Permission.CanDeleteProjectOnCallDutyPolicy,
title: 'Can Delete On-Call Duty Policy',
description:
'This permission can delete on-call duty of this project.',
isAssignableToTenant: true,
isAccessControlPermission: true,
},
{
permission: Permission.CanEditProjectOnCallDuty,
title: 'Can Edit On-Call Duty',
permission: Permission.CanEditProjectOnCallDutyPolicy,
title: 'Can Edit On-Call Duty Policy',
description:
'This permission can edit on-call duty of this project.',
isAssignableToTenant: true,
isAccessControlPermission: true,
},
{
permission: Permission.CanReadProjectOnCallDuty,
title: 'Can Read On-Call Duty',
permission: Permission.CanReadProjectOnCallDutyPolicy,
title: 'Can Read On-Call Duty Policy',
description:
'This permission can read on-call duty of this project.',
isAssignableToTenant: true,
@@ -1496,6 +1743,39 @@ export class PermissionHelper {
isAccessControlPermission: false,
},
{
permission: Permission.CanCreateOnCallDutyPolicyCustomField,
title: 'Can Create On Call Policy Custom Field',
description:
'This permission can create On Call Policy Custom Field this project.',
isAssignableToTenant: true,
isAccessControlPermission: false,
},
{
permission: Permission.CanDeleteOnCallDutyPolicyCustomField,
title: 'Can Delete On Call Policy Custom Field',
description:
'This permission can delete On Call Policy Custom Field of this project.',
isAssignableToTenant: true,
isAccessControlPermission: false,
},
{
permission: Permission.CanEditOnCallDutyPolicyCustomField,
title: 'Can Edit On Call Policy Custom Field',
description:
'This permission can edit On Call Policy Custom Field of this project.',
isAssignableToTenant: true,
isAccessControlPermission: false,
},
{
permission: Permission.CanReadOnCallDutyPolicyCustomField,
title: 'Can Read On Call Policy Custom Field',
description:
'This permission can read On Call Policy Custom Field of this project.',
isAssignableToTenant: true,
isAccessControlPermission: false,
},
{
permission: Permission.CanCreateMonitorCustomField,
title: 'Can Create Monitor Custom Field',
@@ -1628,6 +1908,24 @@ export class PermissionHelper {
isAccessControlPermission: false,
},
{
permission: Permission.CanReadSmsLog,
title: 'Can Read SMS Log',
description:
'This permission can read SMS Log of this project.',
isAssignableToTenant: true,
isAccessControlPermission: false,
},
{
permission: Permission.CanReadCallLog,
title: 'Can Read Call Log',
description:
'This permission can read Call Logs of this project.',
isAssignableToTenant: true,
isAccessControlPermission: false,
},
{
permission: Permission.CanCreateMonitorProbe,
title: 'Can Create Monitor Probe',
@@ -1661,6 +1959,270 @@ export class PermissionHelper {
isAccessControlPermission: false,
},
{
permission: Permission.CanCreateScheduledMaintenanceOwnerTeam,
title: 'Can Create Scheduled Maintenance Team Owner',
description:
'This permission can create Scheduled Maintenance Team Owner this project.',
isAssignableToTenant: true,
isAccessControlPermission: false,
},
{
permission: Permission.CanDeleteScheduledMaintenanceOwnerTeam,
title: 'Can Delete Scheduled Maintenance Team Owner',
description:
'This permission can delete Scheduled Maintenance Team Owner of this project.',
isAssignableToTenant: true,
isAccessControlPermission: false,
},
{
permission: Permission.CanEditScheduledMaintenanceOwnerTeam,
title: 'Can Edit Scheduled Maintenance Team Owner',
description:
'This permission can edit Scheduled Maintenance Team Owner of this project.',
isAssignableToTenant: true,
isAccessControlPermission: false,
},
{
permission: Permission.CanReadScheduledMaintenanceOwnerTeam,
title: 'Can Read Scheduled Maintenance Team Owner',
description:
'This permission can read Scheduled Maintenance Team Owner of this project.',
isAssignableToTenant: true,
isAccessControlPermission: false,
},
{
permission: Permission.CanCreateScheduledMaintenanceOwnerUser,
title: 'Can Create Scheduled Maintenance User Owner',
description:
'This permission can create Scheduled Maintenance User Owner this project.',
isAssignableToTenant: true,
isAccessControlPermission: false,
},
{
permission: Permission.CanDeleteScheduledMaintenanceOwnerUser,
title: 'Can Delete Scheduled Maintenance User Owner',
description:
'This permission can delete Scheduled Maintenance User Owner of this project.',
isAssignableToTenant: true,
isAccessControlPermission: false,
},
{
permission: Permission.CanEditScheduledMaintenanceOwnerUser,
title: 'Can Edit Scheduled Maintenance User Owner',
description:
'This permission can edit Scheduled Maintenance User Owner of this project.',
isAssignableToTenant: true,
isAccessControlPermission: false,
},
{
permission: Permission.CanReadScheduledMaintenanceOwnerUser,
title: 'Can Read Scheduled Maintenance User Owner',
description:
'This permission can read Scheduled Maintenance User Owner of this project.',
isAssignableToTenant: true,
isAccessControlPermission: false,
},
{
permission: Permission.CanCreateIncidentOwnerTeam,
title: 'Can Create Incident Team Owner',
description:
'This permission can create Incident Team Owner this project.',
isAssignableToTenant: true,
isAccessControlPermission: false,
},
{
permission: Permission.CanDeleteIncidentOwnerTeam,
title: 'Can Delete Incident Team Owner',
description:
'This permission can delete Incident Team Owner of this project.',
isAssignableToTenant: true,
isAccessControlPermission: false,
},
{
permission: Permission.CanEditIncidentOwnerTeam,
title: 'Can Edit Incident Team Owner',
description:
'This permission can edit Incident Team Owner of this project.',
isAssignableToTenant: true,
isAccessControlPermission: false,
},
{
permission: Permission.CanReadIncidentOwnerTeam,
title: 'Can Read Incident Team Owner',
description:
'This permission can read Incident Team Owner of this project.',
isAssignableToTenant: true,
isAccessControlPermission: false,
},
{
permission: Permission.CanCreateIncidentOwnerUser,
title: 'Can Create Incident User Owner',
description:
'This permission can create Incident User Owner this project.',
isAssignableToTenant: true,
isAccessControlPermission: false,
},
{
permission: Permission.CanDeleteIncidentOwnerUser,
title: 'Can Delete Incident User Owner',
description:
'This permission can delete Incident User Owner of this project.',
isAssignableToTenant: true,
isAccessControlPermission: false,
},
{
permission: Permission.CanEditIncidentOwnerUser,
title: 'Can Edit Incident User Owner',
description:
'This permission can edit Incident User Owner of this project.',
isAssignableToTenant: true,
isAccessControlPermission: false,
},
{
permission: Permission.CanReadIncidentOwnerUser,
title: 'Can Read Incident User Owner',
description:
'This permission can read Incident User Owner of this project.',
isAssignableToTenant: true,
isAccessControlPermission: false,
},
{
permission: Permission.CanCreateStatusPageOwnerTeam,
title: 'Can Create Status Page Team Owner',
description:
'This permission can create Status Page Team Owner this project.',
isAssignableToTenant: true,
isAccessControlPermission: false,
},
{
permission: Permission.CanDeleteStatusPageOwnerTeam,
title: 'Can Delete Status Page Team Owner',
description:
'This permission can delete Status Page Team Owner of this project.',
isAssignableToTenant: true,
isAccessControlPermission: false,
},
{
permission: Permission.CanEditStatusPageOwnerTeam,
title: 'Can Edit Status Page Team Owner',
description:
'This permission can edit Status Page Team Owner of this project.',
isAssignableToTenant: true,
isAccessControlPermission: false,
},
{
permission: Permission.CanReadStatusPageOwnerTeam,
title: 'Can Read Status Page Team Owner',
description:
'This permission can read Status Page Team Owner of this project.',
isAssignableToTenant: true,
isAccessControlPermission: false,
},
{
permission: Permission.CanCreateStatusPageOwnerUser,
title: 'Can Create Status Page User Owner',
description:
'This permission can create Status Page User Owner this project.',
isAssignableToTenant: true,
isAccessControlPermission: false,
},
{
permission: Permission.CanDeleteStatusPageOwnerUser,
title: 'Can Delete Status Page User Owner',
description:
'This permission can delete Status Page User Owner of this project.',
isAssignableToTenant: true,
isAccessControlPermission: false,
},
{
permission: Permission.CanEditStatusPageOwnerUser,
title: 'Can Edit Status Page User Owner',
description:
'This permission can edit Status Page User Owner of this project.',
isAssignableToTenant: true,
isAccessControlPermission: false,
},
{
permission: Permission.CanReadStatusPageOwnerUser,
title: 'Can Read Status Page User Owner',
description:
'This permission can read Status Page User Owner of this project.',
isAssignableToTenant: true,
isAccessControlPermission: false,
},
{
permission: Permission.CanCreateMonitorOwnerTeam,
title: 'Can Create Monitor Team Owner',
description:
'This permission can create Monitor Team Owner this project.',
isAssignableToTenant: true,
isAccessControlPermission: false,
},
{
permission: Permission.CanDeleteMonitorOwnerTeam,
title: 'Can Delete Monitor Team Owner',
description:
'This permission can delete Monitor Team Owner of this project.',
isAssignableToTenant: true,
isAccessControlPermission: false,
},
{
permission: Permission.CanEditMonitorOwnerTeam,
title: 'Can Edit Monitor Team Owner',
description:
'This permission can edit Monitor Team Owner of this project.',
isAssignableToTenant: true,
isAccessControlPermission: false,
},
{
permission: Permission.CanReadMonitorOwnerTeam,
title: 'Can Read Monitor Team Owner',
description:
'This permission can read Monitor Team Owner of this project.',
isAssignableToTenant: true,
isAccessControlPermission: false,
},
{
permission: Permission.CanCreateMonitorOwnerUser,
title: 'Can Create Monitor User Owner',
description:
'This permission can create Monitor User Owner this project.',
isAssignableToTenant: true,
isAccessControlPermission: false,
},
{
permission: Permission.CanDeleteMonitorOwnerUser,
title: 'Can Delete Monitor User Owner',
description:
'This permission can delete Monitor User Owner of this project.',
isAssignableToTenant: true,
isAccessControlPermission: false,
},
{
permission: Permission.CanEditMonitorOwnerUser,
title: 'Can Edit Monitor User Owner',
description:
'This permission can edit Monitor User Owner of this project.',
isAssignableToTenant: true,
isAccessControlPermission: false,
},
{
permission: Permission.CanReadMonitorOwnerUser,
title: 'Can Read Monitor User Owner',
description:
'This permission can read Monitor User Owner of this project.',
isAssignableToTenant: true,
isAccessControlPermission: false,
},
{
permission: Permission.CanCreateProjectIncident,
title: 'Can Create Incident',

View File

@@ -19,7 +19,7 @@ export default class Phone extends DatabaseProperty {
* }
*/
const re: RegExp =
/^[+]?[(]?[0-9]{3}[)]?[-\s.]?[0-9]{3}[-\s.]?[0-9]{4,6}$/; // regex for international phone numbers format based on (ITU-T E.123)
/^[+]?[(]?[0-9]{3}[)]?[-\s.]?[0-9]{3}[-\s.]?[0-9]{4,7}$/; // regex for international phone numbers format based on (ITU-T E.123)
const isValid: boolean = re.test(v);
if (!isValid) {
throw new BadDataException(`Phone is not in valid format: ${v}`);

View File

@@ -5,4 +5,5 @@ export default interface ProbeApiIngestResponse {
ingestedMonitorStepId?: ObjectID | undefined;
nextMonitorStepId?: ObjectID | undefined;
criteriaMetId?: string | undefined;
rootCause: string | null;
}

View File

@@ -10,4 +10,5 @@ export default interface ProbeMonitorResponse {
responseBody?: string | JSONObject | undefined;
monitorStepId: ObjectID;
monitorId: ObjectID;
probeId: ObjectID;
}

9
Common/Types/SMS/SMS.ts Normal file
View File

@@ -0,0 +1,9 @@
import Phone from '../Phone';
export interface SMSMessage {
message: string;
}
export default interface SMS extends SMSMessage {
to: Phone;
}

View File

@@ -26,9 +26,11 @@ import HashedString from './HashedString';
import InBetween from './Database/InBetween';
import NotNull from './Database/NotNull';
import IsNull from './Database/IsNull';
import OneUptimeDate from './Date';
const SerializableObjectDictionary: Dictionary<any> = {
[ObjectType.Phone]: Phone,
[ObjectType.DateTime]: OneUptimeDate,
[ObjectType.ObjectID]: ObjectID,
[ObjectType.Name]: Name,
[ObjectType.EqualToOrNull]: EqualToOrNull,

View File

@@ -0,0 +1,7 @@
enum SmsStatus {
Success = 'Success',
Error = 'Error',
LowBalance = 'Low Balance',
}
export default SmsStatus;

View File

@@ -16,6 +16,22 @@ export default class Text {
return result;
}
public static generateRandomNumber(length?: number): string {
if (!length) {
length = 10;
}
let result: string = '';
const characters: string = '12134567890';
const charactersLength: number = characters.length;
for (let i: number = 0; i < length; i++) {
result += characters.charAt(
Math.floor(Math.random() * charactersLength)
);
}
return result;
}
public static convertNumberToWords(num: number): string {
const words: Array<string> = [
'first',

View File

@@ -0,0 +1,5 @@
enum UserNotificationEventType {
IncidentCreated = 'Incident Created',
}
export default UserNotificationEventType;

View File

@@ -0,0 +1,9 @@
enum UserNotificationExecutionStatus {
Scheduled = 'Scheduled',
Started = 'Strated',
Executing = 'Executing',
Completed = 'Completed',
Error = 'Error',
}
export default UserNotificationExecutionStatus;

View File

@@ -0,0 +1,9 @@
enum UserNotificationStatus {
Sent = 'Sent',
Acknowledged = 'Acknowledged',
Error = 'Error',
Sending = 'Sending',
Skipped = 'Skipped',
}
export default UserNotificationStatus;

View File

@@ -1,7 +1,8 @@
import axios, { AxiosResponse } from 'axios';
import axios, { AxiosRequestConfig, AxiosResponse } from 'axios';
import Headers from './API/Headers';
import URL from './API/URL';
import HTML from './Html';
import HTTPMethod from './API/HTTPMethod';
export interface WebsiteResponse {
url: URL;
@@ -13,18 +14,32 @@ export interface WebsiteResponse {
}
export default class WebsiteRequest {
public static async get(
public static async fetch(
url: URL,
options: {
headers?: Headers | undefined;
timeout?: number | undefined;
isHeadRequest?: boolean | undefined;
}
): Promise<WebsiteResponse> {
// use axios to fetch an HTML page
const response: AxiosResponse = await axios.get(url.toString(), {
headers: options.headers || {},
const axiosOptions: AxiosRequestConfig = {
timeout: options.timeout || 5000,
});
method: HTTPMethod.GET,
};
if (options.headers) {
axiosOptions.headers = options.headers;
}
if (options.isHeadRequest) {
axiosOptions.method = HTTPMethod.HEAD;
}
// use axios to fetch an HTML page
const response: AxiosResponse = await axios(
url.toString(),
axiosOptions
);
// return the response
return {

View File

@@ -18,6 +18,7 @@ export enum ComponentInputType {
Email = 'Email',
CronTab = 'CronTab',
Query = 'Database Query',
Select = 'Database Select',
BaseModel = 'Database Record',
BaseModelArray = 'Database Records',
JSONArray = 'List of JSON',

View File

@@ -33,7 +33,7 @@ export default class BaseModelComponent {
placeholder: 'Example: {"columnName": "value", ...}',
},
{
type: ComponentInputType.Query,
type: ComponentInputType.Select,
name: 'Select Fields',
description: `Select on ${model.singularName}`,
required: true,
@@ -92,7 +92,7 @@ export default class BaseModelComponent {
placeholder: 'Example: {"columnName": "value", ...}',
},
{
type: ComponentInputType.Query,
type: ComponentInputType.Select,
name: 'Select Fields',
description: `Select on ${model.singularName}`,
required: true,
@@ -160,7 +160,7 @@ export default class BaseModelComponent {
arguments: [],
returnValues: [
{
id: 'data',
id: 'model',
name: `${model.singularName}`,
description: `${model.singularName} deleted in the database`,
type: ComponentInputType.BaseModel,
@@ -288,10 +288,19 @@ export default class BaseModelComponent {
iconProp: IconProp.Bolt,
tableName: model.tableName!,
componentType: ComponentType.Trigger,
arguments: [],
arguments: [
{
type: ComponentInputType.Select,
name: 'Select Fields',
description: `Select on ${model.singularName}`,
required: true,
id: 'select',
placeholder: 'Example: {"columnName": true, ...}',
},
],
returnValues: [
{
id: 'data',
id: 'model',
name: `${model.singularName}`,
description: `${model.singularName} created in the database`,
type: ComponentInputType.BaseModel,
@@ -422,10 +431,19 @@ export default class BaseModelComponent {
iconProp: IconProp.Bolt,
tableName: model.tableName!,
componentType: ComponentType.Trigger,
arguments: [],
arguments: [
{
type: ComponentInputType.Select,
name: 'Select Fields',
description: `Select on ${model.singularName}`,
required: true,
id: 'select',
placeholder: 'Example: {"columnName": true, ...}',
},
],
returnValues: [
{
id: 'data',
id: 'model',
name: `${model.singularName}`,
description: `Updated ${model.singularName}`,
type: ComponentInputType.BaseModel,

View File

@@ -88,6 +88,24 @@ export default class API {
);
}
public async head<
T extends JSONObject | JSONArray | BaseModel | Array<BaseModel>
>(
path: Route,
data?: JSONObject | JSONArray,
headers?: Headers
): Promise<HTTPResponse<T> | HTTPErrorResponse> {
return await API.head<T>(
new URL(
this.protocol,
this.hostname,
this.baseRoute.addRoute(path)
),
data,
headers
);
}
public async put<
T extends JSONObject | JSONArray | BaseModel | Array<BaseModel>
>(
@@ -179,6 +197,16 @@ export default class API {
return await this.fetch(HTTPMethod.DELETE, url, data, headers);
}
public static async head<
T extends JSONObject | JSONArray | BaseModel | Array<BaseModel>
>(
url: URL,
data?: JSONObject | JSONArray,
headers?: Headers
): Promise<HTTPResponse<T> | HTTPErrorResponse> {
return await this.fetch(HTTPMethod.HEAD, url, data, headers);
}
public static async put<
T extends JSONObject | JSONArray | BaseModel | Array<BaseModel>
>(

View File

@@ -3,3 +3,4 @@ export const EVERY_DAY: string = '0 8 * * *';
export const EVERY_HOUR: string = '1 * * * *';
export const EVERY_FIVE_MINUTE: string = '*/5 * * * *';
export const EVERY_FIVE_SECONDS: string = '*/5 * * * * *';
export const EVERY_WEEK: string = '0 0 * * 0';

View File

@@ -919,14 +919,6 @@
"@jridgewell/sourcemap-codec": "1.4.14"
}
},
"node_modules/@sentry/types": {
"version": "7.22.0",
"resolved": "https://registry.npmjs.org/@sentry/types/-/types-7.22.0.tgz",
"integrity": "sha512-LhCL+wb1Jch+OesB2CIt6xpfO1Ab6CRvoNYRRzVumWPLns1T3ZJkarYfhbLaOEIb38EIbPgREdxn2AJT560U4Q==",
"engines": {
"node": ">=8"
}
},
"node_modules/@sinonjs/commons": {
"version": "1.8.6",
"resolved": "https://registry.npmjs.org/@sinonjs/commons/-/commons-1.8.6.tgz",
@@ -3589,11 +3581,10 @@
}
},
"node_modules/posthog-js": {
"version": "1.38.1",
"resolved": "https://registry.npmjs.org/posthog-js/-/posthog-js-1.38.1.tgz",
"integrity": "sha512-9YK+QPnilKkDOq3G2hMsHfzu3c30pOIQUzg239u1GHm4BuOBCYtyUwSW5D5zUeEyXz6w3BcA+GkeTw0k+Nttog==",
"version": "1.57.2",
"resolved": "https://registry.npmjs.org/posthog-js/-/posthog-js-1.57.2.tgz",
"integrity": "sha512-ER4gkYZasrd2Zwmt/yLeZ5G/nZJ6tpaYBCpx3CvocDx+3F16WdawJlYMT0IyLKHXDniC5+AsjzFd6fi8uyYlJA==",
"dependencies": {
"@sentry/types": "7.22.0",
"fflate": "^0.4.1",
"rrweb-snapshot": "^1.1.14"
}
@@ -4104,9 +4095,9 @@
}
},
"node_modules/tough-cookie": {
"version": "4.1.2",
"resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-4.1.2.tgz",
"integrity": "sha512-G9fqXWoYFZgTc2z8Q5zaHy/vJMjm+WV0AkAeHxVCQiEB1b+dGvWzFW6QV07cY5jQ5gRkeid2qIkzkxUnmoQZUQ==",
"version": "4.1.3",
"resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-4.1.3.tgz",
"integrity": "sha512-aX/y5pVRkfRnfmuX+OdbSdXvPe6ieKX/G2s7e98f4poJHnqH3281gDPm/metm6E/WRamfx7WC4HUqkWHfQHprw==",
"dev": true,
"dependencies": {
"psl": "^1.1.33",
@@ -4597,9 +4588,9 @@
}
},
"node_modules/word-wrap": {
"version": "1.2.3",
"resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.3.tgz",
"integrity": "sha512-Hz/mrNwitNRh/HUAtM/VT/5VH+ygD6DV7mYKZAtHOrbs8U7lvPS6xf7EJKMF0uW1KJCl0H701g3ZGus+muE5vQ==",
"version": "1.2.4",
"resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.4.tgz",
"integrity": "sha512-2V81OA4ugVo5pRo46hAoD2ivUJx8jXmWXfUkY4KFNw0hEptvN0QfH3K4nHiwzGeKl5rFKedV48QVoqYavy4YpA==",
"dev": true,
"engines": {
"node": ">=0.10.0"
@@ -5391,11 +5382,6 @@
"@jridgewell/sourcemap-codec": "1.4.14"
}
},
"@sentry/types": {
"version": "7.22.0",
"resolved": "https://registry.npmjs.org/@sentry/types/-/types-7.22.0.tgz",
"integrity": "sha512-LhCL+wb1Jch+OesB2CIt6xpfO1Ab6CRvoNYRRzVumWPLns1T3ZJkarYfhbLaOEIb38EIbPgREdxn2AJT560U4Q=="
},
"@sinonjs/commons": {
"version": "1.8.6",
"resolved": "https://registry.npmjs.org/@sinonjs/commons/-/commons-1.8.6.tgz",
@@ -7409,11 +7395,10 @@
}
},
"posthog-js": {
"version": "1.38.1",
"resolved": "https://registry.npmjs.org/posthog-js/-/posthog-js-1.38.1.tgz",
"integrity": "sha512-9YK+QPnilKkDOq3G2hMsHfzu3c30pOIQUzg239u1GHm4BuOBCYtyUwSW5D5zUeEyXz6w3BcA+GkeTw0k+Nttog==",
"version": "1.57.2",
"resolved": "https://registry.npmjs.org/posthog-js/-/posthog-js-1.57.2.tgz",
"integrity": "sha512-ER4gkYZasrd2Zwmt/yLeZ5G/nZJ6tpaYBCpx3CvocDx+3F16WdawJlYMT0IyLKHXDniC5+AsjzFd6fi8uyYlJA==",
"requires": {
"@sentry/types": "7.22.0",
"fflate": "^0.4.1",
"rrweb-snapshot": "^1.1.14"
}
@@ -7789,9 +7774,9 @@
}
},
"tough-cookie": {
"version": "4.1.2",
"resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-4.1.2.tgz",
"integrity": "sha512-G9fqXWoYFZgTc2z8Q5zaHy/vJMjm+WV0AkAeHxVCQiEB1b+dGvWzFW6QV07cY5jQ5gRkeid2qIkzkxUnmoQZUQ==",
"version": "4.1.3",
"resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-4.1.3.tgz",
"integrity": "sha512-aX/y5pVRkfRnfmuX+OdbSdXvPe6ieKX/G2s7e98f4poJHnqH3281gDPm/metm6E/WRamfx7WC4HUqkWHfQHprw==",
"dev": true,
"requires": {
"psl": "^1.1.33",
@@ -8082,9 +8067,9 @@
}
},
"word-wrap": {
"version": "1.2.3",
"resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.3.tgz",
"integrity": "sha512-Hz/mrNwitNRh/HUAtM/VT/5VH+ygD6DV7mYKZAtHOrbs8U7lvPS6xf7EJKMF0uW1KJCl0H701g3ZGus+muE5vQ==",
"version": "1.2.4",
"resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.4.tgz",
"integrity": "sha512-2V81OA4ugVo5pRo46hAoD2ivUJx8jXmWXfUkY4KFNw0hEptvN0QfH3K4nHiwzGeKl5rFKedV48QVoqYavy4YpA==",
"dev": true
},
"wrap-ansi": {

View File

@@ -1,52 +0,0 @@
ONEUPTIME_SECRET={{ .Env.ONEUPTIME_SECRET }}
DATABASE_PORT={{ .Env.DATABASE_PORT }}
DATABASE_USERNAME={{ .Env.DATABASE_USERNAME }}
DATABASE_PASSWORD={{ .Env.DATABASE_PASSWORD }}
DATABASE_NAME={{ .Env.DATABASE_NAME }}
DATABASE_HOST={{ .Env.DATABASE_HOST }}
REDIS_PASSWORD={{ .Env.REDIS_PASSWORD }}
REDIS_HOST={{ .Env.REDIS_HOST }}
REDIS_PORT={{ .Env.REDIS_PORT }}
ENCRYPTION_SECRET={{ .Env.ENCRYPTION_SECRET }}
DISABLE_SIGNUP={{ .Env.DISABLE_SIGNUP }}
REALTIME_HOSTNAME={{ .Env.REALTIME_HOSTNAME }}
MAIL_HOSTNAME={{ .Env.MAIL_HOSTNAME }}
DASHBOARD_HOSTNAME=d{{ .Env.DASHBOARD_HOSTNAME }}
DASHBOARD_API_HOSTNAME={{ .Env.DASHBOARD_API_HOSTNAME }}
PROBE_API_HOSTNAME={{ .Env.DATA_INGESTOR_HOSTNAME }}
DATA_INGESTOR_HOSTNAME={{ .Env.DATA_INGESTOR_HOSTNAME }}
ACCOUNTS_HOSTNAME={{ .Env.ACCOUNTS_HOSTNAME }}
HOME_HOSTNAME={{ .Env.HOME_HOSTNAME }}
WORKER_HOSTNAME={{ .Env.WORKER_HOSTNAME }}
WORKFLOW_HOSTNAME={{ .Env.WORKFLOW_HOSTNAME }}
BILLING_PRIVATE_KEY={{ .Env.BILLING_PRIVATE_KEY }}
BILLING_PUBLIC_KEY={{ .Env.BILLING_PUBLIC_KEY }}
BILLING_ENABLED={{ .Env.BILLING_ENABLED }}
DOMAIN={{ .Env.DOMAIN }}
HTTP_PROTOCOL={{ .Env.HTTP_PROTOCOL }}
REALTIME_ROUTE={{ .Env.REALTIME_ROUTE }}
MAIL_ROUTE={{ .Env.MAIL_ROUTE }}
DASHBOARD_ROUTE={{ .Env.DASHBOARD_ROUTE }}
DASHBOARD_API_ROUTE={{ .Env.DASHBOARD_API_ROUTE }}
PROBE_API_ROUTE={{ .Env.PROBE_API_ROUTE }}
DATA_INGESTOR_ROUTE={{ .Env.DATA_INGESTOR_ROUTE }}
ACCOUNTS_ROUTE={{ .Env.ACCOUNTS_ROUTE }}
HOME_ROUTE={{ .Env.HOME_ROUTE }}
HELMCHARTS_ROUTE={{ .Env.HELMCHARTS_ROUTE }}
API_REFERENCE_ROUTE={{ .Env.API_REFERENCE_ROUTE }}
IDENTITY_ROUTE={{ .Env.IDENTITY_ROUTE }}
FILE_ROUTE={{ .Env.FILE_ROUTE }}
WORKFLOW_ROUTE={{ .Env.WORKFLOW_ROUTE }}
STATUS_PAGE_ROUTE={{ .Env.STATUS_PAGE_ROUTE }}
IS_SERVER=true
ANALYTICS_KEY={{ .Env.ANALYTICS_KEY }}
ANALYTICS_HOST={{ .Env.ANALYTICS_HOST }}

View File

@@ -20,7 +20,6 @@ import Query from '../Types/Database/Query';
import Select from '../Types/Database/Select';
import Sort from '../Types/Database/Sort';
import { LIMIT_PER_PROJECT } from 'Common/Types/Database/LimitMax';
import Populate from '../Types/Database/Populate';
import PartialEntity from 'Common/Types/Database/PartialEntity';
import { UserPermission } from 'Common/Types/Permission';
import { IsBillingEnabled } from '../Config';
@@ -287,7 +286,6 @@ export default class BaseAPI<
let query: Query<BaseModel> = {};
let select: Select<BaseModel> = {};
let populate: Populate<BaseModel> = {};
let sort: Sort<BaseModel> = {};
if (req.body) {
@@ -299,12 +297,6 @@ export default class BaseAPI<
req.body['select']
) as Select<BaseModel>;
if (req.body['populate']) {
populate = JSONFunctions.deserialize(
req.body['populate']
) as Populate<BaseModel>;
}
sort = JSONFunctions.deserialize(
req.body['sort']
) as Sort<BaseModel>;
@@ -319,7 +311,6 @@ export default class BaseAPI<
skip: skip,
limit: limit,
sort: sort,
populate,
props: databaseProps,
});
@@ -371,24 +362,16 @@ export default class BaseAPI<
const objectId: ObjectID = new ObjectID(req.params['id'] as string);
await this.onBeforeGet(req, res);
let select: Select<BaseModel> = {};
let populate: Populate<BaseModel> = {};
if (req.body) {
select = JSONFunctions.deserialize(
req.body['select']
) as Select<BaseModel>;
if (req.body['populate']) {
populate = JSONFunctions.deserialize(
req.body['populate']
) as Populate<BaseModel>;
}
}
const item: BaseModel | null = await this.service.findOneById({
id: objectId,
select,
populate,
props: await this.getDatabaseCommonInteractionProps(req),
});

View File

@@ -0,0 +1,118 @@
import Express, {
ExpressRequest,
ExpressResponse,
ExpressRouter,
OneUptimeRequest,
} from '../Utils/Express';
import UserMiddleware from '../Middleware/UserAuthorization';
import BadDataException from 'Common/Types/Exception/BadDataException';
import Response from '../Utils/Response';
import NotificationService from '../Services/NotificationService';
import ObjectID from 'Common/Types/ObjectID';
import JSONFunctions from 'Common/Types/JSONFunctions';
import Permission, { UserPermission } from 'Common/Types/Permission';
import Exception from 'Common/Types/Exception/Exception';
import PositiveNumber from 'Common/Types/PositiveNumber';
const router: ExpressRouter = Express.getRouter();
router.post(
'/notification/recharge',
UserMiddleware.getUserMiddleware,
async (req: ExpressRequest, res: ExpressResponse) => {
try {
let amount: number | PositiveNumber =
JSONFunctions.deserializeValue(req.body.amount) as
| number
| PositiveNumber;
if (amount instanceof PositiveNumber) {
amount = amount.toNumber();
}
if (typeof amount === 'string') {
amount = parseInt(amount);
}
const projectId: ObjectID = JSONFunctions.deserializeValue(
req.body.projectId
) as ObjectID;
if (!amount || typeof amount !== 'number') {
return Response.sendErrorResponse(
req,
res,
new BadDataException('Invalid amount')
);
}
if (amount > 1000) {
return Response.sendErrorResponse(
req,
res,
new BadDataException('Amount cannot be greater than 1000')
);
}
if (amount < 20) {
return Response.sendErrorResponse(
req,
res,
new BadDataException('Amount cannot be less than 20')
);
}
if (!projectId || !projectId.toString()) {
return Response.sendErrorResponse(
req,
res,
new BadDataException('Invalid projectId')
);
}
// get permissions. if user has permission to recharge, then recharge
if (
!(req as OneUptimeRequest).userTenantAccessPermission ||
!(req as OneUptimeRequest).userTenantAccessPermission![
projectId.toString()
]
) {
return Response.sendErrorResponse(
req,
res,
new BadDataException('Permission for this user not found')
);
}
const permissions: Array<Permission> = (
req as OneUptimeRequest
).userTenantAccessPermission![
projectId.toString()
]!.permissions.map((permission: UserPermission) => {
return permission.permission;
});
if (
permissions.includes(Permission.ProjectOwner) ||
permissions.includes(Permission.CanManageProjectBilling)
) {
await NotificationService.rechargeBalance(projectId, amount);
} else {
return Response.sendErrorResponse(
req,
res,
new BadDataException(
'User does not have permission to recharge. You need any one of these permissions - ProjectOwner, CanManageProjectBilling'
)
);
}
} catch (err: any) {
return Response.sendErrorResponse(req, res, err as Exception);
}
return Response.sendEmptyResponse(req, res);
}
);
export default router;

View File

@@ -4,7 +4,6 @@ import UserMiddleware from '../Middleware/UserAuthorization';
import StatusPageService, {
Service as StatusPageServiceType,
} from '../Services/StatusPageService';
import Populate from '../Types/Database/Populate';
import Select from '../Types/Database/Select';
import {
ExpressRequest,
@@ -61,6 +60,7 @@ import StatusPageSubscriberService from '../Services/StatusPageSubscriberService
import PositiveNumber from 'Common/Types/PositiveNumber';
import StatusPageSsoService from '../Services/StatusPageSsoService';
import StatusPageSSO from 'Model/Models/StatusPageSso';
import ArrayUtil from 'Common/Types/ArrayUtil';
export default class StatusPageAPI extends BaseAPI<
StatusPage,
@@ -228,6 +228,24 @@ export default class StatusPageAPI extends BaseAPI<
enableSubscribers: true,
isPublicStatusPage: true,
requireSsoForLogin: true,
coverImageFile: {
file: true,
_id: true,
type: true,
name: true,
},
faviconFile: {
file: true,
_id: true,
type: true,
name: true,
},
logoFile: {
file: true,
_id: true,
type: true,
name: true,
},
};
const hasEnabledSSO: PositiveNumber =
@@ -241,32 +259,10 @@ export default class StatusPageAPI extends BaseAPI<
},
});
const populate: Populate<StatusPage> = {
coverImageFile: {
file: true as any,
_id: true,
type: true,
name: true,
} as any,
faviconFile: {
file: true as any,
_id: true,
type: true,
name: true,
} as any,
logoFile: {
file: true as any,
_id: true,
type: true,
name: true,
} as any,
};
const item: StatusPage | null =
await this.service.findOneById({
id: objectId,
select,
populate,
props: {
isRoot: true,
},
@@ -286,7 +282,6 @@ export default class StatusPageAPI extends BaseAPI<
link: true,
title: true,
},
populate: {},
limit: LIMIT_PER_PROJECT,
skip: 0,
props: {
@@ -414,6 +409,7 @@ export default class StatusPageAPI extends BaseAPI<
_id: true,
projectId: true,
isPublicStatusPage: true,
overviewPageDescription: true,
},
props: {
isRoot: true,
@@ -485,13 +481,12 @@ export default class StatusPageAPI extends BaseAPI<
showStatusHistoryChart: true,
showCurrentStatus: true,
order: true,
},
populate: {
monitor: {
_id: true,
currentMonitorStatusId: true,
},
},
sort: {
order: SortOrder.Ascending,
},
@@ -540,16 +535,14 @@ export default class StatusPageAPI extends BaseAPI<
select: {
monitorId: true,
createdAt: true,
},
sort: {
createdAt: SortOrder.Ascending,
},
populate: {
monitorStatus: {
name: true,
color: true,
priority: true,
},
} as any,
},
sort: {
createdAt: SortOrder.Ascending,
},
skip: 0,
limit: LIMIT_PER_PROJECT,
@@ -575,11 +568,6 @@ export default class StatusPageAPI extends BaseAPI<
title: true,
description: true,
_id: true,
},
sort: {
createdAt: SortOrder.Ascending,
},
populate: {
incidentSeverity: {
name: true,
color: true,
@@ -592,6 +580,10 @@ export default class StatusPageAPI extends BaseAPI<
_id: true,
},
},
sort: {
createdAt: SortOrder.Ascending,
},
skip: 0,
limit: LIMIT_PER_PROJECT,
props: {
@@ -600,22 +592,24 @@ export default class StatusPageAPI extends BaseAPI<
});
}
const incidentsOnStausPage: Array<ObjectID> =
const incidentsOnStatusPage: Array<ObjectID> =
activeIncidents.map((incident: Incident) => {
return incident.id!;
});
let incidentPublicNotes: Array<IncidentPublicNote> = [];
if (incidentsOnStausPage.length > 0) {
if (incidentsOnStatusPage.length > 0) {
incidentPublicNotes =
await IncidentPublicNoteService.findBy({
query: {
incidentId:
QueryHelper.in(incidentsOnStausPage),
incidentId: QueryHelper.in(
incidentsOnStatusPage
),
projectId: statusPage.projectId!,
},
select: {
createdAt: true,
note: true,
incidentId: true,
},
@@ -633,20 +627,19 @@ export default class StatusPageAPI extends BaseAPI<
let incidentStateTimelines: Array<IncidentStateTimeline> =
[];
if (incidentsOnStausPage.length > 0) {
if (incidentsOnStatusPage.length > 0) {
incidentStateTimelines =
await IncidentStateTimelineService.findBy({
query: {
incidentId:
QueryHelper.in(incidentsOnStausPage),
incidentId: QueryHelper.in(
incidentsOnStatusPage
),
projectId: statusPage.projectId!,
},
select: {
_id: true,
createdAt: true,
incidentId: true,
},
populate: {
incidentState: {
_id: true,
name: true,
@@ -656,6 +649,7 @@ export default class StatusPageAPI extends BaseAPI<
isAcknowledgedState: true,
},
},
sort: {
createdAt: SortOrder.Descending, // new note first
},
@@ -685,6 +679,8 @@ export default class StatusPageAPI extends BaseAPI<
title: true,
description: true,
_id: true,
showAnnouncementAt: true,
endAnnouncementAt: true,
},
skip: 0,
limit: LIMIT_PER_PROJECT,
@@ -710,11 +706,7 @@ export default class StatusPageAPI extends BaseAPI<
description: true,
_id: true,
endsAt: true,
},
sort: {
createdAt: SortOrder.Ascending,
},
populate: {
startsAt: true,
currentScheduledMaintenanceState: {
name: true,
color: true,
@@ -726,6 +718,10 @@ export default class StatusPageAPI extends BaseAPI<
_id: true,
},
},
sort: {
createdAt: SortOrder.Ascending,
},
skip: 0,
limit: LIMIT_PER_PROJECT,
props: {
@@ -749,11 +745,6 @@ export default class StatusPageAPI extends BaseAPI<
_id: true,
endsAt: true,
startsAt: true,
},
sort: {
createdAt: SortOrder.Ascending,
},
populate: {
currentScheduledMaintenanceState: {
name: true,
color: true,
@@ -765,6 +756,10 @@ export default class StatusPageAPI extends BaseAPI<
_id: true,
},
},
sort: {
createdAt: SortOrder.Ascending,
},
skip: 0,
limit: LIMIT_PER_PROJECT,
props: {
@@ -778,7 +773,7 @@ export default class StatusPageAPI extends BaseAPI<
}
);
const scheduledMaintenanceEventsOnStausPage: Array<ObjectID> =
const scheduledMaintenanceEventsOnStatusPage: Array<ObjectID> =
scheduledMaintenanceEvents.map(
(event: ScheduledMaintenance) => {
return event.id!;
@@ -788,16 +783,17 @@ export default class StatusPageAPI extends BaseAPI<
let scheduledMaintenanceEventsPublicNotes: Array<ScheduledMaintenancePublicNote> =
[];
if (scheduledMaintenanceEventsOnStausPage.length > 0) {
if (scheduledMaintenanceEventsOnStatusPage.length > 0) {
scheduledMaintenanceEventsPublicNotes =
await ScheduledMaintenancePublicNoteService.findBy({
query: {
scheduledMaintenanceId: QueryHelper.in(
scheduledMaintenanceEventsOnStausPage
scheduledMaintenanceEventsOnStatusPage
),
projectId: statusPage.projectId!,
},
select: {
createdAt: true,
note: true,
scheduledMaintenanceId: true,
},
@@ -815,13 +811,13 @@ export default class StatusPageAPI extends BaseAPI<
let scheduledMaintenanceStateTimelines: Array<ScheduledMaintenanceStateTimeline> =
[];
if (scheduledMaintenanceEventsOnStausPage.length > 0) {
if (scheduledMaintenanceEventsOnStatusPage.length > 0) {
scheduledMaintenanceStateTimelines =
await ScheduledMaintenanceStateTimelineService.findBy(
{
query: {
scheduledMaintenanceId: QueryHelper.in(
scheduledMaintenanceEventsOnStausPage
scheduledMaintenanceEventsOnStatusPage
),
projectId: statusPage.projectId!,
},
@@ -829,8 +825,6 @@ export default class StatusPageAPI extends BaseAPI<
_id: true,
createdAt: true,
scheduledMaintenanceId: true,
},
populate: {
scheduledMaintenanceState: {
_id: true,
color: true,
@@ -840,6 +834,7 @@ export default class StatusPageAPI extends BaseAPI<
isOngoingState: true,
},
},
sort: {
createdAt: SortOrder.Descending, // new note first
},
@@ -894,6 +889,10 @@ export default class StatusPageAPI extends BaseAPI<
incidentStateTimelines,
IncidentStateTimeline
),
statusPage: JSONFunctions.toJSONObject(
statusPage,
StatusPage
),
scheduledMaintenanceStateTimelines:
JSONFunctions.toJSONArray(
scheduledMaintenanceStateTimelines,
@@ -1193,6 +1192,7 @@ export default class StatusPageAPI extends BaseAPI<
select: {
_id: true,
projectId: true,
showScheduledEventHistoryInDays: true,
},
props: {
isRoot: true,
@@ -1216,13 +1216,12 @@ export default class StatusPageAPI extends BaseAPI<
displayTooltip: true,
displayDescription: true,
displayName: true,
},
populate: {
monitor: {
_id: true,
currentMonitorStatusId: true,
},
},
skip: 0,
limit: LIMIT_PER_PROJECT,
props: {
@@ -1232,10 +1231,12 @@ export default class StatusPageAPI extends BaseAPI<
// check if status page has active scheduled events.
const today: Date = OneUptimeDate.getCurrentDate();
const last14Days: Date = OneUptimeDate.getSomeDaysAgo(14);
const historyDays: Date = OneUptimeDate.getSomeDaysAgo(
statusPage.showScheduledEventHistoryInDays || 14
);
let query: Query<ScheduledMaintenance> = {
startsAt: QueryHelper.inBetween(last14Days, today),
startsAt: QueryHelper.inBetween(historyDays, today),
statusPages: [statusPageId] as any,
projectId: statusPage.projectId!,
};
@@ -1258,11 +1259,6 @@ export default class StatusPageAPI extends BaseAPI<
_id: true,
endsAt: true,
startsAt: true,
},
sort: {
startsAt: SortOrder.Descending,
},
populate: {
currentScheduledMaintenanceState: {
name: true,
color: true,
@@ -1274,6 +1270,10 @@ export default class StatusPageAPI extends BaseAPI<
_id: true,
},
},
sort: {
startsAt: SortOrder.Descending,
},
skip: 0,
limit: LIMIT_PER_PROJECT,
props: {
@@ -1297,11 +1297,6 @@ export default class StatusPageAPI extends BaseAPI<
_id: true,
endsAt: true,
startsAt: true,
},
sort: {
createdAt: SortOrder.Ascending,
},
populate: {
currentScheduledMaintenanceState: {
name: true,
color: true,
@@ -1313,6 +1308,9 @@ export default class StatusPageAPI extends BaseAPI<
_id: true,
},
},
sort: {
createdAt: SortOrder.Ascending,
},
skip: 0,
limit: LIMIT_PER_PROJECT,
props: {
@@ -1326,7 +1324,7 @@ export default class StatusPageAPI extends BaseAPI<
}
);
const scheduledMaintenanceEventsOnStausPage: Array<ObjectID> =
const scheduledMaintenanceEventsOnStatusPage: Array<ObjectID> =
scheduledMaintenanceEvents.map((event: ScheduledMaintenance) => {
return event.id!;
});
@@ -1334,16 +1332,17 @@ export default class StatusPageAPI extends BaseAPI<
let scheduledMaintenanceEventsPublicNotes: Array<ScheduledMaintenancePublicNote> =
[];
if (scheduledMaintenanceEventsOnStausPage.length > 0) {
if (scheduledMaintenanceEventsOnStatusPage.length > 0) {
scheduledMaintenanceEventsPublicNotes =
await ScheduledMaintenancePublicNoteService.findBy({
query: {
scheduledMaintenanceId: QueryHelper.in(
scheduledMaintenanceEventsOnStausPage
scheduledMaintenanceEventsOnStatusPage
),
projectId: statusPage.projectId!,
},
select: {
createdAt: true,
note: true,
scheduledMaintenanceId: true,
},
@@ -1361,12 +1360,12 @@ export default class StatusPageAPI extends BaseAPI<
let scheduledMaintenanceStateTimelines: Array<ScheduledMaintenanceStateTimeline> =
[];
if (scheduledMaintenanceEventsOnStausPage.length > 0) {
if (scheduledMaintenanceEventsOnStatusPage.length > 0) {
scheduledMaintenanceStateTimelines =
await ScheduledMaintenanceStateTimelineService.findBy({
query: {
scheduledMaintenanceId: QueryHelper.in(
scheduledMaintenanceEventsOnStausPage
scheduledMaintenanceEventsOnStatusPage
),
projectId: statusPage.projectId!,
},
@@ -1374,8 +1373,6 @@ export default class StatusPageAPI extends BaseAPI<
_id: true,
createdAt: true,
scheduledMaintenanceId: true,
},
populate: {
scheduledMaintenanceState: {
name: true,
color: true,
@@ -1384,6 +1381,7 @@ export default class StatusPageAPI extends BaseAPI<
isOngoingState: true,
},
},
sort: {
createdAt: SortOrder.Descending, // new note first
},
@@ -1437,6 +1435,7 @@ export default class StatusPageAPI extends BaseAPI<
select: {
_id: true,
projectId: true,
showAnnouncementHistoryInDays: true,
},
props: {
isRoot: true,
@@ -1451,11 +1450,13 @@ export default class StatusPageAPI extends BaseAPI<
// check if status page has actuve announcement.
const today: Date = OneUptimeDate.getCurrentDate();
const last14Days: Date = OneUptimeDate.getSomeDaysAgo(14);
const historyDays: Date = OneUptimeDate.getSomeDaysAgo(
statusPage.showAnnouncementHistoryInDays || 14
);
let query: Query<StatusPageAnnouncement> = {
statusPages: [statusPageId] as any,
showAnnouncementAt: QueryHelper.inBetween(last14Days, today),
showAnnouncementAt: QueryHelper.inBetween(historyDays, today),
projectId: statusPage.projectId!,
};
@@ -1497,13 +1498,12 @@ export default class StatusPageAPI extends BaseAPI<
displayTooltip: true,
displayDescription: true,
displayName: true,
},
populate: {
monitor: {
_id: true,
currentMonitorStatusId: true,
},
},
skip: 0,
limit: LIMIT_PER_PROJECT,
props: {
@@ -1545,6 +1545,7 @@ export default class StatusPageAPI extends BaseAPI<
select: {
_id: true,
projectId: true,
showIncidentHistoryInDays: true,
},
props: {
isRoot: true,
@@ -1568,13 +1569,12 @@ export default class StatusPageAPI extends BaseAPI<
displayTooltip: true,
displayDescription: true,
displayName: true,
},
populate: {
monitor: {
_id: true,
currentMonitorStatusId: true,
},
},
skip: 0,
limit: LIMIT_PER_PROJECT,
props: {
@@ -1590,12 +1590,14 @@ export default class StatusPageAPI extends BaseAPI<
);
const today: Date = OneUptimeDate.getCurrentDate();
const last14Days: Date = OneUptimeDate.getSomeDaysAgo(14);
const historyDays: Date = OneUptimeDate.getSomeDaysAgo(
statusPage.showIncidentHistoryInDays || 14
);
let incidentQuery: Query<Incident> = {
monitors: monitorsOnStatusPage as any,
projectId: statusPage.projectId!,
createdAt: QueryHelper.inBetween(last14Days, today),
createdAt: QueryHelper.inBetween(historyDays, today),
};
if (incidentId) {
@@ -1616,11 +1618,6 @@ export default class StatusPageAPI extends BaseAPI<
title: true,
description: true,
_id: true,
},
sort: {
createdAt: SortOrder.Descending,
},
populate: {
incidentSeverity: {
name: true,
color: true,
@@ -1633,15 +1630,61 @@ export default class StatusPageAPI extends BaseAPI<
_id: true,
},
},
sort: {
createdAt: SortOrder.Descending,
},
skip: 0,
limit: LIMIT_PER_PROJECT,
props: {
isRoot: true,
},
});
const activeIncidents: Array<Incident> =
await IncidentService.findBy({
query: {
monitors: monitorsOnStatusPage as any,
currentIncidentState: {
isResolvedState: false,
} as any,
projectId: statusPage.projectId!,
},
select: {
createdAt: true,
title: true,
description: true,
_id: true,
incidentSeverity: {
name: true,
color: true,
},
currentIncidentState: {
name: true,
color: true,
},
monitors: {
_id: true,
},
},
sort: {
createdAt: SortOrder.Descending,
},
skip: 0,
limit: LIMIT_PER_PROJECT,
props: {
isRoot: true,
},
});
incidents = [...activeIncidents, ...incidents];
// get distinct by id.
incidents = ArrayUtil.distinctByFieldName(incidents, '_id');
}
const incidentsOnStausPage: Array<ObjectID> = incidents.map(
const incidentsOnStatusPage: Array<ObjectID> = incidents.map(
(incident: Incident) => {
return incident.id!;
}
@@ -1649,13 +1692,14 @@ export default class StatusPageAPI extends BaseAPI<
let incidentPublicNotes: Array<IncidentPublicNote> = [];
if (incidentsOnStausPage.length > 0) {
if (incidentsOnStatusPage.length > 0) {
incidentPublicNotes = await IncidentPublicNoteService.findBy({
query: {
incidentId: QueryHelper.in(incidentsOnStausPage),
incidentId: QueryHelper.in(incidentsOnStatusPage),
projectId: statusPage.projectId!,
},
select: {
createdAt: true,
note: true,
incidentId: true,
},
@@ -1672,26 +1716,25 @@ export default class StatusPageAPI extends BaseAPI<
let incidentStateTimelines: Array<IncidentStateTimeline> = [];
if (incidentsOnStausPage.length > 0) {
if (incidentsOnStatusPage.length > 0) {
incidentStateTimelines = await IncidentStateTimelineService.findBy({
query: {
incidentId: QueryHelper.in(incidentsOnStausPage),
incidentId: QueryHelper.in(incidentsOnStatusPage),
projectId: statusPage.projectId!,
},
select: {
_id: true,
createdAt: true,
incidentId: true,
},
sort: {
createdAt: SortOrder.Descending, // new note first
},
populate: {
incidentState: {
name: true,
color: true,
},
},
sort: {
createdAt: SortOrder.Descending, // new note first
},
skip: 0,
limit: LIMIT_PER_PROJECT,
props: {

View File

@@ -0,0 +1,122 @@
import UserCall from 'Model/Models/UserCall';
import UserCallService, {
Service as UserCallServiceType,
} from '../Services/UserCallService';
import BaseAPI from './BaseAPI';
import UserMiddleware from '../Middleware/UserAuthorization';
import {
ExpressRequest,
ExpressResponse,
OneUptimeRequest,
} from '../Utils/Express';
import BadDataException from 'Common/Types/Exception/BadDataException';
import Response from '../Utils/Response';
import UserSMS from 'Model/Models/UserSMS';
export default class UserCallAPI extends BaseAPI<
UserCall,
UserCallServiceType
> {
public constructor() {
super(UserCall, UserCallService);
this.router.post(
`/user-call/verify`,
UserMiddleware.getUserMiddleware,
async (req: ExpressRequest, res: ExpressResponse) => {
req = req as OneUptimeRequest;
if (!req.body.itemId) {
return Response.sendErrorResponse(
req,
res,
new BadDataException('Invalid item ID')
);
}
if (!req.body.code) {
return Response.sendErrorResponse(
req,
res,
new BadDataException('Invalid code')
);
}
// Check if the code matches and verify the phone number.
const item: UserSMS | null = await this.service.findOneById({
id: req.body['itemId'],
props: {
isRoot: true,
},
select: {
userId: true,
verificationCode: true,
},
});
if (!item) {
return Response.sendErrorResponse(
req,
res,
new BadDataException('Item not found')
);
}
//cehck user id
if (
item.userId?.toString() !==
(
req as OneUptimeRequest
)?.userAuthorization?.userId?.toString()
) {
return Response.sendErrorResponse(
req,
res,
new BadDataException('Invalid user ID')
);
}
if (item.verificationCode !== req.body['code']) {
return Response.sendErrorResponse(
req,
res,
new BadDataException('Invalid code')
);
}
await this.service.updateOneById({
id: item.id!,
props: {
isRoot: true,
},
data: {
isVerified: true,
},
});
return Response.sendEmptyResponse(req, res);
}
);
this.router.post(
`/user-call/resend-verification-code`,
UserMiddleware.getUserMiddleware,
async (req: ExpressRequest, res: ExpressResponse) => {
req = req as OneUptimeRequest;
if (!req.body.itemId) {
return Response.sendErrorResponse(
req,
res,
new BadDataException('Invalid item ID')
);
}
await this.service.resendVerificationCode(req.body.itemId);
return Response.sendEmptyResponse(req, res);
}
);
}
}

View File

@@ -0,0 +1,123 @@
import UserEmail from 'Model/Models/UserEmail';
import UserEmailService, {
Service as UserEmailServiceType,
} from '../Services/UserEmailService';
import BaseAPI from './BaseAPI';
import {
ExpressRequest,
ExpressResponse,
OneUptimeRequest,
} from '../Utils/Express';
import UserMiddleware from '../Middleware/UserAuthorization';
import BadDataException from 'Common/Types/Exception/BadDataException';
import Response from '../Utils/Response';
export default class UserEmailAPI extends BaseAPI<
UserEmail,
UserEmailServiceType
> {
public constructor() {
super(UserEmail, UserEmailService);
this.router.post(
`${new this.entityType().getCrudApiPath()?.toString()}/verify`,
UserMiddleware.getUserMiddleware,
async (req: ExpressRequest, res: ExpressResponse) => {
req = req as OneUptimeRequest;
if (!req.body.itemId) {
return Response.sendErrorResponse(
req,
res,
new BadDataException('Invalid item ID')
);
}
if (!req.body.code) {
return Response.sendErrorResponse(
req,
res,
new BadDataException('Invalid code')
);
}
// Check if the code matches and verify the email.
const item: UserEmail | null = await this.service.findOneById({
id: req.body['itemId'],
props: {
isRoot: true,
},
select: {
userId: true,
verificationCode: true,
},
});
if (!item) {
return Response.sendErrorResponse(
req,
res,
new BadDataException('Item not found')
);
}
//cehck user id
if (
item.userId?.toString() !==
(
req as OneUptimeRequest
)?.userAuthorization?.userId?.toString()
) {
return Response.sendErrorResponse(
req,
res,
new BadDataException('Invalid user ID')
);
}
if (item.verificationCode !== req.body['code']) {
return Response.sendErrorResponse(
req,
res,
new BadDataException('Invalid code')
);
}
await this.service.updateOneById({
id: item.id!,
props: {
isRoot: true,
},
data: {
isVerified: true,
},
});
return Response.sendEmptyResponse(req, res);
}
);
this.router.post(
`${new this.entityType()
.getCrudApiPath()
?.toString()}/resend-verification-code`,
UserMiddleware.getUserMiddleware,
async (req: ExpressRequest, res: ExpressResponse) => {
req = req as OneUptimeRequest;
if (!req.body.itemId) {
return Response.sendErrorResponse(
req,
res,
new BadDataException('Invalid item ID')
);
}
await this.service.resendVerificationCode(req.body.itemId);
return Response.sendEmptyResponse(req, res);
}
);
}
}

View File

@@ -0,0 +1,161 @@
import UserOnCallLogTimeline from 'Model/Models/UserOnCallLogTimeline';
import UserOnCallLogTimelineService, {
Service as UserNotificationLogTimelineServiceType,
} from '../Services/UserOnCallLogTimelineService';
import BaseAPI from './BaseAPI';
import {
ExpressRequest,
ExpressResponse,
OneUptimeRequest,
} from '../Utils/Express';
import BadDataException from 'Common/Types/Exception/BadDataException';
import Response from '../Utils/Response';
import ObjectID from 'Common/Types/ObjectID';
import { JSONObject } from 'Common/Types/JSON';
import NotificationMiddleware from '../Middleware/NotificationMiddleware';
import OneUptimeDate from 'Common/Types/Date';
import URL from 'Common/Types/API/URL';
import { DashboardRoute, Domain, HttpProtocol } from '../Config';
import UserNotificationStatus from 'Common/Types/UserNotification/UserNotificationStatus';
export default class UserNotificationLogTimelineAPI extends BaseAPI<
UserOnCallLogTimeline,
UserNotificationLogTimelineServiceType
> {
public constructor() {
super(UserOnCallLogTimeline, UserOnCallLogTimelineService);
this.router.post(
`${new this.entityType()
.getCrudApiPath()
?.toString()}/call/gather-input/:itemId`,
NotificationMiddleware.isValidCallNotificationRequest,
async (req: ExpressRequest, res: ExpressResponse) => {
req = req as OneUptimeRequest;
if (!req.params['itemId']) {
return Response.sendErrorResponse(
req,
res,
new BadDataException('Invalid item ID')
);
}
const token: JSONObject = (req as any).callTokenData;
const itemId: ObjectID = new ObjectID(req.params['itemId']);
const timelineItem: UserOnCallLogTimeline | null =
await this.service.findOneById({
id: itemId,
select: {
_id: true,
projectId: true,
triggeredByIncidentId: true,
},
props: {
isRoot: true,
},
});
if (!timelineItem) {
return Response.sendErrorResponse(
req,
res,
new BadDataException('Invalid item Id')
);
}
// check digits.
if (req.body['Digits'] === '1') {
// then ack incident
await this.service.updateOneById({
id: itemId,
data: {
acknowledgedAt: OneUptimeDate.getCurrentDate(),
isAcknowledged: true,
status: UserNotificationStatus.Acknowledged,
statusMessage: 'Notification Acknowledged',
},
props: {
isRoot: true,
},
});
}
return NotificationMiddleware.sendResponse(
req,
res,
token as any
);
}
);
this.router.get(
`${new this.entityType()
.getCrudApiPath()
?.toString()}/acknowledge/:itemId`,
async (req: ExpressRequest, res: ExpressResponse) => {
req = req as OneUptimeRequest;
if (!req.params['itemId']) {
return Response.sendErrorResponse(
req,
res,
new BadDataException('Item ID is required')
);
}
const itemId: ObjectID = new ObjectID(req.params['itemId']);
const timelineItem: UserOnCallLogTimeline | null =
await this.service.findOneById({
id: itemId,
select: {
_id: true,
projectId: true,
triggeredByIncidentId: true,
},
props: {
isRoot: true,
},
});
if (!timelineItem) {
return Response.sendErrorResponse(
req,
res,
new BadDataException('Invalid item Id')
);
}
await this.service.updateOneById({
id: itemId,
data: {
acknowledgedAt: OneUptimeDate.getCurrentDate(),
isAcknowledged: true,
status: UserNotificationStatus.Acknowledged,
statusMessage: 'Notification Acknowledged',
},
props: {
isRoot: true,
},
});
// redirect to dashboard to incidents page.
return Response.redirect(
req,
res,
new URL(
HttpProtocol,
Domain,
DashboardRoute.addRoute(
`/${timelineItem.projectId?.toString()}/incidents/${timelineItem.triggeredByIncidentId!.toString()}`
)
)
);
}
);
}
}

View File

@@ -0,0 +1,118 @@
import UserSMS from 'Model/Models/UserSMS';
import UserSMSService, {
Service as UserSMSServiceType,
} from '../Services/UserSmsService';
import BaseAPI from './BaseAPI';
import UserMiddleware from '../Middleware/UserAuthorization';
import {
ExpressRequest,
ExpressResponse,
OneUptimeRequest,
} from '../Utils/Express';
import BadDataException from 'Common/Types/Exception/BadDataException';
import Response from '../Utils/Response';
export default class UserSMSAPI extends BaseAPI<UserSMS, UserSMSServiceType> {
public constructor() {
super(UserSMS, UserSMSService);
this.router.post(
`/user-sms/verify`,
UserMiddleware.getUserMiddleware,
async (req: ExpressRequest, res: ExpressResponse) => {
req = req as OneUptimeRequest;
if (!req.body.itemId) {
return Response.sendErrorResponse(
req,
res,
new BadDataException('Invalid item ID')
);
}
if (!req.body.code) {
return Response.sendErrorResponse(
req,
res,
new BadDataException('Invalid code')
);
}
// Check if the code matches and verify the phone number.
const item: UserSMS | null = await this.service.findOneById({
id: req.body['itemId'],
props: {
isRoot: true,
},
select: {
userId: true,
verificationCode: true,
},
});
if (!item) {
return Response.sendErrorResponse(
req,
res,
new BadDataException('Item not found')
);
}
//cehck user id
if (
item.userId?.toString() !==
(
req as OneUptimeRequest
)?.userAuthorization?.userId?.toString()
) {
return Response.sendErrorResponse(
req,
res,
new BadDataException('Invalid user ID')
);
}
if (item.verificationCode !== req.body['code']) {
return Response.sendErrorResponse(
req,
res,
new BadDataException('Invalid code')
);
}
await this.service.updateOneById({
id: item.id!,
props: {
isRoot: true,
},
data: {
isVerified: true,
},
});
return Response.sendEmptyResponse(req, res);
}
);
this.router.post(
`/user-sms/resend-verification-code`,
UserMiddleware.getUserMiddleware,
async (req: ExpressRequest, res: ExpressResponse) => {
req = req as OneUptimeRequest;
if (!req.body.itemId) {
return Response.sendErrorResponse(
req,
res,
new BadDataException('Invalid item ID')
);
}
await this.service.resendVerificationCode(req.body.itemId);
return Response.sendEmptyResponse(req, res);
}
);
}
}

View File

@@ -5,6 +5,7 @@ import Hostname from 'Common/Types/API/Hostname';
import Route from 'Common/Types/API/Route';
import SubscriptionPlan from 'Common/Types/Billing/SubscriptionPlan';
import { JSONObject } from 'Common/Types/JSON';
import URL from 'Common/Types/API/URL';
export const getAllEnvVars: Function = (): JSONObject => {
return process.env;
@@ -27,7 +28,7 @@ export const DatabasePort: Port = new Port(
);
export const DatabaseUsername: string =
process.env['DATABASE_USERNAME'] || 'oneuptimedbuser';
process.env['DATABASE_USERNAME'] || 'postgres';
export const DatabasePassword: string =
process.env['DATABASE_PASSWORD'] || 'password';
@@ -57,14 +58,18 @@ export const RealtimeHostname: Hostname = Hostname.fromString(
process.env['REALTIME_HOSTNAME'] || 'realtime'
);
export const MailHostname: Hostname = Hostname.fromString(
process.env['MAIL_HOSTNAME'] || 'mail'
export const NotificationHostname: Hostname = Hostname.fromString(
process.env['NOTIFICATION_HOSTNAME'] || 'notification'
);
export const WorkerHostname: Hostname = Hostname.fromString(
process.env['WORKER_HOSTNAME'] || 'worker'
);
export const LinkShortnerHostname: Route = new Route(
process.env['LINK_SHORTNER_HOSTNAME'] || 'link-shortner'
);
export const WorkflowHostname: Hostname = Hostname.fromString(
process.env['WORKFLOW_HOSTNAME'] || 'workflow'
);
@@ -119,10 +124,14 @@ export const IdentityRoute: Route = new Route(
export const FileRoute: Route = new Route(process.env['FILE_ROUTE'] || '/file');
export const StausPageRoute: Route = new Route(
export const StatusPageRoute: Route = new Route(
process.env['STATUS_PAGE_ROUTE'] || '/status-page'
);
export const LinkShortnerRoute: Route = new Route(
process.env['LINK_SHORTNER_ROUTE'] || '/l'
);
export const DashboardRoute: Route = new Route(
process.env['DASHBOARD_ROUTE'] || '/dashboard'
);
@@ -131,6 +140,10 @@ export const IntegrationRoute: Route = new Route(
process.env['INTEGRATION_ROUTE'] || '/integration'
);
export const NotificationRoute: Route = new Route(
process.env['NOTIFICATION_ROUTE'] || '/notification'
);
export const HelmRoute: Route = new Route(
process.env['HELMCHART_ROUTE'] || '/helm-chart'
);
@@ -163,3 +176,5 @@ export const SubscriptionPlans: Array<SubscriptionPlan> =
export const AnalyticsKey: string = process.env['ANALYTICS_KEY'] || '';
export const AnalyticsHost: string = process.env['ANALYTICS_HOST'] || '';
export const DashboardUrl: URL = new URL(HttpProtocol, Domain, DashboardRoute);

View File

@@ -0,0 +1,71 @@
import {
ExpressRequest,
ExpressResponse,
NextFunction,
OneUptimeRequest,
} from '../Utils/Express';
import Response from '../Utils/Response';
import BadDataException from 'Common/Types/Exception/BadDataException';
import JSONFunctions from 'Common/Types/JSONFunctions';
import JSONWebToken from '../Utils/JsonWebToken';
import { OnCallInputRequest } from 'Common/Types/Call/CallRequest';
import VoiceResponse from 'twilio/lib/twiml/VoiceResponse';
export default class NotificationMiddleware {
public static async sendResponse(
req: ExpressRequest,
res: ExpressResponse,
onCallInputRequest: OnCallInputRequest
): Promise<void> {
const response: VoiceResponse = new VoiceResponse();
if (onCallInputRequest[req.body['Digits']]) {
response.say(onCallInputRequest[req.body['Digits']]!.sayMessage);
} else {
response.say(onCallInputRequest['default']!.sayMessage);
}
return Response.sendXmlResponse(req, res, response.toString());
}
public static async isValidCallNotificationRequest(
req: ExpressRequest,
res: ExpressResponse,
next: NextFunction
): Promise<void> {
req = req as OneUptimeRequest;
if (!req.body['Digits']) {
return Response.sendErrorResponse(
req,
res,
new BadDataException('Invalid input')
);
}
if (!req.query['token']) {
return Response.sendErrorResponse(
req,
res,
new BadDataException('Invalid token')
);
}
const token: string = req.query['token'] as string;
try {
(req as any).callTokenData = JSONFunctions.deserialize(
JSONWebToken.decodeJsonPayload(token)
);
} catch (e) {
return Response.sendErrorResponse(
req,
res,
new BadDataException('Invalid token')
);
}
return next();
}
}

View File

@@ -28,6 +28,7 @@ import BadDataException from 'Common/Types/Exception/BadDataException';
import SsoAuthorizationException from 'Common/Types/Exception/SsoAuthorizationException';
import JSONWebTokenData from 'Common/Types/JsonWebTokenData';
import logger from '../Utils/Logger';
import Exception from 'Common/Types/Exception/Exception';
export default class UserMiddleware {
/*
@@ -120,7 +121,8 @@ export default class UserMiddleware {
if (tenantId) {
oneuptimeRequest.tenantId = tenantId;
// check if the force sso for login is present and if it is, check if the sso token is present and if it is then allow, otherwise decline.
// update last active of project
await ProjectService.updateLastActive(tenantId);
}
if (ProjectMiddleware.hasApiKey(req)) {
@@ -175,121 +177,40 @@ export default class UserMiddleware {
}
if (tenantId) {
const project: Project | null = await ProjectService.findOneById({
id: tenantId,
select: {
requireSsoForLogin: true,
},
props: {
isRoot: true,
},
});
try {
const userTenantAccessPermission: UserTenantAccessPermission | null =
await UserMiddleware.getUserTenantAccessPermissionWithTenantId(
req,
tenantId,
new ObjectID(userId)
);
if (!project) {
return Response.sendErrorResponse(
req,
res,
new BadDataException('Invalid tenantId')
);
}
if (
project.requireSsoForLogin &&
!UserMiddleware.doesSsoTokenForProjectExist(
req,
tenantId,
new ObjectID(userId)
)
) {
return Response.sendErrorResponse(
req,
res,
new SsoAuthorizationException()
);
}
// get project level permissions if projectid exists in request.
const userTenantAccessPermission: UserTenantAccessPermission | null =
await AccessTokenService.getUserTenantAccessPermission(
oneuptimeRequest.userAuthorization.userId,
tenantId
);
if (userTenantAccessPermission) {
oneuptimeRequest.userTenantAccessPermission = {};
oneuptimeRequest.userTenantAccessPermission[
tenantId.toString()
] = userTenantAccessPermission;
if (userTenantAccessPermission) {
oneuptimeRequest.userTenantAccessPermission = {};
oneuptimeRequest.userTenantAccessPermission[
tenantId.toString()
] = userTenantAccessPermission;
}
} catch (error) {
return Response.sendErrorResponse(req, res, error as Exception);
}
}
if (req.headers['is-multi-tenant-query']) {
oneuptimeRequest.userTenantAccessPermission = {};
if (
userGlobalAccessPermission &&
userGlobalAccessPermission.projectIds &&
userGlobalAccessPermission.projectIds.length > 0
) {
const projects: Array<Project> = await ProjectService.findBy({
query: {
_id: QueryHelper.in(
userGlobalAccessPermission?.projectIds.map(
(i: ObjectID) => {
return i.toString();
}
) || []
),
},
select: {
requireSsoForLogin: true,
},
limit: LIMIT_PER_PROJECT,
skip: 0,
props: {
isRoot: true,
},
});
for (const projectId of userGlobalAccessPermission?.projectIds ||
[]) {
// check if the force sso login is required. and if it is, then check then token.
if (
projects.find((p: Project) => {
return (
p._id === projectId.toString() &&
p.requireSsoForLogin
);
}) &&
!UserMiddleware.doesSsoTokenForProjectExist(
req,
projectId,
new ObjectID(userId)
)
) {
// Add default permissions.
const userTenantAccessPermission: UserTenantAccessPermission | null =
AccessTokenService.getDefaultUserTenantAccessPermission(
projectId
);
oneuptimeRequest.userTenantAccessPermission[
projectId.toString()
] = userTenantAccessPermission;
} else {
// get project level permissions if projectid exists in request.
const userTenantAccessPermission: UserTenantAccessPermission | null =
await AccessTokenService.getUserTenantAccessPermission(
oneuptimeRequest.userAuthorization.userId,
projectId
);
if (userTenantAccessPermission) {
oneuptimeRequest.userTenantAccessPermission[
projectId.toString()
] = userTenantAccessPermission;
}
}
const userTenantAccessPermission: Dictionary<UserTenantAccessPermission> | null =
await UserMiddleware.getUserTenantAccessPermissionForMultiTenant(
req,
new ObjectID(userId),
userGlobalAccessPermission.projectIds
);
if (userTenantAccessPermission) {
oneuptimeRequest.userTenantAccessPermission =
userTenantAccessPermission;
}
}
}
@@ -343,4 +264,106 @@ export default class UserMiddleware {
return next();
}
public static async getUserTenantAccessPermissionWithTenantId(
req: ExpressRequest,
tenantId: ObjectID,
userId: ObjectID
): Promise<UserTenantAccessPermission | null> {
const project: Project | null = await ProjectService.findOneById({
id: tenantId,
select: {
requireSsoForLogin: true,
},
props: {
isRoot: true,
},
});
if (!project) {
throw new BadDataException('Invalid tenantId');
}
if (
project.requireSsoForLogin &&
!UserMiddleware.doesSsoTokenForProjectExist(req, tenantId, userId)
) {
throw new SsoAuthorizationException();
}
// get project level permissions if projectid exists in request.
return await AccessTokenService.getUserTenantAccessPermission(
userId,
tenantId
);
}
public static async getUserTenantAccessPermissionForMultiTenant(
req: ExpressRequest,
userId: ObjectID,
projectIds: ObjectID[]
): Promise<Dictionary<UserTenantAccessPermission> | null> {
if (!projectIds.length) {
return null;
}
const projects: Array<Project> = await ProjectService.findBy({
query: {
_id: QueryHelper.in(
projectIds.map((i: ObjectID) => {
return i.toString();
}) || []
),
},
select: {
requireSsoForLogin: true,
},
limit: LIMIT_PER_PROJECT,
skip: 0,
props: {
isRoot: true,
},
});
let result: Dictionary<UserTenantAccessPermission> | null = null;
for (const projectId of projectIds) {
// check if the force sso login is required. and if it is, then check then token.
let userTenantAccessPermission: UserTenantAccessPermission | null;
if (
projects.find((p: Project) => {
return (
p._id === projectId.toString() && p.requireSsoForLogin
);
}) &&
!UserMiddleware.doesSsoTokenForProjectExist(
req,
projectId,
userId
)
) {
// Add default permissions.
userTenantAccessPermission =
AccessTokenService.getDefaultUserTenantAccessPermission(
projectId
);
} else {
// get project level permissions if projectid exists in request.
userTenantAccessPermission =
await AccessTokenService.getUserTenantAccessPermission(
userId,
projectId
);
}
if (userTenantAccessPermission) {
if (!result) {
result = {};
}
result[projectId.toString()] = userTenantAccessPermission;
}
}
return result;
}
}

View File

@@ -15,17 +15,20 @@ import Label from 'Model/Models/Label';
import QueryHelper from '../Types/Database/QueryHelper';
import APIKeyPermission from 'Model/Models/ApiKeyPermission';
import ApiKeyPermissionService from './ApiKeyPermissionService';
import BaseService from './BaseService';
enum PermissionNamespace {
GlobalPermission = 'global-permissions',
ProjectPermission = 'project-permissions',
}
export default class AccessTokenService {
public static async refreshUserAllPermissions(
userId: ObjectID
): Promise<void> {
await AccessTokenService.refreshUserGlobalAccessPermission(userId);
export class AccessTokenService extends BaseService {
public constructor() {
super();
}
public async refreshUserAllPermissions(userId: ObjectID): Promise<void> {
await this.refreshUserGlobalAccessPermission(userId);
// query for all projects user belongs to.
const teamMembers: Array<TeamMember> = await TeamMemberService.findBy({
@@ -54,14 +57,11 @@ export default class AccessTokenService {
);
for (const projectId of projectIds) {
await AccessTokenService.refreshUserTenantAccessPermission(
userId,
projectId
);
await this.refreshUserTenantAccessPermission(userId, projectId);
}
}
public static async getDefaultApiGlobalPermission(
public async getDefaultApiGlobalPermission(
projectId: ObjectID
): Promise<UserGlobalAccessPermission> {
return {
@@ -75,7 +75,7 @@ export default class AccessTokenService {
};
}
public static async getApiTenantAccessPermission(
public async getApiTenantAccessPermission(
projectId: ObjectID,
apiKeyId: ObjectID
): Promise<UserTenantAccessPermission> {
@@ -87,13 +87,11 @@ export default class AccessTokenService {
},
select: {
permission: true,
labels: true,
},
populate: {
labels: {
_id: true,
},
},
limit: LIMIT_MAX,
skip: 0,
props: {
@@ -118,14 +116,14 @@ export default class AccessTokenService {
}
const permission: UserTenantAccessPermission =
AccessTokenService.getDefaultUserTenantAccessPermission(projectId);
this.getDefaultUserTenantAccessPermission(projectId);
permission.permissions = permission.permissions.concat(userPermissions);
return permission;
}
public static async refreshUserGlobalAccessPermission(
public async refreshUserGlobalAccessPermission(
userId: ObjectID
): Promise<UserGlobalAccessPermission> {
// query for all projects user belongs to.
@@ -165,7 +163,7 @@ export default class AccessTokenService {
return permissionToStore;
}
public static getDefaultUserTenantAccessPermission(
public getDefaultUserTenantAccessPermission(
projectId: ObjectID
): UserTenantAccessPermission {
const userPermissions: Array<UserPermission> = [];
@@ -191,7 +189,7 @@ export default class AccessTokenService {
return permission;
}
public static async getUserGlobalAccessPermission(
public async getUserGlobalAccessPermission(
userId: ObjectID
): Promise<UserGlobalAccessPermission | null> {
const json: JSONObject | null = await GlobalCache.getJSON(
@@ -200,9 +198,7 @@ export default class AccessTokenService {
);
if (!json) {
return await AccessTokenService.refreshUserGlobalAccessPermission(
userId
);
return await this.refreshUserGlobalAccessPermission(userId);
}
const accessPermission: UserGlobalAccessPermission =
@@ -213,7 +209,7 @@ export default class AccessTokenService {
return accessPermission;
}
public static async refreshUserTenantAccessPermission(
public async refreshUserTenantAccessPermission(
userId: ObjectID,
projectId: ObjectID
): Promise<UserTenantAccessPermission | null> {
@@ -252,13 +248,11 @@ export default class AccessTokenService {
},
select: {
permission: true,
labels: true,
},
populate: {
labels: {
_id: true,
},
},
limit: LIMIT_MAX,
skip: 0,
props: {
@@ -283,7 +277,7 @@ export default class AccessTokenService {
}
const permission: UserTenantAccessPermission =
AccessTokenService.getDefaultUserTenantAccessPermission(projectId);
this.getDefaultUserTenantAccessPermission(projectId);
permission.permissions = permission.permissions.concat(userPermissions);
@@ -296,7 +290,7 @@ export default class AccessTokenService {
return permission;
}
public static async getUserTenantAccessPermission(
public async getUserTenantAccessPermission(
userId: ObjectID,
projectId: ObjectID
): Promise<UserTenantAccessPermission | null> {
@@ -311,7 +305,7 @@ export default class AccessTokenService {
}
if (!json) {
return await AccessTokenService.refreshUserTenantAccessPermission(
return await this.refreshUserTenantAccessPermission(
userId,
projectId
);
@@ -320,3 +314,5 @@ export default class AccessTokenService {
return json;
}
}
export default new AccessTokenService();

View File

@@ -0,0 +1,3 @@
export default class BaseService {
public constructor() {}
}

View File

@@ -1,18 +1,18 @@
import PostgresDatabase from '../Infrastructure/PostgresDatabase';
import Model from 'Model/Models/BillingInvoice';
import DatabaseService, { OnDelete, OnFind } from './DatabaseService';
import DatabaseService, { OnFind } from './DatabaseService';
import FindBy from '../Types/Database/FindBy';
import ProjectService from './ProjectService';
import BadDataException from 'Common/Types/Exception/BadDataException';
import Project from 'Model/Models/Project';
import BillingService, { Invoice } from './BillingService';
import DeleteBy from '../Types/Database/DeleteBy';
import URL from 'Common/Types/API/URL';
import { LIMIT_PER_PROJECT } from 'Common/Types/Database/LimitMax';
export class Service extends DatabaseService<Model> {
public constructor(postgresDatabase?: PostgresDatabase) {
super(Model, postgresDatabase);
this.setDoNotAllowDelete(true);
}
protected override async onBeforeFind(
@@ -87,12 +87,6 @@ export class Service extends DatabaseService<Model> {
return { findBy, carryForward: invoices };
}
protected override async onBeforeDelete(
_deleteBy: DeleteBy<Model>
): Promise<OnDelete<Model>> {
throw new BadDataException('Invoice should not be deleted.');
}
}
export default new Service();

View File

@@ -10,6 +10,7 @@ import Stripe from 'stripe';
import { BillingPrivateKey, IsBillingEnabled } from '../Config';
import ServerMeteredPlan from '../Types/Billing/MeteredPlan/ServerMeteredPlan';
import SubscriptionStatus from 'Common/Types/Billing/SubscriptionStatus';
import BaseService from './BaseService';
export interface PaymentMethod {
id: string;
@@ -28,16 +29,17 @@ export interface Invoice {
customerId: string | undefined;
}
export class BillingService {
private static stripe: Stripe = new Stripe(BillingPrivateKey, {
export class BillingService extends BaseService {
public constructor() {
super();
}
private stripe: Stripe = new Stripe(BillingPrivateKey, {
apiVersion: '2022-08-01',
});
// returns billing id of the customer.
public static async createCustomer(
name: string,
id: ObjectID
): Promise<string> {
public async createCustomer(name: string, id: ObjectID): Promise<string> {
if (!this.isBillingEnabled()) {
throw new BadDataException(
'Billing is not enabled for this server.'
@@ -55,7 +57,7 @@ export class BillingService {
return customer.id;
}
public static async updateCustomerName(
public async updateCustomerName(
id: string,
newName: string
): Promise<void> {
@@ -68,7 +70,7 @@ export class BillingService {
await this.stripe.customers.update(id, { name: newName });
}
public static async deleteCustomer(id: string): Promise<void> {
public async deleteCustomer(id: string): Promise<void> {
if (!this.isBillingEnabled()) {
throw new BadDataException(
'Billing is not enabled for this server.'
@@ -78,11 +80,11 @@ export class BillingService {
await this.stripe.customers.del(id);
}
public static isBillingEnabled(): boolean {
public isBillingEnabled(): boolean {
return IsBillingEnabled;
}
public static async subscribeToPlan(
public async subscribeToPlan(
projectId: ObjectID,
customerId: string,
serverMeteredPlans: Array<typeof ServerMeteredPlan>,
@@ -149,7 +151,7 @@ export class BillingService {
};
}
public static async changeQuantity(
public async changeQuantity(
subscriptionId: string,
quantity: number
): Promise<void> {
@@ -183,7 +185,7 @@ export class BillingService {
});
}
public static async addOrUpdateMeteredPricingOnSubscription(
public async addOrUpdateMeteredPricingOnSubscription(
subscriptionId: string,
meteredPlan: MeteredPlan,
quantity: number,
@@ -264,7 +266,7 @@ export class BillingService {
// complete.
}
public static async changePlan(
public async changePlan(
projectId: ObjectID,
subscriptionId: string,
serverMeteredPlans: Array<typeof ServerMeteredPlan>,
@@ -324,7 +326,7 @@ export class BillingService {
};
}
public static async deletePaymentMethod(
public async deletePaymentMethod(
customerId: string,
paymentMethodId: string
): Promise<void> {
@@ -346,7 +348,15 @@ export class BillingService {
await this.stripe.paymentMethods.detach(paymentMethodId);
}
public static async getPaymentMethods(
public async hasPaymentMethods(customerId: string): Promise<boolean> {
if ((await this.getPaymentMethods(customerId)).length > 0) {
return true;
}
return false;
}
public async getPaymentMethods(
customerId: string
): Promise<Array<PaymentMethod>> {
if (!this.isBillingEnabled()) {
@@ -419,9 +429,7 @@ export class BillingService {
return paymenMethods;
}
public static async getSetupIntentSecret(
customerId: string
): Promise<string> {
public async getSetupIntentSecret(customerId: string): Promise<string> {
const setupIntent: Stripe.Response<Stripe.SetupIntent> =
await this.stripe.setupIntents.create({
customer: customerId,
@@ -436,9 +444,7 @@ export class BillingService {
return setupIntent.client_secret;
}
public static async cancelSubscription(
subscriptionId: string
): Promise<void> {
public async cancelSubscription(subscriptionId: string): Promise<void> {
if (!this.isBillingEnabled()) {
throw new BadDataException(
'Billing is not enabled for this server.'
@@ -451,7 +457,7 @@ export class BillingService {
}
}
public static async getSubscriptionStatus(
public async getSubscriptionStatus(
subscriptionId: string
): Promise<SubscriptionStatus> {
const subscription: Stripe.Subscription = await this.getSubscription(
@@ -460,7 +466,7 @@ export class BillingService {
return subscription.status as SubscriptionStatus;
}
public static async getSubscription(
public async getSubscription(
subscriptionId: string
): Promise<Stripe.Subscription> {
if (!this.isBillingEnabled()) {
@@ -475,9 +481,7 @@ export class BillingService {
return subscription;
}
public static async getInvoices(
customerId: string
): Promise<Array<Invoice>> {
public async getInvoices(customerId: string): Promise<Array<Invoice>> {
const invoices: Stripe.ApiList<Stripe.Invoice> =
await this.stripe.invoices.list({
customer: customerId,
@@ -497,7 +501,48 @@ export class BillingService {
});
}
public static async payInvoice(
public async genrateInvoiceAndChargeCustomer(
customerId: string,
itemText: string,
amountInUsd: number
): Promise<void> {
const invoice: Stripe.Invoice = await this.stripe.invoices.create({
customer: customerId,
auto_advance: true, // do not automatically charge.
collection_method: 'charge_automatically',
});
if (!invoice || !invoice.id) {
throw new APIException('Invoice not generated.');
}
await this.stripe.invoiceItems.create({
invoice: invoice.id,
amount: amountInUsd * 100,
description: itemText,
customer: customerId,
});
await this.stripe.invoices.finalizeInvoice(invoice.id!);
try {
await this.payInvoice(customerId, invoice.id!);
} catch (err) {
// mark invoice as failed and do not collect payment.
await this.voidInvoice(invoice.id!);
throw err;
}
}
public async voidInvoice(invoiceId: string): Promise<Stripe.Invoice> {
const invoice: Stripe.Invoice = await this.stripe.invoices.voidInvoice(
invoiceId
);
return invoice;
}
public async payInvoice(
customerId: string,
invoiceId: string
): Promise<Invoice> {
@@ -530,4 +575,4 @@ export class BillingService {
}
}
export default BillingService;
export default new BillingService();

View File

@@ -0,0 +1,12 @@
import PostgresDatabase from '../Infrastructure/PostgresDatabase';
import Model from 'Model/Models/CallLog';
import DatabaseService from './DatabaseService';
export class Service extends DatabaseService<Model> {
public constructor(postgresDatabase?: PostgresDatabase) {
super(Model, postgresDatabase);
this.hardDeleteItemsOlderThanInDays('createdAt', 30);
}
}
export default new Service();

View File

@@ -0,0 +1,52 @@
import EmptyResponseData from 'Common/Types/API/EmptyResponse';
import HTTPResponse from 'Common/Types/API/HTTPResponse';
import Route from 'Common/Types/API/Route';
import URL from 'Common/Types/API/URL';
import { JSONObject } from 'Common/Types/JSON';
import API from 'Common/Utils/API';
import { NotificationHostname } from '../Config';
import Protocol from 'Common/Types/API/Protocol';
import ClusterKeyAuthorization from '../Middleware/ClusterKeyAuthorization';
import Phone from 'Common/Types/Phone';
import ObjectID from 'Common/Types/ObjectID';
import CallRequest from 'Common/Types/Call/CallRequest';
import BaseService from './BaseService';
export class CallService extends BaseService {
public constructor() {
super();
}
public async makeCall(
callRequest: CallRequest,
options: {
projectId?: ObjectID | undefined; // project id for sms log
from?: Phone; // from phone number
isSensitive?: boolean; // if true, message will not be logged
userOnCallLogTimelineId?: ObjectID;
}
): Promise<HTTPResponse<EmptyResponseData>> {
const body: JSONObject = {
callRequest: callRequest,
from: options.from?.toString(),
projectId: options.projectId?.toString(),
isSensitive: options.isSensitive,
userOnCallLogTimelineId:
options.userOnCallLogTimelineId?.toString(),
};
return await API.post<EmptyResponseData>(
new URL(
Protocol.HTTP,
NotificationHostname,
new Route('/call/make-call')
),
body,
{
...ClusterKeyAuthorization.getClusterKeyHeaders(),
}
);
}
}
export default new CallService();

View File

@@ -1,5 +1,5 @@
import PostgresDatabase from '../Infrastructure/PostgresDatabase';
import Model from 'Model/Models/GlobalConfig';
import Model from 'Model/Models/DataMigration';
import DatabaseService from './DatabaseService';
export class Service extends DatabaseService<Model> {
@@ -7,5 +7,4 @@ export class Service extends DatabaseService<Model> {
super(Model, postgresDatabase);
}
}
export default new Service();

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