Skip to content

Commit c81c708

Browse files
authored
Merge pull request #1011 from navikt/feature/handle-404-for-mellomlagring
Feature/handle 404 for mellomlagring
2 parents a960c7c + 32abf9f commit c81c708

File tree

11 files changed

+187
-49
lines changed

11 files changed

+187
-49
lines changed

packages/fyllut-backend/src/routers/api/helpers/sendInn.ts

+23-8
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,7 @@ interface HovedDokument {
1717
document: string | null;
1818
}
1919

20-
export interface Attachment {
20+
interface Attachment {
2121
vedleggsnr: string;
2222
tittel: string;
2323
label: string;
@@ -28,7 +28,7 @@ export interface Attachment {
2828
vedleggskjema?: string;
2929
}
3030

31-
export interface SendInnSoknadBody {
31+
interface SendInnSoknadBody {
3232
brukerId: string;
3333
skjemanr: string;
3434
skjemapath: string;
@@ -49,13 +49,13 @@ const isValidUuid = (innsendingsId: string): boolean => {
4949
};
5050

5151
const DEFAULT_LANGUAGE = 'nb-NO';
52-
export const objectToByteArray = (obj: object) => Array.from(new TextEncoder().encode(JSON.stringify(obj)));
52+
const objectToByteArray = (obj: object) => Array.from(new TextEncoder().encode(JSON.stringify(obj)));
5353

54-
export const byteArrayToObject = (byteArray?: Buffer) => JSON.parse(new TextDecoder().decode(byteArray));
54+
const byteArrayToObject = (byteArray?: Buffer) => JSON.parse(new TextDecoder().decode(byteArray));
5555

56-
export const sanitizeInnsendingsId = (innsendingsId: string) => innsendingsId.replace(/[./]/g, '');
56+
const sanitizeInnsendingsId = (innsendingsId: string) => innsendingsId.replace(/[./]/g, '');
5757

58-
export const validateInnsendingsId = (innsendingsId: string | undefined, supplementaryMessage?: string) => {
58+
const validateInnsendingsId = (innsendingsId: string | undefined, supplementaryMessage?: string) => {
5959
let errorMessage;
6060
if (!innsendingsId) {
6161
errorMessage = 'InnsendingsId mangler.';
@@ -71,7 +71,7 @@ export const validateInnsendingsId = (innsendingsId: string | undefined, supplem
7171
return errorMessage;
7272
};
7373

74-
export const isMellomLagringEnabled = (featureToggles: FeatureTogglesMap) => {
74+
const isMellomLagringEnabled = (featureToggles: FeatureTogglesMap) => {
7575
if (!featureToggles?.enableMellomlagring) {
7676
logger.debug('Mellomlagring not enabled, returning data in body');
7777
return false;
@@ -84,7 +84,7 @@ export const isMellomLagringEnabled = (featureToggles: FeatureTogglesMap) => {
8484
return true;
8585
};
8686

87-
export const assembleSendInnSoknadBody = (
87+
const assembleSendInnSoknadBody = (
8888
requestBody: {
8989
form: NavFormType;
9090
submission: Submission;
@@ -159,3 +159,18 @@ export const assembleSendInnSoknadBody = (
159159

160160
return body;
161161
};
162+
163+
const isNotFound = (response: { status: number }, responseError: Error | undefined) =>
164+
response.status === 404 ||
165+
responseError?.['http_response_body']?.errorCode === 'illegalAction.applicationSentInOrDeleted';
166+
167+
export {
168+
assembleSendInnSoknadBody,
169+
byteArrayToObject,
170+
isMellomLagringEnabled,
171+
isNotFound,
172+
objectToByteArray,
173+
sanitizeInnsendingsId,
174+
validateInnsendingsId,
175+
};
176+
export type { Attachment, SendInnSoknadBody };

packages/fyllut-backend/src/routers/api/send-inn-soknad.ts

+27-6
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@ import {
1010
assembleSendInnSoknadBody,
1111
byteArrayToObject,
1212
isMellomLagringEnabled,
13+
isNotFound,
1314
sanitizeInnsendingsId,
1415
validateInnsendingsId,
1516
} from './helpers/sendInn';
@@ -57,12 +58,11 @@ const sendInnSoknad = {
5758
`Feil ved kall til SendInn. ${getErrorMessage}`,
5859
true,
5960
);
60-
if (
61-
sendInnResponse.status === 404 ||
62-
responseError?.['http_response_body']?.errorCode === 'illegalAction.applicationSentInOrDeleted'
63-
) {
61+
if (isNotFound(sendInnResponse, responseError)) {
62+
logger.info(`${sanitizedInnsendingsId}: Not found. Failed to get`, responseError);
6463
return res.sendStatus(404);
6564
}
65+
6666
logger.debug('Failed to fetch data from SendInn');
6767
return next(responseError);
6868
}
@@ -115,6 +115,7 @@ const sendInnSoknad = {
115115
next(err);
116116
}
117117
},
118+
118119
put: async (req: Request, res: Response, next: NextFunction) => {
119120
try {
120121
const idportenPid = getIdportenPid(req);
@@ -152,8 +153,18 @@ const sendInnSoknad = {
152153
logger.debug('Successfylly updated data in SendInn');
153154
res.json(await sendInnResponse.json());
154155
} else {
156+
const responseError = await responseToError(
157+
sendInnResponse,
158+
`Feil ved kall til SendInn. ${putErrorMessage}`,
159+
true,
160+
);
161+
if (isNotFound(sendInnResponse, responseError)) {
162+
logger.info(`${sanitizedInnsendingsId}: Not found. Failed to update`, responseError);
163+
return res.sendStatus(404);
164+
}
165+
155166
logger.debug('Failed to update data in SendInn');
156-
next(await responseToError(sendInnResponse, `Feil ved kall til SendInn. ${putErrorMessage}`, true));
167+
next(responseError);
157168
}
158169
} catch (err) {
159170
next(err);
@@ -192,8 +203,18 @@ const sendInnSoknad = {
192203
const json = await sendInnResponse.json();
193204
res.json(json);
194205
} else {
206+
const responseError = await responseToError(
207+
sendInnResponse,
208+
`Feil ved kall til SendInn. ${deleteErrorMessage}`,
209+
true,
210+
);
211+
if (isNotFound(sendInnResponse, responseError)) {
212+
logger.info(`${sanitizedInnsendingsId}: Not found. Failed to delete`, responseError);
213+
return res.sendStatus(404);
214+
}
215+
195216
logger.debug(`Failed to delete soknad with innsendingsId ${sanitizedInnsendingsId}`);
196-
next(await responseToError(sendInnResponse, `Feil ved kall til SendInn. ${deleteErrorMessage}`, true));
217+
next(responseError);
197218
}
198219
} catch (err) {
199220
next(err);

packages/fyllut-backend/src/routers/api/send-inn-utfylt-soknad.ts

+8-1
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@ import { createPdfAsByteArray } from './helpers/pdfService';
99
import {
1010
assembleSendInnSoknadBody,
1111
isMellomLagringEnabled,
12+
isNotFound,
1213
sanitizeInnsendingsId,
1314
validateInnsendingsId,
1415
} from './helpers/sendInn';
@@ -74,8 +75,14 @@ const sendInnUtfyltSoknad = {
7475
});
7576
res.sendStatus(201);
7677
} else {
78+
const responseError = await responseToError(sendInnResponse, 'Feil ved kall til SendInn', true);
79+
if (isNotFound(sendInnResponse, responseError)) {
80+
logger.info(`${sanitizedInnsendingsId}: Not found. Failed to submit`, responseError);
81+
return res.sendStatus(404);
82+
}
83+
7784
logger.debug('Failed to post data to SendInn');
78-
next(await responseToError(sendInnResponse, 'Feil ved kall til SendInn', true));
85+
next(responseError);
7986
}
8087
} catch (err) {
8188
next(err);

packages/shared-components/src/components/button/navigation/digital-submission/DigitalSubmissionButton.tsx

+11-2
Original file line numberDiff line numberDiff line change
@@ -10,12 +10,20 @@ import { useSendInn } from '../../../../context/sendInn/sendInnContext';
1010
export interface Props {
1111
submission?: Submission;
1212
isValid?: (e: React.MouseEvent<HTMLElement>) => boolean;
13-
onError: Function;
13+
onError: (err: Error) => void;
14+
onDone?: () => void;
1415
children: string;
1516
withIcon?: boolean;
1617
}
1718

18-
const DigitalSubmissionButton = ({ submission, isValid, onError, children, withIcon = false }: Props) => {
19+
const DigitalSubmissionButton = ({
20+
submission,
21+
isValid,
22+
onError,
23+
onDone = () => {},
24+
children,
25+
withIcon = false,
26+
}: Props) => {
1927
const { loggNavigering } = useAmplitude();
2028
const { app } = useAppConfig();
2129
const { translate } = useLanguages();
@@ -44,6 +52,7 @@ const DigitalSubmissionButton = ({ submission, isValid, onError, children, withI
4452
onError(err);
4553
} finally {
4654
setLoading(false);
55+
onDone();
4756
}
4857
};
4958

packages/shared-components/src/components/submission/DigitalSubmissionWithPrompt.tsx

+1
Original file line numberDiff line numberDiff line change
@@ -44,6 +44,7 @@ const DigitalSubmissionWithPrompt = ({ submission, isValid, onError }: Props) =>
4444
onError(err);
4545
setIsOpen(false);
4646
}}
47+
onDone={() => setIsOpen(false)}
4748
>
4849
{translate(TEXTS.grensesnitt.submitToNavPrompt.confirm)}
4950
</DigitalSubmissionButton>

packages/shared-components/src/components/summary/navigation/SummaryPageNavigation.tsx

+7
Original file line numberDiff line numberDiff line change
@@ -70,6 +70,13 @@ const SummaryPageNavigation = ({ form, submission, formUrl, panelValidationList,
7070
<Heading size="small" level="4">
7171
{translate(mellomlagringError.title)}
7272
</Heading>
73+
{mellomlagringError.linkText && (
74+
<p>
75+
{translate(mellomlagringError.messageStart)}
76+
<a href={translate(mellomlagringError.url)}>{translate(mellomlagringError.linkText)}</a>
77+
{translate(mellomlagringError.messageEnd)}
78+
</p>
79+
)}
7380
{translate(mellomlagringError.message, mellomlagringError?.messageParams)}
7481
</Alert>
7582
)}

packages/shared-components/src/context/sendInn/reducer/mellomlagringReducer.ts

+33-6
Original file line numberDiff line numberDiff line change
@@ -30,38 +30,65 @@ export const mellomlagringReducer = (
3030

3131
const getError = (type: ErrorType, savedDate?: string): MellomlagringError => {
3232
switch (type) {
33-
case 'GET FAILED':
33+
case 'GET_FAILED':
3434
return {
3535
type,
3636
title: TEXTS.statiske.mellomlagringError.get.title,
3737
message: TEXTS.statiske.mellomlagringError.get.message,
3838
};
39-
case 'CREATE FAILED':
39+
case 'CREATE_FAILED':
4040
return {
4141
type,
4242
title: TEXTS.statiske.mellomlagringError.create.title,
4343
message: TEXTS.statiske.mellomlagringError.create.message,
4444
};
45-
case 'UPDATE FAILED':
45+
case 'UPDATE_FAILED':
4646
return {
4747
type,
4848
title: TEXTS.statiske.mellomlagringError.update.title,
4949
message: TEXTS.statiske.mellomlagringError.update.message,
5050
};
51-
case 'DELETE FAILED':
51+
case 'UPDATE_FAILED_NOT_FOUND':
52+
return {
53+
type,
54+
title: TEXTS.statiske.mellomlagringError.updateNotFound.title,
55+
messageStart: TEXTS.statiske.mellomlagringError.updateNotFound.messageStart,
56+
messageEnd: TEXTS.statiske.mellomlagringError.updateNotFound.messageEnd,
57+
linkText: TEXTS.statiske.external.minSide.linkText,
58+
url: TEXTS.statiske.external.minSide.url,
59+
};
60+
case 'DELETE_FAILED':
5261
return {
5362
type,
5463
title: TEXTS.statiske.mellomlagringError.delete.title,
5564
message: TEXTS.statiske.mellomlagringError.delete.message,
5665
};
57-
case 'SUBMIT FAILED':
66+
case 'DELETE_FAILED_NOT_FOUND':
67+
return {
68+
type,
69+
title: TEXTS.statiske.mellomlagringError.deleteNotFound.title,
70+
messageStart: TEXTS.statiske.mellomlagringError.deleteNotFound.messageStart,
71+
messageEnd: TEXTS.statiske.mellomlagringError.deleteNotFound.messageEnd,
72+
linkText: TEXTS.statiske.external.minSide.linkText,
73+
url: TEXTS.statiske.external.minSide.url,
74+
};
75+
case 'SUBMIT_FAILED_NOT_FOUND':
76+
return {
77+
type,
78+
title: TEXTS.statiske.mellomlagringError.submitNotFound.title,
79+
messageStart: TEXTS.statiske.mellomlagringError.submitNotFound.messageStart,
80+
messageEnd: TEXTS.statiske.mellomlagringError.submitNotFound.messageEnd,
81+
linkText: TEXTS.statiske.external.minSide.linkText,
82+
url: TEXTS.statiske.external.minSide.url,
83+
};
84+
case 'SUBMIT_FAILED':
5885
return {
5986
type,
6087
title: TEXTS.statiske.mellomlagringError.submit.title,
6188
message: TEXTS.statiske.mellomlagringError.submit.draftSaved,
6289
messageParams: { date: savedDate },
6390
};
64-
case 'SUBMIT AND UPDATE FAILED':
91+
case 'SUBMIT_AND_UPDATE_FAILED':
6592
const draftSavedMessage = savedDate
6693
? {
6794
message: TEXTS.statiske.mellomlagringError.submit.draftSaved,

packages/shared-components/src/context/sendInn/sendInnContext.tsx

+35-18
Original file line numberDiff line numberDiff line change
@@ -134,7 +134,7 @@ const SendInnProvider = ({
134134
return;
135135
}
136136
logger?.error(`${innsendingsIdFromParams}: Failed to retrieve mellomlagring`, error as Error);
137-
dispatchFyllutMellomlagring({ type: 'error', error: 'GET FAILED' });
137+
dispatchFyllutMellomlagring({ type: 'error', error: 'GET_FAILED' });
138138
setInitStatus('error');
139139
}
140140
};
@@ -199,7 +199,7 @@ const SendInnProvider = ({
199199
}
200200
return response;
201201
} catch (error: any) {
202-
dispatchFyllutMellomlagring({ type: 'error', error: 'CREATE FAILED' });
202+
dispatchFyllutMellomlagring({ type: 'error', error: 'CREATE_FAILED' });
203203
logger?.error('Failed to create mellomlagring', error);
204204
}
205205
};
@@ -223,10 +223,15 @@ const SendInnProvider = ({
223223
logger?.info(`${innsendingsId}: Mellomlagring was updated`);
224224
dispatchFyllutMellomlagring({ type: 'update', response });
225225
return response;
226-
} catch (error) {
227-
dispatchFyllutMellomlagring({ type: 'error', error: 'UPDATE FAILED' });
228-
logger?.error(`${innsendingsId}: Failed to update mellomlagring`, error as Error);
229-
throw error;
226+
} catch (error: any) {
227+
if (error.status === 404) {
228+
dispatchFyllutMellomlagring({ type: 'error', error: 'UPDATE_FAILED_NOT_FOUND' });
229+
throw error;
230+
} else {
231+
dispatchFyllutMellomlagring({ type: 'error', error: 'UPDATE_FAILED' });
232+
logger?.error(`${innsendingsId}: Failed to update mellomlagring`, error as Error);
233+
throw error;
234+
}
230235
}
231236
};
232237

@@ -239,10 +244,15 @@ const SendInnProvider = ({
239244
const response = await deleteSoknad(appConfig, innsendingsId);
240245
logger?.info(`${innsendingsId}: Mellomlagring was deleted`);
241246
return response;
242-
} catch (error) {
243-
dispatchFyllutMellomlagring({ type: 'error', error: 'DELETE FAILED' });
244-
logger?.error(`${innsendingsId}: Failed to delete mellomlagring`, error as Error);
245-
throw error;
247+
} catch (error: any) {
248+
if (error.status === 404) {
249+
dispatchFyllutMellomlagring({ type: 'error', error: 'DELETE_FAILED_NOT_FOUND' });
250+
throw error;
251+
} else {
252+
dispatchFyllutMellomlagring({ type: 'error', error: 'DELETE_FAILED' });
253+
logger?.error(`${innsendingsId}: Failed to delete mellomlagring`, error as Error);
254+
throw error;
255+
}
246256
}
247257
};
248258

@@ -273,14 +283,21 @@ const SendInnProvider = ({
273283
window.location.href = redirectLocation;
274284
}
275285
return response;
276-
} catch (submitError) {
277-
logger?.error(`${innsendingsId}: Failed to submit, will try to store changes`, submitError as Error);
278-
try {
279-
await updateSoknad(appConfig, form, submission, currentLanguage, translation, innsendingsId);
280-
dispatchFyllutMellomlagring({ type: 'error', error: 'SUBMIT FAILED' });
281-
} catch (updateError) {
282-
logger?.error(`${innsendingsId}: Failed to update mellomlagring after a failed submit`, updateError as Error);
283-
dispatchFyllutMellomlagring({ type: 'error', error: 'SUBMIT AND UPDATE FAILED' });
286+
} catch (submitError: any) {
287+
if (submitError.status === 404) {
288+
dispatchFyllutMellomlagring({ type: 'error', error: 'SUBMIT_FAILED_NOT_FOUND' });
289+
} else {
290+
logger?.error(`${innsendingsId}: Failed to submit, will try to store changes`, submitError as Error);
291+
try {
292+
await updateSoknad(appConfig, form, submission, currentLanguage, translation, innsendingsId);
293+
dispatchFyllutMellomlagring({ type: 'error', error: 'SUBMIT_FAILED' });
294+
} catch (updateError) {
295+
logger?.error(
296+
`${innsendingsId}: Failed to update mellomlagring after a failed submit`,
297+
updateError as Error,
298+
);
299+
dispatchFyllutMellomlagring({ type: 'error', error: 'SUBMIT_AND_UPDATE_FAILED' });
300+
}
284301
}
285302
}
286303
} else {

packages/shared-components/src/formio/template/templates/navdesign/wizardNav/form.ejs

+7-1
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,13 @@
99
<h4 class="navds-heading navds-heading--small">{{ctx.t(ctx.submission?.fyllutState?.mellomlagring?.error?.title)}}</h4>
1010
{% } %}
1111
<div class="navds-alert__wrapper">
12-
{{ctx.t(ctx.submission?.fyllutState?.mellomlagring?.error?.message)}}
12+
{% if (ctx.submission?.fyllutState?.mellomlagring?.error?.linkText) { %}
13+
{{ctx.t(ctx.submission?.fyllutState?.mellomlagring?.error?.messageStart)}}
14+
<a href={{ctx.t(ctx.submission?.fyllutState?.mellomlagring?.error?.url)}}>{{ctx.t(ctx.submission?.fyllutState?.mellomlagring?.error?.linkText)}}</a>
15+
{{ctx.t(ctx.submission?.fyllutState?.mellomlagring?.error?.messageEnd)}}
16+
{% } else { %}
17+
{{ctx.t(ctx.submission?.fyllutState?.mellomlagring?.error?.message)}}
18+
{% } %}
1319
</div>
1420
</div>
1521
</div>

0 commit comments

Comments
 (0)