@pagerduty/backstage-plugin-backend 0.9.0-next.5 → 0.9.0-next.6

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/dist/index.cjs.js CHANGED
@@ -39,8 +39,7 @@ var Router__default = /*#__PURE__*/_interopDefaultCompat(Router);
39
39
  let authPersistence;
40
40
  let isLegacyConfig$1 = false;
41
41
  async function getAuthToken(accountId) {
42
- var _a;
43
- if (!(authPersistence == null ? void 0 : authPersistence.accountTokens)) {
42
+ if (!authPersistence?.accountTokens) {
44
43
  await loadAuthConfig(authPersistence.config, authPersistence.logger);
45
44
  }
46
45
  if (isLegacyConfig$1) {
@@ -53,7 +52,7 @@ async function getAuthToken(accountId) {
53
52
  return authPersistence.accountTokens[accountId].authToken;
54
53
  }
55
54
  } else {
56
- const defaultFallback = (_a = authPersistence.defaultAccount) != null ? _a : "";
55
+ const defaultFallback = authPersistence.defaultAccount ?? "";
57
56
  if (authPersistence.accountTokens[defaultFallback].authToken !== "" && authPersistence.accountTokens[defaultFallback].authToken.includes("Bearer") && authPersistence.accountTokens[defaultFallback].authTokenExpiryDate > Date.now() || authPersistence.accountTokens[defaultFallback].authToken !== "" && authPersistence.accountTokens[defaultFallback].authToken.includes("Token")) {
58
57
  return authPersistence.accountTokens[defaultFallback].authToken;
59
58
  }
@@ -62,7 +61,6 @@ async function getAuthToken(accountId) {
62
61
  return "";
63
62
  }
64
63
  async function loadAuthConfig(config, logger) {
65
- var _a;
66
64
  try {
67
65
  const defaultAccountId = "default";
68
66
  authPersistence = {
@@ -84,7 +82,7 @@ async function loadAuthConfig(config, logger) {
84
82
  config.getString("pagerDuty.oauth.clientId"),
85
83
  config.getString("pagerDuty.oauth.clientSecret"),
86
84
  config.getString("pagerDuty.oauth.subDomain"),
87
- (_a = config.getOptionalString("pagerDuty.oauth.region")) != null ? _a : "us"
85
+ config.getOptionalString("pagerDuty.oauth.region") ?? "us"
88
86
  );
89
87
  authPersistence.accountTokens[defaultAccountId] = tokenInfo;
90
88
  logger.info("PagerDuty OAuth configuration loaded successfully.");
@@ -101,12 +99,11 @@ async function loadAuthConfig(config, logger) {
101
99
  logger.info("New PagerDuty accounts configuration found in config file.");
102
100
  isLegacyConfig$1 = false;
103
101
  const accounts = config.getOptional("pagerDuty.accounts");
104
- if (accounts && (accounts == null ? void 0 : accounts.length) === 1) {
102
+ if (accounts && accounts?.length === 1) {
105
103
  logger.info("Only one account found in config file. Setting it as default.");
106
104
  authPersistence.defaultAccount = accounts[0].id;
107
105
  }
108
- accounts == null ? void 0 : accounts.forEach(async (account) => {
109
- var _a2;
106
+ accounts?.forEach(async (account) => {
110
107
  const maskedAccountId = maskString(account.id);
111
108
  if (account.isDefault && !authPersistence.defaultAccount) {
112
109
  logger.info(`Default account found in config file. Setting it as default.`);
@@ -123,7 +120,7 @@ async function loadAuthConfig(config, logger) {
123
120
  account.oauth.clientId,
124
121
  account.oauth.clientSecret,
125
122
  account.oauth.subDomain,
126
- (_a2 = account.oauth.region) != null ? _a2 : "us"
123
+ account.oauth.region ?? "us"
127
124
  );
128
125
  authPersistence.accountTokens[account.id] = tokenInfo;
129
126
  logger.info(`PagerDuty OAuth configuration loaded successfully for account ${maskedAccountId}.`);
@@ -204,17 +201,15 @@ const EndpointConfig = {};
204
201
  let fallbackEndpointConfig;
205
202
  let isLegacyConfig = false;
206
203
  function setFallbackEndpointConfig(account) {
207
- var _a, _b;
208
204
  fallbackEndpointConfig = {
209
- eventsBaseUrl: (_a = account.eventsBaseUrl) != null ? _a : "https://events.pagerduty.com/v2",
210
- apiBaseUrl: (_b = account.apiBaseUrl) != null ? _b : "https://api.pagerduty.com"
205
+ eventsBaseUrl: account.eventsBaseUrl ?? "https://events.pagerduty.com/v2",
206
+ apiBaseUrl: account.apiBaseUrl ?? "https://api.pagerduty.com"
211
207
  };
212
208
  }
213
209
  function insertEndpointConfig(account) {
214
- var _a, _b;
215
210
  EndpointConfig[account.id] = {
216
- eventsBaseUrl: (_a = account.eventsBaseUrl) != null ? _a : "https://events.pagerduty.com/v2",
217
- apiBaseUrl: (_b = account.apiBaseUrl) != null ? _b : "https://api.pagerduty.com"
211
+ eventsBaseUrl: account.eventsBaseUrl ?? "https://events.pagerduty.com/v2",
212
+ apiBaseUrl: account.apiBaseUrl ?? "https://api.pagerduty.com"
218
213
  };
219
214
  }
220
215
  function loadPagerDutyEndpointsFromConfig(config, logger) {
@@ -222,7 +217,7 @@ function loadPagerDutyEndpointsFromConfig(config, logger) {
222
217
  logger.debug(`New accounts configuration detected. Loading PagerDuty endpoints from config.`);
223
218
  isLegacyConfig = false;
224
219
  const accounts = config.getOptional("pagerDuty.accounts");
225
- if ((accounts == null ? void 0 : accounts.length) === 1) {
220
+ if (accounts?.length === 1) {
226
221
  logger.debug(`Single account configuration detected. Loading PagerDuty endpoints from config to 'default'.`);
227
222
  EndpointConfig.default = {
228
223
  eventsBaseUrl: accounts[0].eventsBaseUrl !== void 0 ? accounts[0].eventsBaseUrl : "https://events.pagerduty.com/v2",
@@ -230,7 +225,7 @@ function loadPagerDutyEndpointsFromConfig(config, logger) {
230
225
  };
231
226
  } else {
232
227
  logger.debug(`Multiple account configuration detected. Loading PagerDuty endpoints from config.`);
233
- accounts == null ? void 0 : accounts.forEach((account) => {
228
+ accounts?.forEach((account) => {
234
229
  if (account.isDefault) {
235
230
  setFallbackEndpointConfig(account);
236
231
  }
@@ -270,9 +265,8 @@ async function addServiceRelationsToService(serviceRelations, account) {
270
265
  };
271
266
  const apiBaseUrl = getApiBaseUrl(account);
272
267
  const baseUrl = `${apiBaseUrl}/service_dependencies/associate`;
273
- console.log(`Adding service relations: ${JSON.stringify({ relationships: serviceRelations })}`);
274
268
  try {
275
- response = await fetchWithRetries(`${baseUrl}`, options);
269
+ response = await fetchWithRetries(baseUrl, options);
276
270
  } catch (error) {
277
271
  throw new Error(`Failed to retrieve service dependencies: ${error}`);
278
272
  }
@@ -312,7 +306,6 @@ async function removeServiceRelationsFromService(serviceRelations, account) {
312
306
  };
313
307
  const apiBaseUrl = getApiBaseUrl(account);
314
308
  const baseUrl = `${apiBaseUrl}/service_dependencies/disassociate`;
315
- console.log(`Removing service relations: ${JSON.stringify({ relationships: serviceRelations })}`);
316
309
  try {
317
310
  response = await fetchWithRetries(`${baseUrl}`, options);
318
311
  } catch (error) {
@@ -354,11 +347,9 @@ async function getServiceRelationshipsById(serviceId, account) {
354
347
  try {
355
348
  response = await fetchWithRetries(baseUrl, options);
356
349
  } catch (error) {
357
- console.log(`Failed to retrieve service dependencies: ${error}`);
358
350
  throw new Error(`Failed to retrieve service dependencies: ${error}`);
359
351
  }
360
352
  if (response.status >= 500) {
361
- console.log("Failed to list service dependencies. PagerDuty API returned a server error. Retrying with the same arguments will not work.");
362
353
  throw new backstagePluginCommon.HttpError(`Failed to list service dependencies. PagerDuty API returned a server error. Retrying with the same arguments will not work.`, response.status);
363
354
  }
364
355
  switch (response.status) {
@@ -374,14 +365,12 @@ async function getServiceRelationshipsById(serviceId, account) {
374
365
  let result;
375
366
  try {
376
367
  result = await response.json();
377
- console.log(`Service ${serviceId} has the following dependencies: ${JSON.stringify(result.relationships)}`);
378
368
  return result.relationships;
379
369
  } catch (error) {
380
370
  throw new backstagePluginCommon.HttpError(`Failed to parse service dependency information: ${error}`, 500);
381
371
  }
382
372
  }
383
373
  async function getEscalationPolicies(offset, limit, account) {
384
- var _a;
385
374
  let response;
386
375
  const params = `total=true&sort_by=name&offset=${offset}&limit=${limit}`;
387
376
  const options = {
@@ -415,7 +404,7 @@ async function getEscalationPolicies(offset, limit, account) {
415
404
  let result;
416
405
  try {
417
406
  result = await response.json();
418
- return [(_a = result.more) != null ? _a : false, result.escalation_policies];
407
+ return [result.more ?? false, result.escalation_policies];
419
408
  } catch (error) {
420
409
  throw new backstagePluginCommon.HttpError(`Failed to parse escalation policy information: ${error}`, 500);
421
410
  }
@@ -806,7 +795,6 @@ async function getServiceMetrics(serviceId, account) {
806
795
  }
807
796
  }
808
797
  async function createServiceIntegration({ serviceId, vendorId, account }) {
809
- var _a;
810
798
  let response;
811
799
  const apiBaseUrl = getApiBaseUrl(account);
812
800
  const baseUrl = `${apiBaseUrl}/services`;
@@ -853,7 +841,7 @@ async function createServiceIntegration({ serviceId, vendorId, account }) {
853
841
  let result;
854
842
  try {
855
843
  result = await response.json();
856
- return (_a = result.integration.integration_key) != null ? _a : "";
844
+ return result.integration.integration_key ?? "";
857
845
  } catch (error) {
858
846
  throw new Error(`Failed to parse service information: ${error}`);
859
847
  }
@@ -881,11 +869,9 @@ async function fetchWithRetries(url, options) {
881
869
  async function createComponentEntitiesReferenceDict({ items: componentEntities }) {
882
870
  const componentEntitiesDict = {};
883
871
  await Promise.all(componentEntities.map(async (entity) => {
884
- var _a;
885
- const annotations = JSON.parse(JSON.stringify(entity.metadata.annotations));
886
- const serviceId = annotations["pagerduty.com/service-id"];
887
- const integrationKey = annotations["pagerduty.com/integration-key"];
888
- const account = (_a = annotations["pagerduty.com/account"]) != null ? _a : "";
872
+ const serviceId = entity.metadata.annotations?.["pagerduty.com/service-id"];
873
+ const integrationKey = entity.metadata.annotations?.["pagerduty.com/integration-key"];
874
+ const account = entity.metadata.annotations?.["pagerduty.com/account"];
889
875
  if (serviceId !== void 0 && serviceId !== "") {
890
876
  componentEntitiesDict[serviceId] = {
891
877
  ref: `${entity.kind}:${entity.metadata.namespace}/${entity.metadata.name}`.toLowerCase(),
@@ -908,9 +894,8 @@ async function buildEntityMappingsResponse(entityMappings, componentEntitiesDict
908
894
  mappings: []
909
895
  };
910
896
  pagerDutyServices.forEach((service) => {
911
- var _a, _b, _c, _d, _e, _f, _g, _h, _i, _j, _k, _l, _m, _n, _o, _p, _q, _r, _s, _t, _u, _v, _w, _x, _y, _z, _A;
912
- const entityRef = (_a = componentEntitiesDict[service.id]) == null ? void 0 : _a.ref;
913
- const entityName = (_b = componentEntitiesDict[service.id]) == null ? void 0 : _b.name;
897
+ const entityRef = componentEntitiesDict[service.id]?.ref;
898
+ const entityName = componentEntitiesDict[service.id]?.name;
914
899
  const entityMapping = entityMappings.find((mapping) => mapping.serviceId === service.id);
915
900
  if (entityMapping) {
916
901
  if (entityRef === void 0) {
@@ -922,13 +907,13 @@ async function buildEntityMappingsResponse(entityMappings, componentEntitiesDict
922
907
  serviceId: entityMapping.serviceId,
923
908
  status: "NotMapped",
924
909
  serviceName: service.name,
925
- team: (_e = (_d = (_c = service.teams) == null ? void 0 : _c[0]) == null ? void 0 : _d.name) != null ? _e : "",
910
+ team: service.teams?.[0]?.name ?? "",
926
911
  escalationPolicy: service.escalation_policy !== void 0 ? service.escalation_policy.name : "",
927
912
  serviceUrl: service.html_url,
928
913
  account: service.account
929
914
  });
930
915
  } else {
931
- const entityRefName = (_g = (_f = componentEntities.items.find((entity) => `${entity.kind}:${entity.metadata.namespace}/${entity.metadata.name}`.toLowerCase() === entityMapping.entityRef)) == null ? void 0 : _f.metadata.name) != null ? _g : "";
916
+ const entityRefName = componentEntities.items.find((entity) => `${entity.kind}:${entity.metadata.namespace}/${entity.metadata.name}`.toLowerCase() === entityMapping.entityRef)?.metadata.name ?? "";
932
917
  result.mappings.push({
933
918
  entityRef: entityMapping.entityRef,
934
919
  entityName: entityRefName,
@@ -936,14 +921,14 @@ async function buildEntityMappingsResponse(entityMappings, componentEntitiesDict
936
921
  integrationKey: entityMapping.integrationKey,
937
922
  status: "OutOfSync",
938
923
  serviceName: service.name,
939
- team: (_j = (_i = (_h = service.teams) == null ? void 0 : _h[0]) == null ? void 0 : _i.name) != null ? _j : "",
924
+ team: service.teams?.[0]?.name ?? "",
940
925
  escalationPolicy: service.escalation_policy !== void 0 ? service.escalation_policy.name : "",
941
926
  serviceUrl: service.html_url,
942
927
  account: service.account
943
928
  });
944
929
  }
945
930
  } else if (entityRef !== entityMapping.entityRef) {
946
- const entityRefName = (_l = (_k = componentEntities.items.find((entity) => `${entity.kind}:${entity.metadata.namespace}/${entity.metadata.name}`.toLowerCase() === entityMapping.entityRef)) == null ? void 0 : _k.metadata.name) != null ? _l : "";
931
+ const entityRefName = componentEntities.items.find((entity) => `${entity.kind}:${entity.metadata.namespace}/${entity.metadata.name}`.toLowerCase() === entityMapping.entityRef)?.metadata.name ?? "";
947
932
  result.mappings.push({
948
933
  entityRef: entityMapping.entityRef !== "" ? entityMapping.entityRef : "",
949
934
  entityName: entityMapping.entityRef !== "" ? entityRefName : "",
@@ -951,7 +936,7 @@ async function buildEntityMappingsResponse(entityMappings, componentEntitiesDict
951
936
  integrationKey: entityMapping.integrationKey,
952
937
  status: "OutOfSync",
953
938
  serviceName: service.name,
954
- team: (_o = (_n = (_m = service.teams) == null ? void 0 : _m[0]) == null ? void 0 : _n.name) != null ? _o : "",
939
+ team: service.teams?.[0]?.name ?? "",
955
940
  escalationPolicy: service.escalation_policy !== void 0 ? service.escalation_policy.name : "",
956
941
  serviceUrl: service.html_url,
957
942
  account: service.account
@@ -964,7 +949,7 @@ async function buildEntityMappingsResponse(entityMappings, componentEntitiesDict
964
949
  integrationKey: entityMapping.integrationKey,
965
950
  status: "InSync",
966
951
  serviceName: service.name,
967
- team: (_r = (_q = (_p = service.teams) == null ? void 0 : _p[0]) == null ? void 0 : _q.name) != null ? _r : "",
952
+ team: service.teams?.[0]?.name ?? "",
968
953
  escalationPolicy: service.escalation_policy !== void 0 ? service.escalation_policy.name : "",
969
954
  serviceUrl: service.html_url,
970
955
  account: service.account
@@ -972,10 +957,7 @@ async function buildEntityMappingsResponse(entityMappings, componentEntitiesDict
972
957
  }
973
958
  } else {
974
959
  const backstageVendorId = "PRO19CT";
975
- const backstageIntegrationKey = (_u = (_t = (_s = service.integrations) == null ? void 0 : _s.find((integration) => {
976
- var _a2;
977
- return ((_a2 = integration.vendor) == null ? void 0 : _a2.id) === backstageVendorId;
978
- })) == null ? void 0 : _t.integration_key) != null ? _u : "";
960
+ const backstageIntegrationKey = service.integrations?.find((integration) => integration.vendor?.id === backstageVendorId)?.integration_key ?? "";
979
961
  if (entityRef !== void 0) {
980
962
  result.mappings.push({
981
963
  entityRef,
@@ -984,7 +966,7 @@ async function buildEntityMappingsResponse(entityMappings, componentEntitiesDict
984
966
  integrationKey: backstageIntegrationKey,
985
967
  status: "InSync",
986
968
  serviceName: service.name,
987
- team: (_x = (_w = (_v = service.teams) == null ? void 0 : _v[0]) == null ? void 0 : _w.name) != null ? _x : "",
969
+ team: service.teams?.[0]?.name ?? "",
988
970
  escalationPolicy: service.escalation_policy !== void 0 ? service.escalation_policy.name : "",
989
971
  serviceUrl: service.html_url,
990
972
  account: service.account
@@ -997,7 +979,7 @@ async function buildEntityMappingsResponse(entityMappings, componentEntitiesDict
997
979
  integrationKey: backstageIntegrationKey,
998
980
  status: "NotMapped",
999
981
  serviceName: service.name,
1000
- team: (_A = (_z = (_y = service.teams) == null ? void 0 : _y[0]) == null ? void 0 : _z.name) != null ? _A : "",
982
+ team: service.teams?.[0]?.name ?? "",
1001
983
  escalationPolicy: service.escalation_policy !== void 0 ? service.escalation_policy.name : "",
1002
984
  serviceUrl: service.html_url,
1003
985
  account: service.account
@@ -1031,15 +1013,12 @@ async function createRouter(options) {
1031
1013
  const serviceId = request.params.serviceId || "";
1032
1014
  const account = request.query.account || "";
1033
1015
  if (serviceId === "") {
1034
- logger.info(`Bad Request: ':serviceId' must be provided as part of the path`);
1035
1016
  response.status(400).json("Bad Request: ':serviceId' must be provided as part of the path");
1036
1017
  }
1037
- const dependencies = request.body;
1018
+ const dependencies = Object.keys(request.body).length === 0 ? [] : request.body;
1038
1019
  if (!dependencies || dependencies.length === 0) {
1039
- logger.info(`Bad Request: 'dependencies' must be provided as part of the request body`);
1040
1020
  response.status(400).json("Bad Request: 'dependencies' must be provided as part of the request body");
1041
1021
  }
1042
- logger.info(`Received dependencies to remove from PagerDuty: ${JSON.stringify(dependencies)}`);
1043
1022
  const serviceRelations = [];
1044
1023
  dependencies.forEach(async (dependency) => {
1045
1024
  serviceRelations.push({
@@ -1068,19 +1047,15 @@ async function createRouter(options) {
1068
1047
  });
1069
1048
  router.post("/dependencies/service/:serviceId", async (request, response) => {
1070
1049
  try {
1071
- logger.info(`Received params : ${JSON.stringify(request.params)}`);
1072
1050
  const serviceId = request.params.serviceId || "";
1073
1051
  const account = request.query.account || "";
1074
1052
  if (serviceId === "") {
1075
- logger.info(`Bad Request: ':serviceId' must be provided as part of the path`);
1076
1053
  response.status(400).json("Bad Request: ':serviceId' must be provided as part of the path");
1077
1054
  }
1078
- const dependencies = request.body;
1055
+ const dependencies = Object.keys(request.body).length === 0 ? [] : request.body;
1079
1056
  if (!dependencies || dependencies.length === 0) {
1080
- logger.info(`Bad Request: 'dependencies' must be provided as part of the request body`);
1081
1057
  response.status(400).json("Bad Request: 'dependencies' must be provided as part of the request body");
1082
1058
  }
1083
- logger.info(`Received dependencies to add to PagerDuty: ${JSON.stringify(dependencies)}`);
1084
1059
  const serviceRelations = [];
1085
1060
  dependencies.forEach(async (dependency) => {
1086
1061
  serviceRelations.push({
@@ -1132,16 +1107,15 @@ async function createRouter(options) {
1132
1107
  }
1133
1108
  });
1134
1109
  router.get("/catalog/entity/:type/:namespace/:name", async (request, response) => {
1135
- var _a;
1136
1110
  const type = request.params.type;
1137
1111
  const namespace = request.params.namespace;
1138
1112
  const name = request.params.name;
1139
1113
  try {
1140
1114
  if (type && namespace && name) {
1141
1115
  const entityRef = `${type}:${namespace}/${name}`.toLowerCase();
1142
- const foundEntity = await (catalogApi == null ? void 0 : catalogApi.getEntityByRef(entityRef));
1116
+ const foundEntity = await catalogApi?.getEntityByRef(entityRef);
1143
1117
  if (foundEntity) {
1144
- response.json((_a = foundEntity.metadata.annotations) == null ? void 0 : _a["pagerduty.com/service-id"]);
1118
+ response.json(foundEntity.metadata.annotations?.["pagerduty.com/service-id"]);
1145
1119
  } else {
1146
1120
  response.status(404);
1147
1121
  }
@@ -1161,20 +1135,14 @@ async function createRouter(options) {
1161
1135
  router.post("/settings", async (request, response) => {
1162
1136
  try {
1163
1137
  const settings = request.body;
1164
- logger.info(`Received settings: ${JSON.stringify(settings)}`);
1165
1138
  await Promise.all(settings.map(async (setting) => {
1166
- logger.info(`Processing setting: ${JSON.stringify(setting)}`);
1167
1139
  if (setting.id === void 0 || setting.value === void 0) {
1168
- logger.info(`Bad Request: 'id' and 'value' are required`);
1169
1140
  response.status(400).json("Bad Request: 'id' and 'value' are required");
1170
1141
  }
1171
1142
  if (!isValidSetting(setting.value)) {
1172
- logger.info(`Bad Request: 'value' is invalid`);
1173
1143
  response.status(400).json("Bad Request: 'value' is invalid. Valid options are 'backstage', 'pagerduty', 'both' or 'disabled'");
1174
1144
  }
1175
- logger.info(`Setting value is valid: ${setting.value}`);
1176
1145
  await store.updateSetting(setting);
1177
- logger.info(`Setting updated: ${JSON.stringify(setting)}`);
1178
1146
  }));
1179
1147
  response.sendStatus(200);
1180
1148
  } catch (error) {
@@ -1214,7 +1182,6 @@ async function createRouter(options) {
1214
1182
  return false;
1215
1183
  }
1216
1184
  router.post("/mapping/entity", async (request, response) => {
1217
- var _a;
1218
1185
  try {
1219
1186
  const entity = request.body;
1220
1187
  if (!entity.serviceId) {
@@ -1225,10 +1192,7 @@ async function createRouter(options) {
1225
1192
  if (entity.entityRef !== "" && (entity.integrationKey === "" || entity.integrationKey === void 0)) {
1226
1193
  const backstageVendorId = "PRO19CT";
1227
1194
  const service = await getServiceById(entity.serviceId, entity.account);
1228
- const backstageIntegration = (_a = service.integrations) == null ? void 0 : _a.find((integration) => {
1229
- var _a2;
1230
- return ((_a2 = integration.vendor) == null ? void 0 : _a2.id) === backstageVendorId;
1231
- });
1195
+ const backstageIntegration = service.integrations?.find((integration) => integration.vendor?.id === backstageVendorId);
1232
1196
  if (!backstageIntegration) {
1233
1197
  const integrationKey = await createServiceIntegration({
1234
1198
  serviceId: entity.serviceId,
@@ -1242,10 +1206,10 @@ async function createRouter(options) {
1242
1206
  }
1243
1207
  const entityMappingId = await store.insertEntityMapping(entity);
1244
1208
  if (entity.entityRef !== "") {
1245
- await (catalogApi == null ? void 0 : catalogApi.refreshEntity(entity.entityRef));
1209
+ await catalogApi?.refreshEntity(entity.entityRef);
1246
1210
  }
1247
1211
  if (oldMapping && oldMapping.entityRef !== "") {
1248
- await (catalogApi == null ? void 0 : catalogApi.refreshEntity(oldMapping.entityRef));
1212
+ await catalogApi?.refreshEntity(oldMapping.entityRef);
1249
1213
  }
1250
1214
  response.json({
1251
1215
  id: entityMappingId,
@@ -1317,9 +1281,8 @@ async function createRouter(options) {
1317
1281
  }
1318
1282
  });
1319
1283
  router.get("/mapping/entity/service/:serviceId", async (request, response) => {
1320
- var _a;
1321
1284
  try {
1322
- const serviceId = (_a = request.params.serviceId) != null ? _a : "";
1285
+ const serviceId = request.params.serviceId ?? "";
1323
1286
  if (serviceId === "") {
1324
1287
  response.status(400).json("Required params not specified.");
1325
1288
  return;
@@ -1556,7 +1519,7 @@ class PagerDutyBackendDatabase {
1556
1519
  this.db = db;
1557
1520
  }
1558
1521
  static async create(knex, options) {
1559
- if (options == null ? void 0 : options.skipMigrations) {
1522
+ if (options?.skipMigrations) {
1560
1523
  const migrationsDir = backendPluginApi.resolvePackagePath("@pagerduty/backstage-plugin-backend", "migrations");
1561
1524
  await knex.migrate.latest({
1562
1525
  directory: migrationsDir
@@ -1 +1 @@
1
- {"version":3,"file":"index.cjs.js","sources":["../src/auth/auth.ts","../src/apis/pagerduty.ts","../src/service/router.ts","../src/db/PagerDutyBackendDatabase.ts","../src/plugin.ts"],"sourcesContent":["import { LoggerService, RootConfigService } from \"@backstage/backend-plugin-api\";\nimport { HttpError, PagerDutyAccountConfig } from \"@pagerduty/backstage-plugin-common\";\n\ntype AccountTokenInfo = {\n authToken: string;\n authTokenExpiryDate: number;\n}\n\ntype Auth = {\n config: RootConfigService;\n logger: LoggerService;\n accountTokens: Record<string, AccountTokenInfo>;\n defaultAccount?: string;\n}\n\nlet authPersistence: Auth;\nlet isLegacyConfig = false;\n\nexport async function getAuthToken(accountId? : string): Promise<string> {\n\n // if authPersistence is not initialized, load the auth config\n if (!authPersistence?.accountTokens) {\n await loadAuthConfig(authPersistence.config, authPersistence.logger);\n }\n\n if(isLegacyConfig){\n if (\n (authPersistence.accountTokens.default.authToken !== '' &&\n authPersistence.accountTokens.default.authToken.includes('Bearer') &&\n authPersistence.accountTokens.default.authTokenExpiryDate > Date.now()) // case where OAuth token is still valid\n ||\n (authPersistence.accountTokens.default.authToken !== '' &&\n authPersistence.accountTokens.default.authToken.includes('Token'))) { // case where API token is used\n \n return authPersistence.accountTokens.default.authToken;\n }\n }\n else {\n // check if accountId is provided\n if (accountId && accountId !== '') {\n if (\n (authPersistence.accountTokens[accountId].authToken !== '' &&\n authPersistence.accountTokens[accountId].authToken.includes('Bearer') &&\n authPersistence.accountTokens[accountId].authTokenExpiryDate > Date.now()) // case where OAuth token is still valid\n ||\n (authPersistence.accountTokens[accountId].authToken !== '' &&\n authPersistence.accountTokens[accountId].authToken.includes('Token'))) { // case where API token is used\n\n return authPersistence.accountTokens[accountId].authToken;\n }\n }\n\n else { // return default account token if accountId is not provided\n const defaultFallback = authPersistence.defaultAccount ?? \"\";\n\n if (\n (authPersistence.accountTokens[defaultFallback].authToken !== '' &&\n authPersistence.accountTokens[defaultFallback].authToken.includes('Bearer') &&\n authPersistence.accountTokens[defaultFallback].authTokenExpiryDate > Date.now()) // case where OAuth token is still valid\n ||\n (authPersistence.accountTokens[defaultFallback].authToken !== '' &&\n authPersistence.accountTokens[defaultFallback].authToken.includes('Token'))) { // case where API token is used\n\n return authPersistence.accountTokens[defaultFallback].authToken;\n }\n }\n }\n\n return '';\n}\n\nexport async function loadAuthConfig(config : RootConfigService, logger: LoggerService) {\n try {\n const defaultAccountId = 'default';\n\n // initiliaze the authPersistence in-memory object\n authPersistence = {\n config,\n logger,\n accountTokens: {}\n };\n\n // check if new accounts config is present\n if(!config.getOptional('pagerDuty.accounts')){\n isLegacyConfig = true;\n logger.warn('No PagerDuty accounts configuration found in config file. Reverting to legacy configuration.');\n\n if (!config.getOptionalString('pagerDuty.apiToken')) {\n logger.warn('No PagerDuty API token found in config file. Trying OAuth token instead...');\n\n if (!config.getOptional('pagerDuty.oauth')) {\n\n logger.error('No PagerDuty OAuth configuration found in config file.');\n\n } else if (!config.getOptionalString('pagerDuty.oauth.clientId') || !config.getOptionalString('pagerDuty.oauth.clientSecret') || !config.getOptionalString('pagerDuty.oauth.subDomain')) {\n\n logger.error(\"Missing required PagerDuty OAuth parameters in config file. 'clientId', 'clientSecret', and 'subDomain' are required. 'region' is optional.\");\n\n } else {\n const tokenInfo : AccountTokenInfo = await getOAuthToken(\n config.getString('pagerDuty.oauth.clientId'),\n config.getString('pagerDuty.oauth.clientSecret'),\n config.getString('pagerDuty.oauth.subDomain'),\n config.getOptionalString('pagerDuty.oauth.region') ?? 'us');\n\n authPersistence.accountTokens[defaultAccountId] = tokenInfo;\n\n logger.info('PagerDuty OAuth configuration loaded successfully.');\n }\n } else {\n authPersistence.accountTokens[defaultAccountId] = {\n authToken: `Token token=${config.getString('pagerDuty.apiToken')}`,\n authTokenExpiryDate: Date.now() + 3600000 * 24 * 365 * 2 // 2 years\n };\n\n logger.info('PagerDuty API token loaded successfully.');\n }\n } \n else { // new accounts config is present\n logger.info('New PagerDuty accounts configuration found in config file.');\n isLegacyConfig = false;\n const accounts = config.getOptional<PagerDutyAccountConfig[]>('pagerDuty.accounts');\n\n\n if(accounts && accounts?.length === 1){\n logger.info('Only one account found in config file. Setting it as default.');\n authPersistence.defaultAccount = accounts[0].id;\n }\n\n accounts?.forEach(async account => {\n const maskedAccountId = maskString(account.id);\n\n if(account.isDefault && !authPersistence.defaultAccount){\n logger.info(`Default account found in config file. Setting it as default.`);\n authPersistence.defaultAccount = account.id;\n }\n\n if (!account.apiToken) {\n logger.warn('No PagerDuty API token found in config file. Trying OAuth token instead...');\n\n if (!account.oauth) {\n logger.error('No PagerDuty OAuth configuration found in config file.');\n } else if (!account.oauth.clientId || !account.oauth.clientSecret || !account.oauth.subDomain) {\n logger.error(\"Missing required PagerDuty OAuth parameters in config file. 'clientId', 'clientSecret', and 'subDomain' are required. 'region' is optional.\");\n } else {\n const tokenInfo : AccountTokenInfo = await getOAuthToken(\n account.oauth.clientId,\n account.oauth.clientSecret,\n account.oauth.subDomain,\n account.oauth.region ?? 'us');\n\n authPersistence.accountTokens[account.id] = tokenInfo;\n\n logger.info(`PagerDuty OAuth configuration loaded successfully for account ${maskedAccountId}.`);\n }\n } else {\n authPersistence.accountTokens[account.id] = {\n authToken: `Token token=${account.apiToken}`,\n authTokenExpiryDate: Date.now() + 3600000 * 24 * 365 * 2 // 2 years\n };\n\n logger.info(`PagerDuty API token loaded successfully for account ${maskedAccountId}.`);\n }\n });\n\n if(!authPersistence.defaultAccount){\n logger.error('No default account found in config file. One account must be marked as default.');\n }\n }\n }\n catch (error) {\n logger.error(`Unable to retrieve valid PagerDuty AUTH configuration from config file: ${error}`);\n }\n}\n\nasync function getOAuthToken(clientId: string, clientSecret: string, subDomain: string, region: string): Promise<AccountTokenInfo> {\n // check if required parameters are provided\n if (!clientId || !clientSecret || !subDomain) {\n throw new Error('Missing required PagerDuty OAuth parameters.');\n }\n\n // define the scopes required for the OAuth token\n const scopes = `\n abilities.read \n analytics.read\n change_events.read \n escalation_policies.read \n incidents.read \n oncalls.read \n schedules.read \n services.read \n services.write \n standards.read\n teams.read \n users.read \n vendors.read\n `;\n\n // encode the parameters for the request\n const urlencoded = new URLSearchParams();\n urlencoded.append(\"grant_type\", \"client_credentials\");\n urlencoded.append(\"client_id\", clientId);\n urlencoded.append(\"client_secret\", clientSecret);\n urlencoded.append(\"scope\", `as_account-${region}.${subDomain} ${scopes}`);\n\n let response: Response;\n const options: RequestInit = {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/x-www-form-urlencoded',\n },\n body: urlencoded,\n };\n const baseUrl = 'https://identity.pagerduty.com/oauth/token';\n\n try {\n response = await fetch(baseUrl, options);\n } catch (error) {\n throw new Error(`Failed to retrieve oauth token: ${error}`);\n }\n\n switch (response.status) {\n case 400:\n throw new HttpError(\"Failed to retrieve valid token. Bad Request - Invalid arguments provided.\", 400);\n case 401:\n throw new HttpError(\"Failed to retrieve valid token. Forbidden - Invalid credentials provided.\", 401);\n default: // 200\n break;\n }\n\n const authResponse = await response.json();\n\n const result : AccountTokenInfo = {\n authToken: `Bearer ${authResponse.access_token}`,\n authTokenExpiryDate: Date.now() + (authResponse.expires_in * 1000)\n };\n\n return result;\n}\n\nfunction maskString(str: string) : string {\n return str[0] + '*'.repeat(str.length - 2) + str.slice(-1);\n}","import fetch from 'node-fetch';\nimport type { RequestInit, Response } from 'node-fetch';\n\nimport { getAuthToken } from '../auth/auth';\n\nimport {\n PagerDutyServiceResponse,\n PagerDutyServicesResponse,\n PagerDutyEscalationPolicy,\n PagerDutyEscalationPoliciesResponse,\n PagerDutyAbilitiesResponse,\n PagerDutyOnCallsResponse,\n PagerDutyUser,\n PagerDutyService,\n PagerDutyChangeEventsResponse,\n PagerDutyChangeEvent,\n PagerDutyIncident,\n PagerDutyIncidentsResponse,\n PagerDutyServiceStandards,\n PagerDutyServiceMetrics,\n HttpError,\n PagerDutyServicesAPIResponse,\n PagerDutyAccountConfig,\n PagerDutyIntegrationResponse,\n PagerDutyServiceDependency,\n PagerDutyServiceDependencyResponse,\n} from '@pagerduty/backstage-plugin-common';\n\nimport { DateTime } from 'luxon';\nimport { LoggerService, RootConfigService } from '@backstage/backend-plugin-api';\n\nexport type PagerDutyEndpointConfig = {\n eventsBaseUrl: string;\n apiBaseUrl: string\n}\n\nconst EndpointConfig: Record<string, PagerDutyEndpointConfig> = {};\nlet fallbackEndpointConfig: PagerDutyEndpointConfig;\nlet isLegacyConfig = false;\n\nexport function setFallbackEndpointConfig(account: PagerDutyAccountConfig) {\n fallbackEndpointConfig = {\n eventsBaseUrl: account.eventsBaseUrl ?? 'https://events.pagerduty.com/v2',\n apiBaseUrl: account.apiBaseUrl ?? 'https://api.pagerduty.com'\n };\n}\n\nexport function insertEndpointConfig(account: PagerDutyAccountConfig) {\n EndpointConfig[account.id] = {\n eventsBaseUrl: account.eventsBaseUrl ?? 'https://events.pagerduty.com/v2',\n apiBaseUrl: account.apiBaseUrl ?? 'https://api.pagerduty.com'\n };\n}\n\nexport function loadPagerDutyEndpointsFromConfig(config: RootConfigService, logger: LoggerService) {\n\n if (config.getOptional('pagerDuty.accounts')) {\n logger.debug(`New accounts configuration detected. Loading PagerDuty endpoints from config.`);\n isLegacyConfig = false;\n\n const accounts = config.getOptional<PagerDutyAccountConfig[]>('pagerDuty.accounts');\n\n if (accounts?.length === 1) {\n logger.debug(`Single account configuration detected. Loading PagerDuty endpoints from config to 'default'.`);\n EndpointConfig.default = {\n eventsBaseUrl: accounts[0].eventsBaseUrl !== undefined ? accounts[0].eventsBaseUrl : 'https://events.pagerduty.com/v2',\n apiBaseUrl: accounts[0].apiBaseUrl !== undefined ? accounts[0].apiBaseUrl : 'https://api.pagerduty.com'\n };\n }\n else {\n logger.debug(`Multiple account configuration detected. Loading PagerDuty endpoints from config.`);\n accounts?.forEach((account) => {\n\n if (account.isDefault) {\n setFallbackEndpointConfig(account);\n }\n\n insertEndpointConfig(account);\n });\n }\n }\n else {\n logger.debug(`Loading legacy PagerDuty endpoints from config.`);\n isLegacyConfig = true;\n\n EndpointConfig.default = {\n eventsBaseUrl: config.getOptionalString('pagerDuty.eventsBaseUrl') !== undefined ? config.getString('pagerDuty.eventsBaseUrl') : 'https://events.pagerduty.com/v2',\n apiBaseUrl: config.getOptionalString('pagerDuty.apiBaseUrl') !== undefined ? config.getString('pagerDuty.apiBaseUrl') : 'https://api.pagerduty.com'\n };\n }\n}\n\nfunction getApiBaseUrl(account?: string): string {\n if (isLegacyConfig === true) {\n return EndpointConfig.default.apiBaseUrl;\n }\n\n if (account) {\n return EndpointConfig[account].apiBaseUrl;\n }\n\n return fallbackEndpointConfig.apiBaseUrl;\n}\n\n// Supporting router\nexport async function addServiceRelationsToService(serviceRelations: PagerDutyServiceDependency[], account?: string): Promise<PagerDutyServiceDependency[]> {\n let response: Response;\n const options: RequestInit = {\n method: 'POST',\n headers: {\n Authorization: await getAuthToken(account),\n 'Accept': 'application/vnd.pagerduty+json;version=2',\n 'Content-Type': 'application/json',\n },\n body: JSON.stringify({\n relationships: serviceRelations\n })\n };\n\n const apiBaseUrl = getApiBaseUrl(account);\n const baseUrl = `${apiBaseUrl}/service_dependencies/associate`;\n\n console.log(`Adding service relations: ${JSON.stringify({relationships: serviceRelations})}`);\n\n try {\n response = await fetchWithRetries(`${baseUrl}`, options);\n } catch (error) {\n throw new Error(`Failed to retrieve service dependencies: ${error}`);\n }\n\n if (response.status >= 500) {\n throw new HttpError(`Failed to add service dependencies. PagerDuty API returned a server error. Retrying with the same arguments will not work.`, response.status);\n }\n\n switch (response.status) {\n case 400:\n throw new HttpError(\"Failed to add service dependencies. Caller provided invalid arguments. Please review the response for error details. Retrying with the same arguments will not work.\", 400);\n case 401:\n throw new HttpError(\"Failed to add service dependencies. Caller did not supply credentials or did not provide the correct credentials. If you are using an API key, it may be invalid or your Authorization header may be malformed.\", 401);\n case 403:\n throw new HttpError(\"Failed to add service dependencies. Caller is not authorized to view the requested resource. While your authentication is valid, the authenticated user or token does not have permission to perform this action.\", 403);\n case 404:\n throw new HttpError(\"Failed to add service dependencies. The requested resource was not found.\", 404);\n default: // 200\n break;\n }\n\n let result: PagerDutyServiceDependencyResponse;\n try {\n result = await response.json();\n\n return result.relationships;\n\n } catch (error) {\n throw new HttpError(`Failed to parse service dependency information: ${error}`, 500);\n }\n}\n\nexport async function removeServiceRelationsFromService(serviceRelations: PagerDutyServiceDependency[], account?: string): Promise<PagerDutyServiceDependency[]> {\n let response: Response;\n const options: RequestInit = {\n method: 'POST',\n headers: {\n Authorization: await getAuthToken(account),\n 'Accept': 'application/vnd.pagerduty+json;version=2',\n 'Content-Type': 'application/json',\n },\n body: JSON.stringify({\n relationships: serviceRelations\n })\n };\n\n const apiBaseUrl = getApiBaseUrl(account);\n const baseUrl = `${apiBaseUrl}/service_dependencies/disassociate`;\n\n console.log(`Removing service relations: ${JSON.stringify({ relationships: serviceRelations })}`);\n\n try {\n response = await fetchWithRetries(`${baseUrl}`, options);\n } catch (error) {\n throw new Error(`Failed to retrieve service dependencies: ${error}`);\n }\n\n if (response.status >= 500) {\n throw new HttpError(`Failed to remove service dependencies. PagerDuty API returned a server error. Retrying with the same arguments will not work.`, response.status);\n }\n\n switch (response.status) {\n case 400:\n throw new HttpError(\"Failed to remove service dependencies. Caller provided invalid arguments. Please review the response for error details. Retrying with the same arguments will not work.\", 400);\n case 401:\n throw new HttpError(\"Failed to remove service dependencies. Caller did not supply credentials or did not provide the correct credentials. If you are using an API key, it may be invalid or your Authorization header may be malformed.\", 401);\n case 403:\n throw new HttpError(\"Failed to remove service dependencies. Caller is not authorized to view the requested resource. While your authentication is valid, the authenticated user or token does not have permission to perform this action.\", 403);\n case 404:\n throw new HttpError(\"Failed to remove service dependencies. The requested resource was not found.\", 404);\n default: // 200\n break;\n }\n\n let result: PagerDutyServiceDependencyResponse;\n try {\n result = await response.json();\n\n return result.relationships;\n\n } catch (error) {\n throw new HttpError(`Failed to parse service dependency information: ${error}`, 500);\n }\n}\n\nexport async function getServiceRelationshipsById(serviceId: string, account?: string): Promise<PagerDutyServiceDependency[]> {\n let response: Response;\n const options: RequestInit = {\n method: 'GET',\n headers: {\n Authorization: await getAuthToken(account),\n 'Accept': 'application/vnd.pagerduty+json;version=2',\n 'Content-Type': 'application/json',\n },\n };\n\n const apiBaseUrl = getApiBaseUrl(account);\n const baseUrl = `${apiBaseUrl}/service_dependencies/technical_services/${serviceId}`;\n\n try {\n response = await fetchWithRetries(baseUrl, options);\n } catch (error) {\n console.log(`Failed to retrieve service dependencies: ${error}`);\n throw new Error(`Failed to retrieve service dependencies: ${error}`);\n }\n\n if (response.status >= 500) {\n console.log(\"Failed to list service dependencies. PagerDuty API returned a server error. Retrying with the same arguments will not work.\");\n throw new HttpError(`Failed to list service dependencies. PagerDuty API returned a server error. Retrying with the same arguments will not work.`, response.status);\n }\n\n switch (response.status) {\n case 400:\n throw new HttpError(\"Failed to list service dependencies. Caller provided invalid arguments. Please review the response for error details. Retrying with the same arguments will not work.\", 400);\n case 401:\n throw new HttpError(\"Failed to list service dependencies. Caller did not supply credentials or did not provide the correct credentials. If you are using an API key, it may be invalid or your Authorization header may be malformed.\", 401);\n case 403:\n throw new HttpError(\"Failed to list service dependencies. Caller is not authorized to view the requested resource. While your authentication is valid, the authenticated user or token does not have permission to perform this action.\", 403);\n case 404:\n throw new HttpError(\"Failed to list service dependencies. The requested resource was not found.\", 404);\n default: // 200\n break;\n }\n\n let result: PagerDutyServiceDependencyResponse;\n try {\n result = await response.json();\n\n console.log(`Service ${serviceId} has the following dependencies: ${JSON.stringify(result.relationships)}`);\n\n return result.relationships;\n } catch (error) {\n throw new HttpError(`Failed to parse service dependency information: ${error}`, 500);\n }\n}\n\n\nasync function getEscalationPolicies(offset: number, limit: number, account?: string): Promise<[Boolean, PagerDutyEscalationPolicy[]]> {\n let response: Response;\n const params = `total=true&sort_by=name&offset=${offset}&limit=${limit}`;\n const options: RequestInit = {\n method: 'GET',\n headers: {\n Authorization: await getAuthToken(account),\n 'Accept': 'application/vnd.pagerduty+json;version=2',\n 'Content-Type': 'application/json',\n },\n };\n\n const apiBaseUrl = getApiBaseUrl(account);\n const baseUrl = `${apiBaseUrl}/escalation_policies`;\n\n try {\n response = await fetchWithRetries(`${baseUrl}?${params}`, options);\n } catch (error) {\n throw new Error(`Failed to retrieve escalation policies: ${error}`);\n }\n\n if (response.status >= 500) {\n throw new HttpError(`Failed to list escalation policies. PagerDuty API returned a server error. Retrying with the same arguments will not work.`, response.status);\n }\n\n switch (response.status) {\n case 400:\n throw new HttpError(\"Failed to list escalation policies. Caller provided invalid arguments.\", 400);\n case 401:\n throw new HttpError(\"Failed to list escalation policies. Caller did not supply credentials or did not provide the correct credentials.\", 401);\n case 403:\n throw new HttpError(\"Failed to list escalation policies. Caller is not authorized to view the requested resource.\", 403);\n case 429:\n throw new HttpError(\"Failed to list escalation policies. Rate limit exceeded.\", 429);\n default: // 200\n break;\n }\n\n let result: PagerDutyEscalationPoliciesResponse;\n try {\n result = await response.json() as PagerDutyEscalationPoliciesResponse;\n\n return [result.more ?? false, result.escalation_policies];\n\n } catch (error) {\n throw new HttpError(`Failed to parse escalation policy information: ${error}`, 500);\n }\n}\n\nexport async function getAllEscalationPolicies(): Promise<PagerDutyEscalationPolicy[]> {\n const limit = 50;\n let offset = 0;\n let moreResults = false;\n let results: PagerDutyEscalationPolicy[] = [];\n\n await Promise.all(\n Object.keys(EndpointConfig).map(async (account) => {\n try {\n // reset offset value\n offset = 0;\n\n do{\n const res = await getEscalationPolicies(offset, limit, account);\n \n // set account for each escalation policy\n res[1].forEach((policy) => {\n policy.account = account;\n });\n\n // update results\n results = results.concat(res[1]);\n\n // if more results exist\n if (res[0] === true) {\n moreResults = true;\n offset += limit;\n }\n else {\n moreResults = false;\n }\n } while (moreResults === true);\n\n } catch (error) {\n if (error instanceof HttpError) {\n throw error;\n }\n else {\n throw new HttpError(`${error}`, 500);\n }\n }\n\n }));\n\n return results;\n}\n\nexport async function isEventNoiseReductionEnabled(account?: string): Promise<boolean> {\n let response: Response;\n const baseUrl = 'https://api.pagerduty.com';\n const options: RequestInit = {\n method: 'GET',\n headers: {\n Authorization: await getAuthToken(account),\n 'Accept': 'application/vnd.pagerduty+json;version=2',\n 'Content-Type': 'application/json',\n },\n };\n\n try {\n response = await fetchWithRetries(`${baseUrl}/abilities`, options);\n } catch (error) {\n throw new Error(`Failed to read abilities: ${error}`);\n }\n\n if (response.status >= 500) {\n throw new HttpError(`Failed to read abilities. PagerDuty API returned a server error. Retrying with the same arguments will not work.`, response.status);\n }\n\n switch (response.status) {\n case 401:\n throw new Error(`Failed to read abilities. Caller did not supply credentials or did not provide the correct credentials.`);\n case 403:\n throw new Error(`Failed to read abilities. Caller is not authorized to view the requested resource.`);\n case 429:\n throw new Error(`Failed to read abilities. Rate limit exceeded.`);\n default: // 200\n break;\n }\n\n let result: PagerDutyAbilitiesResponse;\n try {\n result = await response.json() as PagerDutyAbilitiesResponse;\n\n if (result.abilities.includes('preview_intelligent_alert_grouping')\n && result.abilities.includes('time_based_alert_grouping')) {\n return true;\n }\n\n return false;\n\n } catch (error) {\n throw new Error(`Failed to parse abilities information: ${error}`);\n }\n}\n\nexport async function getOncallUsers(escalationPolicy: string, account?: string): Promise<PagerDutyUser[]> {\n let response: Response;\n const params = `time_zone=UTC&include[]=users&escalation_policy_ids[]=${escalationPolicy}`;\n const options: RequestInit = {\n method: 'GET',\n headers: {\n Authorization: await getAuthToken(account),\n 'Accept': 'application/vnd.pagerduty+json;version=2',\n 'Content-Type': 'application/json',\n },\n };\n\n const apiBaseUrl = getApiBaseUrl(account);\n const baseUrl = `${apiBaseUrl}/oncalls`;\n\n try {\n response = await fetchWithRetries(`${baseUrl}?${params}`, options);\n } catch (error) {\n throw new Error(`Failed to retrieve oncalls: ${error}`);\n }\n\n if (response.status >= 500) {\n throw new HttpError(`Failed to list oncalls. PagerDuty API returned a server error. Retrying with the same arguments will not work.`, response.status);\n }\n\n switch (response.status) {\n case 400:\n throw new HttpError(\"Failed to list oncalls. Caller provided invalid arguments.\", 400);\n case 401:\n throw new HttpError(\"Failed to list oncalls. Caller did not supply credentials or did not provide the correct credentials.\", 401);\n case 403:\n throw new HttpError(\"Failed to list oncalls. Caller is not authorized to view the requested resource.\", 403);\n case 429:\n throw new HttpError(\"Failed to list oncalls. Rate limit exceeded.\", 429);\n default: // 200\n break;\n }\n\n let result: PagerDutyOnCallsResponse;\n let usersItem: PagerDutyUser[];\n try {\n result = await response.json() as PagerDutyOnCallsResponse;\n\n if (result.oncalls.length !== 0) {\n const oncallsSorted = [...result.oncalls].sort((a, b) => {\n return a.escalation_level - b.escalation_level;\n });\n\n const oncallsFiltered = oncallsSorted.filter((oncall) => {\n return oncall.escalation_level === oncallsSorted[0].escalation_level;\n });\n\n usersItem = [...oncallsFiltered]\n .sort((a, b) => a.user.name > b.user.name ? 1 : -1)\n .map((oncall) => oncall.user);\n\n\n // remove duplicates from usersItem\n const uniqueUsers = new Map();\n usersItem.forEach((user) => {\n uniqueUsers.set(user.id, user);\n });\n\n usersItem.length = 0;\n uniqueUsers.forEach((user) => {\n usersItem.push(user);\n });\n\n return usersItem;\n }\n\n return [];\n\n } catch (error) {\n throw new HttpError(`Failed to parse oncall information: ${error}`, 500);\n }\n}\n\nexport async function getServiceById(serviceId: string, account?: string): Promise<PagerDutyService> {\n let response: Response;\n const params = `time_zone=UTC&include[]=integrations&include[]=escalation_policies`;\n const token = await getAuthToken(account);\n\n const options: RequestInit = {\n method: 'GET',\n headers: {\n Authorization: token,\n 'Accept': 'application/vnd.pagerduty+json;version=2',\n 'Content-Type': 'application/json',\n },\n };\n\n const apiBaseUrl = getApiBaseUrl(account);\n const baseUrl = `${apiBaseUrl}/services`;\n\n try {\n response = await fetchWithRetries(`${baseUrl}/${serviceId}?${params}`, options);\n } catch (error) {\n throw new Error(`Failed to retrieve service: ${error}`);\n }\n\n if (response.status >= 500) {\n throw new HttpError(`Failed to get service. PagerDuty API returned a server error. Retrying with the same arguments will not work.`, response.status);\n }\n\n switch (response.status) {\n case 400:\n throw new HttpError(\"Failed to get service. Caller provided invalid arguments.\", 400);\n case 401:\n throw new HttpError(\"Failed to get service. Caller did not supply credentials or did not provide the correct credentials.\", 401);\n case 403:\n throw new HttpError(\"Failed to get service. Caller is not authorized to view the requested resource.\", 403);\n case 404:\n throw new HttpError(\"Failed to get service. The requested resource was not found.\", 404);\n default: // 200\n break;\n }\n\n let result: PagerDutyServiceResponse;\n try {\n result = await response.json() as PagerDutyServiceResponse;\n\n return result.service;\n } catch (error) {\n throw new HttpError(`Failed to parse service information: ${error}`, 500);\n }\n}\n\nexport async function getServiceByIntegrationKey(integrationKey: string, account?: string): Promise<PagerDutyService> {\n let response: Response;\n const params = `query=${integrationKey}&time_zone=UTC&include[]=integrations&include[]=escalation_policies`;\n const token = await getAuthToken(account);\n\n const options: RequestInit = {\n method: 'GET',\n headers: {\n Authorization: token,\n 'Accept': 'application/vnd.pagerduty+json;version=2',\n 'Content-Type': 'application/json',\n },\n };\n\n const apiBaseUrl = getApiBaseUrl(account);\n const baseUrl = `${apiBaseUrl}/services`;\n\n try {\n response = await fetchWithRetries(`${baseUrl}?${params}`, options);\n } catch (error) {\n throw new Error(`Failed to retrieve service: ${error}`);\n }\n\n if (response.status >= 500) {\n throw new HttpError(`Failed to get service. PagerDuty API returned a server error. Retrying with the same arguments will not work.`, response.status);\n }\n\n switch (response.status) {\n case 400:\n throw new HttpError(\"Failed to get service. Caller provided invalid arguments.\", 400);\n case 401:\n throw new HttpError(\"Failed to get service. Caller did not supply credentials or did not provide the correct credentials.\", 401);\n case 403:\n throw new HttpError(\"Failed to get service. Caller is not authorized to view the requested resource.\", 403);\n case 404:\n throw new HttpError(\"Failed to get service. The requested resource was not found.\", 404);\n default: // 200\n break;\n }\n\n let result: PagerDutyServicesResponse;\n try {\n result = await response.json() as PagerDutyServicesResponse;\n } catch (error) {\n throw new HttpError(`Failed to parse service information: ${error}`, 500);\n }\n\n if (result.services.length === 0) {\n throw new HttpError(`Failed to get service. The requested resource was not found.`, 404);\n }\n\n return result.services[0];\n}\n\nexport async function getAllServices(): Promise<PagerDutyService[]> {\n const allServices: PagerDutyService[] = [];\n\n await Promise.all(\n Object.entries(EndpointConfig).map(async ([account, _]) => {\n let response: Response;\n const params = `time_zone=UTC&include[]=integrations&include[]=escalation_policies&include[]=teams&total=true`;\n\n const token = await getAuthToken(account);\n\n const options: RequestInit = {\n method: 'GET',\n headers: {\n Authorization: token,\n 'Accept': 'application/vnd.pagerduty+json;version=2',\n 'Content-Type': 'application/json',\n },\n };\n\n const apiBaseUrl = getApiBaseUrl(account);\n const baseUrl = `${apiBaseUrl}/services`;\n\n let offset = 0;\n const limit = 50;\n let result: PagerDutyServicesAPIResponse;\n\n try {\n do {\n const paginatedUrl = `${baseUrl}?${params}&offset=${offset}&limit=${limit}`;\n\n response = await fetchWithRetries(paginatedUrl, options);\n\n if (response.status >= 500) {\n throw new HttpError(`Failed to get services. PagerDuty API returned a server error. Retrying with the same arguments will not work.`, response.status);\n }\n\n switch (response.status) {\n case 400:\n throw new HttpError(\"Failed to get services. Caller provided invalid arguments.\", 400);\n case 401:\n throw new HttpError(\"Failed to get services. Caller did not supply credentials or did not provide the correct credentials.\", 401);\n case 403:\n throw new HttpError(\"Failed to get services. Caller is not authorized to view the requested resource.\", 403);\n default: // 200\n break;\n }\n\n result = await response.json() as PagerDutyServicesAPIResponse;\n\n // set account\n result.services.forEach((service) => {\n service.account = account;\n });\n\n allServices.push(...result.services);\n\n offset += limit;\n } while (offset < result.total!);\n } catch (error) {\n throw error;\n }\n\n }));\n\n return allServices;\n}\n\nexport async function getChangeEvents(serviceId: string, account?: string): Promise<PagerDutyChangeEvent[]> {\n let response: Response;\n const params = `limit=5&time_zone=UTC&sort_by=timestamp`;\n const options: RequestInit = {\n method: 'GET',\n headers: {\n Authorization: await getAuthToken(account),\n 'Accept': 'application/vnd.pagerduty+json;version=2',\n 'Content-Type': 'application/json',\n },\n };\n\n const apiBaseUrl = getApiBaseUrl(account);\n const baseUrl = `${apiBaseUrl}/services`;\n\n try {\n response = await fetchWithRetries(`${baseUrl}/${serviceId}/change_events?${params}`, options);\n } catch (error) {\n throw new Error(`Failed to retrieve change events for service: ${error}`);\n }\n\n if (response.status >= 500) {\n throw new HttpError(`Failed to get change events for service. PagerDuty API returned a server error. Retrying with the same arguments will not work.`, response.status);\n }\n\n switch (response.status) {\n case 400:\n throw new HttpError(\"Failed to get change events for service. Caller provided invalid arguments.\", 400);\n case 401:\n throw new HttpError(\"Failed to get change events for service. Caller did not supply credentials or did not provide the correct credentials.\", 401);\n case 403:\n throw new HttpError(\"Failed to get change events for service. Caller is not authorized to view the requested resource.\", 403);\n case 404:\n throw new HttpError(\"Failed to get change events for service. The requested resource was not found.\", 404);\n default: // 200\n break;\n }\n\n let result: PagerDutyChangeEventsResponse;\n try {\n result = await response.json() as PagerDutyChangeEventsResponse;\n\n return result.change_events;\n } catch (error) {\n throw new HttpError(`Failed to parse change events information: ${error}`, 500);\n }\n}\n\nexport async function getIncidents(serviceId: string, account?: string): Promise<PagerDutyIncident[]> {\n let response: Response;\n const params = `time_zone=UTC&sort_by=created_at&statuses[]=triggered&statuses[]=acknowledged&service_ids[]=${serviceId}`;\n\n const options: RequestInit = {\n method: 'GET',\n headers: {\n Authorization: await getAuthToken(account),\n 'Accept': 'application/vnd.pagerduty+json;version=2',\n 'Content-Type': 'application/json',\n },\n };\n\n const apiBaseUrl = getApiBaseUrl(account);\n const baseUrl = `${apiBaseUrl}/incidents`;\n\n try {\n response = await fetchWithRetries(`${baseUrl}?${params}`, options);\n } catch (error) {\n throw new Error(`Failed to retrieve incidents for service: ${error}`);\n }\n\n if (response.status >= 500) {\n throw new HttpError(`Failed to get incidents for service. PagerDuty API returned a server error. Retrying with the same arguments will not work.`, response.status);\n }\n\n switch (response.status) {\n case 400:\n throw new HttpError(\"Failed to get incidents for service. Caller provided invalid arguments.\", 400);\n case 401:\n throw new HttpError(\"Failed to get incidents for service. Caller did not supply credentials or did not provide the correct credentials.\", 401);\n case 402:\n throw new HttpError(\"Failed to get incidents for service. Account does not have the abilities to perform the action. Please review the response for the required abilities.\", 402);\n case 403:\n throw new HttpError(\"Failed to get incidents for service. Caller is not authorized to view the requested resource.\", 403);\n case 429:\n throw new HttpError(\"Failed to get incidents for service. Too many requests have been made, the rate limit has been reached.\", 429);\n default: // 200\n break;\n }\n\n let result: PagerDutyIncidentsResponse;\n try {\n result = await response.json() as PagerDutyIncidentsResponse;\n\n return result.incidents;\n } catch (error) {\n throw new HttpError(`Failed to parse incidents information: ${error}`, 500);\n }\n}\n\nexport async function getServiceStandards(serviceId: string, account?: string): Promise<PagerDutyServiceStandards> {\n let response: Response;\n\n const options: RequestInit = {\n method: 'GET',\n headers: {\n Authorization: await getAuthToken(account),\n 'Accept': 'application/vnd.pagerduty+json;version=2',\n 'Content-Type': 'application/json',\n },\n };\n\n const apiBaseUrl = getApiBaseUrl(account);\n const baseUrl = `${apiBaseUrl}/standards/scores/technical_services/${serviceId}`;\n\n try {\n response = await fetchWithRetries(baseUrl, options);\n } catch (error) {\n throw new Error(`Failed to retrieve service standards for service: ${error}`);\n }\n\n if (response.status >= 500) {\n throw new HttpError(`Failed to get service standards for service. PagerDuty API returned a server error. Retrying with the same arguments will not work.`, response.status);\n }\n\n switch (response.status) {\n case 401:\n throw new HttpError(\"Failed to get service standards for service. Caller did not supply credentials or did not provide the correct credentials.\", 401);\n case 403:\n throw new HttpError(\"Failed to get service standards for service. Caller is not authorized to view the requested resource.\", 403);\n case 429:\n throw new HttpError(\"Failed to get service standards for service. Too many requests have been made, the rate limit has been reached.\", 429);\n default: // 200\n break;\n }\n\n try {\n const result = await response.json();\n return result;\n } catch (error) {\n throw new HttpError(`Failed to parse service standards information: ${error}`, 500);\n }\n}\n\nexport async function getServiceMetrics(serviceId: string, account?: string): Promise<PagerDutyServiceMetrics[]> {\n let response: Response;\n\n const endDate = DateTime.now();\n const startDate = endDate.minus({ days: 30 });\n const body = JSON.stringify({\n filters: {\n created_at_start: startDate.toISO(),\n created_at_end: endDate.toISO(),\n service_ids: [\n serviceId\n ]\n }\n });\n\n const options: RequestInit = {\n method: 'POST',\n headers: {\n Authorization: await getAuthToken(account),\n 'Accept': 'application/vnd.pagerduty+json;version=2',\n 'Content-Type': 'application/json',\n },\n body: body\n };\n\n const apiBaseUrl = getApiBaseUrl(account);\n const baseUrl = `${apiBaseUrl}/analytics/metrics/incidents/services`;\n\n try {\n response = await fetchWithRetries(baseUrl, options);\n } catch (error) {\n throw new Error(`Failed to retrieve service metrics for service: ${error}`);\n }\n\n if (response.status >= 500) {\n throw new HttpError(`Failed to get service metrics for service. PagerDuty API returned a server error. Retrying with the same arguments will not work.`, response.status);\n }\n\n switch (response.status) {\n case 400:\n throw new HttpError(\"Failed to get service metrics for service. Caller provided invalid arguments. Please review the response for error details. Retrying with the same arguments will not work.\", 400);\n case 429:\n throw new HttpError(\"Failed to get service metrics for service. Too many requests have been made, the rate limit has been reached.\", 429);\n default: // 200\n break;\n }\n\n try {\n const result = await response.json();\n\n return result.data;\n } catch (error) {\n throw new HttpError(`Failed to parse service metrics information: ${error}`, 500);\n }\n}\n\nexport type CreateServiceIntegrationProps = {\n serviceId: string;\n vendorId: string;\n account?: string;\n}\n\nexport async function createServiceIntegration({ serviceId, vendorId, account }: CreateServiceIntegrationProps): Promise<string> {\n let response: Response;\n\n const apiBaseUrl = getApiBaseUrl(account);\n const baseUrl = `${apiBaseUrl}/services`;\n const token = await getAuthToken(account);\n\n const options: RequestInit = {\n method: 'POST',\n body: JSON.stringify({\n integration: {\n name: 'Backstage',\n service: {\n id: serviceId,\n type: 'service_reference',\n },\n vendor: {\n id: vendorId,\n type: 'vendor_reference',\n }\n }\n }),\n headers: {\n Authorization: token,\n 'Accept': 'application/vnd.pagerduty+json;version=2',\n 'Content-Type': 'application/json',\n },\n };\n\n try {\n response = await fetchWithRetries(`${baseUrl}/${serviceId}/integrations`, options);\n } catch (error) {\n throw new Error(`Failed to create service integration: ${error}`);\n }\n\n if (response.status >= 500) {\n throw new Error(`Failed to create service integration. PagerDuty API returned a server error. Retrying with the same arguments will not work.`);\n }\n\n switch (response.status) {\n case 400:\n throw new Error(`Failed to create service integration. Caller provided invalid arguments.`);\n case 401:\n throw new Error(`Failed to create service integration. Caller did not supply credentials or did not provide the correct credentials.`);\n case 403:\n throw new Error(`Failed to create service integration. Caller is not authorized to view the requested resource.`);\n case 429:\n throw new Error(`Failed to create service integration. Rate limit exceeded.`);\n default: // 201\n break;\n }\n\n let result: PagerDutyIntegrationResponse;\n try {\n result = await response.json() as PagerDutyIntegrationResponse;\n\n return result.integration.integration_key ?? '';\n\n } catch (error) {\n throw new Error(`Failed to parse service information: ${error}`);\n }\n}\n\nexport async function fetchWithRetries(url: string, options: RequestInit): Promise<Response> {\n let response: Response;\n let error: Error = new Error();\n\n // set retry parameters\n const maxRetries = 5;\n const delay = 1000;\n let factor = 2;\n\n for (let i = 0; i < maxRetries; i++) {\n try {\n response = await fetch(url, options);\n return response;\n } catch (e) {\n error = e;\n }\n\n const timeout = delay * factor;\n await new Promise(resolve => setTimeout(resolve, timeout));\n factor *= 2;\n }\n\n throw new Error(`Failed to fetch data after ${maxRetries} retries. Last error: ${error}`);\n}\n","import {\n AuthService,\n DiscoveryService,\n LoggerService,\n RootConfigService\n} from '@backstage/backend-plugin-api';\nimport {\n createLegacyAuthAdapters,\n errorHandler\n} from '@backstage/backend-common';\nimport {\n getAllEscalationPolicies,\n getChangeEvents,\n getIncidents,\n getOncallUsers,\n getServiceById,\n getServiceByIntegrationKey,\n getServiceStandards,\n getServiceMetrics,\n getAllServices,\n loadPagerDutyEndpointsFromConfig,\n createServiceIntegration,\n getServiceRelationshipsById,\n addServiceRelationsToService,\n removeServiceRelationsFromService\n} from '../apis/pagerduty';\nimport {\n HttpError,\n PagerDutyChangeEventsResponse,\n PagerDutyIncidentsResponse,\n PagerDutyOnCallUsersResponse,\n PagerDutyServiceResponse,\n PagerDutyServiceStandardsResponse,\n PagerDutyServiceMetricsResponse,\n PagerDutyServicesResponse,\n PagerDutyEntityMapping,\n PagerDutyEntityMappingsResponse,\n PagerDutyService,\n PagerDutyServiceDependency,\n PagerDutySetting\n} from '@pagerduty/backstage-plugin-common';\nimport { loadAuthConfig } from '../auth/auth';\nimport {\n PagerDutyBackendStore,\n RawDbEntityResultRow\n} from '../db/PagerDutyBackendDatabase';\nimport * as express from 'express';\nimport Router from 'express-promise-router';\nimport type {\n CatalogApi,\n GetEntitiesResponse\n} from '@backstage/catalog-client';\n\n\nexport interface RouterOptions {\n logger: LoggerService;\n config: RootConfigService;\n store: PagerDutyBackendStore;\n discovery: DiscoveryService;\n auth?: AuthService;\n catalogApi?: CatalogApi;\n}\n\nexport type Annotations = {\n \"pagerduty.com/integration-key\": string;\n \"pagerduty.com/service-id\": string;\n \"pagerduty.com/account\": string;\n}\n\nexport async function createComponentEntitiesReferenceDict({ items: componentEntities }: GetEntitiesResponse): Promise<Record<string, { ref: string, name: string }>> {\n const componentEntitiesDict: Record<string, { ref: string, name: string }> = {};\n\n await Promise.all(componentEntities.map(async (entity) => {\n const annotations: Annotations = JSON.parse(JSON.stringify(entity.metadata.annotations));\n const serviceId = annotations['pagerduty.com/service-id'];\n const integrationKey = annotations['pagerduty.com/integration-key'];\n const account = annotations['pagerduty.com/account'] ?? \"\";\n\n if (serviceId !== undefined && serviceId !== \"\") {\n componentEntitiesDict[serviceId] = {\n ref: `${entity.kind}:${entity.metadata.namespace}/${entity.metadata.name}`.toLowerCase(),\n name: entity.metadata.name,\n };\n }\n else if (integrationKey !== undefined && integrationKey !== \"\") {\n // get service id from integration key, we ignore errors here since we're focused\n // only on building a mapping between valid service IDs and the corresponding Backstage entity\n const service = await getServiceByIntegrationKey(integrationKey, account).catch(() => undefined);\n\n if (service !== undefined) {\n componentEntitiesDict[service.id] = {\n ref: `${entity.kind}:${entity.metadata.namespace}/${entity.metadata.name}`.toLowerCase(),\n name: entity.metadata.name,\n };\n }\n }\n }));\n\n return componentEntitiesDict;\n}\n\nexport async function buildEntityMappingsResponse(\n entityMappings: RawDbEntityResultRow[],\n componentEntitiesDict: Record<string, {\n ref: string;\n name: string;\n }>,\n componentEntities: GetEntitiesResponse,\n pagerDutyServices: PagerDutyService[]\n): Promise<PagerDutyEntityMappingsResponse> {\n\n const result: PagerDutyEntityMappingsResponse = {\n mappings: []\n };\n\n pagerDutyServices.forEach((service) => {\n // Check for service mapping annotation in any entity config file and get the entity ref\n const entityRef = componentEntitiesDict[service.id]?.ref;\n const entityName = componentEntitiesDict[service.id]?.name;\n\n // Check if the service is mapped to an entity in the database\n const entityMapping = entityMappings.find((mapping) => mapping.serviceId === service.id);\n\n if (entityMapping) {\n if (entityRef === undefined) {\n if (entityMapping.entityRef === \"\" || entityMapping.entityRef === undefined) {\n result.mappings.push({\n entityRef: \"\",\n entityName: \"\",\n integrationKey: entityMapping.integrationKey,\n serviceId: entityMapping.serviceId,\n status: \"NotMapped\",\n serviceName: service.name,\n team: service.teams?.[0]?.name ?? \"\",\n escalationPolicy: service.escalation_policy !== undefined ? service.escalation_policy.name : \"\",\n serviceUrl: service.html_url,\n account: service.account,\n });\n }\n else {\n const entityRefName = componentEntities.items.find((entity) => `${entity.kind}:${entity.metadata.namespace}/${entity.metadata.name}`.toLowerCase() === entityMapping.entityRef)?.metadata.name ?? \"\";\n\n result.mappings.push({\n entityRef: entityMapping.entityRef,\n entityName: entityRefName,\n serviceId: entityMapping.serviceId,\n integrationKey: entityMapping.integrationKey,\n status: \"OutOfSync\",\n serviceName: service.name,\n team: service.teams?.[0]?.name ?? \"\",\n escalationPolicy: service.escalation_policy !== undefined ? service.escalation_policy.name : \"\",\n serviceUrl: service.html_url,\n account: service.account,\n });\n }\n } else if (entityRef !== entityMapping.entityRef) {\n const entityRefName = componentEntities.items.find((entity) => `${entity.kind}:${entity.metadata.namespace}/${entity.metadata.name}`.toLowerCase() === entityMapping.entityRef)?.metadata.name ?? \"\";\n\n result.mappings.push({\n entityRef: entityMapping.entityRef !== \"\" ? entityMapping.entityRef : \"\",\n entityName: entityMapping.entityRef !== \"\" ? entityRefName : \"\",\n serviceId: entityMapping.serviceId,\n integrationKey: entityMapping.integrationKey,\n status: \"OutOfSync\",\n serviceName: service.name,\n team: service.teams?.[0]?.name ?? \"\",\n escalationPolicy: service.escalation_policy !== undefined ? service.escalation_policy.name : \"\",\n serviceUrl: service.html_url,\n account: service.account,\n });\n } else if (entityRef === entityMapping.entityRef) {\n result.mappings.push({\n entityRef: entityMapping.entityRef !== \"\" ? entityMapping.entityRef : \"\",\n entityName: entityMapping.entityRef !== \"\" ? entityName : \"\",\n serviceId: entityMapping.serviceId,\n integrationKey: entityMapping.integrationKey,\n status: \"InSync\",\n serviceName: service.name,\n team: service.teams?.[0]?.name ?? \"\",\n escalationPolicy: service.escalation_policy !== undefined ? service.escalation_policy.name : \"\",\n serviceUrl: service.html_url,\n account: service.account,\n });\n }\n } else {\n const backstageVendorId = 'PRO19CT';\n const backstageIntegrationKey = service.integrations?.find((integration) => integration.vendor?.id === backstageVendorId)?.integration_key ?? \"\";\n\n if (entityRef !== undefined) {\n result.mappings.push({\n entityRef: entityRef,\n entityName: entityName,\n serviceId: service.id,\n integrationKey: backstageIntegrationKey,\n status: \"InSync\",\n serviceName: service.name,\n team: service.teams?.[0]?.name ?? \"\",\n escalationPolicy: service.escalation_policy !== undefined ? service.escalation_policy.name : \"\",\n serviceUrl: service.html_url,\n account: service.account,\n });\n } else {\n result.mappings.push({\n entityRef: \"\",\n entityName: \"\",\n serviceId: service.id,\n integrationKey: backstageIntegrationKey,\n status: \"NotMapped\",\n serviceName: service.name,\n team: service.teams?.[0]?.name ?? \"\",\n escalationPolicy: service.escalation_policy !== undefined ? service.escalation_policy.name : \"\",\n serviceUrl: service.html_url,\n account: service.account,\n });\n }\n }\n });\n\n const sortedResult = result.mappings.sort((a, b) => {\n if (a.serviceName! < b.serviceName!) { return -1; }\n else if (a.serviceName! > b.serviceName!) { return 1; }\n return 0;\n });\n\n result.mappings = sortedResult;\n\n return result;\n}\n\nexport async function createRouter(\n options: RouterOptions\n): Promise<express.Router> {\n const { logger, config, store, catalogApi } = options;\n let { auth } = options;\n\n if (!auth) {\n auth = createLegacyAuthAdapters(options).auth;\n }\n\n // Get authentication Config\n await loadAuthConfig(config, logger);\n\n // Get optional PagerDuty custom endpoints from config\n loadPagerDutyEndpointsFromConfig(config, logger);\n\n // Create the router\n const router = Router();\n router.use(express.json());\n\n // DELETE /dependencies/service/:serviceId\n router.delete('/dependencies/service/:serviceId', async (request, response) => {\n try {\n // Get the serviceId from the request parameters\n const serviceId = request.params.serviceId || '';\n const account = request.query.account as string || '';\n\n if(serviceId === '') {\n logger.info(`Bad Request: ':serviceId' must be provided as part of the path`);\n response.status(400).json(\"Bad Request: ':serviceId' must be provided as part of the path\");\n }\n\n const dependencies: string[] = request.body;\n if(!dependencies || dependencies.length === 0) {\n logger.info(`Bad Request: 'dependencies' must be provided as part of the request body`);\n response.status(400).json(\"Bad Request: 'dependencies' must be provided as part of the request body\");\n }\n\n logger.info(`Received dependencies to remove from PagerDuty: ${JSON.stringify(dependencies)}`);\n\n const serviceRelations : PagerDutyServiceDependency[] = [];\n\n dependencies.forEach(async (dependency) => {\n serviceRelations.push({\n supporting_service: {\n id: dependency,\n type: \"service\"\n },\n dependent_service: {\n id: serviceId,\n type: \"service\"\n }\n });\n });\n\n await removeServiceRelationsFromService(serviceRelations, account);\n \n response.sendStatus(200);\n\n } catch (error) {\n if (error instanceof HttpError) {\n logger.error(`Error occurred while processing request: ${error.message}`);\n response.status(error.status).json({\n errors: [\n `${error.message}`\n ]\n });\n }\n }\n });\n\n // POST /dependencies/service/:serviceId\n router.post('/dependencies/service/:serviceId', async (request, response) => {\n try {\n // Get the serviceId from the request parameters\n logger.info(`Received params : ${JSON.stringify(request.params)}`);\n const serviceId = request.params.serviceId || '';\n const account = request.query.account as string || '';\n\n if(serviceId === '') {\n logger.info(`Bad Request: ':serviceId' must be provided as part of the path`);\n response.status(400).json(\"Bad Request: ':serviceId' must be provided as part of the path\");\n }\n\n const dependencies: string[] = request.body;\n if(!dependencies || dependencies.length === 0) {\n logger.info(`Bad Request: 'dependencies' must be provided as part of the request body`);\n response.status(400).json(\"Bad Request: 'dependencies' must be provided as part of the request body\");\n }\n\n logger.info(`Received dependencies to add to PagerDuty: ${JSON.stringify(dependencies)}`);\n\n const serviceRelations : PagerDutyServiceDependency[] = [];\n\n dependencies.forEach(async (dependency) => {\n serviceRelations.push({\n supporting_service: {\n id: dependency,\n type: \"service\"\n },\n dependent_service: {\n id: serviceId,\n type: \"service\"\n }\n });\n });\n\n await addServiceRelationsToService(serviceRelations, account);\n \n response.sendStatus(200);\n\n } catch (error) {\n if (error instanceof HttpError) {\n logger.error(`Error occurred while processing request: ${error.message}`);\n response.status(error.status).json({\n errors: [\n `${error.message}`\n ]\n });\n }\n }\n });\n\n\n router.get('/dependencies/service/:serviceId', async (request, response) => {\n try {\n const serviceId = request.params.serviceId;\n const account = request.query.account as string || '';\n\n if (serviceId) {\n const serviceRelationships: PagerDutyServiceDependency[] = await getServiceRelationshipsById(serviceId, account);\n\n if (serviceRelationships) {\n response.json({\n relationships: serviceRelationships\n });\n }\n }\n else {\n response.status(400).json(\"Bad Request: ':serviceId' must be provided as part of the path\");\n }\n }\n catch (error) {\n if (error instanceof HttpError) {\n response.status(error.status).json({\n errors: [\n `${error.message}`\n ]\n });\n }\n }\n });\n\n // GET /catalog/entity/:entityRef\n router.get('/catalog/entity/:type/:namespace/:name', async (request, response) => {\n const type = request.params.type;\n const namespace = request.params.namespace;\n const name = request.params.name;\n\n try {\n if (type && namespace && name) {\n const entityRef = `${type}:${namespace}/${name}`.toLowerCase();\n const foundEntity = await catalogApi?.getEntityByRef(entityRef);\n\n if (foundEntity) {\n response.json(foundEntity.metadata.annotations?.[\"pagerduty.com/service-id\"]);\n\n }\n else {\n response.status(404);\n }\n }\n else {\n response.status(400).json(\"Bad Request: ':entityRef' must be provided as part of the path\");\n }\n }\n catch (error) {\n if (error instanceof HttpError) {\n response.status(error.status).json({\n errors: [\n `${error.message}`\n ]\n });\n }\n }\n });\n\n // POST /settings\n router.post('/settings', async (request, response) => {\n try {\n // Get the serviceId from the request parameters\n const settings : PagerDutySetting[] = request.body;\n logger.info(`Received settings: ${JSON.stringify(settings)}`);\n\n // For each setting, update or insert the value in the database\n await Promise.all(settings.map(async (setting) => {\n logger.info(`Processing setting: ${JSON.stringify(setting)}`);\n if(setting.id === undefined || setting.value === undefined) {\n logger.info(`Bad Request: 'id' and 'value' are required`);\n response.status(400).json(\"Bad Request: 'id' and 'value' are required\");\n }\n\n if(!isValidSetting(setting.value)) {\n logger.info(`Bad Request: 'value' is invalid`);\n response.status(400).json(\"Bad Request: 'value' is invalid. Valid options are 'backstage', 'pagerduty', 'both' or 'disabled'\");\n }\n\n logger.info(`Setting value is valid: ${setting.value}`);\n await store.updateSetting(setting);\n logger.info(`Setting updated: ${JSON.stringify(setting)}`);\n \n }));\n\n response.sendStatus(200);\n\n } catch (error) {\n if (error instanceof HttpError) {\n logger.error(`Error occurred while processing request: ${error.message}`);\n response.status(error.status).json({\n errors: [\n `${error.message}`\n ]\n });\n }\n }\n });\n\n // GET /settings/:settingId\n router.get('/settings/:settingId', async (request, response) => {\n try {\n // Get param from the request\n const settingId = request.params.settingId;\n \n // Find setting by id\n const setting = await store.findSetting(settingId);\n\n if (!setting) {\n response.status(404).json({});\n return;\n }\n\n response.json(setting);\n } catch (error) {\n if (error instanceof HttpError) {\n response.status(error.status).json({\n errors: [\n `${error.message}`\n ]\n });\n }\n }\n });\n\n function isValidSetting(value: string): boolean {\n if(value === \"backstage\" || value === \"pagerduty\" || value === \"both\" || value === \"disabled\") {\n return true;\n }\n\n return false;\n }\n\n // POST /mapping/entity\n router.post('/mapping/entity', async (request, response) => {\n try {\n // Get the serviceId from the request parameters\n const entity: PagerDutyEntityMapping = request.body;\n\n if (!entity.serviceId) {\n response.status(400).json(\"Bad Request: 'service_id' is required\");\n }\n\n // Get all the entity mappings from the database\n const entityMappings = await store.getAllEntityMappings();\n const oldMapping = entityMappings.find((mapping) => mapping.serviceId === entity.serviceId);\n\n // in case a mapping is defined and no integration exists, \n // we need to create one\n if (entity.entityRef !== \"\" &&\n (entity.integrationKey === \"\" || entity.integrationKey === undefined)) {\n\n const backstageVendorId = 'PRO19CT';\n // check for existing integration key on service\n const service = await getServiceById(entity.serviceId, entity.account);\n const backstageIntegration = service.integrations?.find((integration) => integration.vendor?.id === backstageVendorId);\n\n if (!backstageIntegration) {\n // If an integration does not exist for service, \n // create it in PagerDuty\n const integrationKey = await createServiceIntegration({\n serviceId: entity.serviceId,\n vendorId: backstageVendorId,\n account: entity.account\n });\n\n entity.integrationKey = integrationKey;\n } else {\n entity.integrationKey = backstageIntegration.integration_key;\n }\n }\n\n const entityMappingId = await store.insertEntityMapping(entity);\n\n // Refresh new and old entity unless they are empty strings\n if (entity.entityRef !== \"\") {\n // force refresh of new entity\n await catalogApi?.refreshEntity(entity.entityRef);\n }\n\n if (oldMapping && oldMapping.entityRef !== \"\") {\n // force refresh of old entity\n await catalogApi?.refreshEntity(oldMapping.entityRef);\n }\n\n response.json({\n id: entityMappingId,\n entityRef: entity.entityRef,\n integrationKey: entity.integrationKey,\n serviceId: entity.serviceId,\n status: entity.status,\n account: entity.account,\n });\n } catch (error) {\n if (error instanceof HttpError) {\n logger.error(`Error occurred while processing request: ${error.message}`);\n response.status(error.status).json({\n errors: [\n `${error.message}`\n ]\n });\n }\n }\n });\n\n // GET /mapping/entity\n router.get('/mapping/entity', async (_, response) => {\n try {\n // Get all the entity mappings from the database\n const entityMappings = await store.getAllEntityMappings();\n\n // Get all the entities from the catalog\n const componentEntities = await catalogApi!.getEntities({\n filter: {\n kind: 'Component',\n }\n });\n\n // Build reference dictionary of componentEntities with serviceId as the key and entity reference and name pair as the value\n const componentEntitiesDict: Record<string, { ref: string, name: string }> = await createComponentEntitiesReferenceDict(componentEntities);\n\n // Get all services from PagerDuty\n const pagerDutyServices = await getAllServices();\n\n // Build the response object\n const result: PagerDutyEntityMappingsResponse = await buildEntityMappingsResponse(entityMappings, componentEntitiesDict, componentEntities, pagerDutyServices);\n\n response.json(result);\n } catch (error) {\n if (error instanceof HttpError) {\n response.status(error.status).json({\n errors: [\n `${error.message}`\n ]\n });\n }\n }\n });\n\n // GET /mapping/entity\n router.get('/mapping/entity/:type/:namespace/:name', async (request, response) => {\n try {\n // Get the type, namespace and entity name from the request parameters\n const entityType: string = request.params.type || '';\n const entityNamespace: string = request.params.namespace || '';\n const entityName: string = request.params.name || '';\n\n if (entityType === ''\n || entityNamespace === ''\n || entityName === '') {\n response.status(400).json(\"Required params not specified.\");\n return;\n }\n\n const entityRef = `${entityType}:${entityNamespace}/${entityName}`.toLowerCase();\n\n // Get all the entity mappings from the database\n const entityMapping = await store.findEntityMappingByEntityRef(entityRef);\n\n if (!entityMapping) {\n response.status(404).json(`Mapping for entityRef ${entityRef} not found.`);\n return;\n }\n\n response.json({\n mapping: entityMapping\n });\n\n } catch (error) {\n if (error instanceof HttpError) {\n response.status(error.status).json({\n errors: [\n `${error.message}`\n ]\n });\n }\n }\n });\n\n // GET /mapping/entity/service/:serviceId\n router.get('/mapping/entity/service/:serviceId', async (request, response) => {\n try {\n // Get the type, namespace and entity name from the request parameters\n const serviceId: string = request.params.serviceId ?? '';\n\n if (serviceId === '') {\n response.status(400).json(\"Required params not specified.\");\n return;\n }\n\n // Get all the entity mappings from the database\n const entityMapping = await store.findEntityMappingByServiceId(serviceId);\n\n if (!entityMapping) {\n response.status(404).json(`Mapping for serviceId ${serviceId} not found.`);\n return;\n }\n\n response.json({\n mapping: entityMapping\n });\n\n } catch (error) {\n if (error instanceof HttpError) {\n response.status(error.status).json({\n errors: [\n `${error.message}`\n ]\n });\n }\n }\n });\n\n // GET /escalation_policies\n router.get('/escalation_policies', async (_, response) => {\n\n try {\n let escalationPolicyList = await getAllEscalationPolicies();\n\n // sort the escalation policies by account and name\n escalationPolicyList = escalationPolicyList.sort((a, b) => {\n if (a.account === b.account) {\n return a.name.localeCompare(b.name);\n }\n return a.account!.localeCompare(b.account!);\n });\n\n const escalationPolicyDropDownOptions = escalationPolicyList.map((policy) => {\n let policyLabel = policy.name;\n if (policy.account && policy.account !== 'default') {\n policyLabel = `(${policy.account}) ${policy.name}`;\n }\n\n return {\n label: policyLabel,\n value: policy.id,\n };\n });\n\n response.json(escalationPolicyDropDownOptions);\n } catch (error) {\n if (error instanceof HttpError) {\n response.status(error.status).json({\n errors: [\n `${error.message}`\n ]\n });\n }\n }\n });\n\n // GET /oncall\n router.get('/oncall-users', async (request, response) => {\n try {\n // Get the escalation policy ID from the request parameters with parameter name \"escalation_policy_ids[]\"\n const escalationPolicyId: string = request.query.escalation_policy_ids as string || '';\n const account = request.query.account as string || '';\n\n if (escalationPolicyId === '') {\n response.status(400).json(\"Bad Request: 'escalation_policy_ids[]' is required\");\n }\n\n const oncallUsers = await getOncallUsers(escalationPolicyId, account);\n const onCallUsersResponse: PagerDutyOnCallUsersResponse = {\n users: oncallUsers\n };\n\n response.json(onCallUsersResponse);\n } catch (error) {\n if (error instanceof HttpError) {\n response.status(error.status).json({\n errors: [\n `${error.message}`\n ]\n });\n }\n }\n });\n\n // GET /services/:serviceId\n router.get('/services/:serviceId', async (request, response) => {\n try {\n // Get the serviceId from the request parameters\n const serviceId: string = request.params.serviceId || '';\n const account = request.query.account as string || '';\n\n if (serviceId === '') {\n response.status(400).json(\"Bad Request: ':serviceId' must be provided as part of the path or 'integration_key' as a query parameter\");\n }\n\n const service = await getServiceById(serviceId, account);\n const serviceResponse: PagerDutyServiceResponse = {\n service: service\n }\n\n response.json(serviceResponse);\n } catch (error) {\n if (error instanceof HttpError) {\n response.status(error.status).json({\n errors: [\n `${error.message}`\n ]\n });\n }\n }\n });\n\n // GET /services?integration_key=:integrationKey\n router.get('/services', async (request, response) => {\n try {\n // Get the serviceId from the request parameters\n const integrationKey: string = request.query.integration_key as string || '';\n const account = request.query.account as string || '';\n\n if (integrationKey !== '') {\n const service = await getServiceByIntegrationKey(integrationKey, account);\n const serviceResponse: PagerDutyServiceResponse = {\n service: service\n }\n\n response.json(serviceResponse);\n } else {\n const services = await getAllServices();\n const servicesResponse: PagerDutyServicesResponse = {\n services: services\n }\n\n response.json(servicesResponse);\n }\n } catch (error) {\n if (error instanceof HttpError) {\n response.status(error.status).json({\n errors: [\n `${error.message}`\n ]\n });\n }\n }\n });\n\n // POST /services/:serviceId/integration/:vendorId\n router.post('/services/:serviceId/integration/:vendorId', async (request, response) => {\n try {\n const serviceId: string = request.params.serviceId || '';\n const vendorId: string = request.params.vendorId || '';\n const account = request.query.account as string || '';\n\n if (serviceId === '' || vendorId === '') {\n response.status(400).json(\"Bad Request: ':serviceId' and ':vendorId' must be provided as part of the path\");\n }\n\n const integrationKey = await createServiceIntegration({\n serviceId,\n vendorId,\n account\n });\n\n response.json(integrationKey);\n } catch (error) {\n if (error instanceof HttpError) {\n logger.error(`Error occurred while processing request: ${error.message}`);\n response.status(error.status).json({\n errors: [\n `${error.message}`\n ]\n });\n }\n }\n });\n\n // GET /services/:serviceId/change-events\n router.get('/services/:serviceId/change-events', async (request, response) => {\n try {\n // Get the serviceId from the request parameters\n const serviceId: string = request.params.serviceId || '';\n const account = request.query.account as string || '';\n\n const changeEvents = await getChangeEvents(serviceId, account);\n const changeEventsResponse: PagerDutyChangeEventsResponse = {\n change_events: changeEvents\n }\n\n response.json(changeEventsResponse);\n } catch (error) {\n if (error instanceof HttpError) {\n response.status(error.status).json({\n errors: [\n `${error.message}`\n ]\n });\n }\n }\n });\n\n // GET /services/:serviceId/incidents\n router.get('/services/:serviceId/incidents', async (request, response) => {\n try {\n // Get the serviceId from the request parameters\n const serviceId: string = request.params.serviceId || '';\n const account = request.query.account as string || '';\n\n const incidents = await getIncidents(serviceId, account);\n const incidentsResponse: PagerDutyIncidentsResponse = {\n incidents\n }\n\n response.json(incidentsResponse);\n } catch (error) {\n if (error instanceof HttpError) {\n response.status(error.status).json({\n errors: [\n `${error.message}`\n ]\n });\n }\n }\n });\n\n // GET /services/:serviceId/standards\n router.get('/services/:serviceId/standards', async (request, response) => {\n try {\n\n // Get the serviceId from the request parameters\n const serviceId: string = request.params.serviceId || '';\n const account = request.query.account as string || '';\n\n const serviceStandards = await getServiceStandards(serviceId, account);\n const serviceStandardsResponse: PagerDutyServiceStandardsResponse = {\n standards: serviceStandards\n }\n\n response.json(serviceStandardsResponse);\n } catch (error) {\n if (error instanceof HttpError) {\n response.status(error.status).json({\n errors: [\n `${error.message}`\n ]\n });\n }\n }\n });\n\n // GET /services/:serviceId/metrics\n router.get('/services/:serviceId/metrics', async (request, response) => {\n try {\n // Get the serviceId from the request parameters\n const serviceId: string = request.params.serviceId || '';\n const account = request.query.account as string || '';\n\n const metrics = await getServiceMetrics(serviceId, account);\n\n\n const metricsResponse: PagerDutyServiceMetricsResponse = {\n metrics: metrics\n };\n\n response.json(metricsResponse);\n\n } catch (error) {\n if (error instanceof HttpError) {\n response.status(error.status).json({\n errors: [\n `${error.message}`\n ]\n });\n }\n }\n });\n\n // GET /health\n router.get('/health', async (_, response) => {\n response.status(200).json({ status: 'ok' });\n });\n\n // Add error handler\n router.use(errorHandler());\n\n // Return the router\n return router;\n}\n","import { PagerDutyEntityMapping, PagerDutySetting } from \"@pagerduty/backstage-plugin-common\";\nimport { resolvePackagePath } from \"@backstage/backend-plugin-api\";\nimport { Knex } from 'knex';\nimport { v4 as uuid } from 'uuid';\n\nexport type RawDbEntityResultRow = {\n id: string;\n entityRef: string;\n serviceId: string;\n integrationKey: string;\n account?: string;\n processedDate?: Date;\n};\n\n/** @public */\nexport interface PagerDutyBackendStore {\n insertEntityMapping(entity: PagerDutyEntityMapping): Promise <string> \n getAllEntityMappings(): Promise<RawDbEntityResultRow[]>\n findEntityMappingByEntityRef(entityRef: string): Promise<RawDbEntityResultRow | undefined>\n findEntityMappingByServiceId(serviceId: string): Promise<RawDbEntityResultRow | undefined>\n updateSetting(setting: PagerDutySetting): Promise<string>\n findSetting(settingId: string): Promise<PagerDutySetting | undefined>\n getAllSettings(): Promise<PagerDutySetting[]>\n}\n\ntype Options = {\n skipMigrations?: boolean;\n};\n\n/** @public */\nexport class PagerDutyBackendDatabase implements PagerDutyBackendStore {\n static async create(knex: Knex, options?: Options): Promise<PagerDutyBackendStore> {\n if(options?.skipMigrations) {\n const migrationsDir = resolvePackagePath(\"@pagerduty/backstage-plugin-backend\", \"migrations\");\n \n await knex.migrate.latest({\n directory: migrationsDir,\n });\n }\n\n return new PagerDutyBackendDatabase(knex);\n }\n\n constructor(private readonly db: Knex) { }\n\n async insertEntityMapping(entity: PagerDutyEntityMapping): Promise<string> {\n const entityMappingId = uuid();\n\n const [result] = await this.db<RawDbEntityResultRow>('pagerduty_entity_mapping')\n .insert({\n id: entityMappingId,\n entityRef: entity.entityRef,\n serviceId: entity.serviceId,\n integrationKey: entity.integrationKey,\n account: entity.account,\n processedDate: new Date(),\n })\n .onConflict(['serviceId'])\n .merge(['entityRef', 'integrationKey', 'account', 'processedDate']) \n .returning('id');\n\n return result.id;\n }\n\n async getAllEntityMappings(): Promise<RawDbEntityResultRow[]> {\n const rawEntities = await this.db<RawDbEntityResultRow>('pagerduty_entity_mapping');\n\n if (!rawEntities) {\n return [];\n }\n\n return rawEntities;\n }\n\n async findEntityMappingByEntityRef(entityRef: string): Promise<RawDbEntityResultRow | undefined> {\n const rawEntity = await this.db<RawDbEntityResultRow>('pagerduty_entity_mapping')\n .where('entityRef', entityRef)\n .first();\n\n return rawEntity;\n }\n\n async findEntityMappingByServiceId(serviceId: string): Promise<RawDbEntityResultRow | undefined> {\n const rawEntity = await this.db<RawDbEntityResultRow>('pagerduty_entity_mapping')\n .where('serviceId', serviceId)\n .first();\n\n return rawEntity;\n }\n\n async updateSetting(setting: PagerDutySetting): Promise<string> {\n const [result] = await this.db<PagerDutySetting>('pagerduty_settings')\n .insert({\n id: setting.id,\n value: setting.value \n })\n .onConflict(['id'])\n .merge(['value'])\n .returning('id');\n\n return result.id;\n }\n\n async findSetting(settingId: string): Promise<PagerDutySetting | undefined> {\n const rawEntity = await this.db<PagerDutySetting>('pagerduty_settings')\n .where('id', settingId)\n .first();\n\n return rawEntity;\n }\n\n async getAllSettings(): Promise<PagerDutySetting[]> {\n const rawEntities = await this.db<PagerDutySetting>('pagerduty_settings');\n\n if (!rawEntities) {\n return [];\n }\n\n return rawEntities;\n }\n}","import { AuthService, LoggerService, coreServices, createBackendPlugin } from '@backstage/backend-plugin-api';\nimport { createRouter } from './service/router';\nimport { PagerDutyBackendDatabase, PagerDutyBackendStore } from './db';\nimport { CatalogClient } from '@backstage/catalog-client';\n\nclass CatalogFetchApi {\n constructor(\n private readonly logger: LoggerService,\n private readonly auth: AuthService,\n ) {}\n\n async fetch(input: any, init: RequestInit | undefined) : Promise<Response>{\n const request = new Request(input as any, init);\n const { token } = await this.auth.getPluginRequestToken({\n onBehalfOf: await this.auth.getOwnServiceCredentials(),\n targetPluginId: 'catalog',\n });\n\n request.headers.set('Authorization', `Bearer ${token}`);\n this.logger.debug(`Added token to outgoing request to ${request.url}`);\n return fetch(request);\n }\n}\n\n/** @public */\nexport const pagerDutyPlugin = createBackendPlugin({\n pluginId: 'pagerduty',\n register(env) {\n env.registerInit({\n deps: {\n logger: coreServices.logger,\n config: coreServices.rootConfig,\n httpRouter: coreServices.httpRouter, \n database: coreServices.database, \n discovery: coreServices.discovery,\n auth: coreServices.auth,\n },\n async init({ config, logger, httpRouter, database, discovery, auth }) {\n\n const pagerDutyBackendStore : PagerDutyBackendStore = await PagerDutyBackendDatabase.create(\n await database.getClient(),\n { skipMigrations: true },\n );\n\n httpRouter.use(\n await createRouter({\n config,\n logger,\n store: pagerDutyBackendStore,\n discovery,\n auth,\n catalogApi: new CatalogClient({\n discoveryApi: discovery,\n fetchApi: new CatalogFetchApi(logger, auth),\n })\n }),\n );\n httpRouter.addAuthPolicy({\n path: '/',\n allow: 'unauthenticated',\n });\n },\n });\n }\n});"],"names":["isLegacyConfig","_a","HttpError","DateTime","fetch","createLegacyAuthAdapters","Router","express","errorHandler","resolvePackagePath","uuid","createBackendPlugin","coreServices","CatalogClient"],"mappings":"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"}
1
+ {"version":3,"file":"index.cjs.js","sources":["../src/auth/auth.ts","../src/apis/pagerduty.ts","../src/service/router.ts","../src/db/PagerDutyBackendDatabase.ts","../src/plugin.ts"],"sourcesContent":["import { LoggerService, RootConfigService } from \"@backstage/backend-plugin-api\";\nimport { HttpError, PagerDutyAccountConfig } from \"@pagerduty/backstage-plugin-common\";\n\ntype AccountTokenInfo = {\n authToken: string;\n authTokenExpiryDate: number;\n}\n\ntype Auth = {\n config: RootConfigService;\n logger: LoggerService;\n accountTokens: Record<string, AccountTokenInfo>;\n defaultAccount?: string;\n}\n\nlet authPersistence: Auth;\nlet isLegacyConfig = false;\n\nexport async function getAuthToken(accountId? : string): Promise<string> {\n\n // if authPersistence is not initialized, load the auth config\n if (!authPersistence?.accountTokens) {\n await loadAuthConfig(authPersistence.config, authPersistence.logger);\n }\n\n if(isLegacyConfig){\n if (\n (authPersistence.accountTokens.default.authToken !== '' &&\n authPersistence.accountTokens.default.authToken.includes('Bearer') &&\n authPersistence.accountTokens.default.authTokenExpiryDate > Date.now()) // case where OAuth token is still valid\n ||\n (authPersistence.accountTokens.default.authToken !== '' &&\n authPersistence.accountTokens.default.authToken.includes('Token'))) { // case where API token is used\n \n return authPersistence.accountTokens.default.authToken;\n }\n }\n else {\n // check if accountId is provided\n if (accountId && accountId !== '') {\n if (\n (authPersistence.accountTokens[accountId].authToken !== '' &&\n authPersistence.accountTokens[accountId].authToken.includes('Bearer') &&\n authPersistence.accountTokens[accountId].authTokenExpiryDate > Date.now()) // case where OAuth token is still valid\n ||\n (authPersistence.accountTokens[accountId].authToken !== '' &&\n authPersistence.accountTokens[accountId].authToken.includes('Token'))) { // case where API token is used\n\n return authPersistence.accountTokens[accountId].authToken;\n }\n }\n\n else { // return default account token if accountId is not provided\n const defaultFallback = authPersistence.defaultAccount ?? \"\";\n\n if (\n (authPersistence.accountTokens[defaultFallback].authToken !== '' &&\n authPersistence.accountTokens[defaultFallback].authToken.includes('Bearer') &&\n authPersistence.accountTokens[defaultFallback].authTokenExpiryDate > Date.now()) // case where OAuth token is still valid\n ||\n (authPersistence.accountTokens[defaultFallback].authToken !== '' &&\n authPersistence.accountTokens[defaultFallback].authToken.includes('Token'))) { // case where API token is used\n\n return authPersistence.accountTokens[defaultFallback].authToken;\n }\n }\n }\n\n return '';\n}\n\nexport async function loadAuthConfig(config : RootConfigService, logger: LoggerService) {\n try {\n const defaultAccountId = 'default';\n\n // initiliaze the authPersistence in-memory object\n authPersistence = {\n config,\n logger,\n accountTokens: {}\n };\n\n // check if new accounts config is present\n if(!config.getOptional('pagerDuty.accounts')){\n isLegacyConfig = true;\n logger.warn('No PagerDuty accounts configuration found in config file. Reverting to legacy configuration.');\n\n if (!config.getOptionalString('pagerDuty.apiToken')) {\n logger.warn('No PagerDuty API token found in config file. Trying OAuth token instead...');\n\n if (!config.getOptional('pagerDuty.oauth')) {\n\n logger.error('No PagerDuty OAuth configuration found in config file.');\n\n } else if (!config.getOptionalString('pagerDuty.oauth.clientId') || !config.getOptionalString('pagerDuty.oauth.clientSecret') || !config.getOptionalString('pagerDuty.oauth.subDomain')) {\n\n logger.error(\"Missing required PagerDuty OAuth parameters in config file. 'clientId', 'clientSecret', and 'subDomain' are required. 'region' is optional.\");\n\n } else {\n const tokenInfo : AccountTokenInfo = await getOAuthToken(\n config.getString('pagerDuty.oauth.clientId'),\n config.getString('pagerDuty.oauth.clientSecret'),\n config.getString('pagerDuty.oauth.subDomain'),\n config.getOptionalString('pagerDuty.oauth.region') ?? 'us');\n\n authPersistence.accountTokens[defaultAccountId] = tokenInfo;\n\n logger.info('PagerDuty OAuth configuration loaded successfully.');\n }\n } else {\n authPersistence.accountTokens[defaultAccountId] = {\n authToken: `Token token=${config.getString('pagerDuty.apiToken')}`,\n authTokenExpiryDate: Date.now() + 3600000 * 24 * 365 * 2 // 2 years\n };\n\n logger.info('PagerDuty API token loaded successfully.');\n }\n } \n else { // new accounts config is present\n logger.info('New PagerDuty accounts configuration found in config file.');\n isLegacyConfig = false;\n const accounts = config.getOptional<PagerDutyAccountConfig[]>('pagerDuty.accounts');\n\n\n if(accounts && accounts?.length === 1){\n logger.info('Only one account found in config file. Setting it as default.');\n authPersistence.defaultAccount = accounts[0].id;\n }\n\n accounts?.forEach(async account => {\n const maskedAccountId = maskString(account.id);\n\n if(account.isDefault && !authPersistence.defaultAccount){\n logger.info(`Default account found in config file. Setting it as default.`);\n authPersistence.defaultAccount = account.id;\n }\n\n if (!account.apiToken) {\n logger.warn('No PagerDuty API token found in config file. Trying OAuth token instead...');\n\n if (!account.oauth) {\n logger.error('No PagerDuty OAuth configuration found in config file.');\n } else if (!account.oauth.clientId || !account.oauth.clientSecret || !account.oauth.subDomain) {\n logger.error(\"Missing required PagerDuty OAuth parameters in config file. 'clientId', 'clientSecret', and 'subDomain' are required. 'region' is optional.\");\n } else {\n const tokenInfo : AccountTokenInfo = await getOAuthToken(\n account.oauth.clientId,\n account.oauth.clientSecret,\n account.oauth.subDomain,\n account.oauth.region ?? 'us');\n\n authPersistence.accountTokens[account.id] = tokenInfo;\n\n logger.info(`PagerDuty OAuth configuration loaded successfully for account ${maskedAccountId}.`);\n }\n } else {\n authPersistence.accountTokens[account.id] = {\n authToken: `Token token=${account.apiToken}`,\n authTokenExpiryDate: Date.now() + 3600000 * 24 * 365 * 2 // 2 years\n };\n\n logger.info(`PagerDuty API token loaded successfully for account ${maskedAccountId}.`);\n }\n });\n\n if(!authPersistence.defaultAccount){\n logger.error('No default account found in config file. One account must be marked as default.');\n }\n }\n }\n catch (error) {\n logger.error(`Unable to retrieve valid PagerDuty AUTH configuration from config file: ${error}`);\n }\n}\n\nasync function getOAuthToken(clientId: string, clientSecret: string, subDomain: string, region: string): Promise<AccountTokenInfo> {\n // check if required parameters are provided\n if (!clientId || !clientSecret || !subDomain) {\n throw new Error('Missing required PagerDuty OAuth parameters.');\n }\n\n // define the scopes required for the OAuth token\n const scopes = `\n abilities.read \n analytics.read\n change_events.read \n escalation_policies.read \n incidents.read \n oncalls.read \n schedules.read \n services.read \n services.write \n standards.read\n teams.read \n users.read \n vendors.read\n `;\n\n // encode the parameters for the request\n const urlencoded = new URLSearchParams();\n urlencoded.append(\"grant_type\", \"client_credentials\");\n urlencoded.append(\"client_id\", clientId);\n urlencoded.append(\"client_secret\", clientSecret);\n urlencoded.append(\"scope\", `as_account-${region}.${subDomain} ${scopes}`);\n\n let response: Response;\n const options: RequestInit = {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/x-www-form-urlencoded',\n },\n body: urlencoded,\n };\n const baseUrl = 'https://identity.pagerduty.com/oauth/token';\n\n try {\n response = await fetch(baseUrl, options);\n } catch (error) {\n throw new Error(`Failed to retrieve oauth token: ${error}`);\n }\n\n switch (response.status) {\n case 400:\n throw new HttpError(\"Failed to retrieve valid token. Bad Request - Invalid arguments provided.\", 400);\n case 401:\n throw new HttpError(\"Failed to retrieve valid token. Forbidden - Invalid credentials provided.\", 401);\n default: // 200\n break;\n }\n\n const authResponse = await response.json();\n\n const result : AccountTokenInfo = {\n authToken: `Bearer ${authResponse.access_token}`,\n authTokenExpiryDate: Date.now() + (authResponse.expires_in * 1000)\n };\n\n return result;\n}\n\nfunction maskString(str: string) : string {\n return str[0] + '*'.repeat(str.length - 2) + str.slice(-1);\n}","import fetch from 'node-fetch';\nimport type { RequestInit, Response } from 'node-fetch';\n\nimport { getAuthToken } from '../auth/auth';\n\nimport {\n PagerDutyServiceResponse,\n PagerDutyServicesResponse,\n PagerDutyEscalationPolicy,\n PagerDutyEscalationPoliciesResponse,\n PagerDutyAbilitiesResponse,\n PagerDutyOnCallsResponse,\n PagerDutyUser,\n PagerDutyService,\n PagerDutyChangeEventsResponse,\n PagerDutyChangeEvent,\n PagerDutyIncident,\n PagerDutyIncidentsResponse,\n PagerDutyServiceStandards,\n PagerDutyServiceMetrics,\n HttpError,\n PagerDutyServicesAPIResponse,\n PagerDutyAccountConfig,\n PagerDutyIntegrationResponse,\n PagerDutyServiceDependency,\n PagerDutyServiceDependencyResponse,\n} from '@pagerduty/backstage-plugin-common';\n\nimport { DateTime } from 'luxon';\nimport { LoggerService, RootConfigService } from '@backstage/backend-plugin-api';\n\nexport type PagerDutyEndpointConfig = {\n eventsBaseUrl: string;\n apiBaseUrl: string\n}\n\nconst EndpointConfig: Record<string, PagerDutyEndpointConfig> = {};\nlet fallbackEndpointConfig: PagerDutyEndpointConfig;\nlet isLegacyConfig = false;\n\nexport function setFallbackEndpointConfig(account: PagerDutyAccountConfig) {\n fallbackEndpointConfig = {\n eventsBaseUrl: account.eventsBaseUrl ?? 'https://events.pagerduty.com/v2',\n apiBaseUrl: account.apiBaseUrl ?? 'https://api.pagerduty.com'\n };\n}\n\nexport function insertEndpointConfig(account: PagerDutyAccountConfig) {\n EndpointConfig[account.id] = {\n eventsBaseUrl: account.eventsBaseUrl ?? 'https://events.pagerduty.com/v2',\n apiBaseUrl: account.apiBaseUrl ?? 'https://api.pagerduty.com'\n };\n}\n\nexport function loadPagerDutyEndpointsFromConfig(config: RootConfigService, logger: LoggerService) {\n\n if (config.getOptional('pagerDuty.accounts')) {\n logger.debug(`New accounts configuration detected. Loading PagerDuty endpoints from config.`);\n isLegacyConfig = false;\n\n const accounts = config.getOptional<PagerDutyAccountConfig[]>('pagerDuty.accounts');\n\n if (accounts?.length === 1) {\n logger.debug(`Single account configuration detected. Loading PagerDuty endpoints from config to 'default'.`);\n EndpointConfig.default = {\n eventsBaseUrl: accounts[0].eventsBaseUrl !== undefined ? accounts[0].eventsBaseUrl : 'https://events.pagerduty.com/v2',\n apiBaseUrl: accounts[0].apiBaseUrl !== undefined ? accounts[0].apiBaseUrl : 'https://api.pagerduty.com'\n };\n }\n else {\n logger.debug(`Multiple account configuration detected. Loading PagerDuty endpoints from config.`);\n accounts?.forEach((account) => {\n\n if (account.isDefault) {\n setFallbackEndpointConfig(account);\n }\n\n insertEndpointConfig(account);\n });\n }\n }\n else {\n logger.debug(`Loading legacy PagerDuty endpoints from config.`);\n isLegacyConfig = true;\n\n EndpointConfig.default = {\n eventsBaseUrl: config.getOptionalString('pagerDuty.eventsBaseUrl') !== undefined ? config.getString('pagerDuty.eventsBaseUrl') : 'https://events.pagerduty.com/v2',\n apiBaseUrl: config.getOptionalString('pagerDuty.apiBaseUrl') !== undefined ? config.getString('pagerDuty.apiBaseUrl') : 'https://api.pagerduty.com'\n };\n }\n}\n\nfunction getApiBaseUrl(account?: string): string {\n if (isLegacyConfig === true) {\n return EndpointConfig.default.apiBaseUrl;\n }\n\n if (account) {\n return EndpointConfig[account].apiBaseUrl;\n }\n\n return fallbackEndpointConfig.apiBaseUrl;\n}\n\n// Supporting router\nexport async function addServiceRelationsToService(serviceRelations: PagerDutyServiceDependency[], account?: string): Promise<PagerDutyServiceDependency[]> {\n let response: Response;\n const options: RequestInit = {\n method: 'POST',\n headers: {\n Authorization: await getAuthToken(account),\n 'Accept': 'application/vnd.pagerduty+json;version=2',\n 'Content-Type': 'application/json',\n },\n body: JSON.stringify({\n relationships: serviceRelations\n })\n };\n\n const apiBaseUrl = getApiBaseUrl(account);\n const baseUrl = `${apiBaseUrl}/service_dependencies/associate`;\n\n try {\n response = await fetchWithRetries(baseUrl, options);\n } catch (error) {\n throw new Error(`Failed to retrieve service dependencies: ${error}`);\n }\n\n if (response.status >= 500) {\n throw new HttpError(`Failed to add service dependencies. PagerDuty API returned a server error. Retrying with the same arguments will not work.`, response.status);\n }\n\n switch (response.status) {\n case 400:\n throw new HttpError(\"Failed to add service dependencies. Caller provided invalid arguments. Please review the response for error details. Retrying with the same arguments will not work.\", 400);\n case 401:\n throw new HttpError(\"Failed to add service dependencies. Caller did not supply credentials or did not provide the correct credentials. If you are using an API key, it may be invalid or your Authorization header may be malformed.\", 401);\n case 403:\n throw new HttpError(\"Failed to add service dependencies. Caller is not authorized to view the requested resource. While your authentication is valid, the authenticated user or token does not have permission to perform this action.\", 403);\n case 404:\n throw new HttpError(\"Failed to add service dependencies. The requested resource was not found.\", 404);\n default: // 200\n break;\n }\n\n let result: PagerDutyServiceDependencyResponse;\n try {\n result = await response.json();\n\n return result.relationships;\n\n } catch (error) {\n throw new HttpError(`Failed to parse service dependency information: ${error}`, 500);\n }\n}\n\nexport async function removeServiceRelationsFromService(serviceRelations: PagerDutyServiceDependency[], account?: string): Promise<PagerDutyServiceDependency[]> {\n let response: Response;\n const options: RequestInit = {\n method: 'POST',\n headers: {\n Authorization: await getAuthToken(account),\n 'Accept': 'application/vnd.pagerduty+json;version=2',\n 'Content-Type': 'application/json',\n },\n body: JSON.stringify({\n relationships: serviceRelations\n })\n };\n\n const apiBaseUrl = getApiBaseUrl(account);\n const baseUrl = `${apiBaseUrl}/service_dependencies/disassociate`;\n\n try {\n response = await fetchWithRetries(`${baseUrl}`, options);\n } catch (error) {\n throw new Error(`Failed to retrieve service dependencies: ${error}`);\n }\n\n if (response.status >= 500) {\n throw new HttpError(`Failed to remove service dependencies. PagerDuty API returned a server error. Retrying with the same arguments will not work.`, response.status);\n }\n\n switch (response.status) {\n case 400:\n throw new HttpError(\"Failed to remove service dependencies. Caller provided invalid arguments. Please review the response for error details. Retrying with the same arguments will not work.\", 400);\n case 401:\n throw new HttpError(\"Failed to remove service dependencies. Caller did not supply credentials or did not provide the correct credentials. If you are using an API key, it may be invalid or your Authorization header may be malformed.\", 401);\n case 403:\n throw new HttpError(\"Failed to remove service dependencies. Caller is not authorized to view the requested resource. While your authentication is valid, the authenticated user or token does not have permission to perform this action.\", 403);\n case 404:\n throw new HttpError(\"Failed to remove service dependencies. The requested resource was not found.\", 404);\n default: // 200\n break;\n }\n\n let result: PagerDutyServiceDependencyResponse;\n try {\n result = await response.json();\n\n return result.relationships;\n\n } catch (error) {\n throw new HttpError(`Failed to parse service dependency information: ${error}`, 500);\n }\n}\n\nexport async function getServiceRelationshipsById(serviceId: string, account?: string): Promise<PagerDutyServiceDependency[]> {\n let response: Response;\n const options: RequestInit = {\n method: 'GET',\n headers: {\n Authorization: await getAuthToken(account),\n 'Accept': 'application/vnd.pagerduty+json;version=2',\n 'Content-Type': 'application/json',\n },\n };\n\n const apiBaseUrl = getApiBaseUrl(account);\n const baseUrl = `${apiBaseUrl}/service_dependencies/technical_services/${serviceId}`;\n\n try {\n response = await fetchWithRetries(baseUrl, options);\n } catch (error) {\n throw new Error(`Failed to retrieve service dependencies: ${error}`);\n }\n\n if (response.status >= 500) {\n throw new HttpError(`Failed to list service dependencies. PagerDuty API returned a server error. Retrying with the same arguments will not work.`, response.status);\n }\n\n switch (response.status) {\n case 400:\n throw new HttpError(\"Failed to list service dependencies. Caller provided invalid arguments. Please review the response for error details. Retrying with the same arguments will not work.\", 400);\n case 401:\n throw new HttpError(\"Failed to list service dependencies. Caller did not supply credentials or did not provide the correct credentials. If you are using an API key, it may be invalid or your Authorization header may be malformed.\", 401);\n case 403:\n throw new HttpError(\"Failed to list service dependencies. Caller is not authorized to view the requested resource. While your authentication is valid, the authenticated user or token does not have permission to perform this action.\", 403);\n case 404:\n throw new HttpError(\"Failed to list service dependencies. The requested resource was not found.\", 404);\n default: // 200\n break;\n }\n\n let result: PagerDutyServiceDependencyResponse;\n try {\n result = await response.json();\n\n return result.relationships;\n } catch (error) {\n throw new HttpError(`Failed to parse service dependency information: ${error}`, 500);\n }\n}\n\n\nasync function getEscalationPolicies(offset: number, limit: number, account?: string): Promise<[Boolean, PagerDutyEscalationPolicy[]]> {\n let response: Response;\n const params = `total=true&sort_by=name&offset=${offset}&limit=${limit}`;\n const options: RequestInit = {\n method: 'GET',\n headers: {\n Authorization: await getAuthToken(account),\n 'Accept': 'application/vnd.pagerduty+json;version=2',\n 'Content-Type': 'application/json',\n },\n };\n\n const apiBaseUrl = getApiBaseUrl(account);\n const baseUrl = `${apiBaseUrl}/escalation_policies`;\n\n try {\n response = await fetchWithRetries(`${baseUrl}?${params}`, options);\n } catch (error) {\n throw new Error(`Failed to retrieve escalation policies: ${error}`);\n }\n\n if (response.status >= 500) {\n throw new HttpError(`Failed to list escalation policies. PagerDuty API returned a server error. Retrying with the same arguments will not work.`, response.status);\n }\n\n switch (response.status) {\n case 400:\n throw new HttpError(\"Failed to list escalation policies. Caller provided invalid arguments.\", 400);\n case 401:\n throw new HttpError(\"Failed to list escalation policies. Caller did not supply credentials or did not provide the correct credentials.\", 401);\n case 403:\n throw new HttpError(\"Failed to list escalation policies. Caller is not authorized to view the requested resource.\", 403);\n case 429:\n throw new HttpError(\"Failed to list escalation policies. Rate limit exceeded.\", 429);\n default: // 200\n break;\n }\n\n let result: PagerDutyEscalationPoliciesResponse;\n try {\n result = await response.json() as PagerDutyEscalationPoliciesResponse;\n\n return [result.more ?? false, result.escalation_policies];\n\n } catch (error) {\n throw new HttpError(`Failed to parse escalation policy information: ${error}`, 500);\n }\n}\n\nexport async function getAllEscalationPolicies(): Promise<PagerDutyEscalationPolicy[]> {\n const limit = 50;\n let offset = 0;\n let moreResults = false;\n let results: PagerDutyEscalationPolicy[] = [];\n\n await Promise.all(\n Object.keys(EndpointConfig).map(async (account) => {\n try {\n // reset offset value\n offset = 0;\n\n do{\n const res = await getEscalationPolicies(offset, limit, account);\n \n // set account for each escalation policy\n res[1].forEach((policy) => {\n policy.account = account;\n });\n\n // update results\n results = results.concat(res[1]);\n\n // if more results exist\n if (res[0] === true) {\n moreResults = true;\n offset += limit;\n }\n else {\n moreResults = false;\n }\n } while (moreResults === true);\n\n } catch (error) {\n if (error instanceof HttpError) {\n throw error;\n }\n else {\n throw new HttpError(`${error}`, 500);\n }\n }\n\n }));\n\n return results;\n}\n\nexport async function isEventNoiseReductionEnabled(account?: string): Promise<boolean> {\n let response: Response;\n const baseUrl = 'https://api.pagerduty.com';\n const options: RequestInit = {\n method: 'GET',\n headers: {\n Authorization: await getAuthToken(account),\n 'Accept': 'application/vnd.pagerduty+json;version=2',\n 'Content-Type': 'application/json',\n },\n };\n\n try {\n response = await fetchWithRetries(`${baseUrl}/abilities`, options);\n } catch (error) {\n throw new Error(`Failed to read abilities: ${error}`);\n }\n\n if (response.status >= 500) {\n throw new HttpError(`Failed to read abilities. PagerDuty API returned a server error. Retrying with the same arguments will not work.`, response.status);\n }\n\n switch (response.status) {\n case 401:\n throw new Error(`Failed to read abilities. Caller did not supply credentials or did not provide the correct credentials.`);\n case 403:\n throw new Error(`Failed to read abilities. Caller is not authorized to view the requested resource.`);\n case 429:\n throw new Error(`Failed to read abilities. Rate limit exceeded.`);\n default: // 200\n break;\n }\n\n let result: PagerDutyAbilitiesResponse;\n try {\n result = await response.json() as PagerDutyAbilitiesResponse;\n\n if (result.abilities.includes('preview_intelligent_alert_grouping')\n && result.abilities.includes('time_based_alert_grouping')) {\n return true;\n }\n\n return false;\n\n } catch (error) {\n throw new Error(`Failed to parse abilities information: ${error}`);\n }\n}\n\nexport async function getOncallUsers(escalationPolicy: string, account?: string): Promise<PagerDutyUser[]> {\n let response: Response;\n const params = `time_zone=UTC&include[]=users&escalation_policy_ids[]=${escalationPolicy}`;\n const options: RequestInit = {\n method: 'GET',\n headers: {\n Authorization: await getAuthToken(account),\n 'Accept': 'application/vnd.pagerduty+json;version=2',\n 'Content-Type': 'application/json',\n },\n };\n\n const apiBaseUrl = getApiBaseUrl(account);\n const baseUrl = `${apiBaseUrl}/oncalls`;\n\n try {\n response = await fetchWithRetries(`${baseUrl}?${params}`, options);\n } catch (error) {\n throw new Error(`Failed to retrieve oncalls: ${error}`);\n }\n\n if (response.status >= 500) {\n throw new HttpError(`Failed to list oncalls. PagerDuty API returned a server error. Retrying with the same arguments will not work.`, response.status);\n }\n\n switch (response.status) {\n case 400:\n throw new HttpError(\"Failed to list oncalls. Caller provided invalid arguments.\", 400);\n case 401:\n throw new HttpError(\"Failed to list oncalls. Caller did not supply credentials or did not provide the correct credentials.\", 401);\n case 403:\n throw new HttpError(\"Failed to list oncalls. Caller is not authorized to view the requested resource.\", 403);\n case 429:\n throw new HttpError(\"Failed to list oncalls. Rate limit exceeded.\", 429);\n default: // 200\n break;\n }\n\n let result: PagerDutyOnCallsResponse;\n let usersItem: PagerDutyUser[];\n try {\n result = await response.json() as PagerDutyOnCallsResponse;\n\n if (result.oncalls.length !== 0) {\n const oncallsSorted = [...result.oncalls].sort((a, b) => {\n return a.escalation_level - b.escalation_level;\n });\n\n const oncallsFiltered = oncallsSorted.filter((oncall) => {\n return oncall.escalation_level === oncallsSorted[0].escalation_level;\n });\n\n usersItem = [...oncallsFiltered]\n .sort((a, b) => a.user.name > b.user.name ? 1 : -1)\n .map((oncall) => oncall.user);\n\n\n // remove duplicates from usersItem\n const uniqueUsers = new Map();\n usersItem.forEach((user) => {\n uniqueUsers.set(user.id, user);\n });\n\n usersItem.length = 0;\n uniqueUsers.forEach((user) => {\n usersItem.push(user);\n });\n\n return usersItem;\n }\n\n return [];\n\n } catch (error) {\n throw new HttpError(`Failed to parse oncall information: ${error}`, 500);\n }\n}\n\nexport async function getServiceById(serviceId: string, account?: string): Promise<PagerDutyService> {\n let response: Response;\n const params = `time_zone=UTC&include[]=integrations&include[]=escalation_policies`;\n const token = await getAuthToken(account);\n\n const options: RequestInit = {\n method: 'GET',\n headers: {\n Authorization: token,\n 'Accept': 'application/vnd.pagerduty+json;version=2',\n 'Content-Type': 'application/json',\n },\n };\n\n const apiBaseUrl = getApiBaseUrl(account);\n const baseUrl = `${apiBaseUrl}/services`;\n\n try {\n response = await fetchWithRetries(`${baseUrl}/${serviceId}?${params}`, options);\n } catch (error) {\n throw new Error(`Failed to retrieve service: ${error}`);\n }\n\n if (response.status >= 500) {\n throw new HttpError(`Failed to get service. PagerDuty API returned a server error. Retrying with the same arguments will not work.`, response.status);\n }\n\n switch (response.status) {\n case 400:\n throw new HttpError(\"Failed to get service. Caller provided invalid arguments.\", 400);\n case 401:\n throw new HttpError(\"Failed to get service. Caller did not supply credentials or did not provide the correct credentials.\", 401);\n case 403:\n throw new HttpError(\"Failed to get service. Caller is not authorized to view the requested resource.\", 403);\n case 404:\n throw new HttpError(\"Failed to get service. The requested resource was not found.\", 404);\n default: // 200\n break;\n }\n\n let result: PagerDutyServiceResponse;\n try {\n result = await response.json() as PagerDutyServiceResponse;\n\n return result.service;\n } catch (error) {\n throw new HttpError(`Failed to parse service information: ${error}`, 500);\n }\n}\n\nexport async function getServiceByIntegrationKey(integrationKey: string, account?: string): Promise<PagerDutyService> {\n let response: Response;\n const params = `query=${integrationKey}&time_zone=UTC&include[]=integrations&include[]=escalation_policies`;\n const token = await getAuthToken(account);\n\n const options: RequestInit = {\n method: 'GET',\n headers: {\n Authorization: token,\n 'Accept': 'application/vnd.pagerduty+json;version=2',\n 'Content-Type': 'application/json',\n },\n };\n\n const apiBaseUrl = getApiBaseUrl(account);\n const baseUrl = `${apiBaseUrl}/services`;\n\n try {\n response = await fetchWithRetries(`${baseUrl}?${params}`, options);\n } catch (error) {\n throw new Error(`Failed to retrieve service: ${error}`);\n }\n\n if (response.status >= 500) {\n throw new HttpError(`Failed to get service. PagerDuty API returned a server error. Retrying with the same arguments will not work.`, response.status);\n }\n\n switch (response.status) {\n case 400:\n throw new HttpError(\"Failed to get service. Caller provided invalid arguments.\", 400);\n case 401:\n throw new HttpError(\"Failed to get service. Caller did not supply credentials or did not provide the correct credentials.\", 401);\n case 403:\n throw new HttpError(\"Failed to get service. Caller is not authorized to view the requested resource.\", 403);\n case 404:\n throw new HttpError(\"Failed to get service. The requested resource was not found.\", 404);\n default: // 200\n break;\n }\n\n let result: PagerDutyServicesResponse;\n try {\n result = await response.json() as PagerDutyServicesResponse;\n } catch (error) {\n throw new HttpError(`Failed to parse service information: ${error}`, 500);\n }\n\n if (result.services.length === 0) {\n throw new HttpError(`Failed to get service. The requested resource was not found.`, 404);\n }\n\n return result.services[0];\n}\n\nexport async function getAllServices(): Promise<PagerDutyService[]> {\n const allServices: PagerDutyService[] = [];\n\n await Promise.all(\n Object.entries(EndpointConfig).map(async ([account, _]) => {\n let response: Response;\n const params = `time_zone=UTC&include[]=integrations&include[]=escalation_policies&include[]=teams&total=true`;\n\n const token = await getAuthToken(account);\n\n const options: RequestInit = {\n method: 'GET',\n headers: {\n Authorization: token,\n 'Accept': 'application/vnd.pagerduty+json;version=2',\n 'Content-Type': 'application/json',\n },\n };\n\n const apiBaseUrl = getApiBaseUrl(account);\n const baseUrl = `${apiBaseUrl}/services`;\n\n let offset = 0;\n const limit = 50;\n let result: PagerDutyServicesAPIResponse;\n\n try {\n do {\n const paginatedUrl = `${baseUrl}?${params}&offset=${offset}&limit=${limit}`;\n\n response = await fetchWithRetries(paginatedUrl, options);\n\n if (response.status >= 500) {\n throw new HttpError(`Failed to get services. PagerDuty API returned a server error. Retrying with the same arguments will not work.`, response.status);\n }\n\n switch (response.status) {\n case 400:\n throw new HttpError(\"Failed to get services. Caller provided invalid arguments.\", 400);\n case 401:\n throw new HttpError(\"Failed to get services. Caller did not supply credentials or did not provide the correct credentials.\", 401);\n case 403:\n throw new HttpError(\"Failed to get services. Caller is not authorized to view the requested resource.\", 403);\n default: // 200\n break;\n }\n\n result = await response.json() as PagerDutyServicesAPIResponse;\n\n // set account\n result.services.forEach((service) => {\n service.account = account;\n });\n\n allServices.push(...result.services);\n\n offset += limit;\n } while (offset < result.total!);\n } catch (error) {\n throw error;\n }\n\n }));\n\n return allServices;\n}\n\nexport async function getChangeEvents(serviceId: string, account?: string): Promise<PagerDutyChangeEvent[]> {\n let response: Response;\n const params = `limit=5&time_zone=UTC&sort_by=timestamp`;\n const options: RequestInit = {\n method: 'GET',\n headers: {\n Authorization: await getAuthToken(account),\n 'Accept': 'application/vnd.pagerduty+json;version=2',\n 'Content-Type': 'application/json',\n },\n };\n\n const apiBaseUrl = getApiBaseUrl(account);\n const baseUrl = `${apiBaseUrl}/services`;\n\n try {\n response = await fetchWithRetries(`${baseUrl}/${serviceId}/change_events?${params}`, options);\n } catch (error) {\n throw new Error(`Failed to retrieve change events for service: ${error}`);\n }\n\n if (response.status >= 500) {\n throw new HttpError(`Failed to get change events for service. PagerDuty API returned a server error. Retrying with the same arguments will not work.`, response.status);\n }\n\n switch (response.status) {\n case 400:\n throw new HttpError(\"Failed to get change events for service. Caller provided invalid arguments.\", 400);\n case 401:\n throw new HttpError(\"Failed to get change events for service. Caller did not supply credentials or did not provide the correct credentials.\", 401);\n case 403:\n throw new HttpError(\"Failed to get change events for service. Caller is not authorized to view the requested resource.\", 403);\n case 404:\n throw new HttpError(\"Failed to get change events for service. The requested resource was not found.\", 404);\n default: // 200\n break;\n }\n\n let result: PagerDutyChangeEventsResponse;\n try {\n result = await response.json() as PagerDutyChangeEventsResponse;\n\n return result.change_events;\n } catch (error) {\n throw new HttpError(`Failed to parse change events information: ${error}`, 500);\n }\n}\n\nexport async function getIncidents(serviceId: string, account?: string): Promise<PagerDutyIncident[]> {\n let response: Response;\n const params = `time_zone=UTC&sort_by=created_at&statuses[]=triggered&statuses[]=acknowledged&service_ids[]=${serviceId}`;\n\n const options: RequestInit = {\n method: 'GET',\n headers: {\n Authorization: await getAuthToken(account),\n 'Accept': 'application/vnd.pagerduty+json;version=2',\n 'Content-Type': 'application/json',\n },\n };\n\n const apiBaseUrl = getApiBaseUrl(account);\n const baseUrl = `${apiBaseUrl}/incidents`;\n\n try {\n response = await fetchWithRetries(`${baseUrl}?${params}`, options);\n } catch (error) {\n throw new Error(`Failed to retrieve incidents for service: ${error}`);\n }\n\n if (response.status >= 500) {\n throw new HttpError(`Failed to get incidents for service. PagerDuty API returned a server error. Retrying with the same arguments will not work.`, response.status);\n }\n\n switch (response.status) {\n case 400:\n throw new HttpError(\"Failed to get incidents for service. Caller provided invalid arguments.\", 400);\n case 401:\n throw new HttpError(\"Failed to get incidents for service. Caller did not supply credentials or did not provide the correct credentials.\", 401);\n case 402:\n throw new HttpError(\"Failed to get incidents for service. Account does not have the abilities to perform the action. Please review the response for the required abilities.\", 402);\n case 403:\n throw new HttpError(\"Failed to get incidents for service. Caller is not authorized to view the requested resource.\", 403);\n case 429:\n throw new HttpError(\"Failed to get incidents for service. Too many requests have been made, the rate limit has been reached.\", 429);\n default: // 200\n break;\n }\n\n let result: PagerDutyIncidentsResponse;\n try {\n result = await response.json() as PagerDutyIncidentsResponse;\n\n return result.incidents;\n } catch (error) {\n throw new HttpError(`Failed to parse incidents information: ${error}`, 500);\n }\n}\n\nexport async function getServiceStandards(serviceId: string, account?: string): Promise<PagerDutyServiceStandards> {\n let response: Response;\n\n const options: RequestInit = {\n method: 'GET',\n headers: {\n Authorization: await getAuthToken(account),\n 'Accept': 'application/vnd.pagerduty+json;version=2',\n 'Content-Type': 'application/json',\n },\n };\n\n const apiBaseUrl = getApiBaseUrl(account);\n const baseUrl = `${apiBaseUrl}/standards/scores/technical_services/${serviceId}`;\n\n try {\n response = await fetchWithRetries(baseUrl, options);\n } catch (error) {\n throw new Error(`Failed to retrieve service standards for service: ${error}`);\n }\n\n if (response.status >= 500) {\n throw new HttpError(`Failed to get service standards for service. PagerDuty API returned a server error. Retrying with the same arguments will not work.`, response.status);\n }\n\n switch (response.status) {\n case 401:\n throw new HttpError(\"Failed to get service standards for service. Caller did not supply credentials or did not provide the correct credentials.\", 401);\n case 403:\n throw new HttpError(\"Failed to get service standards for service. Caller is not authorized to view the requested resource.\", 403);\n case 429:\n throw new HttpError(\"Failed to get service standards for service. Too many requests have been made, the rate limit has been reached.\", 429);\n default: // 200\n break;\n }\n\n try {\n const result = await response.json();\n return result;\n } catch (error) {\n throw new HttpError(`Failed to parse service standards information: ${error}`, 500);\n }\n}\n\nexport async function getServiceMetrics(serviceId: string, account?: string): Promise<PagerDutyServiceMetrics[]> {\n let response: Response;\n\n const endDate = DateTime.now();\n const startDate = endDate.minus({ days: 30 });\n const body = JSON.stringify({\n filters: {\n created_at_start: startDate.toISO(),\n created_at_end: endDate.toISO(),\n service_ids: [\n serviceId\n ]\n }\n });\n\n const options: RequestInit = {\n method: 'POST',\n headers: {\n Authorization: await getAuthToken(account),\n 'Accept': 'application/vnd.pagerduty+json;version=2',\n 'Content-Type': 'application/json',\n },\n body: body\n };\n\n const apiBaseUrl = getApiBaseUrl(account);\n const baseUrl = `${apiBaseUrl}/analytics/metrics/incidents/services`;\n\n try {\n response = await fetchWithRetries(baseUrl, options);\n } catch (error) {\n throw new Error(`Failed to retrieve service metrics for service: ${error}`);\n }\n\n if (response.status >= 500) {\n throw new HttpError(`Failed to get service metrics for service. PagerDuty API returned a server error. Retrying with the same arguments will not work.`, response.status);\n }\n\n switch (response.status) {\n case 400:\n throw new HttpError(\"Failed to get service metrics for service. Caller provided invalid arguments. Please review the response for error details. Retrying with the same arguments will not work.\", 400);\n case 429:\n throw new HttpError(\"Failed to get service metrics for service. Too many requests have been made, the rate limit has been reached.\", 429);\n default: // 200\n break;\n }\n\n try {\n const result = await response.json();\n\n return result.data;\n } catch (error) {\n throw new HttpError(`Failed to parse service metrics information: ${error}`, 500);\n }\n}\n\nexport type CreateServiceIntegrationProps = {\n serviceId: string;\n vendorId: string;\n account?: string;\n}\n\nexport async function createServiceIntegration({ serviceId, vendorId, account }: CreateServiceIntegrationProps): Promise<string> {\n let response: Response;\n\n const apiBaseUrl = getApiBaseUrl(account);\n const baseUrl = `${apiBaseUrl}/services`;\n const token = await getAuthToken(account);\n\n const options: RequestInit = {\n method: 'POST',\n body: JSON.stringify({\n integration: {\n name: 'Backstage',\n service: {\n id: serviceId,\n type: 'service_reference',\n },\n vendor: {\n id: vendorId,\n type: 'vendor_reference',\n }\n }\n }),\n headers: {\n Authorization: token,\n 'Accept': 'application/vnd.pagerduty+json;version=2',\n 'Content-Type': 'application/json',\n },\n };\n\n try {\n response = await fetchWithRetries(`${baseUrl}/${serviceId}/integrations`, options);\n } catch (error) {\n throw new Error(`Failed to create service integration: ${error}`);\n }\n\n if (response.status >= 500) {\n throw new Error(`Failed to create service integration. PagerDuty API returned a server error. Retrying with the same arguments will not work.`);\n }\n\n switch (response.status) {\n case 400:\n throw new Error(`Failed to create service integration. Caller provided invalid arguments.`);\n case 401:\n throw new Error(`Failed to create service integration. Caller did not supply credentials or did not provide the correct credentials.`);\n case 403:\n throw new Error(`Failed to create service integration. Caller is not authorized to view the requested resource.`);\n case 429:\n throw new Error(`Failed to create service integration. Rate limit exceeded.`);\n default: // 201\n break;\n }\n\n let result: PagerDutyIntegrationResponse;\n try {\n result = await response.json() as PagerDutyIntegrationResponse;\n\n return result.integration.integration_key ?? '';\n\n } catch (error) {\n throw new Error(`Failed to parse service information: ${error}`);\n }\n}\n\nexport async function fetchWithRetries(url: string, options: RequestInit): Promise<Response> {\n let response: Response;\n let error: Error = new Error();\n\n // set retry parameters\n const maxRetries = 5;\n const delay = 1000;\n let factor = 2;\n\n for (let i = 0; i < maxRetries; i++) {\n try {\n response = await fetch(url, options);\n return response;\n } catch (e) {\n error = e;\n }\n\n const timeout = delay * factor;\n await new Promise(resolve => setTimeout(resolve, timeout));\n factor *= 2;\n }\n\n throw new Error(`Failed to fetch data after ${maxRetries} retries. Last error: ${error}`);\n}\n","import {\n AuthService,\n DiscoveryService,\n LoggerService,\n RootConfigService\n} from '@backstage/backend-plugin-api';\nimport {\n createLegacyAuthAdapters,\n errorHandler\n} from '@backstage/backend-common';\nimport {\n getAllEscalationPolicies,\n getChangeEvents,\n getIncidents,\n getOncallUsers,\n getServiceById,\n getServiceByIntegrationKey,\n getServiceStandards,\n getServiceMetrics,\n getAllServices,\n loadPagerDutyEndpointsFromConfig,\n createServiceIntegration,\n getServiceRelationshipsById,\n addServiceRelationsToService,\n removeServiceRelationsFromService\n} from '../apis/pagerduty';\nimport {\n HttpError,\n PagerDutyChangeEventsResponse,\n PagerDutyIncidentsResponse,\n PagerDutyOnCallUsersResponse,\n PagerDutyServiceResponse,\n PagerDutyServiceStandardsResponse,\n PagerDutyServiceMetricsResponse,\n PagerDutyServicesResponse,\n PagerDutyEntityMapping,\n PagerDutyEntityMappingsResponse,\n PagerDutyService,\n PagerDutyServiceDependency,\n PagerDutySetting\n} from '@pagerduty/backstage-plugin-common';\nimport { loadAuthConfig } from '../auth/auth';\nimport {\n PagerDutyBackendStore,\n RawDbEntityResultRow\n} from '../db/PagerDutyBackendDatabase';\nimport * as express from 'express';\nimport Router from 'express-promise-router';\nimport type {\n CatalogApi,\n GetEntitiesResponse\n} from '@backstage/catalog-client';\n\n\nexport interface RouterOptions {\n logger: LoggerService;\n config: RootConfigService;\n store: PagerDutyBackendStore;\n discovery: DiscoveryService;\n auth?: AuthService;\n catalogApi?: CatalogApi;\n}\n\nexport type Annotations = {\n \"pagerduty.com/integration-key\": string;\n \"pagerduty.com/service-id\": string;\n \"pagerduty.com/account\": string;\n}\n\nexport async function createComponentEntitiesReferenceDict({ items: componentEntities }: GetEntitiesResponse): Promise<Record<string, { ref: string, name: string }>> {\n const componentEntitiesDict: Record<string, { ref: string, name: string }> = {};\n\n await Promise.all(componentEntities.map(async (entity) => {\n const serviceId = entity.metadata.annotations?.['pagerduty.com/service-id'];\n const integrationKey = entity.metadata.annotations?.['pagerduty.com/integration-key'];\n const account = entity.metadata.annotations?.['pagerduty.com/account'];\n\n if (serviceId !== undefined && serviceId !== \"\") {\n componentEntitiesDict[serviceId] = {\n ref: `${entity.kind}:${entity.metadata.namespace}/${entity.metadata.name}`.toLowerCase(),\n name: entity.metadata.name,\n };\n }\n else if (integrationKey !== undefined && integrationKey !== \"\") {\n // get service id from integration key, we ignore errors here since we're focused\n // only on building a mapping between valid service IDs and the corresponding Backstage entity\n const service = await getServiceByIntegrationKey(integrationKey, account).catch(() => undefined);\n\n if (service !== undefined) {\n componentEntitiesDict[service.id] = {\n ref: `${entity.kind}:${entity.metadata.namespace}/${entity.metadata.name}`.toLowerCase(),\n name: entity.metadata.name,\n };\n }\n }\n }));\n\n return componentEntitiesDict;\n}\n\nexport async function buildEntityMappingsResponse(\n entityMappings: RawDbEntityResultRow[],\n componentEntitiesDict: Record<string, {\n ref: string;\n name: string;\n }>,\n componentEntities: GetEntitiesResponse,\n pagerDutyServices: PagerDutyService[]\n): Promise<PagerDutyEntityMappingsResponse> {\n\n const result: PagerDutyEntityMappingsResponse = {\n mappings: []\n };\n\n pagerDutyServices.forEach((service) => {\n // Check for service mapping annotation in any entity config file and get the entity ref\n const entityRef = componentEntitiesDict[service.id]?.ref;\n const entityName = componentEntitiesDict[service.id]?.name;\n\n // Check if the service is mapped to an entity in the database\n const entityMapping = entityMappings.find((mapping) => mapping.serviceId === service.id);\n\n if (entityMapping) {\n if (entityRef === undefined) {\n if (entityMapping.entityRef === \"\" || entityMapping.entityRef === undefined) {\n result.mappings.push({\n entityRef: \"\",\n entityName: \"\",\n integrationKey: entityMapping.integrationKey,\n serviceId: entityMapping.serviceId,\n status: \"NotMapped\",\n serviceName: service.name,\n team: service.teams?.[0]?.name ?? \"\",\n escalationPolicy: service.escalation_policy !== undefined ? service.escalation_policy.name : \"\",\n serviceUrl: service.html_url,\n account: service.account,\n });\n }\n else {\n const entityRefName = componentEntities.items.find((entity) => `${entity.kind}:${entity.metadata.namespace}/${entity.metadata.name}`.toLowerCase() === entityMapping.entityRef)?.metadata.name ?? \"\";\n\n result.mappings.push({\n entityRef: entityMapping.entityRef,\n entityName: entityRefName,\n serviceId: entityMapping.serviceId,\n integrationKey: entityMapping.integrationKey,\n status: \"OutOfSync\",\n serviceName: service.name,\n team: service.teams?.[0]?.name ?? \"\",\n escalationPolicy: service.escalation_policy !== undefined ? service.escalation_policy.name : \"\",\n serviceUrl: service.html_url,\n account: service.account,\n });\n }\n } else if (entityRef !== entityMapping.entityRef) {\n const entityRefName = componentEntities.items.find((entity) => `${entity.kind}:${entity.metadata.namespace}/${entity.metadata.name}`.toLowerCase() === entityMapping.entityRef)?.metadata.name ?? \"\";\n\n result.mappings.push({\n entityRef: entityMapping.entityRef !== \"\" ? entityMapping.entityRef : \"\",\n entityName: entityMapping.entityRef !== \"\" ? entityRefName : \"\",\n serviceId: entityMapping.serviceId,\n integrationKey: entityMapping.integrationKey,\n status: \"OutOfSync\",\n serviceName: service.name,\n team: service.teams?.[0]?.name ?? \"\",\n escalationPolicy: service.escalation_policy !== undefined ? service.escalation_policy.name : \"\",\n serviceUrl: service.html_url,\n account: service.account,\n });\n } else if (entityRef === entityMapping.entityRef) {\n result.mappings.push({\n entityRef: entityMapping.entityRef !== \"\" ? entityMapping.entityRef : \"\",\n entityName: entityMapping.entityRef !== \"\" ? entityName : \"\",\n serviceId: entityMapping.serviceId,\n integrationKey: entityMapping.integrationKey,\n status: \"InSync\",\n serviceName: service.name,\n team: service.teams?.[0]?.name ?? \"\",\n escalationPolicy: service.escalation_policy !== undefined ? service.escalation_policy.name : \"\",\n serviceUrl: service.html_url,\n account: service.account,\n });\n }\n } else {\n const backstageVendorId = 'PRO19CT';\n const backstageIntegrationKey = service.integrations?.find((integration) => integration.vendor?.id === backstageVendorId)?.integration_key ?? \"\";\n\n if (entityRef !== undefined) {\n result.mappings.push({\n entityRef: entityRef,\n entityName: entityName,\n serviceId: service.id,\n integrationKey: backstageIntegrationKey,\n status: \"InSync\",\n serviceName: service.name,\n team: service.teams?.[0]?.name ?? \"\",\n escalationPolicy: service.escalation_policy !== undefined ? service.escalation_policy.name : \"\",\n serviceUrl: service.html_url,\n account: service.account,\n });\n } else {\n result.mappings.push({\n entityRef: \"\",\n entityName: \"\",\n serviceId: service.id,\n integrationKey: backstageIntegrationKey,\n status: \"NotMapped\",\n serviceName: service.name,\n team: service.teams?.[0]?.name ?? \"\",\n escalationPolicy: service.escalation_policy !== undefined ? service.escalation_policy.name : \"\",\n serviceUrl: service.html_url,\n account: service.account,\n });\n }\n }\n });\n\n const sortedResult = result.mappings.sort((a, b) => {\n if (a.serviceName! < b.serviceName!) { return -1; }\n else if (a.serviceName! > b.serviceName!) { return 1; }\n return 0;\n });\n\n result.mappings = sortedResult;\n\n return result;\n}\n\nexport async function createRouter(\n options: RouterOptions\n): Promise<express.Router> {\n const { logger, config, store, catalogApi } = options;\n let { auth } = options;\n\n if (!auth) {\n auth = createLegacyAuthAdapters(options).auth;\n }\n\n // Get authentication Config\n await loadAuthConfig(config, logger);\n\n // Get optional PagerDuty custom endpoints from config\n loadPagerDutyEndpointsFromConfig(config, logger);\n\n // Create the router\n const router = Router();\n router.use(express.json());\n\n // DELETE /dependencies/service/:serviceId\n router.delete('/dependencies/service/:serviceId', async (request, response) => {\n try {\n // Get the serviceId from the request parameters\n const serviceId = request.params.serviceId || '';\n const account = request.query.account as string || '';\n\n if(serviceId === '') {\n response.status(400).json(\"Bad Request: ':serviceId' must be provided as part of the path\");\n }\n\n const dependencies: string[] = Object.keys(request.body).length === 0 ? [] : request.body;\n if(!dependencies || dependencies.length === 0) {\n response.status(400).json(\"Bad Request: 'dependencies' must be provided as part of the request body\");\n }\n\n const serviceRelations : PagerDutyServiceDependency[] = [];\n\n dependencies.forEach(async (dependency) => {\n serviceRelations.push({\n supporting_service: {\n id: dependency,\n type: \"service\"\n },\n dependent_service: {\n id: serviceId,\n type: \"service\"\n }\n });\n });\n\n await removeServiceRelationsFromService(serviceRelations, account);\n \n response.sendStatus(200);\n\n } catch (error) {\n if (error instanceof HttpError) {\n logger.error(`Error occurred while processing request: ${error.message}`);\n response.status(error.status).json({\n errors: [\n `${error.message}`\n ]\n });\n }\n }\n });\n\n // POST /dependencies/service/:serviceId\n router.post('/dependencies/service/:serviceId', async (request, response) => {\n try {\n // Get the serviceId from the request parameters\n const serviceId = request.params.serviceId || '';\n const account = request.query.account as string || '';\n\n if(serviceId === '') {\n response.status(400).json(\"Bad Request: ':serviceId' must be provided as part of the path\");\n }\n\n const dependencies: string[] = Object.keys(request.body).length === 0 ? [] : request.body;\n if(!dependencies || dependencies.length === 0) {\n response.status(400).json(\"Bad Request: 'dependencies' must be provided as part of the request body\");\n }\n\n const serviceRelations : PagerDutyServiceDependency[] = [];\n\n dependencies.forEach(async (dependency) => {\n serviceRelations.push({\n supporting_service: {\n id: dependency,\n type: \"service\"\n },\n dependent_service: {\n id: serviceId,\n type: \"service\"\n }\n });\n });\n\n await addServiceRelationsToService(serviceRelations, account);\n \n response.sendStatus(200);\n\n } catch (error) {\n if (error instanceof HttpError) {\n logger.error(`Error occurred while processing request: ${error.message}`);\n response.status(error.status).json({\n errors: [\n `${error.message}`\n ]\n });\n }\n }\n });\n\n\n router.get('/dependencies/service/:serviceId', async (request, response) => {\n try {\n const serviceId = request.params.serviceId;\n const account = request.query.account as string || '';\n\n if (serviceId) {\n const serviceRelationships: PagerDutyServiceDependency[] = await getServiceRelationshipsById(serviceId, account);\n\n if (serviceRelationships) {\n response.json({\n relationships: serviceRelationships\n });\n }\n }\n else {\n response.status(400).json(\"Bad Request: ':serviceId' must be provided as part of the path\");\n }\n }\n catch (error) {\n if (error instanceof HttpError) {\n response.status(error.status).json({\n errors: [\n `${error.message}`\n ]\n });\n }\n }\n });\n\n // GET /catalog/entity/:entityRef\n router.get('/catalog/entity/:type/:namespace/:name', async (request, response) => {\n const type = request.params.type;\n const namespace = request.params.namespace;\n const name = request.params.name;\n\n try {\n if (type && namespace && name) {\n const entityRef = `${type}:${namespace}/${name}`.toLowerCase();\n const foundEntity = await catalogApi?.getEntityByRef(entityRef);\n\n if (foundEntity) {\n response.json(foundEntity.metadata.annotations?.[\"pagerduty.com/service-id\"]);\n\n }\n else {\n response.status(404);\n }\n }\n else {\n response.status(400).json(\"Bad Request: ':entityRef' must be provided as part of the path\");\n }\n }\n catch (error) {\n if (error instanceof HttpError) {\n response.status(error.status).json({\n errors: [\n `${error.message}`\n ]\n });\n }\n }\n });\n\n // POST /settings\n router.post('/settings', async (request, response) => {\n try {\n // Get the serviceId from the request parameters\n const settings : PagerDutySetting[] = request.body;\n\n // For each setting, update or insert the value in the database\n await Promise.all(settings.map(async (setting) => {\n if(setting.id === undefined || setting.value === undefined) {\n response.status(400).json(\"Bad Request: 'id' and 'value' are required\");\n }\n\n if(!isValidSetting(setting.value)) {\n response.status(400).json(\"Bad Request: 'value' is invalid. Valid options are 'backstage', 'pagerduty', 'both' or 'disabled'\");\n }\n\n await store.updateSetting(setting);\n }));\n\n response.sendStatus(200);\n\n } catch (error) {\n if (error instanceof HttpError) {\n logger.error(`Error occurred while processing request: ${error.message}`);\n response.status(error.status).json({\n errors: [\n `${error.message}`\n ]\n });\n }\n }\n });\n\n // GET /settings/:settingId\n router.get('/settings/:settingId', async (request, response) => {\n try {\n // Get param from the request\n const settingId = request.params.settingId;\n \n // Find setting by id\n const setting = await store.findSetting(settingId);\n\n if (!setting) {\n response.status(404).json({});\n return;\n }\n\n response.json(setting);\n } catch (error) {\n if (error instanceof HttpError) {\n response.status(error.status).json({\n errors: [\n `${error.message}`\n ]\n });\n }\n }\n });\n\n function isValidSetting(value: string): boolean {\n if(value === \"backstage\" || value === \"pagerduty\" || value === \"both\" || value === \"disabled\") {\n return true;\n }\n\n return false;\n }\n\n // POST /mapping/entity\n router.post('/mapping/entity', async (request, response) => {\n try {\n // Get the serviceId from the request parameters\n const entity: PagerDutyEntityMapping = request.body;\n\n if (!entity.serviceId) {\n response.status(400).json(\"Bad Request: 'service_id' is required\");\n }\n\n // Get all the entity mappings from the database\n const entityMappings = await store.getAllEntityMappings();\n const oldMapping = entityMappings.find((mapping) => mapping.serviceId === entity.serviceId);\n\n // in case a mapping is defined and no integration exists, \n // we need to create one\n if (entity.entityRef !== \"\" &&\n (entity.integrationKey === \"\" || entity.integrationKey === undefined)) {\n\n const backstageVendorId = 'PRO19CT';\n // check for existing integration key on service\n const service = await getServiceById(entity.serviceId, entity.account);\n const backstageIntegration = service.integrations?.find((integration) => integration.vendor?.id === backstageVendorId);\n\n if (!backstageIntegration) {\n // If an integration does not exist for service, \n // create it in PagerDuty\n const integrationKey = await createServiceIntegration({\n serviceId: entity.serviceId,\n vendorId: backstageVendorId,\n account: entity.account\n });\n\n entity.integrationKey = integrationKey;\n } else {\n entity.integrationKey = backstageIntegration.integration_key;\n }\n }\n\n const entityMappingId = await store.insertEntityMapping(entity);\n\n // Refresh new and old entity unless they are empty strings\n if (entity.entityRef !== \"\") {\n // force refresh of new entity\n await catalogApi?.refreshEntity(entity.entityRef);\n }\n\n if (oldMapping && oldMapping.entityRef !== \"\") {\n // force refresh of old entity\n await catalogApi?.refreshEntity(oldMapping.entityRef);\n }\n\n response.json({\n id: entityMappingId,\n entityRef: entity.entityRef,\n integrationKey: entity.integrationKey,\n serviceId: entity.serviceId,\n status: entity.status,\n account: entity.account,\n });\n } catch (error) {\n if (error instanceof HttpError) {\n logger.error(`Error occurred while processing request: ${error.message}`);\n response.status(error.status).json({\n errors: [\n `${error.message}`\n ]\n });\n }\n }\n });\n\n // GET /mapping/entity\n router.get('/mapping/entity', async (_, response) => {\n try {\n // Get all the entity mappings from the database\n const entityMappings = await store.getAllEntityMappings();\n\n // Get all the entities from the catalog\n const componentEntities = await catalogApi!.getEntities({\n filter: {\n kind: 'Component',\n }\n });\n\n // Build reference dictionary of componentEntities with serviceId as the key and entity reference and name pair as the value\n const componentEntitiesDict: Record<string, { ref: string, name: string }> = await createComponentEntitiesReferenceDict(componentEntities);\n\n // Get all services from PagerDuty\n const pagerDutyServices = await getAllServices();\n\n // Build the response object\n const result: PagerDutyEntityMappingsResponse = await buildEntityMappingsResponse(entityMappings, componentEntitiesDict, componentEntities, pagerDutyServices);\n\n response.json(result);\n } catch (error) {\n if (error instanceof HttpError) {\n response.status(error.status).json({\n errors: [\n `${error.message}`\n ]\n });\n }\n }\n });\n\n // GET /mapping/entity\n router.get('/mapping/entity/:type/:namespace/:name', async (request, response) => {\n try {\n // Get the type, namespace and entity name from the request parameters\n const entityType: string = request.params.type || '';\n const entityNamespace: string = request.params.namespace || '';\n const entityName: string = request.params.name || '';\n\n if (entityType === ''\n || entityNamespace === ''\n || entityName === '') {\n response.status(400).json(\"Required params not specified.\");\n return;\n }\n\n const entityRef = `${entityType}:${entityNamespace}/${entityName}`.toLowerCase();\n\n // Get all the entity mappings from the database\n const entityMapping = await store.findEntityMappingByEntityRef(entityRef);\n\n if (!entityMapping) {\n response.status(404).json(`Mapping for entityRef ${entityRef} not found.`);\n return;\n }\n\n response.json({\n mapping: entityMapping\n });\n\n } catch (error) {\n if (error instanceof HttpError) {\n response.status(error.status).json({\n errors: [\n `${error.message}`\n ]\n });\n }\n }\n });\n\n // GET /mapping/entity/service/:serviceId\n router.get('/mapping/entity/service/:serviceId', async (request, response) => {\n try {\n // Get the type, namespace and entity name from the request parameters\n const serviceId: string = request.params.serviceId ?? '';\n\n if (serviceId === '') {\n response.status(400).json(\"Required params not specified.\");\n return;\n }\n\n // Get all the entity mappings from the database\n const entityMapping = await store.findEntityMappingByServiceId(serviceId);\n\n if (!entityMapping) {\n response.status(404).json(`Mapping for serviceId ${serviceId} not found.`);\n return;\n }\n\n response.json({\n mapping: entityMapping\n });\n\n } catch (error) {\n if (error instanceof HttpError) {\n response.status(error.status).json({\n errors: [\n `${error.message}`\n ]\n });\n }\n }\n });\n\n // GET /escalation_policies\n router.get('/escalation_policies', async (_, response) => {\n\n try {\n let escalationPolicyList = await getAllEscalationPolicies();\n\n // sort the escalation policies by account and name\n escalationPolicyList = escalationPolicyList.sort((a, b) => {\n if (a.account === b.account) {\n return a.name.localeCompare(b.name);\n }\n return a.account!.localeCompare(b.account!);\n });\n\n const escalationPolicyDropDownOptions = escalationPolicyList.map((policy) => {\n let policyLabel = policy.name;\n if (policy.account && policy.account !== 'default') {\n policyLabel = `(${policy.account}) ${policy.name}`;\n }\n\n return {\n label: policyLabel,\n value: policy.id,\n };\n });\n\n response.json(escalationPolicyDropDownOptions);\n } catch (error) {\n if (error instanceof HttpError) {\n response.status(error.status).json({\n errors: [\n `${error.message}`\n ]\n });\n }\n }\n });\n\n // GET /oncall\n router.get('/oncall-users', async (request, response) => {\n try {\n // Get the escalation policy ID from the request parameters with parameter name \"escalation_policy_ids[]\"\n const escalationPolicyId: string = request.query.escalation_policy_ids as string || '';\n const account = request.query.account as string || '';\n\n if (escalationPolicyId === '') {\n response.status(400).json(\"Bad Request: 'escalation_policy_ids[]' is required\");\n }\n\n const oncallUsers = await getOncallUsers(escalationPolicyId, account);\n const onCallUsersResponse: PagerDutyOnCallUsersResponse = {\n users: oncallUsers\n };\n\n response.json(onCallUsersResponse);\n } catch (error) {\n if (error instanceof HttpError) {\n response.status(error.status).json({\n errors: [\n `${error.message}`\n ]\n });\n }\n }\n });\n\n // GET /services/:serviceId\n router.get('/services/:serviceId', async (request, response) => {\n try {\n // Get the serviceId from the request parameters\n const serviceId: string = request.params.serviceId || '';\n const account = request.query.account as string || '';\n\n if (serviceId === '') {\n response.status(400).json(\"Bad Request: ':serviceId' must be provided as part of the path or 'integration_key' as a query parameter\");\n }\n\n const service = await getServiceById(serviceId, account);\n const serviceResponse: PagerDutyServiceResponse = {\n service: service\n }\n\n response.json(serviceResponse);\n } catch (error) {\n if (error instanceof HttpError) {\n response.status(error.status).json({\n errors: [\n `${error.message}`\n ]\n });\n }\n }\n });\n\n // GET /services?integration_key=:integrationKey\n router.get('/services', async (request, response) => {\n try {\n // Get the serviceId from the request parameters\n const integrationKey: string = request.query.integration_key as string || '';\n const account = request.query.account as string || '';\n\n if (integrationKey !== '') {\n const service = await getServiceByIntegrationKey(integrationKey, account);\n const serviceResponse: PagerDutyServiceResponse = {\n service: service\n }\n\n response.json(serviceResponse);\n } else {\n const services = await getAllServices();\n const servicesResponse: PagerDutyServicesResponse = {\n services: services\n }\n\n response.json(servicesResponse);\n }\n } catch (error) {\n if (error instanceof HttpError) {\n response.status(error.status).json({\n errors: [\n `${error.message}`\n ]\n });\n }\n }\n });\n\n // POST /services/:serviceId/integration/:vendorId\n router.post('/services/:serviceId/integration/:vendorId', async (request, response) => {\n try {\n const serviceId: string = request.params.serviceId || '';\n const vendorId: string = request.params.vendorId || '';\n const account = request.query.account as string || '';\n\n if (serviceId === '' || vendorId === '') {\n response.status(400).json(\"Bad Request: ':serviceId' and ':vendorId' must be provided as part of the path\");\n }\n\n const integrationKey = await createServiceIntegration({\n serviceId,\n vendorId,\n account\n });\n\n response.json(integrationKey);\n } catch (error) {\n if (error instanceof HttpError) {\n logger.error(`Error occurred while processing request: ${error.message}`);\n response.status(error.status).json({\n errors: [\n `${error.message}`\n ]\n });\n }\n }\n });\n\n // GET /services/:serviceId/change-events\n router.get('/services/:serviceId/change-events', async (request, response) => {\n try {\n // Get the serviceId from the request parameters\n const serviceId: string = request.params.serviceId || '';\n const account = request.query.account as string || '';\n\n const changeEvents = await getChangeEvents(serviceId, account);\n const changeEventsResponse: PagerDutyChangeEventsResponse = {\n change_events: changeEvents\n }\n\n response.json(changeEventsResponse);\n } catch (error) {\n if (error instanceof HttpError) {\n response.status(error.status).json({\n errors: [\n `${error.message}`\n ]\n });\n }\n }\n });\n\n // GET /services/:serviceId/incidents\n router.get('/services/:serviceId/incidents', async (request, response) => {\n try {\n // Get the serviceId from the request parameters\n const serviceId: string = request.params.serviceId || '';\n const account = request.query.account as string || '';\n\n const incidents = await getIncidents(serviceId, account);\n const incidentsResponse: PagerDutyIncidentsResponse = {\n incidents\n }\n\n response.json(incidentsResponse);\n } catch (error) {\n if (error instanceof HttpError) {\n response.status(error.status).json({\n errors: [\n `${error.message}`\n ]\n });\n }\n }\n });\n\n // GET /services/:serviceId/standards\n router.get('/services/:serviceId/standards', async (request, response) => {\n try {\n\n // Get the serviceId from the request parameters\n const serviceId: string = request.params.serviceId || '';\n const account = request.query.account as string || '';\n\n const serviceStandards = await getServiceStandards(serviceId, account);\n const serviceStandardsResponse: PagerDutyServiceStandardsResponse = {\n standards: serviceStandards\n }\n\n response.json(serviceStandardsResponse);\n } catch (error) {\n if (error instanceof HttpError) {\n response.status(error.status).json({\n errors: [\n `${error.message}`\n ]\n });\n }\n }\n });\n\n // GET /services/:serviceId/metrics\n router.get('/services/:serviceId/metrics', async (request, response) => {\n try {\n // Get the serviceId from the request parameters\n const serviceId: string = request.params.serviceId || '';\n const account = request.query.account as string || '';\n\n const metrics = await getServiceMetrics(serviceId, account);\n\n\n const metricsResponse: PagerDutyServiceMetricsResponse = {\n metrics: metrics\n };\n\n response.json(metricsResponse);\n\n } catch (error) {\n if (error instanceof HttpError) {\n response.status(error.status).json({\n errors: [\n `${error.message}`\n ]\n });\n }\n }\n });\n\n // GET /health\n router.get('/health', async (_, response) => {\n response.status(200).json({ status: 'ok' });\n });\n\n // Add error handler\n router.use(errorHandler());\n\n // Return the router\n return router;\n}\n","import { PagerDutyEntityMapping, PagerDutySetting } from \"@pagerduty/backstage-plugin-common\";\nimport { resolvePackagePath } from \"@backstage/backend-plugin-api\";\nimport { Knex } from 'knex';\nimport { v4 as uuid } from 'uuid';\n\nexport type RawDbEntityResultRow = {\n id: string;\n entityRef: string;\n serviceId: string;\n integrationKey: string;\n account?: string;\n processedDate?: Date;\n};\n\n/** @public */\nexport interface PagerDutyBackendStore {\n insertEntityMapping(entity: PagerDutyEntityMapping): Promise <string> \n getAllEntityMappings(): Promise<RawDbEntityResultRow[]>\n findEntityMappingByEntityRef(entityRef: string): Promise<RawDbEntityResultRow | undefined>\n findEntityMappingByServiceId(serviceId: string): Promise<RawDbEntityResultRow | undefined>\n updateSetting(setting: PagerDutySetting): Promise<string>\n findSetting(settingId: string): Promise<PagerDutySetting | undefined>\n getAllSettings(): Promise<PagerDutySetting[]>\n}\n\ntype Options = {\n skipMigrations?: boolean;\n};\n\n/** @public */\nexport class PagerDutyBackendDatabase implements PagerDutyBackendStore {\n static async create(knex: Knex, options?: Options): Promise<PagerDutyBackendStore> {\n if(options?.skipMigrations) {\n const migrationsDir = resolvePackagePath(\"@pagerduty/backstage-plugin-backend\", \"migrations\");\n \n await knex.migrate.latest({\n directory: migrationsDir,\n });\n }\n\n return new PagerDutyBackendDatabase(knex);\n }\n\n constructor(private readonly db: Knex) { }\n\n async insertEntityMapping(entity: PagerDutyEntityMapping): Promise<string> {\n const entityMappingId = uuid();\n\n const [result] = await this.db<RawDbEntityResultRow>('pagerduty_entity_mapping')\n .insert({\n id: entityMappingId,\n entityRef: entity.entityRef,\n serviceId: entity.serviceId,\n integrationKey: entity.integrationKey,\n account: entity.account,\n processedDate: new Date(),\n })\n .onConflict(['serviceId'])\n .merge(['entityRef', 'integrationKey', 'account', 'processedDate']) \n .returning('id');\n\n return result.id;\n }\n\n async getAllEntityMappings(): Promise<RawDbEntityResultRow[]> {\n const rawEntities = await this.db<RawDbEntityResultRow>('pagerduty_entity_mapping');\n\n if (!rawEntities) {\n return [];\n }\n\n return rawEntities;\n }\n\n async findEntityMappingByEntityRef(entityRef: string): Promise<RawDbEntityResultRow | undefined> {\n const rawEntity = await this.db<RawDbEntityResultRow>('pagerduty_entity_mapping')\n .where('entityRef', entityRef)\n .first();\n\n return rawEntity;\n }\n\n async findEntityMappingByServiceId(serviceId: string): Promise<RawDbEntityResultRow | undefined> {\n const rawEntity = await this.db<RawDbEntityResultRow>('pagerduty_entity_mapping')\n .where('serviceId', serviceId)\n .first();\n\n return rawEntity;\n }\n\n async updateSetting(setting: PagerDutySetting): Promise<string> {\n const [result] = await this.db<PagerDutySetting>('pagerduty_settings')\n .insert({\n id: setting.id,\n value: setting.value \n })\n .onConflict(['id'])\n .merge(['value'])\n .returning('id');\n\n return result.id;\n }\n\n async findSetting(settingId: string): Promise<PagerDutySetting | undefined> {\n const rawEntity = await this.db<PagerDutySetting>('pagerduty_settings')\n .where('id', settingId)\n .first();\n\n return rawEntity;\n }\n\n async getAllSettings(): Promise<PagerDutySetting[]> {\n const rawEntities = await this.db<PagerDutySetting>('pagerduty_settings');\n\n if (!rawEntities) {\n return [];\n }\n\n return rawEntities;\n }\n}","import { AuthService, LoggerService, coreServices, createBackendPlugin } from '@backstage/backend-plugin-api';\nimport { createRouter } from './service/router';\nimport { PagerDutyBackendDatabase, PagerDutyBackendStore } from './db';\nimport { CatalogClient } from '@backstage/catalog-client';\n\nclass CatalogFetchApi {\n constructor(\n private readonly logger: LoggerService,\n private readonly auth: AuthService,\n ) {}\n\n async fetch(input: any, init: RequestInit | undefined) : Promise<Response>{\n const request = new Request(input as any, init);\n const { token } = await this.auth.getPluginRequestToken({\n onBehalfOf: await this.auth.getOwnServiceCredentials(),\n targetPluginId: 'catalog',\n });\n\n request.headers.set('Authorization', `Bearer ${token}`);\n this.logger.debug(`Added token to outgoing request to ${request.url}`);\n return fetch(request);\n }\n}\n\n/** @public */\nexport const pagerDutyPlugin = createBackendPlugin({\n pluginId: 'pagerduty',\n register(env) {\n env.registerInit({\n deps: {\n logger: coreServices.logger,\n config: coreServices.rootConfig,\n httpRouter: coreServices.httpRouter, \n database: coreServices.database, \n discovery: coreServices.discovery,\n auth: coreServices.auth,\n },\n async init({ config, logger, httpRouter, database, discovery, auth }) {\n\n const pagerDutyBackendStore : PagerDutyBackendStore = await PagerDutyBackendDatabase.create(\n await database.getClient(),\n { skipMigrations: true },\n );\n\n httpRouter.use(\n await createRouter({\n config,\n logger,\n store: pagerDutyBackendStore,\n discovery,\n auth,\n catalogApi: new CatalogClient({\n discoveryApi: discovery,\n fetchApi: new CatalogFetchApi(logger, auth),\n })\n }),\n );\n httpRouter.addAuthPolicy({\n path: '/',\n allow: 'unauthenticated',\n });\n },\n });\n }\n});"],"names":["isLegacyConfig","HttpError","DateTime","fetch","createLegacyAuthAdapters","Router","express","errorHandler","resolvePackagePath","uuid","createBackendPlugin","coreServices","CatalogClient"],"mappings":"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"}
package/dist/index.d.ts CHANGED
@@ -47,6 +47,6 @@ declare function buildEntityMappingsResponse(entityMappings: RawDbEntityResultRo
47
47
  declare function createRouter(options: RouterOptions): Promise<express.Router>;
48
48
 
49
49
  /** @public */
50
- declare const pagerDutyPlugin: () => _backstage_backend_plugin_api.BackendFeature;
50
+ declare const pagerDutyPlugin: _backstage_backend_plugin_api.BackendFeatureCompat;
51
51
 
52
52
  export { type Annotations, type RouterOptions, buildEntityMappingsResponse, createComponentEntitiesReferenceDict, createRouter, pagerDutyPlugin as default };
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@pagerduty/backstage-plugin-backend",
3
- "version": "0.9.0-next.5",
3
+ "version": "0.9.0-next.6",
4
4
  "main": "dist/index.cjs.js",
5
5
  "types": "dist/index.d.ts",
6
6
  "license": "Apache-2.0",
@@ -10,6 +10,8 @@
10
10
  "types": "dist/index.d.ts"
11
11
  },
12
12
  "backstage": {
13
+ "pluginPackages": "pagerduty",
14
+ "pluginId": "backend",
13
15
  "role": "backend-plugin"
14
16
  },
15
17
  "repository": {
@@ -27,19 +29,19 @@
27
29
  "postpack": "backstage-cli package postpack"
28
30
  },
29
31
  "dependencies": {
30
- "@backstage/backend-common": "^0.22.0",
31
- "@backstage/backend-defaults": "^0.2.18",
32
- "@backstage/backend-plugin-api": "^0.6.18",
33
- "@backstage/backend-tasks": "^0.5.25",
32
+ "@backstage/backend-common": "^0.23.3",
33
+ "@backstage/backend-defaults": "^0.4.1",
34
+ "@backstage/backend-plugin-api": "^0.7.0",
35
+ "@backstage/backend-tasks": "^0.5.27",
34
36
  "@backstage/catalog-client": "^1.6.5",
35
37
  "@backstage/catalog-model": "^1.5.0",
36
38
  "@backstage/config": "^1.2.0",
37
- "@backstage/core-plugin-api": "^1.9.2",
38
- "@backstage/plugin-catalog-common": "^1.0.24",
39
- "@backstage/plugin-catalog-node": "^1.12.0",
40
- "@backstage/plugin-scaffolder-node": "^0.4.4",
39
+ "@backstage/core-plugin-api": "^1.9.3",
40
+ "@backstage/plugin-catalog-common": "^1.0.25",
41
+ "@backstage/plugin-catalog-node": "^1.12.4",
42
+ "@backstage/plugin-scaffolder-node": "^0.4.8",
41
43
  "@material-ui/core": "^4.12.4",
42
- "@pagerduty/backstage-plugin-common": "0.2.1-next.5",
44
+ "@pagerduty/backstage-plugin-common": "0.2.1",
43
45
  "@rjsf/core": "^5.14.3",
44
46
  "@types/express": "^4.17.6",
45
47
  "express": "^4.19.2",
@@ -52,8 +54,8 @@
52
54
  "yn": "^4.0.0"
53
55
  },
54
56
  "devDependencies": {
55
- "@backstage/backend-test-utils": "^0.4.3",
56
- "@backstage/cli": "^0.26.6",
57
+ "@backstage/backend-test-utils": "^0.4.4",
58
+ "@backstage/cli": "^0.26.11",
57
59
  "@types/node": "^20.9.2",
58
60
  "@types/node-fetch": "2.6.11",
59
61
  "@types/supertest": "^2.0.12",