@backstage-community/plugin-ilert 0.2.24 → 0.3.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +12 -0
- package/dist/ILertIcon.esm.js +61 -0
- package/dist/ILertIcon.esm.js.map +1 -0
- package/dist/api/client.esm.js +395 -0
- package/dist/api/client.esm.js.map +1 -0
- package/dist/components/Alert/AlertActionsMenu.esm.js +142 -0
- package/dist/components/Alert/AlertActionsMenu.esm.js.map +1 -0
- package/dist/components/Alert/AlertAssignModal.esm.js +147 -0
- package/dist/components/Alert/AlertAssignModal.esm.js.map +1 -0
- package/dist/components/Alert/AlertLink.esm.js +15 -0
- package/dist/components/Alert/AlertLink.esm.js.map +1 -0
- package/dist/components/Alert/AlertNewModal.esm.js +192 -0
- package/dist/components/Alert/AlertNewModal.esm.js.map +1 -0
- package/dist/components/AlertSource/AlertSourceLink.esm.js +49 -0
- package/dist/components/AlertSource/AlertSourceLink.esm.js.map +1 -0
- package/dist/components/AlertsPage/AlertsPage.esm.js +67 -0
- package/dist/components/AlertsPage/AlertsPage.esm.js.map +1 -0
- package/dist/components/AlertsPage/AlertsTable.esm.js +185 -0
- package/dist/components/AlertsPage/AlertsTable.esm.js.map +1 -0
- package/dist/components/AlertsPage/StatusChip.esm.js +47 -0
- package/dist/components/AlertsPage/StatusChip.esm.js.map +1 -0
- package/dist/components/AlertsPage/TableTitle.esm.js +74 -0
- package/dist/components/AlertsPage/TableTitle.esm.js.map +1 -0
- package/dist/components/Errors/MissingAuthorizationHeaderError.esm.js +24 -0
- package/dist/components/Errors/MissingAuthorizationHeaderError.esm.js.map +1 -0
- package/dist/components/ILertCard/ILertCard.esm.js +113 -0
- package/dist/components/ILertCard/ILertCard.esm.js.map +1 -0
- package/dist/components/ILertCard/ILertCardActionsHeader.esm.js +138 -0
- package/dist/components/ILertCard/ILertCardActionsHeader.esm.js.map +1 -0
- package/dist/components/ILertCard/ILertCardEmptyState.esm.js +57 -0
- package/dist/components/ILertCard/ILertCardEmptyState.esm.js.map +1 -0
- package/dist/components/ILertCard/ILertCardHeaderStatus.esm.js +29 -0
- package/dist/components/ILertCard/ILertCardHeaderStatus.esm.js.map +1 -0
- package/dist/components/ILertCard/ILertCardMaintenanceModal.esm.js +101 -0
- package/dist/components/ILertCard/ILertCardMaintenanceModal.esm.js.map +1 -0
- package/dist/components/ILertCard/ILertCardOnCall.esm.js +78 -0
- package/dist/components/ILertCard/ILertCardOnCall.esm.js.map +1 -0
- package/dist/components/ILertCard/ILertCardOnCallEmptyState.esm.js +26 -0
- package/dist/components/ILertCard/ILertCardOnCallEmptyState.esm.js.map +1 -0
- package/dist/components/ILertCard/ILertCardOnCallItem.esm.js +109 -0
- package/dist/components/ILertCard/ILertCardOnCallItem.esm.js.map +1 -0
- package/dist/components/ILertCard/index.esm.js +2 -0
- package/dist/components/ILertCard/index.esm.js.map +1 -0
- package/dist/components/ILertPage/ILertPage.esm.js +48 -0
- package/dist/components/ILertPage/ILertPage.esm.js.map +1 -0
- package/dist/components/OnCallSchedulesPage/OnCallSchedulesGrid.esm.js +135 -0
- package/dist/components/OnCallSchedulesPage/OnCallSchedulesGrid.esm.js.map +1 -0
- package/dist/components/OnCallSchedulesPage/OnCallSchedulesPage.esm.js +27 -0
- package/dist/components/OnCallSchedulesPage/OnCallSchedulesPage.esm.js.map +1 -0
- package/dist/components/OnCallSchedulesPage/OnCallShiftItem.esm.js +63 -0
- package/dist/components/OnCallSchedulesPage/OnCallShiftItem.esm.js.map +1 -0
- package/dist/components/Service/ServiceActionsMenu.esm.js +47 -0
- package/dist/components/Service/ServiceActionsMenu.esm.js.map +1 -0
- package/dist/components/Service/ServiceLink.esm.js +15 -0
- package/dist/components/Service/ServiceLink.esm.js.map +1 -0
- package/dist/components/ServicesPage/ServicesPage.esm.js +32 -0
- package/dist/components/ServicesPage/ServicesPage.esm.js.map +1 -0
- package/dist/components/ServicesPage/ServicesTable.esm.js +99 -0
- package/dist/components/ServicesPage/ServicesTable.esm.js.map +1 -0
- package/dist/components/ServicesPage/StatusChip.esm.js +67 -0
- package/dist/components/ServicesPage/StatusChip.esm.js.map +1 -0
- package/dist/components/Shift/ShiftOverrideModal.esm.js +171 -0
- package/dist/components/Shift/ShiftOverrideModal.esm.js.map +1 -0
- package/dist/components/StatusPage/StatusPageActionsMenu.esm.js +50 -0
- package/dist/components/StatusPage/StatusPageActionsMenu.esm.js.map +1 -0
- package/dist/components/StatusPage/StatusPageLink.esm.js +17 -0
- package/dist/components/StatusPage/StatusPageLink.esm.js.map +1 -0
- package/dist/components/StatusPage/StatusPageURL.esm.js +18 -0
- package/dist/components/StatusPage/StatusPageURL.esm.js.map +1 -0
- package/dist/components/StatusPagePage/StatusChip.esm.js +67 -0
- package/dist/components/StatusPagePage/StatusChip.esm.js.map +1 -0
- package/dist/components/StatusPagePage/StatusPagesPage.esm.js +32 -0
- package/dist/components/StatusPagePage/StatusPagesPage.esm.js.map +1 -0
- package/dist/components/StatusPagePage/StatusPagesTable.esm.js +115 -0
- package/dist/components/StatusPagePage/StatusPagesTable.esm.js.map +1 -0
- package/dist/components/StatusPagePage/VisibilityChip.esm.js +37 -0
- package/dist/components/StatusPagePage/VisibilityChip.esm.js.map +1 -0
- package/dist/components/index.esm.js +3 -0
- package/dist/components/index.esm.js.map +1 -0
- package/dist/constants.esm.js +4 -0
- package/dist/constants.esm.js.map +1 -0
- package/dist/hooks/index.esm.js +13 -0
- package/dist/hooks/index.esm.js.map +1 -0
- package/dist/hooks/useAlertActions.esm.js +43 -0
- package/dist/hooks/useAlertActions.esm.js.map +1 -0
- package/dist/hooks/useAlertSource.esm.js +52 -0
- package/dist/hooks/useAlertSource.esm.js.map +1 -0
- package/dist/hooks/useAlertSourceOnCalls.esm.js +47 -0
- package/dist/hooks/useAlertSourceOnCalls.esm.js.map +1 -0
- package/dist/hooks/useAlerts.esm.js +128 -0
- package/dist/hooks/useAlerts.esm.js.map +1 -0
- package/dist/hooks/useAssignAlert.esm.js +53 -0
- package/dist/hooks/useAssignAlert.esm.js.map +1 -0
- package/dist/hooks/useNewAlert.esm.js +58 -0
- package/dist/hooks/useNewAlert.esm.js.map +1 -0
- package/dist/hooks/useOnCallSchedules.esm.js +42 -0
- package/dist/hooks/useOnCallSchedules.esm.js.map +1 -0
- package/dist/hooks/useServices.esm.js +70 -0
- package/dist/hooks/useServices.esm.js.map +1 -0
- package/dist/hooks/useShiftOverride.esm.js +60 -0
- package/dist/hooks/useShiftOverride.esm.js.map +1 -0
- package/dist/hooks/useStatusPages.esm.js +72 -0
- package/dist/hooks/useStatusPages.esm.js.map +1 -0
- package/dist/index.d.ts +4 -2
- package/dist/index.esm.js +7 -3343
- package/dist/index.esm.js.map +1 -1
- package/dist/plugin.esm.js +39 -0
- package/dist/plugin.esm.js.map +1 -0
- package/dist/route-refs.esm.js +8 -0
- package/dist/route-refs.esm.js.map +1 -0
- package/dist/types.esm.js +13 -0
- package/dist/types.esm.js.map +1 -0
- package/package.json +12 -8
- package/dist/esm/index-D2_Gjvjx.esm.js +0 -58
- package/dist/esm/index-D2_Gjvjx.esm.js.map +0 -1
- package/dist/esm/index-aory7UQN.esm.js +0 -58
- package/dist/esm/index-aory7UQN.esm.js.map +0 -1
package/CHANGELOG.md
CHANGED
|
@@ -1,5 +1,17 @@
|
|
|
1
1
|
# @backstage-community/plugin-ilert
|
|
2
2
|
|
|
3
|
+
## 0.3.1
|
|
4
|
+
|
|
5
|
+
### Patch Changes
|
|
6
|
+
|
|
7
|
+
- 5b9f4a7: Backstage version bump to v1.29.2
|
|
8
|
+
|
|
9
|
+
## 0.3.0
|
|
10
|
+
|
|
11
|
+
### Minor Changes
|
|
12
|
+
|
|
13
|
+
- 1255628: **BREAKING**: `ILertClient` now requires the `fetchApi` to be passed in. This lets the plugin work safely with the upcoming `proxy-backend` [security changes](https://github.com/backstage/backstage/pull/24643).
|
|
14
|
+
|
|
3
15
|
## 0.2.24
|
|
4
16
|
|
|
5
17
|
### Patch Changes
|
|
@@ -0,0 +1,61 @@
|
|
|
1
|
+
import React from 'react';
|
|
2
|
+
import SvgIcon from '@material-ui/core/SvgIcon';
|
|
3
|
+
|
|
4
|
+
const ILertIcon = () => /* @__PURE__ */ React.createElement(SvgIcon, null, /* @__PURE__ */ React.createElement("g", null, /* @__PURE__ */ React.createElement(
|
|
5
|
+
"path",
|
|
6
|
+
{
|
|
7
|
+
stroke: "none",
|
|
8
|
+
fillRule: "nonzero",
|
|
9
|
+
fill: "#fff",
|
|
10
|
+
fillOpacity: "1",
|
|
11
|
+
d: "M 0 9.277344 L 0 18.574219 C 0 20.832031 1.847656 22.679688 4.105469 22.679688 L 12.582031 22.679688 C 6.21875 21.007812 1.277344 15.792969 0 9.277344 Z M 0 9.277344"
|
|
12
|
+
}
|
|
13
|
+
), /* @__PURE__ */ React.createElement(
|
|
14
|
+
"path",
|
|
15
|
+
{
|
|
16
|
+
stroke: "none",
|
|
17
|
+
fillRule: "nonzero",
|
|
18
|
+
fill: "#fff",
|
|
19
|
+
fillOpacity: "1",
|
|
20
|
+
d: "M 19.527344 22.5625 C 21.328125 22.128906 22.679688 20.503906 22.679688 18.574219 L 22.679688 16.273438 C 21.691406 16.820312 20.632812 17.222656 19.527344 17.46875 Z M 19.527344 22.5625"
|
|
21
|
+
}
|
|
22
|
+
), /* @__PURE__ */ React.createElement(
|
|
23
|
+
"path",
|
|
24
|
+
{
|
|
25
|
+
stroke: "none",
|
|
26
|
+
fillRule: "nonzero",
|
|
27
|
+
fill: "#fff",
|
|
28
|
+
fillOpacity: "1",
|
|
29
|
+
d: "M 14.417969 17.46875 C 9.136719 16.296875 5.171875 11.578125 5.171875 5.945312 C 5.167969 3.855469 5.726562 1.804688 6.785156 0 L 4.105469 0 C 1.847656 0 0 1.847656 0 4.105469 L 0 6.882812 C 0.433594 14.816406 6.335938 21.316406 13.992188 22.679688 L 14.421875 22.679688 Z M 14.417969 17.46875"
|
|
30
|
+
}
|
|
31
|
+
), /* @__PURE__ */ React.createElement(
|
|
32
|
+
"path",
|
|
33
|
+
{
|
|
34
|
+
stroke: "none",
|
|
35
|
+
fillRule: "nonzero",
|
|
36
|
+
fill: "#fff",
|
|
37
|
+
fillOpacity: "1",
|
|
38
|
+
d: "M 19.527344 12.375 L 19.527344 17.160156 C 20.632812 16.910156 21.695312 16.496094 22.679688 15.929688 L 22.679688 9.855469 C 21.902344 10.988281 20.804688 11.863281 19.527344 12.375 Z M 19.527344 12.375"
|
|
39
|
+
}
|
|
40
|
+
), /* @__PURE__ */ React.createElement(
|
|
41
|
+
"path",
|
|
42
|
+
{
|
|
43
|
+
stroke: "none",
|
|
44
|
+
fillRule: "nonzero",
|
|
45
|
+
fill: "#fff",
|
|
46
|
+
fillOpacity: "1",
|
|
47
|
+
d: "M 14.417969 17.160156 L 14.417969 12.375 C 11.863281 11.355469 10.054688 8.859375 10.054688 5.945312 C 10.054688 3.503906 11.34375 1.246094 13.441406 0 L 7.128906 0 C 6.039062 1.792969 5.464844 3.847656 5.46875 5.945312 C 5.46875 11.410156 9.300781 15.996094 14.417969 17.160156 Z M 14.417969 17.160156"
|
|
48
|
+
}
|
|
49
|
+
), /* @__PURE__ */ React.createElement(
|
|
50
|
+
"path",
|
|
51
|
+
{
|
|
52
|
+
stroke: "none",
|
|
53
|
+
fillRule: "nonzero",
|
|
54
|
+
fill: "#fff",
|
|
55
|
+
fillOpacity: "1",
|
|
56
|
+
d: "M 10.355469 5.945312 C 10.355469 8.613281 11.957031 11.019531 14.417969 12.050781 L 14.417969 9.917969 C 15.972656 10.925781 17.972656 10.925781 19.527344 9.917969 L 19.527344 12.050781 C 20.847656 11.496094 21.953125 10.53125 22.679688 9.300781 L 22.679688 4.105469 C 22.679688 1.847656 20.832031 0 18.574219 0 L 14.066406 0 C 11.796875 1.113281 10.355469 3.417969 10.355469 5.945312 Z M 16.972656 2.5625 C 18.84375 2.5625 20.355469 4.078125 20.355469 5.945312 C 20.355469 7.8125 18.84375 9.328125 16.972656 9.328125 C 15.105469 9.328125 13.589844 7.8125 13.589844 5.945312 C 13.59375 4.078125 15.105469 2.566406 16.972656 2.5625 Z M 16.972656 2.5625"
|
|
57
|
+
}
|
|
58
|
+
)));
|
|
59
|
+
|
|
60
|
+
export { ILertIcon };
|
|
61
|
+
//# sourceMappingURL=ILertIcon.esm.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ILertIcon.esm.js","sources":["../src/ILertIcon.tsx"],"sourcesContent":["/*\n * Copyright 2022 The Backstage Authors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport React from 'react';\nimport SvgIcon from '@material-ui/core/SvgIcon';\nimport { IconComponent } from '@backstage/core-plugin-api';\n\n/**\n * @public\n */\nexport const ILertIcon: IconComponent = () => (\n <SvgIcon>\n <g>\n <path\n stroke=\"none\"\n fillRule=\"nonzero\"\n fill=\"#fff\"\n fillOpacity=\"1\"\n d=\"M 0 9.277344 L 0 18.574219 C 0 20.832031 1.847656 22.679688 4.105469 22.679688 L 12.582031 22.679688 C 6.21875 21.007812 1.277344 15.792969 0 9.277344 Z M 0 9.277344\"\n />\n <path\n stroke=\"none\"\n fillRule=\"nonzero\"\n fill=\"#fff\"\n fillOpacity=\"1\"\n d=\"M 19.527344 22.5625 C 21.328125 22.128906 22.679688 20.503906 22.679688 18.574219 L 22.679688 16.273438 C 21.691406 16.820312 20.632812 17.222656 19.527344 17.46875 Z M 19.527344 22.5625\"\n />\n <path\n stroke=\"none\"\n fillRule=\"nonzero\"\n fill=\"#fff\"\n fillOpacity=\"1\"\n d=\"M 14.417969 17.46875 C 9.136719 16.296875 5.171875 11.578125 5.171875 5.945312 C 5.167969 3.855469 5.726562 1.804688 6.785156 0 L 4.105469 0 C 1.847656 0 0 1.847656 0 4.105469 L 0 6.882812 C 0.433594 14.816406 6.335938 21.316406 13.992188 22.679688 L 14.421875 22.679688 Z M 14.417969 17.46875\"\n />\n <path\n stroke=\"none\"\n fillRule=\"nonzero\"\n fill=\"#fff\"\n fillOpacity=\"1\"\n d=\"M 19.527344 12.375 L 19.527344 17.160156 C 20.632812 16.910156 21.695312 16.496094 22.679688 15.929688 L 22.679688 9.855469 C 21.902344 10.988281 20.804688 11.863281 19.527344 12.375 Z M 19.527344 12.375\"\n />\n <path\n stroke=\"none\"\n fillRule=\"nonzero\"\n fill=\"#fff\"\n fillOpacity=\"1\"\n d=\"M 14.417969 17.160156 L 14.417969 12.375 C 11.863281 11.355469 10.054688 8.859375 10.054688 5.945312 C 10.054688 3.503906 11.34375 1.246094 13.441406 0 L 7.128906 0 C 6.039062 1.792969 5.464844 3.847656 5.46875 5.945312 C 5.46875 11.410156 9.300781 15.996094 14.417969 17.160156 Z M 14.417969 17.160156\"\n />\n <path\n stroke=\"none\"\n fillRule=\"nonzero\"\n fill=\"#fff\"\n fillOpacity=\"1\"\n d=\"M 10.355469 5.945312 C 10.355469 8.613281 11.957031 11.019531 14.417969 12.050781 L 14.417969 9.917969 C 15.972656 10.925781 17.972656 10.925781 19.527344 9.917969 L 19.527344 12.050781 C 20.847656 11.496094 21.953125 10.53125 22.679688 9.300781 L 22.679688 4.105469 C 22.679688 1.847656 20.832031 0 18.574219 0 L 14.066406 0 C 11.796875 1.113281 10.355469 3.417969 10.355469 5.945312 Z M 16.972656 2.5625 C 18.84375 2.5625 20.355469 4.078125 20.355469 5.945312 C 20.355469 7.8125 18.84375 9.328125 16.972656 9.328125 C 15.105469 9.328125 13.589844 7.8125 13.589844 5.945312 C 13.59375 4.078125 15.105469 2.566406 16.972656 2.5625 Z M 16.972656 2.5625\"\n />\n </g>\n </SvgIcon>\n);\n"],"names":[],"mappings":";;;AAuBO,MAAM,SAA2B,GAAA,sBACrC,KAAA,CAAA,aAAA,CAAA,OAAA,EAAA,IAAA,sCACE,GACC,EAAA,IAAA,kBAAA,KAAA,CAAA,aAAA;AAAA,EAAC,MAAA;AAAA,EAAA;AAAA,IACC,MAAO,EAAA,MAAA;AAAA,IACP,QAAS,EAAA,SAAA;AAAA,IACT,IAAK,EAAA,MAAA;AAAA,IACL,WAAY,EAAA,GAAA;AAAA,IACZ,CAAE,EAAA,uKAAA;AAAA,GAAA;AACJ,CACA,kBAAA,KAAA,CAAA,aAAA;AAAA,EAAC,MAAA;AAAA,EAAA;AAAA,IACC,MAAO,EAAA,MAAA;AAAA,IACP,QAAS,EAAA,SAAA;AAAA,IACT,IAAK,EAAA,MAAA;AAAA,IACL,WAAY,EAAA,GAAA;AAAA,IACZ,CAAE,EAAA,4LAAA;AAAA,GAAA;AACJ,CACA,kBAAA,KAAA,CAAA,aAAA;AAAA,EAAC,MAAA;AAAA,EAAA;AAAA,IACC,MAAO,EAAA,MAAA;AAAA,IACP,QAAS,EAAA,SAAA;AAAA,IACT,IAAK,EAAA,MAAA;AAAA,IACL,WAAY,EAAA,GAAA;AAAA,IACZ,CAAE,EAAA,uSAAA;AAAA,GAAA;AACJ,CACA,kBAAA,KAAA,CAAA,aAAA;AAAA,EAAC,MAAA;AAAA,EAAA;AAAA,IACC,MAAO,EAAA,MAAA;AAAA,IACP,QAAS,EAAA,SAAA;AAAA,IACT,IAAK,EAAA,MAAA;AAAA,IACL,WAAY,EAAA,GAAA;AAAA,IACZ,CAAE,EAAA,6MAAA;AAAA,GAAA;AACJ,CACA,kBAAA,KAAA,CAAA,aAAA;AAAA,EAAC,MAAA;AAAA,EAAA;AAAA,IACC,MAAO,EAAA,MAAA;AAAA,IACP,QAAS,EAAA,SAAA;AAAA,IACT,IAAK,EAAA,MAAA;AAAA,IACL,WAAY,EAAA,GAAA;AAAA,IACZ,CAAE,EAAA,gTAAA;AAAA,GAAA;AACJ,CACA,kBAAA,KAAA,CAAA,aAAA;AAAA,EAAC,MAAA;AAAA,EAAA;AAAA,IACC,MAAO,EAAA,MAAA;AAAA,IACP,QAAS,EAAA,SAAA;AAAA,IACT,IAAK,EAAA,MAAA;AAAA,IACL,WAAY,EAAA,GAAA;AAAA,IACZ,CAAE,EAAA,6oBAAA;AAAA,GAAA;AACJ,CACF,CACF;;;;"}
|
|
@@ -0,0 +1,395 @@
|
|
|
1
|
+
import { createApiRef } from '@backstage/core-plugin-api';
|
|
2
|
+
import { AuthenticationError, ResponseError } from '@backstage/errors';
|
|
3
|
+
import { DateTime } from 'luxon';
|
|
4
|
+
|
|
5
|
+
const ilertApiRef = createApiRef({
|
|
6
|
+
id: "plugin.ilert.service"
|
|
7
|
+
});
|
|
8
|
+
const DEFAULT_PROXY_PATH = "/ilert";
|
|
9
|
+
const JSON_HEADERS = {
|
|
10
|
+
"Content-Type": "application/json",
|
|
11
|
+
Accept: "application/json"
|
|
12
|
+
};
|
|
13
|
+
class ILertClient {
|
|
14
|
+
discoveryApi;
|
|
15
|
+
fetchApi;
|
|
16
|
+
proxyPath;
|
|
17
|
+
baseUrl;
|
|
18
|
+
static fromConfig(configApi, discoveryApi, fetchApi) {
|
|
19
|
+
const baseUrl = configApi.getOptionalString("ilert.baseUrl") ?? "https://app.ilert.com";
|
|
20
|
+
return new ILertClient({
|
|
21
|
+
discoveryApi,
|
|
22
|
+
fetchApi,
|
|
23
|
+
baseUrl,
|
|
24
|
+
proxyPath: configApi.getOptionalString("ilert.proxyPath") ?? DEFAULT_PROXY_PATH
|
|
25
|
+
});
|
|
26
|
+
}
|
|
27
|
+
constructor(opts) {
|
|
28
|
+
this.discoveryApi = opts.discoveryApi;
|
|
29
|
+
this.fetchApi = opts.fetchApi;
|
|
30
|
+
this.baseUrl = opts.baseUrl;
|
|
31
|
+
this.proxyPath = opts.proxyPath;
|
|
32
|
+
}
|
|
33
|
+
async fetch(input, init) {
|
|
34
|
+
const apiUrl = await this.apiUrl();
|
|
35
|
+
const response = await this.fetchApi.fetch(`${apiUrl}${input}`, init);
|
|
36
|
+
if (response.status === 401) {
|
|
37
|
+
throw new AuthenticationError(
|
|
38
|
+
"This request requires HTTP authentication."
|
|
39
|
+
);
|
|
40
|
+
}
|
|
41
|
+
if (!response.ok || response.status >= 400) {
|
|
42
|
+
throw await ResponseError.fromResponse(response);
|
|
43
|
+
}
|
|
44
|
+
return await response.json();
|
|
45
|
+
}
|
|
46
|
+
async fetchAlerts(opts) {
|
|
47
|
+
const init = {
|
|
48
|
+
headers: JSON_HEADERS
|
|
49
|
+
};
|
|
50
|
+
const query = new URLSearchParams();
|
|
51
|
+
if (opts?.maxResults !== void 0) {
|
|
52
|
+
query.append("max-results", String(opts.maxResults));
|
|
53
|
+
}
|
|
54
|
+
if (opts?.startIndex !== void 0) {
|
|
55
|
+
query.append("start-index", String(opts.startIndex));
|
|
56
|
+
}
|
|
57
|
+
if (opts?.alertSources !== void 0 && Array.isArray(opts.alertSources)) {
|
|
58
|
+
opts.alertSources.forEach((a) => {
|
|
59
|
+
if (a) {
|
|
60
|
+
query.append("alert-source", String(a));
|
|
61
|
+
}
|
|
62
|
+
});
|
|
63
|
+
}
|
|
64
|
+
if (opts?.states !== void 0 && Array.isArray(opts.states)) {
|
|
65
|
+
opts.states.forEach((state) => {
|
|
66
|
+
query.append("state", state);
|
|
67
|
+
});
|
|
68
|
+
}
|
|
69
|
+
const response = await this.fetch(`/api/alerts?${query.toString()}`, init);
|
|
70
|
+
return response;
|
|
71
|
+
}
|
|
72
|
+
async fetchAlertsCount(opts) {
|
|
73
|
+
const init = {
|
|
74
|
+
headers: JSON_HEADERS
|
|
75
|
+
};
|
|
76
|
+
const query = new URLSearchParams();
|
|
77
|
+
if (opts && opts.states && Array.isArray(opts.states)) {
|
|
78
|
+
opts.states.forEach((state) => {
|
|
79
|
+
query.append("state", state);
|
|
80
|
+
});
|
|
81
|
+
}
|
|
82
|
+
const response = await this.fetch(
|
|
83
|
+
`/api/alerts/count?${query.toString()}`,
|
|
84
|
+
init
|
|
85
|
+
);
|
|
86
|
+
return response && response.count ? response.count : 0;
|
|
87
|
+
}
|
|
88
|
+
async fetchAlert(id) {
|
|
89
|
+
const init = {
|
|
90
|
+
headers: JSON_HEADERS
|
|
91
|
+
};
|
|
92
|
+
const response = await this.fetch(
|
|
93
|
+
`/api/alerts/${encodeURIComponent(id)}`,
|
|
94
|
+
init
|
|
95
|
+
);
|
|
96
|
+
return response;
|
|
97
|
+
}
|
|
98
|
+
async fetchAlertResponders(alert) {
|
|
99
|
+
const init = {
|
|
100
|
+
headers: JSON_HEADERS
|
|
101
|
+
};
|
|
102
|
+
const response = await this.fetch(
|
|
103
|
+
`/api/alerts/${encodeURIComponent(alert.id)}/responders`,
|
|
104
|
+
init
|
|
105
|
+
);
|
|
106
|
+
return response;
|
|
107
|
+
}
|
|
108
|
+
async fetchAlertActions(alert) {
|
|
109
|
+
const init = {
|
|
110
|
+
headers: JSON_HEADERS
|
|
111
|
+
};
|
|
112
|
+
const response = await this.fetch(
|
|
113
|
+
`/api/alerts/${encodeURIComponent(alert.id)}/actions`,
|
|
114
|
+
init
|
|
115
|
+
);
|
|
116
|
+
return response;
|
|
117
|
+
}
|
|
118
|
+
async acceptAlert(alert, userName) {
|
|
119
|
+
const init = {
|
|
120
|
+
method: "POST",
|
|
121
|
+
headers: JSON_HEADERS,
|
|
122
|
+
body: JSON.stringify({
|
|
123
|
+
apiKey: alert.alertSource?.integrationKey || "",
|
|
124
|
+
alertKey: alert.alertKey,
|
|
125
|
+
summary: `from ${userName} via Backstage plugin`,
|
|
126
|
+
eventType: "ACCEPT"
|
|
127
|
+
})
|
|
128
|
+
};
|
|
129
|
+
await this.fetch("/api/events", init);
|
|
130
|
+
return this.fetchAlert(alert.id);
|
|
131
|
+
}
|
|
132
|
+
async resolveAlert(alert, userName) {
|
|
133
|
+
const init = {
|
|
134
|
+
method: "POST",
|
|
135
|
+
headers: JSON_HEADERS,
|
|
136
|
+
body: JSON.stringify({
|
|
137
|
+
apiKey: alert.alertSource?.integrationKey || "",
|
|
138
|
+
alertKey: alert.alertKey,
|
|
139
|
+
summary: `from ${userName} via Backstage plugin`,
|
|
140
|
+
eventType: "RESOLVE"
|
|
141
|
+
})
|
|
142
|
+
};
|
|
143
|
+
await this.fetch("/api/events", init);
|
|
144
|
+
return this.fetchAlert(alert.id);
|
|
145
|
+
}
|
|
146
|
+
async assignAlert(alert, responder) {
|
|
147
|
+
const init = {
|
|
148
|
+
method: "PUT",
|
|
149
|
+
headers: JSON_HEADERS
|
|
150
|
+
};
|
|
151
|
+
const query = new URLSearchParams();
|
|
152
|
+
switch (responder.group) {
|
|
153
|
+
case "ESCALATION_POLICY":
|
|
154
|
+
query.append("policy-id", String(responder.id));
|
|
155
|
+
break;
|
|
156
|
+
case "ON_CALL_SCHEDULE":
|
|
157
|
+
query.append("schedule-id", String(responder.id));
|
|
158
|
+
break;
|
|
159
|
+
default:
|
|
160
|
+
query.append("user-id", String(responder.id));
|
|
161
|
+
break;
|
|
162
|
+
}
|
|
163
|
+
const response = await this.fetch(
|
|
164
|
+
`/api/alerts/${encodeURIComponent(alert.id)}/assign?${query.toString()}`,
|
|
165
|
+
init
|
|
166
|
+
);
|
|
167
|
+
return response;
|
|
168
|
+
}
|
|
169
|
+
async triggerAlertAction(alert, action) {
|
|
170
|
+
const init = {
|
|
171
|
+
method: "POST",
|
|
172
|
+
headers: JSON_HEADERS,
|
|
173
|
+
body: JSON.stringify({
|
|
174
|
+
webhookId: action.webhookId,
|
|
175
|
+
extensionId: action.extensionId,
|
|
176
|
+
type: action.type,
|
|
177
|
+
name: action.name
|
|
178
|
+
})
|
|
179
|
+
};
|
|
180
|
+
await this.fetch(
|
|
181
|
+
`/api/alerts/${encodeURIComponent(alert.id)}/actions`,
|
|
182
|
+
init
|
|
183
|
+
);
|
|
184
|
+
}
|
|
185
|
+
async createAlert(eventRequest) {
|
|
186
|
+
const init = {
|
|
187
|
+
method: "POST",
|
|
188
|
+
headers: JSON_HEADERS,
|
|
189
|
+
body: JSON.stringify({
|
|
190
|
+
apiKey: eventRequest.integrationKey,
|
|
191
|
+
summary: eventRequest.summary,
|
|
192
|
+
details: eventRequest.details,
|
|
193
|
+
eventType: "ALERT",
|
|
194
|
+
links: [
|
|
195
|
+
{
|
|
196
|
+
href: eventRequest.source,
|
|
197
|
+
text: "Backstage Url"
|
|
198
|
+
}
|
|
199
|
+
],
|
|
200
|
+
customDetails: {
|
|
201
|
+
userName: eventRequest.userName
|
|
202
|
+
}
|
|
203
|
+
})
|
|
204
|
+
};
|
|
205
|
+
const response = await this.fetch("/api/events", init);
|
|
206
|
+
return response;
|
|
207
|
+
}
|
|
208
|
+
async fetchAlertSources() {
|
|
209
|
+
const init = {
|
|
210
|
+
headers: JSON_HEADERS
|
|
211
|
+
};
|
|
212
|
+
const response = await this.fetch("/api/alert-sources", init);
|
|
213
|
+
return response;
|
|
214
|
+
}
|
|
215
|
+
async fetchAlertSource(idOrIntegrationKey) {
|
|
216
|
+
const init = {
|
|
217
|
+
headers: JSON_HEADERS
|
|
218
|
+
};
|
|
219
|
+
const response = await this.fetch(
|
|
220
|
+
`/api/alert-sources/${encodeURIComponent(idOrIntegrationKey)}`,
|
|
221
|
+
init
|
|
222
|
+
);
|
|
223
|
+
return response;
|
|
224
|
+
}
|
|
225
|
+
async fetchAlertSourceOnCalls(alertSource) {
|
|
226
|
+
const init = {
|
|
227
|
+
headers: JSON_HEADERS
|
|
228
|
+
};
|
|
229
|
+
const response = await this.fetch(
|
|
230
|
+
`/api/on-calls?policies=${encodeURIComponent(
|
|
231
|
+
alertSource.escalationPolicy.id
|
|
232
|
+
)}&expand=user&expand=escalationPolicy&timezone=${DateTime.local().zoneName}`,
|
|
233
|
+
init
|
|
234
|
+
);
|
|
235
|
+
return response;
|
|
236
|
+
}
|
|
237
|
+
async enableAlertSource(alertSource) {
|
|
238
|
+
const init = {
|
|
239
|
+
method: "PUT",
|
|
240
|
+
headers: JSON_HEADERS,
|
|
241
|
+
body: JSON.stringify({ ...alertSource, active: true })
|
|
242
|
+
};
|
|
243
|
+
const response = await this.fetch(
|
|
244
|
+
`/api/alert-sources/${encodeURIComponent(alertSource.id)}`,
|
|
245
|
+
init
|
|
246
|
+
);
|
|
247
|
+
return response;
|
|
248
|
+
}
|
|
249
|
+
async disableAlertSource(alertSource) {
|
|
250
|
+
const init = {
|
|
251
|
+
method: "PUT",
|
|
252
|
+
headers: JSON_HEADERS,
|
|
253
|
+
body: JSON.stringify({ ...alertSource, active: false })
|
|
254
|
+
};
|
|
255
|
+
const response = await this.fetch(
|
|
256
|
+
`/api/alert-sources/${encodeURIComponent(alertSource.id)}`,
|
|
257
|
+
init
|
|
258
|
+
);
|
|
259
|
+
return response;
|
|
260
|
+
}
|
|
261
|
+
async addImmediateMaintenance(alertSourceId, minutes) {
|
|
262
|
+
const init = {
|
|
263
|
+
method: "POST",
|
|
264
|
+
headers: JSON_HEADERS,
|
|
265
|
+
body: JSON.stringify({
|
|
266
|
+
start: DateTime.utc().toISO(),
|
|
267
|
+
end: DateTime.utc().plus({ minutes }).toISO(),
|
|
268
|
+
description: `Immediate maintenance window for ${minutes} minutes. Backstage \u2014 iLert plugin.`,
|
|
269
|
+
createdBy: "Backstage",
|
|
270
|
+
timezone: DateTime.local().zoneName,
|
|
271
|
+
alertSources: [{ id: alertSourceId }]
|
|
272
|
+
})
|
|
273
|
+
};
|
|
274
|
+
const response = await this.fetch("/api/maintenance-windows", init);
|
|
275
|
+
return response;
|
|
276
|
+
}
|
|
277
|
+
async fetchOnCallSchedules() {
|
|
278
|
+
const init = {
|
|
279
|
+
headers: JSON_HEADERS
|
|
280
|
+
};
|
|
281
|
+
const response = await this.fetch(
|
|
282
|
+
"/api/schedules?include=currentShift&include=nextShift",
|
|
283
|
+
init
|
|
284
|
+
);
|
|
285
|
+
return response;
|
|
286
|
+
}
|
|
287
|
+
async fetchUsers() {
|
|
288
|
+
const init = {
|
|
289
|
+
headers: JSON_HEADERS
|
|
290
|
+
};
|
|
291
|
+
const response = await this.fetch("/api/users", init);
|
|
292
|
+
return response;
|
|
293
|
+
}
|
|
294
|
+
async overrideShift(scheduleId, userId, start, end) {
|
|
295
|
+
const init = {
|
|
296
|
+
method: "PUT",
|
|
297
|
+
headers: JSON_HEADERS,
|
|
298
|
+
body: JSON.stringify({ user: { id: userId }, start, end })
|
|
299
|
+
};
|
|
300
|
+
const response = await this.fetch(
|
|
301
|
+
`/api/schedules/${encodeURIComponent(scheduleId)}/overrides`,
|
|
302
|
+
init
|
|
303
|
+
);
|
|
304
|
+
return response;
|
|
305
|
+
}
|
|
306
|
+
async fetchServices(opts) {
|
|
307
|
+
const init = {
|
|
308
|
+
headers: JSON_HEADERS
|
|
309
|
+
};
|
|
310
|
+
const query = new URLSearchParams();
|
|
311
|
+
if (opts?.maxResults !== void 0) {
|
|
312
|
+
query.append("max-results", String(opts.maxResults));
|
|
313
|
+
}
|
|
314
|
+
if (opts?.startIndex !== void 0) {
|
|
315
|
+
query.append("start-index", String(opts.startIndex));
|
|
316
|
+
}
|
|
317
|
+
query.append("include", "uptime");
|
|
318
|
+
const response = await this.fetch(
|
|
319
|
+
`/api/services?${query.toString()}`,
|
|
320
|
+
init
|
|
321
|
+
);
|
|
322
|
+
return response;
|
|
323
|
+
}
|
|
324
|
+
async fetchStatusPages(opts) {
|
|
325
|
+
const init = {
|
|
326
|
+
headers: JSON_HEADERS
|
|
327
|
+
};
|
|
328
|
+
const query = new URLSearchParams();
|
|
329
|
+
if (opts?.maxResults !== void 0) {
|
|
330
|
+
query.append("max-results", String(opts.maxResults));
|
|
331
|
+
}
|
|
332
|
+
if (opts?.startIndex !== void 0) {
|
|
333
|
+
query.append("start-index", String(opts.startIndex));
|
|
334
|
+
}
|
|
335
|
+
query.append("include", "subscribed");
|
|
336
|
+
const response = await this.fetch(
|
|
337
|
+
`/api/status-pages?${query.toString()}`,
|
|
338
|
+
init
|
|
339
|
+
);
|
|
340
|
+
return response;
|
|
341
|
+
}
|
|
342
|
+
getAlertDetailsURL(alert) {
|
|
343
|
+
return `${this.baseUrl}/alert/view.jsf?id=${encodeURIComponent(alert.id)}`;
|
|
344
|
+
}
|
|
345
|
+
getAlertSourceDetailsURL(alertSource) {
|
|
346
|
+
if (!alertSource) {
|
|
347
|
+
return "";
|
|
348
|
+
}
|
|
349
|
+
return `${this.baseUrl}/source/view.jsf?id=${encodeURIComponent(
|
|
350
|
+
alertSource.id
|
|
351
|
+
)}`;
|
|
352
|
+
}
|
|
353
|
+
getEscalationPolicyDetailsURL(escalationPolicy) {
|
|
354
|
+
return `${this.baseUrl}/policy/view.jsf?id=${encodeURIComponent(
|
|
355
|
+
escalationPolicy.id
|
|
356
|
+
)}`;
|
|
357
|
+
}
|
|
358
|
+
getScheduleDetailsURL(schedule) {
|
|
359
|
+
return `${this.baseUrl}/schedule/view.jsf?id=${encodeURIComponent(
|
|
360
|
+
schedule.id
|
|
361
|
+
)}`;
|
|
362
|
+
}
|
|
363
|
+
getServiceDetailsURL(service) {
|
|
364
|
+
return `${this.baseUrl}/service/view.jsf?id=${encodeURIComponent(
|
|
365
|
+
service.id
|
|
366
|
+
)}`;
|
|
367
|
+
}
|
|
368
|
+
getStatusPageDetailsURL(statusPage) {
|
|
369
|
+
return `${this.baseUrl}/status-page/view.jsf?id=${encodeURIComponent(
|
|
370
|
+
statusPage.id
|
|
371
|
+
)}`;
|
|
372
|
+
}
|
|
373
|
+
getStatusPageURL(statusPage) {
|
|
374
|
+
return statusPage.domain ? statusPage.domain : statusPage.subdomain;
|
|
375
|
+
}
|
|
376
|
+
getUserPhoneNumber(user) {
|
|
377
|
+
return user?.mobile?.number || user?.landline?.number || "";
|
|
378
|
+
}
|
|
379
|
+
getUserInitials(user) {
|
|
380
|
+
if (!user) {
|
|
381
|
+
return "";
|
|
382
|
+
}
|
|
383
|
+
if (!user.firstName && !user.lastName) {
|
|
384
|
+
return user.username;
|
|
385
|
+
}
|
|
386
|
+
return `${user.firstName} ${user.lastName}`;
|
|
387
|
+
}
|
|
388
|
+
async apiUrl() {
|
|
389
|
+
const proxyUrl = await this.discoveryApi.getBaseUrl("proxy");
|
|
390
|
+
return proxyUrl + this.proxyPath;
|
|
391
|
+
}
|
|
392
|
+
}
|
|
393
|
+
|
|
394
|
+
export { ILertClient, ilertApiRef };
|
|
395
|
+
//# sourceMappingURL=client.esm.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"client.esm.js","sources":["../../src/api/client.ts"],"sourcesContent":["/*\n * Copyright 2021 The Backstage Authors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport {\n ConfigApi,\n createApiRef,\n DiscoveryApi,\n FetchApi,\n} from '@backstage/core-plugin-api';\nimport { AuthenticationError, ResponseError } from '@backstage/errors';\nimport { DateTime as dt } from 'luxon';\nimport {\n Alert,\n AlertAction,\n AlertResponder,\n AlertSource,\n EscalationPolicy,\n OnCall,\n Schedule,\n Service,\n StatusPage,\n User,\n} from '../types';\nimport {\n EventRequest,\n GetAlertsCountOpts,\n GetAlertsOpts,\n GetServicesOpts,\n GetStatusPagesOpts,\n ILertApi,\n} from './types';\n\n/** @public */\nexport const ilertApiRef = createApiRef<ILertApi>({\n id: 'plugin.ilert.service',\n});\n\nconst DEFAULT_PROXY_PATH = '/ilert';\nconst JSON_HEADERS = {\n 'Content-Type': 'application/json',\n Accept: 'application/json',\n};\n\n/** @public */\nexport class ILertClient implements ILertApi {\n private readonly discoveryApi: DiscoveryApi;\n private readonly fetchApi: FetchApi;\n private readonly proxyPath: string;\n private readonly baseUrl: string;\n\n static fromConfig(\n configApi: ConfigApi,\n discoveryApi: DiscoveryApi,\n fetchApi: FetchApi,\n ) {\n const baseUrl: string =\n configApi.getOptionalString('ilert.baseUrl') ?? 'https://app.ilert.com';\n\n return new ILertClient({\n discoveryApi,\n fetchApi,\n baseUrl,\n proxyPath:\n configApi.getOptionalString('ilert.proxyPath') ?? DEFAULT_PROXY_PATH,\n });\n }\n\n constructor(opts: {\n discoveryApi: DiscoveryApi;\n fetchApi: FetchApi;\n\n /**\n * URL used by users to access iLert web UI.\n * Example: https://my-org.ilert.com/\n */\n baseUrl: string;\n\n /**\n * Path to use for requests via the proxy, defaults to /ilert/api\n */\n proxyPath: string;\n }) {\n this.discoveryApi = opts.discoveryApi;\n this.fetchApi = opts.fetchApi;\n this.baseUrl = opts.baseUrl;\n this.proxyPath = opts.proxyPath;\n }\n\n private async fetch<T = any>(input: string, init?: RequestInit): Promise<T> {\n const apiUrl = await this.apiUrl();\n\n const response = await this.fetchApi.fetch(`${apiUrl}${input}`, init);\n if (response.status === 401) {\n throw new AuthenticationError(\n 'This request requires HTTP authentication.',\n );\n }\n if (!response.ok || response.status >= 400) {\n throw await ResponseError.fromResponse(response);\n }\n\n return await response.json();\n }\n\n async fetchAlerts(opts?: GetAlertsOpts): Promise<Alert[]> {\n const init = {\n headers: JSON_HEADERS,\n };\n const query = new URLSearchParams();\n if (opts?.maxResults !== undefined) {\n query.append('max-results', String(opts.maxResults));\n }\n if (opts?.startIndex !== undefined) {\n query.append('start-index', String(opts.startIndex));\n }\n if (opts?.alertSources !== undefined && Array.isArray(opts.alertSources)) {\n opts.alertSources.forEach((a: number) => {\n if (a) {\n query.append('alert-source', String(a));\n }\n });\n }\n\n if (opts?.states !== undefined && Array.isArray(opts.states)) {\n opts.states.forEach(state => {\n query.append('state', state);\n });\n }\n const response = await this.fetch(`/api/alerts?${query.toString()}`, init);\n return response;\n }\n\n async fetchAlertsCount(opts?: GetAlertsCountOpts): Promise<number> {\n const init = {\n headers: JSON_HEADERS,\n };\n const query = new URLSearchParams();\n if (opts && opts.states && Array.isArray(opts.states)) {\n opts.states.forEach(state => {\n query.append('state', state);\n });\n }\n const response = await this.fetch(\n `/api/alerts/count?${query.toString()}`,\n init,\n );\n\n return response && response.count ? response.count : 0;\n }\n\n async fetchAlert(id: number): Promise<Alert> {\n const init = {\n headers: JSON_HEADERS,\n };\n\n const response = await this.fetch(\n `/api/alerts/${encodeURIComponent(id)}`,\n init,\n );\n\n return response;\n }\n\n async fetchAlertResponders(alert: Alert): Promise<AlertResponder[]> {\n const init = {\n headers: JSON_HEADERS,\n };\n\n const response = await this.fetch(\n `/api/alerts/${encodeURIComponent(alert.id)}/responders`,\n init,\n );\n\n return response;\n }\n\n async fetchAlertActions(alert: Alert): Promise<AlertAction[]> {\n const init = {\n headers: JSON_HEADERS,\n };\n\n const response = await this.fetch(\n `/api/alerts/${encodeURIComponent(alert.id)}/actions`,\n init,\n );\n\n return response;\n }\n\n async acceptAlert(alert: Alert, userName: string): Promise<Alert> {\n const init = {\n method: 'POST',\n headers: JSON_HEADERS,\n body: JSON.stringify({\n apiKey: alert.alertSource?.integrationKey || '',\n alertKey: alert.alertKey,\n summary: `from ${userName} via Backstage plugin`,\n eventType: 'ACCEPT',\n }),\n };\n\n await this.fetch('/api/events', init);\n return this.fetchAlert(alert.id);\n }\n\n async resolveAlert(alert: Alert, userName: string): Promise<Alert> {\n const init = {\n method: 'POST',\n headers: JSON_HEADERS,\n body: JSON.stringify({\n apiKey: alert.alertSource?.integrationKey || '',\n alertKey: alert.alertKey,\n summary: `from ${userName} via Backstage plugin`,\n eventType: 'RESOLVE',\n }),\n };\n\n await this.fetch('/api/events', init);\n return this.fetchAlert(alert.id);\n }\n\n async assignAlert(alert: Alert, responder: AlertResponder): Promise<Alert> {\n const init = {\n method: 'PUT',\n headers: JSON_HEADERS,\n };\n\n const query = new URLSearchParams();\n switch (responder.group) {\n case 'ESCALATION_POLICY':\n query.append('policy-id', String(responder.id));\n break;\n case 'ON_CALL_SCHEDULE':\n query.append('schedule-id', String(responder.id));\n break;\n default:\n query.append('user-id', String(responder.id));\n break;\n }\n\n const response = await this.fetch(\n `/api/alerts/${encodeURIComponent(alert.id)}/assign?${query.toString()}`,\n init,\n );\n\n return response;\n }\n\n async triggerAlertAction(alert: Alert, action: AlertAction): Promise<void> {\n const init = {\n method: 'POST',\n headers: JSON_HEADERS,\n body: JSON.stringify({\n webhookId: action.webhookId,\n extensionId: action.extensionId,\n type: action.type,\n name: action.name,\n }),\n };\n\n await this.fetch(\n `/api/alerts/${encodeURIComponent(alert.id)}/actions`,\n init,\n );\n }\n\n async createAlert(eventRequest: EventRequest): Promise<boolean> {\n const init = {\n method: 'POST',\n headers: JSON_HEADERS,\n body: JSON.stringify({\n apiKey: eventRequest.integrationKey,\n summary: eventRequest.summary,\n details: eventRequest.details,\n eventType: 'ALERT',\n links: [\n {\n href: eventRequest.source,\n text: 'Backstage Url',\n },\n ],\n customDetails: {\n userName: eventRequest.userName,\n },\n }),\n };\n\n const response = await this.fetch('/api/events', init);\n return response;\n }\n\n async fetchAlertSources(): Promise<AlertSource[]> {\n const init = {\n headers: JSON_HEADERS,\n };\n\n const response = await this.fetch('/api/alert-sources', init);\n\n return response;\n }\n\n async fetchAlertSource(\n idOrIntegrationKey: number | string,\n ): Promise<AlertSource> {\n const init = {\n headers: JSON_HEADERS,\n };\n\n const response = await this.fetch(\n `/api/alert-sources/${encodeURIComponent(idOrIntegrationKey)}`,\n init,\n );\n\n return response;\n }\n\n async fetchAlertSourceOnCalls(alertSource: AlertSource): Promise<OnCall[]> {\n const init = {\n headers: JSON_HEADERS,\n };\n\n const response = await this.fetch(\n `/api/on-calls?policies=${encodeURIComponent(\n alertSource.escalationPolicy.id,\n )}&expand=user&expand=escalationPolicy&timezone=${dt.local().zoneName}`,\n init,\n );\n\n return response;\n }\n\n async enableAlertSource(alertSource: AlertSource): Promise<AlertSource> {\n const init = {\n method: 'PUT',\n headers: JSON_HEADERS,\n body: JSON.stringify({ ...alertSource, active: true }),\n };\n\n const response = await this.fetch(\n `/api/alert-sources/${encodeURIComponent(alertSource.id)}`,\n init,\n );\n\n return response;\n }\n\n async disableAlertSource(alertSource: AlertSource): Promise<AlertSource> {\n const init = {\n method: 'PUT',\n headers: JSON_HEADERS,\n body: JSON.stringify({ ...alertSource, active: false }),\n };\n\n const response = await this.fetch(\n `/api/alert-sources/${encodeURIComponent(alertSource.id)}`,\n init,\n );\n\n return response;\n }\n\n async addImmediateMaintenance(\n alertSourceId: number,\n minutes: number,\n ): Promise<void> {\n const init = {\n method: 'POST',\n headers: JSON_HEADERS,\n body: JSON.stringify({\n start: dt.utc().toISO(),\n end: dt.utc().plus({ minutes }).toISO(),\n description: `Immediate maintenance window for ${minutes} minutes. Backstage — iLert plugin.`,\n createdBy: 'Backstage',\n timezone: dt.local().zoneName,\n alertSources: [{ id: alertSourceId }],\n }),\n };\n\n const response = await this.fetch('/api/maintenance-windows', init);\n\n return response;\n }\n\n async fetchOnCallSchedules(): Promise<Schedule[]> {\n const init = {\n headers: JSON_HEADERS,\n };\n\n const response = await this.fetch(\n '/api/schedules?include=currentShift&include=nextShift',\n init,\n );\n\n return response;\n }\n\n async fetchUsers(): Promise<User[]> {\n const init = {\n headers: JSON_HEADERS,\n };\n\n const response = await this.fetch('/api/users', init);\n\n return response;\n }\n\n async overrideShift(\n scheduleId: number,\n userId: number,\n start: string,\n end: string,\n ): Promise<Schedule> {\n const init = {\n method: 'PUT',\n headers: JSON_HEADERS,\n body: JSON.stringify({ user: { id: userId }, start, end }),\n };\n\n const response = await this.fetch(\n `/api/schedules/${encodeURIComponent(scheduleId)}/overrides`,\n init,\n );\n\n return response;\n }\n\n async fetchServices(opts?: GetServicesOpts): Promise<Service[]> {\n const init = {\n headers: JSON_HEADERS,\n };\n const query = new URLSearchParams();\n if (opts?.maxResults !== undefined) {\n query.append('max-results', String(opts.maxResults));\n }\n if (opts?.startIndex !== undefined) {\n query.append('start-index', String(opts.startIndex));\n }\n\n query.append('include', 'uptime');\n\n const response = await this.fetch(\n `/api/services?${query.toString()}`,\n init,\n );\n return response;\n }\n\n async fetchStatusPages(opts?: GetStatusPagesOpts): Promise<StatusPage[]> {\n const init = {\n headers: JSON_HEADERS,\n };\n const query = new URLSearchParams();\n if (opts?.maxResults !== undefined) {\n query.append('max-results', String(opts.maxResults));\n }\n if (opts?.startIndex !== undefined) {\n query.append('start-index', String(opts.startIndex));\n }\n\n query.append('include', 'subscribed');\n\n const response = await this.fetch(\n `/api/status-pages?${query.toString()}`,\n init,\n );\n return response;\n }\n\n getAlertDetailsURL(alert: Alert): string {\n return `${this.baseUrl}/alert/view.jsf?id=${encodeURIComponent(alert.id)}`;\n }\n\n getAlertSourceDetailsURL(alertSource: AlertSource | null): string {\n if (!alertSource) {\n return '';\n }\n return `${this.baseUrl}/source/view.jsf?id=${encodeURIComponent(\n alertSource.id,\n )}`;\n }\n\n getEscalationPolicyDetailsURL(escalationPolicy: EscalationPolicy): string {\n return `${this.baseUrl}/policy/view.jsf?id=${encodeURIComponent(\n escalationPolicy.id,\n )}`;\n }\n\n getScheduleDetailsURL(schedule: Schedule): string {\n return `${this.baseUrl}/schedule/view.jsf?id=${encodeURIComponent(\n schedule.id,\n )}`;\n }\n\n getServiceDetailsURL(service: Service): string {\n return `${this.baseUrl}/service/view.jsf?id=${encodeURIComponent(\n service.id,\n )}`;\n }\n\n getStatusPageDetailsURL(statusPage: StatusPage): string {\n return `${this.baseUrl}/status-page/view.jsf?id=${encodeURIComponent(\n statusPage.id,\n )}`;\n }\n\n getStatusPageURL(statusPage: StatusPage): string {\n return statusPage.domain ? statusPage.domain : statusPage.subdomain;\n }\n\n getUserPhoneNumber(user: User | null) {\n return user?.mobile?.number || user?.landline?.number || '';\n }\n\n getUserInitials(user: User | null) {\n if (!user) {\n return '';\n }\n if (!user.firstName && !user.lastName) {\n return user.username;\n }\n return `${user.firstName} ${user.lastName}`;\n }\n\n private async apiUrl() {\n const proxyUrl = await this.discoveryApi.getBaseUrl('proxy');\n return proxyUrl + this.proxyPath;\n }\n}\n"],"names":["dt"],"mappings":"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"}
|