mirror of
https://github.com/OneUptime/oneuptime.git
synced 2026-04-06 08:42:13 +02:00
Compare commits
608 Commits
9.4.2
...
mult-slack
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
268d13786f | ||
|
|
79ab00bc29 | ||
|
|
95a0ddc49f | ||
|
|
9759d839d9 | ||
|
|
8d3712c36a | ||
|
|
f8e26246dd | ||
|
|
8560ecab41 | ||
|
|
5b2a6924d9 | ||
|
|
e047143974 | ||
|
|
d23dc791e2 | ||
|
|
a4b3b340c8 | ||
|
|
2173e4e611 | ||
|
|
dc19f87404 | ||
|
|
a3045c5f26 | ||
|
|
5d6907be97 | ||
|
|
e2ace9fc11 | ||
|
|
5a11bf228a | ||
|
|
cdd8d5523f | ||
|
|
f5029fada7 | ||
|
|
8131c9d42f | ||
|
|
946c7d4c48 | ||
|
|
9cbc7d9646 | ||
|
|
72d95871f7 | ||
|
|
3545a221bc | ||
|
|
9a5bcb9f31 | ||
|
|
91a4d3601c | ||
|
|
ea99dd4873 | ||
|
|
34863dbcb6 | ||
|
|
effeb3a0b6 | ||
|
|
86bdcb416a | ||
|
|
665f194f6d | ||
|
|
1378445dc5 | ||
|
|
236be5b60e | ||
|
|
256f4334eb | ||
|
|
28d5ad4292 | ||
|
|
5c169ccd5b | ||
|
|
e05f15d3f6 | ||
|
|
de0cbe1f42 | ||
|
|
fc48a0efdb | ||
|
|
e623c973ee | ||
|
|
8d56287892 | ||
|
|
0950d4288f | ||
|
|
56ea1c4690 | ||
|
|
08d2b6f5a2 | ||
|
|
2cabdde5bd | ||
|
|
3e48a706bd | ||
|
|
7c672e14a1 | ||
|
|
80a3bbac3d | ||
|
|
25f9b826cf | ||
|
|
c478e6af30 | ||
|
|
555a722732 | ||
|
|
6b5f981424 | ||
|
|
e0e614cf21 | ||
|
|
44cc072d98 | ||
|
|
c2c97dae0a | ||
|
|
3978374ccb | ||
|
|
6950daf10a | ||
|
|
7a07e669c9 | ||
|
|
67ece0fcca | ||
|
|
5413e24bd4 | ||
|
|
59b3fc0334 | ||
|
|
2bc72dbdb6 | ||
|
|
15ccf00503 | ||
|
|
b3d73a5523 | ||
|
|
43e6291608 | ||
|
|
09d82f64de | ||
|
|
51ed9fc2bb | ||
|
|
b23ccdcc57 | ||
|
|
147e687bac | ||
|
|
b84cebcb10 | ||
|
|
7374e3bf9a | ||
|
|
413ba90b02 | ||
|
|
2fd61385bd | ||
|
|
822bc9f8d5 | ||
|
|
e53a490606 | ||
|
|
cc53460e7a | ||
|
|
7d6e0488ba | ||
|
|
385a0fb9e5 | ||
|
|
584b79f48c | ||
|
|
92901b1647 | ||
|
|
bcbc4f6d99 | ||
|
|
04dd1260ac | ||
|
|
882f9f6ae4 | ||
|
|
549dc3546b | ||
|
|
25edcf7d9b | ||
|
|
46378fc3db | ||
|
|
f9f5bff4ce | ||
|
|
12b78249c5 | ||
|
|
f8cbc3a551 | ||
|
|
670b984cee | ||
|
|
e677e54ea9 | ||
|
|
928a2589c2 | ||
|
|
45f7a86888 | ||
|
|
0fa7848ab9 | ||
|
|
ae6e49da8f | ||
|
|
e80e22b1fa | ||
|
|
2adefd1cee | ||
|
|
36cbb3159a | ||
|
|
54909116b9 | ||
|
|
4582f6100a | ||
|
|
49a01eca8c | ||
|
|
349df0e181 | ||
|
|
c52116bec1 | ||
|
|
098a18005f | ||
|
|
6dbcd69ecd | ||
|
|
09a6827709 | ||
|
|
dbb1fa6c18 | ||
|
|
cd450bc3b6 | ||
|
|
047195116d | ||
|
|
564f21388b | ||
|
|
c69d7c949e | ||
|
|
dd47b9c3a9 | ||
|
|
ce731cb489 | ||
|
|
f725fdd2d9 | ||
|
|
1aec570c83 | ||
|
|
97b7e15ece | ||
|
|
7cdac5fe66 | ||
|
|
4add175070 | ||
|
|
711cfd2f6b | ||
|
|
6869ee670a | ||
|
|
c4d978cc3b | ||
|
|
1dffc2fbbe | ||
|
|
6b0756cd3a | ||
|
|
fbfa7747e0 | ||
|
|
a7c38dcbf2 | ||
|
|
6b8dd9e8b5 | ||
|
|
c5e7429b3d | ||
|
|
13ccee4e69 | ||
|
|
f9c9ac5ef0 | ||
|
|
10654a0a04 | ||
|
|
0d900dca78 | ||
|
|
bf5846e7f4 | ||
|
|
9fa48c7a25 | ||
|
|
9efb070334 | ||
|
|
85e7dd1150 | ||
|
|
072f162b6e | ||
|
|
9e01b0b75a | ||
|
|
3d7b98d1ee | ||
|
|
62f6900dd2 | ||
|
|
51cf4a88bf | ||
|
|
0dfd38d263 | ||
|
|
66424eee24 | ||
|
|
93adee4b16 | ||
|
|
d7efe2445c | ||
|
|
1bf4c52518 | ||
|
|
8348bf6897 | ||
|
|
7f2192206f | ||
|
|
ddf7636965 | ||
|
|
52514fbb7e | ||
|
|
2c3521561d | ||
|
|
8d6ef5a277 | ||
|
|
726ae7ef98 | ||
|
|
fde974d968 | ||
|
|
eae5e026fa | ||
|
|
5b01743e74 | ||
|
|
2cfc6a5e68 | ||
|
|
0976df1bee | ||
|
|
caa59aea7e | ||
|
|
ab5e0ec3c4 | ||
|
|
f4eda526c5 | ||
|
|
19f347a826 | ||
|
|
7eb84c2fb0 | ||
|
|
a27f3953ab | ||
|
|
4ec162208b | ||
|
|
13482b13d7 | ||
|
|
69c0253862 | ||
|
|
92d8b7b425 | ||
|
|
0ef053dc3d | ||
|
|
fa0bd99bc8 | ||
|
|
68b6ca9fd3 | ||
|
|
cd9b711ee4 | ||
|
|
b05d1652e1 | ||
|
|
d971573db0 | ||
|
|
5a11518c31 | ||
|
|
ce4f41367b | ||
|
|
f553726186 | ||
|
|
1bd746b285 | ||
|
|
82558fda59 | ||
|
|
3f1fe2bf1c | ||
|
|
d00fa80e47 | ||
|
|
dc4805c3b2 | ||
|
|
642fb95209 | ||
|
|
01baf60b2e | ||
|
|
225679f5d3 | ||
|
|
51f16e2213 | ||
|
|
0af23bbacb | ||
|
|
7b446a853c | ||
|
|
df480577ab | ||
|
|
c031cc2af3 | ||
|
|
ae17820d0d | ||
|
|
f2f3900506 | ||
|
|
4c8b92144c | ||
|
|
4c45e16f56 | ||
|
|
53e39724e7 | ||
|
|
849882d868 | ||
|
|
e3f8af83e5 | ||
|
|
18a5559116 | ||
|
|
3c3ecfc698 | ||
|
|
c22f7fec46 | ||
|
|
75d473f6d7 | ||
|
|
5d8f8e248e | ||
|
|
a7c3ea274f | ||
|
|
da324f49d9 | ||
|
|
6fd9223ee9 | ||
|
|
c062d651e8 | ||
|
|
1c264ac5a1 | ||
|
|
8923a4bff6 | ||
|
|
ab4e0cf85f | ||
|
|
8f63e93eba | ||
|
|
c06697f299 | ||
|
|
2590a8d671 | ||
|
|
e4eadc297b | ||
|
|
d0bf351dc1 | ||
|
|
3234cc7d09 | ||
|
|
0158271e6a | ||
|
|
9d50bf2535 | ||
|
|
c8ca2eacc5 | ||
|
|
66699901a7 | ||
|
|
68a33eee2f | ||
|
|
016793d77d | ||
|
|
7b040b659d | ||
|
|
c6db71f383 | ||
|
|
16923c750b | ||
|
|
f57173f43c | ||
|
|
9716d138ea | ||
|
|
8e1b6859f5 | ||
|
|
9751dd0d5f | ||
|
|
e84bd95f49 | ||
|
|
02b76539ab | ||
|
|
c40c33773b | ||
|
|
b0cebf9338 | ||
|
|
674e35dc70 | ||
|
|
d5f42141a0 | ||
|
|
8fb6da7d41 | ||
|
|
d14e77ee7f | ||
|
|
71e8a70717 | ||
|
|
370bdc6e21 | ||
|
|
d2a5d037c1 | ||
|
|
1ffa87d322 | ||
|
|
28ffde7983 | ||
|
|
4655e207a5 | ||
|
|
62a5b216a0 | ||
|
|
79fb9d18ca | ||
|
|
ba5e8fdaeb | ||
|
|
aa31bbab45 | ||
|
|
3c84365d61 | ||
|
|
ae59bd8300 | ||
|
|
b868206e82 | ||
|
|
ddbf971f1f | ||
|
|
483578ba4d | ||
|
|
614cb4413e | ||
|
|
ad43fc2df2 | ||
|
|
aa2a6deb9e | ||
|
|
dcb13bb401 | ||
|
|
5260364e91 | ||
|
|
1938e620bb | ||
|
|
c3fd71dcd4 | ||
|
|
aba191c533 | ||
|
|
847c019aea | ||
|
|
edf05944c1 | ||
|
|
5293876943 | ||
|
|
ca7a702c13 | ||
|
|
4020b4b647 | ||
|
|
650849f4ad | ||
|
|
9098261ac0 | ||
|
|
70c6abbb86 | ||
|
|
23bc5531f0 | ||
|
|
20404458e2 | ||
|
|
31d3ce949d | ||
|
|
61ed224ad0 | ||
|
|
71ea76ee62 | ||
|
|
7a4a0553ca | ||
|
|
cb57fa4a07 | ||
|
|
22bc222689 | ||
|
|
9d96170c42 | ||
|
|
d0f4d21177 | ||
|
|
e9a2167484 | ||
|
|
a8af991a80 | ||
|
|
8bb3a5b7ac | ||
|
|
d0b1efb660 | ||
|
|
4f3259c3b1 | ||
|
|
30b53a90a4 | ||
|
|
cf8377ceec | ||
|
|
ffc7dbc35f | ||
|
|
97fd817db4 | ||
|
|
aa7caaa193 | ||
|
|
a05853ea09 | ||
|
|
2ba96c093d | ||
|
|
ed3df77ca4 | ||
|
|
9ec363d222 | ||
|
|
a090ec2747 | ||
|
|
9fde4fece9 | ||
|
|
596798801a | ||
|
|
dcc87c46b2 | ||
|
|
33fdabaea3 | ||
|
|
35deea863b | ||
|
|
2b2bbbdd55 | ||
|
|
d8cd92c504 | ||
|
|
f6ef2fa97d | ||
|
|
8a86f6a94f | ||
|
|
4b30274915 | ||
|
|
01f7d7cc78 | ||
|
|
616e64110a | ||
|
|
903a72a4e1 | ||
|
|
699c1d4341 | ||
|
|
078a4e8180 | ||
|
|
29232e7052 | ||
|
|
a221f7247c | ||
|
|
c4b5aca463 | ||
|
|
9de4be6661 | ||
|
|
a532dcdd5f | ||
|
|
bde09d2326 | ||
|
|
b36ac68026 | ||
|
|
200a94692e | ||
|
|
3afc3a3302 | ||
|
|
fa52c30462 | ||
|
|
c229936d5c | ||
|
|
70b2fb8c16 | ||
|
|
264613c676 | ||
|
|
61209f967f | ||
|
|
f82de89f3f | ||
|
|
b94a095bef | ||
|
|
c08de3da35 | ||
|
|
748e18fd1b | ||
|
|
c0d7c34018 | ||
|
|
e249ee6e59 | ||
|
|
9eca0153ce | ||
|
|
c4deb0d0b4 | ||
|
|
7ecd86eca7 | ||
|
|
f3312a2417 | ||
|
|
e0558a4a0a | ||
|
|
e2a238e3e3 | ||
|
|
543c62df5a | ||
|
|
382c838d40 | ||
|
|
1a88832efc | ||
|
|
d1f97a3193 | ||
|
|
70a269b662 | ||
|
|
a4ae42fd08 | ||
|
|
6c0161543a | ||
|
|
4519292cc8 | ||
|
|
83993fc2a4 | ||
|
|
5340b04b26 | ||
|
|
2a6003e78f | ||
|
|
bfed03a10e | ||
|
|
d99b20327f | ||
|
|
3a317a8b55 | ||
|
|
0c64ba30b0 | ||
|
|
4400a7e5dd | ||
|
|
45aab853c4 | ||
|
|
b37c13d347 | ||
|
|
d13407494b | ||
|
|
724ab97874 | ||
|
|
15e2fdcf48 | ||
|
|
3a546f9b5a | ||
|
|
291a0f12f1 | ||
|
|
3d62b67bca | ||
|
|
4c31c2b651 | ||
|
|
acdcb2d5da | ||
|
|
43084263ab | ||
|
|
1bbc953462 | ||
|
|
7cef3956e8 | ||
|
|
4904a535d1 | ||
|
|
5db511036e | ||
|
|
8b9023d93d | ||
|
|
0546d1fb12 | ||
|
|
d523ae822d | ||
|
|
9fd781c083 | ||
|
|
8d743dbb59 | ||
|
|
5b3e97c10d | ||
|
|
252a81c9ae | ||
|
|
e6b414a94b | ||
|
|
f521091f8e | ||
|
|
19e112a8a8 | ||
|
|
84dd084dae | ||
|
|
439c1f8716 | ||
|
|
647b713375 | ||
|
|
a2e6b7a4fc | ||
|
|
b06bc71a2c | ||
|
|
367a80c413 | ||
|
|
f49e4bd5d0 | ||
|
|
a74a7e0a9a | ||
|
|
f4946449f3 | ||
|
|
9640732e29 | ||
|
|
6ef5e409da | ||
|
|
bcdfa034f6 | ||
|
|
959267a174 | ||
|
|
767db415d2 | ||
|
|
7ca81aa9f8 | ||
|
|
26bd4c7a90 | ||
|
|
9d29a1d00b | ||
|
|
935608d23d | ||
|
|
4a3000d3c3 | ||
|
|
b5df7042f7 | ||
|
|
a345390b9b | ||
|
|
d0a8c049ba | ||
|
|
56037adcf0 | ||
|
|
73e2fcf3c6 | ||
|
|
710bdea813 | ||
|
|
f07ba35310 | ||
|
|
9ef2163bc0 | ||
|
|
1f53a56b8f | ||
|
|
6998b63f59 | ||
|
|
dccddf3ebc | ||
|
|
2a7d076407 | ||
|
|
0e82b17f6b | ||
|
|
0aa7838fc5 | ||
|
|
b1d243896f | ||
|
|
ab70c2c041 | ||
|
|
22b6c5ace0 | ||
|
|
ad32579214 | ||
|
|
e525cc3708 | ||
|
|
db7eaacd14 | ||
|
|
a549daf9ab | ||
|
|
d9e65ce633 | ||
|
|
be2d33591d | ||
|
|
88897004a2 | ||
|
|
dceccf00fa | ||
|
|
f079a2b9e6 | ||
|
|
4044d705d6 | ||
|
|
a2cbe4e241 | ||
|
|
b509b57bb8 | ||
|
|
4a7f27a372 | ||
|
|
214ac678d3 | ||
|
|
9dabce1b7a | ||
|
|
9bc260847d | ||
|
|
229775935e | ||
|
|
668c35ba2e | ||
|
|
a808913049 | ||
|
|
54da185280 | ||
|
|
b1bc7bfde4 | ||
|
|
09d5ce0e1a | ||
|
|
3935446071 | ||
|
|
2463dcb2db | ||
|
|
0eb239a469 | ||
|
|
b865caae7a | ||
|
|
a3e25723af | ||
|
|
bae0338c36 | ||
|
|
f656f23836 | ||
|
|
a8a79162e4 | ||
|
|
04556835b0 | ||
|
|
84c5e50199 | ||
|
|
06fd44ecaf | ||
|
|
c535b68056 | ||
|
|
34c8e4fdec | ||
|
|
bf04796637 | ||
|
|
16e6c0c601 | ||
|
|
75a733e9b8 | ||
|
|
30217a64ec | ||
|
|
488295e303 | ||
|
|
973131b70a | ||
|
|
52cb00a1c4 | ||
|
|
ab0027a042 | ||
|
|
26a6d12809 | ||
|
|
0bdf74cab2 | ||
|
|
dd996539bc | ||
|
|
ad2ee2b0d6 | ||
|
|
ed6630c2d6 | ||
|
|
3af9121d6a | ||
|
|
e9d5a560ff | ||
|
|
d87b6da7c5 | ||
|
|
34d6c8edbe | ||
|
|
e9f63fb1e2 | ||
|
|
7a515f7ad8 | ||
|
|
4564baae70 | ||
|
|
4316fdbf81 | ||
|
|
be98736f4e | ||
|
|
ce7e10e3d9 | ||
|
|
21683de677 | ||
|
|
4dddec9966 | ||
|
|
b79a287791 | ||
|
|
6bd4b7257d | ||
|
|
438f8f4b6f | ||
|
|
75c1fedfba | ||
|
|
731a8e8b8f | ||
|
|
74768efea1 | ||
|
|
716d05b105 | ||
|
|
8ea7b26299 | ||
|
|
1538852bc4 | ||
|
|
a85607b996 | ||
|
|
a53db3b673 | ||
|
|
f6ec592cb6 | ||
|
|
d2e82fe50e | ||
|
|
30cb030470 | ||
|
|
3b84f5cece | ||
|
|
7f84f5c34d | ||
|
|
47b42d92c1 | ||
|
|
1928244a8e | ||
|
|
c3af14c3fe | ||
|
|
324666bafe | ||
|
|
8d4862f39f | ||
|
|
8c42627d46 | ||
|
|
590caa0563 | ||
|
|
15ac2bf749 | ||
|
|
d98103ca94 | ||
|
|
f8a6354fb4 | ||
|
|
c7cb3b3b20 | ||
|
|
978998b3f8 | ||
|
|
738e464c1e | ||
|
|
8882d62eac | ||
|
|
90cd819b0a | ||
|
|
a6873c687a | ||
|
|
4b54bd6b91 | ||
|
|
eaf2cbcb71 | ||
|
|
d9a1876ad4 | ||
|
|
c09f75faf0 | ||
|
|
674e32b95b | ||
|
|
84cab49386 | ||
|
|
479b83f6bf | ||
|
|
81ed9e0fc1 | ||
|
|
1f162461ad | ||
|
|
ad4f901e2f | ||
|
|
a885e2e8a8 | ||
|
|
8f11156011 | ||
|
|
1ef1101134 | ||
|
|
5664ad48dd | ||
|
|
e2608f56db | ||
|
|
78df267145 | ||
|
|
20e7e68e71 | ||
|
|
877d69f22e | ||
|
|
0791029f4a | ||
|
|
69c91a2c41 | ||
|
|
499d28c34c | ||
|
|
ec57a9ddbc | ||
|
|
e59db99b22 | ||
|
|
aaa3c4f602 | ||
|
|
29842c06e3 | ||
|
|
402ccf01d0 | ||
|
|
b7114304ee | ||
|
|
dca72856a2 | ||
|
|
1d7c758096 | ||
|
|
1e748365a5 | ||
|
|
a8022762a2 | ||
|
|
9c1ed659e9 | ||
|
|
42accb4204 | ||
|
|
529e5954d4 | ||
|
|
75ea34ef9e | ||
|
|
c4e1b8d97d | ||
|
|
b5626ef352 | ||
|
|
692d15159c | ||
|
|
91c163af9e | ||
|
|
fe71be64dd | ||
|
|
9e6587cb62 | ||
|
|
42b2f58d6a | ||
|
|
98afb63880 | ||
|
|
6d352c8579 | ||
|
|
21b761ddbf | ||
|
|
e51009e94d | ||
|
|
619136c9da | ||
|
|
d622334bd3 | ||
|
|
5508bf6302 | ||
|
|
4ba9151400 | ||
|
|
97fe212d15 | ||
|
|
af3738924e | ||
|
|
92f77c7ce2 | ||
|
|
ecb54381d8 | ||
|
|
0a9435ef1a | ||
|
|
2bc52c7b5d | ||
|
|
392b6dda9a | ||
|
|
0a6035ed65 | ||
|
|
70f9444aab | ||
|
|
088333c91c | ||
|
|
7fc7276207 | ||
|
|
631bf12c23 | ||
|
|
5ce158ebf3 | ||
|
|
4684f25f22 | ||
|
|
3d36d86bd6 | ||
|
|
93c017dbab | ||
|
|
c74204ed1f | ||
|
|
80125f500c | ||
|
|
2771efcd87 | ||
|
|
0e27802f1a | ||
|
|
a96c270a94 | ||
|
|
66d76676f5 | ||
|
|
cc0eb6a4b9 | ||
|
|
2d687a3275 | ||
|
|
47bca3fb9b | ||
|
|
79d3548492 | ||
|
|
3156302dbc | ||
|
|
84307250b7 | ||
|
|
c3986bd66a | ||
|
|
a4a56bf2c7 | ||
|
|
6644523c54 | ||
|
|
44aa046fec | ||
|
|
da5b9b4955 | ||
|
|
81dd803b62 | ||
|
|
efffa82cbf | ||
|
|
64b0c9f137 | ||
|
|
a3661e1626 | ||
|
|
4115deadc4 | ||
|
|
6fbd112964 | ||
|
|
a171c52c8d | ||
|
|
4f7d3ed2be | ||
|
|
9db97b3919 | ||
|
|
8bc545c90f | ||
|
|
19d1629e37 | ||
|
|
e7fd472c14 | ||
|
|
dd4a1416fc | ||
|
|
09b65b9a5b | ||
|
|
8fb1a1daf9 | ||
|
|
d3d0dedfee | ||
|
|
46635f4251 | ||
|
|
1068a5d96e | ||
|
|
d1e200a54f | ||
|
|
8220b0356c | ||
|
|
bc9b09aed5 | ||
|
|
9a935c4e90 | ||
|
|
6137199e63 | ||
|
|
6e6d989be4 |
@@ -33,6 +33,15 @@ stop
|
||||
|
||||
nohup.out*
|
||||
|
||||
# Large directories not needed for Docker builds
|
||||
E2E/playwright-report
|
||||
E2E/test-results
|
||||
Terraform
|
||||
HelmChart
|
||||
Scripts
|
||||
.git
|
||||
GoSDK
|
||||
|
||||
encrypted-credentials.tar
|
||||
encrypted-credentials/
|
||||
|
||||
|
||||
16
.github/workflows/compile.yml
vendored
16
.github/workflows/compile.yml
vendored
@@ -389,6 +389,22 @@ jobs:
|
||||
max_attempts: 3
|
||||
command: cd MCP && npm update @oneuptime/common && npm install && npm run compile && npm run dep-check
|
||||
|
||||
compile-mobile-app:
|
||||
runs-on: ubuntu-latest
|
||||
env:
|
||||
CI_PIPELINE_ID: ${{github.run_number}}
|
||||
steps:
|
||||
- uses: actions/checkout@v4
|
||||
- uses: actions/setup-node@v4
|
||||
with:
|
||||
node-version: latest
|
||||
- name: Compile MobileApp
|
||||
uses: nick-fields/retry@v3
|
||||
with:
|
||||
timeout_minutes: 30
|
||||
max_attempts: 3
|
||||
command: cd MobileApp && npm install && npm run compile
|
||||
|
||||
compile-ai-agent:
|
||||
runs-on: ubuntu-latest
|
||||
env:
|
||||
|
||||
141
.github/workflows/release.yml
vendored
141
.github/workflows/release.yml
vendored
@@ -1701,7 +1701,7 @@ jobs:
|
||||
- name: Setup Go
|
||||
uses: actions/setup-go@v5
|
||||
with:
|
||||
go-version: '1.21'
|
||||
go-version: 'stable'
|
||||
cache: true
|
||||
|
||||
- name: Install GoReleaser
|
||||
@@ -2200,6 +2200,145 @@ jobs:
|
||||
tag_name: ${{needs.read-version.outputs.major_minor}}
|
||||
|
||||
|
||||
# Build Android release APK and attach to GitHub Release.
|
||||
# Required secrets setup guide: MobileApp/docs/RELEASE_SIGNING.md
|
||||
mobile-app-android-deploy:
|
||||
needs: [draft-github-release, generate-build-number, read-version]
|
||||
runs-on: ubuntu-latest
|
||||
steps:
|
||||
- uses: actions/checkout@v4
|
||||
with:
|
||||
ref: ${{ github.ref }}
|
||||
|
||||
- name: Setup Java 17
|
||||
uses: actions/setup-java@v4
|
||||
with:
|
||||
distribution: 'temurin'
|
||||
java-version: '17'
|
||||
|
||||
- uses: actions/setup-node@v4
|
||||
with:
|
||||
node-version: latest
|
||||
|
||||
- name: Install dependencies
|
||||
run: cd MobileApp && npm install
|
||||
|
||||
- name: Decode Android keystore
|
||||
run: |
|
||||
echo "${{ secrets.ANDROID_KEYSTORE_BASE64 }}" | base64 --decode > /tmp/release.keystore
|
||||
|
||||
- name: Build release APK
|
||||
env:
|
||||
ANDROID_KEYSTORE_FILE: /tmp/release.keystore
|
||||
ANDROID_KEYSTORE_PASSWORD: ${{ secrets.ANDROID_KEYSTORE_PASSWORD }}
|
||||
ANDROID_KEY_ALIAS: ${{ secrets.ANDROID_KEY_ALIAS }}
|
||||
ANDROID_KEY_PASSWORD: ${{ secrets.ANDROID_KEY_PASSWORD }}
|
||||
run: |
|
||||
cd MobileApp/android
|
||||
./gradlew assembleRelease \
|
||||
-PversionName=${{ needs.read-version.outputs.major_minor }} \
|
||||
-PversionCode=${{ needs.generate-build-number.outputs.build_number }}
|
||||
|
||||
- name: Upload APK to GitHub Release
|
||||
uses: softprops/action-gh-release@v2
|
||||
with:
|
||||
files: MobileApp/android/app/build/outputs/apk/release/*.apk
|
||||
token: ${{ secrets.GITHUB_TOKEN }}
|
||||
draft: true
|
||||
prerelease: false
|
||||
tag_name: ${{ needs.read-version.outputs.major_minor }}
|
||||
|
||||
# Build iOS release IPA and attach to GitHub Release.
|
||||
# Required secrets setup guide: MobileApp/docs/RELEASE_SIGNING.md
|
||||
mobile-app-ios-deploy:
|
||||
needs: [draft-github-release, generate-build-number, read-version]
|
||||
runs-on: macos-latest
|
||||
steps:
|
||||
- uses: actions/checkout@v4
|
||||
with:
|
||||
ref: ${{ github.ref }}
|
||||
|
||||
- uses: actions/setup-node@v4
|
||||
with:
|
||||
node-version: latest
|
||||
|
||||
- name: Install dependencies
|
||||
run: cd MobileApp && npm install
|
||||
|
||||
- name: Install CocoaPods dependencies
|
||||
run: cd MobileApp/ios && pod install
|
||||
|
||||
- name: Import signing certificate
|
||||
env:
|
||||
IOS_DISTRIBUTION_CERTIFICATE_BASE64: ${{ secrets.IOS_DISTRIBUTION_CERTIFICATE_BASE64 }}
|
||||
IOS_DISTRIBUTION_CERTIFICATE_PASSWORD: ${{ secrets.IOS_DISTRIBUTION_CERTIFICATE_PASSWORD }}
|
||||
run: |
|
||||
CERTIFICATE_PATH=$RUNNER_TEMP/distribution.p12
|
||||
KEYCHAIN_PATH=$RUNNER_TEMP/app-signing.keychain-db
|
||||
KEYCHAIN_PASSWORD=$(openssl rand -base64 32)
|
||||
|
||||
echo "$IOS_DISTRIBUTION_CERTIFICATE_BASE64" | base64 --decode > "$CERTIFICATE_PATH"
|
||||
|
||||
security create-keychain -p "$KEYCHAIN_PASSWORD" "$KEYCHAIN_PATH"
|
||||
security set-keychain-settings -lut 21600 "$KEYCHAIN_PATH"
|
||||
security unlock-keychain -p "$KEYCHAIN_PASSWORD" "$KEYCHAIN_PATH"
|
||||
|
||||
security import "$CERTIFICATE_PATH" -P "$IOS_DISTRIBUTION_CERTIFICATE_PASSWORD" \
|
||||
-A -t cert -f pkcs12 -k "$KEYCHAIN_PATH"
|
||||
security set-key-partition-list -S apple-tool:,apple: -k "$KEYCHAIN_PASSWORD" "$KEYCHAIN_PATH"
|
||||
security list-keychain -d user -s "$KEYCHAIN_PATH"
|
||||
|
||||
- name: Install provisioning profile
|
||||
env:
|
||||
IOS_PROVISIONING_PROFILE_BASE64: ${{ secrets.IOS_PROVISIONING_PROFILE_BASE64 }}
|
||||
run: |
|
||||
PROFILE_PATH=$RUNNER_TEMP/profile.mobileprovision
|
||||
echo "$IOS_PROVISIONING_PROFILE_BASE64" | base64 --decode > "$PROFILE_PATH"
|
||||
|
||||
mkdir -p ~/Library/MobileDevice/Provisioning\ Profiles
|
||||
cp "$PROFILE_PATH" ~/Library/MobileDevice/Provisioning\ Profiles/
|
||||
|
||||
- name: Build archive
|
||||
run: |
|
||||
cd MobileApp
|
||||
xcodebuild -workspace ios/OneUptime.xcworkspace \
|
||||
-scheme OneUptime \
|
||||
-configuration Release \
|
||||
-sdk iphoneos \
|
||||
-archivePath $RUNNER_TEMP/OneUptime.xcarchive \
|
||||
archive \
|
||||
MARKETING_VERSION=${{ needs.read-version.outputs.major_minor }} \
|
||||
CURRENT_PROJECT_VERSION=${{ needs.generate-build-number.outputs.build_number }}
|
||||
|
||||
- name: Prepare ExportOptions.plist with team ID
|
||||
env:
|
||||
IOS_TEAM_ID: ${{ secrets.IOS_TEAM_ID }}
|
||||
run: |
|
||||
/usr/libexec/PlistBuddy -c "Add :teamID string $IOS_TEAM_ID" MobileApp/ios/ExportOptions.plist || \
|
||||
/usr/libexec/PlistBuddy -c "Set :teamID $IOS_TEAM_ID" MobileApp/ios/ExportOptions.plist
|
||||
|
||||
- name: Export IPA
|
||||
run: |
|
||||
cd MobileApp
|
||||
xcodebuild -exportArchive \
|
||||
-archivePath $RUNNER_TEMP/OneUptime.xcarchive \
|
||||
-exportOptionsPlist ios/ExportOptions.plist \
|
||||
-exportPath $RUNNER_TEMP/build
|
||||
|
||||
- name: Upload IPA to GitHub Release
|
||||
uses: softprops/action-gh-release@v2
|
||||
with:
|
||||
files: ${{ runner.temp }}/build/*.ipa
|
||||
token: ${{ secrets.GITHUB_TOKEN }}
|
||||
draft: true
|
||||
prerelease: false
|
||||
tag_name: ${{ needs.read-version.outputs.major_minor }}
|
||||
|
||||
- name: Cleanup keychain
|
||||
if: always()
|
||||
run: |
|
||||
security delete-keychain $RUNNER_TEMP/app-signing.keychain-db || true
|
||||
|
||||
finalize-github-release:
|
||||
name: Publish GitHub release
|
||||
needs: [infrastructure-agent-deploy, generate-build-number, read-version]
|
||||
|
||||
84
.github/workflows/terraform-provider-e2e.yml
vendored
84
.github/workflows/terraform-provider-e2e.yml
vendored
@@ -15,7 +15,7 @@ on:
|
||||
jobs:
|
||||
terraform-e2e-tests:
|
||||
runs-on: ubuntu-latest
|
||||
timeout-minutes: 60
|
||||
timeout-minutes: 120
|
||||
env:
|
||||
CI_PIPELINE_ID: ${{ github.run_number }}
|
||||
APP_TAG: latest
|
||||
@@ -34,16 +34,84 @@ jobs:
|
||||
|
||||
- name: Additional Disk Cleanup
|
||||
run: |
|
||||
echo "=== Initial disk space ==="
|
||||
df -h
|
||||
|
||||
echo "=== Removing unnecessary tools and libraries ==="
|
||||
# Remove Android SDK (if not already removed)
|
||||
sudo rm -rf /usr/local/lib/android || true
|
||||
sudo rm -rf /opt/ghc || true
|
||||
|
||||
# Remove .NET SDK and runtime
|
||||
sudo rm -rf /usr/share/dotnet || true
|
||||
sudo rm -rf /etc/skel/.dotnet || true
|
||||
|
||||
# Remove Haskell/GHC
|
||||
sudo rm -rf /opt/ghc || true
|
||||
sudo rm -rf /usr/local/.ghcup || true
|
||||
|
||||
# Remove CodeQL
|
||||
sudo rm -rf /opt/hostedtoolcache/CodeQL || true
|
||||
|
||||
# Remove Boost
|
||||
sudo rm -rf /usr/local/share/boost || true
|
||||
|
||||
# Remove Swift
|
||||
sudo rm -rf /usr/share/swift || true
|
||||
|
||||
# Remove Julia
|
||||
sudo rm -rf /usr/local/julia* || true
|
||||
|
||||
# Remove Rust (cargo/rustup)
|
||||
sudo rm -rf /usr/share/rust || true
|
||||
sudo rm -rf /home/runner/.rustup || true
|
||||
sudo rm -rf /home/runner/.cargo || true
|
||||
|
||||
# Remove unnecessary hostedtoolcache items
|
||||
sudo rm -rf /opt/hostedtoolcache/Python || true
|
||||
sudo rm -rf /opt/hostedtoolcache/PyPy || true
|
||||
sudo rm -rf /opt/hostedtoolcache/Ruby || true
|
||||
sudo rm -rf /opt/hostedtoolcache/Java* || true
|
||||
|
||||
# Remove additional large directories
|
||||
sudo rm -rf /usr/share/miniconda || true
|
||||
sudo rm -rf /usr/local/graalvm || true
|
||||
sudo rm -rf /usr/local/share/chromium || true
|
||||
sudo rm -rf /usr/local/share/powershell || true
|
||||
sudo rm -rf /usr/share/az_* || true
|
||||
|
||||
# Remove documentation
|
||||
sudo rm -rf /usr/share/doc || true
|
||||
sudo rm -rf /usr/share/man || true
|
||||
|
||||
# Remove unnecessary locales
|
||||
sudo rm -rf /usr/share/locale || true
|
||||
|
||||
# Clean apt cache
|
||||
sudo apt-get clean || true
|
||||
sudo rm -rf /var/lib/apt/lists/* || true
|
||||
sudo rm -rf /var/cache/apt/archives/* || true
|
||||
|
||||
# Clean tmp
|
||||
sudo rm -rf /tmp/* || true
|
||||
|
||||
echo "=== Moving Docker data to /mnt for more space ==="
|
||||
# Stop docker
|
||||
sudo systemctl stop docker || true
|
||||
|
||||
# Move docker data directory to /mnt (which has ~70GB)
|
||||
sudo mv /var/lib/docker /mnt/docker || true
|
||||
sudo mkdir -p /var/lib/docker || true
|
||||
sudo mount --bind /mnt/docker /var/lib/docker || true
|
||||
|
||||
# Restart docker
|
||||
sudo systemctl start docker || true
|
||||
|
||||
echo "=== Final disk space ==="
|
||||
df -h
|
||||
|
||||
echo "=== Docker info ==="
|
||||
docker info | grep -E "Docker Root Dir|Storage Driver" || true
|
||||
|
||||
- name: Checkout code
|
||||
uses: actions/checkout@v4
|
||||
|
||||
@@ -56,7 +124,7 @@ jobs:
|
||||
- name: Setup Go
|
||||
uses: actions/setup-go@v5
|
||||
with:
|
||||
go-version: '1.21'
|
||||
go-version: 'stable'
|
||||
cache: true
|
||||
|
||||
- name: Setup Terraform
|
||||
@@ -66,6 +134,10 @@ jobs:
|
||||
terraform_wrapper: false
|
||||
|
||||
- name: Run E2E Tests
|
||||
run: |
|
||||
chmod +x ./E2E/Terraform/e2e-tests/scripts/*.sh
|
||||
./E2E/Terraform/e2e-tests/scripts/index.sh
|
||||
uses: nick-fields/retry@v3
|
||||
with:
|
||||
timeout_minutes: 60
|
||||
max_attempts: 3
|
||||
command: |
|
||||
chmod +x ./E2E/Terraform/e2e-tests/scripts/*.sh
|
||||
./E2E/Terraform/e2e-tests/scripts/index.sh
|
||||
|
||||
@@ -28,7 +28,7 @@ jobs:
|
||||
- name: Setup Go
|
||||
uses: actions/setup-go@v5
|
||||
with:
|
||||
go-version: '1.21'
|
||||
go-version: 'stable'
|
||||
cache: true
|
||||
|
||||
- name: Install Common dependencies
|
||||
|
||||
39
.github/workflows/test.mobile-app.yaml
vendored
Normal file
39
.github/workflows/test.mobile-app.yaml
vendored
Normal file
@@ -0,0 +1,39 @@
|
||||
name: MobileApp Test
|
||||
|
||||
on:
|
||||
pull_request:
|
||||
push:
|
||||
branches-ignore:
|
||||
- 'hotfix-*' # excludes hotfix branches
|
||||
- 'release'
|
||||
|
||||
jobs:
|
||||
expo-doctor:
|
||||
runs-on: ubuntu-latest
|
||||
env:
|
||||
CI_PIPELINE_ID: ${{github.run_number}}
|
||||
steps:
|
||||
- uses: actions/checkout@v4
|
||||
- uses: actions/setup-node@v4
|
||||
with:
|
||||
node-version: latest
|
||||
- run: cd MobileApp && npm install
|
||||
- name: Run Expo Doctor
|
||||
run: cd MobileApp && npx expo-doctor@latest
|
||||
|
||||
expo-web-export:
|
||||
runs-on: ubuntu-latest
|
||||
env:
|
||||
CI_PIPELINE_ID: ${{github.run_number}}
|
||||
steps:
|
||||
- uses: actions/checkout@v4
|
||||
- uses: actions/setup-node@v4
|
||||
with:
|
||||
node-version: latest
|
||||
- run: cd MobileApp && npm install
|
||||
- name: Export Web Bundle
|
||||
uses: nick-fields/retry@v3
|
||||
with:
|
||||
timeout_minutes: 30
|
||||
max_attempts: 3
|
||||
command: cd MobileApp && npx expo export --platform web
|
||||
12
AIAgent/package-lock.json
generated
12
AIAgent/package-lock.json
generated
@@ -73,6 +73,7 @@
|
||||
"ejs": "^3.1.10",
|
||||
"elkjs": "^0.10.0",
|
||||
"esbuild": "^0.25.5",
|
||||
"expo-server-sdk": "^3.15.0",
|
||||
"express": "^4.21.1",
|
||||
"formik": "^2.4.6",
|
||||
"history": "^5.3.0",
|
||||
@@ -82,6 +83,7 @@
|
||||
"jsonwebtoken": "^9.0.0",
|
||||
"jwt-decode": "^4.0.0",
|
||||
"marked": "^12.0.2",
|
||||
"mermaid": "^11.12.2",
|
||||
"moment": "^2.30.1",
|
||||
"moment-timezone": "^0.5.45",
|
||||
"multer": "^2.0.2",
|
||||
@@ -101,7 +103,7 @@
|
||||
"react-dropzone": "^14.2.2",
|
||||
"react-error-boundary": "^4.0.13",
|
||||
"react-highlight": "^0.15.0",
|
||||
"react-markdown": "^8.0.3",
|
||||
"react-markdown": "^9.0.0",
|
||||
"react-router-dom": "^6.30.1",
|
||||
"react-select": "^5.4.0",
|
||||
"react-spinners": "^0.14.1",
|
||||
@@ -111,7 +113,7 @@
|
||||
"recharts": "^2.12.7",
|
||||
"redis-semaphore": "^5.5.1",
|
||||
"reflect-metadata": "^0.2.2",
|
||||
"remark-gfm": "^3.0.1",
|
||||
"remark-gfm": "^4.0.0",
|
||||
"slackify-markdown": "^4.4.0",
|
||||
"slugify": "^1.6.5",
|
||||
"socket.io": "^4.7.4",
|
||||
@@ -1808,9 +1810,9 @@
|
||||
}
|
||||
},
|
||||
"node_modules/diff": {
|
||||
"version": "4.0.2",
|
||||
"resolved": "https://registry.npmjs.org/diff/-/diff-4.0.2.tgz",
|
||||
"integrity": "sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A==",
|
||||
"version": "4.0.4",
|
||||
"resolved": "https://registry.npmjs.org/diff/-/diff-4.0.4.tgz",
|
||||
"integrity": "sha512-X07nttJQkwkfKfvTPG/KSnE2OMdcUCao6+eXF3wmnIQRn2aPAHH3VxDbDOdegkd6JbPsXqShpvEOHfAT+nCNwQ==",
|
||||
"license": "BSD-3-Clause",
|
||||
"engines": {
|
||||
"node": ">=0.3.1"
|
||||
|
||||
@@ -1,5 +1,6 @@
|
||||
import AuthenticationServiceHandler from "./Service/Authentication";
|
||||
import DataTypeServiceHandler from "./Service/DataType";
|
||||
import DataTypeDetailServiceHandler from "./Service/DataTypeDetail";
|
||||
import ErrorServiceHandler from "./Service/Errors";
|
||||
import OpenAPIServiceHandler from "./Service/OpenAPI";
|
||||
import IntroductionServiceHandler from "./Service/Introduction";
|
||||
@@ -10,6 +11,7 @@ import PermissionServiceHandler from "./Service/Permissions";
|
||||
import StatusServiceHandler from "./Service/Status";
|
||||
import { StaticPath } from "./Utils/Config";
|
||||
import ResourceUtil, { ModelDocumentation } from "./Utils/Resources";
|
||||
import DataTypeUtil, { DataTypeDocumentation } from "./Utils/DataTypes";
|
||||
import Dictionary from "Common/Types/Dictionary";
|
||||
import FeatureSet from "Common/Server/Types/FeatureSet";
|
||||
import Express, {
|
||||
@@ -24,6 +26,9 @@ const APIReferenceFeatureSet: FeatureSet = {
|
||||
const ResourceDictionary: Dictionary<ModelDocumentation> =
|
||||
ResourceUtil.getResourceDictionaryByPath();
|
||||
|
||||
const DataTypeDictionary: Dictionary<DataTypeDocumentation> =
|
||||
DataTypeUtil.getDataTypeDictionaryByPath();
|
||||
|
||||
const app: ExpressApplication = Express.getExpressApp();
|
||||
|
||||
// Serve static files for the API reference with a cache max age of 30 days
|
||||
@@ -72,6 +77,8 @@ const APIReferenceFeatureSet: FeatureSet = {
|
||||
return StatusServiceHandler.executeResponse(req, res);
|
||||
} else if (req.params["page"] === "data-types") {
|
||||
return DataTypeServiceHandler.executeResponse(req, res);
|
||||
} else if (DataTypeDictionary[page]) {
|
||||
return DataTypeDetailServiceHandler.executeResponse(req, res);
|
||||
} else if (currentResource) {
|
||||
return ModelServiceHandler.executeResponse(req, res);
|
||||
}
|
||||
|
||||
@@ -1,11 +1,13 @@
|
||||
import { IsBillingEnabled } from "Common/Server/EnvironmentConfig";
|
||||
import { ViewsPath } from "../Utils/Config";
|
||||
import ResourceUtil, { ModelDocumentation } from "../Utils/Resources";
|
||||
import DataTypeUtil, { DataTypeDocumentation } from "../Utils/DataTypes";
|
||||
import { ExpressRequest, ExpressResponse } from "Common/Server/Utils/Express";
|
||||
import Dictionary from "Common/Types/Dictionary";
|
||||
|
||||
// Retrieve resources documentation
|
||||
const Resources: Array<ModelDocumentation> = ResourceUtil.getResources();
|
||||
const DataTypes: Array<DataTypeDocumentation> = DataTypeUtil.getDataTypes();
|
||||
|
||||
export default class ServiceHandler {
|
||||
public static async executeResponse(
|
||||
@@ -27,6 +29,7 @@ export default class ServiceHandler {
|
||||
return res.render(`${ViewsPath}/pages/index`, {
|
||||
page: page,
|
||||
resources: Resources,
|
||||
dataTypes: DataTypes,
|
||||
pageTitle: pageTitle,
|
||||
enableGoogleTagManager: IsBillingEnabled,
|
||||
pageDescription: pageDescription,
|
||||
|
||||
@@ -1,12 +1,14 @@
|
||||
import { IsBillingEnabled } from "Common/Server/EnvironmentConfig";
|
||||
import { CodeExamplesPath, ViewsPath } from "../Utils/Config";
|
||||
import ResourceUtil, { ModelDocumentation } from "../Utils/Resources";
|
||||
import DataTypeUtil, { DataTypeDocumentation } from "../Utils/DataTypes";
|
||||
import LocalCache from "Common/Server/Infrastructure/LocalCache";
|
||||
import { ExpressRequest, ExpressResponse } from "Common/Server/Utils/Express";
|
||||
import LocalFile from "Common/Server/Utils/LocalFile";
|
||||
import Dictionary from "Common/Types/Dictionary";
|
||||
|
||||
const Resources: Array<ModelDocumentation> = ResourceUtil.getResources();
|
||||
const DataTypes: Array<DataTypeDocumentation> = DataTypeUtil.getDataTypes();
|
||||
|
||||
export default class ServiceHandler {
|
||||
public static async executeResponse(
|
||||
@@ -153,6 +155,7 @@ export default class ServiceHandler {
|
||||
pageDescription:
|
||||
"Data Types that can be used to interact with OneUptime API",
|
||||
resources: Resources,
|
||||
dataTypes: DataTypes,
|
||||
pageData: pageData,
|
||||
});
|
||||
}
|
||||
|
||||
3226
APIReference/Service/DataTypeDetail.ts
Normal file
3226
APIReference/Service/DataTypeDetail.ts
Normal file
File diff suppressed because it is too large
Load Diff
@@ -1,11 +1,13 @@
|
||||
import { IsBillingEnabled } from "Common/Server/EnvironmentConfig";
|
||||
import { ViewsPath } from "../Utils/Config";
|
||||
import ResourceUtil, { ModelDocumentation } from "../Utils/Resources";
|
||||
import DataTypeUtil, { DataTypeDocumentation } from "../Utils/DataTypes";
|
||||
import { ExpressRequest, ExpressResponse } from "Common/Server/Utils/Express";
|
||||
import Dictionary from "Common/Types/Dictionary";
|
||||
|
||||
// Fetch a list of resources used in the application
|
||||
const Resources: Array<ModelDocumentation> = ResourceUtil.getResources();
|
||||
const DataTypes: Array<DataTypeDocumentation> = DataTypeUtil.getDataTypes();
|
||||
|
||||
export default class ServiceHandler {
|
||||
// Handles the HTTP response for a given request
|
||||
@@ -28,6 +30,7 @@ export default class ServiceHandler {
|
||||
return res.render(`${ViewsPath}/pages/index`, {
|
||||
page: page,
|
||||
resources: Resources,
|
||||
dataTypes: DataTypes,
|
||||
pageTitle: pageTitle,
|
||||
enableGoogleTagManager: IsBillingEnabled,
|
||||
pageDescription: pageDescription,
|
||||
|
||||
@@ -1,11 +1,13 @@
|
||||
import { IsBillingEnabled } from "Common/Server/EnvironmentConfig";
|
||||
import { ViewsPath } from "../Utils/Config";
|
||||
import ResourceUtil, { ModelDocumentation } from "../Utils/Resources";
|
||||
import DataTypeUtil, { DataTypeDocumentation } from "../Utils/DataTypes";
|
||||
import { ExpressRequest, ExpressResponse } from "Common/Server/Utils/Express";
|
||||
import Dictionary from "Common/Types/Dictionary";
|
||||
|
||||
// Get all resources and featured resources from ResourceUtil
|
||||
const Resources: Array<ModelDocumentation> = ResourceUtil.getResources();
|
||||
const DataTypes: Array<DataTypeDocumentation> = DataTypeUtil.getDataTypes();
|
||||
const FeaturedResources: Array<ModelDocumentation> =
|
||||
ResourceUtil.getFeaturedResources();
|
||||
|
||||
@@ -34,6 +36,7 @@ export default class ServiceHandler {
|
||||
return res.render(`${ViewsPath}/pages/index`, {
|
||||
page: page,
|
||||
resources: Resources,
|
||||
dataTypes: DataTypes,
|
||||
pageTitle: pageTitle,
|
||||
enableGoogleTagManager: IsBillingEnabled,
|
||||
pageDescription: pageDescription,
|
||||
|
||||
@@ -3,8 +3,10 @@ import CodeExampleGenerator, {
|
||||
CodeExamples,
|
||||
} from "../Utils/CodeExampleGenerator";
|
||||
import ResourceUtil, { ModelDocumentation } from "../Utils/Resources";
|
||||
import DataTypeUtil, { DataTypeDocumentation } from "../Utils/DataTypes";
|
||||
import PageNotFoundServiceHandler from "./PageNotFound";
|
||||
import { AppApiRoute } from "Common/ServiceRoute";
|
||||
import BaseModel from "Common/Models/DatabaseModels/DatabaseBaseModel/DatabaseBaseModel";
|
||||
import { ColumnAccessControl } from "Common/Types/BaseDatabase/AccessControl";
|
||||
import {
|
||||
getTableColumns,
|
||||
@@ -314,9 +316,13 @@ function generateApiCodeExamples(
|
||||
|
||||
// Get all resources and resource dictionary
|
||||
const Resources: Array<ModelDocumentation> = ResourceUtil.getResources();
|
||||
const DataTypes: Array<DataTypeDocumentation> = DataTypeUtil.getDataTypes();
|
||||
const ResourceDictionary: Dictionary<ModelDocumentation> =
|
||||
ResourceUtil.getResourceDictionaryByPath();
|
||||
|
||||
// Dynamically built from DataTypes registry — no manual updates needed when new types are added
|
||||
const TypeToDocPath: Dictionary<string> = DataTypeUtil.getTypeToDocPathMap();
|
||||
|
||||
// Get all permission props
|
||||
const PermissionDictionary: Dictionary<PermissionProps> =
|
||||
PermissionHelper.getAllPermissionPropsAsDictionary();
|
||||
@@ -392,6 +398,32 @@ export default class ServiceHandler {
|
||||
delete tableColumns["deletedByUser"];
|
||||
delete tableColumns["version"];
|
||||
|
||||
// For columns with a modelType (Entity/EntityArray), resolve the related model's documentation path
|
||||
for (const key in tableColumns) {
|
||||
const column: TableColumnMetadata | undefined = tableColumns[key];
|
||||
if (column?.modelType) {
|
||||
try {
|
||||
const relatedModelInstance: BaseModel = new column.modelType();
|
||||
if (relatedModelInstance.enableDocumentation) {
|
||||
(column as any).modelDocumentationPath =
|
||||
relatedModelInstance.getAPIDocumentationPath();
|
||||
(column as any).modelName = relatedModelInstance.singularName;
|
||||
}
|
||||
} catch {
|
||||
// If model instantiation fails, skip linking
|
||||
}
|
||||
}
|
||||
|
||||
// Resolve non-entity complex types to their documentation paths
|
||||
if (column?.type && !(column as any).modelDocumentationPath) {
|
||||
const typeStr: string = column.type.toString();
|
||||
const docPath: string | undefined = TypeToDocPath[typeStr];
|
||||
if (docPath) {
|
||||
(column as any).typeDocumentationPath = docPath;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// Set page data
|
||||
pageData["title"] = currentResource.model.singularName;
|
||||
pageData["description"] = currentResource.model.tableDescription;
|
||||
@@ -586,6 +618,7 @@ export default class ServiceHandler {
|
||||
return res.render(`${ViewsPath}/pages/index`, {
|
||||
page: page,
|
||||
resources: Resources,
|
||||
dataTypes: DataTypes,
|
||||
pageTitle: pageTitle,
|
||||
enableGoogleTagManager: IsBillingEnabled,
|
||||
pageDescription: pageDescription,
|
||||
|
||||
@@ -5,12 +5,14 @@ import {
|
||||
} from "Common/Server/EnvironmentConfig";
|
||||
import { ViewsPath } from "../Utils/Config";
|
||||
import ResourceUtil, { ModelDocumentation } from "../Utils/Resources";
|
||||
import DataTypeUtil, { DataTypeDocumentation } from "../Utils/DataTypes";
|
||||
import { ExpressRequest, ExpressResponse } from "Common/Server/Utils/Express";
|
||||
import URL from "Common/Types/API/URL";
|
||||
import Dictionary from "Common/Types/Dictionary";
|
||||
|
||||
// Fetch a list of resources used in the application
|
||||
const Resources: Array<ModelDocumentation> = ResourceUtil.getResources();
|
||||
const DataTypes: Array<DataTypeDocumentation> = DataTypeUtil.getDataTypes();
|
||||
|
||||
export default class ServiceHandler {
|
||||
// Handles the HTTP response for a given request
|
||||
@@ -36,6 +38,7 @@ export default class ServiceHandler {
|
||||
return res.render(`${ViewsPath}/pages/index`, {
|
||||
page: page,
|
||||
resources: Resources,
|
||||
dataTypes: DataTypes,
|
||||
pageTitle: pageTitle,
|
||||
enableGoogleTagManager: IsBillingEnabled,
|
||||
pageDescription: pageDescription,
|
||||
|
||||
@@ -1,9 +1,11 @@
|
||||
import { IsBillingEnabled } from "Common/Server/EnvironmentConfig";
|
||||
import { ViewsPath } from "../Utils/Config";
|
||||
import ResourceUtil, { ModelDocumentation } from "../Utils/Resources";
|
||||
import DataTypeUtil, { DataTypeDocumentation } from "../Utils/DataTypes";
|
||||
import { ExpressRequest, ExpressResponse } from "Common/Server/Utils/Express";
|
||||
|
||||
const Resources: Array<ModelDocumentation> = ResourceUtil.getResources(); // Get an array of model documentation resources
|
||||
const DataTypes: Array<DataTypeDocumentation> = DataTypeUtil.getDataTypes();
|
||||
|
||||
export default class ServiceHandler {
|
||||
// This is a static method that handles the response
|
||||
@@ -21,6 +23,7 @@ export default class ServiceHandler {
|
||||
enableGoogleTagManager: IsBillingEnabled,
|
||||
pageDescription: "Page you're looking for is not found.", // The page description
|
||||
resources: Resources, // The array of model documentation resources
|
||||
dataTypes: DataTypes,
|
||||
pageData: {}, // An empty object to hold any additional page data
|
||||
});
|
||||
}
|
||||
|
||||
@@ -1,12 +1,14 @@
|
||||
import { IsBillingEnabled } from "Common/Server/EnvironmentConfig";
|
||||
import { CodeExamplesPath, ViewsPath } from "../Utils/Config";
|
||||
import ResourceUtil, { ModelDocumentation } from "../Utils/Resources";
|
||||
import DataTypeUtil, { DataTypeDocumentation } from "../Utils/DataTypes";
|
||||
import LocalCache from "Common/Server/Infrastructure/LocalCache";
|
||||
import { ExpressRequest, ExpressResponse } from "Common/Server/Utils/Express";
|
||||
import LocalFile from "Common/Server/Utils/LocalFile";
|
||||
import Dictionary from "Common/Types/Dictionary";
|
||||
|
||||
const Resources: Array<ModelDocumentation> = ResourceUtil.getResources(); // Get all resources from ResourceUtil
|
||||
const DataTypes: Array<DataTypeDocumentation> = DataTypeUtil.getDataTypes();
|
||||
|
||||
export default class ServiceHandler {
|
||||
public static async executeResponse(
|
||||
@@ -49,6 +51,7 @@ export default class ServiceHandler {
|
||||
return res.render(`${ViewsPath}/pages/index`, {
|
||||
page: page, // Pass the page parameter
|
||||
resources: Resources, // Pass all resources
|
||||
dataTypes: DataTypes,
|
||||
pageTitle: pageTitle,
|
||||
enableGoogleTagManager: IsBillingEnabled, // Pass the page title
|
||||
pageDescription: pageDescription, // Pass the page description
|
||||
|
||||
@@ -1,11 +1,17 @@
|
||||
import { ViewsPath } from "../Utils/Config";
|
||||
import ResourceUtil, { ModelDocumentation } from "../Utils/Resources";
|
||||
import { PermissionHelper, PermissionProps } from "Common/Types/Permission";
|
||||
import DataTypeUtil, { DataTypeDocumentation } from "../Utils/DataTypes";
|
||||
import {
|
||||
PermissionGroup,
|
||||
PermissionHelper,
|
||||
PermissionProps,
|
||||
} from "Common/Types/Permission";
|
||||
import { ExpressRequest, ExpressResponse } from "Common/Server/Utils/Express";
|
||||
import { IsBillingEnabled } from "Common/Server/EnvironmentConfig";
|
||||
import Dictionary from "Common/Types/Dictionary";
|
||||
|
||||
const Resources: Array<ModelDocumentation> = ResourceUtil.getResources();
|
||||
const DataTypes: Array<DataTypeDocumentation> = DataTypeUtil.getDataTypes();
|
||||
|
||||
export default class ServiceHandler {
|
||||
public static async executeResponse(
|
||||
@@ -25,16 +31,39 @@ export default class ServiceHandler {
|
||||
pageDescription = "Learn how permissions work with OneUptime";
|
||||
|
||||
// Filter permissions to only include those assignable to tenants
|
||||
pageData["permissions"] = PermissionHelper.getAllPermissionProps().filter(
|
||||
(i: PermissionProps) => {
|
||||
const tenantPermissions: Array<PermissionProps> =
|
||||
PermissionHelper.getAllPermissionProps().filter((i: PermissionProps) => {
|
||||
return i.isAssignableToTenant;
|
||||
},
|
||||
);
|
||||
});
|
||||
|
||||
// Group permissions by PermissionGroup
|
||||
const permissionGroups: Array<{
|
||||
group: string;
|
||||
permissions: Array<PermissionProps>;
|
||||
}> = [];
|
||||
|
||||
for (const group of Object.values(PermissionGroup)) {
|
||||
const groupPermissions: Array<PermissionProps> = tenantPermissions.filter(
|
||||
(p: PermissionProps) => {
|
||||
return p.group === group;
|
||||
},
|
||||
);
|
||||
|
||||
if (groupPermissions.length > 0) {
|
||||
permissionGroups.push({
|
||||
group: group,
|
||||
permissions: groupPermissions,
|
||||
});
|
||||
}
|
||||
}
|
||||
|
||||
pageData["permissionGroups"] = permissionGroups;
|
||||
|
||||
// Render the page
|
||||
return res.render(`${ViewsPath}/pages/index`, {
|
||||
page: page,
|
||||
resources: Resources,
|
||||
dataTypes: DataTypes,
|
||||
pageTitle: pageTitle,
|
||||
enableGoogleTagManager: IsBillingEnabled,
|
||||
pageDescription: pageDescription,
|
||||
|
||||
@@ -1,10 +1,12 @@
|
||||
import { IsBillingEnabled } from "Common/Server/EnvironmentConfig";
|
||||
import { ViewsPath } from "../Utils/Config";
|
||||
import ResourceUtil, { ModelDocumentation } from "../Utils/Resources";
|
||||
import DataTypeUtil, { DataTypeDocumentation } from "../Utils/DataTypes";
|
||||
import { ExpressRequest, ExpressResponse } from "Common/Server/Utils/Express";
|
||||
|
||||
// Retrieve resources from ResourceUtil
|
||||
const resources: Array<ModelDocumentation> = ResourceUtil.getResources();
|
||||
const dataTypes: Array<DataTypeDocumentation> = DataTypeUtil.getDataTypes();
|
||||
|
||||
export default class ServiceHandler {
|
||||
public static async executeResponse(
|
||||
@@ -21,6 +23,7 @@ export default class ServiceHandler {
|
||||
enableGoogleTagManager: IsBillingEnabled,
|
||||
pageDescription: "200 - Success",
|
||||
resources: resources, // Pass resources to the template
|
||||
dataTypes: dataTypes,
|
||||
pageData: {}, // Pass empty data to the template
|
||||
});
|
||||
}
|
||||
|
||||
422
APIReference/Utils/DataTypes.ts
Normal file
422
APIReference/Utils/DataTypes.ts
Normal file
@@ -0,0 +1,422 @@
|
||||
import Dictionary from "Common/Types/Dictionary";
|
||||
|
||||
export interface DataTypeDocumentation {
|
||||
name: string;
|
||||
path: string;
|
||||
description: string;
|
||||
/*
|
||||
* Additional column type display strings that should link to this data type page.
|
||||
* Used for cases where the TableColumnType enum value doesn't match the PascalCase name
|
||||
* (e.g., enum "Date" should link to the "DateTime" data type page).
|
||||
*/
|
||||
columnTypeAliases?: Array<string>;
|
||||
/*
|
||||
* Category for grouping in sidebar navigation.
|
||||
* Types with the same category are grouped under a collapsible heading.
|
||||
*/
|
||||
category?: string;
|
||||
}
|
||||
|
||||
export interface DataTypeCategory {
|
||||
name: string;
|
||||
types: Array<DataTypeDocumentation>;
|
||||
}
|
||||
|
||||
export default class DataTypeUtil {
|
||||
public static getDataTypes(): Array<DataTypeDocumentation> {
|
||||
return [
|
||||
{
|
||||
name: "ObjectID",
|
||||
path: "object-id",
|
||||
description:
|
||||
"A unique identifier for objects, typically a UUID string.",
|
||||
},
|
||||
{
|
||||
name: "Decimal",
|
||||
path: "decimal",
|
||||
description: "A decimal number type for precise numeric values.",
|
||||
},
|
||||
{
|
||||
name: "Name",
|
||||
path: "name",
|
||||
description: "A structured name type representing a text name value.",
|
||||
},
|
||||
{
|
||||
name: "EqualTo",
|
||||
path: "equal-to",
|
||||
description:
|
||||
"A query filter that matches objects where a field is equal to the specified value.",
|
||||
},
|
||||
{
|
||||
name: "EqualToOrNull",
|
||||
path: "equal-to-or-null",
|
||||
description:
|
||||
"A query filter that matches objects where a field is equal to the specified value or is null.",
|
||||
},
|
||||
{
|
||||
name: "MonitorSteps",
|
||||
path: "monitor-steps",
|
||||
description:
|
||||
"Complex nested object describing monitor check configuration including steps and default status.",
|
||||
category: "Monitor",
|
||||
},
|
||||
{
|
||||
name: "MonitorStep",
|
||||
path: "monitor-step",
|
||||
description:
|
||||
"A single monitor step defining a check target, request configuration, and criteria for determining status.",
|
||||
category: "Monitor",
|
||||
},
|
||||
{
|
||||
name: "Recurring",
|
||||
path: "recurring",
|
||||
description:
|
||||
"Object describing a recurring interval schedule (e.g., every 5 minutes, daily).",
|
||||
},
|
||||
{
|
||||
name: "RestrictionTimes",
|
||||
path: "restriction-times",
|
||||
description:
|
||||
"Object describing on-call duty time restrictions (daily or weekly windows).",
|
||||
},
|
||||
{
|
||||
name: "MonitorCriteria",
|
||||
path: "monitor-criteria",
|
||||
description:
|
||||
"A collection of monitor criteria instances used to evaluate monitor check results.",
|
||||
category: "Monitor",
|
||||
},
|
||||
{
|
||||
name: "PositiveNumber",
|
||||
path: "positive-number",
|
||||
description: "A number type that must be greater than zero.",
|
||||
columnTypeAliases: ["Small Positive Number", "Big Positive Number"],
|
||||
},
|
||||
{
|
||||
name: "MonitorCriteriaInstance",
|
||||
path: "monitor-criteria-instance",
|
||||
description:
|
||||
"A single criteria rule defining conditions and the resulting monitor status when conditions are met.",
|
||||
category: "Monitor",
|
||||
},
|
||||
{
|
||||
name: "NotEqual",
|
||||
path: "not-equal",
|
||||
description:
|
||||
"A query filter that matches objects where a field is not equal to the specified value.",
|
||||
},
|
||||
{
|
||||
name: "Email",
|
||||
path: "email",
|
||||
description: "An email address type with built-in format validation.",
|
||||
},
|
||||
{
|
||||
name: "Phone",
|
||||
path: "phone",
|
||||
description: "A phone number type with built-in format validation.",
|
||||
},
|
||||
{
|
||||
name: "Color",
|
||||
path: "color",
|
||||
description:
|
||||
"A color value represented as a hex string (e.g., #3498db).",
|
||||
},
|
||||
{
|
||||
name: "Domain",
|
||||
path: "domain",
|
||||
description: "A domain name type (e.g., example.com).",
|
||||
},
|
||||
{
|
||||
name: "Version",
|
||||
path: "version",
|
||||
description: "A semantic version type (e.g., 1.0.0).",
|
||||
},
|
||||
{
|
||||
name: "IP",
|
||||
path: "ip",
|
||||
description:
|
||||
"An IP address type supporting both IPv4 and IPv6 formats.",
|
||||
},
|
||||
{
|
||||
name: "Route",
|
||||
path: "route",
|
||||
description: "A URL route/path segment type.",
|
||||
},
|
||||
{
|
||||
name: "URL",
|
||||
path: "url",
|
||||
description: "A full URL type with protocol, host, and path.",
|
||||
},
|
||||
{
|
||||
name: "Permission",
|
||||
path: "permission",
|
||||
description:
|
||||
"A string identifier representing an access control permission in OneUptime.",
|
||||
},
|
||||
{
|
||||
name: "Search",
|
||||
path: "search",
|
||||
description:
|
||||
"A query filter for text search that matches objects containing the specified string.",
|
||||
},
|
||||
{
|
||||
name: "GreaterThan",
|
||||
path: "greater-than",
|
||||
description:
|
||||
"A query filter that matches objects where a field is greater than the specified value.",
|
||||
},
|
||||
{
|
||||
name: "GreaterThanOrEqual",
|
||||
path: "greater-than-or-equal",
|
||||
description:
|
||||
"A query filter that matches objects where a field is greater than or equal to the specified value.",
|
||||
},
|
||||
{
|
||||
name: "GreaterThanOrNull",
|
||||
path: "greater-than-or-null",
|
||||
description:
|
||||
"A query filter that matches objects where a field is greater than the specified value or is null.",
|
||||
},
|
||||
{
|
||||
name: "LessThanOrNull",
|
||||
path: "less-than-or-null",
|
||||
description:
|
||||
"A query filter that matches objects where a field is less than the specified value or is null.",
|
||||
},
|
||||
{
|
||||
name: "LessThan",
|
||||
path: "less-than",
|
||||
description:
|
||||
"A query filter that matches objects where a field is less than the specified value.",
|
||||
},
|
||||
{
|
||||
name: "LessThanOrEqual",
|
||||
path: "less-than-or-equal",
|
||||
description:
|
||||
"A query filter that matches objects where a field is less than or equal to the specified value.",
|
||||
},
|
||||
{
|
||||
name: "Port",
|
||||
path: "port",
|
||||
description: "A network port number type (1-65535).",
|
||||
},
|
||||
{
|
||||
name: "Hostname",
|
||||
path: "hostname",
|
||||
description: "A hostname type (e.g., api.example.com).",
|
||||
},
|
||||
{
|
||||
name: "HashedString",
|
||||
path: "hashed-string",
|
||||
description:
|
||||
"A string that is stored in hashed form. Used for sensitive data like passwords and API keys.",
|
||||
},
|
||||
{
|
||||
name: "DateTime",
|
||||
path: "date-time",
|
||||
description:
|
||||
"An ISO 8601 date-time string (e.g., 2024-01-15T10:30:00.000Z).",
|
||||
columnTypeAliases: ["Date"],
|
||||
},
|
||||
{
|
||||
name: "Buffer",
|
||||
path: "buffer",
|
||||
description:
|
||||
"A binary data buffer, typically base64-encoded when serialized to JSON.",
|
||||
},
|
||||
{
|
||||
name: "InBetween",
|
||||
path: "in-between",
|
||||
description:
|
||||
"A query filter that matches objects where a field value is between two specified values (inclusive).",
|
||||
},
|
||||
{
|
||||
name: "NotNull",
|
||||
path: "not-null",
|
||||
description:
|
||||
"A query filter that matches objects where a field is not null.",
|
||||
},
|
||||
{
|
||||
name: "IsNull",
|
||||
path: "is-null",
|
||||
description:
|
||||
"A query filter that matches objects where a field is null.",
|
||||
},
|
||||
{
|
||||
name: "Includes",
|
||||
path: "includes",
|
||||
description:
|
||||
"A query filter that matches objects where a field value is included in the specified array of values.",
|
||||
},
|
||||
{
|
||||
name: "DashboardComponent",
|
||||
path: "dashboard-component",
|
||||
description:
|
||||
"A configuration object for a dashboard component including its type, layout, and settings.",
|
||||
},
|
||||
{
|
||||
name: "DashboardViewConfig",
|
||||
path: "dashboard-view-config",
|
||||
description:
|
||||
"A configuration object for a dashboard view including its components and layout.",
|
||||
},
|
||||
{
|
||||
name: "CriteriaFilter",
|
||||
path: "criteria-filter",
|
||||
description:
|
||||
"A single filter condition within a MonitorCriteriaInstance that defines what to check and how to compare it.",
|
||||
category: "Monitor",
|
||||
},
|
||||
{
|
||||
name: "CriteriaIncident",
|
||||
path: "criteria-incident",
|
||||
description:
|
||||
"Configuration for an incident that is automatically created when a MonitorCriteriaInstance's conditions are met.",
|
||||
category: "Monitor",
|
||||
},
|
||||
{
|
||||
name: "CriteriaAlert",
|
||||
path: "criteria-alert",
|
||||
description:
|
||||
"Configuration for an alert that is automatically created when a MonitorCriteriaInstance's conditions are met.",
|
||||
category: "Monitor",
|
||||
},
|
||||
{
|
||||
name: "CheckOn",
|
||||
path: "check-on",
|
||||
description:
|
||||
"Enum specifying what aspect of a monitor response to evaluate (e.g., response code, response time, body content).",
|
||||
category: "Monitor",
|
||||
},
|
||||
{
|
||||
name: "FilterType",
|
||||
path: "filter-type",
|
||||
description:
|
||||
"Enum specifying the comparison operator used in a CriteriaFilter (e.g., Equal To, Greater Than, Contains).",
|
||||
category: "Monitor",
|
||||
},
|
||||
{
|
||||
name: "FilterCondition",
|
||||
path: "filter-condition",
|
||||
description:
|
||||
"Enum specifying how multiple filters are combined: 'All' (AND) or 'Any' (OR).",
|
||||
category: "Monitor",
|
||||
},
|
||||
{
|
||||
name: "MonitorStepLogMonitor",
|
||||
path: "monitor-step-log-monitor",
|
||||
description:
|
||||
"Configuration for a Log monitor step, defining which logs to query and evaluate.",
|
||||
category: "Monitor",
|
||||
},
|
||||
{
|
||||
name: "MonitorStepTraceMonitor",
|
||||
path: "monitor-step-trace-monitor",
|
||||
description:
|
||||
"Configuration for a Trace monitor step, defining which spans to query and evaluate.",
|
||||
category: "Monitor",
|
||||
},
|
||||
{
|
||||
name: "MonitorStepMetricMonitor",
|
||||
path: "monitor-step-metric-monitor",
|
||||
description:
|
||||
"Configuration for a Metric monitor step, defining which metrics to query and evaluate.",
|
||||
category: "Monitor",
|
||||
},
|
||||
{
|
||||
name: "MonitorStepSnmpMonitor",
|
||||
path: "monitor-step-snmp-monitor",
|
||||
description:
|
||||
"Configuration for an SNMP monitor step, defining the SNMP device connection and OIDs to query.",
|
||||
category: "Monitor",
|
||||
},
|
||||
];
|
||||
}
|
||||
|
||||
public static getDataTypesByCategory(): Array<DataTypeCategory> {
|
||||
const allTypes: Array<DataTypeDocumentation> = DataTypeUtil.getDataTypes();
|
||||
const uncategorized: Array<DataTypeDocumentation> = [];
|
||||
const categoryMap: Dictionary<Array<DataTypeDocumentation>> = {};
|
||||
const categoryOrder: Array<string> = [];
|
||||
|
||||
for (const dt of allTypes) {
|
||||
if (dt.category) {
|
||||
if (!categoryMap[dt.category]) {
|
||||
categoryMap[dt.category] = [];
|
||||
categoryOrder.push(dt.category);
|
||||
}
|
||||
categoryMap[dt.category]!.push(dt);
|
||||
} else {
|
||||
uncategorized.push(dt);
|
||||
}
|
||||
}
|
||||
|
||||
const result: Array<DataTypeCategory> = [];
|
||||
|
||||
// Add uncategorized types first under "General"
|
||||
if (uncategorized.length > 0) {
|
||||
result.push({ name: "General", types: uncategorized });
|
||||
}
|
||||
|
||||
// Add categorized groups
|
||||
for (const cat of categoryOrder) {
|
||||
if (categoryMap[cat]) {
|
||||
result.push({ name: cat, types: categoryMap[cat]! });
|
||||
}
|
||||
}
|
||||
|
||||
return result;
|
||||
}
|
||||
|
||||
public static getDataTypeDictionaryByPath(): Dictionary<DataTypeDocumentation> {
|
||||
const dict: Dictionary<DataTypeDocumentation> = {};
|
||||
|
||||
for (const dataType of DataTypeUtil.getDataTypes()) {
|
||||
dict[dataType.path] = dataType;
|
||||
}
|
||||
|
||||
return dict;
|
||||
}
|
||||
|
||||
/*
|
||||
* Convert PascalCase name to space-separated display string.
|
||||
* e.g., "ObjectID" → "Object ID", "MonitorSteps" → "Monitor Steps",
|
||||
* "HashedString" → "Hashed String", "IP" → "IP"
|
||||
*/
|
||||
private static pascalCaseToDisplayString(name: string): string {
|
||||
return name
|
||||
.replace(/([a-z])([A-Z])/g, "$1 $2")
|
||||
.replace(/([A-Z]+)([A-Z][a-z])/g, "$1 $2");
|
||||
}
|
||||
|
||||
/*
|
||||
* Build a mapping from column type display strings to data type page paths.
|
||||
* Automatically derives both PascalCase and display-string variants from each
|
||||
* data type's name, so adding a new entry to getDataTypes() is all that's needed.
|
||||
*/
|
||||
public static getTypeToDocPathMap(): Dictionary<string> {
|
||||
const map: Dictionary<string> = {};
|
||||
|
||||
for (const dt of DataTypeUtil.getDataTypes()) {
|
||||
// Map PascalCase name: "ObjectID" → "object-id"
|
||||
map[dt.name] = dt.path;
|
||||
|
||||
// Map display string: "Object ID" → "object-id"
|
||||
const displayName: string = DataTypeUtil.pascalCaseToDisplayString(
|
||||
dt.name,
|
||||
);
|
||||
if (displayName !== dt.name) {
|
||||
map[displayName] = dt.path;
|
||||
}
|
||||
|
||||
// Map any explicit aliases (for edge cases like enum "Date" → "date-time")
|
||||
if (dt.columnTypeAliases) {
|
||||
for (const alias of dt.columnTypeAliases) {
|
||||
map[alias] = dt.path;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return map;
|
||||
}
|
||||
}
|
||||
19
APIReference/package-lock.json
generated
19
APIReference/package-lock.json
generated
@@ -73,6 +73,7 @@
|
||||
"ejs": "^3.1.10",
|
||||
"elkjs": "^0.10.0",
|
||||
"esbuild": "^0.25.5",
|
||||
"expo-server-sdk": "^3.15.0",
|
||||
"express": "^4.21.1",
|
||||
"formik": "^2.4.6",
|
||||
"history": "^5.3.0",
|
||||
@@ -82,6 +83,7 @@
|
||||
"jsonwebtoken": "^9.0.0",
|
||||
"jwt-decode": "^4.0.0",
|
||||
"marked": "^12.0.2",
|
||||
"mermaid": "^11.12.2",
|
||||
"moment": "^2.30.1",
|
||||
"moment-timezone": "^0.5.45",
|
||||
"multer": "^2.0.2",
|
||||
@@ -101,7 +103,7 @@
|
||||
"react-dropzone": "^14.2.2",
|
||||
"react-error-boundary": "^4.0.13",
|
||||
"react-highlight": "^0.15.0",
|
||||
"react-markdown": "^8.0.3",
|
||||
"react-markdown": "^9.0.0",
|
||||
"react-router-dom": "^6.30.1",
|
||||
"react-select": "^5.4.0",
|
||||
"react-spinners": "^0.14.1",
|
||||
@@ -111,7 +113,7 @@
|
||||
"recharts": "^2.12.7",
|
||||
"redis-semaphore": "^5.5.1",
|
||||
"reflect-metadata": "^0.2.2",
|
||||
"remark-gfm": "^3.0.1",
|
||||
"remark-gfm": "^4.0.0",
|
||||
"slackify-markdown": "^4.4.0",
|
||||
"slugify": "^1.6.5",
|
||||
"socket.io": "^4.7.4",
|
||||
@@ -277,6 +279,7 @@
|
||||
"resolved": "https://registry.npmjs.org/@babel/core/-/core-7.23.6.tgz",
|
||||
"integrity": "sha512-FxpRyGjrMJXh7X3wGLGhNDCRiwpWEF74sKjTLDJSG5Kyvow3QZaG0Adbqzi9ZrVjTWpsX+2cxWXD71NMg93kdw==",
|
||||
"dev": true,
|
||||
"peer": true,
|
||||
"dependencies": {
|
||||
"@ampproject/remapping": "^2.2.0",
|
||||
"@babel/code-frame": "^7.23.5",
|
||||
@@ -1389,7 +1392,8 @@
|
||||
"node_modules/@types/node": {
|
||||
"version": "17.0.45",
|
||||
"resolved": "https://registry.npmjs.org/@types/node/-/node-17.0.45.tgz",
|
||||
"integrity": "sha512-w+tIMs3rq2afQdsPJlODhoUEKzFP1ayaoyl1CcnwtIlsVe7K7bA1NGm4s3PraqTLlXnbIN84zuBlxBWo1u9BLw=="
|
||||
"integrity": "sha512-w+tIMs3rq2afQdsPJlODhoUEKzFP1ayaoyl1CcnwtIlsVe7K7bA1NGm4s3PraqTLlXnbIN84zuBlxBWo1u9BLw==",
|
||||
"peer": true
|
||||
},
|
||||
"node_modules/@types/prettier": {
|
||||
"version": "2.7.3",
|
||||
@@ -1660,6 +1664,7 @@
|
||||
"url": "https://github.com/sponsors/ai"
|
||||
}
|
||||
],
|
||||
"peer": true,
|
||||
"dependencies": {
|
||||
"caniuse-lite": "^1.0.30001565",
|
||||
"electron-to-chromium": "^1.4.601",
|
||||
@@ -1921,9 +1926,10 @@
|
||||
}
|
||||
},
|
||||
"node_modules/diff": {
|
||||
"version": "4.0.2",
|
||||
"resolved": "https://registry.npmjs.org/diff/-/diff-4.0.2.tgz",
|
||||
"integrity": "sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A==",
|
||||
"version": "4.0.4",
|
||||
"resolved": "https://registry.npmjs.org/diff/-/diff-4.0.4.tgz",
|
||||
"integrity": "sha512-X07nttJQkwkfKfvTPG/KSnE2OMdcUCao6+eXF3wmnIQRn2aPAHH3VxDbDOdegkd6JbPsXqShpvEOHfAT+nCNwQ==",
|
||||
"license": "BSD-3-Clause",
|
||||
"engines": {
|
||||
"node": ">=0.3.1"
|
||||
}
|
||||
@@ -4006,6 +4012,7 @@
|
||||
"version": "10.9.2",
|
||||
"resolved": "https://registry.npmjs.org/ts-node/-/ts-node-10.9.2.tgz",
|
||||
"integrity": "sha512-f0FFpIdcHgn8zcPSbf1dRevwt047YMnaiJM3u2w2RewrB+fob/zePZcrOyQoLMMO7aBIddLcQIEK5dYjkLnGrQ==",
|
||||
"peer": true,
|
||||
"dependencies": {
|
||||
"@cspotcode/source-map-support": "^0.8.0",
|
||||
"@tsconfig/node10": "^1.0.7",
|
||||
|
||||
179
APIReference/views/main/data-type.ejs
Normal file
179
APIReference/views/main/data-type.ejs
Normal file
@@ -0,0 +1,179 @@
|
||||
<main class="py-12">
|
||||
<article class="prose">
|
||||
<!-- Type Hierarchy Breadcrumb -->
|
||||
<% if (pageData.typeHierarchy && pageData.typeHierarchy.length > 0) { %>
|
||||
<nav class="mb-6">
|
||||
<ol class="flex items-center flex-wrap gap-1 text-sm">
|
||||
<% for (var h = 0; h < pageData.typeHierarchy.length; h++) { %>
|
||||
<% if (h > 0) { %>
|
||||
<li class="text-slate-400">
|
||||
<svg class="w-4 h-4" fill="none" stroke="currentColor" viewBox="0 0 24 24"><path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M9 5l7 7-7 7"></path></svg>
|
||||
</li>
|
||||
<% } %>
|
||||
<% if (pageData.typeHierarchy[h].path && pageData.typeHierarchy[h].name !== pageData.title) { %>
|
||||
<li><a href="/reference/<%= pageData.typeHierarchy[h].path %>" class="text-indigo-600 hover:text-indigo-700 hover:underline font-medium"><%= pageData.typeHierarchy[h].name %></a></li>
|
||||
<% } else { %>
|
||||
<li class="text-slate-900 font-semibold"><%= pageData.typeHierarchy[h].name %></li>
|
||||
<% } %>
|
||||
<% } %>
|
||||
</ol>
|
||||
</nav>
|
||||
<% } %>
|
||||
|
||||
<!-- Hero Section -->
|
||||
<div class="mb-8">
|
||||
<div class="flex items-center gap-3 mb-4">
|
||||
<div class="flex items-center justify-center w-10 h-10 rounded-xl bg-emerald-600 shadow-lg shadow-emerald-500/30">
|
||||
<svg class="w-5 h-5 text-white" fill="none" stroke="currentColor" viewBox="0 0 24 24">
|
||||
<path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M7 7h.01M7 3h5c.512 0 1.024.195 1.414.586l7 7a2 2 0 010 2.828l-7 7a2 2 0 01-2.828 0l-7-7A1.994 1.994 0 013 12V7a4 4 0 014-4z"></path>
|
||||
</svg>
|
||||
</div>
|
||||
<span class="text-xs font-semibold text-emerald-600 uppercase tracking-wider"><%= pageData.isEnum ? 'Enum' : 'Data Type' %></span>
|
||||
</div>
|
||||
<h1 class="font-bold text-3xl text-slate-900 tracking-tight mb-3"><%= pageData.title %></h1>
|
||||
<p class="text-lg text-slate-600 leading-relaxed max-w-2xl"><%- pageData.description %></p>
|
||||
</div>
|
||||
|
||||
<!-- At a Glance Summary Box -->
|
||||
<div class="mb-10 rounded-xl border border-slate-200 bg-slate-50 p-5">
|
||||
<h4 class="text-xs font-semibold text-slate-500 uppercase tracking-wider mb-3">At a Glance</h4>
|
||||
<div class="flex flex-wrap gap-x-8 gap-y-3 text-sm">
|
||||
<div>
|
||||
<span class="text-slate-500">Kind</span>
|
||||
<span class="ml-2 font-medium text-slate-900"><%= pageData.isEnum ? 'Enum' : 'Data Type' %></span>
|
||||
</div>
|
||||
<% if (pageData.isEnum && pageData.valueCount > 0) { %>
|
||||
<div>
|
||||
<span class="text-slate-500">Values</span>
|
||||
<span class="ml-2 font-medium text-slate-900"><%= pageData.valueCount %></span>
|
||||
</div>
|
||||
<% } else if (pageData.propertyCount > 0) { %>
|
||||
<div>
|
||||
<span class="text-slate-500">Properties</span>
|
||||
<span class="ml-2 font-medium text-slate-900"><%= pageData.propertyCount %></span>
|
||||
</div>
|
||||
<% } %>
|
||||
<div>
|
||||
<span class="text-slate-500">JSON Format</span>
|
||||
<code class="ml-2 text-xs font-mono bg-white px-2 py-0.5 rounded border border-slate-200 text-slate-700">{"_type": "<%= pageData.jsonWrapperType %>", "value": ...}</code>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<% if (pageData.isEnum) { %>
|
||||
<!-- Quick Navigation for Enum Values -->
|
||||
<% if (pageData.values.length >= 4) { %>
|
||||
<div class="mb-6">
|
||||
<div class="flex flex-wrap gap-1.5">
|
||||
<% for (var qv = 0; qv < pageData.values.length; qv++) { %>
|
||||
<a href="#value-<%= pageData.values[qv].value.toLowerCase().replace(/\s+/g, '-') %>" class="rounded-md bg-white px-2.5 py-1 text-xs font-medium text-slate-600 ring-1 ring-inset ring-slate-200 hover:bg-slate-50 hover:text-slate-900 transition-colors no-underline"><%= pageData.values[qv].value %></a>
|
||||
<% } %>
|
||||
</div>
|
||||
</div>
|
||||
<% } %>
|
||||
|
||||
<h3 id="values" class="text-base font-semibold text-slate-800 mb-4 scroll-mt-24">Possible Values</h3>
|
||||
<div class="my-6 rounded-xl border border-slate-200 bg-white overflow-hidden">
|
||||
<ul role="list" class="m-0 w-full list-none divide-y divide-slate-100 p-0">
|
||||
<% for (var v = 0; v < pageData.values.length; v++) { %>
|
||||
<li id="value-<%= pageData.values[v].value.toLowerCase().replace(/\s+/g, '-') %>" class="m-0 px-5 py-5 hover:bg-slate-50/50 transition-colors scroll-mt-24">
|
||||
<dl class="m-0 flex flex-wrap items-start gap-x-3 gap-y-2">
|
||||
<dt class="sr-only">Index</dt>
|
||||
<dd class="text-xs font-mono text-slate-300 w-6 pt-0.5 flex-shrink-0"><%= v + 1 %>.</dd>
|
||||
<dt class="sr-only">Value</dt>
|
||||
<dd><code class="model-inline-code"><%= pageData.values[v].value %></code></dd>
|
||||
<dt class="sr-only">Description</dt>
|
||||
<dd class="w-full flex-none pl-9 text-sm text-slate-600"><%- pageData.values[v].description %></dd>
|
||||
</dl>
|
||||
</li>
|
||||
<% } %>
|
||||
</ul>
|
||||
</div>
|
||||
<% } else if (pageData.properties && pageData.properties.length > 0) { %>
|
||||
<!-- Quick Navigation for Properties -->
|
||||
<% if (pageData.properties.length >= 4) { %>
|
||||
<div class="mb-6">
|
||||
<div class="flex flex-wrap gap-1.5">
|
||||
<% for (var qp = 0; qp < pageData.properties.length; qp++) { %>
|
||||
<a href="#prop-<%= pageData.properties[qp].name %>" class="rounded-md bg-white px-2.5 py-1 text-xs font-medium text-slate-600 ring-1 ring-inset ring-slate-200 hover:bg-slate-50 hover:text-slate-900 transition-colors no-underline"><%= pageData.properties[qp].name %></a>
|
||||
<% } %>
|
||||
</div>
|
||||
</div>
|
||||
<% } %>
|
||||
|
||||
<h3 id="properties" class="text-base font-semibold text-slate-800 mb-4 scroll-mt-24">Properties</h3>
|
||||
<div class="my-6 rounded-xl border border-slate-200 bg-white overflow-hidden">
|
||||
<ul role="list" class="m-0 w-full list-none divide-y divide-slate-100 p-0">
|
||||
<% for (var p = 0; p < pageData.properties.length; p++) { %>
|
||||
<li id="prop-<%= pageData.properties[p].name %>" class="m-0 px-5 py-5 hover:bg-slate-50/50 transition-colors scroll-mt-24">
|
||||
<div class="mb-1.5">
|
||||
<code class="text-sm font-semibold text-slate-900"><%= pageData.properties[p].name %></code>
|
||||
<% if (pageData.properties[p].required) { %>
|
||||
<span class="ml-2 inline-flex items-center rounded-full bg-amber-50 px-2 py-0.5 text-xs font-medium text-amber-700 ring-1 ring-inset ring-amber-600/20">Required</span>
|
||||
<% } %>
|
||||
</div>
|
||||
<div class="mb-2">
|
||||
<span class="inline-flex items-center rounded-md bg-slate-100 px-2 py-0.5 text-xs font-mono text-slate-600">
|
||||
<% if (pageData.properties[p].typeLinks && pageData.properties[p].typeLinks.length > 0) { %>
|
||||
<% var typeLinks = pageData.properties[p].typeLinks; %>
|
||||
<% for (var tl = 0; tl < typeLinks.length; tl++) { %>
|
||||
<% if (typeLinks[tl].path) { %>
|
||||
<a href="/reference/<%= typeLinks[tl].path %>" class="text-indigo-600 hover:text-indigo-700 hover:underline font-medium"><%= typeLinks[tl].label %></a>
|
||||
<% } else { %>
|
||||
<%= typeLinks[tl].label %>
|
||||
<% } %>
|
||||
<% } %>
|
||||
<% } else { %>
|
||||
<%= pageData.properties[p].type %>
|
||||
<% } %>
|
||||
</span>
|
||||
</div>
|
||||
<p class="m-0 text-sm text-slate-600 leading-relaxed"><%- pageData.properties[p].description %></p>
|
||||
</li>
|
||||
<% } %>
|
||||
</ul>
|
||||
</div>
|
||||
<% } %>
|
||||
|
||||
<!-- JSON Example Section -->
|
||||
<div class="border-t border-slate-200 pt-8 mt-10">
|
||||
<h3 id="example" class="text-base font-semibold text-slate-800 mb-4 scroll-mt-24">JSON Example</h3>
|
||||
<%- include('../partials/code', { title: "JSON", code: pageData.jsonExample, requestType: "", requestUrl: "" }) %>
|
||||
</div>
|
||||
|
||||
<% if (pageData.title === "Permission") { %>
|
||||
<div class="mt-6 rounded-lg border border-indigo-100 bg-indigo-50 p-4">
|
||||
<p class="text-sm text-indigo-800 m-0">
|
||||
For a complete list of all available permissions and their descriptions, see the
|
||||
<a href="/reference/permissions" class="font-medium text-indigo-600 hover:text-indigo-700 hover:underline">Permissions guide</a>.
|
||||
</p>
|
||||
</div>
|
||||
<% } %>
|
||||
|
||||
<!-- Related Types Section -->
|
||||
<% if (pageData.relatedTypes && pageData.relatedTypes.length > 0) { %>
|
||||
<div class="border-t border-slate-200 pt-8 mt-10">
|
||||
<h3 id="related-types" class="text-base font-semibold text-slate-800 mb-4 scroll-mt-24">Related Types</h3>
|
||||
<div class="my-6 grid grid-cols-1 sm:grid-cols-2 gap-3">
|
||||
<% for (var r = 0; r < pageData.relatedTypes.length; r++) { %>
|
||||
<a href="/reference/<%= pageData.relatedTypes[r].path %>" class="group flex items-start gap-3 rounded-xl border border-slate-200 bg-white p-5 hover:border-indigo-300 hover:shadow-sm transition-all no-underline">
|
||||
<div class="flex-shrink-0 mt-0.5">
|
||||
<div class="flex items-center justify-center w-8 h-8 rounded-lg bg-indigo-50 group-hover:bg-indigo-100 transition-colors">
|
||||
<svg class="w-4 h-4 text-indigo-600" fill="none" stroke="currentColor" viewBox="0 0 24 24"><path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1"></path></svg>
|
||||
</div>
|
||||
</div>
|
||||
<div>
|
||||
<div class="text-sm font-semibold text-slate-900 group-hover:text-indigo-600 transition-colors"><%= pageData.relatedTypes[r].name %></div>
|
||||
<div class="text-xs text-slate-500 mt-0.5"><%= pageData.relatedTypes[r].relationship %></div>
|
||||
<% if (pageData.relatedTypes[r].description) { %>
|
||||
<div class="text-xs text-slate-400 mt-1 line-clamp-2"><%= pageData.relatedTypes[r].description %></div>
|
||||
<% } %>
|
||||
</div>
|
||||
</a>
|
||||
<% } %>
|
||||
</div>
|
||||
</div>
|
||||
<% } %>
|
||||
|
||||
</article>
|
||||
</main>
|
||||
@@ -47,7 +47,13 @@
|
||||
<dd><code class="model-inline-code"><%= Object.keys(pageData.columns)[i] -%></code></dd>
|
||||
<dt class="sr-only">Type</dt>
|
||||
<dd class="font-mono text-xs text-slate-500">
|
||||
<%= pageData.columns[Object.keys(pageData.columns)[i]].type -%>
|
||||
<% if(pageData.columns[Object.keys(pageData.columns)[i]].modelDocumentationPath) { %>
|
||||
<a href="/reference/<%= pageData.columns[Object.keys(pageData.columns)[i]].modelDocumentationPath -%>" class="text-indigo-600 hover:text-indigo-700 hover:underline font-medium"><%= pageData.columns[Object.keys(pageData.columns)[i]].modelName -%></a>
|
||||
<% } else if(pageData.columns[Object.keys(pageData.columns)[i]].typeDocumentationPath) { %>
|
||||
<a href="/reference/<%= pageData.columns[Object.keys(pageData.columns)[i]].typeDocumentationPath -%>" class="text-indigo-600 hover:text-indigo-700 hover:underline font-medium"><%= pageData.columns[Object.keys(pageData.columns)[i]].type -%></a>
|
||||
<% } else { %>
|
||||
<%= pageData.columns[Object.keys(pageData.columns)[i]].type -%>
|
||||
<% } %>
|
||||
<% if(pageData.columns[Object.keys(pageData.columns)[i]].required){ %>
|
||||
<span class="ml-1.5 inline-flex items-center rounded-full bg-amber-50 px-2 py-0.5 text-xs font-medium text-amber-700 ring-1 ring-inset ring-amber-600/20">Required</span>
|
||||
<% } %>
|
||||
|
||||
@@ -14,23 +14,49 @@
|
||||
<p class="text-lg text-slate-600 leading-relaxed max-w-2xl">Your API Token needs permissions to create, update, read or delete any resource. If you do not have permissions to make a request a <code class="inline-code">4xx</code> status will be sent as response. You can manage permissions for your API Key in Project Settings > API Keys.</p>
|
||||
</div>
|
||||
|
||||
<h2 id="consuming-webhooks" class="scroll-mt-24 text-xl font-semibold text-slate-900 mb-6 mt-12">
|
||||
Permissions List
|
||||
</h2>
|
||||
<p class="text-slate-600 leading-relaxed mb-6">Here is a list of all the permissions:</p>
|
||||
|
||||
<div class="rounded-xl border border-slate-200 bg-white overflow-hidden">
|
||||
<ul role="list" class="m-0 divide-y divide-slate-100 p-0">
|
||||
<% for(var i=0; i<pageData.permissions.length; i++) {%>
|
||||
<li class="m-0 px-5 py-4 hover:bg-slate-50/50 transition-colors">
|
||||
<dl class="m-0 flex flex-wrap items-center gap-x-3 gap-y-2">
|
||||
<dd><code class="inline-code"><%= pageData.permissions[i].permission -%></code></dd>
|
||||
<dd class="font-mono text-xs text-slate-500"><%= pageData.permissions[i].title -%></dd>
|
||||
<dd class="w-full flex-none text-sm text-slate-600 mt-1"><%= pageData.permissions[i].description -%></dd>
|
||||
</dl>
|
||||
</li>
|
||||
<% } %>
|
||||
</ul>
|
||||
<!-- Quick Navigation -->
|
||||
<div class="my-6 flex gap-3 rounded-xl border border-indigo-500/20 bg-indigo-50/50 p-4">
|
||||
<div class="flex-shrink-0">
|
||||
<svg viewBox="0 0 16 16" aria-hidden="true" class="h-5 w-5 fill-indigo-500 stroke-white">
|
||||
<circle cx="8" cy="8" r="8" stroke-width="0"></circle>
|
||||
<path fill="none" stroke-linecap="round" stroke-linejoin="round" stroke-width="1.5" d="M6.75 7.75h1.5v3.5"></path>
|
||||
<circle cx="8" cy="4" r=".5" fill="none"></circle>
|
||||
</svg>
|
||||
</div>
|
||||
<div>
|
||||
<p class="text-sm font-medium text-indigo-900 mb-2">Jump to a category</p>
|
||||
<div class="flex flex-wrap gap-2">
|
||||
<% for(var g=0; g<pageData.permissionGroups.length; g++) { %>
|
||||
<a href="#<%= pageData.permissionGroups[g].group.toLowerCase().replace(/ /g, '-') -%>"
|
||||
class="inline-flex items-center gap-1.5 rounded-md bg-white px-2.5 py-1 text-xs font-medium text-slate-700 ring-1 ring-inset ring-slate-200 hover:bg-indigo-50 hover:text-indigo-700 hover:ring-indigo-200 transition-colors">
|
||||
<%= pageData.permissionGroups[g].group %>
|
||||
<span class="text-slate-400">(<%= pageData.permissionGroups[g].permissions.length %>)</span>
|
||||
</a>
|
||||
<% } %>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<% for(var g=0; g<pageData.permissionGroups.length; g++) { %>
|
||||
<h2 id="<%= pageData.permissionGroups[g].group.toLowerCase().replace(/ /g, '-') -%>"
|
||||
class="scroll-mt-24 text-xl font-semibold text-slate-900 mb-4 mt-12 <%= g > 0 ? 'pt-8 border-t border-slate-200' : '' %>">
|
||||
<%= pageData.permissionGroups[g].group %>
|
||||
<span class="ml-2 align-middle inline-flex items-center rounded-full bg-slate-100 px-2.5 py-0.5 text-xs font-medium text-slate-600"><%= pageData.permissionGroups[g].permissions.length %></span>
|
||||
</h2>
|
||||
|
||||
<div class="rounded-xl border border-slate-200 bg-white overflow-hidden">
|
||||
<ul role="list" class="m-0 list-none divide-y divide-slate-100 p-0">
|
||||
<% for(var i=0; i<pageData.permissionGroups[g].permissions.length; i++) { %>
|
||||
<li class="m-0 px-5 py-4 hover:bg-slate-50/50 transition-colors">
|
||||
<dl class="m-0 flex flex-wrap items-center gap-x-3 gap-y-2">
|
||||
<dd><code class="inline-code"><%= pageData.permissionGroups[g].permissions[i].permission -%></code></dd>
|
||||
<dd class="font-mono text-xs text-slate-500"><%= pageData.permissionGroups[g].permissions[i].title -%></dd>
|
||||
<dd class="w-full flex-none text-sm text-slate-600 mt-1"><%= pageData.permissionGroups[g].permissions[i].description -%></dd>
|
||||
</dl>
|
||||
</li>
|
||||
<% } %>
|
||||
</ul>
|
||||
</div>
|
||||
<% } %>
|
||||
</article>
|
||||
</main>
|
||||
</main>
|
||||
|
||||
@@ -406,6 +406,52 @@
|
||||
</ul>
|
||||
</div>
|
||||
</li>
|
||||
<% if (typeof dataTypes !== 'undefined' && dataTypes && dataTypes.length > 0) { %>
|
||||
<%
|
||||
// Group data types by category
|
||||
var _dtGeneral = [];
|
||||
var _dtCategories = {};
|
||||
var _dtCatOrder = [];
|
||||
for (var _di = 0; _di < dataTypes.length; _di++) {
|
||||
var _dt = dataTypes[_di];
|
||||
if (_dt.category) {
|
||||
if (!_dtCategories[_dt.category]) {
|
||||
_dtCategories[_dt.category] = [];
|
||||
_dtCatOrder.push(_dt.category);
|
||||
}
|
||||
_dtCategories[_dt.category].push(_dt);
|
||||
} else {
|
||||
_dtGeneral.push(_dt);
|
||||
}
|
||||
}
|
||||
%>
|
||||
<li class="relative mt-6">
|
||||
<h6 class="text-xs font-semibold text-slate-900 uppercase tracking-wide">Data Types</h6>
|
||||
<div class="relative mt-3 pl-2">
|
||||
<div class="absolute inset-y-0 left-2 w-px bg-slate-200"></div>
|
||||
<ul role="list" class="border-l border-transparent space-y-1">
|
||||
<% for(var i=0; i<_dtGeneral.length; i++) {%>
|
||||
<li class="relative"><a
|
||||
class="nav-link flex justify-between gap-2 py-1.5 pr-3 text-sm transition pl-4 text-slate-600 hover:text-slate-900 -ml-px border-l-2 border-transparent hover:border-slate-300"
|
||||
href="/reference/<%= _dtGeneral[i].path -%>"><span class="truncate"><%= _dtGeneral[i].name -%></span></a></li>
|
||||
<% } %>
|
||||
</ul>
|
||||
<% for (var _ci = 0; _ci < _dtCatOrder.length; _ci++) { %>
|
||||
<% var _catName = _dtCatOrder[_ci]; var _catTypes = _dtCategories[_catName]; %>
|
||||
<div class="mt-3 mb-1 pl-4">
|
||||
<span class="text-[10px] font-semibold text-slate-400 uppercase tracking-wider"><%= _catName %></span>
|
||||
</div>
|
||||
<ul role="list" class="border-l border-transparent space-y-1">
|
||||
<% for(var _ti=0; _ti<_catTypes.length; _ti++) {%>
|
||||
<li class="relative"><a
|
||||
class="nav-link flex justify-between gap-2 py-1.5 pr-3 text-sm transition pl-4 text-slate-600 hover:text-slate-900 -ml-px border-l-2 border-transparent hover:border-slate-300"
|
||||
href="/reference/<%= _catTypes[_ti].path -%>"><span class="truncate"><%= _catTypes[_ti].name -%></span></a></li>
|
||||
<% } %>
|
||||
</ul>
|
||||
<% } %>
|
||||
</div>
|
||||
</li>
|
||||
<% } %>
|
||||
<li class="sticky bottom-0 z-10 mt-6 min-[416px]:hidden"><a
|
||||
class="inline-flex gap-0.5 justify-center overflow-hidden text-sm font-medium transition rounded-full bg-indigo-600 py-1.5 px-4 text-white hover:bg-indigo-700 shadow-sm w-full"
|
||||
href="/#">Sign in</a></li>
|
||||
@@ -537,6 +583,45 @@
|
||||
<% } %>
|
||||
</ul>
|
||||
</li>
|
||||
<% if (typeof dataTypes !== 'undefined' && dataTypes && dataTypes.length > 0) { %>
|
||||
<%
|
||||
// Group data types by category for mobile nav
|
||||
var _mGeneral = [];
|
||||
var _mCategories = {};
|
||||
var _mCatOrder = [];
|
||||
for (var _mi = 0; _mi < dataTypes.length; _mi++) {
|
||||
var _mdt = dataTypes[_mi];
|
||||
if (_mdt.category) {
|
||||
if (!_mCategories[_mdt.category]) {
|
||||
_mCategories[_mdt.category] = [];
|
||||
_mCatOrder.push(_mdt.category);
|
||||
}
|
||||
_mCategories[_mdt.category].push(_mdt);
|
||||
} else {
|
||||
_mGeneral.push(_mdt);
|
||||
}
|
||||
}
|
||||
%>
|
||||
<li class="relative">
|
||||
<h6 class="text-xs font-semibold text-slate-900 uppercase tracking-wide mb-3">Data Types</h6>
|
||||
<ul role="list" class="space-y-1 border-l border-slate-200 ml-2">
|
||||
<% for(var i=0; i<_mGeneral.length; i++) {%>
|
||||
<li><a class="mobile-nav-link block py-2 pl-4 text-sm text-slate-600 hover:text-slate-900 border-l-2 border-transparent hover:border-slate-300 -ml-px transition truncate" href="/reference/<%= _mGeneral[i].path -%>"><%= _mGeneral[i].name -%></a></li>
|
||||
<% } %>
|
||||
</ul>
|
||||
<% for (var _mci = 0; _mci < _mCatOrder.length; _mci++) { %>
|
||||
<% var _mCatName = _mCatOrder[_mci]; var _mCatTypes = _mCategories[_mCatName]; %>
|
||||
<div class="mt-3 mb-1 ml-4">
|
||||
<span class="text-[10px] font-semibold text-slate-400 uppercase tracking-wider"><%= _mCatName %></span>
|
||||
</div>
|
||||
<ul role="list" class="space-y-1 border-l border-slate-200 ml-2">
|
||||
<% for(var _mti=0; _mti<_mCatTypes.length; _mti++) {%>
|
||||
<li><a class="mobile-nav-link block py-2 pl-4 text-sm text-slate-600 hover:text-slate-900 border-l-2 border-transparent hover:border-slate-300 -ml-px transition truncate" href="/reference/<%= _mCatTypes[_mti].path -%>"><%= _mCatTypes[_mti].name -%></a></li>
|
||||
<% } %>
|
||||
</ul>
|
||||
<% } %>
|
||||
</li>
|
||||
<% } %>
|
||||
</ul>
|
||||
</nav>
|
||||
|
||||
|
||||
13
Accounts/package-lock.json
generated
13
Accounts/package-lock.json
generated
@@ -77,6 +77,7 @@
|
||||
"ejs": "^3.1.10",
|
||||
"elkjs": "^0.10.0",
|
||||
"esbuild": "^0.25.5",
|
||||
"expo-server-sdk": "^3.15.0",
|
||||
"express": "^4.21.1",
|
||||
"formik": "^2.4.6",
|
||||
"history": "^5.3.0",
|
||||
@@ -86,6 +87,7 @@
|
||||
"jsonwebtoken": "^9.0.0",
|
||||
"jwt-decode": "^4.0.0",
|
||||
"marked": "^12.0.2",
|
||||
"mermaid": "^11.12.2",
|
||||
"moment": "^2.30.1",
|
||||
"moment-timezone": "^0.5.45",
|
||||
"multer": "^2.0.2",
|
||||
@@ -105,7 +107,7 @@
|
||||
"react-dropzone": "^14.2.2",
|
||||
"react-error-boundary": "^4.0.13",
|
||||
"react-highlight": "^0.15.0",
|
||||
"react-markdown": "^8.0.3",
|
||||
"react-markdown": "^9.0.0",
|
||||
"react-router-dom": "^6.30.1",
|
||||
"react-select": "^5.4.0",
|
||||
"react-spinners": "^0.14.1",
|
||||
@@ -115,7 +117,7 @@
|
||||
"recharts": "^2.12.7",
|
||||
"redis-semaphore": "^5.5.1",
|
||||
"reflect-metadata": "^0.2.2",
|
||||
"remark-gfm": "^3.0.1",
|
||||
"remark-gfm": "^4.0.0",
|
||||
"slackify-markdown": "^4.4.0",
|
||||
"slugify": "^1.6.5",
|
||||
"socket.io": "^4.7.4",
|
||||
@@ -658,10 +660,11 @@
|
||||
}
|
||||
},
|
||||
"node_modules/diff": {
|
||||
"version": "4.0.2",
|
||||
"resolved": "https://registry.npmjs.org/diff/-/diff-4.0.2.tgz",
|
||||
"integrity": "sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A==",
|
||||
"version": "4.0.4",
|
||||
"resolved": "https://registry.npmjs.org/diff/-/diff-4.0.4.tgz",
|
||||
"integrity": "sha512-X07nttJQkwkfKfvTPG/KSnE2OMdcUCao6+eXF3wmnIQRn2aPAHH3VxDbDOdegkd6JbPsXqShpvEOHfAT+nCNwQ==",
|
||||
"dev": true,
|
||||
"license": "BSD-3-Clause",
|
||||
"engines": {
|
||||
"node": ">=0.3.1"
|
||||
}
|
||||
|
||||
@@ -32,6 +32,7 @@ import Reseller from "Common/Models/DatabaseModels/Reseller";
|
||||
import User from "Common/Models/DatabaseModels/User";
|
||||
import React, { useState } from "react";
|
||||
import useAsyncEffect from "use-async-effect";
|
||||
import { IsBillingEnabled } from "Common/Server/EnvironmentConfig";
|
||||
|
||||
const RegisterPage: () => JSX.Element = () => {
|
||||
const apiUrl: URL = SIGNUP_API_URL;
|
||||
@@ -172,6 +173,36 @@ const RegisterPage: () => JSX.Element = () => {
|
||||
}
|
||||
}
|
||||
|
||||
if (!BILLING_ENABLED) {
|
||||
formFields = formFields.concat([
|
||||
{
|
||||
overrideField: {
|
||||
selfHostedCompanyName: true,
|
||||
},
|
||||
overrideFieldKey: "selfHostedCompanyName",
|
||||
fieldType: FormFieldSchemaType.Text,
|
||||
placeholder: "Acme, Inc.",
|
||||
required: false,
|
||||
title: "Company Name",
|
||||
dataTestId: "selfHostedCompanyName",
|
||||
showEvenIfPermissionDoesNotExist: true,
|
||||
disableSpellCheck: true,
|
||||
},
|
||||
{
|
||||
overrideField: {
|
||||
selfHostedPhoneNumber: true,
|
||||
},
|
||||
overrideFieldKey: "selfHostedPhoneNumber",
|
||||
fieldType: FormFieldSchemaType.Phone,
|
||||
required: false,
|
||||
placeholder: "+11234567890",
|
||||
title: "Phone Number",
|
||||
dataTestId: "selfHostedPhoneNumber",
|
||||
showEvenIfPermissionDoesNotExist: true,
|
||||
},
|
||||
]);
|
||||
}
|
||||
|
||||
formFields = formFields.concat([
|
||||
{
|
||||
field: {
|
||||
@@ -206,6 +237,25 @@ const RegisterPage: () => JSX.Element = () => {
|
||||
},
|
||||
]);
|
||||
|
||||
if (!IsBillingEnabled) {
|
||||
formFields = formFields.concat([
|
||||
{
|
||||
overrideField: {
|
||||
notifySelfHosted: true,
|
||||
},
|
||||
overrideFieldKey: "notifySelfHosted",
|
||||
|
||||
fieldType: FormFieldSchemaType.Checkbox,
|
||||
required: false,
|
||||
defaultValue: true,
|
||||
title: "Notify me about security patches and new releases",
|
||||
dataTestId: "notifySelfHosted",
|
||||
showEvenIfPermissionDoesNotExist: true,
|
||||
spanFullRow: true,
|
||||
},
|
||||
]);
|
||||
}
|
||||
|
||||
if (isCaptchaEnabled) {
|
||||
formFields = formFields.concat([
|
||||
{
|
||||
@@ -330,6 +380,7 @@ const RegisterPage: () => JSX.Element = () => {
|
||||
if (value && value.email) {
|
||||
UiAnalytics.userAuth(value.email);
|
||||
UiAnalytics.capture("accounts/register");
|
||||
UiAnalytics.capture("sign_up");
|
||||
}
|
||||
|
||||
LoginUtil.login({
|
||||
|
||||
13
AdminDashboard/package-lock.json
generated
13
AdminDashboard/package-lock.json
generated
@@ -76,6 +76,7 @@
|
||||
"ejs": "^3.1.10",
|
||||
"elkjs": "^0.10.0",
|
||||
"esbuild": "^0.25.5",
|
||||
"expo-server-sdk": "^3.15.0",
|
||||
"express": "^4.21.1",
|
||||
"formik": "^2.4.6",
|
||||
"history": "^5.3.0",
|
||||
@@ -85,6 +86,7 @@
|
||||
"jsonwebtoken": "^9.0.0",
|
||||
"jwt-decode": "^4.0.0",
|
||||
"marked": "^12.0.2",
|
||||
"mermaid": "^11.12.2",
|
||||
"moment": "^2.30.1",
|
||||
"moment-timezone": "^0.5.45",
|
||||
"multer": "^2.0.2",
|
||||
@@ -104,7 +106,7 @@
|
||||
"react-dropzone": "^14.2.2",
|
||||
"react-error-boundary": "^4.0.13",
|
||||
"react-highlight": "^0.15.0",
|
||||
"react-markdown": "^8.0.3",
|
||||
"react-markdown": "^9.0.0",
|
||||
"react-router-dom": "^6.30.1",
|
||||
"react-select": "^5.4.0",
|
||||
"react-spinners": "^0.14.1",
|
||||
@@ -114,7 +116,7 @@
|
||||
"recharts": "^2.12.7",
|
||||
"redis-semaphore": "^5.5.1",
|
||||
"reflect-metadata": "^0.2.2",
|
||||
"remark-gfm": "^3.0.1",
|
||||
"remark-gfm": "^4.0.0",
|
||||
"slackify-markdown": "^4.4.0",
|
||||
"slugify": "^1.6.5",
|
||||
"socket.io": "^4.7.4",
|
||||
@@ -577,10 +579,11 @@
|
||||
}
|
||||
},
|
||||
"node_modules/diff": {
|
||||
"version": "4.0.2",
|
||||
"resolved": "https://registry.npmjs.org/diff/-/diff-4.0.2.tgz",
|
||||
"integrity": "sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A==",
|
||||
"version": "4.0.4",
|
||||
"resolved": "https://registry.npmjs.org/diff/-/diff-4.0.4.tgz",
|
||||
"integrity": "sha512-X07nttJQkwkfKfvTPG/KSnE2OMdcUCao6+eXF3wmnIQRn2aPAHH3VxDbDOdegkd6JbPsXqShpvEOHfAT+nCNwQ==",
|
||||
"dev": true,
|
||||
"license": "BSD-3-Clause",
|
||||
"engines": {
|
||||
"node": ">=0.3.1"
|
||||
}
|
||||
|
||||
@@ -4,6 +4,7 @@ import Logout from "./Pages/Logout/Logout";
|
||||
import Projects from "./Pages/Projects/Index";
|
||||
import SettingsAPIKey from "./Pages/Settings/APIKey/Index";
|
||||
import SettingsAuthentication from "./Pages/Settings/Authentication/Index";
|
||||
import SettingsDataRetention from "./Pages/Settings/DataRetention/Index";
|
||||
import SettingsCallSMS from "./Pages/Settings/CallSMS/Index";
|
||||
import SettingsWhatsApp from "./Pages/Settings/WhatsApp/Index";
|
||||
// Settings Pages.
|
||||
@@ -143,6 +144,11 @@ const App: () => JSX.Element = () => {
|
||||
path={RouteMap[PageMap.SETTINGS_API_KEY]?.toString() || ""}
|
||||
element={<SettingsAPIKey />}
|
||||
/>
|
||||
|
||||
<PageRoute
|
||||
path={RouteMap[PageMap.SETTINGS_DATA_RETENTION]?.toString() || ""}
|
||||
element={<SettingsDataRetention />}
|
||||
/>
|
||||
</Routes>
|
||||
</MasterPage>
|
||||
);
|
||||
|
||||
@@ -12,7 +12,6 @@ import Toggle from "Common/UI/Components/Toggle/Toggle";
|
||||
import FieldType from "Common/UI/Components/Types/FieldType";
|
||||
import { BILLING_ENABLED, getAllEnvVars } from "Common/UI/Config";
|
||||
import { GetReactElementFunction } from "Common/UI/Types/FunctionTypes";
|
||||
import Navigation from "Common/UI/Utils/Navigation";
|
||||
import Project from "Common/Models/DatabaseModels/Project";
|
||||
import User from "Common/Models/DatabaseModels/User";
|
||||
import React, {
|
||||
@@ -21,6 +20,7 @@ import React, {
|
||||
useEffect,
|
||||
useState,
|
||||
} from "react";
|
||||
import Navigation from "Common/UI/Utils/Navigation";
|
||||
|
||||
const Projects: FunctionComponent = (): ReactElement => {
|
||||
const [isSubscriptionPlanYearly, setIsSubscriptionPlanYearly] =
|
||||
|
||||
@@ -1,3 +1,4 @@
|
||||
import AdminModelAPI from "../../../Utils/ModelAPI";
|
||||
import PageMap from "../../../Utils/PageMap";
|
||||
import RouteMap, { RouteUtil } from "../../../Utils/RouteMap";
|
||||
import Route from "Common/Types/API/Route";
|
||||
@@ -17,6 +18,7 @@ const DeletePage: FunctionComponent = (): ReactElement => {
|
||||
modelId={modelId}
|
||||
modelNameField="name"
|
||||
modelType={Project}
|
||||
modelAPI={AdminModelAPI}
|
||||
title={"Project"}
|
||||
breadcrumbLinks={[
|
||||
{
|
||||
@@ -41,6 +43,7 @@ const DeletePage: FunctionComponent = (): ReactElement => {
|
||||
<ModelDelete
|
||||
modelType={Project}
|
||||
modelId={modelId}
|
||||
modelAPI={AdminModelAPI}
|
||||
onDeleteSuccess={() => {
|
||||
Navigation.navigate(RouteMap[PageMap.PROJECTS] as Route);
|
||||
}}
|
||||
|
||||
@@ -1,3 +1,4 @@
|
||||
import AdminModelAPI from "../../../Utils/ModelAPI";
|
||||
import ObjectID from "Common/Types/ObjectID";
|
||||
import PageMap from "../../../Utils/PageMap";
|
||||
import RouteMap, { RouteUtil } from "../../../Utils/RouteMap";
|
||||
@@ -19,6 +20,7 @@ const Projects: FunctionComponent = (): ReactElement => {
|
||||
modelId={modelId}
|
||||
modelNameField="name"
|
||||
modelType={Project}
|
||||
modelAPI={AdminModelAPI}
|
||||
title={"Project"}
|
||||
breadcrumbLinks={[
|
||||
{
|
||||
@@ -43,6 +45,7 @@ const Projects: FunctionComponent = (): ReactElement => {
|
||||
<div>
|
||||
<CardModelDetail<Project>
|
||||
name="Project"
|
||||
modelAPI={AdminModelAPI}
|
||||
cardProps={{
|
||||
title: "Project",
|
||||
description: "Project details",
|
||||
|
||||
85
AdminDashboard/src/Pages/Settings/DataRetention/Index.tsx
Normal file
85
AdminDashboard/src/Pages/Settings/DataRetention/Index.tsx
Normal file
@@ -0,0 +1,85 @@
|
||||
import PageMap from "../../../Utils/PageMap";
|
||||
import RouteMap, { RouteUtil } from "../../../Utils/RouteMap";
|
||||
import DashboardSideMenu from "../SideMenu";
|
||||
import Route from "Common/Types/API/Route";
|
||||
import ObjectID from "Common/Types/ObjectID";
|
||||
import FormFieldSchemaType from "Common/UI/Components/Forms/Types/FormFieldSchemaType";
|
||||
import CardModelDetail from "Common/UI/Components/ModelDetail/CardModelDetail";
|
||||
import Page from "Common/UI/Components/Page/Page";
|
||||
import FieldType from "Common/UI/Components/Types/FieldType";
|
||||
import GlobalConfig from "Common/Models/DatabaseModels/GlobalConfig";
|
||||
import React, { FunctionComponent, ReactElement } from "react";
|
||||
|
||||
const Settings: FunctionComponent = (): ReactElement => {
|
||||
return (
|
||||
<Page
|
||||
title={"Admin Settings"}
|
||||
breadcrumbLinks={[
|
||||
{
|
||||
title: "Admin Dashboard",
|
||||
to: RouteUtil.populateRouteParams(RouteMap[PageMap.HOME] as Route),
|
||||
},
|
||||
{
|
||||
title: "Settings",
|
||||
to: RouteUtil.populateRouteParams(
|
||||
RouteMap[PageMap.SETTINGS] as Route,
|
||||
),
|
||||
},
|
||||
{
|
||||
title: "Data Retention",
|
||||
to: RouteUtil.populateRouteParams(
|
||||
RouteMap[PageMap.SETTINGS_DATA_RETENTION] as Route,
|
||||
),
|
||||
},
|
||||
]}
|
||||
sideMenu={<DashboardSideMenu />}
|
||||
>
|
||||
<CardModelDetail
|
||||
name="Monitor Log Retention Settings"
|
||||
cardProps={{
|
||||
title: "Monitor Log Retention",
|
||||
description:
|
||||
"Configure how long monitor logs are retained before being automatically deleted.",
|
||||
}}
|
||||
isEditable={true}
|
||||
editButtonText="Edit Settings"
|
||||
formFields={[
|
||||
{
|
||||
field: {
|
||||
monitorLogRetentionInDays: true,
|
||||
},
|
||||
title: "Monitor Log Retention (Days)",
|
||||
fieldType: FormFieldSchemaType.PositiveNumber,
|
||||
required: false,
|
||||
description:
|
||||
"Number of days to retain monitor logs. Monitor logs older than this will be automatically deleted. Default is 1 day if not set. Minimum: 1 day, Maximum: 365 days.",
|
||||
validation: {
|
||||
minValue: 1,
|
||||
maxValue: 365,
|
||||
},
|
||||
placeholder: "1",
|
||||
},
|
||||
]}
|
||||
modelDetailProps={{
|
||||
modelType: GlobalConfig,
|
||||
id: "model-detail-global-config-data-retention",
|
||||
fields: [
|
||||
{
|
||||
field: {
|
||||
monitorLogRetentionInDays: true,
|
||||
},
|
||||
fieldType: FieldType.Number,
|
||||
title: "Monitor Log Retention (Days)",
|
||||
placeholder: "1 (default)",
|
||||
description:
|
||||
"Number of days to retain monitor logs. Monitor logs older than this will be automatically deleted.",
|
||||
},
|
||||
],
|
||||
modelId: ObjectID.getZeroObjectID(),
|
||||
}}
|
||||
/>
|
||||
</Page>
|
||||
);
|
||||
};
|
||||
|
||||
export default Settings;
|
||||
@@ -72,6 +72,17 @@ const DashboardSideMenu: () => JSX.Element = (): ReactElement => {
|
||||
icon={IconProp.Signal}
|
||||
/>
|
||||
</SideMenuSection>
|
||||
<SideMenuSection title="Data Retention">
|
||||
<SideMenuItem
|
||||
link={{
|
||||
title: "Data Retention",
|
||||
to: RouteUtil.populateRouteParams(
|
||||
RouteMap[PageMap.SETTINGS_DATA_RETENTION] as Route,
|
||||
),
|
||||
}}
|
||||
icon={IconProp.Database}
|
||||
/>
|
||||
</SideMenuSection>
|
||||
<SideMenuSection title="AI">
|
||||
<SideMenuItem
|
||||
link={{
|
||||
|
||||
@@ -1,3 +1,4 @@
|
||||
import AdminModelAPI from "../../../Utils/ModelAPI";
|
||||
import PageMap from "../../../Utils/PageMap";
|
||||
import RouteMap, { RouteUtil } from "../../../Utils/RouteMap";
|
||||
import Route from "Common/Types/API/Route";
|
||||
@@ -17,6 +18,7 @@ const DeletePage: FunctionComponent = (): ReactElement => {
|
||||
modelId={modelId}
|
||||
modelNameField="email"
|
||||
modelType={User}
|
||||
modelAPI={AdminModelAPI}
|
||||
title={"User"}
|
||||
breadcrumbLinks={[
|
||||
{
|
||||
@@ -39,6 +41,7 @@ const DeletePage: FunctionComponent = (): ReactElement => {
|
||||
<ModelDelete
|
||||
modelType={User}
|
||||
modelId={modelId}
|
||||
modelAPI={AdminModelAPI}
|
||||
onDeleteSuccess={() => {
|
||||
Navigation.navigate(RouteMap[PageMap.USERS] as Route);
|
||||
}}
|
||||
|
||||
@@ -1,3 +1,4 @@
|
||||
import AdminModelAPI from "../../../Utils/ModelAPI";
|
||||
import ObjectID from "Common/Types/ObjectID";
|
||||
import PageMap from "../../../Utils/PageMap";
|
||||
import RouteMap, { RouteUtil } from "../../../Utils/RouteMap";
|
||||
@@ -19,6 +20,7 @@ const Users: FunctionComponent = (): ReactElement => {
|
||||
modelId={modelId}
|
||||
modelNameField="email"
|
||||
modelType={User}
|
||||
modelAPI={AdminModelAPI}
|
||||
title={"User"}
|
||||
breadcrumbLinks={[
|
||||
{
|
||||
@@ -41,6 +43,7 @@ const Users: FunctionComponent = (): ReactElement => {
|
||||
<div>
|
||||
<CardModelDetail<User>
|
||||
name="User"
|
||||
modelAPI={AdminModelAPI}
|
||||
cardProps={{
|
||||
title: "User",
|
||||
description: "User details",
|
||||
|
||||
@@ -1,3 +1,4 @@
|
||||
import AdminModelAPI from "../../../Utils/ModelAPI";
|
||||
import PageMap from "../../../Utils/PageMap";
|
||||
import RouteMap, { RouteUtil } from "../../../Utils/RouteMap";
|
||||
import Route from "Common/Types/API/Route";
|
||||
@@ -19,6 +20,7 @@ const UserSettings: FunctionComponent = (): ReactElement => {
|
||||
modelId={modelId}
|
||||
modelNameField="email"
|
||||
modelType={User}
|
||||
modelAPI={AdminModelAPI}
|
||||
title={"User"}
|
||||
breadcrumbLinks={[
|
||||
{
|
||||
@@ -52,6 +54,7 @@ const UserSettings: FunctionComponent = (): ReactElement => {
|
||||
>
|
||||
<CardModelDetail<User>
|
||||
name="user-master-admin-settings"
|
||||
modelAPI={AdminModelAPI}
|
||||
cardProps={{
|
||||
title: "Master Admin Access",
|
||||
description:
|
||||
|
||||
@@ -22,6 +22,7 @@ enum PageMap {
|
||||
SETTINGS_LLM_PROVIDERS = "SETTINGS_LLM_PROVIDERS",
|
||||
SETTINGS_AUTHENTICATION = "SETTINGS_AUTHENTICATION",
|
||||
SETTINGS_API_KEY = "SETTINGS_API_KEY",
|
||||
SETTINGS_DATA_RETENTION = "SETTINGS_DATA_RETENTION",
|
||||
}
|
||||
|
||||
export default PageMap;
|
||||
|
||||
@@ -36,6 +36,9 @@ const RouteMap: Dictionary<Route> = {
|
||||
`/admin/settings/authentication`,
|
||||
),
|
||||
[PageMap.SETTINGS_API_KEY]: new Route(`/admin/settings/api-key`),
|
||||
[PageMap.SETTINGS_DATA_RETENTION]: new Route(
|
||||
`/admin/settings/data-retention`,
|
||||
),
|
||||
};
|
||||
|
||||
export class RouteUtil {
|
||||
|
||||
@@ -23,6 +23,7 @@ import WhatsAppLogAPI from "./WhatsAppLogAPI";
|
||||
// Import API
|
||||
import ResellerPlanAPI from "Common/Server/API/ResellerPlanAPI";
|
||||
import EnterpriseLicenseAPI from "Common/Server/API/EnterpriseLicenseAPI";
|
||||
import OpenSourceDeploymentAPI from "Common/Server/API/OpenSourceDeploymentAPI";
|
||||
import MonitorAPI from "Common/Server/API/MonitorAPI";
|
||||
import ShortLinkAPI from "Common/Server/API/ShortLinkAPI";
|
||||
import StatusPageAPI from "Common/Server/API/StatusPageAPI";
|
||||
@@ -35,9 +36,11 @@ import UserWebAuthnAPI from "Common/Server/API/UserWebAuthnAPI";
|
||||
import MonitorTest from "Common/Models/DatabaseModels/MonitorTest";
|
||||
import IncidentInternalNoteAPI from "Common/Server/API/IncidentInternalNoteAPI";
|
||||
import IncidentPublicNoteAPI from "Common/Server/API/IncidentPublicNoteAPI";
|
||||
import IncidentEpisodePublicNoteAPI from "Common/Server/API/IncidentEpisodePublicNoteAPI";
|
||||
import ScheduledMaintenanceInternalNoteAPI from "Common/Server/API/ScheduledMaintenanceInternalNoteAPI";
|
||||
import ScheduledMaintenancePublicNoteAPI from "Common/Server/API/ScheduledMaintenancePublicNoteAPI";
|
||||
import IncidentAPI from "Common/Server/API/IncidentAPI";
|
||||
import IncidentEpisodeAPI from "Common/Server/API/IncidentEpisodeAPI";
|
||||
import ScheduledMaintenanceAPI from "Common/Server/API/ScheduledMaintenanceAPI";
|
||||
import AlertAPI from "Common/Server/API/AlertAPI";
|
||||
// User Notification methods.
|
||||
@@ -106,6 +109,70 @@ import AlertStateTimelineService, {
|
||||
Service as AlertStateTimelineServiceType,
|
||||
} from "Common/Server/Services/AlertStateTimelineService";
|
||||
|
||||
// AlertEpisode Services
|
||||
import AlertEpisodeService, {
|
||||
Service as AlertEpisodeServiceType,
|
||||
} from "Common/Server/Services/AlertEpisodeService";
|
||||
import AlertEpisodeFeedService, {
|
||||
Service as AlertEpisodeFeedServiceType,
|
||||
} from "Common/Server/Services/AlertEpisodeFeedService";
|
||||
import AlertEpisodeInternalNoteService, {
|
||||
Service as AlertEpisodeInternalNoteServiceType,
|
||||
} from "Common/Server/Services/AlertEpisodeInternalNoteService";
|
||||
import AlertEpisodeMemberService, {
|
||||
Service as AlertEpisodeMemberServiceType,
|
||||
} from "Common/Server/Services/AlertEpisodeMemberService";
|
||||
import AlertEpisodeOwnerTeamService, {
|
||||
Service as AlertEpisodeOwnerTeamServiceType,
|
||||
} from "Common/Server/Services/AlertEpisodeOwnerTeamService";
|
||||
import AlertEpisodeOwnerUserService, {
|
||||
Service as AlertEpisodeOwnerUserServiceType,
|
||||
} from "Common/Server/Services/AlertEpisodeOwnerUserService";
|
||||
import AlertEpisodeStateTimelineService, {
|
||||
Service as AlertEpisodeStateTimelineServiceType,
|
||||
} from "Common/Server/Services/AlertEpisodeStateTimelineService";
|
||||
|
||||
// IncidentEpisode Services
|
||||
|
||||
import IncidentEpisodeFeedService, {
|
||||
Service as IncidentEpisodeFeedServiceType,
|
||||
} from "Common/Server/Services/IncidentEpisodeFeedService";
|
||||
import IncidentEpisodeInternalNoteService, {
|
||||
Service as IncidentEpisodeInternalNoteServiceType,
|
||||
} from "Common/Server/Services/IncidentEpisodeInternalNoteService";
|
||||
import IncidentEpisodeMemberService, {
|
||||
Service as IncidentEpisodeMemberServiceType,
|
||||
} from "Common/Server/Services/IncidentEpisodeMemberService";
|
||||
import IncidentEpisodeOwnerTeamService, {
|
||||
Service as IncidentEpisodeOwnerTeamServiceType,
|
||||
} from "Common/Server/Services/IncidentEpisodeOwnerTeamService";
|
||||
import IncidentEpisodeOwnerUserService, {
|
||||
Service as IncidentEpisodeOwnerUserServiceType,
|
||||
} from "Common/Server/Services/IncidentEpisodeOwnerUserService";
|
||||
import IncidentEpisodeStateTimelineService, {
|
||||
Service as IncidentEpisodeStateTimelineServiceType,
|
||||
} from "Common/Server/Services/IncidentEpisodeStateTimelineService";
|
||||
|
||||
import IncidentEpisodeRoleMemberService, {
|
||||
Service as IncidentEpisodeRoleMemberServiceType,
|
||||
} from "Common/Server/Services/IncidentEpisodeRoleMemberService";
|
||||
|
||||
import AlertGroupingRuleService, {
|
||||
Service as AlertGroupingRuleServiceType,
|
||||
} from "Common/Server/Services/AlertGroupingRuleService";
|
||||
|
||||
import IncidentGroupingRuleService, {
|
||||
Service as IncidentGroupingRuleServiceType,
|
||||
} from "Common/Server/Services/IncidentGroupingRuleService";
|
||||
|
||||
import IncidentSlaService, {
|
||||
Service as IncidentSlaServiceType,
|
||||
} from "Common/Server/Services/IncidentSlaService";
|
||||
|
||||
import IncidentSlaRuleService, {
|
||||
Service as IncidentSlaRuleServiceType,
|
||||
} from "Common/Server/Services/IncidentSlaRuleService";
|
||||
|
||||
import IncidentCustomFieldService, {
|
||||
Service as IncidentCustomFieldServiceType,
|
||||
} from "Common/Server/Services/IncidentCustomFieldService";
|
||||
@@ -127,6 +194,12 @@ import IncidentOwnerUserService, {
|
||||
import IncidentSeverityService, {
|
||||
Service as IncidentSeverityServiceType,
|
||||
} from "Common/Server/Services/IncidentSeverityService";
|
||||
import IncidentRoleService, {
|
||||
Service as IncidentRoleServiceType,
|
||||
} from "Common/Server/Services/IncidentRoleService";
|
||||
import IncidentMemberService, {
|
||||
Service as IncidentMemberServiceType,
|
||||
} from "Common/Server/Services/IncidentMemberService";
|
||||
import IncidentStateService, {
|
||||
Service as IncidentStateServiceType,
|
||||
} from "Common/Server/Services/IncidentStateService";
|
||||
@@ -237,6 +310,9 @@ import OnCallDutyPolicyScheduleService, {
|
||||
import ProjectCallSMSConfigService, {
|
||||
Service as ProjectCallSMSConfigServiceType,
|
||||
} from "Common/Server/Services/ProjectCallSMSConfigService";
|
||||
import ProjectUserProfileService, {
|
||||
Service as ProjectUserProfileServiceType,
|
||||
} from "Common/Server/Services/ProjectUserProfileService";
|
||||
import ProjectSmtpConfigService, {
|
||||
Service as ProjectSMTPConfigServiceType,
|
||||
} from "Common/Server/Services/ProjectSmtpConfigService";
|
||||
@@ -336,6 +412,9 @@ import StatusPageSSOService, {
|
||||
import TeamMemberService, {
|
||||
TeamMemberService as TeamMemberServiceType,
|
||||
} from "Common/Server/Services/TeamMemberService";
|
||||
import TeamMemberCustomFieldService, {
|
||||
Service as TeamMemberCustomFieldServiceType,
|
||||
} from "Common/Server/Services/TeamMemberCustomFieldService";
|
||||
import TeamPermissionService, {
|
||||
Service as TeamPermissionServiceType,
|
||||
} from "Common/Server/Services/TeamPermissionService";
|
||||
@@ -422,12 +501,36 @@ import AlertSeverity from "Common/Models/DatabaseModels/AlertSeverity";
|
||||
import AlertState from "Common/Models/DatabaseModels/AlertState";
|
||||
import AlertStateTimeline from "Common/Models/DatabaseModels/AlertStateTimeline";
|
||||
|
||||
// AlertEpisode Models
|
||||
import AlertEpisode from "Common/Models/DatabaseModels/AlertEpisode";
|
||||
import AlertEpisodeFeed from "Common/Models/DatabaseModels/AlertEpisodeFeed";
|
||||
import AlertEpisodeInternalNote from "Common/Models/DatabaseModels/AlertEpisodeInternalNote";
|
||||
import AlertEpisodeMember from "Common/Models/DatabaseModels/AlertEpisodeMember";
|
||||
import AlertEpisodeOwnerTeam from "Common/Models/DatabaseModels/AlertEpisodeOwnerTeam";
|
||||
import AlertEpisodeOwnerUser from "Common/Models/DatabaseModels/AlertEpisodeOwnerUser";
|
||||
import AlertEpisodeStateTimeline from "Common/Models/DatabaseModels/AlertEpisodeStateTimeline";
|
||||
import AlertGroupingRule from "Common/Models/DatabaseModels/AlertGroupingRule";
|
||||
import IncidentGroupingRule from "Common/Models/DatabaseModels/IncidentGroupingRule";
|
||||
import IncidentSla from "Common/Models/DatabaseModels/IncidentSla";
|
||||
import IncidentSlaRule from "Common/Models/DatabaseModels/IncidentSlaRule";
|
||||
|
||||
// IncidentEpisode Models
|
||||
import IncidentEpisodeFeed from "Common/Models/DatabaseModels/IncidentEpisodeFeed";
|
||||
import IncidentEpisodeInternalNote from "Common/Models/DatabaseModels/IncidentEpisodeInternalNote";
|
||||
import IncidentEpisodeMember from "Common/Models/DatabaseModels/IncidentEpisodeMember";
|
||||
import IncidentEpisodeOwnerTeam from "Common/Models/DatabaseModels/IncidentEpisodeOwnerTeam";
|
||||
import IncidentEpisodeOwnerUser from "Common/Models/DatabaseModels/IncidentEpisodeOwnerUser";
|
||||
import IncidentEpisodeStateTimeline from "Common/Models/DatabaseModels/IncidentEpisodeStateTimeline";
|
||||
import IncidentEpisodeRoleMember from "Common/Models/DatabaseModels/IncidentEpisodeRoleMember";
|
||||
|
||||
import IncidentCustomField from "Common/Models/DatabaseModels/IncidentCustomField";
|
||||
import IncidentNoteTemplate from "Common/Models/DatabaseModels/IncidentNoteTemplate";
|
||||
import IncidentPostmortemTemplate from "Common/Models/DatabaseModels/IncidentPostmortemTemplate";
|
||||
import IncidentOwnerTeam from "Common/Models/DatabaseModels/IncidentOwnerTeam";
|
||||
import IncidentOwnerUser from "Common/Models/DatabaseModels/IncidentOwnerUser";
|
||||
import IncidentSeverity from "Common/Models/DatabaseModels/IncidentSeverity";
|
||||
import IncidentRole from "Common/Models/DatabaseModels/IncidentRole";
|
||||
import IncidentMember from "Common/Models/DatabaseModels/IncidentMember";
|
||||
import IncidentState from "Common/Models/DatabaseModels/IncidentState";
|
||||
import IncidentStateTimeline from "Common/Models/DatabaseModels/IncidentStateTimeline";
|
||||
import IncidentTemplate from "Common/Models/DatabaseModels/IncidentTemplate";
|
||||
@@ -463,6 +566,7 @@ import OnCallDutyPolicyScheduleLayer from "Common/Models/DatabaseModels/OnCallDu
|
||||
import OnCallDutyPolicyScheduleLayerUser from "Common/Models/DatabaseModels/OnCallDutyPolicyScheduleLayerUser";
|
||||
import ProjectCallSMSConfig from "Common/Models/DatabaseModels/ProjectCallSMSConfig";
|
||||
import ProjectSmtpConfig from "Common/Models/DatabaseModels/ProjectSmtpConfig";
|
||||
import ProjectUserProfile from "Common/Models/DatabaseModels/ProjectUserProfile";
|
||||
import PromoCode from "Common/Models/DatabaseModels/PromoCode";
|
||||
import CodeRepository from "Common/Models/DatabaseModels/CodeRepository";
|
||||
import Reseller from "Common/Models/DatabaseModels/Reseller";
|
||||
@@ -491,6 +595,7 @@ import StatusPageResource from "Common/Models/DatabaseModels/StatusPageResource"
|
||||
import StatusPageSSO from "Common/Models/DatabaseModels/StatusPageSso";
|
||||
import Team from "Common/Models/DatabaseModels/Team";
|
||||
import TeamMember from "Common/Models/DatabaseModels/TeamMember";
|
||||
import TeamMemberCustomField from "Common/Models/DatabaseModels/TeamMemberCustomField";
|
||||
import TeamPermission from "Common/Models/DatabaseModels/TeamPermission";
|
||||
import TeamComplianceSetting from "Common/Models/DatabaseModels/TeamComplianceSetting";
|
||||
import TelemetryUsageBilling from "Common/Models/DatabaseModels/TelemetryUsageBilling";
|
||||
@@ -905,6 +1010,171 @@ const BaseAPIFeatureSet: FeatureSet = {
|
||||
).getRouter(),
|
||||
);
|
||||
|
||||
// AlertEpisode Routes
|
||||
app.use(
|
||||
`/${APP_NAME.toLocaleLowerCase()}`,
|
||||
new BaseAPI<AlertEpisode, AlertEpisodeServiceType>(
|
||||
AlertEpisode,
|
||||
AlertEpisodeService,
|
||||
).getRouter(),
|
||||
);
|
||||
|
||||
app.use(
|
||||
`/${APP_NAME.toLocaleLowerCase()}`,
|
||||
new BaseAPI<AlertEpisodeFeed, AlertEpisodeFeedServiceType>(
|
||||
AlertEpisodeFeed,
|
||||
AlertEpisodeFeedService,
|
||||
).getRouter(),
|
||||
);
|
||||
|
||||
app.use(
|
||||
`/${APP_NAME.toLocaleLowerCase()}`,
|
||||
new BaseAPI<
|
||||
AlertEpisodeInternalNote,
|
||||
AlertEpisodeInternalNoteServiceType
|
||||
>(AlertEpisodeInternalNote, AlertEpisodeInternalNoteService).getRouter(),
|
||||
);
|
||||
|
||||
app.use(
|
||||
`/${APP_NAME.toLocaleLowerCase()}`,
|
||||
new BaseAPI<AlertEpisodeMember, AlertEpisodeMemberServiceType>(
|
||||
AlertEpisodeMember,
|
||||
AlertEpisodeMemberService,
|
||||
).getRouter(),
|
||||
);
|
||||
|
||||
app.use(
|
||||
`/${APP_NAME.toLocaleLowerCase()}`,
|
||||
new BaseAPI<AlertEpisodeOwnerTeam, AlertEpisodeOwnerTeamServiceType>(
|
||||
AlertEpisodeOwnerTeam,
|
||||
AlertEpisodeOwnerTeamService,
|
||||
).getRouter(),
|
||||
);
|
||||
|
||||
app.use(
|
||||
`/${APP_NAME.toLocaleLowerCase()}`,
|
||||
new BaseAPI<AlertEpisodeOwnerUser, AlertEpisodeOwnerUserServiceType>(
|
||||
AlertEpisodeOwnerUser,
|
||||
AlertEpisodeOwnerUserService,
|
||||
).getRouter(),
|
||||
);
|
||||
|
||||
app.use(
|
||||
`/${APP_NAME.toLocaleLowerCase()}`,
|
||||
new BaseAPI<
|
||||
AlertEpisodeStateTimeline,
|
||||
AlertEpisodeStateTimelineServiceType
|
||||
>(
|
||||
AlertEpisodeStateTimeline,
|
||||
AlertEpisodeStateTimelineService,
|
||||
).getRouter(),
|
||||
);
|
||||
|
||||
// IncidentEpisode Routes
|
||||
app.use(
|
||||
`/${APP_NAME.toLocaleLowerCase()}`,
|
||||
new IncidentEpisodeAPI().getRouter(),
|
||||
);
|
||||
|
||||
app.use(
|
||||
`/${APP_NAME.toLocaleLowerCase()}`,
|
||||
new BaseAPI<IncidentEpisodeFeed, IncidentEpisodeFeedServiceType>(
|
||||
IncidentEpisodeFeed,
|
||||
IncidentEpisodeFeedService,
|
||||
).getRouter(),
|
||||
);
|
||||
|
||||
app.use(
|
||||
`/${APP_NAME.toLocaleLowerCase()}`,
|
||||
new BaseAPI<
|
||||
IncidentEpisodeInternalNote,
|
||||
IncidentEpisodeInternalNoteServiceType
|
||||
>(
|
||||
IncidentEpisodeInternalNote,
|
||||
IncidentEpisodeInternalNoteService,
|
||||
).getRouter(),
|
||||
);
|
||||
|
||||
app.use(
|
||||
`/${APP_NAME.toLocaleLowerCase()}`,
|
||||
new BaseAPI<IncidentEpisodeMember, IncidentEpisodeMemberServiceType>(
|
||||
IncidentEpisodeMember,
|
||||
IncidentEpisodeMemberService,
|
||||
).getRouter(),
|
||||
);
|
||||
|
||||
app.use(
|
||||
`/${APP_NAME.toLocaleLowerCase()}`,
|
||||
new BaseAPI<
|
||||
IncidentEpisodeOwnerTeam,
|
||||
IncidentEpisodeOwnerTeamServiceType
|
||||
>(IncidentEpisodeOwnerTeam, IncidentEpisodeOwnerTeamService).getRouter(),
|
||||
);
|
||||
|
||||
app.use(
|
||||
`/${APP_NAME.toLocaleLowerCase()}`,
|
||||
new BaseAPI<
|
||||
IncidentEpisodeOwnerUser,
|
||||
IncidentEpisodeOwnerUserServiceType
|
||||
>(IncidentEpisodeOwnerUser, IncidentEpisodeOwnerUserService).getRouter(),
|
||||
);
|
||||
|
||||
app.use(
|
||||
`/${APP_NAME.toLocaleLowerCase()}`,
|
||||
new BaseAPI<
|
||||
IncidentEpisodeStateTimeline,
|
||||
IncidentEpisodeStateTimelineServiceType
|
||||
>(
|
||||
IncidentEpisodeStateTimeline,
|
||||
IncidentEpisodeStateTimelineService,
|
||||
).getRouter(),
|
||||
);
|
||||
|
||||
app.use(
|
||||
`/${APP_NAME.toLocaleLowerCase()}`,
|
||||
new BaseAPI<
|
||||
IncidentEpisodeRoleMember,
|
||||
IncidentEpisodeRoleMemberServiceType
|
||||
>(
|
||||
IncidentEpisodeRoleMember,
|
||||
IncidentEpisodeRoleMemberService,
|
||||
).getRouter(),
|
||||
);
|
||||
|
||||
app.use(
|
||||
`/${APP_NAME.toLocaleLowerCase()}`,
|
||||
new BaseAPI<AlertGroupingRule, AlertGroupingRuleServiceType>(
|
||||
AlertGroupingRule,
|
||||
AlertGroupingRuleService,
|
||||
).getRouter(),
|
||||
);
|
||||
|
||||
app.use(
|
||||
`/${APP_NAME.toLocaleLowerCase()}`,
|
||||
new BaseAPI<IncidentGroupingRule, IncidentGroupingRuleServiceType>(
|
||||
IncidentGroupingRule,
|
||||
IncidentGroupingRuleService,
|
||||
).getRouter(),
|
||||
);
|
||||
|
||||
// IncidentSla
|
||||
app.use(
|
||||
`/${APP_NAME.toLocaleLowerCase()}`,
|
||||
new BaseAPI<IncidentSla, IncidentSlaServiceType>(
|
||||
IncidentSla,
|
||||
IncidentSlaService,
|
||||
).getRouter(),
|
||||
);
|
||||
|
||||
// IncidentSlaRule
|
||||
app.use(
|
||||
`/${APP_NAME.toLocaleLowerCase()}`,
|
||||
new BaseAPI<IncidentSlaRule, IncidentSlaRuleServiceType>(
|
||||
IncidentSlaRule,
|
||||
IncidentSlaRuleService,
|
||||
).getRouter(),
|
||||
);
|
||||
|
||||
app.use(
|
||||
`/${APP_NAME.toLocaleLowerCase()}`,
|
||||
new BaseAnalyticsAPI<ExceptionInstance, ExceptionInstanceServiceType>(
|
||||
@@ -1160,6 +1430,14 @@ const BaseAPIFeatureSet: FeatureSet = {
|
||||
).getRouter(),
|
||||
);
|
||||
|
||||
app.use(
|
||||
`/${APP_NAME.toLocaleLowerCase()}`,
|
||||
new BaseAPI<ProjectUserProfile, ProjectUserProfileServiceType>(
|
||||
ProjectUserProfile,
|
||||
ProjectUserProfileService,
|
||||
).getRouter(),
|
||||
);
|
||||
|
||||
app.use(
|
||||
`/${APP_NAME.toLocaleLowerCase()}`,
|
||||
new BaseAPI<MonitorGroupResource, MonitorGroupResourceServiceType>(
|
||||
@@ -1176,6 +1454,14 @@ const BaseAPIFeatureSet: FeatureSet = {
|
||||
).getRouter(),
|
||||
);
|
||||
|
||||
app.use(
|
||||
`/${APP_NAME.toLocaleLowerCase()}`,
|
||||
new BaseAPI<TeamMemberCustomField, TeamMemberCustomFieldServiceType>(
|
||||
TeamMemberCustomField,
|
||||
TeamMemberCustomFieldService,
|
||||
).getRouter(),
|
||||
);
|
||||
|
||||
app.use(
|
||||
`/${APP_NAME.toLocaleLowerCase()}`,
|
||||
new BaseAPI<TeamPermission, TeamPermissionServiceType>(
|
||||
@@ -1362,6 +1648,22 @@ const BaseAPIFeatureSet: FeatureSet = {
|
||||
).getRouter(),
|
||||
);
|
||||
|
||||
app.use(
|
||||
`/${APP_NAME.toLocaleLowerCase()}`,
|
||||
new BaseAPI<IncidentRole, IncidentRoleServiceType>(
|
||||
IncidentRole,
|
||||
IncidentRoleService,
|
||||
).getRouter(),
|
||||
);
|
||||
|
||||
app.use(
|
||||
`/${APP_NAME.toLocaleLowerCase()}`,
|
||||
new BaseAPI<IncidentMember, IncidentMemberServiceType>(
|
||||
IncidentMember,
|
||||
IncidentMemberService,
|
||||
).getRouter(),
|
||||
);
|
||||
|
||||
app.use(
|
||||
`/${APP_NAME.toLocaleLowerCase()}`,
|
||||
new BaseAPI<IncidentOwnerUser, IncidentOwnerUserServiceType>(
|
||||
@@ -1706,6 +2008,10 @@ const BaseAPIFeatureSet: FeatureSet = {
|
||||
`/${APP_NAME.toLocaleLowerCase()}`,
|
||||
new EnterpriseLicenseAPI().getRouter(),
|
||||
);
|
||||
app.use(
|
||||
`/${APP_NAME.toLocaleLowerCase()}`,
|
||||
new OpenSourceDeploymentAPI().getRouter(),
|
||||
);
|
||||
app.use(`/${APP_NAME.toLocaleLowerCase()}`, new SlackAPI().getRouter());
|
||||
app.use(
|
||||
`/${APP_NAME.toLocaleLowerCase()}`,
|
||||
@@ -1840,6 +2146,11 @@ const BaseAPIFeatureSet: FeatureSet = {
|
||||
new IncidentPublicNoteAPI().getRouter(),
|
||||
);
|
||||
|
||||
app.use(
|
||||
`/${APP_NAME.toLocaleLowerCase()}`,
|
||||
new IncidentEpisodePublicNoteAPI().getRouter(),
|
||||
);
|
||||
|
||||
app.use(
|
||||
`/${APP_NAME.toLocaleLowerCase()}`,
|
||||
new IncidentInternalNoteAPI().getRouter(),
|
||||
|
||||
@@ -17,9 +17,11 @@ import ObjectID from "Common/Types/ObjectID";
|
||||
import PositiveNumber from "Common/Types/PositiveNumber";
|
||||
import DatabaseConfig from "Common/Server/DatabaseConfig";
|
||||
import {
|
||||
AppVersion,
|
||||
EncryptionSecret,
|
||||
IsBillingEnabled,
|
||||
} from "Common/Server/EnvironmentConfig";
|
||||
import API from "Common/Utils/API";
|
||||
import AccessTokenService from "Common/Server/Services/AccessTokenService";
|
||||
import EmailVerificationTokenService from "Common/Server/Services/EmailVerificationTokenService";
|
||||
import MailService from "Common/Server/Services/MailService";
|
||||
@@ -29,6 +31,7 @@ import UserSessionService, {
|
||||
SessionMetadata,
|
||||
} from "Common/Server/Services/UserSessionService";
|
||||
import CookieUtil from "Common/Server/Utils/Cookie";
|
||||
import JSONWebToken from "Common/Server/Utils/JsonWebToken";
|
||||
import Express, {
|
||||
ExpressRequest,
|
||||
ExpressResponse,
|
||||
@@ -54,6 +57,11 @@ const router: ExpressRouter = Express.getRouter();
|
||||
|
||||
const ACCESS_TOKEN_EXPIRY_SECONDS: number = 15 * 60;
|
||||
|
||||
interface FinalizeUserLoginResult {
|
||||
sessionMetadata: SessionMetadata;
|
||||
accessToken: string;
|
||||
}
|
||||
|
||||
type FinalizeUserLoginInput = {
|
||||
req: ExpressRequest;
|
||||
res: ExpressResponse;
|
||||
@@ -63,9 +71,9 @@ type FinalizeUserLoginInput = {
|
||||
|
||||
const finalizeUserLogin: (
|
||||
data: FinalizeUserLoginInput,
|
||||
) => Promise<SessionMetadata> = async (
|
||||
) => Promise<FinalizeUserLoginResult> = async (
|
||||
data: FinalizeUserLoginInput,
|
||||
): Promise<SessionMetadata> => {
|
||||
): Promise<FinalizeUserLoginResult> => {
|
||||
const { req, res, user, isGlobalLogin } = data;
|
||||
|
||||
const sessionMetadata: SessionMetadata =
|
||||
@@ -87,7 +95,21 @@ const finalizeUserLogin: (
|
||||
accessTokenExpiresInSeconds: ACCESS_TOKEN_EXPIRY_SECONDS,
|
||||
});
|
||||
|
||||
return sessionMetadata;
|
||||
// Generate access token for response body (used by mobile clients)
|
||||
const accessToken: string = JSONWebToken.signUserLoginToken({
|
||||
tokenData: {
|
||||
userId: user.id!,
|
||||
email: user.email!,
|
||||
name: user.name!,
|
||||
timezone: user.timezone || null,
|
||||
isMasterAdmin: user.isMasterAdmin!,
|
||||
isGlobalLogin: isGlobalLogin,
|
||||
sessionId: sessionMetadata.session.id!,
|
||||
},
|
||||
expiresInSeconds: ACCESS_TOKEN_EXPIRY_SECONDS,
|
||||
});
|
||||
|
||||
return { sessionMetadata, accessToken };
|
||||
};
|
||||
|
||||
router.post(
|
||||
@@ -251,6 +273,28 @@ router.post(
|
||||
|
||||
logger.info("User signed up: " + savedUser.email?.toString());
|
||||
|
||||
if (!IsBillingEnabled && miscDataProps["notifySelfHosted"] === true) {
|
||||
const instanceUrl: string = new URL(httpProtocol, host).toString();
|
||||
|
||||
API.post({
|
||||
url: URL.fromString(
|
||||
"https://oneuptime.com/api/open-source-deployment/register",
|
||||
),
|
||||
data: {
|
||||
email: savedUser.email?.toString() || "",
|
||||
name: savedUser.name?.toString() || "",
|
||||
companyName:
|
||||
(miscDataProps["selfHostedCompanyName"] as string) || undefined,
|
||||
companyPhoneNumber:
|
||||
(miscDataProps["selfHostedPhoneNumber"] as string) || undefined,
|
||||
oneuptimeVersion: AppVersion,
|
||||
instanceUrl: instanceUrl,
|
||||
},
|
||||
}).catch((err: Error) => {
|
||||
logger.error(err);
|
||||
});
|
||||
}
|
||||
|
||||
return Response.sendEntityResponse(req, res, savedUser, User);
|
||||
}
|
||||
|
||||
@@ -552,8 +596,10 @@ router.post(
|
||||
next: NextFunction,
|
||||
): Promise<void> => {
|
||||
try {
|
||||
// Try cookie first, then fallback to request body (for mobile clients)
|
||||
const refreshToken: string | undefined =
|
||||
CookieUtil.getRefreshTokenFromExpressRequest(req);
|
||||
CookieUtil.getRefreshTokenFromExpressRequest(req) ||
|
||||
(req.body.refreshToken as string | undefined);
|
||||
|
||||
if (!refreshToken) {
|
||||
CookieUtil.removeAllCookies(req, res);
|
||||
@@ -658,7 +704,26 @@ router.post(
|
||||
accessTokenExpiresInSeconds: ACCESS_TOKEN_EXPIRY_SECONDS,
|
||||
});
|
||||
|
||||
return Response.sendEmptySuccessResponse(req, res);
|
||||
// Generate access token for response body (used by mobile clients)
|
||||
const newAccessToken: string = JSONWebToken.signUserLoginToken({
|
||||
tokenData: {
|
||||
userId: user.id!,
|
||||
email: user.email!,
|
||||
name: user.name!,
|
||||
timezone: user.timezone || null,
|
||||
isMasterAdmin: user.isMasterAdmin!,
|
||||
isGlobalLogin: isGlobalLogin,
|
||||
sessionId: renewedSession.session.id!,
|
||||
},
|
||||
expiresInSeconds: ACCESS_TOKEN_EXPIRY_SECONDS,
|
||||
});
|
||||
|
||||
return Response.sendJsonObjectResponse(req, res, {
|
||||
accessToken: newAccessToken,
|
||||
refreshToken: renewedSession.refreshToken,
|
||||
refreshTokenExpiresAt:
|
||||
renewedSession.refreshTokenExpiresAt.toISOString(),
|
||||
});
|
||||
} catch (err) {
|
||||
return next(err);
|
||||
}
|
||||
@@ -673,8 +738,10 @@ router.post(
|
||||
next: NextFunction,
|
||||
): Promise<void> => {
|
||||
try {
|
||||
// Try cookie first, then fallback to request body (for mobile clients)
|
||||
const refreshToken: string | undefined =
|
||||
CookieUtil.getRefreshTokenFromExpressRequest(req);
|
||||
CookieUtil.getRefreshTokenFromExpressRequest(req) ||
|
||||
(req.body.refreshToken as string | undefined);
|
||||
|
||||
if (refreshToken) {
|
||||
await UserSessionService.revokeSessionByRefreshToken(refreshToken, {
|
||||
@@ -987,14 +1054,21 @@ const login: LoginFunction = async (options: {
|
||||
if (alreadySavedUser.password.toString() === user.password!.toString()) {
|
||||
logger.info("User logged in: " + alreadySavedUser.email?.toString());
|
||||
|
||||
await finalizeUserLogin({
|
||||
const loginResult: FinalizeUserLoginResult = await finalizeUserLogin({
|
||||
req,
|
||||
res,
|
||||
user: alreadySavedUser,
|
||||
isGlobalLogin: true,
|
||||
});
|
||||
|
||||
return Response.sendEntityResponse(req, res, alreadySavedUser, User);
|
||||
return Response.sendEntityResponse(req, res, alreadySavedUser, User, {
|
||||
miscData: {
|
||||
accessToken: loginResult.accessToken,
|
||||
refreshToken: loginResult.sessionMetadata.refreshToken,
|
||||
refreshTokenExpiresAt:
|
||||
loginResult.sessionMetadata.refreshTokenExpiresAt.toISOString(),
|
||||
},
|
||||
});
|
||||
}
|
||||
}
|
||||
return Response.sendErrorResponse(
|
||||
|
||||
@@ -3480,6 +3480,26 @@ router.post(
|
||||
logger.debug(
|
||||
`SCIM Create user - user already exists with id: ${user.id}`,
|
||||
);
|
||||
|
||||
// Update user's name if provided in SCIM request and user's name is missing or different
|
||||
if (name) {
|
||||
const currentName: string = user.name?.toString() || "";
|
||||
if (!currentName || currentName !== name) {
|
||||
executionSteps.push(
|
||||
`Updating user name from "${currentName || "(empty)"}" to "${name}"`,
|
||||
);
|
||||
await UserService.updateOneById({
|
||||
id: user.id!,
|
||||
data: {
|
||||
name: new Name(name),
|
||||
},
|
||||
props: { isRoot: true },
|
||||
});
|
||||
// Update local user object so response reflects the new name
|
||||
user.name = new Name(name);
|
||||
executionSteps.push(`User name updated successfully`);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// Add user to default teams if configured and push groups is not enabled
|
||||
|
||||
@@ -13,6 +13,7 @@ import ObjectID from "Common/Types/ObjectID";
|
||||
import DatabaseConfig from "Common/Server/DatabaseConfig";
|
||||
import { EncryptionSecret } from "Common/Server/EnvironmentConfig";
|
||||
import MailService from "Common/Server/Services/MailService";
|
||||
import ProjectSMTPConfigService from "Common/Server/Services/ProjectSmtpConfigService";
|
||||
import StatusPagePrivateUserService from "Common/Server/Services/StatusPagePrivateUserService";
|
||||
import StatusPageService from "Common/Server/Services/StatusPageService";
|
||||
import StatusPagePrivateUserSessionService, {
|
||||
@@ -468,6 +469,16 @@ router.post(
|
||||
logoFileId: true,
|
||||
requireSsoForLogin: true,
|
||||
projectId: true,
|
||||
smtpConfig: {
|
||||
_id: true,
|
||||
hostname: true,
|
||||
port: true,
|
||||
username: true,
|
||||
password: true,
|
||||
fromEmail: true,
|
||||
fromName: true,
|
||||
secure: true,
|
||||
},
|
||||
},
|
||||
},
|
||||
);
|
||||
@@ -547,6 +558,9 @@ router.post(
|
||||
},
|
||||
{
|
||||
projectId: statusPage.projectId!,
|
||||
mailServer: ProjectSMTPConfigService.toEmailServer(
|
||||
statusPage.smtpConfig,
|
||||
),
|
||||
statusPageId: statusPage.id!,
|
||||
},
|
||||
).catch((err: Error) => {
|
||||
@@ -632,6 +646,16 @@ router.post(
|
||||
logoFileId: true,
|
||||
requireSsoForLogin: true,
|
||||
projectId: true,
|
||||
smtpConfig: {
|
||||
_id: true,
|
||||
hostname: true,
|
||||
port: true,
|
||||
username: true,
|
||||
password: true,
|
||||
fromEmail: true,
|
||||
fromName: true,
|
||||
secure: true,
|
||||
},
|
||||
},
|
||||
},
|
||||
);
|
||||
@@ -689,6 +713,9 @@ router.post(
|
||||
},
|
||||
{
|
||||
projectId: statusPage.projectId!,
|
||||
mailServer: ProjectSMTPConfigService.toEmailServer(
|
||||
statusPage.smtpConfig,
|
||||
),
|
||||
statusPageId: statusPage.id!,
|
||||
},
|
||||
).catch((err: Error) => {
|
||||
|
||||
@@ -70,6 +70,7 @@ export default class CallService {
|
||||
customTwilioConfig?: TwilioConfig | undefined;
|
||||
incidentId?: ObjectID | undefined;
|
||||
alertId?: ObjectID | undefined;
|
||||
monitorId?: ObjectID | undefined;
|
||||
scheduledMaintenanceId?: ObjectID | undefined;
|
||||
statusPageId?: ObjectID | undefined;
|
||||
statusPageAnnouncementId?: ObjectID | undefined;
|
||||
@@ -144,6 +145,10 @@ export default class CallService {
|
||||
callLog.alertId = options.alertId;
|
||||
}
|
||||
|
||||
if (options.monitorId) {
|
||||
callLog.monitorId = options.monitorId;
|
||||
}
|
||||
|
||||
if (options.scheduledMaintenanceId) {
|
||||
callLog.scheduledMaintenanceId = options.scheduledMaintenanceId;
|
||||
}
|
||||
|
||||
@@ -5,7 +5,7 @@ import {
|
||||
getSendgridConfig,
|
||||
} from "../Config";
|
||||
import SMTPOAuthService from "./SMTPOAuthService";
|
||||
import SendgridMail, { MailDataRequired } from "@sendgrid/mail";
|
||||
import SendgridMail, { ClientResponse, MailDataRequired } from "@sendgrid/mail";
|
||||
import Hostname from "Common/Types/API/Hostname";
|
||||
import OneUptimeDate from "Common/Types/Date";
|
||||
import Dictionary from "Common/Types/Dictionary";
|
||||
@@ -433,12 +433,17 @@ export default class MailService {
|
||||
try {
|
||||
for (let attempt: number = 1; attempt <= maxRetries; attempt++) {
|
||||
try {
|
||||
await mailer.sendMail({
|
||||
from: `${options.emailServer.fromName.toString()} <${options.emailServer.fromEmail.toString()}>`,
|
||||
to: mail.toEmail.toString(),
|
||||
subject: mail.subject,
|
||||
html: mail.body,
|
||||
});
|
||||
const sendMailResponse: SMTPTransport.SentMessageInfo =
|
||||
await mailer.sendMail({
|
||||
from: `${options.emailServer.fromName.toString()} <${options.emailServer.fromEmail.toString()}>`,
|
||||
to: mail.toEmail.toString(),
|
||||
subject: mail.subject,
|
||||
html: mail.body,
|
||||
});
|
||||
|
||||
logger.debug("SMTP Email Provider Response:");
|
||||
logger.debug(JSON.stringify(sendMailResponse, null, 2));
|
||||
|
||||
return; // Success, exit the function
|
||||
} catch (error) {
|
||||
lastError = error;
|
||||
@@ -478,6 +483,7 @@ export default class MailService {
|
||||
timeout?: number | undefined;
|
||||
incidentId?: ObjectID | undefined;
|
||||
alertId?: ObjectID | undefined;
|
||||
monitorId?: ObjectID | undefined;
|
||||
scheduledMaintenanceId?: ObjectID | undefined;
|
||||
statusPageId?: ObjectID | undefined;
|
||||
statusPageAnnouncementId?: ObjectID | undefined;
|
||||
@@ -511,6 +517,10 @@ export default class MailService {
|
||||
emailLog.alertId = options.alertId;
|
||||
}
|
||||
|
||||
if (options.monitorId) {
|
||||
emailLog.monitorId = options.monitorId;
|
||||
}
|
||||
|
||||
if (options.scheduledMaintenanceId) {
|
||||
emailLog.scheduledMaintenanceId = options.scheduledMaintenanceId;
|
||||
}
|
||||
@@ -652,7 +662,21 @@ export default class MailService {
|
||||
emailLog.fromEmail = sendgridConfig.fromEmail;
|
||||
}
|
||||
|
||||
await SendgridMail.send(msg);
|
||||
const sendgridResponse: [ClientResponse, Record<string, unknown>] =
|
||||
await SendgridMail.send(msg);
|
||||
|
||||
logger.debug("SendGrid Email Provider Response:");
|
||||
logger.debug(
|
||||
JSON.stringify(
|
||||
{
|
||||
statusCode: sendgridResponse[0]?.statusCode,
|
||||
headers: sendgridResponse[0]?.headers,
|
||||
body: sendgridResponse[0]?.body,
|
||||
},
|
||||
null,
|
||||
2,
|
||||
),
|
||||
);
|
||||
|
||||
if (emailLog) {
|
||||
emailLog.status = MailStatus.Success;
|
||||
|
||||
@@ -33,6 +33,7 @@ export default class SmsService {
|
||||
userOnCallLogTimelineId?: ObjectID | undefined;
|
||||
incidentId?: ObjectID | undefined;
|
||||
alertId?: ObjectID | undefined;
|
||||
monitorId?: ObjectID | undefined;
|
||||
scheduledMaintenanceId?: ObjectID | undefined;
|
||||
statusPageId?: ObjectID | undefined;
|
||||
statusPageAnnouncementId?: ObjectID | undefined;
|
||||
@@ -91,6 +92,10 @@ export default class SmsService {
|
||||
smsLog.alertId = options.alertId;
|
||||
}
|
||||
|
||||
if (options.monitorId) {
|
||||
smsLog.monitorId = options.monitorId;
|
||||
}
|
||||
|
||||
if (options.scheduledMaintenanceId) {
|
||||
smsLog.scheduledMaintenanceId = options.scheduledMaintenanceId;
|
||||
}
|
||||
|
||||
@@ -41,6 +41,7 @@ export default class WhatsAppService {
|
||||
userOnCallLogTimelineId?: ObjectID | undefined;
|
||||
incidentId?: ObjectID | undefined;
|
||||
alertId?: ObjectID | undefined;
|
||||
monitorId?: ObjectID | undefined;
|
||||
scheduledMaintenanceId?: ObjectID | undefined;
|
||||
statusPageId?: ObjectID | undefined;
|
||||
statusPageAnnouncementId?: ObjectID | undefined;
|
||||
@@ -96,6 +97,10 @@ export default class WhatsAppService {
|
||||
whatsAppLog.alertId = options.alertId;
|
||||
}
|
||||
|
||||
if (options.monitorId) {
|
||||
whatsAppLog.monitorId = options.monitorId;
|
||||
}
|
||||
|
||||
if (options.scheduledMaintenanceId) {
|
||||
whatsAppLog.scheduledMaintenanceId = options.scheduledMaintenanceId;
|
||||
}
|
||||
|
||||
@@ -2,7 +2,7 @@
|
||||
|
||||
|
||||
{{> Logo this}}
|
||||
{{> EmailTitle title=(concat "Alert: " alertTitle) }}
|
||||
{{> EmailTitle title=(concat "Alert " alertNumber ": " alertTitle) }}
|
||||
|
||||
{{> InfoBlock info=(concat "A new alert has been created in the project - " projectName)}}
|
||||
|
||||
|
||||
@@ -0,0 +1,66 @@
|
||||
{{> Start this}}
|
||||
|
||||
|
||||
{{> Logo this}}
|
||||
{{> EmailTitle title=(concat "Alert Episode " episodeNumber ": " alertEpisodeTitle) }}
|
||||
|
||||
{{> InfoBlock info=(concat "A new alert episode has been created in the project - " projectName)}}
|
||||
|
||||
{{> InfoBlock info="Here are the details: "}}
|
||||
|
||||
{{> DetailBoxStart this }}
|
||||
{{> DetailBoxField title="Alert Episode Title:" text=alertEpisodeTitle }}
|
||||
{{> DetailBoxField title="Current State: " text=currentState }}
|
||||
{{> DetailBoxField title="Resources Affected: " text=resourcesAffected }}
|
||||
{{> DetailBoxField title="Severity: " text=alertEpisodeSeverity }}
|
||||
{{> DetailBoxField title="Root Cause: " text=rootCause }}
|
||||
{{> DetailBoxField title="Description: " text=alertEpisodeDescription }}
|
||||
{{> DetailBoxEnd this }}
|
||||
|
||||
{{#if alertsList}}
|
||||
{{> TitleBlock title=(concat "Alerts in this Episode (" alertsCount ")") }}
|
||||
<!-- Alerts List Container -->
|
||||
<table class="st-Copy st-Width st-Width--mobile" border="0" cellpadding="0" cellspacing="0"
|
||||
width="600" style="min-width: 600px;">
|
||||
<tbody>
|
||||
<tr>
|
||||
<td class="st-Spacer st-Spacer--gutter"
|
||||
style="border: 0; margin:0; padding: 0; font-size: 1px; line-height: 1px; mso-line-height-rule: exactly;"
|
||||
width="64">
|
||||
<div class="st-Spacer st-Spacer--filler"></div>
|
||||
</td>
|
||||
<td style="border: 0; margin: 0; padding: 0;">
|
||||
{{{alertsList}}}
|
||||
</td>
|
||||
<td class="st-Spacer st-Spacer--gutter"
|
||||
style="border: 0; margin:0; padding: 0; font-size: 1px; line-height: 1px; mso-line-height-rule: exactly;"
|
||||
width="64">
|
||||
<div class="st-Spacer st-Spacer--filler"></div>
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td class="st-Spacer st-Spacer--stacked" colspan="3" height="16"
|
||||
style="border: 0; margin: 0; padding: 0; font-size: 1px; line-height: 1px; mso-line-height-rule: exactly;">
|
||||
<div class="st-Spacer st-Spacer--filler"></div>
|
||||
</td>
|
||||
</tr>
|
||||
</tbody>
|
||||
</table>
|
||||
<!-- /Alerts List Container -->
|
||||
{{/if}}
|
||||
|
||||
{{> InfoBlock info="ACTION REQUIRED: Please acknowledge this alert episode by clicking on the button below - "}}
|
||||
|
||||
{{> ButtonBlock buttonUrl=acknowledgeAlertEpisodeLink buttonText="Acknowledge Alert Episode"}}
|
||||
|
||||
{{> InfoBlock info="You can also copy and paste this link:"}}
|
||||
{{> InfoBlock info=acknowledgeAlertEpisodeLink}}
|
||||
|
||||
{{> InfoBlock info="You will be notified when the status of this alert episode changes."}}
|
||||
|
||||
{{> TitleBlock title="Why am I receiving this email?"}}
|
||||
{{> InfoBlock info="You are receiving this email because you are a member of the team that is responsible for this alert episode or you are currently on-call."}}
|
||||
|
||||
{{> Footer this }}
|
||||
|
||||
{{> End this}}
|
||||
@@ -2,7 +2,7 @@
|
||||
|
||||
|
||||
{{> Logo this}}
|
||||
{{> EmailTitle title=(concat "Incident: " incidentTitle) }}
|
||||
{{> EmailTitle title=(concat "Incident " incidentNumber ": " incidentTitle) }}
|
||||
|
||||
{{> InfoBlock info=(concat "A new incident has been created in the project - " projectName)}}
|
||||
|
||||
|
||||
@@ -0,0 +1,66 @@
|
||||
{{> Start this}}
|
||||
|
||||
|
||||
{{> Logo this}}
|
||||
{{> EmailTitle title=(concat "Incident Episode " episodeNumber ": " incidentEpisodeTitle) }}
|
||||
|
||||
{{> InfoBlock info=(concat "A new incident episode has been created in the project - " projectName)}}
|
||||
|
||||
{{> InfoBlock info="Here are the details: "}}
|
||||
|
||||
{{> DetailBoxStart this }}
|
||||
{{> DetailBoxField title="Incident Episode Title:" text=incidentEpisodeTitle }}
|
||||
{{> DetailBoxField title="Current State: " text=currentState }}
|
||||
{{> DetailBoxField title="Resources Affected: " text=resourcesAffected }}
|
||||
{{> DetailBoxField title="Severity: " text=incidentEpisodeSeverity }}
|
||||
{{> DetailBoxField title="Root Cause: " text=rootCause }}
|
||||
{{> DetailBoxField title="Description: " text=incidentEpisodeDescription }}
|
||||
{{> DetailBoxEnd this }}
|
||||
|
||||
{{#if incidentsList}}
|
||||
{{> TitleBlock title=(concat "Incidents in this Episode (" incidentsCount ")") }}
|
||||
<!-- Incidents List Container -->
|
||||
<table class="st-Copy st-Width st-Width--mobile" border="0" cellpadding="0" cellspacing="0"
|
||||
width="600" style="min-width: 600px;">
|
||||
<tbody>
|
||||
<tr>
|
||||
<td class="st-Spacer st-Spacer--gutter"
|
||||
style="border: 0; margin:0; padding: 0; font-size: 1px; line-height: 1px; mso-line-height-rule: exactly;"
|
||||
width="64">
|
||||
<div class="st-Spacer st-Spacer--filler"></div>
|
||||
</td>
|
||||
<td style="border: 0; margin: 0; padding: 0;">
|
||||
{{{incidentsList}}}
|
||||
</td>
|
||||
<td class="st-Spacer st-Spacer--gutter"
|
||||
style="border: 0; margin:0; padding: 0; font-size: 1px; line-height: 1px; mso-line-height-rule: exactly;"
|
||||
width="64">
|
||||
<div class="st-Spacer st-Spacer--filler"></div>
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td class="st-Spacer st-Spacer--stacked" colspan="3" height="16"
|
||||
style="border: 0; margin: 0; padding: 0; font-size: 1px; line-height: 1px; mso-line-height-rule: exactly;">
|
||||
<div class="st-Spacer st-Spacer--filler"></div>
|
||||
</td>
|
||||
</tr>
|
||||
</tbody>
|
||||
</table>
|
||||
<!-- /Incidents List Container -->
|
||||
{{/if}}
|
||||
|
||||
{{> InfoBlock info="ACTION REQUIRED: Please acknowledge this incident episode by clicking on the button below - "}}
|
||||
|
||||
{{> ButtonBlock buttonUrl=acknowledgeIncidentEpisodeLink buttonText="Acknowledge Incident Episode"}}
|
||||
|
||||
{{> InfoBlock info="You can also copy and paste this link:"}}
|
||||
{{> InfoBlock info=acknowledgeIncidentEpisodeLink}}
|
||||
|
||||
{{> InfoBlock info="You will be notified when the status of this incident episode changes."}}
|
||||
|
||||
{{> TitleBlock title="Why am I receiving this email?"}}
|
||||
{{> InfoBlock info="You are receiving this email because you are a member of the team that is responsible for this incident episode or you are currently on-call."}}
|
||||
|
||||
{{> Footer this }}
|
||||
|
||||
{{> End this}}
|
||||
@@ -0,0 +1,30 @@
|
||||
{{> Start this}}
|
||||
|
||||
|
||||
{{> Logo this}}
|
||||
{{> EmailTitle title=(concat "Alert Episode " episodeNumber ": " episodeTitle) }}
|
||||
|
||||
{{> InfoBlock info="You have been added as the owner of this alert episode."}}
|
||||
|
||||
{{> InfoBlock info="Here are the details: "}}
|
||||
|
||||
{{> DetailBoxStart this }}
|
||||
{{> DetailBoxField title="Episode Title:" text=episodeTitle }}
|
||||
{{> DetailBoxField title="Current State: " text=currentState }}
|
||||
{{> DetailBoxField title="Severity: " text=episodeSeverity }}
|
||||
{{> DetailBoxField title="Description: " text=episodeDescription }}
|
||||
{{> DetailBoxEnd this }}
|
||||
|
||||
|
||||
{{> InfoBlock info="You can view this alert episode by clicking on the button below - "}}
|
||||
|
||||
{{> ButtonBlock buttonUrl=episodeViewLink buttonText="View on Dashboard"}}
|
||||
|
||||
{{> InfoBlock info="You can also copy and paste this link:"}}
|
||||
{{> InfoBlock info=episodeViewLink}}
|
||||
|
||||
{{> InfoBlock info="You will be notified when the status of this alert episode changes."}}
|
||||
|
||||
{{> Footer this }}
|
||||
|
||||
{{> End this}}
|
||||
@@ -0,0 +1,37 @@
|
||||
{{> Start this}}
|
||||
|
||||
|
||||
{{> Logo this}}
|
||||
{{> EmailTitle title=(concat "Alert Episode " episodeNumber ": " episodeTitle) }}
|
||||
|
||||
{{> InfoBlock info="A new note has been posted on this alert episode."}}
|
||||
|
||||
{{> InfoBlock info="Here are the details: "}}
|
||||
|
||||
{{> DetailBoxStart this }}
|
||||
{{> DetailBoxField title="Episode Title:" text=episodeTitle }}
|
||||
{{> DetailBoxField title="Current State: " text=currentState }}
|
||||
{{> DetailBoxField title="Severity: " text=episodeSeverity }}
|
||||
{{#if isPrivateNote}}
|
||||
{{> DetailBoxField title="Private Note: " text=note }}
|
||||
{{else}}
|
||||
{{> DetailBoxField title="Public Note: " text=note }}
|
||||
{{/if}}
|
||||
{{> DetailBoxEnd this }}
|
||||
|
||||
|
||||
{{> InfoBlock info="You can view this alert episode by clicking on the button below - "}}
|
||||
|
||||
{{> ButtonBlock buttonUrl=episodeViewLink buttonText="View on Dashboard"}}
|
||||
|
||||
{{> InfoBlock info="You can also copy and paste this link:"}}
|
||||
{{> InfoBlock info=episodeViewLink}}
|
||||
|
||||
{{> InfoBlock info="You will be notified when the status of this alert episode changes."}}
|
||||
|
||||
{{> OwnerInfo this }}
|
||||
{{> UnsubscribeOwnerEmail this }}
|
||||
|
||||
{{> Footer this }}
|
||||
|
||||
{{> End this}}
|
||||
@@ -0,0 +1,35 @@
|
||||
{{> Start this}}
|
||||
|
||||
|
||||
{{> Logo this}}
|
||||
{{> EmailTitle title=(concat "Alert Episode " episodeNumber ": " episodeTitle) }}
|
||||
|
||||
{{> InfoBlock info=(concat "A new alert episode has been created in the project - " projectName)}}
|
||||
|
||||
{{> InfoBlock info="Here are the details: "}}
|
||||
|
||||
{{> DetailBoxStart this }}
|
||||
{{> DetailBoxField title="Episode Title:" text=episodeTitle }}
|
||||
{{> DetailBoxField title="Current State: " text=currentState }}
|
||||
{{> DetailBoxField title="Episode Created By: " text=declaredBy }}
|
||||
{{> DetailBoxField title="Episode Created At: " text=declaredAt }}
|
||||
{{> DetailBoxField title="Severity: " text=episodeSeverity }}
|
||||
{{> DetailBoxField title="Description: " text=episodeDescription }}
|
||||
{{> DetailBoxEnd this }}
|
||||
|
||||
|
||||
{{> InfoBlock info="You can view this alert episode by clicking on the button below - "}}
|
||||
|
||||
{{> ButtonBlock buttonUrl=episodeViewLink buttonText="View on Dashboard"}}
|
||||
|
||||
{{> InfoBlock info="You can also copy and paste this link:"}}
|
||||
{{> InfoBlock info=episodeViewLink}}
|
||||
|
||||
{{> InfoBlock info="You will be notified when the status of this alert episode changes."}}
|
||||
|
||||
{{> OwnerInfo this }}
|
||||
{{> UnsubscribeOwnerEmail this }}
|
||||
|
||||
{{> Footer this }}
|
||||
|
||||
{{> End this}}
|
||||
@@ -0,0 +1,37 @@
|
||||
{{> Start this}}
|
||||
|
||||
|
||||
{{> Logo this}}
|
||||
{{> EmailTitle title=(concat "Alert Episode " episodeNumber ": " episodeTitle) }}
|
||||
|
||||
{{> InfoBlock info="Alert episode state has changed"}}
|
||||
|
||||
{{> InfoBlock info="Here are the details: "}}
|
||||
|
||||
{{> DetailBoxStart this }}
|
||||
{{> StateTransition this}}
|
||||
{{#ifNotCond previousStateDurationText ""}}
|
||||
{{> DetailBoxField title="Duration in Previous State:" text=previousStateDurationText }}
|
||||
{{/ifNotCond}}
|
||||
{{> DetailBoxField title="Episode Title:" text=episodeTitle }}
|
||||
{{> DetailBoxField title="State changed at:" text=stateChangedAt }}
|
||||
{{> DetailBoxField title="Severity:" text=episodeSeverity }}
|
||||
{{> DetailBoxField title="Description:" text=episodeDescription }}
|
||||
{{> DetailBoxEnd this }}
|
||||
|
||||
|
||||
{{> InfoBlock info="You can view this alert episode by clicking on the button below - "}}
|
||||
|
||||
{{> ButtonBlock buttonUrl=episodeViewLink buttonText="View on Dashboard"}}
|
||||
|
||||
{{> InfoBlock info="You can also copy and paste this link:"}}
|
||||
{{> InfoBlock info=episodeViewLink}}
|
||||
|
||||
{{> InfoBlock info="You will be notified when the status of this alert episode changes."}}
|
||||
|
||||
{{> OwnerInfo this }}
|
||||
{{> UnsubscribeOwnerEmail this }}
|
||||
|
||||
{{> Footer this }}
|
||||
|
||||
{{> End this}}
|
||||
@@ -2,7 +2,7 @@
|
||||
|
||||
|
||||
{{> Logo this}}
|
||||
{{> EmailTitle title=(concat "Alert: " alertTitle) }}
|
||||
{{> EmailTitle title=(concat "Alert " alertNumber ": " alertTitle) }}
|
||||
|
||||
{{> InfoBlock info="You have been added as the owner of this alert."}}
|
||||
|
||||
|
||||
@@ -2,7 +2,7 @@
|
||||
|
||||
|
||||
{{> Logo this}}
|
||||
{{> EmailTitle title=(concat "Alert: " alertTitle) }}
|
||||
{{> EmailTitle title=(concat "Alert " alertNumber ": " alertTitle) }}
|
||||
|
||||
{{> InfoBlock info="A new note has been posted on this alert."}}
|
||||
|
||||
|
||||
@@ -2,7 +2,7 @@
|
||||
|
||||
|
||||
{{> Logo this}}
|
||||
{{> EmailTitle title=(concat "Alert: " alertTitle) }}
|
||||
{{> EmailTitle title=(concat "Alert " alertNumber ": " alertTitle) }}
|
||||
|
||||
{{> InfoBlock info=(concat "A new alert has been created in the project - " projectName)}}
|
||||
|
||||
|
||||
@@ -2,7 +2,7 @@
|
||||
|
||||
|
||||
{{> Logo this}}
|
||||
{{> EmailTitle title=(concat "Alert: " alertTitle) }}
|
||||
{{> EmailTitle title=(concat "Alert " alertNumber ": " alertTitle) }}
|
||||
|
||||
{{> InfoBlock info="Alert state has changed"}}
|
||||
|
||||
|
||||
@@ -0,0 +1,30 @@
|
||||
{{> Start this}}
|
||||
|
||||
|
||||
{{> Logo this}}
|
||||
{{> EmailTitle title=(concat "Incident Episode " episodeNumber ": " episodeTitle) }}
|
||||
|
||||
{{> InfoBlock info="You have been added as the owner of this incident episode."}}
|
||||
|
||||
{{> InfoBlock info="Here are the details: "}}
|
||||
|
||||
{{> DetailBoxStart this }}
|
||||
{{> DetailBoxField title="Episode Title:" text=episodeTitle }}
|
||||
{{> DetailBoxField title="Current State: " text=currentState }}
|
||||
{{> DetailBoxField title="Severity: " text=episodeSeverity }}
|
||||
{{> DetailBoxField title="Description: " text=episodeDescription }}
|
||||
{{> DetailBoxEnd this }}
|
||||
|
||||
|
||||
{{> InfoBlock info="You can view this incident episode by clicking on the button below - "}}
|
||||
|
||||
{{> ButtonBlock buttonUrl=episodeViewLink buttonText="View on Dashboard"}}
|
||||
|
||||
{{> InfoBlock info="You can also copy and paste this link:"}}
|
||||
{{> InfoBlock info=episodeViewLink}}
|
||||
|
||||
{{> InfoBlock info="You will be notified when the status of this incident episode changes."}}
|
||||
|
||||
{{> Footer this }}
|
||||
|
||||
{{> End this}}
|
||||
@@ -0,0 +1,37 @@
|
||||
{{> Start this}}
|
||||
|
||||
|
||||
{{> Logo this}}
|
||||
{{> EmailTitle title=(concat "Incident Episode " episodeNumber ": " episodeTitle) }}
|
||||
|
||||
{{> InfoBlock info="A new note has been posted on this incident episode."}}
|
||||
|
||||
{{> InfoBlock info="Here are the details: "}}
|
||||
|
||||
{{> DetailBoxStart this }}
|
||||
{{> DetailBoxField title="Episode Title:" text=episodeTitle }}
|
||||
{{> DetailBoxField title="Current State: " text=currentState }}
|
||||
{{> DetailBoxField title="Severity: " text=episodeSeverity }}
|
||||
{{#if isPrivateNote}}
|
||||
{{> DetailBoxField title="Private Note: " text=note }}
|
||||
{{else}}
|
||||
{{> DetailBoxField title="Public Note: " text=note }}
|
||||
{{/if}}
|
||||
{{> DetailBoxEnd this }}
|
||||
|
||||
|
||||
{{> InfoBlock info="You can view this incident episode by clicking on the button below - "}}
|
||||
|
||||
{{> ButtonBlock buttonUrl=episodeViewLink buttonText="View on Dashboard"}}
|
||||
|
||||
{{> InfoBlock info="You can also copy and paste this link:"}}
|
||||
{{> InfoBlock info=episodeViewLink}}
|
||||
|
||||
{{> InfoBlock info="You will be notified when the status of this incident episode changes."}}
|
||||
|
||||
{{> OwnerInfo this }}
|
||||
{{> UnsubscribeOwnerEmail this }}
|
||||
|
||||
{{> Footer this }}
|
||||
|
||||
{{> End this}}
|
||||
@@ -0,0 +1,35 @@
|
||||
{{> Start this}}
|
||||
|
||||
|
||||
{{> Logo this}}
|
||||
{{> EmailTitle title=(concat "Incident Episode " episodeNumber ": " episodeTitle) }}
|
||||
|
||||
{{> InfoBlock info=(concat "A new incident episode has been created in the project - " projectName)}}
|
||||
|
||||
{{> InfoBlock info="Here are the details: "}}
|
||||
|
||||
{{> DetailBoxStart this }}
|
||||
{{> DetailBoxField title="Episode Title:" text=episodeTitle }}
|
||||
{{> DetailBoxField title="Current State: " text=currentState }}
|
||||
{{> DetailBoxField title="Episode Created By: " text=declaredBy }}
|
||||
{{> DetailBoxField title="Episode Created At: " text=declaredAt }}
|
||||
{{> DetailBoxField title="Severity: " text=episodeSeverity }}
|
||||
{{> DetailBoxField title="Description: " text=episodeDescription }}
|
||||
{{> DetailBoxEnd this }}
|
||||
|
||||
|
||||
{{> InfoBlock info="You can view this incident episode by clicking on the button below - "}}
|
||||
|
||||
{{> ButtonBlock buttonUrl=episodeViewLink buttonText="View on Dashboard"}}
|
||||
|
||||
{{> InfoBlock info="You can also copy and paste this link:"}}
|
||||
{{> InfoBlock info=episodeViewLink}}
|
||||
|
||||
{{> InfoBlock info="You will be notified when the status of this incident episode changes."}}
|
||||
|
||||
{{> OwnerInfo this }}
|
||||
{{> UnsubscribeOwnerEmail this }}
|
||||
|
||||
{{> Footer this }}
|
||||
|
||||
{{> End this}}
|
||||
@@ -0,0 +1,37 @@
|
||||
{{> Start this}}
|
||||
|
||||
|
||||
{{> Logo this}}
|
||||
{{> EmailTitle title=(concat "Incident Episode " episodeNumber ": " episodeTitle) }}
|
||||
|
||||
{{> InfoBlock info="Incident episode state has changed"}}
|
||||
|
||||
{{> InfoBlock info="Here are the details: "}}
|
||||
|
||||
{{> DetailBoxStart this }}
|
||||
{{> StateTransition this}}
|
||||
{{#ifNotCond previousStateDurationText ""}}
|
||||
{{> DetailBoxField title="Duration in Previous State:" text=previousStateDurationText }}
|
||||
{{/ifNotCond}}
|
||||
{{> DetailBoxField title="Episode Title:" text=episodeTitle }}
|
||||
{{> DetailBoxField title="State changed at:" text=stateChangedAt }}
|
||||
{{> DetailBoxField title="Severity:" text=episodeSeverity }}
|
||||
{{> DetailBoxField title="Description:" text=episodeDescription }}
|
||||
{{> DetailBoxEnd this }}
|
||||
|
||||
|
||||
{{> InfoBlock info="You can view this incident episode by clicking on the button below - "}}
|
||||
|
||||
{{> ButtonBlock buttonUrl=episodeViewLink buttonText="View on Dashboard"}}
|
||||
|
||||
{{> InfoBlock info="You can also copy and paste this link:"}}
|
||||
{{> InfoBlock info=episodeViewLink}}
|
||||
|
||||
{{> InfoBlock info="You will be notified when the status of this incident episode changes."}}
|
||||
|
||||
{{> OwnerInfo this }}
|
||||
{{> UnsubscribeOwnerEmail this }}
|
||||
|
||||
{{> Footer this }}
|
||||
|
||||
{{> End this}}
|
||||
@@ -0,0 +1,32 @@
|
||||
{{> Start this}}
|
||||
|
||||
|
||||
{{> Logo this}}
|
||||
{{> EmailTitle title=(concat "Incident " incidentNumber ": " incidentTitle) }}
|
||||
|
||||
{{> InfoBlock info=(concat "You have been assigned as " incidentRole " to this incident.")}}
|
||||
|
||||
{{> InfoBlock info="Here are the details: "}}
|
||||
|
||||
{{> DetailBoxStart this }}
|
||||
{{> DetailBoxField title="Incident Title:" text=incidentTitle }}
|
||||
{{> DetailBoxField title="Your Role: " text=incidentRole }}
|
||||
{{> DetailBoxField title="Current State: " text=currentState }}
|
||||
{{> DetailBoxField title="Resources Affected: " text=resourcesAffected }}
|
||||
{{> DetailBoxField title="Severity: " text=incidentSeverity }}
|
||||
{{> DetailBoxField title="Description: " text=incidentDescription }}
|
||||
{{> DetailBoxEnd this }}
|
||||
|
||||
|
||||
{{> InfoBlock info="You can view this incident by clicking on the button below - "}}
|
||||
|
||||
{{> ButtonBlock buttonUrl=incidentViewLink buttonText="View on Dashboard"}}
|
||||
|
||||
{{> InfoBlock info="You can also copy and paste this link:"}}
|
||||
{{> InfoBlock info=incidentViewLink}}
|
||||
|
||||
{{> InfoBlock info="You will be notified when the status of this incident changes."}}
|
||||
|
||||
{{> Footer this }}
|
||||
|
||||
{{> End this}}
|
||||
@@ -2,7 +2,7 @@
|
||||
|
||||
|
||||
{{> Logo this}}
|
||||
{{> EmailTitle title=(concat "Incident: " incidentTitle) }}
|
||||
{{> EmailTitle title=(concat "Incident " incidentNumber ": " incidentTitle) }}
|
||||
|
||||
{{> InfoBlock info="You have been added as the owner of this incident."}}
|
||||
|
||||
|
||||
@@ -2,7 +2,7 @@
|
||||
|
||||
|
||||
{{> Logo this}}
|
||||
{{> EmailTitle title=(concat "Incident: " incidentTitle) }}
|
||||
{{> EmailTitle title=(concat "Incident " incidentNumber ": " incidentTitle) }}
|
||||
|
||||
{{> InfoBlock info="A new note has been posted on this incident."}}
|
||||
|
||||
|
||||
@@ -2,7 +2,7 @@
|
||||
|
||||
|
||||
{{> Logo this}}
|
||||
{{> EmailTitle title=(concat "Incident: " incidentTitle) }}
|
||||
{{> EmailTitle title=(concat "Incident " incidentNumber ": " incidentTitle) }}
|
||||
|
||||
{{> InfoBlock info=(concat "A new incident has been created in the project - " projectName)}}
|
||||
|
||||
|
||||
@@ -2,7 +2,7 @@
|
||||
|
||||
|
||||
{{> Logo this}}
|
||||
{{> EmailTitle title=(concat "Incident: " incidentTitle) }}
|
||||
{{> EmailTitle title=(concat "Incident " incidentNumber ": " incidentTitle) }}
|
||||
|
||||
{{> InfoBlock info="Incident state has changed"}}
|
||||
|
||||
|
||||
37
App/FeatureSet/Notification/Templates/Invoice.hbs
Normal file
37
App/FeatureSet/Notification/Templates/Invoice.hbs
Normal file
@@ -0,0 +1,37 @@
|
||||
{{> Start this}}
|
||||
|
||||
{{> Logo this}}
|
||||
|
||||
{{> EmailTitle title="Invoice from OneUptime" }}
|
||||
|
||||
{{> InfoBlock info="A new invoice has been generated for your account. Here are the details:"}}
|
||||
|
||||
{{> DetailBoxStart this }}
|
||||
{{> DetailBoxField title="Invoice Number:" text=invoiceNumber }}
|
||||
{{> DetailBoxField title="Invoice Date:" text=invoiceDate }}
|
||||
{{> DetailBoxField title="Amount:" text=amount }}
|
||||
{{#if description}}
|
||||
{{> DetailBoxField title="Description:" text=description }}
|
||||
{{/if}}
|
||||
{{> DetailBoxEnd this }}
|
||||
|
||||
{{#if invoicePdfUrl}}
|
||||
{{> InfoBlock info="You can view and download your invoice by clicking the button below:"}}
|
||||
|
||||
{{> ButtonBlock buttonUrl=invoicePdfUrl buttonText="View Invoice PDF"}}
|
||||
|
||||
{{> InfoBlock info="Or copy and paste this link:"}}
|
||||
{{> InfoBlock info=invoicePdfUrl}}
|
||||
{{/if}}
|
||||
|
||||
{{#if dashboardLink}}
|
||||
{{> InfoBlock info="You can also view all your invoices in your dashboard:"}}
|
||||
|
||||
{{> ButtonBlock buttonUrl=dashboardLink buttonText="View Billing Dashboard"}}
|
||||
{{/if}}
|
||||
|
||||
{{> InfoBlock info="You have received this email because you are subscribed to receive invoice notifications for this project."}}
|
||||
|
||||
{{> Footer this }}
|
||||
|
||||
{{> End this}}
|
||||
@@ -2,7 +2,7 @@
|
||||
|
||||
|
||||
{{> Logo this}}
|
||||
{{> EmailTitle title=(concat "Scheduled Maintenance: " scheduledMaintenanceTitle) }}
|
||||
{{> EmailTitle title=(concat "Scheduled Maintenance " scheduledMaintenanceNumber ": " scheduledMaintenanceTitle) }}
|
||||
|
||||
{{> InfoBlock info="You have been added as the owner of this scheduled maintenance event."}}
|
||||
|
||||
|
||||
@@ -2,7 +2,7 @@
|
||||
|
||||
|
||||
{{> Logo this}}
|
||||
{{> EmailTitle title=(concat "Scheduled Maintenance: " scheduledMaintenanceTitle) }}
|
||||
{{> EmailTitle title=(concat "Scheduled Maintenance " scheduledMaintenanceNumber ": " scheduledMaintenanceTitle) }}
|
||||
|
||||
{{> InfoBlock info="A new note has been posted on this scheduled maintenance event"}}
|
||||
|
||||
|
||||
@@ -2,7 +2,7 @@
|
||||
|
||||
|
||||
{{> Logo this}}
|
||||
{{> EmailTitle title=(concat "Scheduled Maintenance: " scheduledMaintenanceTitle) }}
|
||||
{{> EmailTitle title=(concat "Scheduled Maintenance " scheduledMaintenanceNumber ": " scheduledMaintenanceTitle) }}
|
||||
|
||||
{{> InfoBlock info=(concat "A new scheduled maintenance has been created in the project - " projectName)}}
|
||||
|
||||
|
||||
@@ -2,7 +2,7 @@
|
||||
|
||||
|
||||
{{> Logo this}}
|
||||
{{> EmailTitle title=(concat "Scheduled Maintenance: " scheduledMaintenanceTitle) }}
|
||||
{{> EmailTitle title=(concat "Scheduled Maintenance " scheduledMaintenanceNumber ": " scheduledMaintenanceTitle) }}
|
||||
|
||||
{{> InfoBlock info="Scheduled Maintenance state has changed"}}
|
||||
|
||||
|
||||
@@ -0,0 +1,36 @@
|
||||
{{> Start this}}
|
||||
|
||||
{{> CustomLogo this}}
|
||||
|
||||
{{> EmailTitle title=(concat "New Incident: " episodeTitle) }}
|
||||
|
||||
{{> InfoBlock info="A new incident has been reported that may affect the services you're subscribed to."}}
|
||||
|
||||
{{> DetailBoxStart this }}
|
||||
{{> DetailBoxField title="Incident" text=episodeTitle }}
|
||||
{{#if episodeSeverity}}
|
||||
{{> DetailBoxField title="Severity" text=episodeSeverity }}
|
||||
{{/if}}
|
||||
{{> DetailBoxField title="Affected Resources" text=resourcesAffected }}
|
||||
{{#if episodeDescription}}
|
||||
{{> DetailBoxField title="Description" text=episodeDescription }}
|
||||
{{/if}}
|
||||
{{> DetailBoxEnd this }}
|
||||
|
||||
{{#if detailsUrl}}
|
||||
{{> ButtonBlock buttonUrl=detailsUrl buttonText="View Incident Details"}}
|
||||
{{else}}
|
||||
{{> ButtonBlock buttonUrl=statusPageUrl buttonText="View Status Page"}}
|
||||
{{/if}}
|
||||
|
||||
{{> VerticalSpace this}}
|
||||
|
||||
{{#if subscriberEmailNotificationFooterText}}
|
||||
{{> InfoBlock info=subscriberEmailNotificationFooterText }}
|
||||
{{/if}}
|
||||
|
||||
{{> UnsubscribeBlock this}}
|
||||
|
||||
{{> Footer this}}
|
||||
|
||||
{{> End this}}
|
||||
@@ -0,0 +1,30 @@
|
||||
{{> Start this}}
|
||||
|
||||
{{> CustomLogo this}}
|
||||
{{> EmailTitle title=(concat "Incident: " episodeTitle) }}
|
||||
|
||||
{{> InfoBlock info="A new note has been added to the incident. Here are the details:"}}
|
||||
|
||||
{{> DetailBoxStart this }}
|
||||
{{> DetailBoxField title="Incident Title" text=episodeTitle }}
|
||||
{{> DetailBoxField title="Resources Affected" text=resourcesAffected }}
|
||||
{{#if episodeSeverity}}
|
||||
{{> DetailBoxField title="Severity" text=episodeSeverity }}
|
||||
{{/if}}
|
||||
{{> DetailBoxField title="Note" text=note }}
|
||||
{{> DetailBoxEnd this }}
|
||||
|
||||
|
||||
{{> InfoBlock info=(concat subscriberEmailNotificationFooterText "") }}
|
||||
|
||||
|
||||
{{#if detailsUrl}}
|
||||
{{> InfoBlock info=(concat "Find further information here: " detailsUrl)}}
|
||||
{{else}}
|
||||
{{> InfoBlock info=(concat "Find further information here: " statusPageUrl)}}
|
||||
{{/if}}
|
||||
|
||||
{{> UnsubscribeBlock this}}
|
||||
{{> VerticalSpace this}}
|
||||
|
||||
{{> End this}}
|
||||
@@ -0,0 +1,34 @@
|
||||
{{> Start this}}
|
||||
|
||||
{{> CustomLogo this}}
|
||||
|
||||
{{> EmailTitle title=emailTitle }}
|
||||
|
||||
{{> InfoBlock info="The status of an incident affecting services you're subscribed to has been updated."}}
|
||||
|
||||
{{> DetailBoxStart this }}
|
||||
{{> DetailBoxField title="Incident" text=episodeTitle }}
|
||||
{{> DetailBoxField title="Current State" text=episodeState }}
|
||||
{{#if episodeSeverity}}
|
||||
{{> DetailBoxField title="Severity" text=episodeSeverity }}
|
||||
{{/if}}
|
||||
{{> DetailBoxField title="Affected Resources" text=resourcesAffected }}
|
||||
{{> DetailBoxEnd this }}
|
||||
|
||||
{{#if detailsUrl}}
|
||||
{{> ButtonBlock buttonUrl=detailsUrl buttonText="View Incident Details"}}
|
||||
{{else}}
|
||||
{{> ButtonBlock buttonUrl=statusPageUrl buttonText="View Status Page"}}
|
||||
{{/if}}
|
||||
|
||||
{{> VerticalSpace this}}
|
||||
|
||||
{{#if subscriberEmailNotificationFooterText}}
|
||||
{{> InfoBlock info=subscriberEmailNotificationFooterText }}
|
||||
{{/if}}
|
||||
|
||||
{{> UnsubscribeBlock this}}
|
||||
|
||||
{{> Footer this}}
|
||||
|
||||
{{> End this}}
|
||||
29
App/package-lock.json
generated
29
App/package-lock.json
generated
@@ -83,6 +83,7 @@
|
||||
"ejs": "^3.1.10",
|
||||
"elkjs": "^0.10.0",
|
||||
"esbuild": "^0.25.5",
|
||||
"expo-server-sdk": "^3.15.0",
|
||||
"express": "^4.21.1",
|
||||
"formik": "^2.4.6",
|
||||
"history": "^5.3.0",
|
||||
@@ -92,6 +93,7 @@
|
||||
"jsonwebtoken": "^9.0.0",
|
||||
"jwt-decode": "^4.0.0",
|
||||
"marked": "^12.0.2",
|
||||
"mermaid": "^11.12.2",
|
||||
"moment": "^2.30.1",
|
||||
"moment-timezone": "^0.5.45",
|
||||
"multer": "^2.0.2",
|
||||
@@ -111,7 +113,7 @@
|
||||
"react-dropzone": "^14.2.2",
|
||||
"react-error-boundary": "^4.0.13",
|
||||
"react-highlight": "^0.15.0",
|
||||
"react-markdown": "^8.0.3",
|
||||
"react-markdown": "^9.0.0",
|
||||
"react-router-dom": "^6.30.1",
|
||||
"react-select": "^5.4.0",
|
||||
"react-spinners": "^0.14.1",
|
||||
@@ -121,7 +123,7 @@
|
||||
"recharts": "^2.12.7",
|
||||
"redis-semaphore": "^5.5.1",
|
||||
"reflect-metadata": "^0.2.2",
|
||||
"remark-gfm": "^3.0.1",
|
||||
"remark-gfm": "^4.0.0",
|
||||
"slackify-markdown": "^4.4.0",
|
||||
"slugify": "^1.6.5",
|
||||
"socket.io": "^4.7.4",
|
||||
@@ -1608,13 +1610,13 @@
|
||||
"license": "MIT"
|
||||
},
|
||||
"node_modules/axios": {
|
||||
"version": "1.13.1",
|
||||
"resolved": "https://registry.npmjs.org/axios/-/axios-1.13.1.tgz",
|
||||
"integrity": "sha512-hU4EGxxt+j7TQijx1oYdAjw4xuIp1wRQSsbMFwSthCWeBQur1eF+qJ5iQ5sN3Tw8YRzQNKb8jszgBdMDVqwJcw==",
|
||||
"version": "1.13.5",
|
||||
"resolved": "https://registry.npmjs.org/axios/-/axios-1.13.5.tgz",
|
||||
"integrity": "sha512-cz4ur7Vb0xS4/KUN0tPWe44eqxrIu31me+fbang3ijiNscE129POzipJJA6zniq2C/Z6sJCjMimjS8Lc/GAs8Q==",
|
||||
"license": "MIT",
|
||||
"dependencies": {
|
||||
"follow-redirects": "^1.15.6",
|
||||
"form-data": "^4.0.4",
|
||||
"follow-redirects": "^1.15.11",
|
||||
"form-data": "^4.0.5",
|
||||
"proxy-from-env": "^1.1.0"
|
||||
}
|
||||
},
|
||||
@@ -2085,9 +2087,10 @@
|
||||
}
|
||||
},
|
||||
"node_modules/diff": {
|
||||
"version": "4.0.2",
|
||||
"resolved": "https://registry.npmjs.org/diff/-/diff-4.0.2.tgz",
|
||||
"integrity": "sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A==",
|
||||
"version": "4.0.4",
|
||||
"resolved": "https://registry.npmjs.org/diff/-/diff-4.0.4.tgz",
|
||||
"integrity": "sha512-X07nttJQkwkfKfvTPG/KSnE2OMdcUCao6+eXF3wmnIQRn2aPAHH3VxDbDOdegkd6JbPsXqShpvEOHfAT+nCNwQ==",
|
||||
"license": "BSD-3-Clause",
|
||||
"engines": {
|
||||
"node": ">=0.3.1"
|
||||
}
|
||||
@@ -2386,9 +2389,9 @@
|
||||
}
|
||||
},
|
||||
"node_modules/form-data": {
|
||||
"version": "4.0.4",
|
||||
"resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.4.tgz",
|
||||
"integrity": "sha512-KrGhL9Q4zjj0kiUt5OO4Mr/A/jlI2jDYs5eHBpYHPcBEVSiipAvn2Ko2HnPe20rmcuuvMHNdZFp+4IlGTMF0Ow==",
|
||||
"version": "4.0.5",
|
||||
"resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.5.tgz",
|
||||
"integrity": "sha512-8RipRLol37bNs2bhoV67fiTEvdTrbMUYcFTiy3+wuuOnUog2QBHCZWXDRijWQfAkhBj2Uf5UnVaiWwA5vdd82w==",
|
||||
"license": "MIT",
|
||||
"dependencies": {
|
||||
"asynckit": "^0.4.0",
|
||||
|
||||
@@ -77,6 +77,7 @@ export enum AIAgentConnectionStatus {
|
||||
Permission.ProjectAdmin,
|
||||
Permission.ProjectMember,
|
||||
Permission.ReadProjectAIAgent,
|
||||
Permission.ReadAllProjectResources,
|
||||
],
|
||||
delete: [
|
||||
Permission.ProjectOwner,
|
||||
@@ -99,7 +100,11 @@ export default class AIAgent extends BaseModel {
|
||||
Permission.ProjectMember,
|
||||
Permission.CreateProjectAIAgent,
|
||||
],
|
||||
read: [Permission.ProjectOwner, Permission.ProjectAdmin],
|
||||
read: [
|
||||
Permission.ProjectOwner,
|
||||
Permission.ProjectAdmin,
|
||||
Permission.ReadAllProjectResources,
|
||||
],
|
||||
update: [
|
||||
Permission.ProjectOwner,
|
||||
Permission.ProjectAdmin,
|
||||
@@ -126,7 +131,7 @@ export default class AIAgent extends BaseModel {
|
||||
Permission.ProjectMember,
|
||||
Permission.CreateProjectAIAgent,
|
||||
],
|
||||
read: [Permission.Public],
|
||||
read: [Permission.Public, Permission.ReadAllProjectResources],
|
||||
update: [
|
||||
Permission.ProjectOwner,
|
||||
Permission.ProjectAdmin,
|
||||
@@ -154,7 +159,7 @@ export default class AIAgent extends BaseModel {
|
||||
Permission.ProjectMember,
|
||||
Permission.CreateProjectAIAgent,
|
||||
],
|
||||
read: [Permission.Public],
|
||||
read: [Permission.Public, Permission.ReadAllProjectResources],
|
||||
update: [
|
||||
Permission.ProjectOwner,
|
||||
Permission.ProjectAdmin,
|
||||
@@ -176,7 +181,7 @@ export default class AIAgent extends BaseModel {
|
||||
|
||||
@ColumnAccessControl({
|
||||
create: [],
|
||||
read: [Permission.Public],
|
||||
read: [Permission.Public, Permission.ReadAllProjectResources],
|
||||
update: [],
|
||||
})
|
||||
@TableColumn({
|
||||
@@ -202,7 +207,7 @@ export default class AIAgent extends BaseModel {
|
||||
Permission.ProjectMember,
|
||||
Permission.CreateProjectAIAgent,
|
||||
],
|
||||
read: [Permission.Public],
|
||||
read: [Permission.Public, Permission.ReadAllProjectResources],
|
||||
update: [
|
||||
Permission.ProjectOwner,
|
||||
Permission.ProjectAdmin,
|
||||
@@ -231,6 +236,7 @@ export default class AIAgent extends BaseModel {
|
||||
Permission.ProjectAdmin,
|
||||
Permission.ProjectMember,
|
||||
Permission.ReadProjectAIAgent,
|
||||
Permission.ReadAllProjectResources,
|
||||
],
|
||||
update: [],
|
||||
})
|
||||
@@ -258,6 +264,7 @@ export default class AIAgent extends BaseModel {
|
||||
Permission.ProjectAdmin,
|
||||
Permission.ProjectMember,
|
||||
Permission.ReadProjectAIAgent,
|
||||
Permission.ReadAllProjectResources,
|
||||
],
|
||||
update: [
|
||||
Permission.ProjectOwner,
|
||||
@@ -299,6 +306,7 @@ export default class AIAgent extends BaseModel {
|
||||
Permission.ProjectAdmin,
|
||||
Permission.ProjectMember,
|
||||
Permission.ReadProjectAIAgent,
|
||||
Permission.ReadAllProjectResources,
|
||||
],
|
||||
update: [
|
||||
Permission.ProjectOwner,
|
||||
@@ -328,7 +336,7 @@ export default class AIAgent extends BaseModel {
|
||||
Permission.ProjectMember,
|
||||
Permission.CreateProjectAIAgent,
|
||||
],
|
||||
read: [Permission.Public],
|
||||
read: [Permission.Public, Permission.ReadAllProjectResources],
|
||||
update: [],
|
||||
})
|
||||
@TableColumn({
|
||||
@@ -358,7 +366,7 @@ export default class AIAgent extends BaseModel {
|
||||
Permission.ProjectMember,
|
||||
Permission.CreateProjectAIAgent,
|
||||
],
|
||||
read: [Permission.Public],
|
||||
read: [Permission.Public, Permission.ReadAllProjectResources],
|
||||
update: [],
|
||||
})
|
||||
@TableColumn({
|
||||
@@ -421,7 +429,7 @@ export default class AIAgent extends BaseModel {
|
||||
Permission.ProjectMember,
|
||||
Permission.CreateProjectAIAgent,
|
||||
],
|
||||
read: [Permission.ProjectOwner],
|
||||
read: [Permission.ProjectOwner, Permission.ReadAllProjectResources],
|
||||
update: [],
|
||||
})
|
||||
@TableColumn({ type: TableColumnType.Entity, modelType: User })
|
||||
@@ -446,7 +454,7 @@ export default class AIAgent extends BaseModel {
|
||||
Permission.ProjectMember,
|
||||
Permission.CreateProjectAIAgent,
|
||||
],
|
||||
read: [Permission.ProjectOwner],
|
||||
read: [Permission.ProjectOwner, Permission.ReadAllProjectResources],
|
||||
update: [],
|
||||
})
|
||||
@TableColumn({
|
||||
@@ -490,6 +498,7 @@ export default class AIAgent extends BaseModel {
|
||||
Permission.ProjectAdmin,
|
||||
Permission.ProjectMember,
|
||||
Permission.ReadProjectAIAgent,
|
||||
Permission.ReadAllProjectResources,
|
||||
],
|
||||
update: [],
|
||||
})
|
||||
@@ -515,7 +524,7 @@ export default class AIAgent extends BaseModel {
|
||||
Permission.ProjectMember,
|
||||
Permission.CreateProjectAIAgent,
|
||||
],
|
||||
read: [Permission.Public],
|
||||
read: [Permission.Public, Permission.ReadAllProjectResources],
|
||||
update: [
|
||||
Permission.ProjectOwner,
|
||||
Permission.ProjectAdmin,
|
||||
@@ -552,6 +561,7 @@ export default class AIAgent extends BaseModel {
|
||||
Permission.ProjectAdmin,
|
||||
Permission.ProjectMember,
|
||||
Permission.ReadProjectAIAgent,
|
||||
Permission.ReadAllProjectResources,
|
||||
],
|
||||
update: [
|
||||
Permission.ProjectOwner,
|
||||
|
||||
@@ -41,6 +41,7 @@ import { Column, Entity, Index, JoinColumn, ManyToOne } from "typeorm";
|
||||
Permission.ProjectAdmin,
|
||||
Permission.ProjectMember,
|
||||
Permission.ReadAIAgentOwnerTeam,
|
||||
Permission.ReadAllProjectResources,
|
||||
],
|
||||
delete: [
|
||||
Permission.ProjectOwner,
|
||||
@@ -85,6 +86,7 @@ export default class AIAgentOwnerTeam extends BaseModel {
|
||||
Permission.ProjectAdmin,
|
||||
Permission.ProjectMember,
|
||||
Permission.ReadAIAgentOwnerTeam,
|
||||
Permission.ReadAllProjectResources,
|
||||
],
|
||||
update: [],
|
||||
})
|
||||
@@ -122,6 +124,7 @@ export default class AIAgentOwnerTeam extends BaseModel {
|
||||
Permission.ProjectAdmin,
|
||||
Permission.ProjectMember,
|
||||
Permission.ReadAIAgentOwnerTeam,
|
||||
Permission.ReadAllProjectResources,
|
||||
],
|
||||
update: [],
|
||||
})
|
||||
@@ -153,6 +156,7 @@ export default class AIAgentOwnerTeam extends BaseModel {
|
||||
Permission.ProjectAdmin,
|
||||
Permission.ProjectMember,
|
||||
Permission.ReadAIAgentOwnerTeam,
|
||||
Permission.ReadAllProjectResources,
|
||||
],
|
||||
update: [],
|
||||
})
|
||||
@@ -191,6 +195,7 @@ export default class AIAgentOwnerTeam extends BaseModel {
|
||||
Permission.ProjectAdmin,
|
||||
Permission.ProjectMember,
|
||||
Permission.ReadAIAgentOwnerTeam,
|
||||
Permission.ReadAllProjectResources,
|
||||
],
|
||||
update: [],
|
||||
})
|
||||
@@ -222,6 +227,7 @@ export default class AIAgentOwnerTeam extends BaseModel {
|
||||
Permission.ProjectAdmin,
|
||||
Permission.ProjectMember,
|
||||
Permission.ReadAIAgentOwnerTeam,
|
||||
Permission.ReadAllProjectResources,
|
||||
],
|
||||
update: [],
|
||||
})
|
||||
@@ -259,6 +265,7 @@ export default class AIAgentOwnerTeam extends BaseModel {
|
||||
Permission.ProjectAdmin,
|
||||
Permission.ProjectMember,
|
||||
Permission.ReadAIAgentOwnerTeam,
|
||||
Permission.ReadAllProjectResources,
|
||||
],
|
||||
update: [],
|
||||
})
|
||||
@@ -290,6 +297,7 @@ export default class AIAgentOwnerTeam extends BaseModel {
|
||||
Permission.ProjectAdmin,
|
||||
Permission.ProjectMember,
|
||||
Permission.ReadAIAgentOwnerTeam,
|
||||
Permission.ReadAllProjectResources,
|
||||
],
|
||||
update: [],
|
||||
})
|
||||
@@ -328,6 +336,7 @@ export default class AIAgentOwnerTeam extends BaseModel {
|
||||
Permission.ProjectAdmin,
|
||||
Permission.ProjectMember,
|
||||
Permission.ReadAIAgentOwnerTeam,
|
||||
Permission.ReadAllProjectResources,
|
||||
],
|
||||
update: [],
|
||||
})
|
||||
@@ -352,6 +361,7 @@ export default class AIAgentOwnerTeam extends BaseModel {
|
||||
Permission.ProjectAdmin,
|
||||
Permission.ProjectMember,
|
||||
Permission.ReadAIAgentOwnerTeam,
|
||||
Permission.ReadAllProjectResources,
|
||||
],
|
||||
update: [],
|
||||
})
|
||||
@@ -386,6 +396,7 @@ export default class AIAgentOwnerTeam extends BaseModel {
|
||||
Permission.ProjectAdmin,
|
||||
Permission.ProjectMember,
|
||||
Permission.ReadAIAgentOwnerTeam,
|
||||
Permission.ReadAllProjectResources,
|
||||
],
|
||||
update: [],
|
||||
})
|
||||
@@ -410,6 +421,7 @@ export default class AIAgentOwnerTeam extends BaseModel {
|
||||
Permission.ProjectAdmin,
|
||||
Permission.ProjectMember,
|
||||
Permission.ReadAIAgentOwnerTeam,
|
||||
Permission.ReadAllProjectResources,
|
||||
],
|
||||
update: [],
|
||||
})
|
||||
|
||||
@@ -40,6 +40,7 @@ import { Column, Entity, Index, JoinColumn, ManyToOne } from "typeorm";
|
||||
Permission.ProjectAdmin,
|
||||
Permission.ProjectMember,
|
||||
Permission.ReadAIAgentOwnerUser,
|
||||
Permission.ReadAllProjectResources,
|
||||
],
|
||||
delete: [
|
||||
Permission.ProjectOwner,
|
||||
@@ -84,6 +85,7 @@ export default class AIAgentOwnerUser extends BaseModel {
|
||||
Permission.ProjectAdmin,
|
||||
Permission.ProjectMember,
|
||||
Permission.ReadAIAgentOwnerUser,
|
||||
Permission.ReadAllProjectResources,
|
||||
],
|
||||
update: [],
|
||||
})
|
||||
@@ -121,6 +123,7 @@ export default class AIAgentOwnerUser extends BaseModel {
|
||||
Permission.ProjectAdmin,
|
||||
Permission.ProjectMember,
|
||||
Permission.ReadAIAgentOwnerUser,
|
||||
Permission.ReadAllProjectResources,
|
||||
],
|
||||
update: [],
|
||||
})
|
||||
@@ -152,6 +155,7 @@ export default class AIAgentOwnerUser extends BaseModel {
|
||||
Permission.ProjectAdmin,
|
||||
Permission.ProjectMember,
|
||||
Permission.ReadAIAgentOwnerUser,
|
||||
Permission.ReadAllProjectResources,
|
||||
],
|
||||
update: [],
|
||||
})
|
||||
@@ -190,6 +194,7 @@ export default class AIAgentOwnerUser extends BaseModel {
|
||||
Permission.ProjectAdmin,
|
||||
Permission.ProjectMember,
|
||||
Permission.ReadAIAgentOwnerUser,
|
||||
Permission.ReadAllProjectResources,
|
||||
],
|
||||
update: [],
|
||||
})
|
||||
@@ -221,6 +226,7 @@ export default class AIAgentOwnerUser extends BaseModel {
|
||||
Permission.ProjectAdmin,
|
||||
Permission.ProjectMember,
|
||||
Permission.ReadAIAgentOwnerUser,
|
||||
Permission.ReadAllProjectResources,
|
||||
],
|
||||
update: [],
|
||||
})
|
||||
@@ -258,6 +264,7 @@ export default class AIAgentOwnerUser extends BaseModel {
|
||||
Permission.ProjectAdmin,
|
||||
Permission.ProjectMember,
|
||||
Permission.ReadAIAgentOwnerUser,
|
||||
Permission.ReadAllProjectResources,
|
||||
],
|
||||
update: [],
|
||||
})
|
||||
@@ -289,6 +296,7 @@ export default class AIAgentOwnerUser extends BaseModel {
|
||||
Permission.ProjectAdmin,
|
||||
Permission.ProjectMember,
|
||||
Permission.ReadAIAgentOwnerUser,
|
||||
Permission.ReadAllProjectResources,
|
||||
],
|
||||
update: [],
|
||||
})
|
||||
@@ -327,6 +335,7 @@ export default class AIAgentOwnerUser extends BaseModel {
|
||||
Permission.ProjectAdmin,
|
||||
Permission.ProjectMember,
|
||||
Permission.ReadAIAgentOwnerUser,
|
||||
Permission.ReadAllProjectResources,
|
||||
],
|
||||
update: [],
|
||||
})
|
||||
@@ -351,6 +360,7 @@ export default class AIAgentOwnerUser extends BaseModel {
|
||||
Permission.ProjectAdmin,
|
||||
Permission.ProjectMember,
|
||||
Permission.ReadAIAgentOwnerUser,
|
||||
Permission.ReadAllProjectResources,
|
||||
],
|
||||
update: [],
|
||||
})
|
||||
@@ -385,6 +395,7 @@ export default class AIAgentOwnerUser extends BaseModel {
|
||||
Permission.ProjectAdmin,
|
||||
Permission.ProjectMember,
|
||||
Permission.ReadAIAgentOwnerUser,
|
||||
Permission.ReadAllProjectResources,
|
||||
],
|
||||
update: [],
|
||||
})
|
||||
@@ -409,6 +420,7 @@ export default class AIAgentOwnerUser extends BaseModel {
|
||||
Permission.ProjectAdmin,
|
||||
Permission.ProjectMember,
|
||||
Permission.ReadAIAgentOwnerUser,
|
||||
Permission.ReadAllProjectResources,
|
||||
],
|
||||
update: [],
|
||||
})
|
||||
|
||||
@@ -55,6 +55,7 @@ import { AIAgentTaskMetadata } from "../../Types/AI/AIAgentTaskMetadata";
|
||||
Permission.ProjectAdmin,
|
||||
Permission.ProjectMember,
|
||||
Permission.ReadProjectAIAgentTask,
|
||||
Permission.ReadAllProjectResources,
|
||||
],
|
||||
delete: [
|
||||
Permission.ProjectOwner,
|
||||
@@ -82,6 +83,7 @@ export default class AIAgentTask extends BaseModel {
|
||||
Permission.ProjectAdmin,
|
||||
Permission.ProjectMember,
|
||||
Permission.ReadProjectAIAgentTask,
|
||||
Permission.ReadAllProjectResources,
|
||||
],
|
||||
update: [],
|
||||
})
|
||||
@@ -120,6 +122,7 @@ export default class AIAgentTask extends BaseModel {
|
||||
Permission.ProjectAdmin,
|
||||
Permission.ProjectMember,
|
||||
Permission.ReadProjectAIAgentTask,
|
||||
Permission.ReadAllProjectResources,
|
||||
],
|
||||
update: [],
|
||||
})
|
||||
@@ -150,6 +153,7 @@ export default class AIAgentTask extends BaseModel {
|
||||
Permission.ProjectAdmin,
|
||||
Permission.ProjectMember,
|
||||
Permission.ReadProjectAIAgentTask,
|
||||
Permission.ReadAllProjectResources,
|
||||
],
|
||||
update: [
|
||||
Permission.ProjectOwner,
|
||||
@@ -183,6 +187,7 @@ export default class AIAgentTask extends BaseModel {
|
||||
Permission.ProjectAdmin,
|
||||
Permission.ProjectMember,
|
||||
Permission.ReadProjectAIAgentTask,
|
||||
Permission.ReadAllProjectResources,
|
||||
],
|
||||
update: [
|
||||
Permission.ProjectOwner,
|
||||
@@ -216,6 +221,7 @@ export default class AIAgentTask extends BaseModel {
|
||||
Permission.ProjectAdmin,
|
||||
Permission.ProjectMember,
|
||||
Permission.ReadProjectAIAgentTask,
|
||||
Permission.ReadAllProjectResources,
|
||||
],
|
||||
update: [
|
||||
Permission.ProjectOwner,
|
||||
@@ -258,6 +264,7 @@ export default class AIAgentTask extends BaseModel {
|
||||
Permission.ProjectAdmin,
|
||||
Permission.ProjectMember,
|
||||
Permission.ReadProjectAIAgentTask,
|
||||
Permission.ReadAllProjectResources,
|
||||
],
|
||||
update: [
|
||||
Permission.ProjectOwner,
|
||||
@@ -293,6 +300,7 @@ export default class AIAgentTask extends BaseModel {
|
||||
Permission.ProjectAdmin,
|
||||
Permission.ProjectMember,
|
||||
Permission.ReadProjectAIAgentTask,
|
||||
Permission.ReadAllProjectResources,
|
||||
],
|
||||
update: [],
|
||||
})
|
||||
@@ -323,6 +331,7 @@ export default class AIAgentTask extends BaseModel {
|
||||
Permission.ProjectAdmin,
|
||||
Permission.ProjectMember,
|
||||
Permission.ReadProjectAIAgentTask,
|
||||
Permission.ReadAllProjectResources,
|
||||
],
|
||||
update: [
|
||||
Permission.ProjectOwner,
|
||||
@@ -354,6 +363,7 @@ export default class AIAgentTask extends BaseModel {
|
||||
Permission.ProjectAdmin,
|
||||
Permission.ProjectMember,
|
||||
Permission.ReadProjectAIAgentTask,
|
||||
Permission.ReadAllProjectResources,
|
||||
],
|
||||
update: [
|
||||
Permission.ProjectOwner,
|
||||
@@ -387,6 +397,7 @@ export default class AIAgentTask extends BaseModel {
|
||||
Permission.ProjectAdmin,
|
||||
Permission.ProjectMember,
|
||||
Permission.ReadProjectAIAgentTask,
|
||||
Permission.ReadAllProjectResources,
|
||||
],
|
||||
update: [
|
||||
Permission.ProjectOwner,
|
||||
@@ -415,6 +426,7 @@ export default class AIAgentTask extends BaseModel {
|
||||
Permission.ProjectAdmin,
|
||||
Permission.ProjectMember,
|
||||
Permission.ReadProjectAIAgentTask,
|
||||
Permission.ReadAllProjectResources,
|
||||
],
|
||||
update: [],
|
||||
})
|
||||
@@ -438,6 +450,7 @@ export default class AIAgentTask extends BaseModel {
|
||||
Permission.ProjectAdmin,
|
||||
Permission.ProjectMember,
|
||||
Permission.ReadProjectAIAgentTask,
|
||||
Permission.ReadAllProjectResources,
|
||||
],
|
||||
update: [],
|
||||
})
|
||||
@@ -495,7 +508,11 @@ export default class AIAgentTask extends BaseModel {
|
||||
|
||||
@ColumnAccessControl({
|
||||
create: [],
|
||||
read: [Permission.ProjectOwner, Permission.ProjectAdmin],
|
||||
read: [
|
||||
Permission.ProjectOwner,
|
||||
Permission.ProjectAdmin,
|
||||
Permission.ReadAllProjectResources,
|
||||
],
|
||||
update: [],
|
||||
})
|
||||
@TableColumn({ type: TableColumnType.Entity, modelType: User })
|
||||
@@ -515,7 +532,11 @@ export default class AIAgentTask extends BaseModel {
|
||||
|
||||
@ColumnAccessControl({
|
||||
create: [],
|
||||
read: [Permission.ProjectOwner, Permission.ProjectAdmin],
|
||||
read: [
|
||||
Permission.ProjectOwner,
|
||||
Permission.ProjectAdmin,
|
||||
Permission.ReadAllProjectResources,
|
||||
],
|
||||
update: [],
|
||||
})
|
||||
@TableColumn({
|
||||
@@ -543,6 +564,7 @@ export default class AIAgentTask extends BaseModel {
|
||||
Permission.ProjectAdmin,
|
||||
Permission.ProjectMember,
|
||||
Permission.ReadProjectAIAgentTask,
|
||||
Permission.ReadAllProjectResources,
|
||||
],
|
||||
update: [],
|
||||
})
|
||||
|
||||
@@ -53,6 +53,7 @@ import LogSeverity from "../../Types/Log/LogSeverity";
|
||||
Permission.ProjectAdmin,
|
||||
Permission.ProjectMember,
|
||||
Permission.ReadProjectAIAgentTask,
|
||||
Permission.ReadAllProjectResources,
|
||||
],
|
||||
delete: [
|
||||
Permission.ProjectOwner,
|
||||
@@ -80,6 +81,7 @@ export default class AIAgentTaskLog extends BaseModel {
|
||||
Permission.ProjectAdmin,
|
||||
Permission.ProjectMember,
|
||||
Permission.ReadProjectAIAgentTask,
|
||||
Permission.ReadAllProjectResources,
|
||||
],
|
||||
update: [],
|
||||
})
|
||||
@@ -118,6 +120,7 @@ export default class AIAgentTaskLog extends BaseModel {
|
||||
Permission.ProjectAdmin,
|
||||
Permission.ProjectMember,
|
||||
Permission.ReadProjectAIAgentTask,
|
||||
Permission.ReadAllProjectResources,
|
||||
],
|
||||
update: [],
|
||||
})
|
||||
@@ -148,6 +151,7 @@ export default class AIAgentTaskLog extends BaseModel {
|
||||
Permission.ProjectAdmin,
|
||||
Permission.ProjectMember,
|
||||
Permission.ReadProjectAIAgentTask,
|
||||
Permission.ReadAllProjectResources,
|
||||
],
|
||||
update: [],
|
||||
})
|
||||
@@ -186,6 +190,7 @@ export default class AIAgentTaskLog extends BaseModel {
|
||||
Permission.ProjectAdmin,
|
||||
Permission.ProjectMember,
|
||||
Permission.ReadProjectAIAgentTask,
|
||||
Permission.ReadAllProjectResources,
|
||||
],
|
||||
update: [],
|
||||
})
|
||||
@@ -216,6 +221,7 @@ export default class AIAgentTaskLog extends BaseModel {
|
||||
Permission.ProjectAdmin,
|
||||
Permission.ProjectMember,
|
||||
Permission.ReadProjectAIAgentTask,
|
||||
Permission.ReadAllProjectResources,
|
||||
],
|
||||
update: [],
|
||||
})
|
||||
@@ -254,6 +260,7 @@ export default class AIAgentTaskLog extends BaseModel {
|
||||
Permission.ProjectAdmin,
|
||||
Permission.ProjectMember,
|
||||
Permission.ReadProjectAIAgentTask,
|
||||
Permission.ReadAllProjectResources,
|
||||
],
|
||||
update: [],
|
||||
})
|
||||
@@ -284,6 +291,7 @@ export default class AIAgentTaskLog extends BaseModel {
|
||||
Permission.ProjectAdmin,
|
||||
Permission.ProjectMember,
|
||||
Permission.ReadProjectAIAgentTask,
|
||||
Permission.ReadAllProjectResources,
|
||||
],
|
||||
update: [
|
||||
Permission.ProjectOwner,
|
||||
@@ -318,6 +326,7 @@ export default class AIAgentTaskLog extends BaseModel {
|
||||
Permission.ProjectAdmin,
|
||||
Permission.ProjectMember,
|
||||
Permission.ReadProjectAIAgentTask,
|
||||
Permission.ReadAllProjectResources,
|
||||
],
|
||||
update: [
|
||||
Permission.ProjectOwner,
|
||||
@@ -379,7 +388,11 @@ export default class AIAgentTaskLog extends BaseModel {
|
||||
|
||||
@ColumnAccessControl({
|
||||
create: [],
|
||||
read: [Permission.ProjectOwner, Permission.ProjectAdmin],
|
||||
read: [
|
||||
Permission.ProjectOwner,
|
||||
Permission.ProjectAdmin,
|
||||
Permission.ReadAllProjectResources,
|
||||
],
|
||||
update: [],
|
||||
})
|
||||
@TableColumn({ type: TableColumnType.Entity, modelType: User })
|
||||
@@ -399,7 +412,11 @@ export default class AIAgentTaskLog extends BaseModel {
|
||||
|
||||
@ColumnAccessControl({
|
||||
create: [],
|
||||
read: [Permission.ProjectOwner, Permission.ProjectAdmin],
|
||||
read: [
|
||||
Permission.ProjectOwner,
|
||||
Permission.ProjectAdmin,
|
||||
Permission.ReadAllProjectResources,
|
||||
],
|
||||
update: [],
|
||||
})
|
||||
@TableColumn({
|
||||
|
||||
@@ -55,6 +55,7 @@ import EnableDocumentation from "../../Types/Database/EnableDocumentation";
|
||||
Permission.ProjectAdmin,
|
||||
Permission.ProjectMember,
|
||||
Permission.ReadProjectAIAgentTask,
|
||||
Permission.ReadAllProjectResources,
|
||||
],
|
||||
delete: [
|
||||
Permission.ProjectOwner,
|
||||
@@ -82,6 +83,7 @@ export default class AIAgentTaskPullRequest extends BaseModel {
|
||||
Permission.ProjectAdmin,
|
||||
Permission.ProjectMember,
|
||||
Permission.ReadProjectAIAgentTask,
|
||||
Permission.ReadAllProjectResources,
|
||||
],
|
||||
update: [],
|
||||
})
|
||||
@@ -120,6 +122,7 @@ export default class AIAgentTaskPullRequest extends BaseModel {
|
||||
Permission.ProjectAdmin,
|
||||
Permission.ProjectMember,
|
||||
Permission.ReadProjectAIAgentTask,
|
||||
Permission.ReadAllProjectResources,
|
||||
],
|
||||
update: [],
|
||||
})
|
||||
@@ -150,6 +153,7 @@ export default class AIAgentTaskPullRequest extends BaseModel {
|
||||
Permission.ProjectAdmin,
|
||||
Permission.ProjectMember,
|
||||
Permission.ReadProjectAIAgentTask,
|
||||
Permission.ReadAllProjectResources,
|
||||
],
|
||||
update: [],
|
||||
})
|
||||
@@ -188,6 +192,7 @@ export default class AIAgentTaskPullRequest extends BaseModel {
|
||||
Permission.ProjectAdmin,
|
||||
Permission.ProjectMember,
|
||||
Permission.ReadProjectAIAgentTask,
|
||||
Permission.ReadAllProjectResources,
|
||||
],
|
||||
update: [],
|
||||
})
|
||||
@@ -218,6 +223,7 @@ export default class AIAgentTaskPullRequest extends BaseModel {
|
||||
Permission.ProjectAdmin,
|
||||
Permission.ProjectMember,
|
||||
Permission.ReadProjectAIAgentTask,
|
||||
Permission.ReadAllProjectResources,
|
||||
],
|
||||
update: [],
|
||||
})
|
||||
@@ -256,6 +262,7 @@ export default class AIAgentTaskPullRequest extends BaseModel {
|
||||
Permission.ProjectAdmin,
|
||||
Permission.ProjectMember,
|
||||
Permission.ReadProjectAIAgentTask,
|
||||
Permission.ReadAllProjectResources,
|
||||
],
|
||||
update: [],
|
||||
})
|
||||
@@ -286,6 +293,7 @@ export default class AIAgentTaskPullRequest extends BaseModel {
|
||||
Permission.ProjectAdmin,
|
||||
Permission.ProjectMember,
|
||||
Permission.ReadProjectAIAgentTask,
|
||||
Permission.ReadAllProjectResources,
|
||||
],
|
||||
update: [],
|
||||
})
|
||||
@@ -324,6 +332,7 @@ export default class AIAgentTaskPullRequest extends BaseModel {
|
||||
Permission.ProjectAdmin,
|
||||
Permission.ProjectMember,
|
||||
Permission.ReadProjectAIAgentTask,
|
||||
Permission.ReadAllProjectResources,
|
||||
],
|
||||
update: [],
|
||||
})
|
||||
@@ -354,6 +363,7 @@ export default class AIAgentTaskPullRequest extends BaseModel {
|
||||
Permission.ProjectAdmin,
|
||||
Permission.ProjectMember,
|
||||
Permission.ReadProjectAIAgentTask,
|
||||
Permission.ReadAllProjectResources,
|
||||
],
|
||||
update: [
|
||||
Permission.ProjectOwner,
|
||||
@@ -388,6 +398,7 @@ export default class AIAgentTaskPullRequest extends BaseModel {
|
||||
Permission.ProjectAdmin,
|
||||
Permission.ProjectMember,
|
||||
Permission.ReadProjectAIAgentTask,
|
||||
Permission.ReadAllProjectResources,
|
||||
],
|
||||
update: [
|
||||
Permission.ProjectOwner,
|
||||
@@ -420,6 +431,7 @@ export default class AIAgentTaskPullRequest extends BaseModel {
|
||||
Permission.ProjectAdmin,
|
||||
Permission.ProjectMember,
|
||||
Permission.ReadProjectAIAgentTask,
|
||||
Permission.ReadAllProjectResources,
|
||||
],
|
||||
update: [
|
||||
Permission.ProjectOwner,
|
||||
@@ -454,6 +466,7 @@ export default class AIAgentTaskPullRequest extends BaseModel {
|
||||
Permission.ProjectAdmin,
|
||||
Permission.ProjectMember,
|
||||
Permission.ReadProjectAIAgentTask,
|
||||
Permission.ReadAllProjectResources,
|
||||
],
|
||||
update: [],
|
||||
})
|
||||
@@ -483,6 +496,7 @@ export default class AIAgentTaskPullRequest extends BaseModel {
|
||||
Permission.ProjectAdmin,
|
||||
Permission.ProjectMember,
|
||||
Permission.ReadProjectAIAgentTask,
|
||||
Permission.ReadAllProjectResources,
|
||||
],
|
||||
update: [],
|
||||
})
|
||||
@@ -512,6 +526,7 @@ export default class AIAgentTaskPullRequest extends BaseModel {
|
||||
Permission.ProjectAdmin,
|
||||
Permission.ProjectMember,
|
||||
Permission.ReadProjectAIAgentTask,
|
||||
Permission.ReadAllProjectResources,
|
||||
],
|
||||
update: [
|
||||
Permission.ProjectOwner,
|
||||
@@ -548,6 +563,7 @@ export default class AIAgentTaskPullRequest extends BaseModel {
|
||||
Permission.ProjectAdmin,
|
||||
Permission.ProjectMember,
|
||||
Permission.ReadProjectAIAgentTask,
|
||||
Permission.ReadAllProjectResources,
|
||||
],
|
||||
update: [],
|
||||
})
|
||||
@@ -577,6 +593,7 @@ export default class AIAgentTaskPullRequest extends BaseModel {
|
||||
Permission.ProjectAdmin,
|
||||
Permission.ProjectMember,
|
||||
Permission.ReadProjectAIAgentTask,
|
||||
Permission.ReadAllProjectResources,
|
||||
],
|
||||
update: [],
|
||||
})
|
||||
@@ -606,6 +623,7 @@ export default class AIAgentTaskPullRequest extends BaseModel {
|
||||
Permission.ProjectAdmin,
|
||||
Permission.ProjectMember,
|
||||
Permission.ReadProjectAIAgentTask,
|
||||
Permission.ReadAllProjectResources,
|
||||
],
|
||||
update: [],
|
||||
})
|
||||
@@ -635,6 +653,7 @@ export default class AIAgentTaskPullRequest extends BaseModel {
|
||||
Permission.ProjectAdmin,
|
||||
Permission.ProjectMember,
|
||||
Permission.ReadProjectAIAgentTask,
|
||||
Permission.ReadAllProjectResources,
|
||||
],
|
||||
update: [],
|
||||
})
|
||||
@@ -693,7 +712,11 @@ export default class AIAgentTaskPullRequest extends BaseModel {
|
||||
|
||||
@ColumnAccessControl({
|
||||
create: [],
|
||||
read: [Permission.ProjectOwner, Permission.ProjectAdmin],
|
||||
read: [
|
||||
Permission.ProjectOwner,
|
||||
Permission.ProjectAdmin,
|
||||
Permission.ReadAllProjectResources,
|
||||
],
|
||||
update: [],
|
||||
})
|
||||
@TableColumn({ type: TableColumnType.Entity, modelType: User })
|
||||
@@ -713,7 +736,11 @@ export default class AIAgentTaskPullRequest extends BaseModel {
|
||||
|
||||
@ColumnAccessControl({
|
||||
create: [],
|
||||
read: [Permission.ProjectOwner, Permission.ProjectAdmin],
|
||||
read: [
|
||||
Permission.ProjectOwner,
|
||||
Permission.ProjectAdmin,
|
||||
Permission.ReadAllProjectResources,
|
||||
],
|
||||
update: [],
|
||||
})
|
||||
@TableColumn({
|
||||
|
||||
@@ -40,6 +40,7 @@ import TelemetryException from "./TelemetryException";
|
||||
Permission.ProjectAdmin,
|
||||
Permission.ProjectMember,
|
||||
Permission.ReadProjectAIAgentTaskTelemetryException,
|
||||
Permission.ReadAllProjectResources,
|
||||
],
|
||||
delete: [
|
||||
Permission.ProjectOwner,
|
||||
@@ -79,6 +80,7 @@ export default class AIAgentTaskTelemetryException extends BaseModel {
|
||||
Permission.ProjectAdmin,
|
||||
Permission.ProjectMember,
|
||||
Permission.ReadProjectAIAgentTaskTelemetryException,
|
||||
Permission.ReadAllProjectResources,
|
||||
],
|
||||
update: [],
|
||||
})
|
||||
@@ -115,6 +117,7 @@ export default class AIAgentTaskTelemetryException extends BaseModel {
|
||||
Permission.ProjectAdmin,
|
||||
Permission.ProjectMember,
|
||||
Permission.ReadProjectAIAgentTaskTelemetryException,
|
||||
Permission.ReadAllProjectResources,
|
||||
],
|
||||
update: [],
|
||||
})
|
||||
@@ -145,6 +148,7 @@ export default class AIAgentTaskTelemetryException extends BaseModel {
|
||||
Permission.ProjectAdmin,
|
||||
Permission.ProjectMember,
|
||||
Permission.ReadProjectAIAgentTaskTelemetryException,
|
||||
Permission.ReadAllProjectResources,
|
||||
],
|
||||
update: [],
|
||||
})
|
||||
@@ -181,6 +185,7 @@ export default class AIAgentTaskTelemetryException extends BaseModel {
|
||||
Permission.ProjectAdmin,
|
||||
Permission.ProjectMember,
|
||||
Permission.ReadProjectAIAgentTaskTelemetryException,
|
||||
Permission.ReadAllProjectResources,
|
||||
],
|
||||
update: [],
|
||||
})
|
||||
@@ -211,6 +216,7 @@ export default class AIAgentTaskTelemetryException extends BaseModel {
|
||||
Permission.ProjectAdmin,
|
||||
Permission.ProjectMember,
|
||||
Permission.ReadProjectAIAgentTaskTelemetryException,
|
||||
Permission.ReadAllProjectResources,
|
||||
],
|
||||
update: [],
|
||||
})
|
||||
@@ -247,6 +253,7 @@ export default class AIAgentTaskTelemetryException extends BaseModel {
|
||||
Permission.ProjectAdmin,
|
||||
Permission.ProjectMember,
|
||||
Permission.ReadProjectAIAgentTaskTelemetryException,
|
||||
Permission.ReadAllProjectResources,
|
||||
],
|
||||
update: [],
|
||||
})
|
||||
@@ -277,6 +284,7 @@ export default class AIAgentTaskTelemetryException extends BaseModel {
|
||||
Permission.ProjectAdmin,
|
||||
Permission.ProjectMember,
|
||||
Permission.ReadProjectAIAgentTaskTelemetryException,
|
||||
Permission.ReadAllProjectResources,
|
||||
],
|
||||
update: [],
|
||||
})
|
||||
@@ -314,6 +322,7 @@ export default class AIAgentTaskTelemetryException extends BaseModel {
|
||||
Permission.ProjectAdmin,
|
||||
Permission.ProjectMember,
|
||||
Permission.ReadProjectAIAgentTaskTelemetryException,
|
||||
Permission.ReadAllProjectResources,
|
||||
],
|
||||
update: [],
|
||||
})
|
||||
@@ -337,6 +346,7 @@ export default class AIAgentTaskTelemetryException extends BaseModel {
|
||||
Permission.ProjectAdmin,
|
||||
Permission.ProjectMember,
|
||||
Permission.ReadProjectAIAgentTaskTelemetryException,
|
||||
Permission.ReadAllProjectResources,
|
||||
],
|
||||
update: [],
|
||||
})
|
||||
@@ -370,6 +380,7 @@ export default class AIAgentTaskTelemetryException extends BaseModel {
|
||||
Permission.ProjectAdmin,
|
||||
Permission.ProjectMember,
|
||||
Permission.ReadProjectAIAgentTaskTelemetryException,
|
||||
Permission.ReadAllProjectResources,
|
||||
],
|
||||
update: [],
|
||||
})
|
||||
|
||||
@@ -1,3 +1,4 @@
|
||||
import AlertEpisode from "./AlertEpisode";
|
||||
import AlertSeverity from "./AlertSeverity";
|
||||
import AlertState from "./AlertState";
|
||||
import Label from "./Label";
|
||||
@@ -56,6 +57,7 @@ import NotificationRuleWorkspaceChannel from "../../Types/Workspace/Notification
|
||||
Permission.ProjectAdmin,
|
||||
Permission.ProjectMember,
|
||||
Permission.ReadAlert,
|
||||
Permission.ReadAllProjectResources,
|
||||
],
|
||||
delete: [
|
||||
Permission.ProjectOwner,
|
||||
@@ -105,6 +107,7 @@ export default class Alert extends BaseModel {
|
||||
Permission.ProjectAdmin,
|
||||
Permission.ProjectMember,
|
||||
Permission.ReadAlert,
|
||||
Permission.ReadAllProjectResources,
|
||||
],
|
||||
update: [],
|
||||
})
|
||||
@@ -141,6 +144,7 @@ export default class Alert extends BaseModel {
|
||||
Permission.ProjectAdmin,
|
||||
Permission.ProjectMember,
|
||||
Permission.ReadAlert,
|
||||
Permission.ReadAllProjectResources,
|
||||
],
|
||||
update: [],
|
||||
})
|
||||
@@ -172,6 +176,7 @@ export default class Alert extends BaseModel {
|
||||
Permission.ProjectAdmin,
|
||||
Permission.ProjectMember,
|
||||
Permission.ReadAlert,
|
||||
Permission.ReadAllProjectResources,
|
||||
],
|
||||
update: [
|
||||
Permission.ProjectOwner,
|
||||
@@ -208,6 +213,7 @@ export default class Alert extends BaseModel {
|
||||
Permission.ProjectAdmin,
|
||||
Permission.ProjectMember,
|
||||
Permission.ReadAlert,
|
||||
Permission.ReadAllProjectResources,
|
||||
],
|
||||
update: [
|
||||
Permission.ProjectOwner,
|
||||
@@ -243,6 +249,7 @@ export default class Alert extends BaseModel {
|
||||
Permission.ProjectAdmin,
|
||||
Permission.ProjectMember,
|
||||
Permission.ReadAlert,
|
||||
Permission.ReadAllProjectResources,
|
||||
],
|
||||
update: [],
|
||||
})
|
||||
@@ -280,6 +287,7 @@ export default class Alert extends BaseModel {
|
||||
Permission.ProjectAdmin,
|
||||
Permission.ProjectMember,
|
||||
Permission.ReadAlert,
|
||||
Permission.ReadAllProjectResources,
|
||||
],
|
||||
update: [],
|
||||
})
|
||||
@@ -356,6 +364,7 @@ export default class Alert extends BaseModel {
|
||||
Permission.ProjectAdmin,
|
||||
Permission.ProjectMember,
|
||||
Permission.ReadAlert,
|
||||
Permission.ReadAllProjectResources,
|
||||
],
|
||||
update: [
|
||||
Permission.ProjectOwner,
|
||||
@@ -398,6 +407,7 @@ export default class Alert extends BaseModel {
|
||||
Permission.ProjectAdmin,
|
||||
Permission.ProjectMember,
|
||||
Permission.ReadAlert,
|
||||
Permission.ReadAllProjectResources,
|
||||
],
|
||||
update: [
|
||||
Permission.ProjectOwner,
|
||||
@@ -408,9 +418,8 @@ export default class Alert extends BaseModel {
|
||||
})
|
||||
@TableColumn({
|
||||
type: TableColumnType.ObjectID,
|
||||
title: "Deleted by User ID",
|
||||
description:
|
||||
"User ID who deleted this object (if this object was deleted by a User)",
|
||||
title: "Monitor ID",
|
||||
description: "ID of the monitor this alert belongs to",
|
||||
})
|
||||
@Column({
|
||||
type: ColumnType.ObjectID,
|
||||
@@ -431,6 +440,7 @@ export default class Alert extends BaseModel {
|
||||
Permission.ProjectAdmin,
|
||||
Permission.ProjectMember,
|
||||
Permission.ReadAlert,
|
||||
Permission.ReadAllProjectResources,
|
||||
],
|
||||
update: [
|
||||
Permission.ProjectOwner,
|
||||
@@ -442,9 +452,9 @@ export default class Alert extends BaseModel {
|
||||
@TableColumn({
|
||||
required: false,
|
||||
type: TableColumnType.EntityArray,
|
||||
modelType: Monitor,
|
||||
modelType: OnCallDutyPolicy,
|
||||
title: "On-Call Duty Policies",
|
||||
description: "List of on-call duty policy affected by this alert.",
|
||||
description: "List of on-call duty policies affected by this alert.",
|
||||
})
|
||||
@ManyToMany(
|
||||
() => {
|
||||
@@ -455,15 +465,15 @@ export default class Alert extends BaseModel {
|
||||
@JoinTable({
|
||||
name: "AlertOnCallDutyPolicy",
|
||||
inverseJoinColumn: {
|
||||
name: "monitorId",
|
||||
referencedColumnName: "_id",
|
||||
},
|
||||
joinColumn: {
|
||||
name: "onCallDutyPolicyId",
|
||||
referencedColumnName: "_id",
|
||||
},
|
||||
joinColumn: {
|
||||
name: "alertId",
|
||||
referencedColumnName: "_id",
|
||||
},
|
||||
})
|
||||
public onCallDutyPolicies?: Array<OnCallDutyPolicy> = undefined; // monitors affected by this alert.
|
||||
public onCallDutyPolicies?: Array<OnCallDutyPolicy> = undefined; // on-call duty policies affected by this alert.
|
||||
|
||||
@ColumnAccessControl({
|
||||
create: [
|
||||
@@ -477,6 +487,7 @@ export default class Alert extends BaseModel {
|
||||
Permission.ProjectAdmin,
|
||||
Permission.ProjectMember,
|
||||
Permission.ReadAlert,
|
||||
Permission.ReadAllProjectResources,
|
||||
],
|
||||
update: [
|
||||
Permission.ProjectOwner,
|
||||
@@ -524,6 +535,7 @@ export default class Alert extends BaseModel {
|
||||
Permission.ProjectAdmin,
|
||||
Permission.ProjectMember,
|
||||
Permission.ReadAlert,
|
||||
Permission.ReadAllProjectResources,
|
||||
],
|
||||
update: [
|
||||
Permission.ProjectOwner,
|
||||
@@ -565,6 +577,7 @@ export default class Alert extends BaseModel {
|
||||
Permission.ProjectAdmin,
|
||||
Permission.ProjectMember,
|
||||
Permission.ReadAlert,
|
||||
Permission.ReadAllProjectResources,
|
||||
],
|
||||
update: [
|
||||
Permission.ProjectOwner,
|
||||
@@ -578,13 +591,13 @@ export default class Alert extends BaseModel {
|
||||
type: TableColumnType.ObjectID,
|
||||
required: true,
|
||||
isDefaultValueColumn: true,
|
||||
canReadOnRelationQuery: true,
|
||||
title: "Current Alert State ID",
|
||||
description: "Current Alert State ID",
|
||||
example: "a1b2c3d4-e5f6-7890-abcd-ef1234567890",
|
||||
})
|
||||
@Column({
|
||||
type: ColumnType.ObjectID,
|
||||
|
||||
nullable: false,
|
||||
transformer: ObjectID.getDatabaseTransformer(),
|
||||
})
|
||||
@@ -602,6 +615,7 @@ export default class Alert extends BaseModel {
|
||||
Permission.ProjectAdmin,
|
||||
Permission.ProjectMember,
|
||||
Permission.ReadAlert,
|
||||
Permission.ReadAllProjectResources,
|
||||
],
|
||||
update: [
|
||||
Permission.ProjectOwner,
|
||||
@@ -643,6 +657,7 @@ export default class Alert extends BaseModel {
|
||||
Permission.ProjectAdmin,
|
||||
Permission.ProjectMember,
|
||||
Permission.ReadAlert,
|
||||
Permission.ReadAllProjectResources,
|
||||
],
|
||||
update: [
|
||||
Permission.ProjectOwner,
|
||||
@@ -678,13 +693,14 @@ export default class Alert extends BaseModel {
|
||||
Permission.ProjectAdmin,
|
||||
Permission.ProjectMember,
|
||||
Permission.ReadAlert,
|
||||
Permission.ReadAllProjectResources,
|
||||
],
|
||||
update: [],
|
||||
})
|
||||
@TableColumn({
|
||||
manyToOneRelationColumn: "monitorStatusWhenThisAlertWasCreatedId",
|
||||
type: TableColumnType.Entity,
|
||||
modelType: AlertState,
|
||||
modelType: MonitorStatus,
|
||||
title: "Monitor status when this alert was created",
|
||||
description: "Monitor status when this alert was created",
|
||||
})
|
||||
@@ -713,6 +729,7 @@ export default class Alert extends BaseModel {
|
||||
Permission.ProjectAdmin,
|
||||
Permission.ProjectMember,
|
||||
Permission.ReadAlert,
|
||||
Permission.ReadAllProjectResources,
|
||||
],
|
||||
update: [
|
||||
Permission.ProjectOwner,
|
||||
@@ -747,6 +764,7 @@ export default class Alert extends BaseModel {
|
||||
Permission.ProjectAdmin,
|
||||
Permission.ProjectMember,
|
||||
Permission.ReadAlert,
|
||||
Permission.ReadAllProjectResources,
|
||||
],
|
||||
update: [
|
||||
Permission.ProjectOwner,
|
||||
@@ -775,6 +793,7 @@ export default class Alert extends BaseModel {
|
||||
Permission.ProjectAdmin,
|
||||
Permission.ProjectMember,
|
||||
Permission.ReadAlert,
|
||||
Permission.ReadAllProjectResources,
|
||||
],
|
||||
update: [],
|
||||
})
|
||||
@@ -808,6 +827,7 @@ export default class Alert extends BaseModel {
|
||||
Permission.ProjectAdmin,
|
||||
Permission.ProjectMember,
|
||||
Permission.ReadAlert,
|
||||
Permission.ReadAllProjectResources,
|
||||
],
|
||||
update: [],
|
||||
})
|
||||
@@ -833,6 +853,7 @@ export default class Alert extends BaseModel {
|
||||
Permission.ProjectAdmin,
|
||||
Permission.ProjectMember,
|
||||
Permission.ReadAlert,
|
||||
Permission.ReadAllProjectResources,
|
||||
],
|
||||
update: [],
|
||||
})
|
||||
@@ -840,6 +861,7 @@ export default class Alert extends BaseModel {
|
||||
isDefaultValueColumn: false,
|
||||
required: false,
|
||||
type: TableColumnType.JSON,
|
||||
computed: true,
|
||||
})
|
||||
@Column({
|
||||
type: ColumnType.JSON,
|
||||
@@ -855,6 +877,7 @@ export default class Alert extends BaseModel {
|
||||
Permission.ProjectAdmin,
|
||||
Permission.ProjectMember,
|
||||
Permission.ReadAlert,
|
||||
Permission.ReadAllProjectResources,
|
||||
],
|
||||
update: [],
|
||||
})
|
||||
@@ -880,6 +903,7 @@ export default class Alert extends BaseModel {
|
||||
Permission.ProjectAdmin,
|
||||
Permission.ProjectMember,
|
||||
Permission.ReadAlert,
|
||||
Permission.ReadAllProjectResources,
|
||||
],
|
||||
update: [],
|
||||
})
|
||||
@@ -912,6 +936,7 @@ export default class Alert extends BaseModel {
|
||||
Permission.ProjectAdmin,
|
||||
Permission.ProjectMember,
|
||||
Permission.ReadAlert,
|
||||
Permission.ReadAllProjectResources,
|
||||
],
|
||||
update: [],
|
||||
})
|
||||
@@ -938,6 +963,7 @@ export default class Alert extends BaseModel {
|
||||
Permission.ProjectAdmin,
|
||||
Permission.ProjectMember,
|
||||
Permission.ReadAlert,
|
||||
Permission.ReadAllProjectResources,
|
||||
],
|
||||
update: [],
|
||||
})
|
||||
@@ -967,6 +993,7 @@ export default class Alert extends BaseModel {
|
||||
Permission.ProjectAdmin,
|
||||
Permission.ProjectMember,
|
||||
Permission.ReadAlert,
|
||||
Permission.ReadAllProjectResources,
|
||||
],
|
||||
update: [
|
||||
Permission.ProjectOwner,
|
||||
@@ -1001,6 +1028,7 @@ export default class Alert extends BaseModel {
|
||||
Permission.ProjectAdmin,
|
||||
Permission.ProjectMember,
|
||||
Permission.ReadAlert,
|
||||
Permission.ReadAllProjectResources,
|
||||
],
|
||||
update: [
|
||||
Permission.ProjectOwner,
|
||||
@@ -1034,6 +1062,7 @@ export default class Alert extends BaseModel {
|
||||
Permission.ProjectAdmin,
|
||||
Permission.ProjectMember,
|
||||
Permission.ReadAlert,
|
||||
Permission.ReadAllProjectResources,
|
||||
],
|
||||
update: [],
|
||||
})
|
||||
@@ -1043,6 +1072,7 @@ export default class Alert extends BaseModel {
|
||||
required: false,
|
||||
type: TableColumnType.Number,
|
||||
computed: true,
|
||||
canReadOnRelationQuery: true,
|
||||
title: "Alert Number",
|
||||
description: "Alert Number",
|
||||
example: 42,
|
||||
@@ -1053,6 +1083,33 @@ export default class Alert extends BaseModel {
|
||||
})
|
||||
public alertNumber?: number = undefined;
|
||||
|
||||
@ColumnAccessControl({
|
||||
create: [],
|
||||
read: [
|
||||
Permission.ProjectOwner,
|
||||
Permission.ProjectAdmin,
|
||||
Permission.ProjectMember,
|
||||
Permission.ReadAlert,
|
||||
Permission.ReadAllProjectResources,
|
||||
],
|
||||
update: [],
|
||||
})
|
||||
@TableColumn({
|
||||
isDefaultValueColumn: false,
|
||||
required: false,
|
||||
type: TableColumnType.ShortText,
|
||||
title: "Alert Number With Prefix",
|
||||
description: "Alert number with prefix (e.g., 'ALT-42' or '#42')",
|
||||
computed: true,
|
||||
canReadOnRelationQuery: true,
|
||||
})
|
||||
@Column({
|
||||
type: ColumnType.ShortText,
|
||||
length: ColumnLength.ShortText,
|
||||
nullable: true,
|
||||
})
|
||||
public alertNumberWithPrefix?: string = undefined;
|
||||
|
||||
@ColumnAccessControl({
|
||||
create: [],
|
||||
read: [],
|
||||
@@ -1071,4 +1128,81 @@ export default class Alert extends BaseModel {
|
||||
})
|
||||
public postUpdatesToWorkspaceChannels?: Array<NotificationRuleWorkspaceChannel> =
|
||||
undefined;
|
||||
|
||||
@ColumnAccessControl({
|
||||
create: [
|
||||
Permission.ProjectOwner,
|
||||
Permission.ProjectAdmin,
|
||||
Permission.ProjectMember,
|
||||
Permission.CreateAlert,
|
||||
],
|
||||
read: [
|
||||
Permission.ProjectOwner,
|
||||
Permission.ProjectAdmin,
|
||||
Permission.ProjectMember,
|
||||
Permission.ReadAlert,
|
||||
Permission.ReadAllProjectResources,
|
||||
],
|
||||
update: [
|
||||
Permission.ProjectOwner,
|
||||
Permission.ProjectAdmin,
|
||||
Permission.ProjectMember,
|
||||
Permission.EditAlert,
|
||||
],
|
||||
})
|
||||
@TableColumn({
|
||||
manyToOneRelationColumn: "alertEpisodeId",
|
||||
type: TableColumnType.Entity,
|
||||
modelType: AlertEpisode,
|
||||
title: "Alert Episode",
|
||||
description: "The episode this alert belongs to (if grouped)",
|
||||
})
|
||||
@ManyToOne(
|
||||
() => {
|
||||
return AlertEpisode;
|
||||
},
|
||||
{
|
||||
eager: false,
|
||||
nullable: true,
|
||||
onDelete: "SET NULL",
|
||||
orphanedRowAction: "nullify",
|
||||
},
|
||||
)
|
||||
@JoinColumn({ name: "alertEpisodeId" })
|
||||
public alertEpisode?: AlertEpisode = undefined;
|
||||
|
||||
@ColumnAccessControl({
|
||||
create: [
|
||||
Permission.ProjectOwner,
|
||||
Permission.ProjectAdmin,
|
||||
Permission.ProjectMember,
|
||||
Permission.CreateAlert,
|
||||
],
|
||||
read: [
|
||||
Permission.ProjectOwner,
|
||||
Permission.ProjectAdmin,
|
||||
Permission.ProjectMember,
|
||||
Permission.ReadAlert,
|
||||
Permission.ReadAllProjectResources,
|
||||
],
|
||||
update: [
|
||||
Permission.ProjectOwner,
|
||||
Permission.ProjectAdmin,
|
||||
Permission.ProjectMember,
|
||||
Permission.EditAlert,
|
||||
],
|
||||
})
|
||||
@Index()
|
||||
@TableColumn({
|
||||
type: TableColumnType.ObjectID,
|
||||
required: false,
|
||||
title: "Alert Episode ID",
|
||||
description: "The ID of the episode this alert belongs to (if grouped)",
|
||||
})
|
||||
@Column({
|
||||
type: ColumnType.ObjectID,
|
||||
nullable: true,
|
||||
transformer: ObjectID.getDatabaseTransformer(),
|
||||
})
|
||||
public alertEpisodeId?: ObjectID = undefined;
|
||||
}
|
||||
|
||||
@@ -40,6 +40,7 @@ import { Column, Entity, Index, JoinColumn, ManyToOne } from "typeorm";
|
||||
Permission.ProjectAdmin,
|
||||
Permission.ProjectMember,
|
||||
Permission.ReadAlertCustomField,
|
||||
Permission.ReadAllProjectResources,
|
||||
],
|
||||
delete: [
|
||||
Permission.ProjectOwner,
|
||||
@@ -75,6 +76,7 @@ export default class AlertCustomField extends BaseModel {
|
||||
Permission.ProjectAdmin,
|
||||
Permission.ProjectMember,
|
||||
Permission.ReadAlertCustomField,
|
||||
Permission.ReadAllProjectResources,
|
||||
],
|
||||
update: [],
|
||||
})
|
||||
@@ -110,6 +112,7 @@ export default class AlertCustomField extends BaseModel {
|
||||
Permission.ProjectAdmin,
|
||||
Permission.ProjectMember,
|
||||
Permission.ReadAlertCustomField,
|
||||
Permission.ReadAllProjectResources,
|
||||
],
|
||||
update: [],
|
||||
})
|
||||
@@ -140,6 +143,7 @@ export default class AlertCustomField extends BaseModel {
|
||||
Permission.ProjectAdmin,
|
||||
Permission.ProjectMember,
|
||||
Permission.ReadAlertCustomField,
|
||||
Permission.ReadAllProjectResources,
|
||||
],
|
||||
update: [
|
||||
Permission.ProjectOwner,
|
||||
@@ -174,6 +178,7 @@ export default class AlertCustomField extends BaseModel {
|
||||
Permission.ProjectAdmin,
|
||||
Permission.ProjectMember,
|
||||
Permission.ReadAlertCustomField,
|
||||
Permission.ReadAllProjectResources,
|
||||
],
|
||||
update: [
|
||||
Permission.ProjectOwner,
|
||||
@@ -208,6 +213,7 @@ export default class AlertCustomField extends BaseModel {
|
||||
Permission.ProjectAdmin,
|
||||
Permission.ProjectMember,
|
||||
Permission.ReadAlertCustomField,
|
||||
Permission.ReadAllProjectResources,
|
||||
],
|
||||
update: [],
|
||||
})
|
||||
@@ -236,6 +242,7 @@ export default class AlertCustomField extends BaseModel {
|
||||
Permission.ProjectAdmin,
|
||||
Permission.ProjectMember,
|
||||
Permission.ReadAlertCustomField,
|
||||
Permission.ReadAllProjectResources,
|
||||
],
|
||||
update: [],
|
||||
})
|
||||
@@ -272,6 +279,7 @@ export default class AlertCustomField extends BaseModel {
|
||||
Permission.ProjectAdmin,
|
||||
Permission.ProjectMember,
|
||||
Permission.ReadAlertCustomField,
|
||||
Permission.ReadAllProjectResources,
|
||||
],
|
||||
update: [],
|
||||
})
|
||||
@@ -296,6 +304,7 @@ export default class AlertCustomField extends BaseModel {
|
||||
Permission.ProjectAdmin,
|
||||
Permission.ProjectMember,
|
||||
Permission.ReadAlertCustomField,
|
||||
Permission.ReadAllProjectResources,
|
||||
],
|
||||
update: [],
|
||||
})
|
||||
@@ -329,6 +338,7 @@ export default class AlertCustomField extends BaseModel {
|
||||
Permission.ProjectAdmin,
|
||||
Permission.ProjectMember,
|
||||
Permission.ReadAlertCustomField,
|
||||
Permission.ReadAllProjectResources,
|
||||
],
|
||||
update: [],
|
||||
})
|
||||
|
||||
1285
Common/Models/DatabaseModels/AlertEpisode.ts
Normal file
1285
Common/Models/DatabaseModels/AlertEpisode.ts
Normal file
File diff suppressed because it is too large
Load Diff
543
Common/Models/DatabaseModels/AlertEpisodeFeed.ts
Normal file
543
Common/Models/DatabaseModels/AlertEpisodeFeed.ts
Normal file
@@ -0,0 +1,543 @@
|
||||
import AlertEpisode from "./AlertEpisode";
|
||||
import Project from "./Project";
|
||||
import User from "./User";
|
||||
import BaseModel from "./DatabaseBaseModel/DatabaseBaseModel";
|
||||
import Route from "../../Types/API/Route";
|
||||
import ColumnAccessControl from "../../Types/Database/AccessControl/ColumnAccessControl";
|
||||
import TableAccessControl from "../../Types/Database/AccessControl/TableAccessControl";
|
||||
import CanAccessIfCanReadOn from "../../Types/Database/CanAccessIfCanReadOn";
|
||||
import ColumnLength from "../../Types/Database/ColumnLength";
|
||||
import ColumnType from "../../Types/Database/ColumnType";
|
||||
import CrudApiEndpoint from "../../Types/Database/CrudApiEndpoint";
|
||||
import EnableDocumentation from "../../Types/Database/EnableDocumentation";
|
||||
import EnableWorkflow from "../../Types/Database/EnableWorkflow";
|
||||
import ColorField from "../../Types/Database/ColorField";
|
||||
import TableColumn from "../../Types/Database/TableColumn";
|
||||
import TableColumnType from "../../Types/Database/TableColumnType";
|
||||
import TableMetadata from "../../Types/Database/TableMetadata";
|
||||
import TenantColumn from "../../Types/Database/TenantColumn";
|
||||
import Color from "../../Types/Color";
|
||||
import IconProp from "../../Types/Icon/IconProp";
|
||||
import ObjectID from "../../Types/ObjectID";
|
||||
import Permission from "../../Types/Permission";
|
||||
import { Column, Entity, Index, JoinColumn, ManyToOne } from "typeorm";
|
||||
|
||||
export enum AlertEpisodeFeedEventType {
|
||||
EpisodeCreated = "EpisodeCreated",
|
||||
EpisodeStateChanged = "EpisodeStateChanged",
|
||||
EpisodeUpdated = "EpisodeUpdated",
|
||||
AlertAdded = "AlertAdded",
|
||||
AlertRemoved = "AlertRemoved",
|
||||
OwnerUserAdded = "OwnerUserAdded",
|
||||
OwnerTeamAdded = "OwnerTeamAdded",
|
||||
OwnerUserRemoved = "OwnerUserRemoved",
|
||||
OwnerTeamRemoved = "OwnerTeamRemoved",
|
||||
OwnerNotificationSent = "OwnerNotificationSent",
|
||||
PrivateNote = "PrivateNote",
|
||||
RootCause = "RootCause",
|
||||
OnCallPolicy = "OnCallPolicy",
|
||||
OnCallNotification = "OnCallNotification",
|
||||
SeverityChanged = "SeverityChanged",
|
||||
}
|
||||
|
||||
@EnableDocumentation()
|
||||
@CanAccessIfCanReadOn("alertEpisode")
|
||||
@TenantColumn("projectId")
|
||||
@TableAccessControl({
|
||||
create: [
|
||||
Permission.ProjectOwner,
|
||||
Permission.ProjectAdmin,
|
||||
Permission.ProjectMember,
|
||||
Permission.CreateAlertEpisodeFeed,
|
||||
],
|
||||
read: [
|
||||
Permission.ProjectOwner,
|
||||
Permission.ProjectAdmin,
|
||||
Permission.ProjectMember,
|
||||
Permission.ReadAlertEpisodeFeed,
|
||||
Permission.ReadAllProjectResources,
|
||||
],
|
||||
delete: [],
|
||||
update: [],
|
||||
})
|
||||
@EnableWorkflow({
|
||||
create: true,
|
||||
delete: true,
|
||||
update: true,
|
||||
read: true,
|
||||
})
|
||||
@CrudApiEndpoint(new Route("/alert-episode-feed"))
|
||||
@Entity({
|
||||
name: "AlertEpisodeFeed",
|
||||
})
|
||||
@TableMetadata({
|
||||
tableName: "AlertEpisodeFeed",
|
||||
singularName: "Alert Episode Feed",
|
||||
pluralName: "Alert Episode Feeds",
|
||||
icon: IconProp.List,
|
||||
tableDescription:
|
||||
"Log of the entire alert episode activity. This is a log of all the episode state changes, alerts added/removed, notes, etc.",
|
||||
})
|
||||
export default class AlertEpisodeFeed extends BaseModel {
|
||||
@ColumnAccessControl({
|
||||
create: [
|
||||
Permission.ProjectOwner,
|
||||
Permission.ProjectAdmin,
|
||||
Permission.ProjectMember,
|
||||
Permission.CreateAlertEpisodeFeed,
|
||||
],
|
||||
read: [
|
||||
Permission.ProjectOwner,
|
||||
Permission.ProjectAdmin,
|
||||
Permission.ProjectMember,
|
||||
Permission.ReadAlertEpisodeFeed,
|
||||
Permission.ReadAllProjectResources,
|
||||
],
|
||||
update: [],
|
||||
})
|
||||
@TableColumn({
|
||||
manyToOneRelationColumn: "projectId",
|
||||
type: TableColumnType.Entity,
|
||||
modelType: Project,
|
||||
title: "Project",
|
||||
description: "Relation to Project Resource in which this object belongs",
|
||||
})
|
||||
@ManyToOne(
|
||||
() => {
|
||||
return Project;
|
||||
},
|
||||
{
|
||||
eager: false,
|
||||
nullable: true,
|
||||
onDelete: "CASCADE",
|
||||
orphanedRowAction: "nullify",
|
||||
},
|
||||
)
|
||||
@JoinColumn({ name: "projectId" })
|
||||
public project?: Project = undefined;
|
||||
|
||||
@ColumnAccessControl({
|
||||
create: [
|
||||
Permission.ProjectOwner,
|
||||
Permission.ProjectAdmin,
|
||||
Permission.ProjectMember,
|
||||
Permission.CreateAlertEpisodeFeed,
|
||||
],
|
||||
read: [
|
||||
Permission.ProjectOwner,
|
||||
Permission.ProjectAdmin,
|
||||
Permission.ProjectMember,
|
||||
Permission.ReadAlertEpisodeFeed,
|
||||
Permission.ReadAllProjectResources,
|
||||
],
|
||||
update: [],
|
||||
})
|
||||
@Index()
|
||||
@TableColumn({
|
||||
type: TableColumnType.ObjectID,
|
||||
required: true,
|
||||
canReadOnRelationQuery: true,
|
||||
title: "Project ID",
|
||||
description: "ID of your OneUptime Project in which this object belongs",
|
||||
})
|
||||
@Column({
|
||||
type: ColumnType.ObjectID,
|
||||
nullable: false,
|
||||
transformer: ObjectID.getDatabaseTransformer(),
|
||||
})
|
||||
public projectId?: ObjectID = undefined;
|
||||
|
||||
@ColumnAccessControl({
|
||||
create: [
|
||||
Permission.ProjectOwner,
|
||||
Permission.ProjectAdmin,
|
||||
Permission.ProjectMember,
|
||||
Permission.CreateAlertEpisodeFeed,
|
||||
],
|
||||
read: [
|
||||
Permission.ProjectOwner,
|
||||
Permission.ProjectAdmin,
|
||||
Permission.ProjectMember,
|
||||
Permission.ReadAlertEpisodeFeed,
|
||||
Permission.ReadAllProjectResources,
|
||||
],
|
||||
update: [],
|
||||
})
|
||||
@TableColumn({
|
||||
manyToOneRelationColumn: "alertEpisodeId",
|
||||
type: TableColumnType.Entity,
|
||||
modelType: AlertEpisode,
|
||||
title: "Alert Episode",
|
||||
description: "Relation to Alert Episode in which this resource belongs",
|
||||
})
|
||||
@ManyToOne(
|
||||
() => {
|
||||
return AlertEpisode;
|
||||
},
|
||||
{
|
||||
eager: false,
|
||||
nullable: true,
|
||||
onDelete: "CASCADE",
|
||||
orphanedRowAction: "nullify",
|
||||
},
|
||||
)
|
||||
@JoinColumn({ name: "alertEpisodeId" })
|
||||
public alertEpisode?: AlertEpisode = undefined;
|
||||
|
||||
@ColumnAccessControl({
|
||||
create: [
|
||||
Permission.ProjectOwner,
|
||||
Permission.ProjectAdmin,
|
||||
Permission.ProjectMember,
|
||||
Permission.CreateAlertEpisodeFeed,
|
||||
],
|
||||
read: [
|
||||
Permission.ProjectOwner,
|
||||
Permission.ProjectAdmin,
|
||||
Permission.ProjectMember,
|
||||
Permission.ReadAlertEpisodeFeed,
|
||||
Permission.ReadAllProjectResources,
|
||||
],
|
||||
update: [],
|
||||
})
|
||||
@Index()
|
||||
@TableColumn({
|
||||
type: TableColumnType.ObjectID,
|
||||
required: true,
|
||||
title: "Alert Episode ID",
|
||||
description: "Relation to Alert Episode ID in which this resource belongs",
|
||||
})
|
||||
@Column({
|
||||
type: ColumnType.ObjectID,
|
||||
nullable: false,
|
||||
transformer: ObjectID.getDatabaseTransformer(),
|
||||
})
|
||||
public alertEpisodeId?: ObjectID = undefined;
|
||||
|
||||
@ColumnAccessControl({
|
||||
create: [
|
||||
Permission.ProjectOwner,
|
||||
Permission.ProjectAdmin,
|
||||
Permission.ProjectMember,
|
||||
Permission.CreateAlertEpisodeFeed,
|
||||
],
|
||||
read: [
|
||||
Permission.ProjectOwner,
|
||||
Permission.ProjectAdmin,
|
||||
Permission.ProjectMember,
|
||||
Permission.ReadAlertEpisodeFeed,
|
||||
Permission.ReadAllProjectResources,
|
||||
],
|
||||
update: [],
|
||||
})
|
||||
@TableColumn({
|
||||
manyToOneRelationColumn: "createdByUserId",
|
||||
type: TableColumnType.Entity,
|
||||
modelType: User,
|
||||
title: "Created by User",
|
||||
description:
|
||||
"Relation to User who created this object (if this object was created by a User)",
|
||||
})
|
||||
@ManyToOne(
|
||||
() => {
|
||||
return User;
|
||||
},
|
||||
{
|
||||
eager: false,
|
||||
nullable: true,
|
||||
onDelete: "SET NULL",
|
||||
orphanedRowAction: "nullify",
|
||||
},
|
||||
)
|
||||
@JoinColumn({ name: "createdByUserId" })
|
||||
public createdByUser?: User = undefined;
|
||||
|
||||
@ColumnAccessControl({
|
||||
create: [
|
||||
Permission.ProjectOwner,
|
||||
Permission.ProjectAdmin,
|
||||
Permission.ProjectMember,
|
||||
Permission.CreateAlertEpisodeFeed,
|
||||
],
|
||||
read: [
|
||||
Permission.ProjectOwner,
|
||||
Permission.ProjectAdmin,
|
||||
Permission.ProjectMember,
|
||||
Permission.ReadAlertEpisodeFeed,
|
||||
Permission.ReadAllProjectResources,
|
||||
],
|
||||
update: [],
|
||||
})
|
||||
@TableColumn({
|
||||
type: TableColumnType.ObjectID,
|
||||
title: "Created by User ID",
|
||||
description:
|
||||
"User ID who created this object (if this object was created by a User)",
|
||||
})
|
||||
@Column({
|
||||
type: ColumnType.ObjectID,
|
||||
nullable: true,
|
||||
transformer: ObjectID.getDatabaseTransformer(),
|
||||
})
|
||||
public createdByUserId?: ObjectID = undefined;
|
||||
|
||||
@ColumnAccessControl({
|
||||
create: [],
|
||||
read: [],
|
||||
update: [],
|
||||
})
|
||||
@TableColumn({
|
||||
manyToOneRelationColumn: "deletedByUserId",
|
||||
type: TableColumnType.Entity,
|
||||
title: "Deleted by User",
|
||||
modelType: User,
|
||||
description:
|
||||
"Relation to User who deleted this object (if this object was deleted by a User)",
|
||||
})
|
||||
@ManyToOne(
|
||||
() => {
|
||||
return User;
|
||||
},
|
||||
{
|
||||
cascade: false,
|
||||
eager: false,
|
||||
nullable: true,
|
||||
onDelete: "SET NULL",
|
||||
orphanedRowAction: "nullify",
|
||||
},
|
||||
)
|
||||
@JoinColumn({ name: "deletedByUserId" })
|
||||
public deletedByUser?: User = undefined;
|
||||
|
||||
@ColumnAccessControl({
|
||||
create: [],
|
||||
read: [],
|
||||
update: [],
|
||||
})
|
||||
@TableColumn({
|
||||
type: TableColumnType.ObjectID,
|
||||
title: "Deleted by User ID",
|
||||
description:
|
||||
"User ID who deleted this object (if this object was deleted by a User)",
|
||||
})
|
||||
@Column({
|
||||
type: ColumnType.ObjectID,
|
||||
nullable: true,
|
||||
transformer: ObjectID.getDatabaseTransformer(),
|
||||
})
|
||||
public deletedByUserId?: ObjectID = undefined;
|
||||
|
||||
@ColumnAccessControl({
|
||||
create: [
|
||||
Permission.ProjectOwner,
|
||||
Permission.ProjectAdmin,
|
||||
Permission.ProjectMember,
|
||||
Permission.CreateAlertEpisodeFeed,
|
||||
],
|
||||
read: [
|
||||
Permission.ProjectOwner,
|
||||
Permission.ProjectAdmin,
|
||||
Permission.ProjectMember,
|
||||
Permission.ReadAlertEpisodeFeed,
|
||||
Permission.ReadAllProjectResources,
|
||||
],
|
||||
update: [],
|
||||
})
|
||||
@TableColumn({
|
||||
type: TableColumnType.Markdown,
|
||||
required: true,
|
||||
title: "Log (in Markdown)",
|
||||
description: "Log of the entire alert episode activity in Markdown",
|
||||
})
|
||||
@Column({
|
||||
type: ColumnType.Markdown,
|
||||
nullable: false,
|
||||
unique: false,
|
||||
})
|
||||
public feedInfoInMarkdown?: string = undefined;
|
||||
|
||||
@ColumnAccessControl({
|
||||
create: [
|
||||
Permission.ProjectOwner,
|
||||
Permission.ProjectAdmin,
|
||||
Permission.ProjectMember,
|
||||
Permission.CreateAlertEpisodeFeed,
|
||||
],
|
||||
read: [
|
||||
Permission.ProjectOwner,
|
||||
Permission.ProjectAdmin,
|
||||
Permission.ProjectMember,
|
||||
Permission.ReadAlertEpisodeFeed,
|
||||
Permission.ReadAllProjectResources,
|
||||
],
|
||||
update: [],
|
||||
})
|
||||
@TableColumn({
|
||||
type: TableColumnType.Markdown,
|
||||
required: false,
|
||||
title: "More Information (in Markdown)",
|
||||
description: "More information in Markdown",
|
||||
})
|
||||
@Column({
|
||||
type: ColumnType.Markdown,
|
||||
nullable: true,
|
||||
unique: false,
|
||||
})
|
||||
public moreInformationInMarkdown?: string = undefined;
|
||||
|
||||
@ColumnAccessControl({
|
||||
create: [
|
||||
Permission.ProjectOwner,
|
||||
Permission.ProjectAdmin,
|
||||
Permission.ProjectMember,
|
||||
Permission.CreateAlertEpisodeFeed,
|
||||
],
|
||||
read: [
|
||||
Permission.ProjectOwner,
|
||||
Permission.ProjectAdmin,
|
||||
Permission.ProjectMember,
|
||||
Permission.ReadAlertEpisodeFeed,
|
||||
Permission.ReadAllProjectResources,
|
||||
],
|
||||
update: [],
|
||||
})
|
||||
@TableColumn({
|
||||
type: TableColumnType.ShortText,
|
||||
required: true,
|
||||
title: "Alert Episode Feed Event",
|
||||
description: "Alert Episode Feed Event Type",
|
||||
})
|
||||
@Column({
|
||||
type: ColumnType.ShortText,
|
||||
nullable: false,
|
||||
unique: false,
|
||||
})
|
||||
public alertEpisodeFeedEventType?: AlertEpisodeFeedEventType = undefined;
|
||||
|
||||
@ColumnAccessControl({
|
||||
create: [
|
||||
Permission.ProjectOwner,
|
||||
Permission.ProjectAdmin,
|
||||
Permission.ProjectMember,
|
||||
Permission.CreateAlertEpisodeFeed,
|
||||
],
|
||||
read: [
|
||||
Permission.ProjectOwner,
|
||||
Permission.ProjectAdmin,
|
||||
Permission.ProjectMember,
|
||||
Permission.ReadAlertEpisodeFeed,
|
||||
Permission.ReadAllProjectResources,
|
||||
],
|
||||
update: [],
|
||||
})
|
||||
@ColorField()
|
||||
@TableColumn({
|
||||
type: TableColumnType.Color,
|
||||
required: true,
|
||||
title: "Color",
|
||||
description: "Display color for the alert episode log",
|
||||
})
|
||||
@Column({
|
||||
type: ColumnType.Color,
|
||||
length: ColumnLength.Color,
|
||||
nullable: false,
|
||||
unique: false,
|
||||
transformer: Color.getDatabaseTransformer(),
|
||||
})
|
||||
public displayColor?: Color = undefined;
|
||||
|
||||
@ColumnAccessControl({
|
||||
create: [
|
||||
Permission.ProjectOwner,
|
||||
Permission.ProjectAdmin,
|
||||
Permission.ProjectMember,
|
||||
Permission.CreateAlertEpisodeFeed,
|
||||
],
|
||||
read: [
|
||||
Permission.ProjectOwner,
|
||||
Permission.ProjectAdmin,
|
||||
Permission.ProjectMember,
|
||||
Permission.ReadAlertEpisodeFeed,
|
||||
Permission.ReadAllProjectResources,
|
||||
],
|
||||
update: [],
|
||||
})
|
||||
@TableColumn({
|
||||
manyToOneRelationColumn: "userId",
|
||||
type: TableColumnType.Entity,
|
||||
modelType: User,
|
||||
title: "User",
|
||||
description:
|
||||
"Relation to User who this feed belongs to (if this feed belongs to a User)",
|
||||
})
|
||||
@ManyToOne(
|
||||
() => {
|
||||
return User;
|
||||
},
|
||||
{
|
||||
eager: false,
|
||||
nullable: true,
|
||||
onDelete: "SET NULL",
|
||||
orphanedRowAction: "nullify",
|
||||
},
|
||||
)
|
||||
@JoinColumn({ name: "userId" })
|
||||
public user?: User = undefined;
|
||||
|
||||
@ColumnAccessControl({
|
||||
create: [
|
||||
Permission.ProjectOwner,
|
||||
Permission.ProjectAdmin,
|
||||
Permission.ProjectMember,
|
||||
Permission.CreateAlertEpisodeFeed,
|
||||
],
|
||||
read: [
|
||||
Permission.ProjectOwner,
|
||||
Permission.ProjectAdmin,
|
||||
Permission.ProjectMember,
|
||||
Permission.ReadAlertEpisodeFeed,
|
||||
Permission.ReadAllProjectResources,
|
||||
],
|
||||
update: [],
|
||||
})
|
||||
@TableColumn({
|
||||
type: TableColumnType.ObjectID,
|
||||
title: "User ID",
|
||||
description:
|
||||
"User who this feed belongs to (if this feed belongs to a User)",
|
||||
})
|
||||
@Column({
|
||||
type: ColumnType.ObjectID,
|
||||
nullable: true,
|
||||
transformer: ObjectID.getDatabaseTransformer(),
|
||||
})
|
||||
public userId?: ObjectID = undefined;
|
||||
|
||||
@ColumnAccessControl({
|
||||
create: [
|
||||
Permission.ProjectOwner,
|
||||
Permission.ProjectAdmin,
|
||||
Permission.ProjectMember,
|
||||
Permission.CreateAlertEpisodeFeed,
|
||||
],
|
||||
read: [
|
||||
Permission.ProjectOwner,
|
||||
Permission.ProjectAdmin,
|
||||
Permission.ProjectMember,
|
||||
Permission.ReadAlertEpisodeFeed,
|
||||
Permission.ReadAllProjectResources,
|
||||
],
|
||||
update: [],
|
||||
})
|
||||
@TableColumn({
|
||||
title: "Feed Posted At",
|
||||
description: "Date and time when the feed was posted",
|
||||
type: TableColumnType.Date,
|
||||
})
|
||||
@Column({
|
||||
type: ColumnType.Date,
|
||||
nullable: true,
|
||||
unique: false,
|
||||
})
|
||||
public postedAt?: Date = undefined;
|
||||
}
|
||||
466
Common/Models/DatabaseModels/AlertEpisodeInternalNote.ts
Normal file
466
Common/Models/DatabaseModels/AlertEpisodeInternalNote.ts
Normal file
@@ -0,0 +1,466 @@
|
||||
import AlertEpisode from "./AlertEpisode";
|
||||
import File from "./File";
|
||||
import Project from "./Project";
|
||||
import User from "./User";
|
||||
import BaseModel from "./DatabaseBaseModel/DatabaseBaseModel";
|
||||
import Route from "../../Types/API/Route";
|
||||
import ColumnAccessControl from "../../Types/Database/AccessControl/ColumnAccessControl";
|
||||
import TableAccessControl from "../../Types/Database/AccessControl/TableAccessControl";
|
||||
import CanAccessIfCanReadOn from "../../Types/Database/CanAccessIfCanReadOn";
|
||||
import ColumnType from "../../Types/Database/ColumnType";
|
||||
import CrudApiEndpoint from "../../Types/Database/CrudApiEndpoint";
|
||||
import EnableDocumentation from "../../Types/Database/EnableDocumentation";
|
||||
import EnableWorkflow from "../../Types/Database/EnableWorkflow";
|
||||
import TableColumn from "../../Types/Database/TableColumn";
|
||||
import TableColumnType from "../../Types/Database/TableColumnType";
|
||||
import TableMetadata from "../../Types/Database/TableMetadata";
|
||||
import TenantColumn from "../../Types/Database/TenantColumn";
|
||||
import IconProp from "../../Types/Icon/IconProp";
|
||||
import ObjectID from "../../Types/ObjectID";
|
||||
import Permission from "../../Types/Permission";
|
||||
import {
|
||||
Column,
|
||||
Entity,
|
||||
Index,
|
||||
JoinColumn,
|
||||
JoinTable,
|
||||
ManyToMany,
|
||||
ManyToOne,
|
||||
} from "typeorm";
|
||||
|
||||
@EnableDocumentation()
|
||||
@CanAccessIfCanReadOn("alertEpisode")
|
||||
@TenantColumn("projectId")
|
||||
@TableAccessControl({
|
||||
create: [
|
||||
Permission.ProjectOwner,
|
||||
Permission.ProjectAdmin,
|
||||
Permission.ProjectMember,
|
||||
Permission.CreateAlertEpisodeInternalNote,
|
||||
],
|
||||
read: [
|
||||
Permission.ProjectOwner,
|
||||
Permission.ProjectAdmin,
|
||||
Permission.ProjectMember,
|
||||
Permission.ReadAlertEpisodeInternalNote,
|
||||
Permission.ReadAllProjectResources,
|
||||
],
|
||||
delete: [
|
||||
Permission.ProjectOwner,
|
||||
Permission.ProjectAdmin,
|
||||
Permission.ProjectMember,
|
||||
Permission.DeleteAlertEpisodeInternalNote,
|
||||
],
|
||||
update: [
|
||||
Permission.ProjectOwner,
|
||||
Permission.ProjectAdmin,
|
||||
Permission.ProjectMember,
|
||||
Permission.EditAlertEpisodeInternalNote,
|
||||
],
|
||||
})
|
||||
@EnableWorkflow({
|
||||
create: true,
|
||||
delete: true,
|
||||
update: true,
|
||||
read: true,
|
||||
})
|
||||
@CrudApiEndpoint(new Route("/alert-episode-internal-note"))
|
||||
@Entity({
|
||||
name: "AlertEpisodeInternalNote",
|
||||
})
|
||||
@TableMetadata({
|
||||
tableName: "AlertEpisodeInternalNote",
|
||||
singularName: "Alert Episode Internal Note",
|
||||
pluralName: "Alert Episode Internal Notes",
|
||||
icon: IconProp.Lock,
|
||||
tableDescription: "Manage internal notes for your alert episodes",
|
||||
})
|
||||
export default class AlertEpisodeInternalNote extends BaseModel {
|
||||
@ColumnAccessControl({
|
||||
create: [
|
||||
Permission.ProjectOwner,
|
||||
Permission.ProjectAdmin,
|
||||
Permission.ProjectMember,
|
||||
Permission.CreateAlertEpisodeInternalNote,
|
||||
],
|
||||
read: [
|
||||
Permission.ProjectOwner,
|
||||
Permission.ProjectAdmin,
|
||||
Permission.ProjectMember,
|
||||
Permission.ReadAlertEpisodeInternalNote,
|
||||
Permission.ReadAllProjectResources,
|
||||
],
|
||||
update: [],
|
||||
})
|
||||
@TableColumn({
|
||||
manyToOneRelationColumn: "projectId",
|
||||
type: TableColumnType.Entity,
|
||||
modelType: Project,
|
||||
title: "Project",
|
||||
description: "Relation to Project Resource in which this object belongs",
|
||||
})
|
||||
@ManyToOne(
|
||||
() => {
|
||||
return Project;
|
||||
},
|
||||
{
|
||||
eager: false,
|
||||
nullable: true,
|
||||
onDelete: "CASCADE",
|
||||
orphanedRowAction: "nullify",
|
||||
},
|
||||
)
|
||||
@JoinColumn({ name: "projectId" })
|
||||
public project?: Project = undefined;
|
||||
|
||||
@ColumnAccessControl({
|
||||
create: [
|
||||
Permission.ProjectOwner,
|
||||
Permission.ProjectAdmin,
|
||||
Permission.ProjectMember,
|
||||
Permission.CreateAlertEpisodeInternalNote,
|
||||
],
|
||||
read: [
|
||||
Permission.ProjectOwner,
|
||||
Permission.ProjectAdmin,
|
||||
Permission.ProjectMember,
|
||||
Permission.ReadAlertEpisodeInternalNote,
|
||||
Permission.ReadAllProjectResources,
|
||||
],
|
||||
update: [],
|
||||
})
|
||||
@Index()
|
||||
@TableColumn({
|
||||
type: TableColumnType.ObjectID,
|
||||
required: true,
|
||||
canReadOnRelationQuery: true,
|
||||
title: "Project ID",
|
||||
description: "ID of your OneUptime Project in which this object belongs",
|
||||
})
|
||||
@Column({
|
||||
type: ColumnType.ObjectID,
|
||||
nullable: false,
|
||||
transformer: ObjectID.getDatabaseTransformer(),
|
||||
})
|
||||
public projectId?: ObjectID = undefined;
|
||||
|
||||
@ColumnAccessControl({
|
||||
create: [
|
||||
Permission.ProjectOwner,
|
||||
Permission.ProjectAdmin,
|
||||
Permission.ProjectMember,
|
||||
Permission.CreateAlertEpisodeInternalNote,
|
||||
],
|
||||
read: [
|
||||
Permission.ProjectOwner,
|
||||
Permission.ProjectAdmin,
|
||||
Permission.ProjectMember,
|
||||
Permission.ReadAlertEpisodeInternalNote,
|
||||
Permission.ReadAllProjectResources,
|
||||
],
|
||||
update: [],
|
||||
})
|
||||
@TableColumn({
|
||||
manyToOneRelationColumn: "alertEpisodeId",
|
||||
type: TableColumnType.Entity,
|
||||
modelType: AlertEpisode,
|
||||
title: "Alert Episode",
|
||||
description: "Relation to Alert Episode in which this resource belongs",
|
||||
})
|
||||
@ManyToOne(
|
||||
() => {
|
||||
return AlertEpisode;
|
||||
},
|
||||
{
|
||||
eager: false,
|
||||
nullable: true,
|
||||
onDelete: "CASCADE",
|
||||
orphanedRowAction: "nullify",
|
||||
},
|
||||
)
|
||||
@JoinColumn({ name: "alertEpisodeId" })
|
||||
public alertEpisode?: AlertEpisode = undefined;
|
||||
|
||||
@ColumnAccessControl({
|
||||
create: [
|
||||
Permission.ProjectOwner,
|
||||
Permission.ProjectAdmin,
|
||||
Permission.ProjectMember,
|
||||
Permission.CreateAlertEpisodeInternalNote,
|
||||
],
|
||||
read: [
|
||||
Permission.ProjectOwner,
|
||||
Permission.ProjectAdmin,
|
||||
Permission.ProjectMember,
|
||||
Permission.ReadAlertEpisodeInternalNote,
|
||||
Permission.ReadAllProjectResources,
|
||||
],
|
||||
update: [],
|
||||
})
|
||||
@Index()
|
||||
@TableColumn({
|
||||
type: TableColumnType.ObjectID,
|
||||
required: true,
|
||||
title: "Alert Episode ID",
|
||||
description: "Relation to Alert Episode ID in which this resource belongs",
|
||||
})
|
||||
@Column({
|
||||
type: ColumnType.ObjectID,
|
||||
nullable: false,
|
||||
transformer: ObjectID.getDatabaseTransformer(),
|
||||
})
|
||||
public alertEpisodeId?: ObjectID = undefined;
|
||||
|
||||
@ColumnAccessControl({
|
||||
create: [
|
||||
Permission.ProjectOwner,
|
||||
Permission.ProjectAdmin,
|
||||
Permission.ProjectMember,
|
||||
Permission.CreateAlertEpisodeInternalNote,
|
||||
],
|
||||
read: [
|
||||
Permission.ProjectOwner,
|
||||
Permission.ProjectAdmin,
|
||||
Permission.ProjectMember,
|
||||
Permission.ReadAlertEpisodeInternalNote,
|
||||
Permission.ReadAllProjectResources,
|
||||
],
|
||||
update: [],
|
||||
})
|
||||
@TableColumn({
|
||||
manyToOneRelationColumn: "createdByUserId",
|
||||
type: TableColumnType.Entity,
|
||||
modelType: User,
|
||||
title: "Created by User",
|
||||
description:
|
||||
"Relation to User who created this object (if this object was created by a User)",
|
||||
})
|
||||
@ManyToOne(
|
||||
() => {
|
||||
return User;
|
||||
},
|
||||
{
|
||||
eager: false,
|
||||
nullable: true,
|
||||
onDelete: "SET NULL",
|
||||
orphanedRowAction: "nullify",
|
||||
},
|
||||
)
|
||||
@JoinColumn({ name: "createdByUserId" })
|
||||
public createdByUser?: User = undefined;
|
||||
|
||||
@ColumnAccessControl({
|
||||
create: [
|
||||
Permission.ProjectOwner,
|
||||
Permission.ProjectAdmin,
|
||||
Permission.ProjectMember,
|
||||
Permission.CreateAlertEpisodeInternalNote,
|
||||
],
|
||||
read: [
|
||||
Permission.ProjectOwner,
|
||||
Permission.ProjectAdmin,
|
||||
Permission.ProjectMember,
|
||||
Permission.ReadAlertEpisodeInternalNote,
|
||||
Permission.ReadAllProjectResources,
|
||||
],
|
||||
update: [],
|
||||
})
|
||||
@TableColumn({
|
||||
type: TableColumnType.ObjectID,
|
||||
title: "Created by User ID",
|
||||
description:
|
||||
"User ID who created this object (if this object was created by a User)",
|
||||
})
|
||||
@Column({
|
||||
type: ColumnType.ObjectID,
|
||||
nullable: true,
|
||||
transformer: ObjectID.getDatabaseTransformer(),
|
||||
})
|
||||
public createdByUserId?: ObjectID = undefined;
|
||||
|
||||
@ColumnAccessControl({
|
||||
create: [],
|
||||
read: [],
|
||||
update: [],
|
||||
})
|
||||
@TableColumn({
|
||||
manyToOneRelationColumn: "deletedByUserId",
|
||||
type: TableColumnType.Entity,
|
||||
title: "Deleted by User",
|
||||
modelType: User,
|
||||
description:
|
||||
"Relation to User who deleted this object (if this object was deleted by a User)",
|
||||
})
|
||||
@ManyToOne(
|
||||
() => {
|
||||
return User;
|
||||
},
|
||||
{
|
||||
cascade: false,
|
||||
eager: false,
|
||||
nullable: true,
|
||||
onDelete: "SET NULL",
|
||||
orphanedRowAction: "nullify",
|
||||
},
|
||||
)
|
||||
@JoinColumn({ name: "deletedByUserId" })
|
||||
public deletedByUser?: User = undefined;
|
||||
|
||||
@ColumnAccessControl({
|
||||
create: [],
|
||||
read: [],
|
||||
update: [],
|
||||
})
|
||||
@TableColumn({
|
||||
type: TableColumnType.ObjectID,
|
||||
title: "Deleted by User ID",
|
||||
description:
|
||||
"User ID who deleted this object (if this object was deleted by a User)",
|
||||
})
|
||||
@Column({
|
||||
type: ColumnType.ObjectID,
|
||||
nullable: true,
|
||||
transformer: ObjectID.getDatabaseTransformer(),
|
||||
})
|
||||
public deletedByUserId?: ObjectID = undefined;
|
||||
|
||||
@ColumnAccessControl({
|
||||
create: [
|
||||
Permission.ProjectOwner,
|
||||
Permission.ProjectAdmin,
|
||||
Permission.ProjectMember,
|
||||
Permission.CreateAlertEpisodeInternalNote,
|
||||
],
|
||||
read: [
|
||||
Permission.ProjectOwner,
|
||||
Permission.ProjectAdmin,
|
||||
Permission.ProjectMember,
|
||||
Permission.ReadAlertEpisodeInternalNote,
|
||||
Permission.ReadAllProjectResources,
|
||||
],
|
||||
update: [
|
||||
Permission.ProjectOwner,
|
||||
Permission.ProjectAdmin,
|
||||
Permission.ProjectMember,
|
||||
Permission.EditAlertEpisodeInternalNote,
|
||||
],
|
||||
})
|
||||
@TableColumn({
|
||||
type: TableColumnType.Markdown,
|
||||
title: "Note",
|
||||
description: "Notes in markdown",
|
||||
})
|
||||
@Column({
|
||||
type: ColumnType.Markdown,
|
||||
nullable: false,
|
||||
unique: false,
|
||||
})
|
||||
public note?: string = undefined;
|
||||
|
||||
@ColumnAccessControl({
|
||||
create: [
|
||||
Permission.ProjectOwner,
|
||||
Permission.ProjectAdmin,
|
||||
Permission.ProjectMember,
|
||||
Permission.CreateAlertEpisodeInternalNote,
|
||||
],
|
||||
read: [
|
||||
Permission.ProjectOwner,
|
||||
Permission.ProjectAdmin,
|
||||
Permission.ProjectMember,
|
||||
Permission.ReadAlertEpisodeInternalNote,
|
||||
Permission.ReadAllProjectResources,
|
||||
],
|
||||
update: [
|
||||
Permission.ProjectOwner,
|
||||
Permission.ProjectAdmin,
|
||||
Permission.ProjectMember,
|
||||
Permission.EditAlertEpisodeInternalNote,
|
||||
],
|
||||
})
|
||||
@TableColumn({
|
||||
type: TableColumnType.EntityArray,
|
||||
modelType: File,
|
||||
title: "Attachments",
|
||||
description: "Files attached to this note",
|
||||
required: false,
|
||||
})
|
||||
@ManyToMany(
|
||||
() => {
|
||||
return File;
|
||||
},
|
||||
{
|
||||
eager: false,
|
||||
},
|
||||
)
|
||||
@JoinTable({
|
||||
name: "AlertEpisodeInternalNoteFile",
|
||||
joinColumn: {
|
||||
name: "alertEpisodeInternalNoteId",
|
||||
referencedColumnName: "_id",
|
||||
},
|
||||
inverseJoinColumn: {
|
||||
name: "fileId",
|
||||
referencedColumnName: "_id",
|
||||
},
|
||||
})
|
||||
public attachments?: Array<File> = undefined;
|
||||
|
||||
@ColumnAccessControl({
|
||||
create: [],
|
||||
read: [
|
||||
Permission.ProjectOwner,
|
||||
Permission.ProjectAdmin,
|
||||
Permission.ProjectMember,
|
||||
Permission.ReadAlertEpisodeInternalNote,
|
||||
Permission.ReadAllProjectResources,
|
||||
],
|
||||
update: [],
|
||||
})
|
||||
@Index()
|
||||
@TableColumn({
|
||||
type: TableColumnType.Boolean,
|
||||
required: true,
|
||||
isDefaultValueColumn: true,
|
||||
title: "Are Owners Notified",
|
||||
description: "Are owners notified of this resource ownership?",
|
||||
defaultValue: false,
|
||||
})
|
||||
@Column({
|
||||
type: ColumnType.Boolean,
|
||||
nullable: false,
|
||||
default: false,
|
||||
})
|
||||
public isOwnerNotified?: boolean = undefined;
|
||||
|
||||
@ColumnAccessControl({
|
||||
create: [
|
||||
Permission.ProjectOwner,
|
||||
Permission.ProjectAdmin,
|
||||
Permission.ProjectMember,
|
||||
Permission.CreateAlertEpisodeInternalNote,
|
||||
],
|
||||
read: [
|
||||
Permission.ProjectOwner,
|
||||
Permission.ProjectAdmin,
|
||||
Permission.ProjectMember,
|
||||
Permission.ReadAlertEpisodeInternalNote,
|
||||
Permission.ReadAllProjectResources,
|
||||
],
|
||||
update: [],
|
||||
})
|
||||
@Index()
|
||||
@TableColumn({
|
||||
type: TableColumnType.LongText,
|
||||
title: "Posted from Slack Message ID",
|
||||
description:
|
||||
"Unique identifier for the Slack message this note was created from (channel_id:message_ts). Used to prevent duplicate notes when multiple users react to the same message.",
|
||||
required: false,
|
||||
example: "C1234567890:1234567890.123456",
|
||||
})
|
||||
@Column({
|
||||
type: ColumnType.LongText,
|
||||
nullable: true,
|
||||
})
|
||||
public postedFromSlackMessageId?: string = undefined;
|
||||
}
|
||||
603
Common/Models/DatabaseModels/AlertEpisodeMember.ts
Normal file
603
Common/Models/DatabaseModels/AlertEpisodeMember.ts
Normal file
@@ -0,0 +1,603 @@
|
||||
import Alert from "./Alert";
|
||||
import AlertEpisode from "./AlertEpisode";
|
||||
import AlertGroupingRule from "./AlertGroupingRule";
|
||||
import Project from "./Project";
|
||||
import User from "./User";
|
||||
import BaseModel from "./DatabaseBaseModel/DatabaseBaseModel";
|
||||
import Route from "../../Types/API/Route";
|
||||
import ColumnAccessControl from "../../Types/Database/AccessControl/ColumnAccessControl";
|
||||
import TableAccessControl from "../../Types/Database/AccessControl/TableAccessControl";
|
||||
import ColumnLength from "../../Types/Database/ColumnLength";
|
||||
import ColumnType from "../../Types/Database/ColumnType";
|
||||
import CrudApiEndpoint from "../../Types/Database/CrudApiEndpoint";
|
||||
import EnableDocumentation from "../../Types/Database/EnableDocumentation";
|
||||
import EnableWorkflow from "../../Types/Database/EnableWorkflow";
|
||||
import TableColumn from "../../Types/Database/TableColumn";
|
||||
import TableColumnType from "../../Types/Database/TableColumnType";
|
||||
import TableMetadata from "../../Types/Database/TableMetadata";
|
||||
import TenantColumn from "../../Types/Database/TenantColumn";
|
||||
import IconProp from "../../Types/Icon/IconProp";
|
||||
import ObjectID from "../../Types/ObjectID";
|
||||
import Permission from "../../Types/Permission";
|
||||
import { Column, Entity, Index, JoinColumn, ManyToOne } from "typeorm";
|
||||
|
||||
export enum AlertEpisodeMemberAddedBy {
|
||||
Rule = "rule",
|
||||
Manual = "manual",
|
||||
API = "api",
|
||||
}
|
||||
|
||||
@EnableDocumentation()
|
||||
@TenantColumn("projectId")
|
||||
@TableAccessControl({
|
||||
create: [
|
||||
Permission.ProjectOwner,
|
||||
Permission.ProjectAdmin,
|
||||
Permission.ProjectMember,
|
||||
Permission.CreateAlertEpisodeMember,
|
||||
],
|
||||
read: [
|
||||
Permission.ProjectOwner,
|
||||
Permission.ProjectAdmin,
|
||||
Permission.ProjectMember,
|
||||
Permission.ReadAlertEpisodeMember,
|
||||
Permission.ReadAllProjectResources,
|
||||
],
|
||||
delete: [
|
||||
Permission.ProjectOwner,
|
||||
Permission.ProjectAdmin,
|
||||
Permission.ProjectMember,
|
||||
Permission.DeleteAlertEpisodeMember,
|
||||
],
|
||||
update: [
|
||||
Permission.ProjectOwner,
|
||||
Permission.ProjectAdmin,
|
||||
Permission.ProjectMember,
|
||||
Permission.EditAlertEpisodeMember,
|
||||
],
|
||||
})
|
||||
@EnableWorkflow({
|
||||
create: true,
|
||||
delete: true,
|
||||
update: true,
|
||||
read: true,
|
||||
})
|
||||
@CrudApiEndpoint(new Route("/alert-episode-member"))
|
||||
@TableMetadata({
|
||||
tableName: "AlertEpisodeMember",
|
||||
singularName: "Alert Episode Member",
|
||||
pluralName: "Alert Episode Members",
|
||||
icon: IconProp.Layers,
|
||||
tableDescription: "Link between alerts and episodes",
|
||||
})
|
||||
@Entity({
|
||||
name: "AlertEpisodeMember",
|
||||
})
|
||||
@Index(["alertEpisodeId", "alertId", "projectId"])
|
||||
export default class AlertEpisodeMember extends BaseModel {
|
||||
@ColumnAccessControl({
|
||||
create: [
|
||||
Permission.ProjectOwner,
|
||||
Permission.ProjectAdmin,
|
||||
Permission.ProjectMember,
|
||||
Permission.CreateAlertEpisodeMember,
|
||||
],
|
||||
read: [
|
||||
Permission.ProjectOwner,
|
||||
Permission.ProjectAdmin,
|
||||
Permission.ProjectMember,
|
||||
Permission.ReadAlertEpisodeMember,
|
||||
Permission.ReadAllProjectResources,
|
||||
],
|
||||
update: [],
|
||||
})
|
||||
@TableColumn({
|
||||
manyToOneRelationColumn: "projectId",
|
||||
type: TableColumnType.Entity,
|
||||
modelType: Project,
|
||||
title: "Project",
|
||||
description: "Relation to Project Resource in which this object belongs",
|
||||
})
|
||||
@ManyToOne(
|
||||
() => {
|
||||
return Project;
|
||||
},
|
||||
{
|
||||
eager: false,
|
||||
nullable: false,
|
||||
onDelete: "CASCADE",
|
||||
orphanedRowAction: "nullify",
|
||||
},
|
||||
)
|
||||
@JoinColumn({ name: "projectId" })
|
||||
public project?: Project = undefined;
|
||||
|
||||
@ColumnAccessControl({
|
||||
create: [
|
||||
Permission.ProjectOwner,
|
||||
Permission.ProjectAdmin,
|
||||
Permission.ProjectMember,
|
||||
Permission.CreateAlertEpisodeMember,
|
||||
],
|
||||
read: [
|
||||
Permission.ProjectOwner,
|
||||
Permission.ProjectAdmin,
|
||||
Permission.ProjectMember,
|
||||
Permission.ReadAlertEpisodeMember,
|
||||
Permission.ReadAllProjectResources,
|
||||
],
|
||||
update: [],
|
||||
})
|
||||
@Index()
|
||||
@TableColumn({
|
||||
type: TableColumnType.ObjectID,
|
||||
required: true,
|
||||
canReadOnRelationQuery: true,
|
||||
title: "Project ID",
|
||||
description: "ID of your OneUptime Project in which this object belongs",
|
||||
})
|
||||
@Column({
|
||||
type: ColumnType.ObjectID,
|
||||
nullable: false,
|
||||
transformer: ObjectID.getDatabaseTransformer(),
|
||||
})
|
||||
public projectId?: ObjectID = undefined;
|
||||
|
||||
@ColumnAccessControl({
|
||||
create: [
|
||||
Permission.ProjectOwner,
|
||||
Permission.ProjectAdmin,
|
||||
Permission.ProjectMember,
|
||||
Permission.CreateAlertEpisodeMember,
|
||||
],
|
||||
read: [
|
||||
Permission.ProjectOwner,
|
||||
Permission.ProjectAdmin,
|
||||
Permission.ProjectMember,
|
||||
Permission.ReadAlertEpisodeMember,
|
||||
Permission.ReadAllProjectResources,
|
||||
],
|
||||
update: [],
|
||||
})
|
||||
@TableColumn({
|
||||
manyToOneRelationColumn: "alertEpisodeId",
|
||||
type: TableColumnType.Entity,
|
||||
modelType: AlertEpisode,
|
||||
title: "Alert Episode",
|
||||
description: "Relation to Alert Episode that this alert belongs to",
|
||||
})
|
||||
@ManyToOne(
|
||||
() => {
|
||||
return AlertEpisode;
|
||||
},
|
||||
{
|
||||
eager: false,
|
||||
nullable: false,
|
||||
onDelete: "CASCADE",
|
||||
orphanedRowAction: "nullify",
|
||||
},
|
||||
)
|
||||
@JoinColumn({ name: "alertEpisodeId" })
|
||||
public alertEpisode?: AlertEpisode = undefined;
|
||||
|
||||
@ColumnAccessControl({
|
||||
create: [
|
||||
Permission.ProjectOwner,
|
||||
Permission.ProjectAdmin,
|
||||
Permission.ProjectMember,
|
||||
Permission.CreateAlertEpisodeMember,
|
||||
],
|
||||
read: [
|
||||
Permission.ProjectOwner,
|
||||
Permission.ProjectAdmin,
|
||||
Permission.ProjectMember,
|
||||
Permission.ReadAlertEpisodeMember,
|
||||
Permission.ReadAllProjectResources,
|
||||
],
|
||||
update: [],
|
||||
})
|
||||
@Index()
|
||||
@TableColumn({
|
||||
type: TableColumnType.ObjectID,
|
||||
required: true,
|
||||
canReadOnRelationQuery: true,
|
||||
title: "Alert Episode ID",
|
||||
description: "ID of the Alert Episode that this alert belongs to",
|
||||
})
|
||||
@Column({
|
||||
type: ColumnType.ObjectID,
|
||||
nullable: false,
|
||||
transformer: ObjectID.getDatabaseTransformer(),
|
||||
})
|
||||
public alertEpisodeId?: ObjectID = undefined;
|
||||
|
||||
@ColumnAccessControl({
|
||||
create: [
|
||||
Permission.ProjectOwner,
|
||||
Permission.ProjectAdmin,
|
||||
Permission.ProjectMember,
|
||||
Permission.CreateAlertEpisodeMember,
|
||||
],
|
||||
read: [
|
||||
Permission.ProjectOwner,
|
||||
Permission.ProjectAdmin,
|
||||
Permission.ProjectMember,
|
||||
Permission.ReadAlertEpisodeMember,
|
||||
Permission.ReadAllProjectResources,
|
||||
],
|
||||
update: [],
|
||||
})
|
||||
@TableColumn({
|
||||
manyToOneRelationColumn: "alertId",
|
||||
type: TableColumnType.Entity,
|
||||
modelType: Alert,
|
||||
title: "Alert",
|
||||
description: "Relation to Alert that is a member of this episode",
|
||||
})
|
||||
@ManyToOne(
|
||||
() => {
|
||||
return Alert;
|
||||
},
|
||||
{
|
||||
eager: false,
|
||||
nullable: false,
|
||||
onDelete: "CASCADE",
|
||||
orphanedRowAction: "nullify",
|
||||
},
|
||||
)
|
||||
@JoinColumn({ name: "alertId" })
|
||||
public alert?: Alert = undefined;
|
||||
|
||||
@ColumnAccessControl({
|
||||
create: [
|
||||
Permission.ProjectOwner,
|
||||
Permission.ProjectAdmin,
|
||||
Permission.ProjectMember,
|
||||
Permission.CreateAlertEpisodeMember,
|
||||
],
|
||||
read: [
|
||||
Permission.ProjectOwner,
|
||||
Permission.ProjectAdmin,
|
||||
Permission.ProjectMember,
|
||||
Permission.ReadAlertEpisodeMember,
|
||||
Permission.ReadAllProjectResources,
|
||||
],
|
||||
update: [],
|
||||
})
|
||||
@Index()
|
||||
@TableColumn({
|
||||
type: TableColumnType.ObjectID,
|
||||
required: true,
|
||||
canReadOnRelationQuery: true,
|
||||
title: "Alert ID",
|
||||
description: "ID of the Alert that is a member of this episode",
|
||||
})
|
||||
@Column({
|
||||
type: ColumnType.ObjectID,
|
||||
nullable: false,
|
||||
transformer: ObjectID.getDatabaseTransformer(),
|
||||
})
|
||||
public alertId?: ObjectID = undefined;
|
||||
|
||||
@ColumnAccessControl({
|
||||
create: [
|
||||
Permission.ProjectOwner,
|
||||
Permission.ProjectAdmin,
|
||||
Permission.ProjectMember,
|
||||
Permission.CreateAlertEpisodeMember,
|
||||
],
|
||||
read: [
|
||||
Permission.ProjectOwner,
|
||||
Permission.ProjectAdmin,
|
||||
Permission.ProjectMember,
|
||||
Permission.ReadAlertEpisodeMember,
|
||||
Permission.ReadAllProjectResources,
|
||||
],
|
||||
update: [],
|
||||
})
|
||||
@Index()
|
||||
@TableColumn({
|
||||
type: TableColumnType.Date,
|
||||
title: "Added At",
|
||||
description: "When this alert was added to the episode",
|
||||
})
|
||||
@Column({
|
||||
type: ColumnType.Date,
|
||||
nullable: true,
|
||||
unique: false,
|
||||
})
|
||||
public addedAt?: Date = undefined;
|
||||
|
||||
@ColumnAccessControl({
|
||||
create: [
|
||||
Permission.ProjectOwner,
|
||||
Permission.ProjectAdmin,
|
||||
Permission.ProjectMember,
|
||||
Permission.CreateAlertEpisodeMember,
|
||||
],
|
||||
read: [
|
||||
Permission.ProjectOwner,
|
||||
Permission.ProjectAdmin,
|
||||
Permission.ProjectMember,
|
||||
Permission.ReadAlertEpisodeMember,
|
||||
Permission.ReadAllProjectResources,
|
||||
],
|
||||
update: [],
|
||||
})
|
||||
@TableColumn({
|
||||
type: TableColumnType.ShortText,
|
||||
required: true,
|
||||
isDefaultValueColumn: true,
|
||||
title: "Added By",
|
||||
description:
|
||||
"How this alert was added to the episode (rule, manual, or api)",
|
||||
defaultValue: AlertEpisodeMemberAddedBy.Rule,
|
||||
})
|
||||
@Column({
|
||||
type: ColumnType.ShortText,
|
||||
nullable: false,
|
||||
default: AlertEpisodeMemberAddedBy.Rule,
|
||||
length: ColumnLength.ShortText,
|
||||
})
|
||||
public addedBy?: AlertEpisodeMemberAddedBy = undefined;
|
||||
|
||||
@ColumnAccessControl({
|
||||
create: [
|
||||
Permission.ProjectOwner,
|
||||
Permission.ProjectAdmin,
|
||||
Permission.ProjectMember,
|
||||
Permission.CreateAlertEpisodeMember,
|
||||
],
|
||||
read: [
|
||||
Permission.ProjectOwner,
|
||||
Permission.ProjectAdmin,
|
||||
Permission.ProjectMember,
|
||||
Permission.ReadAlertEpisodeMember,
|
||||
Permission.ReadAllProjectResources,
|
||||
],
|
||||
update: [],
|
||||
})
|
||||
@TableColumn({
|
||||
manyToOneRelationColumn: "addedByUserId",
|
||||
type: TableColumnType.Entity,
|
||||
modelType: User,
|
||||
title: "Added By User",
|
||||
description:
|
||||
"User who manually added this alert to the episode (if applicable)",
|
||||
})
|
||||
@ManyToOne(
|
||||
() => {
|
||||
return User;
|
||||
},
|
||||
{
|
||||
eager: false,
|
||||
nullable: true,
|
||||
onDelete: "SET NULL",
|
||||
orphanedRowAction: "nullify",
|
||||
},
|
||||
)
|
||||
@JoinColumn({ name: "addedByUserId" })
|
||||
public addedByUser?: User = undefined;
|
||||
|
||||
@ColumnAccessControl({
|
||||
create: [
|
||||
Permission.ProjectOwner,
|
||||
Permission.ProjectAdmin,
|
||||
Permission.ProjectMember,
|
||||
Permission.CreateAlertEpisodeMember,
|
||||
],
|
||||
read: [
|
||||
Permission.ProjectOwner,
|
||||
Permission.ProjectAdmin,
|
||||
Permission.ProjectMember,
|
||||
Permission.ReadAlertEpisodeMember,
|
||||
Permission.ReadAllProjectResources,
|
||||
],
|
||||
update: [],
|
||||
})
|
||||
@Index()
|
||||
@TableColumn({
|
||||
type: TableColumnType.ObjectID,
|
||||
required: false,
|
||||
title: "Added By User ID",
|
||||
description: "User ID who manually added this alert to the episode",
|
||||
})
|
||||
@Column({
|
||||
type: ColumnType.ObjectID,
|
||||
nullable: true,
|
||||
transformer: ObjectID.getDatabaseTransformer(),
|
||||
})
|
||||
public addedByUserId?: ObjectID = undefined;
|
||||
|
||||
@ColumnAccessControl({
|
||||
create: [
|
||||
Permission.ProjectOwner,
|
||||
Permission.ProjectAdmin,
|
||||
Permission.ProjectMember,
|
||||
Permission.CreateAlertEpisodeMember,
|
||||
],
|
||||
read: [
|
||||
Permission.ProjectOwner,
|
||||
Permission.ProjectAdmin,
|
||||
Permission.ProjectMember,
|
||||
Permission.ReadAlertEpisodeMember,
|
||||
Permission.ReadAllProjectResources,
|
||||
],
|
||||
update: [],
|
||||
})
|
||||
@TableColumn({
|
||||
manyToOneRelationColumn: "matchedRuleId",
|
||||
type: TableColumnType.Entity,
|
||||
modelType: AlertGroupingRule,
|
||||
title: "Matched Rule",
|
||||
description: "The grouping rule that matched this alert (if applicable)",
|
||||
})
|
||||
@ManyToOne(
|
||||
() => {
|
||||
return AlertGroupingRule;
|
||||
},
|
||||
{
|
||||
eager: false,
|
||||
nullable: true,
|
||||
onDelete: "SET NULL",
|
||||
orphanedRowAction: "nullify",
|
||||
},
|
||||
)
|
||||
@JoinColumn({ name: "matchedRuleId" })
|
||||
public matchedRule?: AlertGroupingRule = undefined;
|
||||
|
||||
@ColumnAccessControl({
|
||||
create: [
|
||||
Permission.ProjectOwner,
|
||||
Permission.ProjectAdmin,
|
||||
Permission.ProjectMember,
|
||||
Permission.CreateAlertEpisodeMember,
|
||||
],
|
||||
read: [
|
||||
Permission.ProjectOwner,
|
||||
Permission.ProjectAdmin,
|
||||
Permission.ProjectMember,
|
||||
Permission.ReadAlertEpisodeMember,
|
||||
Permission.ReadAllProjectResources,
|
||||
],
|
||||
update: [],
|
||||
})
|
||||
@Index()
|
||||
@TableColumn({
|
||||
type: TableColumnType.ObjectID,
|
||||
required: false,
|
||||
title: "Matched Rule ID",
|
||||
description: "ID of the grouping rule that matched this alert",
|
||||
})
|
||||
@Column({
|
||||
type: ColumnType.ObjectID,
|
||||
nullable: true,
|
||||
transformer: ObjectID.getDatabaseTransformer(),
|
||||
})
|
||||
public matchedRuleId?: ObjectID = undefined;
|
||||
|
||||
@ColumnAccessControl({
|
||||
create: [
|
||||
Permission.ProjectOwner,
|
||||
Permission.ProjectAdmin,
|
||||
Permission.ProjectMember,
|
||||
Permission.CreateAlertEpisodeMember,
|
||||
],
|
||||
read: [
|
||||
Permission.ProjectOwner,
|
||||
Permission.ProjectAdmin,
|
||||
Permission.ProjectMember,
|
||||
Permission.ReadAlertEpisodeMember,
|
||||
Permission.ReadAllProjectResources,
|
||||
],
|
||||
update: [],
|
||||
})
|
||||
@TableColumn({
|
||||
manyToOneRelationColumn: "createdByUserId",
|
||||
type: TableColumnType.Entity,
|
||||
modelType: User,
|
||||
title: "Created by User",
|
||||
description:
|
||||
"Relation to User who created this object (if this object was created by a User)",
|
||||
})
|
||||
@ManyToOne(
|
||||
() => {
|
||||
return User;
|
||||
},
|
||||
{
|
||||
eager: false,
|
||||
nullable: true,
|
||||
onDelete: "SET NULL",
|
||||
orphanedRowAction: "nullify",
|
||||
},
|
||||
)
|
||||
@JoinColumn({ name: "createdByUserId" })
|
||||
public createdByUser?: User = undefined;
|
||||
|
||||
@ColumnAccessControl({
|
||||
create: [
|
||||
Permission.ProjectOwner,
|
||||
Permission.ProjectAdmin,
|
||||
Permission.ProjectMember,
|
||||
Permission.CreateAlertEpisodeMember,
|
||||
],
|
||||
read: [
|
||||
Permission.ProjectOwner,
|
||||
Permission.ProjectAdmin,
|
||||
Permission.ProjectMember,
|
||||
Permission.ReadAlertEpisodeMember,
|
||||
Permission.ReadAllProjectResources,
|
||||
],
|
||||
update: [],
|
||||
})
|
||||
@TableColumn({
|
||||
type: TableColumnType.ObjectID,
|
||||
title: "Created by User ID",
|
||||
description:
|
||||
"User ID who created this object (if this object was created by a User)",
|
||||
})
|
||||
@Column({
|
||||
type: ColumnType.ObjectID,
|
||||
nullable: true,
|
||||
transformer: ObjectID.getDatabaseTransformer(),
|
||||
})
|
||||
public createdByUserId?: ObjectID = undefined;
|
||||
|
||||
@ColumnAccessControl({
|
||||
create: [],
|
||||
read: [
|
||||
Permission.ProjectOwner,
|
||||
Permission.ProjectAdmin,
|
||||
Permission.ProjectMember,
|
||||
Permission.ReadAlertEpisodeMember,
|
||||
Permission.ReadAllProjectResources,
|
||||
],
|
||||
update: [],
|
||||
})
|
||||
@TableColumn({
|
||||
manyToOneRelationColumn: "deletedByUserId",
|
||||
type: TableColumnType.Entity,
|
||||
title: "Deleted by User",
|
||||
modelType: User,
|
||||
description:
|
||||
"Relation to User who deleted this object (if this object was deleted by a User)",
|
||||
})
|
||||
@ManyToOne(
|
||||
() => {
|
||||
return User;
|
||||
},
|
||||
{
|
||||
cascade: false,
|
||||
eager: false,
|
||||
nullable: true,
|
||||
onDelete: "SET NULL",
|
||||
orphanedRowAction: "nullify",
|
||||
},
|
||||
)
|
||||
@JoinColumn({ name: "deletedByUserId" })
|
||||
public deletedByUser?: User = undefined;
|
||||
|
||||
@ColumnAccessControl({
|
||||
create: [],
|
||||
read: [
|
||||
Permission.ProjectOwner,
|
||||
Permission.ProjectAdmin,
|
||||
Permission.ProjectMember,
|
||||
Permission.ReadAlertEpisodeMember,
|
||||
Permission.ReadAllProjectResources,
|
||||
],
|
||||
update: [],
|
||||
})
|
||||
@TableColumn({
|
||||
type: TableColumnType.ObjectID,
|
||||
title: "Deleted by User ID",
|
||||
description:
|
||||
"User ID who deleted this object (if this object was deleted by a User)",
|
||||
})
|
||||
@Column({
|
||||
type: ColumnType.ObjectID,
|
||||
nullable: true,
|
||||
transformer: ObjectID.getDatabaseTransformer(),
|
||||
})
|
||||
public deletedByUserId?: ObjectID = undefined;
|
||||
}
|
||||
433
Common/Models/DatabaseModels/AlertEpisodeOwnerTeam.ts
Normal file
433
Common/Models/DatabaseModels/AlertEpisodeOwnerTeam.ts
Normal file
@@ -0,0 +1,433 @@
|
||||
import AlertEpisode from "./AlertEpisode";
|
||||
import Project from "./Project";
|
||||
import Team from "./Team";
|
||||
import User from "./User";
|
||||
import BaseModel from "./DatabaseBaseModel/DatabaseBaseModel";
|
||||
import Route from "../../Types/API/Route";
|
||||
import ColumnAccessControl from "../../Types/Database/AccessControl/ColumnAccessControl";
|
||||
import TableAccessControl from "../../Types/Database/AccessControl/TableAccessControl";
|
||||
import ColumnType from "../../Types/Database/ColumnType";
|
||||
import CrudApiEndpoint from "../../Types/Database/CrudApiEndpoint";
|
||||
import EnableDocumentation from "../../Types/Database/EnableDocumentation";
|
||||
import EnableWorkflow from "../../Types/Database/EnableWorkflow";
|
||||
import TableColumn from "../../Types/Database/TableColumn";
|
||||
import TableColumnType from "../../Types/Database/TableColumnType";
|
||||
import TableMetadata from "../../Types/Database/TableMetadata";
|
||||
import TenantColumn from "../../Types/Database/TenantColumn";
|
||||
import IconProp from "../../Types/Icon/IconProp";
|
||||
import ObjectID from "../../Types/ObjectID";
|
||||
import Permission from "../../Types/Permission";
|
||||
import { Column, Entity, Index, JoinColumn, ManyToOne } from "typeorm";
|
||||
|
||||
@EnableDocumentation()
|
||||
@TenantColumn("projectId")
|
||||
@TableAccessControl({
|
||||
create: [
|
||||
Permission.ProjectOwner,
|
||||
Permission.ProjectAdmin,
|
||||
Permission.ProjectMember,
|
||||
Permission.CreateAlertEpisodeOwnerTeam,
|
||||
],
|
||||
read: [
|
||||
Permission.ProjectOwner,
|
||||
Permission.ProjectAdmin,
|
||||
Permission.ProjectMember,
|
||||
Permission.ReadAlertEpisodeOwnerTeam,
|
||||
Permission.ReadAllProjectResources,
|
||||
],
|
||||
delete: [
|
||||
Permission.ProjectOwner,
|
||||
Permission.ProjectAdmin,
|
||||
Permission.ProjectMember,
|
||||
Permission.DeleteAlertEpisodeOwnerTeam,
|
||||
],
|
||||
update: [
|
||||
Permission.ProjectOwner,
|
||||
Permission.ProjectAdmin,
|
||||
Permission.ProjectMember,
|
||||
Permission.EditAlertEpisodeOwnerTeam,
|
||||
],
|
||||
})
|
||||
@EnableWorkflow({
|
||||
create: true,
|
||||
delete: true,
|
||||
update: true,
|
||||
read: true,
|
||||
})
|
||||
@CrudApiEndpoint(new Route("/alert-episode-owner-team"))
|
||||
@TableMetadata({
|
||||
tableName: "AlertEpisodeOwnerTeam",
|
||||
singularName: "Alert Episode Team Owner",
|
||||
pluralName: "Alert Episode Team Owners",
|
||||
icon: IconProp.Team,
|
||||
tableDescription: "Add teams as owners to your alert episodes.",
|
||||
})
|
||||
@Entity({
|
||||
name: "AlertEpisodeOwnerTeam",
|
||||
})
|
||||
@Index(["alertEpisodeId", "teamId", "projectId"])
|
||||
export default class AlertEpisodeOwnerTeam extends BaseModel {
|
||||
@ColumnAccessControl({
|
||||
create: [
|
||||
Permission.ProjectOwner,
|
||||
Permission.ProjectAdmin,
|
||||
Permission.ProjectMember,
|
||||
Permission.CreateAlertEpisodeOwnerTeam,
|
||||
],
|
||||
read: [
|
||||
Permission.ProjectOwner,
|
||||
Permission.ProjectAdmin,
|
||||
Permission.ProjectMember,
|
||||
Permission.ReadAlertEpisodeOwnerTeam,
|
||||
Permission.ReadAllProjectResources,
|
||||
],
|
||||
update: [],
|
||||
})
|
||||
@TableColumn({
|
||||
manyToOneRelationColumn: "projectId",
|
||||
type: TableColumnType.Entity,
|
||||
modelType: Project,
|
||||
title: "Project",
|
||||
description: "Relation to Project Resource in which this object belongs",
|
||||
})
|
||||
@ManyToOne(
|
||||
() => {
|
||||
return Project;
|
||||
},
|
||||
{
|
||||
eager: false,
|
||||
nullable: false,
|
||||
onDelete: "CASCADE",
|
||||
orphanedRowAction: "nullify",
|
||||
},
|
||||
)
|
||||
@JoinColumn({ name: "projectId" })
|
||||
public project?: Project = undefined;
|
||||
|
||||
@ColumnAccessControl({
|
||||
create: [
|
||||
Permission.ProjectOwner,
|
||||
Permission.ProjectAdmin,
|
||||
Permission.ProjectMember,
|
||||
Permission.CreateAlertEpisodeOwnerTeam,
|
||||
],
|
||||
read: [
|
||||
Permission.ProjectOwner,
|
||||
Permission.ProjectAdmin,
|
||||
Permission.ProjectMember,
|
||||
Permission.ReadAlertEpisodeOwnerTeam,
|
||||
Permission.ReadAllProjectResources,
|
||||
],
|
||||
update: [],
|
||||
})
|
||||
@Index()
|
||||
@TableColumn({
|
||||
type: TableColumnType.ObjectID,
|
||||
required: true,
|
||||
canReadOnRelationQuery: true,
|
||||
title: "Project ID",
|
||||
description: "ID of your OneUptime Project in which this object belongs",
|
||||
})
|
||||
@Column({
|
||||
type: ColumnType.ObjectID,
|
||||
nullable: false,
|
||||
transformer: ObjectID.getDatabaseTransformer(),
|
||||
})
|
||||
public projectId?: ObjectID = undefined;
|
||||
|
||||
@ColumnAccessControl({
|
||||
create: [
|
||||
Permission.ProjectOwner,
|
||||
Permission.ProjectAdmin,
|
||||
Permission.ProjectMember,
|
||||
Permission.CreateAlertEpisodeOwnerTeam,
|
||||
],
|
||||
read: [
|
||||
Permission.ProjectOwner,
|
||||
Permission.ProjectAdmin,
|
||||
Permission.ProjectMember,
|
||||
Permission.ReadAlertEpisodeOwnerTeam,
|
||||
Permission.ReadAllProjectResources,
|
||||
],
|
||||
update: [],
|
||||
})
|
||||
@TableColumn({
|
||||
manyToOneRelationColumn: "teamId",
|
||||
type: TableColumnType.Entity,
|
||||
modelType: Team,
|
||||
title: "Team",
|
||||
description:
|
||||
"Team that is the owner. All users in this team will receive notifications.",
|
||||
})
|
||||
@ManyToOne(
|
||||
() => {
|
||||
return Team;
|
||||
},
|
||||
{
|
||||
eager: false,
|
||||
nullable: true,
|
||||
onDelete: "CASCADE",
|
||||
orphanedRowAction: "nullify",
|
||||
},
|
||||
)
|
||||
@JoinColumn({ name: "teamId" })
|
||||
public team?: Team = undefined;
|
||||
|
||||
@ColumnAccessControl({
|
||||
create: [
|
||||
Permission.ProjectOwner,
|
||||
Permission.ProjectAdmin,
|
||||
Permission.ProjectMember,
|
||||
Permission.CreateAlertEpisodeOwnerTeam,
|
||||
],
|
||||
read: [
|
||||
Permission.ProjectOwner,
|
||||
Permission.ProjectAdmin,
|
||||
Permission.ProjectMember,
|
||||
Permission.ReadAlertEpisodeOwnerTeam,
|
||||
Permission.ReadAllProjectResources,
|
||||
],
|
||||
update: [],
|
||||
})
|
||||
@Index()
|
||||
@TableColumn({
|
||||
type: TableColumnType.ObjectID,
|
||||
required: true,
|
||||
canReadOnRelationQuery: true,
|
||||
title: "Team ID",
|
||||
description: "ID of your OneUptime Team in which this object belongs",
|
||||
})
|
||||
@Column({
|
||||
type: ColumnType.ObjectID,
|
||||
nullable: false,
|
||||
transformer: ObjectID.getDatabaseTransformer(),
|
||||
})
|
||||
public teamId?: ObjectID = undefined;
|
||||
|
||||
@ColumnAccessControl({
|
||||
create: [
|
||||
Permission.ProjectOwner,
|
||||
Permission.ProjectAdmin,
|
||||
Permission.ProjectMember,
|
||||
Permission.CreateAlertEpisodeOwnerTeam,
|
||||
],
|
||||
read: [
|
||||
Permission.ProjectOwner,
|
||||
Permission.ProjectAdmin,
|
||||
Permission.ProjectMember,
|
||||
Permission.ReadAlertEpisodeOwnerTeam,
|
||||
Permission.ReadAllProjectResources,
|
||||
],
|
||||
update: [],
|
||||
})
|
||||
@TableColumn({
|
||||
manyToOneRelationColumn: "alertEpisodeId",
|
||||
type: TableColumnType.Entity,
|
||||
modelType: AlertEpisode,
|
||||
title: "Alert Episode",
|
||||
description:
|
||||
"Relation to Alert Episode Resource in which this object belongs",
|
||||
})
|
||||
@ManyToOne(
|
||||
() => {
|
||||
return AlertEpisode;
|
||||
},
|
||||
{
|
||||
eager: false,
|
||||
nullable: true,
|
||||
onDelete: "CASCADE",
|
||||
orphanedRowAction: "nullify",
|
||||
},
|
||||
)
|
||||
@JoinColumn({ name: "alertEpisodeId" })
|
||||
public alertEpisode?: AlertEpisode = undefined;
|
||||
|
||||
@ColumnAccessControl({
|
||||
create: [
|
||||
Permission.ProjectOwner,
|
||||
Permission.ProjectAdmin,
|
||||
Permission.ProjectMember,
|
||||
Permission.CreateAlertEpisodeOwnerTeam,
|
||||
],
|
||||
read: [
|
||||
Permission.ProjectOwner,
|
||||
Permission.ProjectAdmin,
|
||||
Permission.ProjectMember,
|
||||
Permission.ReadAlertEpisodeOwnerTeam,
|
||||
Permission.ReadAllProjectResources,
|
||||
],
|
||||
update: [],
|
||||
})
|
||||
@Index()
|
||||
@TableColumn({
|
||||
type: TableColumnType.ObjectID,
|
||||
required: true,
|
||||
canReadOnRelationQuery: true,
|
||||
title: "Alert Episode ID",
|
||||
description:
|
||||
"ID of your OneUptime Alert Episode in which this object belongs",
|
||||
})
|
||||
@Column({
|
||||
type: ColumnType.ObjectID,
|
||||
nullable: false,
|
||||
transformer: ObjectID.getDatabaseTransformer(),
|
||||
})
|
||||
public alertEpisodeId?: ObjectID = undefined;
|
||||
|
||||
@ColumnAccessControl({
|
||||
create: [
|
||||
Permission.ProjectOwner,
|
||||
Permission.ProjectAdmin,
|
||||
Permission.ProjectMember,
|
||||
Permission.CreateAlertEpisodeOwnerTeam,
|
||||
],
|
||||
read: [
|
||||
Permission.ProjectOwner,
|
||||
Permission.ProjectAdmin,
|
||||
Permission.ProjectMember,
|
||||
Permission.ReadAlertEpisodeOwnerTeam,
|
||||
Permission.ReadAllProjectResources,
|
||||
],
|
||||
update: [],
|
||||
})
|
||||
@TableColumn({
|
||||
manyToOneRelationColumn: "createdByUserId",
|
||||
type: TableColumnType.Entity,
|
||||
modelType: User,
|
||||
title: "Created by User",
|
||||
description:
|
||||
"Relation to User who created this object (if this object was created by a User)",
|
||||
})
|
||||
@ManyToOne(
|
||||
() => {
|
||||
return User;
|
||||
},
|
||||
{
|
||||
eager: false,
|
||||
nullable: true,
|
||||
onDelete: "SET NULL",
|
||||
orphanedRowAction: "nullify",
|
||||
},
|
||||
)
|
||||
@JoinColumn({ name: "createdByUserId" })
|
||||
public createdByUser?: User = undefined;
|
||||
|
||||
@ColumnAccessControl({
|
||||
create: [
|
||||
Permission.ProjectOwner,
|
||||
Permission.ProjectAdmin,
|
||||
Permission.ProjectMember,
|
||||
Permission.CreateAlertEpisodeOwnerTeam,
|
||||
],
|
||||
read: [
|
||||
Permission.ProjectOwner,
|
||||
Permission.ProjectAdmin,
|
||||
Permission.ProjectMember,
|
||||
Permission.ReadAlertEpisodeOwnerTeam,
|
||||
Permission.ReadAllProjectResources,
|
||||
],
|
||||
update: [],
|
||||
})
|
||||
@TableColumn({
|
||||
type: TableColumnType.ObjectID,
|
||||
title: "Created by User ID",
|
||||
description:
|
||||
"User ID who created this object (if this object was created by a User)",
|
||||
})
|
||||
@Column({
|
||||
type: ColumnType.ObjectID,
|
||||
nullable: true,
|
||||
transformer: ObjectID.getDatabaseTransformer(),
|
||||
})
|
||||
public createdByUserId?: ObjectID = undefined;
|
||||
|
||||
@ColumnAccessControl({
|
||||
create: [],
|
||||
read: [
|
||||
Permission.ProjectOwner,
|
||||
Permission.ProjectAdmin,
|
||||
Permission.ProjectMember,
|
||||
Permission.ReadAlertEpisodeOwnerTeam,
|
||||
Permission.ReadAllProjectResources,
|
||||
],
|
||||
update: [],
|
||||
})
|
||||
@TableColumn({
|
||||
manyToOneRelationColumn: "deletedByUserId",
|
||||
type: TableColumnType.Entity,
|
||||
title: "Deleted by User",
|
||||
modelType: User,
|
||||
description:
|
||||
"Relation to User who deleted this object (if this object was deleted by a User)",
|
||||
})
|
||||
@ManyToOne(
|
||||
() => {
|
||||
return User;
|
||||
},
|
||||
{
|
||||
cascade: false,
|
||||
eager: false,
|
||||
nullable: true,
|
||||
onDelete: "SET NULL",
|
||||
orphanedRowAction: "nullify",
|
||||
},
|
||||
)
|
||||
@JoinColumn({ name: "deletedByUserId" })
|
||||
public deletedByUser?: User = undefined;
|
||||
|
||||
@ColumnAccessControl({
|
||||
create: [],
|
||||
read: [
|
||||
Permission.ProjectOwner,
|
||||
Permission.ProjectAdmin,
|
||||
Permission.ProjectMember,
|
||||
Permission.ReadAlertEpisodeOwnerTeam,
|
||||
Permission.ReadAllProjectResources,
|
||||
],
|
||||
update: [],
|
||||
})
|
||||
@TableColumn({
|
||||
type: TableColumnType.ObjectID,
|
||||
title: "Deleted by User ID",
|
||||
description:
|
||||
"User ID who deleted this object (if this object was deleted by a User)",
|
||||
})
|
||||
@Column({
|
||||
type: ColumnType.ObjectID,
|
||||
nullable: true,
|
||||
transformer: ObjectID.getDatabaseTransformer(),
|
||||
})
|
||||
public deletedByUserId?: ObjectID = undefined;
|
||||
|
||||
@ColumnAccessControl({
|
||||
create: [
|
||||
Permission.ProjectOwner,
|
||||
Permission.ProjectAdmin,
|
||||
Permission.ProjectMember,
|
||||
Permission.CreateAlertEpisodeOwnerTeam,
|
||||
],
|
||||
read: [
|
||||
Permission.ProjectOwner,
|
||||
Permission.ProjectAdmin,
|
||||
Permission.ProjectMember,
|
||||
Permission.ReadAlertEpisodeOwnerTeam,
|
||||
Permission.ReadAllProjectResources,
|
||||
],
|
||||
update: [],
|
||||
})
|
||||
@Index()
|
||||
@TableColumn({
|
||||
type: TableColumnType.Boolean,
|
||||
required: true,
|
||||
isDefaultValueColumn: true,
|
||||
title: "Are Owners Notified",
|
||||
description: "Are owners notified of this resource ownership?",
|
||||
defaultValue: false,
|
||||
})
|
||||
@Column({
|
||||
type: ColumnType.Boolean,
|
||||
nullable: false,
|
||||
default: false,
|
||||
})
|
||||
public isOwnerNotified?: boolean = undefined;
|
||||
}
|
||||
431
Common/Models/DatabaseModels/AlertEpisodeOwnerUser.ts
Normal file
431
Common/Models/DatabaseModels/AlertEpisodeOwnerUser.ts
Normal file
@@ -0,0 +1,431 @@
|
||||
import AlertEpisode from "./AlertEpisode";
|
||||
import Project from "./Project";
|
||||
import User from "./User";
|
||||
import BaseModel from "./DatabaseBaseModel/DatabaseBaseModel";
|
||||
import Route from "../../Types/API/Route";
|
||||
import ColumnAccessControl from "../../Types/Database/AccessControl/ColumnAccessControl";
|
||||
import TableAccessControl from "../../Types/Database/AccessControl/TableAccessControl";
|
||||
import ColumnType from "../../Types/Database/ColumnType";
|
||||
import CrudApiEndpoint from "../../Types/Database/CrudApiEndpoint";
|
||||
import EnableDocumentation from "../../Types/Database/EnableDocumentation";
|
||||
import EnableWorkflow from "../../Types/Database/EnableWorkflow";
|
||||
import TableColumn from "../../Types/Database/TableColumn";
|
||||
import TableColumnType from "../../Types/Database/TableColumnType";
|
||||
import TableMetadata from "../../Types/Database/TableMetadata";
|
||||
import TenantColumn from "../../Types/Database/TenantColumn";
|
||||
import IconProp from "../../Types/Icon/IconProp";
|
||||
import ObjectID from "../../Types/ObjectID";
|
||||
import Permission from "../../Types/Permission";
|
||||
import { Column, Entity, Index, JoinColumn, ManyToOne } from "typeorm";
|
||||
|
||||
@EnableDocumentation()
|
||||
@TenantColumn("projectId")
|
||||
@TableAccessControl({
|
||||
create: [
|
||||
Permission.ProjectOwner,
|
||||
Permission.ProjectAdmin,
|
||||
Permission.ProjectMember,
|
||||
Permission.CreateAlertEpisodeOwnerUser,
|
||||
],
|
||||
read: [
|
||||
Permission.ProjectOwner,
|
||||
Permission.ProjectAdmin,
|
||||
Permission.ProjectMember,
|
||||
Permission.ReadAlertEpisodeOwnerUser,
|
||||
Permission.ReadAllProjectResources,
|
||||
],
|
||||
delete: [
|
||||
Permission.ProjectOwner,
|
||||
Permission.ProjectAdmin,
|
||||
Permission.ProjectMember,
|
||||
Permission.DeleteAlertEpisodeOwnerUser,
|
||||
],
|
||||
update: [
|
||||
Permission.ProjectOwner,
|
||||
Permission.ProjectAdmin,
|
||||
Permission.ProjectMember,
|
||||
Permission.EditAlertEpisodeOwnerUser,
|
||||
],
|
||||
})
|
||||
@EnableWorkflow({
|
||||
create: true,
|
||||
delete: true,
|
||||
update: true,
|
||||
read: true,
|
||||
})
|
||||
@CrudApiEndpoint(new Route("/alert-episode-owner-user"))
|
||||
@TableMetadata({
|
||||
tableName: "AlertEpisodeOwnerUser",
|
||||
singularName: "Alert Episode User Owner",
|
||||
pluralName: "Alert Episode User Owners",
|
||||
icon: IconProp.User,
|
||||
tableDescription: "Add users as owners to your alert episodes.",
|
||||
})
|
||||
@Entity({
|
||||
name: "AlertEpisodeOwnerUser",
|
||||
})
|
||||
@Index(["alertEpisodeId", "userId", "projectId"])
|
||||
export default class AlertEpisodeOwnerUser extends BaseModel {
|
||||
@ColumnAccessControl({
|
||||
create: [
|
||||
Permission.ProjectOwner,
|
||||
Permission.ProjectAdmin,
|
||||
Permission.ProjectMember,
|
||||
Permission.CreateAlertEpisodeOwnerUser,
|
||||
],
|
||||
read: [
|
||||
Permission.ProjectOwner,
|
||||
Permission.ProjectAdmin,
|
||||
Permission.ProjectMember,
|
||||
Permission.ReadAlertEpisodeOwnerUser,
|
||||
Permission.ReadAllProjectResources,
|
||||
],
|
||||
update: [],
|
||||
})
|
||||
@TableColumn({
|
||||
manyToOneRelationColumn: "projectId",
|
||||
type: TableColumnType.Entity,
|
||||
modelType: Project,
|
||||
title: "Project",
|
||||
description: "Relation to Project Resource in which this object belongs",
|
||||
})
|
||||
@ManyToOne(
|
||||
() => {
|
||||
return Project;
|
||||
},
|
||||
{
|
||||
eager: false,
|
||||
nullable: false,
|
||||
onDelete: "CASCADE",
|
||||
orphanedRowAction: "nullify",
|
||||
},
|
||||
)
|
||||
@JoinColumn({ name: "projectId" })
|
||||
public project?: Project = undefined;
|
||||
|
||||
@ColumnAccessControl({
|
||||
create: [
|
||||
Permission.ProjectOwner,
|
||||
Permission.ProjectAdmin,
|
||||
Permission.ProjectMember,
|
||||
Permission.CreateAlertEpisodeOwnerUser,
|
||||
],
|
||||
read: [
|
||||
Permission.ProjectOwner,
|
||||
Permission.ProjectAdmin,
|
||||
Permission.ProjectMember,
|
||||
Permission.ReadAlertEpisodeOwnerUser,
|
||||
Permission.ReadAllProjectResources,
|
||||
],
|
||||
update: [],
|
||||
})
|
||||
@Index()
|
||||
@TableColumn({
|
||||
type: TableColumnType.ObjectID,
|
||||
required: true,
|
||||
canReadOnRelationQuery: true,
|
||||
title: "Project ID",
|
||||
description: "ID of your OneUptime Project in which this object belongs",
|
||||
})
|
||||
@Column({
|
||||
type: ColumnType.ObjectID,
|
||||
nullable: false,
|
||||
transformer: ObjectID.getDatabaseTransformer(),
|
||||
})
|
||||
public projectId?: ObjectID = undefined;
|
||||
|
||||
@ColumnAccessControl({
|
||||
create: [
|
||||
Permission.ProjectOwner,
|
||||
Permission.ProjectAdmin,
|
||||
Permission.ProjectMember,
|
||||
Permission.CreateAlertEpisodeOwnerUser,
|
||||
],
|
||||
read: [
|
||||
Permission.ProjectOwner,
|
||||
Permission.ProjectAdmin,
|
||||
Permission.ProjectMember,
|
||||
Permission.ReadAlertEpisodeOwnerUser,
|
||||
Permission.ReadAllProjectResources,
|
||||
],
|
||||
update: [],
|
||||
})
|
||||
@TableColumn({
|
||||
manyToOneRelationColumn: "userId",
|
||||
type: TableColumnType.Entity,
|
||||
modelType: User,
|
||||
title: "User",
|
||||
description: "User that is the owner of this episode",
|
||||
})
|
||||
@ManyToOne(
|
||||
() => {
|
||||
return User;
|
||||
},
|
||||
{
|
||||
eager: false,
|
||||
nullable: true,
|
||||
onDelete: "CASCADE",
|
||||
orphanedRowAction: "nullify",
|
||||
},
|
||||
)
|
||||
@JoinColumn({ name: "userId" })
|
||||
public user?: User = undefined;
|
||||
|
||||
@ColumnAccessControl({
|
||||
create: [
|
||||
Permission.ProjectOwner,
|
||||
Permission.ProjectAdmin,
|
||||
Permission.ProjectMember,
|
||||
Permission.CreateAlertEpisodeOwnerUser,
|
||||
],
|
||||
read: [
|
||||
Permission.ProjectOwner,
|
||||
Permission.ProjectAdmin,
|
||||
Permission.ProjectMember,
|
||||
Permission.ReadAlertEpisodeOwnerUser,
|
||||
Permission.ReadAllProjectResources,
|
||||
],
|
||||
update: [],
|
||||
})
|
||||
@Index()
|
||||
@TableColumn({
|
||||
type: TableColumnType.ObjectID,
|
||||
required: true,
|
||||
canReadOnRelationQuery: true,
|
||||
title: "User ID",
|
||||
description: "ID of the user who is the owner",
|
||||
})
|
||||
@Column({
|
||||
type: ColumnType.ObjectID,
|
||||
nullable: false,
|
||||
transformer: ObjectID.getDatabaseTransformer(),
|
||||
})
|
||||
public userId?: ObjectID = undefined;
|
||||
|
||||
@ColumnAccessControl({
|
||||
create: [
|
||||
Permission.ProjectOwner,
|
||||
Permission.ProjectAdmin,
|
||||
Permission.ProjectMember,
|
||||
Permission.CreateAlertEpisodeOwnerUser,
|
||||
],
|
||||
read: [
|
||||
Permission.ProjectOwner,
|
||||
Permission.ProjectAdmin,
|
||||
Permission.ProjectMember,
|
||||
Permission.ReadAlertEpisodeOwnerUser,
|
||||
Permission.ReadAllProjectResources,
|
||||
],
|
||||
update: [],
|
||||
})
|
||||
@TableColumn({
|
||||
manyToOneRelationColumn: "alertEpisodeId",
|
||||
type: TableColumnType.Entity,
|
||||
modelType: AlertEpisode,
|
||||
title: "Alert Episode",
|
||||
description:
|
||||
"Relation to Alert Episode Resource in which this object belongs",
|
||||
})
|
||||
@ManyToOne(
|
||||
() => {
|
||||
return AlertEpisode;
|
||||
},
|
||||
{
|
||||
eager: false,
|
||||
nullable: true,
|
||||
onDelete: "CASCADE",
|
||||
orphanedRowAction: "nullify",
|
||||
},
|
||||
)
|
||||
@JoinColumn({ name: "alertEpisodeId" })
|
||||
public alertEpisode?: AlertEpisode = undefined;
|
||||
|
||||
@ColumnAccessControl({
|
||||
create: [
|
||||
Permission.ProjectOwner,
|
||||
Permission.ProjectAdmin,
|
||||
Permission.ProjectMember,
|
||||
Permission.CreateAlertEpisodeOwnerUser,
|
||||
],
|
||||
read: [
|
||||
Permission.ProjectOwner,
|
||||
Permission.ProjectAdmin,
|
||||
Permission.ProjectMember,
|
||||
Permission.ReadAlertEpisodeOwnerUser,
|
||||
Permission.ReadAllProjectResources,
|
||||
],
|
||||
update: [],
|
||||
})
|
||||
@Index()
|
||||
@TableColumn({
|
||||
type: TableColumnType.ObjectID,
|
||||
required: true,
|
||||
canReadOnRelationQuery: true,
|
||||
title: "Alert Episode ID",
|
||||
description:
|
||||
"ID of your OneUptime Alert Episode in which this object belongs",
|
||||
})
|
||||
@Column({
|
||||
type: ColumnType.ObjectID,
|
||||
nullable: false,
|
||||
transformer: ObjectID.getDatabaseTransformer(),
|
||||
})
|
||||
public alertEpisodeId?: ObjectID = undefined;
|
||||
|
||||
@ColumnAccessControl({
|
||||
create: [
|
||||
Permission.ProjectOwner,
|
||||
Permission.ProjectAdmin,
|
||||
Permission.ProjectMember,
|
||||
Permission.CreateAlertEpisodeOwnerUser,
|
||||
],
|
||||
read: [
|
||||
Permission.ProjectOwner,
|
||||
Permission.ProjectAdmin,
|
||||
Permission.ProjectMember,
|
||||
Permission.ReadAlertEpisodeOwnerUser,
|
||||
Permission.ReadAllProjectResources,
|
||||
],
|
||||
update: [],
|
||||
})
|
||||
@TableColumn({
|
||||
manyToOneRelationColumn: "createdByUserId",
|
||||
type: TableColumnType.Entity,
|
||||
modelType: User,
|
||||
title: "Created by User",
|
||||
description:
|
||||
"Relation to User who created this object (if this object was created by a User)",
|
||||
})
|
||||
@ManyToOne(
|
||||
() => {
|
||||
return User;
|
||||
},
|
||||
{
|
||||
eager: false,
|
||||
nullable: true,
|
||||
onDelete: "SET NULL",
|
||||
orphanedRowAction: "nullify",
|
||||
},
|
||||
)
|
||||
@JoinColumn({ name: "createdByUserId" })
|
||||
public createdByUser?: User = undefined;
|
||||
|
||||
@ColumnAccessControl({
|
||||
create: [
|
||||
Permission.ProjectOwner,
|
||||
Permission.ProjectAdmin,
|
||||
Permission.ProjectMember,
|
||||
Permission.CreateAlertEpisodeOwnerUser,
|
||||
],
|
||||
read: [
|
||||
Permission.ProjectOwner,
|
||||
Permission.ProjectAdmin,
|
||||
Permission.ProjectMember,
|
||||
Permission.ReadAlertEpisodeOwnerUser,
|
||||
Permission.ReadAllProjectResources,
|
||||
],
|
||||
update: [],
|
||||
})
|
||||
@TableColumn({
|
||||
type: TableColumnType.ObjectID,
|
||||
title: "Created by User ID",
|
||||
description:
|
||||
"User ID who created this object (if this object was created by a User)",
|
||||
})
|
||||
@Column({
|
||||
type: ColumnType.ObjectID,
|
||||
nullable: true,
|
||||
transformer: ObjectID.getDatabaseTransformer(),
|
||||
})
|
||||
public createdByUserId?: ObjectID = undefined;
|
||||
|
||||
@ColumnAccessControl({
|
||||
create: [],
|
||||
read: [
|
||||
Permission.ProjectOwner,
|
||||
Permission.ProjectAdmin,
|
||||
Permission.ProjectMember,
|
||||
Permission.ReadAlertEpisodeOwnerUser,
|
||||
Permission.ReadAllProjectResources,
|
||||
],
|
||||
update: [],
|
||||
})
|
||||
@TableColumn({
|
||||
manyToOneRelationColumn: "deletedByUserId",
|
||||
type: TableColumnType.Entity,
|
||||
title: "Deleted by User",
|
||||
modelType: User,
|
||||
description:
|
||||
"Relation to User who deleted this object (if this object was deleted by a User)",
|
||||
})
|
||||
@ManyToOne(
|
||||
() => {
|
||||
return User;
|
||||
},
|
||||
{
|
||||
cascade: false,
|
||||
eager: false,
|
||||
nullable: true,
|
||||
onDelete: "SET NULL",
|
||||
orphanedRowAction: "nullify",
|
||||
},
|
||||
)
|
||||
@JoinColumn({ name: "deletedByUserId" })
|
||||
public deletedByUser?: User = undefined;
|
||||
|
||||
@ColumnAccessControl({
|
||||
create: [],
|
||||
read: [
|
||||
Permission.ProjectOwner,
|
||||
Permission.ProjectAdmin,
|
||||
Permission.ProjectMember,
|
||||
Permission.ReadAlertEpisodeOwnerUser,
|
||||
Permission.ReadAllProjectResources,
|
||||
],
|
||||
update: [],
|
||||
})
|
||||
@TableColumn({
|
||||
type: TableColumnType.ObjectID,
|
||||
title: "Deleted by User ID",
|
||||
description:
|
||||
"User ID who deleted this object (if this object was deleted by a User)",
|
||||
})
|
||||
@Column({
|
||||
type: ColumnType.ObjectID,
|
||||
nullable: true,
|
||||
transformer: ObjectID.getDatabaseTransformer(),
|
||||
})
|
||||
public deletedByUserId?: ObjectID = undefined;
|
||||
|
||||
@ColumnAccessControl({
|
||||
create: [
|
||||
Permission.ProjectOwner,
|
||||
Permission.ProjectAdmin,
|
||||
Permission.ProjectMember,
|
||||
Permission.CreateAlertEpisodeOwnerUser,
|
||||
],
|
||||
read: [
|
||||
Permission.ProjectOwner,
|
||||
Permission.ProjectAdmin,
|
||||
Permission.ProjectMember,
|
||||
Permission.ReadAlertEpisodeOwnerUser,
|
||||
Permission.ReadAllProjectResources,
|
||||
],
|
||||
update: [],
|
||||
})
|
||||
@Index()
|
||||
@TableColumn({
|
||||
type: TableColumnType.Boolean,
|
||||
required: true,
|
||||
isDefaultValueColumn: true,
|
||||
title: "Are Owners Notified",
|
||||
description: "Are owners notified of this resource ownership?",
|
||||
defaultValue: false,
|
||||
})
|
||||
@Column({
|
||||
type: ColumnType.Boolean,
|
||||
nullable: false,
|
||||
default: false,
|
||||
})
|
||||
public isOwnerNotified?: boolean = undefined;
|
||||
}
|
||||
538
Common/Models/DatabaseModels/AlertEpisodeStateTimeline.ts
Normal file
538
Common/Models/DatabaseModels/AlertEpisodeStateTimeline.ts
Normal file
@@ -0,0 +1,538 @@
|
||||
import AlertEpisode from "./AlertEpisode";
|
||||
import AlertState from "./AlertState";
|
||||
import Project from "./Project";
|
||||
import User from "./User";
|
||||
import BaseModel from "./DatabaseBaseModel/DatabaseBaseModel";
|
||||
import Route from "../../Types/API/Route";
|
||||
import ColumnAccessControl from "../../Types/Database/AccessControl/ColumnAccessControl";
|
||||
import TableAccessControl from "../../Types/Database/AccessControl/TableAccessControl";
|
||||
import CanAccessIfCanReadOn from "../../Types/Database/CanAccessIfCanReadOn";
|
||||
import ColumnType from "../../Types/Database/ColumnType";
|
||||
import CrudApiEndpoint from "../../Types/Database/CrudApiEndpoint";
|
||||
import EnableDocumentation from "../../Types/Database/EnableDocumentation";
|
||||
import EnableWorkflow from "../../Types/Database/EnableWorkflow";
|
||||
import TableColumn from "../../Types/Database/TableColumn";
|
||||
import TableColumnType from "../../Types/Database/TableColumnType";
|
||||
import TableMetadata from "../../Types/Database/TableMetadata";
|
||||
import TenantColumn from "../../Types/Database/TenantColumn";
|
||||
import IconProp from "../../Types/Icon/IconProp";
|
||||
import { JSONObject } from "../../Types/JSON";
|
||||
import ObjectID from "../../Types/ObjectID";
|
||||
import Permission from "../../Types/Permission";
|
||||
import { Column, Entity, Index, JoinColumn, ManyToOne } from "typeorm";
|
||||
|
||||
@EnableDocumentation()
|
||||
@CanAccessIfCanReadOn("alertEpisode")
|
||||
@TenantColumn("projectId")
|
||||
@TableAccessControl({
|
||||
create: [
|
||||
Permission.ProjectOwner,
|
||||
Permission.ProjectAdmin,
|
||||
Permission.ProjectMember,
|
||||
Permission.CreateAlertEpisodeStateTimeline,
|
||||
],
|
||||
read: [
|
||||
Permission.ProjectOwner,
|
||||
Permission.ProjectAdmin,
|
||||
Permission.ProjectMember,
|
||||
Permission.ReadAlertEpisodeStateTimeline,
|
||||
Permission.ReadAllProjectResources,
|
||||
],
|
||||
delete: [
|
||||
Permission.ProjectOwner,
|
||||
Permission.ProjectAdmin,
|
||||
Permission.ProjectMember,
|
||||
Permission.DeleteAlertEpisodeStateTimeline,
|
||||
],
|
||||
update: [
|
||||
Permission.ProjectOwner,
|
||||
Permission.ProjectAdmin,
|
||||
Permission.ProjectMember,
|
||||
Permission.EditAlertEpisodeStateTimeline,
|
||||
],
|
||||
})
|
||||
@EnableWorkflow({
|
||||
create: true,
|
||||
delete: true,
|
||||
update: true,
|
||||
read: true,
|
||||
})
|
||||
@CrudApiEndpoint(new Route("/alert-episode-state-timeline"))
|
||||
@Entity({
|
||||
name: "AlertEpisodeStateTimeline",
|
||||
})
|
||||
@Index(["alertEpisodeId", "startsAt"])
|
||||
@TableMetadata({
|
||||
tableName: "AlertEpisodeStateTimeline",
|
||||
singularName: "Alert Episode State Timeline",
|
||||
pluralName: "Alert Episode State Timelines",
|
||||
icon: IconProp.List,
|
||||
tableDescription:
|
||||
"Change state of the alert episodes (Created to Acknowledged for example)",
|
||||
})
|
||||
export default class AlertEpisodeStateTimeline extends BaseModel {
|
||||
@ColumnAccessControl({
|
||||
create: [
|
||||
Permission.ProjectOwner,
|
||||
Permission.ProjectAdmin,
|
||||
Permission.ProjectMember,
|
||||
Permission.CreateAlertEpisodeStateTimeline,
|
||||
],
|
||||
read: [
|
||||
Permission.ProjectOwner,
|
||||
Permission.ProjectAdmin,
|
||||
Permission.ProjectMember,
|
||||
Permission.ReadAlertEpisodeStateTimeline,
|
||||
Permission.ReadAllProjectResources,
|
||||
],
|
||||
update: [],
|
||||
})
|
||||
@TableColumn({
|
||||
manyToOneRelationColumn: "projectId",
|
||||
type: TableColumnType.Entity,
|
||||
modelType: Project,
|
||||
title: "Project",
|
||||
description: "Relation to Project Resource in which this object belongs",
|
||||
})
|
||||
@ManyToOne(
|
||||
() => {
|
||||
return Project;
|
||||
},
|
||||
{
|
||||
eager: false,
|
||||
nullable: true,
|
||||
onDelete: "CASCADE",
|
||||
orphanedRowAction: "nullify",
|
||||
},
|
||||
)
|
||||
@JoinColumn({ name: "projectId" })
|
||||
public project?: Project = undefined;
|
||||
|
||||
@ColumnAccessControl({
|
||||
create: [
|
||||
Permission.ProjectOwner,
|
||||
Permission.ProjectAdmin,
|
||||
Permission.ProjectMember,
|
||||
Permission.CreateAlertEpisodeStateTimeline,
|
||||
],
|
||||
read: [
|
||||
Permission.ProjectOwner,
|
||||
Permission.ProjectAdmin,
|
||||
Permission.ProjectMember,
|
||||
Permission.ReadAlertEpisodeStateTimeline,
|
||||
Permission.ReadAllProjectResources,
|
||||
],
|
||||
update: [],
|
||||
})
|
||||
@Index()
|
||||
@TableColumn({
|
||||
type: TableColumnType.ObjectID,
|
||||
required: true,
|
||||
canReadOnRelationQuery: true,
|
||||
title: "Project ID",
|
||||
description: "ID of your OneUptime Project in which this object belongs",
|
||||
})
|
||||
@Column({
|
||||
type: ColumnType.ObjectID,
|
||||
nullable: false,
|
||||
transformer: ObjectID.getDatabaseTransformer(),
|
||||
})
|
||||
public projectId?: ObjectID = undefined;
|
||||
|
||||
@ColumnAccessControl({
|
||||
create: [
|
||||
Permission.ProjectOwner,
|
||||
Permission.ProjectAdmin,
|
||||
Permission.ProjectMember,
|
||||
Permission.CreateAlertEpisodeStateTimeline,
|
||||
],
|
||||
read: [
|
||||
Permission.ProjectOwner,
|
||||
Permission.ProjectAdmin,
|
||||
Permission.ProjectMember,
|
||||
Permission.ReadAlertEpisodeStateTimeline,
|
||||
Permission.ReadAllProjectResources,
|
||||
],
|
||||
update: [],
|
||||
})
|
||||
@TableColumn({
|
||||
manyToOneRelationColumn: "alertEpisodeId",
|
||||
type: TableColumnType.Entity,
|
||||
modelType: AlertEpisode,
|
||||
title: "Alert Episode",
|
||||
description: "Relation to Alert Episode in which this resource belongs",
|
||||
})
|
||||
@ManyToOne(
|
||||
() => {
|
||||
return AlertEpisode;
|
||||
},
|
||||
{
|
||||
eager: false,
|
||||
nullable: true,
|
||||
onDelete: "CASCADE",
|
||||
orphanedRowAction: "nullify",
|
||||
},
|
||||
)
|
||||
@JoinColumn({ name: "alertEpisodeId" })
|
||||
public alertEpisode?: AlertEpisode = undefined;
|
||||
|
||||
@ColumnAccessControl({
|
||||
create: [
|
||||
Permission.ProjectOwner,
|
||||
Permission.ProjectAdmin,
|
||||
Permission.ProjectMember,
|
||||
Permission.CreateAlertEpisodeStateTimeline,
|
||||
],
|
||||
read: [
|
||||
Permission.ProjectOwner,
|
||||
Permission.ProjectAdmin,
|
||||
Permission.ProjectMember,
|
||||
Permission.ReadAlertEpisodeStateTimeline,
|
||||
Permission.ReadAllProjectResources,
|
||||
],
|
||||
update: [],
|
||||
})
|
||||
@Index()
|
||||
@TableColumn({
|
||||
type: TableColumnType.ObjectID,
|
||||
required: true,
|
||||
title: "Alert Episode ID",
|
||||
description: "Relation to Alert Episode ID in which this resource belongs",
|
||||
})
|
||||
@Column({
|
||||
type: ColumnType.ObjectID,
|
||||
nullable: false,
|
||||
transformer: ObjectID.getDatabaseTransformer(),
|
||||
})
|
||||
public alertEpisodeId?: ObjectID = undefined;
|
||||
|
||||
@ColumnAccessControl({
|
||||
create: [
|
||||
Permission.ProjectOwner,
|
||||
Permission.ProjectAdmin,
|
||||
Permission.ProjectMember,
|
||||
Permission.CreateAlertEpisodeStateTimeline,
|
||||
],
|
||||
read: [
|
||||
Permission.ProjectOwner,
|
||||
Permission.ProjectAdmin,
|
||||
Permission.ProjectMember,
|
||||
Permission.ReadAlertEpisodeStateTimeline,
|
||||
Permission.ReadAllProjectResources,
|
||||
],
|
||||
update: [],
|
||||
})
|
||||
@TableColumn({
|
||||
manyToOneRelationColumn: "createdByUserId",
|
||||
type: TableColumnType.Entity,
|
||||
modelType: User,
|
||||
title: "Created by User",
|
||||
description:
|
||||
"Relation to User who created this object (if this object was created by a User)",
|
||||
})
|
||||
@ManyToOne(
|
||||
() => {
|
||||
return User;
|
||||
},
|
||||
{
|
||||
eager: false,
|
||||
nullable: true,
|
||||
onDelete: "SET NULL",
|
||||
orphanedRowAction: "nullify",
|
||||
},
|
||||
)
|
||||
@JoinColumn({ name: "createdByUserId" })
|
||||
public createdByUser?: User = undefined;
|
||||
|
||||
@ColumnAccessControl({
|
||||
create: [
|
||||
Permission.ProjectOwner,
|
||||
Permission.ProjectAdmin,
|
||||
Permission.ProjectMember,
|
||||
Permission.CreateAlertEpisodeStateTimeline,
|
||||
],
|
||||
read: [
|
||||
Permission.ProjectOwner,
|
||||
Permission.ProjectAdmin,
|
||||
Permission.ProjectMember,
|
||||
Permission.ReadAlertEpisodeStateTimeline,
|
||||
Permission.ReadAllProjectResources,
|
||||
],
|
||||
update: [],
|
||||
})
|
||||
@TableColumn({
|
||||
type: TableColumnType.ObjectID,
|
||||
title: "Created by User ID",
|
||||
description:
|
||||
"User ID who created this object (if this object was created by a User)",
|
||||
})
|
||||
@Column({
|
||||
type: ColumnType.ObjectID,
|
||||
nullable: true,
|
||||
transformer: ObjectID.getDatabaseTransformer(),
|
||||
})
|
||||
public createdByUserId?: ObjectID = undefined;
|
||||
|
||||
@ColumnAccessControl({
|
||||
create: [],
|
||||
read: [],
|
||||
update: [],
|
||||
})
|
||||
@TableColumn({
|
||||
manyToOneRelationColumn: "deletedByUserId",
|
||||
type: TableColumnType.Entity,
|
||||
title: "Deleted by User",
|
||||
modelType: User,
|
||||
description:
|
||||
"Relation to User who deleted this object (if this object was deleted by a User)",
|
||||
})
|
||||
@ManyToOne(
|
||||
() => {
|
||||
return User;
|
||||
},
|
||||
{
|
||||
cascade: false,
|
||||
eager: false,
|
||||
nullable: true,
|
||||
onDelete: "SET NULL",
|
||||
orphanedRowAction: "nullify",
|
||||
},
|
||||
)
|
||||
@JoinColumn({ name: "deletedByUserId" })
|
||||
public deletedByUser?: User = undefined;
|
||||
|
||||
@ColumnAccessControl({
|
||||
create: [],
|
||||
read: [],
|
||||
update: [],
|
||||
})
|
||||
@TableColumn({
|
||||
type: TableColumnType.ObjectID,
|
||||
title: "Deleted by User ID",
|
||||
description:
|
||||
"User ID who deleted this object (if this object was deleted by a User)",
|
||||
})
|
||||
@Column({
|
||||
type: ColumnType.ObjectID,
|
||||
nullable: true,
|
||||
transformer: ObjectID.getDatabaseTransformer(),
|
||||
})
|
||||
public deletedByUserId?: ObjectID = undefined;
|
||||
|
||||
@ColumnAccessControl({
|
||||
create: [
|
||||
Permission.ProjectOwner,
|
||||
Permission.ProjectAdmin,
|
||||
Permission.ProjectMember,
|
||||
Permission.CreateAlertEpisodeStateTimeline,
|
||||
],
|
||||
read: [
|
||||
Permission.ProjectOwner,
|
||||
Permission.ProjectAdmin,
|
||||
Permission.ProjectMember,
|
||||
Permission.ReadAlertEpisodeStateTimeline,
|
||||
Permission.ReadAllProjectResources,
|
||||
],
|
||||
update: [
|
||||
Permission.ProjectOwner,
|
||||
Permission.ProjectAdmin,
|
||||
Permission.ProjectMember,
|
||||
Permission.EditAlertEpisodeStateTimeline,
|
||||
],
|
||||
})
|
||||
@TableColumn({
|
||||
manyToOneRelationColumn: "alertStateId",
|
||||
type: TableColumnType.Entity,
|
||||
modelType: AlertState,
|
||||
title: "Alert State",
|
||||
description:
|
||||
"Alert State Relation. Which alert state does this episode change to?",
|
||||
})
|
||||
@ManyToOne(
|
||||
() => {
|
||||
return AlertState;
|
||||
},
|
||||
{
|
||||
eager: false,
|
||||
nullable: true,
|
||||
orphanedRowAction: "nullify",
|
||||
},
|
||||
)
|
||||
@JoinColumn({ name: "alertStateId" })
|
||||
public alertState?: AlertState = undefined;
|
||||
|
||||
@ColumnAccessControl({
|
||||
create: [
|
||||
Permission.ProjectOwner,
|
||||
Permission.ProjectAdmin,
|
||||
Permission.ProjectMember,
|
||||
Permission.CreateAlertEpisodeStateTimeline,
|
||||
],
|
||||
read: [
|
||||
Permission.ProjectOwner,
|
||||
Permission.ProjectAdmin,
|
||||
Permission.ProjectMember,
|
||||
Permission.ReadAlertEpisodeStateTimeline,
|
||||
Permission.ReadAllProjectResources,
|
||||
],
|
||||
update: [
|
||||
Permission.ProjectOwner,
|
||||
Permission.ProjectAdmin,
|
||||
Permission.ProjectMember,
|
||||
Permission.EditAlertEpisodeStateTimeline,
|
||||
],
|
||||
})
|
||||
@Index()
|
||||
@TableColumn({
|
||||
type: TableColumnType.ObjectID,
|
||||
required: true,
|
||||
title: "Alert State ID",
|
||||
description:
|
||||
"Alert State ID Relation. Which alert state does this episode change to?",
|
||||
})
|
||||
@Column({
|
||||
type: ColumnType.ObjectID,
|
||||
nullable: false,
|
||||
transformer: ObjectID.getDatabaseTransformer(),
|
||||
})
|
||||
public alertStateId?: ObjectID = undefined;
|
||||
|
||||
@ColumnAccessControl({
|
||||
create: [],
|
||||
read: [
|
||||
Permission.ProjectOwner,
|
||||
Permission.ProjectAdmin,
|
||||
Permission.ProjectMember,
|
||||
Permission.ReadAlertEpisodeStateTimeline,
|
||||
Permission.ReadAllProjectResources,
|
||||
],
|
||||
update: [],
|
||||
})
|
||||
@Index()
|
||||
@TableColumn({
|
||||
type: TableColumnType.Boolean,
|
||||
required: true,
|
||||
isDefaultValueColumn: true,
|
||||
title: "Are Owners Notified",
|
||||
description: "Are owners notified of state change?",
|
||||
defaultValue: false,
|
||||
})
|
||||
@Column({
|
||||
type: ColumnType.Boolean,
|
||||
nullable: false,
|
||||
default: false,
|
||||
})
|
||||
public isOwnerNotified?: boolean = undefined;
|
||||
|
||||
@ColumnAccessControl({
|
||||
create: [],
|
||||
read: [
|
||||
Permission.ProjectOwner,
|
||||
Permission.ProjectAdmin,
|
||||
Permission.ProjectMember,
|
||||
Permission.ReadAlertEpisodeStateTimeline,
|
||||
Permission.ReadAllProjectResources,
|
||||
],
|
||||
update: [],
|
||||
})
|
||||
@TableColumn({
|
||||
isDefaultValueColumn: false,
|
||||
required: false,
|
||||
type: TableColumnType.JSON,
|
||||
computed: true,
|
||||
})
|
||||
@Column({
|
||||
type: ColumnType.JSON,
|
||||
nullable: true,
|
||||
unique: false,
|
||||
})
|
||||
public stateChangeLog?: JSONObject = undefined;
|
||||
|
||||
@ColumnAccessControl({
|
||||
create: [
|
||||
Permission.ProjectOwner,
|
||||
Permission.ProjectAdmin,
|
||||
Permission.ProjectMember,
|
||||
Permission.CreateAlertEpisodeStateTimeline,
|
||||
],
|
||||
read: [
|
||||
Permission.ProjectOwner,
|
||||
Permission.ProjectAdmin,
|
||||
Permission.ProjectMember,
|
||||
Permission.ReadAlertEpisodeStateTimeline,
|
||||
Permission.ReadAllProjectResources,
|
||||
],
|
||||
update: [],
|
||||
})
|
||||
@Index()
|
||||
@TableColumn({
|
||||
type: TableColumnType.Markdown,
|
||||
required: false,
|
||||
isDefaultValueColumn: false,
|
||||
title: "Root Cause",
|
||||
description: "What is the root cause of this status change?",
|
||||
})
|
||||
@Column({
|
||||
type: ColumnType.Markdown,
|
||||
nullable: true,
|
||||
})
|
||||
public rootCause?: string = undefined;
|
||||
|
||||
@Index()
|
||||
@ColumnAccessControl({
|
||||
create: [
|
||||
Permission.ProjectOwner,
|
||||
Permission.ProjectAdmin,
|
||||
Permission.ProjectMember,
|
||||
Permission.CreateAlertEpisodeStateTimeline,
|
||||
],
|
||||
read: [
|
||||
Permission.ProjectOwner,
|
||||
Permission.ProjectAdmin,
|
||||
Permission.ProjectMember,
|
||||
Permission.ReadAlertEpisodeStateTimeline,
|
||||
Permission.ReadAllProjectResources,
|
||||
],
|
||||
update: [],
|
||||
})
|
||||
@TableColumn({
|
||||
type: TableColumnType.Date,
|
||||
title: "Ends At",
|
||||
description: "When did this status change end?",
|
||||
})
|
||||
@Column({
|
||||
type: ColumnType.Date,
|
||||
nullable: true,
|
||||
unique: false,
|
||||
})
|
||||
public endsAt?: Date = undefined;
|
||||
|
||||
@Index()
|
||||
@ColumnAccessControl({
|
||||
create: [
|
||||
Permission.ProjectOwner,
|
||||
Permission.ProjectAdmin,
|
||||
Permission.ProjectMember,
|
||||
Permission.CreateAlertEpisodeStateTimeline,
|
||||
],
|
||||
read: [
|
||||
Permission.ProjectOwner,
|
||||
Permission.ProjectAdmin,
|
||||
Permission.ProjectMember,
|
||||
Permission.ReadAlertEpisodeStateTimeline,
|
||||
Permission.ReadAllProjectResources,
|
||||
],
|
||||
update: [],
|
||||
})
|
||||
@TableColumn({
|
||||
type: TableColumnType.Date,
|
||||
title: "Starts At",
|
||||
description: "When did this status change?",
|
||||
})
|
||||
@Column({
|
||||
type: ColumnType.Date,
|
||||
nullable: true,
|
||||
unique: false,
|
||||
})
|
||||
public startsAt?: Date = undefined;
|
||||
}
|
||||
@@ -38,6 +38,8 @@ export enum AlertFeedEventType {
|
||||
OwnerTeamRemoved = "OwnerTeamRemoved",
|
||||
OnCallPolicy = "OnCallPolicy",
|
||||
OnCallNotification = "OnCallNotification",
|
||||
AddedToEpisode = "AddedToEpisode",
|
||||
RemovedFromEpisode = "RemovedFromEpisode",
|
||||
}
|
||||
|
||||
@EnableDocumentation()
|
||||
@@ -55,6 +57,7 @@ export enum AlertFeedEventType {
|
||||
Permission.ProjectAdmin,
|
||||
Permission.ProjectMember,
|
||||
Permission.ReadAlertFeed,
|
||||
Permission.ReadAllProjectResources,
|
||||
],
|
||||
delete: [],
|
||||
update: [],
|
||||
@@ -90,6 +93,7 @@ export default class AlertFeed extends BaseModel {
|
||||
Permission.ProjectAdmin,
|
||||
Permission.ProjectMember,
|
||||
Permission.ReadAlertFeed,
|
||||
Permission.ReadAllProjectResources,
|
||||
],
|
||||
update: [],
|
||||
})
|
||||
@@ -126,6 +130,7 @@ export default class AlertFeed extends BaseModel {
|
||||
Permission.ProjectAdmin,
|
||||
Permission.ProjectMember,
|
||||
Permission.ReadAlertFeed,
|
||||
Permission.ReadAllProjectResources,
|
||||
],
|
||||
update: [],
|
||||
})
|
||||
@@ -157,6 +162,7 @@ export default class AlertFeed extends BaseModel {
|
||||
Permission.ProjectAdmin,
|
||||
Permission.ProjectMember,
|
||||
Permission.ReadAlertFeed,
|
||||
Permission.ReadAllProjectResources,
|
||||
],
|
||||
update: [],
|
||||
})
|
||||
@@ -193,6 +199,7 @@ export default class AlertFeed extends BaseModel {
|
||||
Permission.ProjectAdmin,
|
||||
Permission.ProjectMember,
|
||||
Permission.ReadAlertFeed,
|
||||
Permission.ReadAllProjectResources,
|
||||
],
|
||||
update: [],
|
||||
})
|
||||
@@ -223,6 +230,7 @@ export default class AlertFeed extends BaseModel {
|
||||
Permission.ProjectAdmin,
|
||||
Permission.ProjectMember,
|
||||
Permission.ReadAlertFeed,
|
||||
Permission.ReadAllProjectResources,
|
||||
],
|
||||
update: [],
|
||||
})
|
||||
@@ -260,6 +268,7 @@ export default class AlertFeed extends BaseModel {
|
||||
Permission.ProjectAdmin,
|
||||
Permission.ProjectMember,
|
||||
Permission.ReadAlertFeed,
|
||||
Permission.ReadAllProjectResources,
|
||||
],
|
||||
update: [],
|
||||
})
|
||||
@@ -335,6 +344,7 @@ export default class AlertFeed extends BaseModel {
|
||||
Permission.ProjectAdmin,
|
||||
Permission.ProjectMember,
|
||||
Permission.ReadAlertFeed,
|
||||
Permission.ReadAllProjectResources,
|
||||
],
|
||||
update: [],
|
||||
})
|
||||
@@ -365,6 +375,7 @@ export default class AlertFeed extends BaseModel {
|
||||
Permission.ProjectAdmin,
|
||||
Permission.ProjectMember,
|
||||
Permission.ReadAlertFeed,
|
||||
Permission.ReadAllProjectResources,
|
||||
],
|
||||
update: [],
|
||||
})
|
||||
@@ -393,6 +404,7 @@ export default class AlertFeed extends BaseModel {
|
||||
Permission.ProjectAdmin,
|
||||
Permission.ProjectMember,
|
||||
Permission.ReadAlertFeed,
|
||||
Permission.ReadAllProjectResources,
|
||||
],
|
||||
update: [],
|
||||
})
|
||||
@@ -422,6 +434,7 @@ export default class AlertFeed extends BaseModel {
|
||||
Permission.ProjectAdmin,
|
||||
Permission.ProjectMember,
|
||||
Permission.ReadAlertFeed,
|
||||
Permission.ReadAllProjectResources,
|
||||
],
|
||||
update: [],
|
||||
})
|
||||
@@ -454,6 +467,7 @@ export default class AlertFeed extends BaseModel {
|
||||
Permission.ProjectAdmin,
|
||||
Permission.ProjectMember,
|
||||
Permission.ReadAlertFeed,
|
||||
Permission.ReadAllProjectResources,
|
||||
],
|
||||
update: [],
|
||||
})
|
||||
@@ -491,6 +505,7 @@ export default class AlertFeed extends BaseModel {
|
||||
Permission.ProjectAdmin,
|
||||
Permission.ProjectMember,
|
||||
Permission.ReadAlertFeed,
|
||||
Permission.ReadAllProjectResources,
|
||||
],
|
||||
update: [],
|
||||
})
|
||||
@@ -520,6 +535,7 @@ export default class AlertFeed extends BaseModel {
|
||||
Permission.ProjectAdmin,
|
||||
Permission.ProjectMember,
|
||||
Permission.ReadAlertFeed,
|
||||
Permission.ReadAllProjectResources,
|
||||
],
|
||||
update: [],
|
||||
})
|
||||
|
||||
1610
Common/Models/DatabaseModels/AlertGroupingRule.ts
Normal file
1610
Common/Models/DatabaseModels/AlertGroupingRule.ts
Normal file
File diff suppressed because it is too large
Load Diff
@@ -43,6 +43,7 @@ import {
|
||||
Permission.ProjectAdmin,
|
||||
Permission.ProjectMember,
|
||||
Permission.ReadAlertInternalNote,
|
||||
Permission.ReadAllProjectResources,
|
||||
],
|
||||
delete: [
|
||||
Permission.ProjectOwner,
|
||||
@@ -87,6 +88,7 @@ export default class AlertInternalNote extends BaseModel {
|
||||
Permission.ProjectAdmin,
|
||||
Permission.ProjectMember,
|
||||
Permission.ReadAlertInternalNote,
|
||||
Permission.ReadAllProjectResources,
|
||||
],
|
||||
update: [],
|
||||
})
|
||||
@@ -123,6 +125,7 @@ export default class AlertInternalNote extends BaseModel {
|
||||
Permission.ProjectAdmin,
|
||||
Permission.ProjectMember,
|
||||
Permission.ReadAlertInternalNote,
|
||||
Permission.ReadAllProjectResources,
|
||||
],
|
||||
update: [],
|
||||
})
|
||||
@@ -154,6 +157,7 @@ export default class AlertInternalNote extends BaseModel {
|
||||
Permission.ProjectAdmin,
|
||||
Permission.ProjectMember,
|
||||
Permission.ReadAlertInternalNote,
|
||||
Permission.ReadAllProjectResources,
|
||||
],
|
||||
update: [],
|
||||
})
|
||||
@@ -190,6 +194,7 @@ export default class AlertInternalNote extends BaseModel {
|
||||
Permission.ProjectAdmin,
|
||||
Permission.ProjectMember,
|
||||
Permission.ReadAlertInternalNote,
|
||||
Permission.ReadAllProjectResources,
|
||||
],
|
||||
update: [],
|
||||
})
|
||||
@@ -220,6 +225,7 @@ export default class AlertInternalNote extends BaseModel {
|
||||
Permission.ProjectAdmin,
|
||||
Permission.ProjectMember,
|
||||
Permission.ReadAlertInternalNote,
|
||||
Permission.ReadAllProjectResources,
|
||||
],
|
||||
update: [],
|
||||
})
|
||||
@@ -257,6 +263,7 @@ export default class AlertInternalNote extends BaseModel {
|
||||
Permission.ProjectAdmin,
|
||||
Permission.ProjectMember,
|
||||
Permission.ReadAlertInternalNote,
|
||||
Permission.ReadAllProjectResources,
|
||||
],
|
||||
update: [],
|
||||
})
|
||||
@@ -333,6 +340,7 @@ export default class AlertInternalNote extends BaseModel {
|
||||
Permission.ProjectAdmin,
|
||||
Permission.ProjectMember,
|
||||
Permission.ReadAlertInternalNote,
|
||||
Permission.ReadAllProjectResources,
|
||||
],
|
||||
update: [
|
||||
Permission.ProjectOwner,
|
||||
@@ -367,6 +375,7 @@ export default class AlertInternalNote extends BaseModel {
|
||||
Permission.ProjectAdmin,
|
||||
Permission.ProjectMember,
|
||||
Permission.ReadAlertInternalNote,
|
||||
Permission.ReadAllProjectResources,
|
||||
],
|
||||
update: [
|
||||
Permission.ProjectOwner,
|
||||
@@ -410,6 +419,7 @@ export default class AlertInternalNote extends BaseModel {
|
||||
Permission.ProjectAdmin,
|
||||
Permission.ProjectMember,
|
||||
Permission.ReadAlertInternalNote,
|
||||
Permission.ReadAllProjectResources,
|
||||
],
|
||||
update: [],
|
||||
})
|
||||
@@ -443,6 +453,7 @@ export default class AlertInternalNote extends BaseModel {
|
||||
Permission.ProjectAdmin,
|
||||
Permission.ProjectMember,
|
||||
Permission.ReadAlertInternalNote,
|
||||
Permission.ReadAllProjectResources,
|
||||
],
|
||||
update: [],
|
||||
})
|
||||
|
||||
@@ -40,6 +40,7 @@ import { PlanType } from "../../Types/Billing/SubscriptionPlan";
|
||||
Permission.ProjectAdmin,
|
||||
Permission.ProjectMember,
|
||||
Permission.ReadAlertNoteTemplate,
|
||||
Permission.ReadAllProjectResources,
|
||||
],
|
||||
delete: [
|
||||
Permission.ProjectOwner,
|
||||
@@ -84,6 +85,7 @@ export default class AlertNoteTemplate extends BaseModel {
|
||||
Permission.ProjectAdmin,
|
||||
Permission.ProjectMember,
|
||||
Permission.ReadAlertNoteTemplate,
|
||||
Permission.ReadAllProjectResources,
|
||||
],
|
||||
update: [],
|
||||
})
|
||||
@@ -121,6 +123,7 @@ export default class AlertNoteTemplate extends BaseModel {
|
||||
Permission.ProjectAdmin,
|
||||
Permission.ProjectMember,
|
||||
Permission.ReadAlertNoteTemplate,
|
||||
Permission.ReadAllProjectResources,
|
||||
],
|
||||
update: [],
|
||||
})
|
||||
@@ -152,6 +155,7 @@ export default class AlertNoteTemplate extends BaseModel {
|
||||
Permission.ProjectAdmin,
|
||||
Permission.ProjectMember,
|
||||
Permission.ReadAlertNoteTemplate,
|
||||
Permission.ReadAllProjectResources,
|
||||
],
|
||||
update: [
|
||||
Permission.ProjectOwner,
|
||||
@@ -188,6 +192,7 @@ export default class AlertNoteTemplate extends BaseModel {
|
||||
Permission.ProjectAdmin,
|
||||
Permission.ProjectMember,
|
||||
Permission.ReadAlertNoteTemplate,
|
||||
Permission.ReadAllProjectResources,
|
||||
],
|
||||
update: [
|
||||
Permission.ProjectOwner,
|
||||
@@ -223,6 +228,7 @@ export default class AlertNoteTemplate extends BaseModel {
|
||||
Permission.ProjectAdmin,
|
||||
Permission.ProjectMember,
|
||||
Permission.ReadAlertNoteTemplate,
|
||||
Permission.ReadAllProjectResources,
|
||||
],
|
||||
update: [
|
||||
Permission.ProjectOwner,
|
||||
@@ -259,6 +265,7 @@ export default class AlertNoteTemplate extends BaseModel {
|
||||
Permission.ProjectAdmin,
|
||||
Permission.ProjectMember,
|
||||
Permission.ReadAlertNoteTemplate,
|
||||
Permission.ReadAllProjectResources,
|
||||
],
|
||||
update: [],
|
||||
})
|
||||
@@ -297,6 +304,7 @@ export default class AlertNoteTemplate extends BaseModel {
|
||||
Permission.ProjectAdmin,
|
||||
Permission.ProjectMember,
|
||||
Permission.ReadAlertNoteTemplate,
|
||||
Permission.ReadAllProjectResources,
|
||||
],
|
||||
update: [],
|
||||
})
|
||||
|
||||
@@ -33,6 +33,7 @@ import { Column, Entity, Index, JoinColumn, ManyToOne } from "typeorm";
|
||||
Permission.ProjectAdmin,
|
||||
Permission.ProjectMember,
|
||||
Permission.ReadAlertOwnerTeam,
|
||||
Permission.ReadAllProjectResources,
|
||||
],
|
||||
delete: [
|
||||
Permission.ProjectOwner,
|
||||
@@ -78,6 +79,7 @@ export default class AlertOwnerTeam extends BaseModel {
|
||||
Permission.ProjectAdmin,
|
||||
Permission.ProjectMember,
|
||||
Permission.ReadAlertOwnerTeam,
|
||||
Permission.ReadAllProjectResources,
|
||||
],
|
||||
update: [],
|
||||
})
|
||||
@@ -115,6 +117,7 @@ export default class AlertOwnerTeam extends BaseModel {
|
||||
Permission.ProjectAdmin,
|
||||
Permission.ProjectMember,
|
||||
Permission.ReadAlertOwnerTeam,
|
||||
Permission.ReadAllProjectResources,
|
||||
],
|
||||
update: [],
|
||||
})
|
||||
@@ -146,6 +149,7 @@ export default class AlertOwnerTeam extends BaseModel {
|
||||
Permission.ProjectAdmin,
|
||||
Permission.ProjectMember,
|
||||
Permission.ReadAlertOwnerTeam,
|
||||
Permission.ReadAllProjectResources,
|
||||
],
|
||||
update: [],
|
||||
})
|
||||
@@ -184,6 +188,7 @@ export default class AlertOwnerTeam extends BaseModel {
|
||||
Permission.ProjectAdmin,
|
||||
Permission.ProjectMember,
|
||||
Permission.ReadAlertOwnerTeam,
|
||||
Permission.ReadAllProjectResources,
|
||||
],
|
||||
update: [],
|
||||
})
|
||||
@@ -215,6 +220,7 @@ export default class AlertOwnerTeam extends BaseModel {
|
||||
Permission.ProjectAdmin,
|
||||
Permission.ProjectMember,
|
||||
Permission.ReadAlertOwnerTeam,
|
||||
Permission.ReadAllProjectResources,
|
||||
],
|
||||
update: [],
|
||||
})
|
||||
@@ -252,6 +258,7 @@ export default class AlertOwnerTeam extends BaseModel {
|
||||
Permission.ProjectAdmin,
|
||||
Permission.ProjectMember,
|
||||
Permission.ReadAlertOwnerTeam,
|
||||
Permission.ReadAllProjectResources,
|
||||
],
|
||||
update: [],
|
||||
})
|
||||
@@ -283,6 +290,7 @@ export default class AlertOwnerTeam extends BaseModel {
|
||||
Permission.ProjectAdmin,
|
||||
Permission.ProjectMember,
|
||||
Permission.ReadAlertOwnerTeam,
|
||||
Permission.ReadAllProjectResources,
|
||||
],
|
||||
update: [],
|
||||
})
|
||||
@@ -321,6 +329,7 @@ export default class AlertOwnerTeam extends BaseModel {
|
||||
Permission.ProjectAdmin,
|
||||
Permission.ProjectMember,
|
||||
Permission.ReadAlertOwnerTeam,
|
||||
Permission.ReadAllProjectResources,
|
||||
],
|
||||
update: [],
|
||||
})
|
||||
@@ -345,6 +354,7 @@ export default class AlertOwnerTeam extends BaseModel {
|
||||
Permission.ProjectAdmin,
|
||||
Permission.ProjectMember,
|
||||
Permission.ReadAlertOwnerTeam,
|
||||
Permission.ReadAllProjectResources,
|
||||
],
|
||||
update: [],
|
||||
})
|
||||
@@ -379,6 +389,7 @@ export default class AlertOwnerTeam extends BaseModel {
|
||||
Permission.ProjectAdmin,
|
||||
Permission.ProjectMember,
|
||||
Permission.ReadAlertOwnerTeam,
|
||||
Permission.ReadAllProjectResources,
|
||||
],
|
||||
update: [],
|
||||
})
|
||||
@@ -408,6 +419,7 @@ export default class AlertOwnerTeam extends BaseModel {
|
||||
Permission.ProjectAdmin,
|
||||
Permission.ProjectMember,
|
||||
Permission.ReadAlertOwnerTeam,
|
||||
Permission.ReadAllProjectResources,
|
||||
],
|
||||
update: [],
|
||||
})
|
||||
|
||||
@@ -32,6 +32,7 @@ import { Column, Entity, Index, JoinColumn, ManyToOne } from "typeorm";
|
||||
Permission.ProjectAdmin,
|
||||
Permission.ProjectMember,
|
||||
Permission.ReadAlertOwnerUser,
|
||||
Permission.ReadAllProjectResources,
|
||||
],
|
||||
delete: [
|
||||
Permission.ProjectOwner,
|
||||
@@ -77,6 +78,7 @@ export default class AlertOwnerUser extends BaseModel {
|
||||
Permission.ProjectAdmin,
|
||||
Permission.ProjectMember,
|
||||
Permission.ReadAlertOwnerUser,
|
||||
Permission.ReadAllProjectResources,
|
||||
],
|
||||
update: [],
|
||||
})
|
||||
@@ -114,6 +116,7 @@ export default class AlertOwnerUser extends BaseModel {
|
||||
Permission.ProjectAdmin,
|
||||
Permission.ProjectMember,
|
||||
Permission.ReadAlertOwnerUser,
|
||||
Permission.ReadAllProjectResources,
|
||||
],
|
||||
update: [],
|
||||
})
|
||||
@@ -145,6 +148,7 @@ export default class AlertOwnerUser extends BaseModel {
|
||||
Permission.ProjectAdmin,
|
||||
Permission.ProjectMember,
|
||||
Permission.ReadAlertOwnerUser,
|
||||
Permission.ReadAllProjectResources,
|
||||
],
|
||||
update: [],
|
||||
})
|
||||
@@ -183,6 +187,7 @@ export default class AlertOwnerUser extends BaseModel {
|
||||
Permission.ProjectAdmin,
|
||||
Permission.ProjectMember,
|
||||
Permission.ReadAlertOwnerUser,
|
||||
Permission.ReadAllProjectResources,
|
||||
],
|
||||
update: [],
|
||||
})
|
||||
@@ -214,6 +219,7 @@ export default class AlertOwnerUser extends BaseModel {
|
||||
Permission.ProjectAdmin,
|
||||
Permission.ProjectMember,
|
||||
Permission.ReadAlertOwnerUser,
|
||||
Permission.ReadAllProjectResources,
|
||||
],
|
||||
update: [],
|
||||
})
|
||||
@@ -251,6 +257,7 @@ export default class AlertOwnerUser extends BaseModel {
|
||||
Permission.ProjectAdmin,
|
||||
Permission.ProjectMember,
|
||||
Permission.ReadAlertOwnerUser,
|
||||
Permission.ReadAllProjectResources,
|
||||
],
|
||||
update: [],
|
||||
})
|
||||
@@ -282,6 +289,7 @@ export default class AlertOwnerUser extends BaseModel {
|
||||
Permission.ProjectAdmin,
|
||||
Permission.ProjectMember,
|
||||
Permission.ReadAlertOwnerUser,
|
||||
Permission.ReadAllProjectResources,
|
||||
],
|
||||
update: [],
|
||||
})
|
||||
@@ -320,6 +328,7 @@ export default class AlertOwnerUser extends BaseModel {
|
||||
Permission.ProjectAdmin,
|
||||
Permission.ProjectMember,
|
||||
Permission.ReadAlertOwnerUser,
|
||||
Permission.ReadAllProjectResources,
|
||||
],
|
||||
update: [],
|
||||
})
|
||||
@@ -344,6 +353,7 @@ export default class AlertOwnerUser extends BaseModel {
|
||||
Permission.ProjectAdmin,
|
||||
Permission.ProjectMember,
|
||||
Permission.ReadAlertOwnerUser,
|
||||
Permission.ReadAllProjectResources,
|
||||
],
|
||||
update: [],
|
||||
})
|
||||
@@ -378,6 +388,7 @@ export default class AlertOwnerUser extends BaseModel {
|
||||
Permission.ProjectAdmin,
|
||||
Permission.ProjectMember,
|
||||
Permission.ReadAlertOwnerUser,
|
||||
Permission.ReadAllProjectResources,
|
||||
],
|
||||
update: [],
|
||||
})
|
||||
@@ -407,6 +418,7 @@ export default class AlertOwnerUser extends BaseModel {
|
||||
Permission.ProjectAdmin,
|
||||
Permission.ProjectMember,
|
||||
Permission.ReadAlertOwnerUser,
|
||||
Permission.ReadAllProjectResources,
|
||||
],
|
||||
update: [],
|
||||
})
|
||||
|
||||
@@ -44,6 +44,7 @@ import { Column, Entity, Index, JoinColumn, ManyToOne } from "typeorm";
|
||||
Permission.ProjectAdmin,
|
||||
Permission.ProjectMember,
|
||||
Permission.ReadAlertSeverity,
|
||||
Permission.ReadAllProjectResources,
|
||||
],
|
||||
delete: [
|
||||
Permission.ProjectOwner,
|
||||
@@ -91,6 +92,7 @@ export default class AlertSeverity extends BaseModel {
|
||||
Permission.ProjectAdmin,
|
||||
Permission.ProjectMember,
|
||||
Permission.ReadAlertSeverity,
|
||||
Permission.ReadAllProjectResources,
|
||||
],
|
||||
update: [],
|
||||
})
|
||||
@@ -127,6 +129,7 @@ export default class AlertSeverity extends BaseModel {
|
||||
Permission.ProjectAdmin,
|
||||
Permission.ProjectMember,
|
||||
Permission.ReadAlertSeverity,
|
||||
Permission.ReadAllProjectResources,
|
||||
],
|
||||
update: [],
|
||||
})
|
||||
@@ -158,6 +161,7 @@ export default class AlertSeverity extends BaseModel {
|
||||
Permission.ProjectAdmin,
|
||||
Permission.ProjectMember,
|
||||
Permission.ReadAlertSeverity,
|
||||
Permission.ReadAllProjectResources,
|
||||
],
|
||||
update: [
|
||||
Permission.ProjectOwner,
|
||||
@@ -189,6 +193,7 @@ export default class AlertSeverity extends BaseModel {
|
||||
Permission.ProjectAdmin,
|
||||
Permission.ProjectMember,
|
||||
Permission.ReadAlertSeverity,
|
||||
Permission.ReadAllProjectResources,
|
||||
],
|
||||
update: [],
|
||||
})
|
||||
@@ -219,6 +224,7 @@ export default class AlertSeverity extends BaseModel {
|
||||
Permission.ProjectAdmin,
|
||||
Permission.ProjectMember,
|
||||
Permission.ReadAlertSeverity,
|
||||
Permission.ReadAllProjectResources,
|
||||
],
|
||||
update: [
|
||||
Permission.ProjectOwner,
|
||||
@@ -254,6 +260,7 @@ export default class AlertSeverity extends BaseModel {
|
||||
Permission.ProjectAdmin,
|
||||
Permission.ProjectMember,
|
||||
Permission.ReadAlertSeverity,
|
||||
Permission.ReadAllProjectResources,
|
||||
],
|
||||
update: [],
|
||||
})
|
||||
@@ -291,6 +298,7 @@ export default class AlertSeverity extends BaseModel {
|
||||
Permission.ProjectAdmin,
|
||||
Permission.ProjectMember,
|
||||
Permission.ReadAlertSeverity,
|
||||
Permission.ReadAllProjectResources,
|
||||
],
|
||||
update: [],
|
||||
})
|
||||
@@ -314,6 +322,7 @@ export default class AlertSeverity extends BaseModel {
|
||||
Permission.ProjectAdmin,
|
||||
Permission.ProjectMember,
|
||||
Permission.ReadAlertSeverity,
|
||||
Permission.ReadAllProjectResources,
|
||||
],
|
||||
update: [],
|
||||
})
|
||||
@@ -347,6 +356,7 @@ export default class AlertSeverity extends BaseModel {
|
||||
Permission.ProjectAdmin,
|
||||
Permission.ProjectMember,
|
||||
Permission.ReadAlertSeverity,
|
||||
Permission.ReadAllProjectResources,
|
||||
],
|
||||
update: [],
|
||||
})
|
||||
@@ -375,6 +385,7 @@ export default class AlertSeverity extends BaseModel {
|
||||
Permission.ProjectAdmin,
|
||||
Permission.ProjectMember,
|
||||
Permission.ReadAlertSeverity,
|
||||
Permission.ReadAllProjectResources,
|
||||
],
|
||||
update: [
|
||||
Permission.ProjectOwner,
|
||||
@@ -414,6 +425,7 @@ export default class AlertSeverity extends BaseModel {
|
||||
Permission.ProjectAdmin,
|
||||
Permission.ProjectMember,
|
||||
Permission.ReadAlertSeverity,
|
||||
Permission.ReadAllProjectResources,
|
||||
],
|
||||
update: [
|
||||
Permission.ProjectOwner,
|
||||
|
||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user