@kartverket/backstage-plugin-risk-scorecard 5.2.3 → 6.0.0

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.
@@ -32,7 +32,7 @@ function AlertBar({ updateStatus, response, statusText }) {
32
32
  {
33
33
  severity,
34
34
  className: `${styles.alertBar} ${severityClass}`,
35
- children: /* @__PURE__ */ jsx(Text, { variant: "body-large", children: statusText })
35
+ children: /* @__PURE__ */ jsx(Text, { variant: "body-large", style: { whiteSpace: "pre-line" }, children: statusText })
36
36
  }
37
37
  );
38
38
  }
@@ -1 +1 @@
1
- {"version":3,"file":"AlertBar.esm.js","sources":["../../../../src/components/common/AlertBar/AlertBar.tsx"],"sourcesContent":["import Alert from '@mui/material/Alert';\nimport styles from '../alertBar.module.css';\nimport { UpdateStatus } from '../../../contexts/RiScContext';\nimport { SubmitResponseObject } from '../../../utils/types';\nimport { AlertTitle, CircularProgress } from '@mui/material';\nimport { getAlertSeverity } from '../../../utils/utilityfunctions';\nimport { Text } from '@backstage/ui';\nimport { useTranslationRef } from '@backstage/core-plugin-api/alpha';\nimport { pluginRiScTranslationRef } from '../../../utils/translations.ts';\n\ntype Props = {\n updateStatus: UpdateStatus;\n response: SubmitResponseObject | null;\n statusText?: string;\n};\n\nfunction AlertBar({ updateStatus, response, statusText }: Props) {\n const severity = getAlertSeverity(updateStatus, response ?? undefined);\n const severityClass = (styles as any)[severity] || '';\n const { t } = useTranslationRef(pluginRiScTranslationRef);\n\n if (!updateStatus) return null; // Prevents error if prop is missing\n\n if (updateStatus.isLoading) {\n return (\n <Alert\n severity=\"info\"\n className={`${styles.alertBar} ${styles.info}`}\n icon={<CircularProgress size={16} sx={{ color: 'inherit' }} />}\n >\n <AlertTitle>{t('infoMessages.UpdateAction')}</AlertTitle>\n <Text variant=\"body-large\">{t('infoMessages.UpdateInfoMessage')}</Text>\n </Alert>\n );\n }\n if (response) {\n return (\n <Alert\n severity={severity}\n className={`${styles.alertBar} ${severityClass}`}\n >\n <Text variant=\"body-large\">{statusText}</Text>\n </Alert>\n );\n }\n return null;\n}\n\nexport default AlertBar;\n"],"names":[],"mappings":";;;;;;;;;AAgBA,SAAS,QAAA,CAAS,EAAE,YAAA,EAAc,QAAA,EAAU,YAAW,EAAU;AAC/D,EAAA,MAAM,QAAA,GAAW,gBAAA,CAAiB,YAAA,EAAc,QAAA,IAAY,MAAS,CAAA;AACrE,EAAA,MAAM,aAAA,GAAiB,MAAA,CAAe,QAAQ,CAAA,IAAK,EAAA;AACnD,EAAA,MAAM,EAAE,CAAA,EAAE,GAAI,iBAAA,CAAkB,wBAAwB,CAAA;AAExD,EAAA,IAAI,CAAC,cAAc,OAAO,IAAA;AAE1B,EAAA,IAAI,aAAa,SAAA,EAAW;AAC1B,IAAA,uBACE,IAAA;AAAA,MAAC,KAAA;AAAA,MAAA;AAAA,QACC,QAAA,EAAS,MAAA;AAAA,QACT,WAAW,CAAA,EAAG,MAAA,CAAO,QAAQ,CAAA,CAAA,EAAI,OAAO,IAAI,CAAA,CAAA;AAAA,QAC5C,IAAA,sBAAO,gBAAA,EAAA,EAAiB,IAAA,EAAM,IAAI,EAAA,EAAI,EAAE,KAAA,EAAO,SAAA,EAAU,EAAG,CAAA;AAAA,QAE5D,QAAA,EAAA;AAAA,0BAAA,GAAA,CAAC,UAAA,EAAA,EAAY,QAAA,EAAA,CAAA,CAAE,2BAA2B,CAAA,EAAE,CAAA;AAAA,8BAC3C,IAAA,EAAA,EAAK,OAAA,EAAQ,YAAA,EAAc,QAAA,EAAA,CAAA,CAAE,gCAAgC,CAAA,EAAE;AAAA;AAAA;AAAA,KAClE;AAAA,EAEJ;AACA,EAAA,IAAI,QAAA,EAAU;AACZ,IAAA,uBACE,GAAA;AAAA,MAAC,KAAA;AAAA,MAAA;AAAA,QACC,QAAA;AAAA,QACA,SAAA,EAAW,CAAA,EAAG,MAAA,CAAO,QAAQ,IAAI,aAAa,CAAA,CAAA;AAAA,QAE9C,QAAA,kBAAA,GAAA,CAAC,IAAA,EAAA,EAAK,OAAA,EAAQ,YAAA,EAAc,QAAA,EAAA,UAAA,EAAW;AAAA;AAAA,KACzC;AAAA,EAEJ;AACA,EAAA,OAAO,IAAA;AACT;;;;"}
1
+ {"version":3,"file":"AlertBar.esm.js","sources":["../../../../src/components/common/AlertBar/AlertBar.tsx"],"sourcesContent":["import Alert from '@mui/material/Alert';\nimport styles from '../alertBar.module.css';\nimport { UpdateStatus } from '../../../contexts/RiScContext';\nimport { SubmitResponseObject } from '../../../utils/types';\nimport { AlertTitle, CircularProgress } from '@mui/material';\nimport { getAlertSeverity } from '../../../utils/utilityfunctions';\nimport { Text } from '@backstage/ui';\nimport { useTranslationRef } from '@backstage/core-plugin-api/alpha';\nimport { pluginRiScTranslationRef } from '../../../utils/translations.ts';\n\ntype Props = {\n updateStatus: UpdateStatus;\n response: SubmitResponseObject | null;\n statusText?: string;\n};\n\nfunction AlertBar({ updateStatus, response, statusText }: Props) {\n const severity = getAlertSeverity(updateStatus, response ?? undefined);\n const severityClass = (styles as any)[severity] || '';\n const { t } = useTranslationRef(pluginRiScTranslationRef);\n\n if (!updateStatus) return null; // Prevents error if prop is missing\n\n if (updateStatus.isLoading) {\n return (\n <Alert\n severity=\"info\"\n className={`${styles.alertBar} ${styles.info}`}\n icon={<CircularProgress size={16} sx={{ color: 'inherit' }} />}\n >\n <AlertTitle>{t('infoMessages.UpdateAction')}</AlertTitle>\n <Text variant=\"body-large\">{t('infoMessages.UpdateInfoMessage')}</Text>\n </Alert>\n );\n }\n if (response) {\n return (\n <Alert\n severity={severity}\n className={`${styles.alertBar} ${severityClass}`}\n >\n <Text variant=\"body-large\" style={{ whiteSpace: 'pre-line' }}>\n {statusText}\n </Text>\n </Alert>\n );\n }\n return null;\n}\n\nexport default AlertBar;\n"],"names":[],"mappings":";;;;;;;;;AAgBA,SAAS,QAAA,CAAS,EAAE,YAAA,EAAc,QAAA,EAAU,YAAW,EAAU;AAC/D,EAAA,MAAM,QAAA,GAAW,gBAAA,CAAiB,YAAA,EAAc,QAAA,IAAY,MAAS,CAAA;AACrE,EAAA,MAAM,aAAA,GAAiB,MAAA,CAAe,QAAQ,CAAA,IAAK,EAAA;AACnD,EAAA,MAAM,EAAE,CAAA,EAAE,GAAI,iBAAA,CAAkB,wBAAwB,CAAA;AAExD,EAAA,IAAI,CAAC,cAAc,OAAO,IAAA;AAE1B,EAAA,IAAI,aAAa,SAAA,EAAW;AAC1B,IAAA,uBACE,IAAA;AAAA,MAAC,KAAA;AAAA,MAAA;AAAA,QACC,QAAA,EAAS,MAAA;AAAA,QACT,WAAW,CAAA,EAAG,MAAA,CAAO,QAAQ,CAAA,CAAA,EAAI,OAAO,IAAI,CAAA,CAAA;AAAA,QAC5C,IAAA,sBAAO,gBAAA,EAAA,EAAiB,IAAA,EAAM,IAAI,EAAA,EAAI,EAAE,KAAA,EAAO,SAAA,EAAU,EAAG,CAAA;AAAA,QAE5D,QAAA,EAAA;AAAA,0BAAA,GAAA,CAAC,UAAA,EAAA,EAAY,QAAA,EAAA,CAAA,CAAE,2BAA2B,CAAA,EAAE,CAAA;AAAA,8BAC3C,IAAA,EAAA,EAAK,OAAA,EAAQ,YAAA,EAAc,QAAA,EAAA,CAAA,CAAE,gCAAgC,CAAA,EAAE;AAAA;AAAA;AAAA,KAClE;AAAA,EAEJ;AACA,EAAA,IAAI,QAAA,EAAU;AACZ,IAAA,uBACE,GAAA;AAAA,MAAC,KAAA;AAAA,MAAA;AAAA,QACC,QAAA;AAAA,QACA,SAAA,EAAW,CAAA,EAAG,MAAA,CAAO,QAAQ,IAAI,aAAa,CAAA,CAAA;AAAA,QAE9C,QAAA,kBAAA,GAAA,CAAC,QAAK,OAAA,EAAQ,YAAA,EAAa,OAAO,EAAE,UAAA,EAAY,UAAA,EAAW,EACxD,QAAA,EAAA,UAAA,EACH;AAAA;AAAA,KACF;AAAA,EAEJ;AACA,EAAA,OAAO,IAAA;AACT;;;;"}
@@ -1,7 +1,7 @@
1
1
  import styleInject from '../../node_modules_dist/style-inject/dist/style-inject.es.esm.js';
2
2
 
3
- var css_248z = ".alertBar_alertBarBox__181b52d9eb {\n position: sticky;\n top: 8px;\n z-index: 100;\n display: block;\n}\n\n.alertBar_alertBar__181b52d9eb {\n width: 100%;\n}\n\n/* severity variants */\n.alertBar_success__181b52d9eb {\n background-color: #e9f8eb;\n border: 1px solid #66b077;\n}\n\n.alertBar_warning__181b52d9eb {\n background-color: #fff7ed;\n border: 1px solid #cf914a;\n}\n\n.alertBar_error__181b52d9eb {\n background-color: #fcf1e8;\n border: 1px solid #a32f00;\n}\n\n.alertBar_info__181b52d9eb {\n background-color: #eaf6ff;\n border: 1px solid #439ccd;\n}\n";
4
- var styles = {"alertBarBox":"alertBar_alertBarBox__181b52d9eb","alertBar":"alertBar_alertBar__181b52d9eb","success":"alertBar_success__181b52d9eb","warning":"alertBar_warning__181b52d9eb","error":"alertBar_error__181b52d9eb","info":"alertBar_info__181b52d9eb"};
3
+ var css_248z = ".alertBar_alertBarBox__832f499abf {\n position: sticky;\n top: 8px;\n z-index: 100;\n display: block;\n}\n\n.alertBar_alertBar__832f499abf {\n width: 100%;\n margin-bottom: 8px;\n}\n\n/* severity variants */\n.alertBar_success__832f499abf {\n background-color: #e9f8eb;\n border: 1px solid #66b077;\n}\n\n.alertBar_warning__832f499abf {\n background-color: #fff7ed;\n border: 1px solid #cf914a;\n}\n\n.alertBar_error__832f499abf {\n background-color: #fcf1e8;\n border: 1px solid #a32f00;\n}\n\n.alertBar_info__832f499abf {\n background-color: #eaf6ff;\n border: 1px solid #439ccd;\n}\n";
4
+ var styles = {"alertBarBox":"alertBar_alertBarBox__832f499abf","alertBar":"alertBar_alertBar__832f499abf","success":"alertBar_success__832f499abf","warning":"alertBar_warning__832f499abf","error":"alertBar_error__832f499abf","info":"alertBar_info__832f499abf"};
5
5
  styleInject(css_248z);
6
6
 
7
7
  export { styles as default };
@@ -6,6 +6,7 @@ import { getTranslationKey, requiresNewApproval } from '../utils/utilityfunction
6
6
  import { riScRouteRef } from '../routes.esm.js';
7
7
  import { useParams, useLocation, useNavigate } from 'react-router';
8
8
  import { dtoToRiSc } from '../utils/DTOs.esm.js';
9
+ import { withLoginRejected, mapRiScDtoToRiScWithMetadata, buildFetchRiScErrorMessages } from '../utils/fetchRiScHelpers.esm.js';
9
10
  import { useGithubRepositoryInformation, useAuthenticatedFetch } from '../utils/hooks.esm.js';
10
11
  import '../utils/constants.esm.js';
11
12
  import { useTranslationRef } from '@backstage/core-plugin-api/alpha';
@@ -113,9 +114,11 @@ function RiScProvider({ children }) {
113
114
  type: "SET_RESPONSE",
114
115
  response: {
115
116
  status: ProcessingStatus.ErrorWhenFetchingGcpCryptoKeys,
116
- statusMessage: loginRejected ? `${t("errorMessages.ErrorWhenFetchingGcpCryptoKeys")}. ${t(
117
- "dictionary.rejectedLogin"
118
- )}` : t("errorMessages.ErrorWhenFetchingGcpCryptoKeys")
117
+ statusMessage: withLoginRejected(
118
+ t("errorMessages.ErrorWhenFetchingGcpCryptoKeys"),
119
+ loginRejected,
120
+ t
121
+ )
119
122
  }
120
123
  });
121
124
  isFetchingGcpCryptoKeysRef.current = false;
@@ -134,25 +137,10 @@ function RiScProvider({ children }) {
134
137
  const successfulRiScs = res.filter(
135
138
  (risk) => risk.status === ContentStatus.Success
136
139
  );
137
- const failedRiScs = res.filter(
138
- (risk) => risk.status !== ContentStatus.Success
139
- );
140
140
  const allFailed = res.length > 0 && successfulRiScs.length === 0;
141
141
  setAllRiScsFailedDecryption(allFailed);
142
142
  const fetchedRiScs = successfulRiScs.map(
143
- (riScDTO) => {
144
- const json = JSON.parse(riScDTO.riScContent);
145
- const content = dtoToRiSc(json);
146
- return {
147
- id: riScDTO.riScId,
148
- content,
149
- sopsConfig: riScDTO.sopsConfig,
150
- status: riScDTO.riScStatus,
151
- pullRequestUrl: riScDTO.pullRequestUrl,
152
- migrationStatus: riScDTO.migrationStatus,
153
- lastPublished: riScDTO.lastPublished
154
- };
155
- }
143
+ mapRiScDtoToRiScWithMetadata
156
144
  );
157
145
  setRiScs(fetchedRiScs);
158
146
  isFetchingRiScsRef.current = false;
@@ -161,15 +149,14 @@ function RiScProvider({ children }) {
161
149
  isFetchingRef.current = false;
162
150
  setIsFetching(isFetchingRef.current);
163
151
  }
164
- const errorRiScs = failedRiScs.map((risk) => risk.riScId);
152
+ const errorRiScs = res.filter(
153
+ (risk) => risk.status !== ContentStatus.Success
154
+ );
165
155
  if (errorRiScs.length > 0) {
166
- const errorRiScIds = errorRiScs.join(", ");
167
156
  dispatch({
168
157
  type: "SET_RESPONSE",
169
158
  response: {
170
- statusMessage: t("errorMessages.ErrorWhenFetchingRiScs").concat(
171
- errorRiScIds
172
- ),
159
+ statusMessage: buildFetchRiScErrorMessages(errorRiScs, t),
173
160
  status: ProcessingStatus.ErrorWhenFetchingRiScs
174
161
  }
175
162
  });
@@ -195,9 +182,11 @@ function RiScProvider({ children }) {
195
182
  type: "SET_RESPONSE",
196
183
  response: {
197
184
  status: ProcessingStatus.ErrorWhenFetchingRiScs,
198
- statusMessage: loginRejected ? `${t("errorMessages.ErrorWhenFetchingRiScs")}. ${t(
199
- "dictionary.rejectedLogin"
200
- )}` : t("errorMessages.ErrorWhenFetchingRiScs")
185
+ statusMessage: withLoginRejected(
186
+ t("errorMessages.ErrorWhenFetchingRiScs"),
187
+ loginRejected,
188
+ t
189
+ )
201
190
  }
202
191
  });
203
192
  }
@@ -288,9 +277,11 @@ function RiScProvider({ children }) {
288
277
  updateStatus: { isLoading: false, isError: true, isSuccess: false },
289
278
  response: {
290
279
  ...error,
291
- statusMessage: loginRejected ? `${getTranslationKey("error", error.status, t, translationContext)}. ${t(
292
- "dictionary.rejectedLogin"
293
- )}` : getTranslationKey("error", error.status, t, translationContext)
280
+ statusMessage: withLoginRejected(
281
+ getTranslationKey("error", error.status, t, translationContext),
282
+ loginRejected,
283
+ t
284
+ )
294
285
  }
295
286
  });
296
287
  }
@@ -343,13 +334,10 @@ function RiScProvider({ children }) {
343
334
  updateStatus: { isLoading: false, isError: true, isSuccess: false },
344
335
  response: {
345
336
  ...error,
346
- statusMessage: loginRejected ? `${getTranslationKey("error", error.status, t, translationContext)}. ${t(
347
- "dictionary.rejectedLogin"
348
- )}` : getTranslationKey(
349
- "error",
350
- error.status,
351
- t,
352
- translationContext
337
+ statusMessage: withLoginRejected(
338
+ getTranslationKey("error", error.status, t, translationContext),
339
+ loginRejected,
340
+ t
353
341
  )
354
342
  }
355
343
  });
@@ -410,13 +398,10 @@ function RiScProvider({ children }) {
410
398
  updateStatus: { isLoading: false, isError: true, isSuccess: false },
411
399
  response: {
412
400
  ...error,
413
- statusMessage: loginRejected ? `${getTranslationKey("error", error.status, t, translationContext)}. ${t(
414
- "dictionary.rejectedLogin"
415
- )}` : getTranslationKey(
416
- "error",
417
- error.status,
418
- t,
419
- translationContext
401
+ statusMessage: withLoginRejected(
402
+ getTranslationKey("error", error.status, t, translationContext),
403
+ loginRejected,
404
+ t
420
405
  )
421
406
  }
422
407
  });
@@ -430,30 +415,22 @@ function RiScProvider({ children }) {
430
415
  const refetchRiScs = useCallback(() => {
431
416
  fetchRiScs(
432
417
  (res) => {
433
- const fetchedRiScs = res.filter((risk) => risk.status === ContentStatus.Success).map((riScDTO) => {
434
- const json = JSON.parse(riScDTO.riScContent);
435
- const content = dtoToRiSc(json);
436
- return {
437
- id: riScDTO.riScId,
438
- content,
439
- sopsConfig: riScDTO.sopsConfig,
440
- status: riScDTO.riScStatus,
441
- pullRequestUrl: riScDTO.pullRequestUrl,
442
- migrationStatus: riScDTO.migrationStatus,
443
- lastPublished: riScDTO.lastPublished
444
- };
445
- });
418
+ const fetchedRiScs = res.filter((risk) => risk.status === ContentStatus.Success).map(mapRiScDtoToRiScWithMetadata);
446
419
  setRiScs(fetchedRiScs);
447
420
  setSelectedRiSc(
448
421
  (prev) => prev ? fetchedRiScs.find((r) => r.id === prev.id) ?? prev : prev
449
422
  );
450
423
  },
451
- (loginRejected) => {
424
+ (_, loginRejected) => {
452
425
  dispatch({
453
426
  type: "SET_RESPONSE",
454
427
  response: {
455
428
  status: ProcessingStatus.ErrorWhenFetchingRiScs,
456
- statusMessage: loginRejected ? `${t("errorMessages.ErrorWhenFetchingRiScs")}. ${t("dictionary.rejectedLogin")}` : t("errorMessages.ErrorWhenFetchingRiScs")
429
+ statusMessage: withLoginRejected(
430
+ t("errorMessages.ErrorWhenFetchingRiScs"),
431
+ loginRejected,
432
+ t
433
+ )
457
434
  }
458
435
  });
459
436
  }
@@ -494,11 +471,10 @@ function RiScProvider({ children }) {
494
471
  updateStatus: { isLoading: false, isError: true, isSuccess: false },
495
472
  response: {
496
473
  ...error,
497
- statusMessage: loginRejected ? `${getTranslationKey("error", error.status, t, translationContext)}. ${t("dictionary.rejectedLogin")}` : getTranslationKey(
498
- "error",
499
- error.status,
500
- t,
501
- translationContext
474
+ statusMessage: withLoginRejected(
475
+ getTranslationKey("error", error.status, t, translationContext),
476
+ loginRejected,
477
+ t
502
478
  )
503
479
  }
504
480
  });
@@ -1 +1 @@
1
- {"version":3,"file":"RiScContext.esm.js","sources":["../../src/contexts/RiScContext.tsx"],"sourcesContent":["import {\n createContext,\n ReactNode,\n useCallback,\n useContext,\n useEffect,\n useRef,\n useState,\n useReducer,\n} from 'react';\nimport {\n ContentStatus,\n ProcessingStatus,\n RiScStatus,\n RiScWithMetadata,\n SubmitResponseObject,\n} from '../utils/types';\nimport { useRouteRef } from '@backstage/core-plugin-api';\nimport {\n getTranslationKey,\n requiresNewApproval,\n} from '../utils/utilityfunctions';\nimport { riScRouteRef } from '../routes';\nimport { useLocation, useNavigate, useParams } from 'react-router';\nimport {\n dtoToRiSc,\n GcpCryptoKeyObject,\n ProcessRiScResultDTO,\n RiScDTO,\n} from '../utils/DTOs';\nimport {\n useAuthenticatedFetch,\n useGithubRepositoryInformation,\n} from '../utils/hooks';\nimport { latestSupportedVersion } from '../utils/constants';\nimport { useTranslationRef } from '@backstage/core-plugin-api/alpha';\nimport { pluginRiScTranslationRef } from '../utils/translations';\n\nexport type UpdateStatus = {\n isLoading: boolean;\n isError: boolean;\n isSuccess: boolean;\n};\n\ntype RiScDrawerProps = {\n riScs: RiScWithMetadata[] | null;\n selectRiSc: (title: string) => void;\n selectedRiSc: RiScWithMetadata | null;\n createNewRiSc: (\n riSc: RiScWithMetadata,\n generateInitialRisc: boolean,\n defaultRiScId: string | undefined,\n ) => void;\n deleteRiSc: (onSuccess?: () => void, onError?: () => void) => void;\n updateRiSc: (\n riSc: RiScWithMetadata,\n onSuccess?: () => void,\n onError?: () => void,\n ) => void;\n approveRiSc: () => void;\n updateStatus: UpdateStatus;\n resetRiScStatus: () => void;\n resetResponse: () => void;\n isFetching: boolean;\n isFetchingGcpCryptoKeys: boolean;\n failedToFetchGcpCryptoKeys: boolean;\n allRiScsFailedDecryption: boolean;\n gcpCryptoKeys: GcpCryptoKeyObject[];\n response: SubmitResponseObject | null;\n};\n\nconst RiScContext = createContext<RiScDrawerProps | undefined>(undefined);\n\nexport function RiScProvider({ children }: { children: ReactNode }) {\n const { riScId: riScIdFromParams } = useParams();\n const location = useLocation();\n const navigate = useNavigate();\n const getRiScPath = useRouteRef(riScRouteRef);\n const [isRequesting, setIsRequesting] = useState<boolean>(false);\n const { t } = useTranslationRef(pluginRiScTranslationRef);\n const repoInfo = useGithubRepositoryInformation();\n\n const {\n fetchRiScs,\n fetchGcpCryptoKeys,\n postRiScs,\n deleteRiScs,\n putRiScs,\n publishRiScs,\n } = useAuthenticatedFetch();\n\n const [riScs, setRiScs] = useState<RiScWithMetadata[] | null>(null);\n const [selectedRiSc, setSelectedRiSc] = useState<RiScWithMetadata | null>(\n null,\n );\n const [isFetching, setIsFetching] = useState(true);\n const isFetchingRef = useRef(isFetching);\n const [isFetchingRiScs, setIsFetchingRiScs] = useState(true);\n const isFetchingRiScsRef = useRef(isFetchingRiScs);\n const [isFetchingGcpCryptoKeys, setIsFetchingGcpCryptoKeys] = useState(true);\n const isFetchingGcpCryptoKeysRef = useRef(isFetchingGcpCryptoKeys);\n const gcpCryptoKeysFailed = useRef(false);\n const [failedToFetchGcpCryptoKeys, setFailedToFetchGcpCryptoKeys] =\n useState(false);\n\n type LocalState = {\n updateStatus: UpdateStatus;\n response: SubmitResponseObject | null;\n };\n\n type Action =\n | { type: 'SET_STATUS'; updateStatus: UpdateStatus }\n | { type: 'SET_RESPONSE'; response: SubmitResponseObject | null }\n | {\n type: 'SET_BOTH';\n updateStatus: UpdateStatus;\n response: SubmitResponseObject | null;\n };\n\n const initialLocalState: LocalState = {\n updateStatus: { isLoading: false, isError: false, isSuccess: false },\n response: null,\n };\n\n function reducer(state: LocalState, action: Action): LocalState {\n switch (action.type) {\n case 'SET_STATUS':\n return { ...state, updateStatus: action.updateStatus };\n case 'SET_RESPONSE':\n return { ...state, response: action.response };\n case 'SET_BOTH':\n return { updateStatus: action.updateStatus, response: action.response };\n default:\n return state;\n }\n }\n\n const [localState, dispatch] = useReducer(reducer, initialLocalState);\n\n const [gcpCryptoKeys, setGcpCryptoKeys] = useState<GcpCryptoKeyObject[]>([]);\n const [allRiScsFailedDecryption, setAllRiScsFailedDecryption] =\n useState(false);\n\n // Auto-clear response after a short duration to avoid the Alert sticking around\n const responseTimerRef = useRef<number | null>(null);\n useEffect(() => {\n if (localState.response) {\n if (responseTimerRef.current) {\n window.clearTimeout(responseTimerRef.current);\n }\n responseTimerRef.current = window.setTimeout(() => {\n dispatch({ type: 'SET_RESPONSE', response: null });\n responseTimerRef.current = null;\n }, 10000);\n }\n\n return () => {\n if (responseTimerRef.current) {\n window.clearTimeout(responseTimerRef.current);\n responseTimerRef.current = null;\n }\n };\n }, [localState.response]);\n\n useEffect(() => {\n if (location.state) {\n dispatch({\n type: 'SET_RESPONSE',\n response: {\n statusMessage: location.state,\n status: ProcessingStatus.ErrorWhenFetchingRiScs,\n },\n });\n }\n }, [location, dispatch]);\n\n // Initial fetch of GCP crypto keys\n useEffect(() => {\n gcpCryptoKeysFailed.current = false;\n setFailedToFetchGcpCryptoKeys(false);\n dispatch({ type: 'SET_RESPONSE', response: null });\n fetchGcpCryptoKeys(\n res => {\n // Sorts the crypto keys by the number of permissions (descending)\n setGcpCryptoKeys(\n res.sort(\n (a, b) =>\n (b.userPermissions?.length ?? 0) -\n (a.userPermissions?.length ?? 0),\n ),\n );\n isFetchingGcpCryptoKeysRef.current = false;\n setIsFetchingGcpCryptoKeys(isFetchingGcpCryptoKeysRef.current);\n if (!isFetchingRiScsRef.current) {\n isFetchingRef.current = false;\n setIsFetching(isFetchingRef.current);\n }\n },\n (_error, loginRejected) => {\n gcpCryptoKeysFailed.current = true;\n setFailedToFetchGcpCryptoKeys(true);\n dispatch({\n type: 'SET_RESPONSE',\n response: {\n status: ProcessingStatus.ErrorWhenFetchingGcpCryptoKeys,\n statusMessage: loginRejected\n ? `${t('errorMessages.ErrorWhenFetchingGcpCryptoKeys')}. ${t(\n 'dictionary.rejectedLogin',\n )}`\n : t('errorMessages.ErrorWhenFetchingGcpCryptoKeys'),\n },\n });\n isFetchingGcpCryptoKeysRef.current = false;\n setIsFetchingGcpCryptoKeys(isFetchingGcpCryptoKeysRef.current);\n if (!isFetchingRiScsRef.current) {\n isFetchingRef.current = false;\n setIsFetching(isFetchingRef.current);\n }\n },\n );\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, []);\n\n // Initial fetch of RiScs\n useEffect(() => {\n dispatch({ type: 'SET_RESPONSE', response: null });\n fetchRiScs(\n res => {\n const successfulRiScs = res.filter(\n risk => risk.status === ContentStatus.Success,\n );\n const failedRiScs = res.filter(\n risk => risk.status !== ContentStatus.Success,\n );\n\n // Check if all RiScs failed decryption (there are RiScs but all failed)\n const allFailed = res.length > 0 && successfulRiScs.length === 0;\n setAllRiScsFailedDecryption(allFailed);\n\n const fetchedRiScs: RiScWithMetadata[] = successfulRiScs.map(\n riScDTO => {\n const json = JSON.parse(riScDTO.riScContent) as RiScDTO;\n\n const content = dtoToRiSc(json);\n return {\n id: riScDTO.riScId,\n content: content,\n sopsConfig: riScDTO.sopsConfig,\n status: riScDTO.riScStatus,\n pullRequestUrl: riScDTO.pullRequestUrl,\n migrationStatus: riScDTO.migrationStatus,\n lastPublished: riScDTO.lastPublished,\n };\n },\n );\n setRiScs(fetchedRiScs);\n isFetchingRiScsRef.current = false;\n setIsFetchingRiScs(isFetchingRiScsRef.current);\n if (!isFetchingGcpCryptoKeysRef.current) {\n isFetchingRef.current = false;\n setIsFetching(isFetchingRef.current);\n }\n\n const errorRiScs: string[] = failedRiScs.map(risk => risk.riScId);\n\n if (errorRiScs.length > 0) {\n const errorRiScIds = errorRiScs.join(', ');\n dispatch({\n type: 'SET_RESPONSE',\n response: {\n statusMessage: t('errorMessages.ErrorWhenFetchingRiScs').concat(\n errorRiScIds,\n ),\n status: ProcessingStatus.ErrorWhenFetchingRiScs,\n },\n });\n }\n\n // If there are no RiScs, don't set a selected RiSc\n if (fetchedRiScs.length === 0) {\n return;\n }\n\n // If there is no RiSc ID in the URL, navigate to the first RiSc\n if (!riScIdFromParams) {\n navigate(getRiScPath({ riScId: fetchedRiScs[0].id }));\n return;\n }\n\n const riSc = fetchedRiScs.find(r => r.id === riScIdFromParams);\n\n // If there is an invalid RiSc ID in the URL, navigate to the first RiSc with error state\n if (!riSc) {\n navigate(getRiScPath({ riScId: fetchedRiScs[0].id }), {\n state: t('errorMessages.RiScDoesNotExist'),\n });\n return;\n }\n },\n loginRejected => {\n if (!gcpCryptoKeysFailed.current) {\n dispatch({\n type: 'SET_RESPONSE',\n response: {\n status: ProcessingStatus.ErrorWhenFetchingRiScs,\n statusMessage: loginRejected\n ? `${t('errorMessages.ErrorWhenFetchingRiScs')}. ${t(\n 'dictionary.rejectedLogin',\n )}`\n : t('errorMessages.ErrorWhenFetchingRiScs'),\n },\n });\n }\n isFetchingRiScsRef.current = false;\n setIsFetchingRiScs(isFetchingRiScsRef.current);\n if (!isFetchingGcpCryptoKeysRef.current) {\n isFetchingRef.current = false;\n setIsFetching(isFetchingRef.current);\n }\n },\n );\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, []);\n\n // Set selected RiSc based on URL\n useEffect(() => {\n if (riScIdFromParams) {\n const riSc = riScs?.find(r => r.id === riScIdFromParams);\n if (riSc) {\n setSelectedRiSc(riSc);\n }\n }\n }, [riScs, riScIdFromParams]);\n\n const resetRiScStatus = useCallback(() => {\n dispatch({\n type: 'SET_STATUS',\n updateStatus: { isLoading: false, isSuccess: false, isError: false },\n });\n }, [dispatch]);\n\n // use callback to avoid infinite loop\n const resetResponse = useCallback(() => {\n dispatch({ type: 'SET_RESPONSE', response: null });\n }, [dispatch]);\n\n const getTranslationContext = useCallback(\n (status: ProcessingStatus) => {\n return status === ProcessingStatus.ErrorWhenNoWriteAccessToRepository\n ? { owner: repoInfo.owner, name: repoInfo.name }\n : undefined;\n },\n [repoInfo.owner, repoInfo.name],\n );\n\n function selectRiSc(id: string) {\n const selectedRiScId = riScs?.find(riSc => riSc.id === id)?.id;\n if (selectedRiScId) {\n navigate(getRiScPath({ riScId: selectedRiScId }));\n }\n }\n\n function createNewRiSc(\n riSc: RiScWithMetadata,\n generateInitialRisc: boolean,\n defaultRiScId: string | undefined,\n ) {\n setIsFetching(true);\n setSelectedRiSc(null);\n dispatch({\n type: 'SET_BOTH',\n updateStatus: { isLoading: true, isError: false, isSuccess: false },\n response: null,\n });\n const newRiSc: RiScWithMetadata = {\n ...riSc,\n schemaVersion: latestSupportedVersion,\n };\n postRiScs(\n newRiSc.content,\n generateInitialRisc,\n newRiSc.sopsConfig,\n defaultRiScId,\n res => {\n if (!res.riScId) throw new Error('No RiSc ID returned');\n if (!res.riScContent) throw new Error('No RiSc content returned');\n const json = JSON.parse(res.riScContent) as RiScDTO;\n const content = dtoToRiSc(json);\n const riScWithMetaData: RiScWithMetadata = {\n id: res.riScId,\n status: RiScStatus.Draft,\n content: content,\n sopsConfig: riSc.sopsConfig,\n schemaVersion: riSc.schemaVersion,\n lastPublished: riSc.lastPublished,\n };\n setRiScs(riScs ? [...riScs, riScWithMetaData] : [riScWithMetaData]);\n setIsFetching(false);\n navigate(getRiScPath({ riScId: res.riScId }));\n dispatch({\n type: 'SET_BOTH',\n updateStatus: { isLoading: false, isError: false, isSuccess: true },\n response: {\n ...res,\n statusMessage: getTranslationKey('info', res.status, t),\n },\n });\n },\n (error: ProcessRiScResultDTO, loginRejected: boolean) => {\n setSelectedRiSc(selectedRiSc);\n setIsFetching(false);\n\n const translationContext = getTranslationContext(error.status);\n\n dispatch({\n type: 'SET_BOTH',\n updateStatus: { isLoading: false, isError: true, isSuccess: false },\n response: {\n ...error,\n statusMessage: loginRejected\n ? `${getTranslationKey('error', error.status, t, translationContext)}. ${t(\n 'dictionary.rejectedLogin',\n )}`\n : getTranslationKey('error', error.status, t, translationContext),\n },\n });\n },\n );\n }\n\n function deleteRiSc(onSuccess?: () => void, onError?: () => void) {\n if (selectedRiSc && riScs) {\n const updatedRiSc = {\n ...selectedRiSc,\n status: RiScStatus.DeletionDraft,\n };\n const originalRiSc = selectedRiSc;\n\n dispatch({\n type: 'SET_BOTH',\n updateStatus: { isLoading: true, isError: false, isSuccess: false },\n response: null,\n });\n deleteRiScs(\n selectedRiSc.id,\n res => {\n dispatch({\n type: 'SET_BOTH',\n updateStatus: { isLoading: false, isError: false, isSuccess: true },\n response: {\n ...res,\n statusMessage: getTranslationKey('info', res.status, t),\n },\n });\n setIsRequesting(false);\n if (res.status === ProcessingStatus.DeletedRiSc) {\n setSelectedRiSc(\n riScs.find(riSc => riSc.id !== selectedRiSc.id) || null,\n );\n setRiScs(riScs.filter(riSc => riSc.id !== updatedRiSc.id));\n } else {\n setSelectedRiSc(updatedRiSc);\n setRiScs(\n riScs.map(riSc =>\n riSc.id === selectedRiSc.id ? updatedRiSc : riSc,\n ),\n );\n }\n if (onSuccess) onSuccess();\n },\n (error, loginRejected) => {\n setSelectedRiSc(originalRiSc);\n\n const translationContext = getTranslationContext(error.status);\n\n dispatch({\n type: 'SET_BOTH',\n updateStatus: { isLoading: false, isError: true, isSuccess: false },\n response: {\n ...error,\n statusMessage: loginRejected\n ? `${getTranslationKey('error', error.status, t, translationContext)}. ${t(\n 'dictionary.rejectedLogin',\n )}`\n : getTranslationKey(\n 'error',\n error.status,\n t,\n translationContext,\n ),\n },\n });\n setIsRequesting(false);\n if (onError) onError();\n },\n );\n }\n }\n\n function updateRiSc(\n riSc: RiScWithMetadata,\n onSuccess?: () => void,\n onError?: () => void,\n ) {\n if (selectedRiSc && riScs) {\n const isRequiresNewApproval =\n selectedRiSc.migrationStatus?.migrationRequiresNewApproval ||\n requiresNewApproval(selectedRiSc.content, riSc.content);\n\n const updatedRiSc: RiScWithMetadata = {\n ...selectedRiSc,\n sopsConfig: riSc.sopsConfig,\n content: riSc.content,\n status:\n selectedRiSc.status !== RiScStatus.Draft && isRequiresNewApproval\n ? RiScStatus.Draft\n : selectedRiSc.status,\n isRequiresNewApproval: isRequiresNewApproval,\n schemaVersion: riSc.schemaVersion,\n migrationStatus: {\n migrationChanges: false,\n migrationRequiresNewApproval: false,\n },\n };\n const originalRiSc = selectedRiSc;\n setSelectedRiSc(updatedRiSc);\n dispatch({\n type: 'SET_BOTH',\n updateStatus: { isLoading: true, isError: false, isSuccess: false },\n response: null,\n });\n putRiScs(\n updatedRiSc,\n res => {\n dispatch({\n type: 'SET_BOTH',\n updateStatus: { isLoading: false, isError: false, isSuccess: true },\n response: {\n ...res,\n statusMessage: getTranslationKey('info', res.status, t),\n },\n });\n if ('pendingApproval' in res && res.pendingApproval?.pullRequestUrl) {\n updatedRiSc.pullRequestUrl = res.pendingApproval.pullRequestUrl;\n updatedRiSc.status = RiScStatus.SentForApproval;\n }\n setSelectedRiSc(updatedRiSc);\n setRiScs(\n riScs.map(r => (r.id === selectedRiSc.id ? updatedRiSc : r)),\n );\n setIsRequesting(false);\n if (onSuccess) onSuccess();\n },\n (error, loginRejected) => {\n const translationContext = getTranslationContext(error.status);\n\n dispatch({\n type: 'SET_BOTH',\n updateStatus: { isLoading: false, isError: true, isSuccess: false },\n response: {\n ...error,\n statusMessage: loginRejected\n ? `${getTranslationKey('error', error.status, t, translationContext)}. ${t(\n 'dictionary.rejectedLogin',\n )}`\n : getTranslationKey(\n 'error',\n error.status,\n t,\n translationContext,\n ),\n },\n });\n setIsRequesting(false);\n if (onError) onError();\n setSelectedRiSc(originalRiSc);\n },\n );\n }\n }\n\n const refetchRiScs = useCallback(() => {\n fetchRiScs(\n res => {\n const fetchedRiScs: RiScWithMetadata[] = res\n .filter(risk => risk.status === ContentStatus.Success)\n .map(riScDTO => {\n const json = JSON.parse(riScDTO.riScContent) as RiScDTO;\n const content = dtoToRiSc(json);\n return {\n id: riScDTO.riScId,\n content,\n sopsConfig: riScDTO.sopsConfig,\n status: riScDTO.riScStatus,\n pullRequestUrl: riScDTO.pullRequestUrl,\n migrationStatus: riScDTO.migrationStatus,\n lastPublished: riScDTO.lastPublished,\n };\n });\n\n setRiScs(fetchedRiScs);\n\n setSelectedRiSc(prev =>\n prev ? (fetchedRiScs.find(r => r.id === prev.id) ?? prev) : prev,\n );\n },\n loginRejected => {\n dispatch({\n type: 'SET_RESPONSE',\n response: {\n status: ProcessingStatus.ErrorWhenFetchingRiScs,\n statusMessage: loginRejected\n ? `${t('errorMessages.ErrorWhenFetchingRiScs')}. ${t('dictionary.rejectedLogin')}`\n : t('errorMessages.ErrorWhenFetchingRiScs'),\n },\n });\n },\n );\n }, [fetchRiScs, dispatch, t]);\n\n function approveRiSc() {\n if (selectedRiSc && riScs) {\n dispatch({\n type: 'SET_STATUS',\n updateStatus: { isLoading: true, isError: false, isSuccess: false },\n });\n publishRiScs(\n selectedRiSc.id,\n res => {\n const prUrl = res.pendingApproval?.pullRequestUrl;\n const updatedRiSc = {\n ...selectedRiSc,\n status:\n selectedRiSc.status === RiScStatus.Draft\n ? RiScStatus.SentForApproval\n : RiScStatus.DeletionSentForApproval,\n pullRequestUrl: prUrl,\n };\n setSelectedRiSc(updatedRiSc);\n setRiScs(\n riScs.map(r => (r.id === selectedRiSc.id ? updatedRiSc : r)),\n );\n dispatch({\n type: 'SET_BOTH',\n updateStatus: { isLoading: false, isError: false, isSuccess: true },\n response: {\n ...res,\n statusMessage: getTranslationKey('info', res.status, t),\n },\n });\n },\n (error, loginRejected) => {\n const translationContext = getTranslationContext(error.status);\n\n dispatch({\n type: 'SET_BOTH',\n updateStatus: { isLoading: false, isError: true, isSuccess: false },\n response: {\n ...error,\n statusMessage: loginRejected\n ? `${getTranslationKey('error', error.status, t, translationContext)}. ${t('dictionary.rejectedLogin')}`\n : getTranslationKey(\n 'error',\n error.status,\n t,\n translationContext,\n ),\n },\n });\n },\n );\n }\n }\n\n useEffect(() => {\n const s = selectedRiSc?.status;\n\n const shouldPoll =\n s === RiScStatus.SentForApproval ||\n s === RiScStatus.DeletionSentForApproval;\n\n if (!shouldPoll) {\n return undefined;\n }\n\n const id = window.setInterval(() => {\n refetchRiScs();\n }, 5000);\n\n return () => window.clearInterval(id);\n }, [selectedRiSc?.status, refetchRiScs]);\n\n const value = {\n riScs,\n selectRiSc,\n selectedRiSc,\n createNewRiSc,\n deleteRiSc,\n updateRiSc,\n approveRiSc,\n updateStatus: localState.updateStatus,\n resetRiScStatus,\n resetResponse,\n isRequesting,\n isFetching,\n response: localState.response,\n gcpCryptoKeys,\n };\n\n return (\n <RiScContext.Provider\n value={{\n ...value,\n isFetchingGcpCryptoKeys: false,\n failedToFetchGcpCryptoKeys,\n allRiScsFailedDecryption,\n }}\n >\n {children}\n </RiScContext.Provider>\n );\n}\n\nexport function useRiScs() {\n const context = useContext(RiScContext);\n if (context === undefined) {\n throw new Error('useRiScs must be used within a RiScProvider');\n }\n return context;\n}\n"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"RiScContext.esm.js","sources":["../../src/contexts/RiScContext.tsx"],"sourcesContent":["import {\n createContext,\n ReactNode,\n useCallback,\n useContext,\n useEffect,\n useRef,\n useState,\n useReducer,\n} from 'react';\nimport {\n ContentStatus,\n ProcessingStatus,\n RiScStatus,\n RiScWithMetadata,\n SubmitResponseObject,\n} from '../utils/types';\nimport { useRouteRef } from '@backstage/core-plugin-api';\nimport {\n getTranslationKey,\n requiresNewApproval,\n} from '../utils/utilityfunctions';\nimport { riScRouteRef } from '../routes';\nimport { useLocation, useNavigate, useParams } from 'react-router';\nimport {\n dtoToRiSc,\n GcpCryptoKeyObject,\n ProcessRiScResultDTO,\n RiScContentResultDTO,\n RiScDTO,\n} from '../utils/DTOs';\nimport {\n buildFetchRiScErrorMessages,\n mapRiScDtoToRiScWithMetadata,\n withLoginRejected,\n} from '../utils/fetchRiScHelpers';\nimport {\n useAuthenticatedFetch,\n useGithubRepositoryInformation,\n} from '../utils/hooks';\nimport { latestSupportedVersion } from '../utils/constants';\nimport { useTranslationRef } from '@backstage/core-plugin-api/alpha';\nimport { pluginRiScTranslationRef } from '../utils/translations';\n\nexport type UpdateStatus = {\n isLoading: boolean;\n isError: boolean;\n isSuccess: boolean;\n};\n\ntype RiScDrawerProps = {\n riScs: RiScWithMetadata[] | null;\n selectRiSc: (title: string) => void;\n selectedRiSc: RiScWithMetadata | null;\n createNewRiSc: (\n riSc: RiScWithMetadata,\n generateInitialRisc: boolean,\n defaultRiScId: string | undefined,\n ) => void;\n deleteRiSc: (onSuccess?: () => void, onError?: () => void) => void;\n updateRiSc: (\n riSc: RiScWithMetadata,\n onSuccess?: () => void,\n onError?: () => void,\n ) => void;\n approveRiSc: () => void;\n updateStatus: UpdateStatus;\n resetRiScStatus: () => void;\n resetResponse: () => void;\n isFetching: boolean;\n isFetchingGcpCryptoKeys: boolean;\n failedToFetchGcpCryptoKeys: boolean;\n allRiScsFailedDecryption: boolean;\n gcpCryptoKeys: GcpCryptoKeyObject[];\n response: SubmitResponseObject | null;\n};\n\nconst RiScContext = createContext<RiScDrawerProps | undefined>(undefined);\n\nexport function RiScProvider({ children }: { children: ReactNode }) {\n const { riScId: riScIdFromParams } = useParams();\n const location = useLocation();\n const navigate = useNavigate();\n const getRiScPath = useRouteRef(riScRouteRef);\n const [isRequesting, setIsRequesting] = useState<boolean>(false);\n const { t } = useTranslationRef(pluginRiScTranslationRef);\n const repoInfo = useGithubRepositoryInformation();\n\n const {\n fetchRiScs,\n fetchGcpCryptoKeys,\n postRiScs,\n deleteRiScs,\n putRiScs,\n publishRiScs,\n } = useAuthenticatedFetch();\n\n const [riScs, setRiScs] = useState<RiScWithMetadata[] | null>(null);\n const [selectedRiSc, setSelectedRiSc] = useState<RiScWithMetadata | null>(\n null,\n );\n const [isFetching, setIsFetching] = useState(true);\n const isFetchingRef = useRef(isFetching);\n const [isFetchingRiScs, setIsFetchingRiScs] = useState(true);\n const isFetchingRiScsRef = useRef(isFetchingRiScs);\n const [isFetchingGcpCryptoKeys, setIsFetchingGcpCryptoKeys] = useState(true);\n const isFetchingGcpCryptoKeysRef = useRef(isFetchingGcpCryptoKeys);\n const gcpCryptoKeysFailed = useRef(false);\n const [failedToFetchGcpCryptoKeys, setFailedToFetchGcpCryptoKeys] =\n useState(false);\n\n type LocalState = {\n updateStatus: UpdateStatus;\n response: SubmitResponseObject | null;\n };\n\n type Action =\n | { type: 'SET_STATUS'; updateStatus: UpdateStatus }\n | { type: 'SET_RESPONSE'; response: SubmitResponseObject | null }\n | {\n type: 'SET_BOTH';\n updateStatus: UpdateStatus;\n response: SubmitResponseObject | null;\n };\n\n const initialLocalState: LocalState = {\n updateStatus: { isLoading: false, isError: false, isSuccess: false },\n response: null,\n };\n\n function reducer(state: LocalState, action: Action): LocalState {\n switch (action.type) {\n case 'SET_STATUS':\n return { ...state, updateStatus: action.updateStatus };\n case 'SET_RESPONSE':\n return { ...state, response: action.response };\n case 'SET_BOTH':\n return { updateStatus: action.updateStatus, response: action.response };\n default:\n return state;\n }\n }\n\n const [localState, dispatch] = useReducer(reducer, initialLocalState);\n\n const [gcpCryptoKeys, setGcpCryptoKeys] = useState<GcpCryptoKeyObject[]>([]);\n\n const [allRiScsFailedDecryption, setAllRiScsFailedDecryption] =\n useState(false);\n\n // Auto-clear response after a short duration to avoid the Alert sticking around\n const responseTimerRef = useRef<number | null>(null);\n useEffect(() => {\n if (localState.response) {\n if (responseTimerRef.current) {\n window.clearTimeout(responseTimerRef.current);\n }\n responseTimerRef.current = window.setTimeout(() => {\n dispatch({ type: 'SET_RESPONSE', response: null });\n responseTimerRef.current = null;\n }, 10000);\n }\n\n return () => {\n if (responseTimerRef.current) {\n window.clearTimeout(responseTimerRef.current);\n responseTimerRef.current = null;\n }\n };\n }, [localState.response]);\n\n useEffect(() => {\n if (location.state) {\n dispatch({\n type: 'SET_RESPONSE',\n response: {\n statusMessage: location.state,\n status: ProcessingStatus.ErrorWhenFetchingRiScs,\n },\n });\n }\n }, [location, dispatch]);\n\n // Initial fetch of GCP crypto keys\n useEffect(() => {\n gcpCryptoKeysFailed.current = false;\n setFailedToFetchGcpCryptoKeys(false);\n dispatch({ type: 'SET_RESPONSE', response: null });\n fetchGcpCryptoKeys(\n res => {\n // Sorts the crypto keys by the number of permissions (descending)\n setGcpCryptoKeys(\n res.sort(\n (a, b) =>\n (b.userPermissions?.length ?? 0) -\n (a.userPermissions?.length ?? 0),\n ),\n );\n isFetchingGcpCryptoKeysRef.current = false;\n setIsFetchingGcpCryptoKeys(isFetchingGcpCryptoKeysRef.current);\n if (!isFetchingRiScsRef.current) {\n isFetchingRef.current = false;\n setIsFetching(isFetchingRef.current);\n }\n },\n (_error, loginRejected) => {\n gcpCryptoKeysFailed.current = true;\n setFailedToFetchGcpCryptoKeys(true);\n dispatch({\n type: 'SET_RESPONSE',\n response: {\n status: ProcessingStatus.ErrorWhenFetchingGcpCryptoKeys,\n statusMessage: withLoginRejected(\n t('errorMessages.ErrorWhenFetchingGcpCryptoKeys'),\n loginRejected,\n t,\n ),\n },\n });\n isFetchingGcpCryptoKeysRef.current = false;\n setIsFetchingGcpCryptoKeys(isFetchingGcpCryptoKeysRef.current);\n if (!isFetchingRiScsRef.current) {\n isFetchingRef.current = false;\n setIsFetching(isFetchingRef.current);\n }\n },\n );\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, []);\n\n // Initial fetch of RiScs\n useEffect(() => {\n dispatch({ type: 'SET_RESPONSE', response: null });\n fetchRiScs(\n res => {\n const successfulRiScs = res.filter(\n risk => risk.status === ContentStatus.Success,\n );\n\n // Check if all RiScs failed decryption (there are RiScs but all failed)\n const allFailed = res.length > 0 && successfulRiScs.length === 0;\n setAllRiScsFailedDecryption(allFailed);\n\n const fetchedRiScs: RiScWithMetadata[] = successfulRiScs.map(\n mapRiScDtoToRiScWithMetadata,\n );\n setRiScs(fetchedRiScs);\n isFetchingRiScsRef.current = false;\n setIsFetchingRiScs(isFetchingRiScsRef.current);\n if (!isFetchingGcpCryptoKeysRef.current) {\n isFetchingRef.current = false;\n setIsFetching(isFetchingRef.current);\n }\n\n const errorRiScs: RiScContentResultDTO[] = res.filter(\n risk => risk.status !== ContentStatus.Success,\n );\n\n if (errorRiScs.length > 0) {\n dispatch({\n type: 'SET_RESPONSE',\n response: {\n statusMessage: buildFetchRiScErrorMessages(errorRiScs, t),\n status: ProcessingStatus.ErrorWhenFetchingRiScs,\n },\n });\n }\n\n // If there are no RiScs, don't set a selected RiSc\n if (fetchedRiScs.length === 0) {\n return;\n }\n\n // If there is no RiSc ID in the URL, navigate to the first RiSc\n if (!riScIdFromParams) {\n navigate(getRiScPath({ riScId: fetchedRiScs[0].id }));\n return;\n }\n\n const riSc = fetchedRiScs.find(r => r.id === riScIdFromParams);\n\n // If there is an invalid RiSc ID in the URL, navigate to the first RiSc with error state\n if (!riSc) {\n navigate(getRiScPath({ riScId: fetchedRiScs[0].id }), {\n state: t('errorMessages.RiScDoesNotExist'),\n });\n return;\n }\n },\n loginRejected => {\n if (!gcpCryptoKeysFailed.current) {\n dispatch({\n type: 'SET_RESPONSE',\n response: {\n status: ProcessingStatus.ErrorWhenFetchingRiScs,\n statusMessage: withLoginRejected(\n t('errorMessages.ErrorWhenFetchingRiScs'),\n loginRejected,\n t,\n ),\n },\n });\n }\n isFetchingRiScsRef.current = false;\n setIsFetchingRiScs(isFetchingRiScsRef.current);\n if (!isFetchingGcpCryptoKeysRef.current) {\n isFetchingRef.current = false;\n setIsFetching(isFetchingRef.current);\n }\n },\n );\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, []);\n\n // Set selected RiSc based on URL\n useEffect(() => {\n if (riScIdFromParams) {\n const riSc = riScs?.find(r => r.id === riScIdFromParams);\n if (riSc) {\n setSelectedRiSc(riSc);\n }\n }\n }, [riScs, riScIdFromParams]);\n\n const resetRiScStatus = useCallback(() => {\n dispatch({\n type: 'SET_STATUS',\n updateStatus: { isLoading: false, isSuccess: false, isError: false },\n });\n }, [dispatch]);\n\n // use callback to avoid infinite loop\n const resetResponse = useCallback(() => {\n dispatch({ type: 'SET_RESPONSE', response: null });\n }, [dispatch]);\n\n const getTranslationContext = useCallback(\n (status: ProcessingStatus) => {\n return status === ProcessingStatus.ErrorWhenNoWriteAccessToRepository\n ? { owner: repoInfo.owner, name: repoInfo.name }\n : undefined;\n },\n [repoInfo.owner, repoInfo.name],\n );\n\n function selectRiSc(id: string) {\n const selectedRiScId = riScs?.find(riSc => riSc.id === id)?.id;\n if (selectedRiScId) {\n navigate(getRiScPath({ riScId: selectedRiScId }));\n }\n }\n\n function createNewRiSc(\n riSc: RiScWithMetadata,\n generateInitialRisc: boolean,\n defaultRiScId: string | undefined,\n ) {\n setIsFetching(true);\n setSelectedRiSc(null);\n dispatch({\n type: 'SET_BOTH',\n updateStatus: { isLoading: true, isError: false, isSuccess: false },\n response: null,\n });\n const newRiSc: RiScWithMetadata = {\n ...riSc,\n schemaVersion: latestSupportedVersion,\n };\n postRiScs(\n newRiSc.content,\n generateInitialRisc,\n newRiSc.sopsConfig,\n defaultRiScId,\n res => {\n if (!res.riScId) throw new Error('No RiSc ID returned');\n if (!res.riScContent) throw new Error('No RiSc content returned');\n const json = JSON.parse(res.riScContent) as RiScDTO;\n const content = dtoToRiSc(json);\n const riScWithMetaData: RiScWithMetadata = {\n id: res.riScId,\n status: RiScStatus.Draft,\n content: content,\n sopsConfig: riSc.sopsConfig,\n schemaVersion: riSc.schemaVersion,\n lastPublished: riSc.lastPublished,\n };\n setRiScs(riScs ? [...riScs, riScWithMetaData] : [riScWithMetaData]);\n setIsFetching(false);\n navigate(getRiScPath({ riScId: res.riScId }));\n dispatch({\n type: 'SET_BOTH',\n updateStatus: { isLoading: false, isError: false, isSuccess: true },\n response: {\n ...res,\n statusMessage: getTranslationKey('info', res.status, t),\n },\n });\n },\n (error: ProcessRiScResultDTO, loginRejected: boolean) => {\n setSelectedRiSc(selectedRiSc);\n setIsFetching(false);\n\n const translationContext = getTranslationContext(error.status);\n\n dispatch({\n type: 'SET_BOTH',\n updateStatus: { isLoading: false, isError: true, isSuccess: false },\n response: {\n ...error,\n statusMessage: withLoginRejected(\n getTranslationKey('error', error.status, t, translationContext),\n loginRejected,\n t,\n ),\n },\n });\n },\n );\n }\n\n function deleteRiSc(onSuccess?: () => void, onError?: () => void) {\n if (selectedRiSc && riScs) {\n const updatedRiSc = {\n ...selectedRiSc,\n status: RiScStatus.DeletionDraft,\n };\n const originalRiSc = selectedRiSc;\n\n dispatch({\n type: 'SET_BOTH',\n updateStatus: { isLoading: true, isError: false, isSuccess: false },\n response: null,\n });\n deleteRiScs(\n selectedRiSc.id,\n res => {\n dispatch({\n type: 'SET_BOTH',\n updateStatus: { isLoading: false, isError: false, isSuccess: true },\n response: {\n ...res,\n statusMessage: getTranslationKey('info', res.status, t),\n },\n });\n setIsRequesting(false);\n if (res.status === ProcessingStatus.DeletedRiSc) {\n setSelectedRiSc(\n riScs.find(riSc => riSc.id !== selectedRiSc.id) || null,\n );\n setRiScs(riScs.filter(riSc => riSc.id !== updatedRiSc.id));\n } else {\n setSelectedRiSc(updatedRiSc);\n setRiScs(\n riScs.map(riSc =>\n riSc.id === selectedRiSc.id ? updatedRiSc : riSc,\n ),\n );\n }\n if (onSuccess) onSuccess();\n },\n (error, loginRejected) => {\n setSelectedRiSc(originalRiSc);\n\n const translationContext = getTranslationContext(error.status);\n\n dispatch({\n type: 'SET_BOTH',\n updateStatus: { isLoading: false, isError: true, isSuccess: false },\n response: {\n ...error,\n statusMessage: withLoginRejected(\n getTranslationKey('error', error.status, t, translationContext),\n loginRejected,\n t,\n ),\n },\n });\n setIsRequesting(false);\n if (onError) onError();\n },\n );\n }\n }\n\n function updateRiSc(\n riSc: RiScWithMetadata,\n onSuccess?: () => void,\n onError?: () => void,\n ) {\n if (selectedRiSc && riScs) {\n const isRequiresNewApproval =\n selectedRiSc.migrationStatus?.migrationRequiresNewApproval ||\n requiresNewApproval(selectedRiSc.content, riSc.content);\n\n const updatedRiSc: RiScWithMetadata = {\n ...selectedRiSc,\n sopsConfig: riSc.sopsConfig,\n content: riSc.content,\n status:\n selectedRiSc.status !== RiScStatus.Draft && isRequiresNewApproval\n ? RiScStatus.Draft\n : selectedRiSc.status,\n isRequiresNewApproval: isRequiresNewApproval,\n schemaVersion: riSc.schemaVersion,\n migrationStatus: {\n migrationChanges: false,\n migrationRequiresNewApproval: false,\n },\n };\n const originalRiSc = selectedRiSc;\n setSelectedRiSc(updatedRiSc);\n dispatch({\n type: 'SET_BOTH',\n updateStatus: { isLoading: true, isError: false, isSuccess: false },\n response: null,\n });\n putRiScs(\n updatedRiSc,\n res => {\n dispatch({\n type: 'SET_BOTH',\n updateStatus: { isLoading: false, isError: false, isSuccess: true },\n response: {\n ...res,\n statusMessage: getTranslationKey('info', res.status, t),\n },\n });\n if ('pendingApproval' in res && res.pendingApproval?.pullRequestUrl) {\n updatedRiSc.pullRequestUrl = res.pendingApproval.pullRequestUrl;\n updatedRiSc.status = RiScStatus.SentForApproval;\n }\n setSelectedRiSc(updatedRiSc);\n setRiScs(\n riScs.map(r => (r.id === selectedRiSc.id ? updatedRiSc : r)),\n );\n setIsRequesting(false);\n if (onSuccess) onSuccess();\n },\n (error, loginRejected) => {\n const translationContext = getTranslationContext(error.status);\n\n dispatch({\n type: 'SET_BOTH',\n updateStatus: { isLoading: false, isError: true, isSuccess: false },\n response: {\n ...error,\n statusMessage: withLoginRejected(\n getTranslationKey('error', error.status, t, translationContext),\n loginRejected,\n t,\n ),\n },\n });\n setIsRequesting(false);\n if (onError) onError();\n setSelectedRiSc(originalRiSc);\n },\n );\n }\n }\n\n const refetchRiScs = useCallback(() => {\n fetchRiScs(\n res => {\n const fetchedRiScs: RiScWithMetadata[] = res\n .filter(risk => risk.status === ContentStatus.Success)\n .map(mapRiScDtoToRiScWithMetadata);\n\n setRiScs(fetchedRiScs);\n\n setSelectedRiSc(prev =>\n prev ? (fetchedRiScs.find(r => r.id === prev.id) ?? prev) : prev,\n );\n },\n (_, loginRejected) => {\n dispatch({\n type: 'SET_RESPONSE',\n response: {\n status: ProcessingStatus.ErrorWhenFetchingRiScs,\n statusMessage: withLoginRejected(\n t('errorMessages.ErrorWhenFetchingRiScs'),\n loginRejected,\n t,\n ),\n },\n });\n },\n );\n }, [fetchRiScs, dispatch, t]);\n\n function approveRiSc() {\n if (selectedRiSc && riScs) {\n dispatch({\n type: 'SET_STATUS',\n updateStatus: { isLoading: true, isError: false, isSuccess: false },\n });\n publishRiScs(\n selectedRiSc.id,\n res => {\n const prUrl = res.pendingApproval?.pullRequestUrl;\n const updatedRiSc = {\n ...selectedRiSc,\n status:\n selectedRiSc.status === RiScStatus.Draft\n ? RiScStatus.SentForApproval\n : RiScStatus.DeletionSentForApproval,\n pullRequestUrl: prUrl,\n };\n setSelectedRiSc(updatedRiSc);\n setRiScs(\n riScs.map(r => (r.id === selectedRiSc.id ? updatedRiSc : r)),\n );\n dispatch({\n type: 'SET_BOTH',\n updateStatus: { isLoading: false, isError: false, isSuccess: true },\n response: {\n ...res,\n statusMessage: getTranslationKey('info', res.status, t),\n },\n });\n },\n (error, loginRejected) => {\n const translationContext = getTranslationContext(error.status);\n\n dispatch({\n type: 'SET_BOTH',\n updateStatus: { isLoading: false, isError: true, isSuccess: false },\n response: {\n ...error,\n statusMessage: withLoginRejected(\n getTranslationKey('error', error.status, t, translationContext),\n loginRejected,\n t,\n ),\n },\n });\n },\n );\n }\n }\n\n useEffect(() => {\n const s = selectedRiSc?.status;\n\n const shouldPoll =\n s === RiScStatus.SentForApproval ||\n s === RiScStatus.DeletionSentForApproval;\n\n if (!shouldPoll) {\n return undefined;\n }\n\n const id = window.setInterval(() => {\n refetchRiScs();\n }, 5000);\n\n return () => window.clearInterval(id);\n }, [selectedRiSc?.status, refetchRiScs]);\n\n const value = {\n riScs,\n selectRiSc,\n selectedRiSc,\n createNewRiSc,\n deleteRiSc,\n updateRiSc,\n approveRiSc,\n updateStatus: localState.updateStatus,\n resetRiScStatus,\n resetResponse,\n isRequesting,\n isFetching,\n response: localState.response,\n gcpCryptoKeys,\n };\n\n return (\n <RiScContext.Provider\n value={{\n ...value,\n isFetchingGcpCryptoKeys: false,\n failedToFetchGcpCryptoKeys,\n allRiScsFailedDecryption,\n }}\n >\n {children}\n </RiScContext.Provider>\n );\n}\n\nexport function useRiScs() {\n const context = useContext(RiScContext);\n if (context === undefined) {\n throw new Error('useRiScs must be used within a RiScProvider');\n }\n return context;\n}\n"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"DTOs.esm.js","sources":["../../src/utils/DTOs.ts"],"sourcesContent":["import {\n Action,\n ContentStatus,\n LastPublished,\n MigrationStatus,\n Modify,\n ProcessingStatus,\n RiSc,\n RiScStatus,\n Risk,\n Scenario,\n} from './types';\nimport { ProfileInfo } from '@backstage/core-plugin-api';\n\nexport type ProcessRiScResultDTO = {\n riScId: string;\n status: ProcessingStatus;\n statusMessage: string;\n riScContent: string | null;\n};\n\n// Takes a normal ProcessRiScResultDTO and changes status to ContentStatus.\ntype ContentRiScResultDTO = Modify<\n ProcessRiScResultDTO,\n 'status',\n ContentStatus\n> & { pullRequestUrl: string };\n\nexport type PublishRiScResultDTO = {\n pendingApproval?: {\n pullRequestUrl: string;\n pullRequestName: string;\n };\n} & ProcessRiScResultDTO;\n\nexport type CreateRiScResultDTO = {\n riScId: String;\n status: ProcessingStatus;\n statusMessage: string;\n riScContent: string | null;\n sopsConfig: SopsConfigDTO;\n} & ProcessRiScResultDTO;\n\nexport type DeleteRiScResultDTO = ProcessRiScResultDTO;\n\nexport type RiScContentResultDTO = {\n riScStatus: RiScStatus;\n riScContent: string;\n sopsConfig: SopsConfigDTO;\n migrationStatus: MigrationStatus;\n lastPublished: LastPublished;\n} & ContentRiScResultDTO;\n\nexport type RiScDTO = {\n schemaVersion: string;\n title: string;\n scope: string;\n scenarios: ScenarioDTO[];\n};\n\nexport enum CryptoKeyPermission {\n UNKNOWN = 'UNKNOWN',\n DECRYPT = 'DECRYPT',\n ENCRYPT = 'ENCRYPT',\n}\n\nexport type GcpCryptoKeyObject = {\n projectId: string;\n keyRing: string;\n name: string;\n locations: string;\n resourceId: string;\n createdAt: string;\n userPermissions: CryptoKeyPermission[];\n};\n\nexport type ScenarioDTO = {\n title: string;\n scenario: {\n ID: string;\n url?: string;\n description: string;\n threatActors: string[];\n vulnerabilities: string[];\n risk: Risk;\n actions: ActionsDTO[];\n remainingRisk: Risk;\n };\n};\n\nexport type ActionsDTO = {\n title: string;\n action: {\n ID: string;\n description: string;\n status: string;\n url: string;\n lastUpdated?: Date | null;\n lastUpdatedBy?: string | null;\n };\n};\n\nexport function dtoToRiSc(riScDTO: RiScDTO): RiSc {\n return {\n ...riScDTO,\n // TODO implementere løsning for migrering, kan bumpe fra 3.2 til 3.3 på denne måten manuelt ved å åpne og lagre riscen:\n // skjemaVersjon: '3.3',\n scenarios: riScDTO.scenarios.map(dtoToScenario),\n };\n}\n\nexport function dtoToScenario(scenarioDTO: ScenarioDTO): Scenario {\n return {\n ...scenarioDTO.scenario,\n title: scenarioDTO.title,\n actions: scenarioDTO.scenario.actions.map(dtoToAction),\n };\n}\n\nexport function dtoToAction(actionDTO: ActionsDTO): Action {\n return {\n ...actionDTO.action,\n title: actionDTO.title,\n };\n}\n\nexport function profileInfoToDTOString(profile: ProfileInfo): string {\n return JSON.stringify({\n name: profile.displayName ?? '',\n email: profile.email ?? '',\n });\n}\n\nexport function riScToDTOString(\n riSc: RiSc,\n isRequiresNewApproval: boolean,\n profile: ProfileInfo,\n sopsConfig: SopsConfigDTO,\n defaultRiScId?: string | undefined,\n): string {\n const json = JSON.stringify({\n riSc: JSON.stringify(riScToDTO(riSc)),\n isRequiresNewApproval: isRequiresNewApproval,\n schemaVersion: riSc.schemaVersion,\n defaultRiScId: defaultRiScId ?? undefined,\n userInfo: {\n name: profile.displayName ?? '',\n email: profile.email ?? '',\n },\n sopsConfig: sopsConfig,\n });\n return json;\n}\n\nfunction riScToDTO(riSc: RiSc): RiScDTO {\n return {\n ...riSc,\n scenarios: riSc.scenarios.map(scenarioToDTO),\n };\n}\n\nfunction scenarioToDTO(scenario: Scenario): ScenarioDTO {\n return {\n title: scenario.title,\n scenario: {\n ID: scenario.ID,\n url: scenario.url,\n description: scenario.description,\n threatActors: scenario.threatActors,\n vulnerabilities: scenario.vulnerabilities,\n risk: scenario.risk,\n actions: scenario.actions.map(actionToDTO),\n remainingRisk: scenario.remainingRisk,\n },\n };\n}\n\nfunction actionToDTO(action: Action): ActionsDTO {\n return {\n title: action.title,\n action: {\n ID: action.ID,\n description: action.description,\n status: action.status,\n url: action.url,\n lastUpdated: action.lastUpdated,\n lastUpdatedBy: action.lastUpdatedBy,\n },\n };\n}\n\nexport type SopsConfigDTO = {\n shamir_threshold: number;\n age?: AgeEntry[];\n gcp_kms: GcpKmsEntry[];\n lastModified?: string;\n unencrypted_suffix?: string;\n version?: string;\n};\n\ntype GcpKmsEntry = {\n resource_id: string;\n created_at: string;\n};\n\ntype AgeEntry = {\n recipient: string;\n};\n"],"names":["CryptoKeyPermission"],"mappings":"AA4DO,IAAK,mBAAA,qBAAAA,oBAAAA,KAAL;AACL,EAAAA,qBAAA,SAAA,CAAA,GAAU,SAAA;AACV,EAAAA,qBAAA,SAAA,CAAA,GAAU,SAAA;AACV,EAAAA,qBAAA,SAAA,CAAA,GAAU,SAAA;AAHA,EAAA,OAAAA,oBAAAA;AAAA,CAAA,EAAA,mBAAA,IAAA,EAAA;AA0CL,SAAS,UAAU,OAAA,EAAwB;AAChD,EAAA,OAAO;AAAA,IACL,GAAG,OAAA;AAAA;AAAA;AAAA,IAGH,SAAA,EAAW,OAAA,CAAQ,SAAA,CAAU,GAAA,CAAI,aAAa;AAAA,GAChD;AACF;AAEO,SAAS,cAAc,WAAA,EAAoC;AAChE,EAAA,OAAO;AAAA,IACL,GAAG,WAAA,CAAY,QAAA;AAAA,IACf,OAAO,WAAA,CAAY,KAAA;AAAA,IACnB,OAAA,EAAS,WAAA,CAAY,QAAA,CAAS,OAAA,CAAQ,IAAI,WAAW;AAAA,GACvD;AACF;AAEO,SAAS,YAAY,SAAA,EAA+B;AACzD,EAAA,OAAO;AAAA,IACL,GAAG,SAAA,CAAU,MAAA;AAAA,IACb,OAAO,SAAA,CAAU;AAAA,GACnB;AACF;AAEO,SAAS,uBAAuB,OAAA,EAA8B;AACnE,EAAA,OAAO,KAAK,SAAA,CAAU;AAAA,IACpB,IAAA,EAAM,QAAQ,WAAA,IAAe,EAAA;AAAA,IAC7B,KAAA,EAAO,QAAQ,KAAA,IAAS;AAAA,GACzB,CAAA;AACH;AAEO,SAAS,eAAA,CACd,IAAA,EACA,qBAAA,EACA,OAAA,EACA,YACA,aAAA,EACQ;AACR,EAAA,MAAM,IAAA,GAAO,KAAK,SAAA,CAAU;AAAA,IAC1B,IAAA,EAAM,IAAA,CAAK,SAAA,CAAU,SAAA,CAAU,IAAI,CAAC,CAAA;AAAA,IACpC,qBAAA;AAAA,IACA,eAAe,IAAA,CAAK,aAAA;AAAA,IACpB,eAAe,aAAA,IAAiB,MAAA;AAAA,IAChC,QAAA,EAAU;AAAA,MACR,IAAA,EAAM,QAAQ,WAAA,IAAe,EAAA;AAAA,MAC7B,KAAA,EAAO,QAAQ,KAAA,IAAS;AAAA,KAC1B;AAAA,IACA;AAAA,GACD,CAAA;AACD,EAAA,OAAO,IAAA;AACT;AAEA,SAAS,UAAU,IAAA,EAAqB;AACtC,EAAA,OAAO;AAAA,IACL,GAAG,IAAA;AAAA,IACH,SAAA,EAAW,IAAA,CAAK,SAAA,CAAU,GAAA,CAAI,aAAa;AAAA,GAC7C;AACF;AAEA,SAAS,cAAc,QAAA,EAAiC;AACtD,EAAA,OAAO;AAAA,IACL,OAAO,QAAA,CAAS,KAAA;AAAA,IAChB,QAAA,EAAU;AAAA,MACR,IAAI,QAAA,CAAS,EAAA;AAAA,MACb,KAAK,QAAA,CAAS,GAAA;AAAA,MACd,aAAa,QAAA,CAAS,WAAA;AAAA,MACtB,cAAc,QAAA,CAAS,YAAA;AAAA,MACvB,iBAAiB,QAAA,CAAS,eAAA;AAAA,MAC1B,MAAM,QAAA,CAAS,IAAA;AAAA,MACf,OAAA,EAAS,QAAA,CAAS,OAAA,CAAQ,GAAA,CAAI,WAAW,CAAA;AAAA,MACzC,eAAe,QAAA,CAAS;AAAA;AAC1B,GACF;AACF;AAEA,SAAS,YAAY,MAAA,EAA4B;AAC/C,EAAA,OAAO;AAAA,IACL,OAAO,MAAA,CAAO,KAAA;AAAA,IACd,MAAA,EAAQ;AAAA,MACN,IAAI,MAAA,CAAO,EAAA;AAAA,MACX,aAAa,MAAA,CAAO,WAAA;AAAA,MACpB,QAAQ,MAAA,CAAO,MAAA;AAAA,MACf,KAAK,MAAA,CAAO,GAAA;AAAA,MACZ,aAAa,MAAA,CAAO,WAAA;AAAA,MACpB,eAAe,MAAA,CAAO;AAAA;AACxB,GACF;AACF;;;;"}
1
+ {"version":3,"file":"DTOs.esm.js","sources":["../../src/utils/DTOs.ts"],"sourcesContent":["import {\n Action,\n ContentStatus,\n LastPublished,\n MigrationStatus,\n Modify,\n ProcessingStatus,\n RiSc,\n RiScStatus,\n Risk,\n Scenario,\n} from './types';\nimport { ProfileInfo } from '@backstage/core-plugin-api';\n\nexport type ProcessRiScResultDTO = {\n riScId: string;\n status: ProcessingStatus;\n statusMessage: string;\n riScContent: string | null;\n};\n\n// Takes a normal ProcessRiScResultDTO and changes status to ContentStatus.\ntype ContentRiScResultDTO = Modify<\n ProcessRiScResultDTO,\n 'status',\n ContentStatus\n> & { pullRequestUrl: string };\n\nexport type PublishRiScResultDTO = {\n pendingApproval?: {\n pullRequestUrl: string;\n pullRequestName: string;\n };\n} & ProcessRiScResultDTO;\n\nexport type CreateRiScResultDTO = {\n riScId: String;\n status: ProcessingStatus;\n statusMessage: string;\n riScContent: string | null;\n sopsConfig: SopsConfigDTO;\n} & ProcessRiScResultDTO;\n\nexport type DeleteRiScResultDTO = ProcessRiScResultDTO;\n\nexport type RiScContentResultDTO = {\n riScStatus: RiScStatus;\n riScContent: string;\n sopsConfig: SopsConfigDTO;\n migrationStatus: MigrationStatus;\n statusMessage?: string;\n errorCode?: string;\n lastPublished: LastPublished;\n} & ContentRiScResultDTO;\n\nexport type RiScDTO = {\n schemaVersion: string;\n title: string;\n scope: string;\n scenarios: ScenarioDTO[];\n};\n\nexport enum CryptoKeyPermission {\n UNKNOWN = 'UNKNOWN',\n DECRYPT = 'DECRYPT',\n ENCRYPT = 'ENCRYPT',\n}\n\nexport type GcpCryptoKeyObject = {\n projectId: string;\n keyRing: string;\n name: string;\n locations: string;\n resourceId: string;\n createdAt: string;\n userPermissions: CryptoKeyPermission[];\n};\n\nexport type ScenarioDTO = {\n title: string;\n scenario: {\n ID: string;\n url?: string;\n description: string;\n threatActors: string[];\n vulnerabilities: string[];\n risk: Risk;\n actions: ActionsDTO[];\n remainingRisk: Risk;\n };\n};\n\nexport type ActionsDTO = {\n title: string;\n action: {\n ID: string;\n description: string;\n status: string;\n url: string;\n lastUpdated?: Date | null;\n lastUpdatedBy?: string | null;\n };\n};\n\nexport function dtoToRiSc(riScDTO: RiScDTO): RiSc {\n return {\n ...riScDTO,\n // TODO implementere løsning for migrering, kan bumpe fra 3.2 til 3.3 på denne måten manuelt ved å åpne og lagre riscen:\n // skjemaVersjon: '3.3',\n scenarios: riScDTO.scenarios.map(dtoToScenario),\n };\n}\n\nexport function dtoToScenario(scenarioDTO: ScenarioDTO): Scenario {\n return {\n ...scenarioDTO.scenario,\n title: scenarioDTO.title,\n actions: scenarioDTO.scenario.actions.map(dtoToAction),\n };\n}\n\nexport function dtoToAction(actionDTO: ActionsDTO): Action {\n return {\n ...actionDTO.action,\n title: actionDTO.title,\n };\n}\n\nexport function profileInfoToDTOString(profile: ProfileInfo): string {\n return JSON.stringify({\n name: profile.displayName ?? '',\n email: profile.email ?? '',\n });\n}\n\nexport function riScToDTOString(\n riSc: RiSc,\n isRequiresNewApproval: boolean,\n profile: ProfileInfo,\n sopsConfig: SopsConfigDTO,\n defaultRiScId?: string | undefined,\n): string {\n const json = JSON.stringify({\n riSc: JSON.stringify(riScToDTO(riSc)),\n isRequiresNewApproval: isRequiresNewApproval,\n schemaVersion: riSc.schemaVersion,\n defaultRiScId: defaultRiScId ?? undefined,\n userInfo: {\n name: profile.displayName ?? '',\n email: profile.email ?? '',\n },\n sopsConfig: sopsConfig,\n });\n return json;\n}\n\nfunction riScToDTO(riSc: RiSc): RiScDTO {\n return {\n ...riSc,\n scenarios: riSc.scenarios.map(scenarioToDTO),\n };\n}\n\nfunction scenarioToDTO(scenario: Scenario): ScenarioDTO {\n return {\n title: scenario.title,\n scenario: {\n ID: scenario.ID,\n url: scenario.url,\n description: scenario.description,\n threatActors: scenario.threatActors,\n vulnerabilities: scenario.vulnerabilities,\n risk: scenario.risk,\n actions: scenario.actions.map(actionToDTO),\n remainingRisk: scenario.remainingRisk,\n },\n };\n}\n\nfunction actionToDTO(action: Action): ActionsDTO {\n return {\n title: action.title,\n action: {\n ID: action.ID,\n description: action.description,\n status: action.status,\n url: action.url,\n lastUpdated: action.lastUpdated,\n lastUpdatedBy: action.lastUpdatedBy,\n },\n };\n}\n\nexport type SopsConfigDTO = {\n shamir_threshold: number;\n age?: AgeEntry[];\n gcp_kms: GcpKmsEntry[];\n lastModified?: string;\n unencrypted_suffix?: string;\n version?: string;\n};\n\ntype GcpKmsEntry = {\n resource_id: string;\n created_at: string;\n};\n\ntype AgeEntry = {\n recipient: string;\n};\n"],"names":["CryptoKeyPermission"],"mappings":"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"}
@@ -0,0 +1,82 @@
1
+ import { dtoToRiSc } from './DTOs.esm.js';
2
+ import { ContentStatus } from './types.esm.js';
3
+
4
+ function mapRiScDtoToRiScWithMetadata(dto) {
5
+ const json = JSON.parse(dto.riScContent);
6
+ const content = dtoToRiSc(json);
7
+ return {
8
+ id: dto.riScId,
9
+ content,
10
+ sopsConfig: dto.sopsConfig,
11
+ status: dto.riScStatus,
12
+ pullRequestUrl: dto.pullRequestUrl,
13
+ migrationStatus: dto.migrationStatus,
14
+ lastPublished: dto.lastPublished
15
+ };
16
+ }
17
+ function withLoginRejected(baseMessage, loginRejected, t) {
18
+ return loginRejected ? `${baseMessage}. ${t("dictionary.rejectedLogin")}` : baseMessage;
19
+ }
20
+ function buildFetchRiScErrorMessages(errorRiScs, t) {
21
+ const errorsByStatus = errorRiScs.reduce(
22
+ (acc, risk) => {
23
+ if (!acc[risk.status]) {
24
+ acc[risk.status] = [];
25
+ }
26
+ acc[risk.status].push(risk.riScId);
27
+ return acc;
28
+ },
29
+ {}
30
+ );
31
+ return Object.entries(errorsByStatus).map(([status, riScIds]) => {
32
+ const validStatuses = Object.values(ContentStatus);
33
+ const statusKey = validStatuses.includes(status) ? status : ContentStatus.Failure;
34
+ if (statusKey === ContentStatus.DecryptionFailed) {
35
+ const decryptionRisks = errorRiScs.filter(
36
+ (risk) => risk.status === ContentStatus.DecryptionFailed && riScIds.includes(risk.riScId)
37
+ );
38
+ const withErrorCode = decryptionRisks.filter((risk) => risk.errorCode);
39
+ const withoutErrorCode = decryptionRisks.filter(
40
+ (risk) => !risk.errorCode
41
+ );
42
+ const messages = [];
43
+ if (withErrorCode.length > 0) {
44
+ const decryptionErrorsByMessage = withErrorCode.reduce(
45
+ (acc, risk) => {
46
+ const message = risk.errorCode;
47
+ if (!acc[message]) acc[message] = [];
48
+ acc[message].push(risk.riScId);
49
+ return acc;
50
+ },
51
+ {}
52
+ );
53
+ Object.entries(decryptionErrorsByMessage).forEach(
54
+ ([message, ids]) => {
55
+ const errorKey2 = `errorMessages.ContentStatusDecryptionFailedMessage.${message}`;
56
+ messages.push(
57
+ t(errorKey2, { riScId: ids.join(", "), status })
58
+ );
59
+ }
60
+ );
61
+ }
62
+ if (withoutErrorCode.length > 0) {
63
+ const errorKey2 = `errorMessages.ContentStatus${statusKey}`;
64
+ messages.push(
65
+ t(errorKey2, {
66
+ riScId: withoutErrorCode.map((r) => r.riScId).join(", "),
67
+ status
68
+ })
69
+ );
70
+ }
71
+ return messages.join("\n");
72
+ }
73
+ const errorKey = `errorMessages.ContentStatus${statusKey}`;
74
+ return t(errorKey, {
75
+ riScId: riScIds.join(", "),
76
+ status
77
+ });
78
+ }).join("\n");
79
+ }
80
+
81
+ export { buildFetchRiScErrorMessages, mapRiScDtoToRiScWithMetadata, withLoginRejected };
82
+ //# sourceMappingURL=fetchRiScHelpers.esm.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"fetchRiScHelpers.esm.js","sources":["../../src/utils/fetchRiScHelpers.ts"],"sourcesContent":["import { dtoToRiSc, RiScContentResultDTO, RiScDTO } from './DTOs';\nimport { ContentStatus, RiScWithMetadata } from './types';\n\n/**\n * Maps a RiScContentResultDTO to a RiScWithMetadata object.\n * Used when converting the raw API response to the internal representation.\n */\nexport function mapRiScDtoToRiScWithMetadata(\n dto: RiScContentResultDTO,\n): RiScWithMetadata {\n const json = JSON.parse(dto.riScContent) as RiScDTO;\n const content = dtoToRiSc(json);\n return {\n id: dto.riScId,\n content,\n sopsConfig: dto.sopsConfig,\n status: dto.riScStatus,\n pullRequestUrl: dto.pullRequestUrl,\n migrationStatus: dto.migrationStatus,\n lastPublished: dto.lastPublished,\n };\n}\n\n/**\n * Appends a \"login rejected\" suffix to a status message when the request was\n * rejected due to login issues. This is a recurring pattern used across all\n * error callbacks from the authenticated fetch hooks.\n */\nexport function withLoginRejected(\n baseMessage: string,\n loginRejected: boolean,\n t: (key: any, options?: any) => string,\n): string {\n return loginRejected\n ? `${baseMessage}. ${t('dictionary.rejectedLogin')}`\n : baseMessage;\n}\n\n/**\n * Builds readable error message string from a list of RiScs that\n * failed to load. Groups them by ContentStatus and produces one line per\n * group, with special handling for DecryptionFailed entries that carry an\n * errorCode.\n */\nexport function buildFetchRiScErrorMessages(\n errorRiScs: RiScContentResultDTO[],\n t: (key: any, options?: any) => string,\n): string {\n const errorsByStatus = errorRiScs.reduce(\n (acc, risk) => {\n if (!acc[risk.status]) {\n acc[risk.status] = [];\n }\n acc[risk.status].push(risk.riScId);\n return acc;\n },\n {} as Record<ContentStatus, string[]>,\n );\n\n return Object.entries(errorsByStatus)\n .map(([status, riScIds]) => {\n // Fallback to Failure for unknown status values\n const validStatuses = Object.values(ContentStatus);\n const statusKey = validStatuses.includes(status as ContentStatus)\n ? status\n : ContentStatus.Failure;\n\n if (statusKey === ContentStatus.DecryptionFailed) {\n const decryptionRisks = errorRiScs.filter(\n risk =>\n risk.status === ContentStatus.DecryptionFailed &&\n riScIds.includes(risk.riScId),\n );\n\n const withErrorCode = decryptionRisks.filter(risk => risk.errorCode);\n const withoutErrorCode = decryptionRisks.filter(\n risk => !risk.errorCode,\n );\n\n const messages: string[] = [];\n\n if (withErrorCode.length > 0) {\n const decryptionErrorsByMessage = withErrorCode.reduce(\n (acc, risk) => {\n const message = risk.errorCode!;\n if (!acc[message]) acc[message] = [];\n acc[message].push(risk.riScId);\n return acc;\n },\n {} as Record<string, string[]>,\n );\n\n Object.entries(decryptionErrorsByMessage).forEach(\n ([message, ids]) => {\n const errorKey = `errorMessages.ContentStatusDecryptionFailedMessage.${message}`;\n messages.push(\n t(errorKey as any, { riScId: ids.join(', '), status }),\n );\n },\n );\n }\n\n if (withoutErrorCode.length > 0) {\n const errorKey = `errorMessages.ContentStatus${statusKey}`;\n messages.push(\n t(errorKey as any, {\n riScId: withoutErrorCode.map(r => r.riScId).join(', '),\n status,\n }),\n );\n }\n\n return messages.join('\\n');\n }\n\n const errorKey = `errorMessages.ContentStatus${statusKey}`;\n return t(errorKey as any, {\n riScId: (riScIds as string[]).join(', '),\n status,\n });\n })\n .join('\\n');\n}\n"],"names":["errorKey"],"mappings":"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"}
@@ -128,8 +128,8 @@ function useAuthenticatedFetch() {
128
128
  uriToFetchAllRiScs,
129
129
  "GET",
130
130
  onSuccess,
131
- (_, rejectedLogin) => {
132
- if (onError) onError(rejectedLogin);
131
+ (error, rejectedLogin) => {
132
+ if (onError) onError(error, rejectedLogin);
133
133
  }
134
134
  );
135
135
  } else {
@@ -137,8 +137,8 @@ function useAuthenticatedFetch() {
137
137
  uriToFetchAllRiScs,
138
138
  "GET",
139
139
  onSuccess,
140
- (_, rejectedLogin) => {
141
- if (onError) onError(rejectedLogin);
140
+ (error, rejectedLogin) => {
141
+ if (onError) onError(error, rejectedLogin);
142
142
  }
143
143
  );
144
144
  }