-
Notifications
You must be signed in to change notification settings - Fork 4
Show errors 500 and 400 on preview #639
Changes from 22 commits
503a121
bfd46e7
a24267f
1fc63ba
ef15842
e18286c
6a312e5
480026d
81db5ef
084980e
ca4a42a
50d0092
8e4c5b7
703bd38
0d0ba75
29cd41b
5635678
102de13
06b813e
7a29917
43dd5d6
84c6f14
b88472e
1051621
77ee7b0
a6ae5ae
15bb1b7
3483a36
File filter
Filter by extension
Conversations
Jump to
Diff view
Diff view
There are no files selected for viewing
Original file line number | Diff line number | Diff line change | ||||||||||||||||||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
@@ -1,4 +1,4 @@ | ||||||||||||||||||||||||||||||
import React, { useState, useEffect } from "react"; | ||||||||||||||||||||||||||||||
import React, { useState, useEffect, useCallback } from "react"; | ||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||
import { IResource } from "@ahryman40k/ts-fhir-types/lib/R4"; | ||||||||||||||||||||||||||||||
import { Icon } from "@blueprintjs/core"; | ||||||||||||||||||||||||||||||
|
@@ -17,7 +17,9 @@ import { | |||||||||||||||||||||||||||||
useMediaQuery, | ||||||||||||||||||||||||||||||
} from "@material-ui/core"; | ||||||||||||||||||||||||||||||
import Alert, { Color } from "@material-ui/lab/Alert"; | ||||||||||||||||||||||||||||||
import { FetchBaseQueryError } from "@reduxjs/toolkit/dist/query"; | ||||||||||||||||||||||||||||||
import clsx from "clsx"; | ||||||||||||||||||||||||||||||
import { useSnackbar } from "notistack"; | ||||||||||||||||||||||||||||||
import { useTranslation } from "react-i18next"; | ||||||||||||||||||||||||||||||
import ReactJson from "react-json-view"; | ||||||||||||||||||||||||||||||
import { useParams } from "react-router-dom"; | ||||||||||||||||||||||||||||||
|
@@ -29,6 +31,10 @@ import { | |||||||||||||||||||||||||||||
useApiOwnersRetrieveQuery, | ||||||||||||||||||||||||||||||
useApiPreviewCreateMutation, | ||||||||||||||||||||||||||||||
} from "services/api/endpoints"; | ||||||||||||||||||||||||||||||
import { | ||||||||||||||||||||||||||||||
apiValidationErrorFromResponse, | ||||||||||||||||||||||||||||||
ApiValidationError, | ||||||||||||||||||||||||||||||
} from "services/api/errors"; | ||||||||||||||||||||||||||||||
import { | ||||||||||||||||||||||||||||||
ExplorationResponse, | ||||||||||||||||||||||||||||||
OperationOutcomeIssue, | ||||||||||||||||||||||||||||||
|
@@ -136,6 +142,7 @@ const getAlertSeverityFromOperationOutcomeIssue = ( | |||||||||||||||||||||||||||||
const Preview = (): JSX.Element => { | ||||||||||||||||||||||||||||||
const classes = useStyles(); | ||||||||||||||||||||||||||||||
const { t } = useTranslation(); | ||||||||||||||||||||||||||||||
const { enqueueSnackbar } = useSnackbar(); | ||||||||||||||||||||||||||||||
const prefersDarkMode = useMediaQuery("(prefers-color-scheme: dark)"); | ||||||||||||||||||||||||||||||
const { mappingId } = useParams<{ | ||||||||||||||||||||||||||||||
mappingId?: string; | ||||||||||||||||||||||||||||||
|
@@ -144,20 +151,19 @@ const Preview = (): JSX.Element => { | |||||||||||||||||||||||||||||
const [exploration, setExploration] = useState< | ||||||||||||||||||||||||||||||
ExplorationResponse | null | undefined | ||||||||||||||||||||||||||||||
>(undefined); | ||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||
const [alerts, setAlerts] = useState< | ||||||||||||||||||||||||||||||
AlertOperationOutcomeIssue[] | undefined | ||||||||||||||||||||||||||||||
>(undefined); | ||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||
const [preview, setPreview] = useState<IResource | undefined>(undefined); | ||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||
const handleAlertClose = (index: number) => { | ||||||||||||||||||||||||||||||
if (alerts) { | ||||||||||||||||||||||||||||||
const newAlerts = [...alerts]; | ||||||||||||||||||||||||||||||
newAlerts.splice(index, 1); | ||||||||||||||||||||||||||||||
setAlerts(newAlerts); | ||||||||||||||||||||||||||||||
} | ||||||||||||||||||||||||||||||
}; | ||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||
const [preview, setPreview] = useState<IResource | undefined>(undefined); | ||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||
const { data: mapping } = useApiResourcesRetrieveQuery( | ||||||||||||||||||||||||||||||
{ id: mappingId ?? "" }, | ||||||||||||||||||||||||||||||
{ skip: !mappingId } | ||||||||||||||||||||||||||||||
|
@@ -172,39 +178,59 @@ const Preview = (): JSX.Element => { | |||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||
const [apiExploreCreate] = useApiExploreCreateMutation(); | ||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||
useEffect(() => { | ||||||||||||||||||||||||||||||
if (mappingId && owner && exploration === undefined) { | ||||||||||||||||||||||||||||||
setExploration(null); | ||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||
const explore = async () => { | ||||||||||||||||||||||||||||||
try { | ||||||||||||||||||||||||||||||
const exploration = await apiExploreCreate({ | ||||||||||||||||||||||||||||||
explorationRequestRequest: { | ||||||||||||||||||||||||||||||
owner: owner?.name ?? "", | ||||||||||||||||||||||||||||||
table: mapping?.primary_key_table ?? "", | ||||||||||||||||||||||||||||||
resource_id: mappingId, | ||||||||||||||||||||||||||||||
}, | ||||||||||||||||||||||||||||||
}).unwrap(); | ||||||||||||||||||||||||||||||
setExploration(exploration); | ||||||||||||||||||||||||||||||
} catch (e) { | ||||||||||||||||||||||||||||||
setAlerts([ | ||||||||||||||||||||||||||||||
const handleValidationError = useCallback( | ||||||||||||||||||||||||||||||
( | ||||||||||||||||||||||||||||||
errors: ApiValidationError<unknown> | undefined, | ||||||||||||||||||||||||||||||
errorType: number | "FETCH_ERROR" | "PARSING_ERROR" | "CUSTOM_ERROR", | ||||||||||||||||||||||||||||||
errorField: string | ||||||||||||||||||||||||||||||
) => { | ||||||||||||||||||||||||||||||
if (errors) { | ||||||||||||||||||||||||||||||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Declaring your props this way should raise you an error for defining facultative arguments before required ones You can prevent this like this :
Suggested change
|
||||||||||||||||||||||||||||||
const errorEntries = Object.entries(errors); | ||||||||||||||||||||||||||||||
errorEntries.forEach(([key, text]) => { | ||||||||||||||||||||||||||||||
enqueueSnackbar( | ||||||||||||||||||||||||||||||
t<string>("catchValidationErrorPrompt", { | ||||||||||||||||||||||||||||||
query: errorField, | ||||||||||||||||||||||||||||||
errorStatus: errorType, | ||||||||||||||||||||||||||||||
errorKey: key, | ||||||||||||||||||||||||||||||
errorText: text, | ||||||||||||||||||||||||||||||
}), | ||||||||||||||||||||||||||||||
{ | ||||||||||||||||||||||||||||||
severity: "error", | ||||||||||||||||||||||||||||||
diagnostics: e.error, | ||||||||||||||||||||||||||||||
code: "internal", | ||||||||||||||||||||||||||||||
}, | ||||||||||||||||||||||||||||||
]); | ||||||||||||||||||||||||||||||
} | ||||||||||||||||||||||||||||||
}; | ||||||||||||||||||||||||||||||
explore(); | ||||||||||||||||||||||||||||||
} | ||||||||||||||||||||||||||||||
}, [ | ||||||||||||||||||||||||||||||
apiExploreCreate, | ||||||||||||||||||||||||||||||
exploration, | ||||||||||||||||||||||||||||||
mapping?.primary_key_table, | ||||||||||||||||||||||||||||||
mappingId, | ||||||||||||||||||||||||||||||
owner, | ||||||||||||||||||||||||||||||
]); | ||||||||||||||||||||||||||||||
variant: "error", | ||||||||||||||||||||||||||||||
} | ||||||||||||||||||||||||||||||
); | ||||||||||||||||||||||||||||||
}); | ||||||||||||||||||||||||||||||
} | ||||||||||||||||||||||||||||||
}, | ||||||||||||||||||||||||||||||
[enqueueSnackbar, t] | ||||||||||||||||||||||||||||||
); | ||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||
const handleError = useCallback( | ||||||||||||||||||||||||||||||
(error: FetchBaseQueryError) => { | ||||||||||||||||||||||||||||||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Casting the error variable here doesn't raise any eslint error? There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. No it doesn't There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Nvm I thought we were in a catch statement There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Nvm I thought we were in a catch statement |
||||||||||||||||||||||||||||||
const typedError = error; | ||||||||||||||||||||||||||||||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. What does this line do? There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. nothing anymore, i forgot to delete it |
||||||||||||||||||||||||||||||
const validationError = apiValidationErrorFromResponse(typedError); | ||||||||||||||||||||||||||||||
if (validationError) | ||||||||||||||||||||||||||||||
handleValidationError(validationError, typedError.status, "Preview"); | ||||||||||||||||||||||||||||||
else if (typedError.status === "PARSING_ERROR") { | ||||||||||||||||||||||||||||||
enqueueSnackbar( | ||||||||||||||||||||||||||||||
t<string>("catchValidationErrorPrompt", { | ||||||||||||||||||||||||||||||
query: typedError.status, | ||||||||||||||||||||||||||||||
errorStatus: typedError.originalStatus.toString(), | ||||||||||||||||||||||||||||||
errorText: typedError.error, | ||||||||||||||||||||||||||||||
}), | ||||||||||||||||||||||||||||||
{ variant: "error" } | ||||||||||||||||||||||||||||||
); | ||||||||||||||||||||||||||||||
} else if ( | ||||||||||||||||||||||||||||||
(typedError.status === "FETCH_ERROR" || | ||||||||||||||||||||||||||||||
typedError.status === "CUSTOM_ERROR") && | ||||||||||||||||||||||||||||||
typedError.data | ||||||||||||||||||||||||||||||
) { | ||||||||||||||||||||||||||||||
enqueueSnackbar(`${typedError.status} : ${typedError.data as string}`, { | ||||||||||||||||||||||||||||||
variant: "error", | ||||||||||||||||||||||||||||||
}); | ||||||||||||||||||||||||||||||
} | ||||||||||||||||||||||||||||||
}, | ||||||||||||||||||||||||||||||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. This is facultative, but maybe using a switch statement on the |
||||||||||||||||||||||||||||||
[enqueueSnackbar, handleValidationError, t] | ||||||||||||||||||||||||||||||
); | ||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||
const [apiPreviewCreate] = useApiPreviewCreateMutation(); | ||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||
|
@@ -230,21 +256,46 @@ const Preview = (): JSX.Element => { | |||||||||||||||||||||||||||||
severity: getAlertSeverityFromOperationOutcomeIssue(error), | ||||||||||||||||||||||||||||||
})) | ||||||||||||||||||||||||||||||
); | ||||||||||||||||||||||||||||||
} catch (e) { | ||||||||||||||||||||||||||||||
setAlerts([ | ||||||||||||||||||||||||||||||
{ | ||||||||||||||||||||||||||||||
severity: "error", | ||||||||||||||||||||||||||||||
diagnostics: e.error, | ||||||||||||||||||||||||||||||
code: "internal", | ||||||||||||||||||||||||||||||
}, | ||||||||||||||||||||||||||||||
]); | ||||||||||||||||||||||||||||||
} catch (error) { | ||||||||||||||||||||||||||||||
handleError(error as FetchBaseQueryError); | ||||||||||||||||||||||||||||||
} | ||||||||||||||||||||||||||||||
}; | ||||||||||||||||||||||||||||||
previewCreate(); | ||||||||||||||||||||||||||||||
} | ||||||||||||||||||||||||||||||
} | ||||||||||||||||||||||||||||||
}; | ||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||
// load the data for the table preview list | ||||||||||||||||||||||||||||||
useEffect(() => { | ||||||||||||||||||||||||||||||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Could you add a small comment explaining what this useEffect does? |
||||||||||||||||||||||||||||||
if (mappingId && owner && exploration === undefined) { | ||||||||||||||||||||||||||||||
setExploration(null); | ||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||
const explore = async () => { | ||||||||||||||||||||||||||||||
try { | ||||||||||||||||||||||||||||||
const exploration = await apiExploreCreate({ | ||||||||||||||||||||||||||||||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. You are shadowing the |
||||||||||||||||||||||||||||||
explorationRequestRequest: { | ||||||||||||||||||||||||||||||
owner: owner?.name ?? "", | ||||||||||||||||||||||||||||||
table: mapping?.primary_key_table ?? "", | ||||||||||||||||||||||||||||||
resource_id: mappingId, | ||||||||||||||||||||||||||||||
}, | ||||||||||||||||||||||||||||||
}).unwrap(); | ||||||||||||||||||||||||||||||
setExploration(exploration); | ||||||||||||||||||||||||||||||
} catch (error) { | ||||||||||||||||||||||||||||||
handleError(error as FetchBaseQueryError); | ||||||||||||||||||||||||||||||
} | ||||||||||||||||||||||||||||||
}; | ||||||||||||||||||||||||||||||
explore(); | ||||||||||||||||||||||||||||||
} | ||||||||||||||||||||||||||||||
}, [ | ||||||||||||||||||||||||||||||
apiExploreCreate, | ||||||||||||||||||||||||||||||
exploration, | ||||||||||||||||||||||||||||||
mapping?.primary_key_table, | ||||||||||||||||||||||||||||||
mappingId, | ||||||||||||||||||||||||||||||
owner, | ||||||||||||||||||||||||||||||
handleError, | ||||||||||||||||||||||||||||||
enqueueSnackbar, | ||||||||||||||||||||||||||||||
]); | ||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||
return ( | ||||||||||||||||||||||||||||||
<Container className={classes.container} maxWidth="xl"> | ||||||||||||||||||||||||||||||
<BackButton className={classes.button} /> | ||||||||||||||||||||||||||||||
|
@@ -300,7 +351,7 @@ const Preview = (): JSX.Element => { | |||||||||||||||||||||||||||||
<Alert | ||||||||||||||||||||||||||||||
key={index} | ||||||||||||||||||||||||||||||
className={classes.alert} | ||||||||||||||||||||||||||||||
severity={issue.severity} | ||||||||||||||||||||||||||||||
severity={issue.severity as Color} | ||||||||||||||||||||||||||||||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more.
|
||||||||||||||||||||||||||||||
onClose={() => handleAlertClose(index)} | ||||||||||||||||||||||||||||||
> | ||||||||||||||||||||||||||||||
{issue.diagnostics} | ||||||||||||||||||||||||||||||
|
@@ -318,8 +369,8 @@ const Preview = (): JSX.Element => { | |||||||||||||||||||||||||||||
) : ( | ||||||||||||||||||||||||||||||
<div className={classes.texts}> | ||||||||||||||||||||||||||||||
<Typography> | ||||||||||||||||||||||||||||||
{t("clickOnAFireIcon")}{" "} | ||||||||||||||||||||||||||||||
<Icon icon={IconNames.FLAME} className={classes.iconFlame} />{" "} | ||||||||||||||||||||||||||||||
{t("clickOnAFireIcon")} | ||||||||||||||||||||||||||||||
<Icon icon={IconNames.FLAME} className={classes.iconFlame} /> | ||||||||||||||||||||||||||||||
{t("inOrderToPreview")} | ||||||||||||||||||||||||||||||
</Typography> | ||||||||||||||||||||||||||||||
</div> | ||||||||||||||||||||||||||||||
|
Original file line number | Diff line number | Diff line change |
---|---|---|
|
@@ -943,7 +943,7 @@ export type ApiConditionsDestroyApiArg = { | |
id: string; | ||
}; | ||
export type ApiCoreVersionRetrieveApiResponse = unknown; | ||
export type ApiCoreVersionRetrieveApiArg = {}; | ||
export type ApiCoreVersionRetrieveApiArg = void; | ||
export type ApiCredentialsListApiResponse = /** status 200 */ Credential[]; | ||
export type ApiCredentialsListApiArg = { | ||
/** Which field to use when ordering the results. */ | ||
|
@@ -1462,14 +1462,14 @@ export type PatchedOwnerRequest = { | |
name?: string; | ||
credential?: string; | ||
}; | ||
export type SeverityEnum = "fatal" | "error" | "warning" | "information"; | ||
export type OperationOutcomeIssue = { | ||
severity: SeverityEnum; | ||
severity: string; | ||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. You definitely shouldn't have those changes in your PR. I guess the merge you made was not from the latest commit of |
||
code: string; | ||
diagnostics: string; | ||
location: string[]; | ||
expression: string; | ||
location?: string[]; | ||
expression?: string; | ||
}; | ||
export type SeverityEnum = "fatal" | "error" | "warning" | "information"; | ||
export type PreviewResponse = { | ||
instances: { | ||
[key: string]: any; | ||
|
Original file line number | Diff line number | Diff line change |
---|---|---|
|
@@ -3433,6 +3433,27 @@ components: | |
- id | ||
- name | ||
- schema | ||
OperationOutcomeIssue: | ||
type: object | ||
properties: | ||
severity: | ||
type: string | ||
code: | ||
type: string | ||
diagnostics: | ||
type: string | ||
location: | ||
type: array | ||
items: | ||
type: string | ||
expression: | ||
type: string | ||
required: | ||
- code | ||
- diagnostics | ||
- expression | ||
- location | ||
- severity | ||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. I don't know why this is here. From v4 branch, OperationOutcomeIssue:
type: object
properties:
severity:
$ref: '#/components/schemas/SeverityEnum'
code:
type: string
diagnostics:
type: string
location:
type: array
items:
type: string
expression:
type: string
required:
- code
- diagnostics
- expression
- location
- severity |
||
OwnerRequest: | ||
type: object | ||
properties: | ||
|
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,11 @@ | ||
# name: test_inmemory_fhir_api_validate | ||
<class 'dict'> { | ||
'issue': <class 'list'> [ | ||
], | ||
'resourceType': 'OperationOutcome', | ||
'text': <class 'dict'> { | ||
'div': '<p> it went fine bro </p>', | ||
'status': 'generated', | ||
}, | ||
} | ||
--- | ||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. I don't know what is this doing here? @simonvadee @tevariou any idea? There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. must be removed (remains from the merge I guess) |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.