From 2ec34d3e6890adea237aaab5e6ffa3fa923f6a86 Mon Sep 17 00:00:00 2001 From: Aleksei Poroshin <69150024+poroshinaleksei@users.noreply.github.com> Date: Tue, 20 Dec 2022 10:15:59 +0100 Subject: [PATCH] Migrering felles api (#1282) * Migrering felles api --- Dockerfile | 1 + Dockerfile.web-cypress | 2 + .../integration-utils/contextConfig.ts | 8 +- .../integration-utils/mocks/mellomlagring.ts | 4 +- .../integration-utils/steps/periode.ts | 5 - e2e/docker-compose.yml | 50 ++--- envSettings.js | 6 + nais/dev-gcp.json | 13 +- nais/naiserator.yml | 10 +- nais/prod-gcp.json | 12 +- package-lock.json | 183 +++++++++++++++--- package.json | 6 +- server.js | 110 +++++++++-- server/api-mock.js | 27 +-- "server/mockdata/depr_s\303\270knad.json" | 2 - "server/mockdata/s\303\270knad.json" | 2 - src/app/api/__tests__/api.test.ts | 16 +- src/app/api/api.ts | 29 +-- src/app/api/utils/apiUtils.ts | 4 +- .../FormikFileUploader.tsx | 3 +- src/app/config/axiosConfig.ts | 6 +- src/app/i18n/nb.json | 69 +++---- .../info/OmsorgstilbudInfo.tsx" | 65 +++++-- .../AnnetBarnPart.tsx" | 11 +- .../OpplysningerOmBarnetStep.tsx" | 1 + .../oppsummering-step/OppsummeringStep.tsx" | 16 -- .../tidsrom-step/TidsromStep.tsx" | 22 --- src/app/types/ResourceType.ts | 11 +- "src/app/types/S\303\270knadFormValues.ts" | 6 - .../types/S\303\270knadTempStorageData.ts" | 2 +- .../S\303\270knadApiData.ts" | 4 +- .../s\303\270knadsdata/S\303\270knadsdata.ts" | 3 - .../meds\303\270kerS\303\270knadsdata.ts" | 5 - src/app/utils/attachmentUtilsAuthToken.ts | 12 ++ ...Meds\303\270kerS\303\270knadsdata.test.ts" | 28 --- ...tractMeds\303\270kerS\303\270knadsdata.ts" | 18 -- .../getS\303\270knadsdataFromFormValues.ts" | 2 - .../extractTidsromFormValues.test.ts" | 33 ---- .../extractTidsromFormValues.ts" | 13 +- ...entsApiDataFromS\303\270knadsdata.test.ts" | 3 + .../getApiDataFromS\303\270knadsdata.ts" | 2 - ...tachmentsApiDataFromS\303\270knadsdata.ts" | 4 +- ...03\270kerApiDataFromS\303\270knadsdata.ts" | 17 -- src/build/scripts/heroku-build.js | 4 +- tokenx.js | 57 ++++++ 45 files changed, 530 insertions(+), 377 deletions(-) delete mode 100644 "src/app/types/s\303\270knadsdata/meds\303\270kerS\303\270knadsdata.ts" create mode 100644 src/app/utils/attachmentUtilsAuthToken.ts delete mode 100644 "src/app/utils/formValuesToS\303\270knadsdata/__tests__/extractMeds\303\270kerS\303\270knadsdata.test.ts" delete mode 100644 "src/app/utils/formValuesToS\303\270knadsdata/extractMeds\303\270kerS\303\270knadsdata.ts" delete mode 100644 "src/app/utils/s\303\270knadsdataToApiData/getMeds\303\270kerApiDataFromS\303\270knadsdata.ts" create mode 100644 tokenx.js diff --git a/Dockerfile b/Dockerfile index 56a5c4751..5ee479865 100644 --- a/Dockerfile +++ b/Dockerfile @@ -4,6 +4,7 @@ WORKDIR /usr/src/app COPY dist ./dist COPY server.js . +COPY tokenx.js . COPY node_modules ./node_modules COPY package.json . COPY src/build/scripts/decorator.js ./src/build/scripts/decorator.js diff --git a/Dockerfile.web-cypress b/Dockerfile.web-cypress index 399d02ce0..f02c1423c 100644 --- a/Dockerfile.web-cypress +++ b/Dockerfile.web-cypress @@ -2,6 +2,8 @@ FROM node:16-alpine WORKDIR /usr/src/app ENV API_URL=http://api-mock:8082 +ENV FRONTEND_API_PATH=http://api-mock:8082 +ENV FRONTEND_VEDLEGG_URL=http://localhost:8080/api ENV PUBLIC_PATH=/familie/sykdom-i-familien/soknad/pleiepenger COPY . . RUN apk update && apk add bash && apk add curl diff --git a/e2e/cypress/integration-utils/contextConfig.ts b/e2e/cypress/integration-utils/contextConfig.ts index 013a8b298..aa53462c7 100644 --- a/e2e/cypress/integration-utils/contextConfig.ts +++ b/e2e/cypress/integration-utils/contextConfig.ts @@ -15,10 +15,10 @@ interface ConfigProps { export const contextConfig = (props?: ConfigProps) => { const { mellomlagring, step, arbeidsgivere } = props || {}; beforeEach('intercept mellomlagring og levere tomt objekt', () => { - cy.intercept(`GET`, `/mellomlagring*`, mellomlagring || {}); - cy.intercept('GET', `/arbeidsgiver*`, arbeidsgivere || cyApiMockData.arbeidsgivereMock); - cy.intercept('GET', `/soker*`, cyApiMockData.søkerMock); - cy.intercept('GET', `/barn*`, cyApiMockData.barnMock); + cy.intercept(`GET`, `/mellomlagring/PLEIEPENGER_SYKT_BARN*`, mellomlagring || {}); + cy.intercept('GET', `/oppslag/arbeidsgiver*`, arbeidsgivere || cyApiMockData.arbeidsgivereMock); + cy.intercept('GET', `/oppslag/soker*`, cyApiMockData.søkerMock); + cy.intercept('GET', `/oppslag/barn*`, cyApiMockData.barnMock); cy.intercept(`https://ryujtq87.api.sanity.io*`, {}); }); diff --git a/e2e/cypress/integration-utils/mocks/mellomlagring.ts b/e2e/cypress/integration-utils/mocks/mellomlagring.ts index be5a765db..c4cbd4b3e 100644 --- a/e2e/cypress/integration-utils/mocks/mellomlagring.ts +++ b/e2e/cypress/integration-utils/mocks/mellomlagring.ts @@ -35,8 +35,6 @@ export const mellomlagring = { utenlandsoppholdIPerioden: [], skalTaUtFerieIPerioden: 'no', ferieuttakIPerioden: [], - harMedsøker: 'no', - samtidigHjemme: 'unanswered', omsorgstilbud: { erIOmsorgstilbudFremtid: 'no', erIOmsorgstilbudFortid: 'no', @@ -67,7 +65,7 @@ export const mellomlagring = { }, metadata: { lastStepID: 'legeerklaering', - version: '13.0.0', + version: '13.1.0', updatedTimestemp: '2022-10-19T13:14:12.851Z', }, }; diff --git a/e2e/cypress/integration-utils/steps/periode.ts b/e2e/cypress/integration-utils/steps/periode.ts index 0cfed6a1d..ba7ddc8b4 100644 --- a/e2e/cypress/integration-utils/steps/periode.ts +++ b/e2e/cypress/integration-utils/steps/periode.ts @@ -26,8 +26,6 @@ const expectedLand = 'Albania'; // Land #2 i listen export const fyllUtPeriode = () => { getInputByName('periodeFra').click().type(fraDato).blur(); getInputByName('periodeTil').click().type(tilDato).blur(); - selectRadioYes('er-annenSamtidig'); - selectRadioYes('er-samtidigHjemme'); selectRadioYes('er-iUtlandetIPerioden'); selectRadioYes('er-iUtlandetIPerioden'); @@ -66,7 +64,6 @@ export const oppsummeringTestPeriodeEnkelt = () => { getTestElement('oppsummering-tidsrom-fomtom').should((element) => expect(expectedFomTomPeriode).equal(element.text()) ); - getTestElement('oppsummering-annenSøkerSammePeriode').should((element) => expect('Nei').equal(element.text())); getTestElement('oppsummering-utenlandsoppholdIPerioden').should((element) => expect('Nei').equal(element.text())); getTestElement('oppsummering-ferieuttakIPerioden').should((element) => expect('Nei').equal(element.text())); }; @@ -75,8 +72,6 @@ export const oppsummeringTestPeriode = () => { getTestElement('oppsummering-tidsrom-fomtom').should((element) => expect(expectedFomTomPeriode).equal(element.text()) ); - getTestElement('oppsummering-annenSøkerSammePeriode').should((element) => expect('Ja').equal(element.text())); - getTestElement('oppsummering-samtidigHjemme').should((element) => expect('Ja').equal(element.text())); getTestElement('oppsummering-utenlandsoppholdIPerioden').should((element) => expect('Ja').equal(element.text())); getTestElement('oppsummering-utenlandsoppholdIPerioden-list').within(() => { getElement('li') diff --git a/e2e/docker-compose.yml b/e2e/docker-compose.yml index 1f8f87b72..92c2d2d64 100644 --- a/e2e/docker-compose.yml +++ b/e2e/docker-compose.yml @@ -1,29 +1,31 @@ version: '3.7' services: - api-mock: - build: ../server - environment: - - "PORT=8082" - ports: - - 8082:8082 - web: - build: - context: ../ - dockerfile: Dockerfile.web-cypress - ports: - - 8080:8080 - depends_on: - - api-mock - environment: - - API_URL=http://api-mock:8082 - - HOST=localhost - e2e: - build: . - depends_on: - - web - environment: - - CYPRESS_video=false - - CYPRESS_baseUrl=http://web:8080 + api-mock: + build: ../server + environment: + - 'PORT=8082' + ports: + - 8082:8082 + web: + build: + context: ../ + dockerfile: Dockerfile.web-cypress + ports: + - 8080:8080 + depends_on: + - api-mock + environment: + - API_URL=http://api-mock:8082 + - FRONTEND_API_PATH=http://api-mock:8082 + - FRONTEND_VEDLEGG_URL=http://web:8080/api + - HOST=localhost + e2e: + build: . + depends_on: + - web + environment: + - CYPRESS_video=false + - CYPRESS_baseUrl=http://web:8080 # Dersom debugging er nødvendig # working_dir: /e2e # volumes: diff --git a/envSettings.js b/envSettings.js index feb182c3f..d4d0e71a2 100644 --- a/envSettings.js +++ b/envSettings.js @@ -4,6 +4,9 @@ require('dotenv').config(); const envSettings = () => { const API_URL = process.env.API_URL; const API_URL_INNSYN = process.env.API_URL_INNSYN; + const FRONTEND_INNSYN_API_PATH = process.env.FRONTEND_INNSYN_API_PATH; + const FRONTEND_API_PATH = process.env.FRONTEND_API_PATH; + const FRONTEND_VEDLEGG_URL = process.env.FRONTEND_VEDLEGG_URL; const LOGIN_URL = process.env.LOGIN_URL; const PUBLIC_PATH = process.env.PUBLIC_PATH; const UTILGJENGELIG = process.env.UTILGJENGELIG; @@ -21,6 +24,9 @@ const envSettings = () => { window.appSettings = { API_URL: '${API_URL}', API_URL_INNSYN: '${API_URL_INNSYN}', + FRONTEND_INNSYN_API_PATH: '${FRONTEND_INNSYN_API_PATH}', + FRONTEND_API_PATH: '${FRONTEND_API_PATH}', + FRONTEND_VEDLEGG_URL:'${FRONTEND_VEDLEGG_URL}', LOGIN_URL: '${LOGIN_URL}', PUBLIC_PATH: '${PUBLIC_PATH}', UTILGJENGELIG: '${UTILGJENGELIG}', diff --git a/nais/dev-gcp.json b/nais/dev-gcp.json index e58e80943..92def0d73 100644 --- a/nais/dev-gcp.json +++ b/nais/dev-gcp.json @@ -10,11 +10,14 @@ "livenessPath": "/familie/sykdom-i-familien/soknad/pleiepenger/health/isAlive", "readinessPath": "/familie/sykdom-i-familien/soknad/pleiepenger/health/isReady", "env": { - "DEKORATOR_URL": "https://dekoratoren.dev.nav.no/?simple=true&chatbot=false&urlLookupTable=false", - "API_URL": "https://pleiepengesoknad-api.dev.nav.no", + "DEKORATOR_URL": "https://dekoratoren.dev.nav.no/?simple=true&chatbot=false&urlLookupTable=false&logoutUrl=https://pleiepengesoknad.dev.nav.no/oauth2/logout", + "API_URL": "https://k9-brukerdialog-api.dev.nav.no", + "FRONTEND_VEDLEGG_URL": "https://pleiepengesoknad.dev.nav.no/api", + "FRONTEND_API_PATH": "/api", + "FRONTEND_INNSYN_API_PATH": "/innsynapi", "API_URL_INNSYN": "https://sif-innsyn-api.dev.nav.no", "PUBLIC_PATH": "/familie/sykdom-i-familien/soknad/pleiepenger", - "LOGIN_URL": "https://loginservice.dev.nav.no/login?redirect=https://pleiepengesoknad.dev.nav.no/familie/sykdom-i-familien/soknad/pleiepenger/soknad", + "LOGIN_URL": "https://pleiepengesoknad.dev.nav.no/oauth2/login?redirect=/familie/sykdom-i-familien/soknad/pleiepenger/soknad", "INNSYN_URL": "https://sif-innsyn.dev.nav.no/familie/sykdom-i-familien/soknad/innsyn/", "NYNORSK": "on", "INNSYN": "on", @@ -23,7 +26,9 @@ "APPSTATUS_DATASET": "staging", "USE_AMPLITUDE": "true", "FORENKLET_ARBEID": "off", + "API_TOKENX_AUDIENCE": "dev-gcp:dusseldorf:k9-brukerdialog-api", + "INNSYN_API_TOKENX_AUDIENCE": "dev-gcp:dusseldorf:sif-innsyn-api", "NPM_CONFIG_CACHE": "/tmp", - "PREUTFYLLING": "false" + "PREUTFYLLING": "true" } } diff --git a/nais/naiserator.yml b/nais/naiserator.yml index 226a98378..0b8d53780 100644 --- a/nais/naiserator.yml +++ b/nais/naiserator.yml @@ -5,6 +5,8 @@ metadata: namespace: {{namespace}} labels: team: {{team}} + annotations: + nginx.ingress.kubernetes.io/proxy-body-size: "100M" spec: image: {{ image }} port: 8080 @@ -48,4 +50,10 @@ spec: {{#each env}} - name: {{@key}} value: "{{this}}" - {{/each}} \ No newline at end of file + {{/each}} + tokenx: + enabled: true + idporten: + enabled: true + sidecar: + enabled: true \ No newline at end of file diff --git a/nais/prod-gcp.json b/nais/prod-gcp.json index 8dc4ec306..4e8fdb595 100644 --- a/nais/prod-gcp.json +++ b/nais/prod-gcp.json @@ -10,10 +10,14 @@ "livenessPath": "/familie/sykdom-i-familien/soknad/pleiepenger/health/isAlive", "readinessPath": "/familie/sykdom-i-familien/soknad/pleiepenger/health/isReady", "env": { - "DEKORATOR_URL": "https://www.nav.no/dekoratoren/?simple=true&chatbot=false", - "API_URL": "https://pleiepengesoknad-api.nav.no", + "DEKORATOR_URL": "https://www.nav.no/dekoratoren/?simple=true&chatbot=false&logoutUrl=https://www.nav.no/familie/sykdom-i-familien/soknad/pleiepenger/oauth2/logout", + "API_URL": "https://k9-brukerdialog-api.nav.no", + "FRONTEND_VEDLEGG_URL": "https://www.nav.no/familie/sykdom-i-familien/soknad/pleiepenger/api", + "FRONTEND_API_PATH": "/familie/sykdom-i-familien/soknad/pleiepenger/api", + "FRONTEND_INNSYN_API_PATH": "/familie/sykdom-i-familien/soknad/pleiepenger/innsynapi", + "API_URL_INNSYN": "https://sif-innsyn-api.nav.no", "PUBLIC_PATH": "/familie/sykdom-i-familien/soknad/pleiepenger", - "LOGIN_URL": "https://loginservice.nav.no/login?redirect=https://www.nav.no/familie/sykdom-i-familien/soknad/pleiepenger/soknad", + "LOGIN_URL": "https://www.nav.no/familie/sykdom-i-familien/soknad/pleiepenger/oauth2/login?redirect=/familie/sykdom-i-familien/soknad/pleiepenger/soknad", "INNSYN_URL": "https://www.nav.no/familie/sykdom-i-familien/soknad/innsyn/", "NYNORSK": "off", "INNSYN": "on", @@ -22,6 +26,8 @@ "APPSTATUS_DATASET": "production", "USE_AMPLITUDE": "true", "FORENKLET_ARBEID": "off", + "API_TOKENX_AUDIENCE": "prod-gcp:dusseldorf:k9-brukerdialog-api", + "INNSYN_API_TOKENX_AUDIENCE": "prod-gcp:dusseldorf:sif-innsyn-api", "NPM_CONFIG_CACHE": "/tmp", "PREUTFYLLING": "false" } diff --git a/package-lock.json b/package-lock.json index a4b433531..81a04a7ff 100644 --- a/package-lock.json +++ b/package-lock.json @@ -24,13 +24,16 @@ "classnames": "^2.3.2", "compression": "^1.7.4", "constate": "^3.3.2", + "cookie-parser": "^1.4.6", "dotenv": "^16.0.2", "eslint-webpack-plugin": "^3.2.0", "express": "^4.18.1", "formik": "^2.2.9", "fs-extra": "^10.1.0", "helmet": "^6.0.0", + "http-proxy-middleware": "^2.0.6", "jest-environment-jsdom": "^29.1.1", + "jose": "^4.11.1", "lodash.groupby": "^4.6.0", "mini-css-extract-plugin": "2.6.1", "mustache-express": "^1.3.2", @@ -45,6 +48,7 @@ "nav-frontend-paneler-style": "^2.0.2", "nav-frontend-typografi": "^4.0.2", "nav-frontend-typografi-style": "^2.0.2", + "openid-client": "^5.3.1", "promise": "^8.2.0", "react": "^17.0.2", "react-day-picker": "^7.4.10", @@ -5200,7 +5204,7 @@ "version": "1.19.2", "resolved": "https://registry.npmjs.org/@types/body-parser/-/body-parser-1.19.2.tgz", "integrity": "sha512-ALYone6pm6QmwZoAgeyNksccT9Q4AWZQ6PvfwR37GT6r6FWUPguq6sUmNGSMV2Wr761oQoBxwGGa6DR5o1DC9g==", - "dev": true, + "devOptional": true, "dependencies": { "@types/connect": "*", "@types/node": "*" @@ -5219,7 +5223,7 @@ "version": "3.4.35", "resolved": "https://registry.npmjs.org/@types/connect/-/connect-3.4.35.tgz", "integrity": "sha512-cdeYyv4KWoEgpBISTxWvqYsVy444DOqehiF3fM3ne10AmJ62RSyNkUnxMJXHQWRQQX2eR94m5y1IZyDwBjV9FQ==", - "dev": true, + "devOptional": true, "dependencies": { "@types/node": "*" } @@ -5261,7 +5265,7 @@ "version": "4.17.14", "resolved": "https://registry.npmjs.org/@types/express/-/express-4.17.14.tgz", "integrity": "sha512-TEbt+vaPFQ+xpxFLFssxUDXj5cWCxZJjIcB7Yg0k0GMHGtgtQgpvx/MUQUeAkNbA9AAGrwkAsoeItdTgS7FMyg==", - "dev": true, + "devOptional": true, "dependencies": { "@types/body-parser": "*", "@types/express-serve-static-core": "^4.17.18", @@ -5273,7 +5277,7 @@ "version": "4.17.31", "resolved": "https://registry.npmjs.org/@types/express-serve-static-core/-/express-serve-static-core-4.17.31.tgz", "integrity": "sha512-DxMhY+NAsTwMMFHBTtJFNp5qiHKJ7TeqOo23zVEM9alT1Ml27Q3xcTH0xwxn7Q0BbMcVEJOs/7aQtUWupUQN3Q==", - "dev": true, + "devOptional": true, "dependencies": { "@types/node": "*", "@types/qs": "*", @@ -5314,7 +5318,6 @@ "version": "1.17.9", "resolved": "https://registry.npmjs.org/@types/http-proxy/-/http-proxy-1.17.9.tgz", "integrity": "sha512-QsbSjA/fSk7xB+UXlCT3wHBy5ai9wOcNDWwZAtud+jXhwOM3l+EYZh8Lng4+/6n8uar0J7xILzqftJdJ/Wdfkw==", - "dev": true, "dependencies": { "@types/node": "*" } @@ -5422,7 +5425,7 @@ "version": "3.0.1", "resolved": "https://registry.npmjs.org/@types/mime/-/mime-3.0.1.tgz", "integrity": "sha512-Y4XFY5VJAuw0FgAqPNd6NNoV44jbq9Bz2L7Rh/J6jLTiHBSBJa9fxqQIvkIld4GsoDOcCbvzOUAbLPsSKKg+uA==", - "dev": true + "devOptional": true }, "node_modules/@types/node": { "version": "14.18.33", @@ -5456,13 +5459,13 @@ "version": "6.9.7", "resolved": "https://registry.npmjs.org/@types/qs/-/qs-6.9.7.tgz", "integrity": "sha512-FGa1F62FT09qcrueBA6qYTrJPVDzah9a+493+o2PCXsesWHIn27G98TsSMs3WPNbZIEj4+VJf6saSFpvD+3Zsw==", - "dev": true + "devOptional": true }, "node_modules/@types/range-parser": { "version": "1.2.4", "resolved": "https://registry.npmjs.org/@types/range-parser/-/range-parser-1.2.4.tgz", "integrity": "sha512-EEhsLsD6UsDM1yFhAvy0Cjr6VwmpMWqFBCb9w07wVugF7w9nfajxLuVmngTIpgS6svCnm6Vaw+MZhoDCKnOfsw==", - "dev": true + "devOptional": true }, "node_modules/@types/react": { "version": "17.0.52", @@ -5560,7 +5563,7 @@ "version": "1.15.0", "resolved": "https://registry.npmjs.org/@types/serve-static/-/serve-static-1.15.0.tgz", "integrity": "sha512-z5xyF6uh8CbjAu9760KDKsH2FcDxZ2tFCsA4HIMWE6IkiYMXfVoa+4f9KX+FN0ZLsaMw1WNG2ETLA6N+/YA+cg==", - "dev": true, + "devOptional": true, "dependencies": { "@types/mime": "*", "@types/node": "*" @@ -8149,6 +8152,26 @@ "node": ">= 0.6" } }, + "node_modules/cookie-parser": { + "version": "1.4.6", + "resolved": "https://registry.npmjs.org/cookie-parser/-/cookie-parser-1.4.6.tgz", + "integrity": "sha512-z3IzaNjdwUC2olLIB5/ITd0/setiaFMLYiZJle7xg5Fe9KWAceil7xszYfHHBtDFYLSgJduS2Ty0P1uJdPDJeA==", + "dependencies": { + "cookie": "0.4.1", + "cookie-signature": "1.0.6" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/cookie-parser/node_modules/cookie": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.4.1.tgz", + "integrity": "sha512-ZwrFkGJxUR3EIoXtO+yVE69Eb7KlixbaeAWfBQB9vVsNn/o+Yw69gBWSSDK825hQNdN+wF8zELf3dFNl/kxkUA==", + "engines": { + "node": ">= 0.6" + } + }, "node_modules/cookie-signature": { "version": "1.0.6", "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.6.tgz", @@ -10405,8 +10428,7 @@ "node_modules/eventemitter3": { "version": "4.0.7", "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-4.0.7.tgz", - "integrity": "sha512-8guHBZCwKnFhYdHr2ysuRWErTwhoN2X8XELRlrRwpmfeY2jjuUN4taQMsULKUVo1K4DvZl+0pgfyoysHxvmvEw==", - "dev": true + "integrity": "sha512-8guHBZCwKnFhYdHr2ysuRWErTwhoN2X8XELRlrRwpmfeY2jjuUN4taQMsULKUVo1K4DvZl+0pgfyoysHxvmvEw==" }, "node_modules/events": { "version": "3.3.0", @@ -11993,7 +12015,6 @@ "version": "1.18.1", "resolved": "https://registry.npmjs.org/http-proxy/-/http-proxy-1.18.1.tgz", "integrity": "sha512-7mz/721AbnJwIVbnaSv1Cz3Am0ZLT/UBwkC92VlxhXv/k/BBQfM2fXElQNC27BVGr0uwUpplYPQM9LnaBMR5NQ==", - "dev": true, "dependencies": { "eventemitter3": "^4.0.0", "follow-redirects": "^1.0.0", @@ -12020,7 +12041,6 @@ "version": "2.0.6", "resolved": "https://registry.npmjs.org/http-proxy-middleware/-/http-proxy-middleware-2.0.6.tgz", "integrity": "sha512-ya/UeJ6HVBYxrgYotAZo1KvPWlgB48kUJLDePFeneHsVujFaW5WNj2NgWCAE//B1Dl02BIfYlpNgBy8Kf8Rjmw==", - "dev": true, "dependencies": { "@types/http-proxy": "^1.17.8", "http-proxy": "^1.18.1", @@ -12594,7 +12614,6 @@ "version": "3.0.0", "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-3.0.0.tgz", "integrity": "sha512-gwsOE28k+23GP1B6vFl1oVh/WOzmawBrKwo5Ev6wMKzPkaXaCDIQKzLnvsA42DRlbVTWorkgTKIviAKCWkfUwA==", - "dev": true, "engines": { "node": ">=10" }, @@ -17514,6 +17533,14 @@ "url": "https://github.com/chalk/supports-color?sponsor=1" } }, + "node_modules/jose": { + "version": "4.11.1", + "resolved": "https://registry.npmjs.org/jose/-/jose-4.11.1.tgz", + "integrity": "sha512-YRv4Tk/Wlug8qicwqFNFVEZSdbROCHRAC6qu/i0dyNKr5JQdoa2pIGoS04lLO/jXQX7Z9omoNewYIVIxqZBd9Q==", + "funding": { + "url": "https://github.com/sponsors/panva" + } + }, "node_modules/js-sdsl": { "version": "4.1.5", "resolved": "https://registry.npmjs.org/js-sdsl/-/js-sdsl-4.1.5.tgz", @@ -19444,6 +19471,14 @@ "integrity": "sha512-PX1wu0AmAdPqOL1mWhqmlOd8kOIZQwGZw6rh7uby9fTc5lhaOWFLX3I6R1hrF9k3zUY40e6igsLGkDXK92LJNg==", "dev": true }, + "node_modules/oidc-token-hash": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/oidc-token-hash/-/oidc-token-hash-5.0.1.tgz", + "integrity": "sha512-EvoOtz6FIEBzE+9q253HsLCVRiK/0doEJ2HCvvqMQb3dHZrP3WlJKYtJ55CRTw4jmYomzH4wkPuCj/I3ZvpKxQ==", + "engines": { + "node": "^10.13.0 || >=12.0.0" + } + }, "node_modules/on-finished": { "version": "2.4.1", "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.4.1.tgz", @@ -19503,6 +19538,44 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/openid-client": { + "version": "5.3.1", + "resolved": "https://registry.npmjs.org/openid-client/-/openid-client-5.3.1.tgz", + "integrity": "sha512-RLfehQiHch9N6tRWNx68cicf3b1WR0x74bJWHRc25uYIbSRwjxYcTFaRnzbbpls5jroLAaB/bFIodTgA5LJMvw==", + "dependencies": { + "jose": "^4.10.0", + "lru-cache": "^6.0.0", + "object-hash": "^2.0.1", + "oidc-token-hash": "^5.0.1" + }, + "funding": { + "url": "https://github.com/sponsors/panva" + } + }, + "node_modules/openid-client/node_modules/lru-cache": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", + "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/openid-client/node_modules/object-hash": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/object-hash/-/object-hash-2.2.0.tgz", + "integrity": "sha512-gScRMn0bS5fH+IuwyIFgnh9zBdo4DV+6GhygmWM9HyNJSgS0hScp1f5vjtm7oIIOiT9trXrShAkLFSc2IqKNgw==", + "engines": { + "node": ">= 6" + } + }, + "node_modules/openid-client/node_modules/yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==" + }, "node_modules/optionator": { "version": "0.9.1", "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.1.tgz", @@ -29315,7 +29388,7 @@ "version": "1.19.2", "resolved": "https://registry.npmjs.org/@types/body-parser/-/body-parser-1.19.2.tgz", "integrity": "sha512-ALYone6pm6QmwZoAgeyNksccT9Q4AWZQ6PvfwR37GT6r6FWUPguq6sUmNGSMV2Wr761oQoBxwGGa6DR5o1DC9g==", - "dev": true, + "devOptional": true, "requires": { "@types/connect": "*", "@types/node": "*" @@ -29334,7 +29407,7 @@ "version": "3.4.35", "resolved": "https://registry.npmjs.org/@types/connect/-/connect-3.4.35.tgz", "integrity": "sha512-cdeYyv4KWoEgpBISTxWvqYsVy444DOqehiF3fM3ne10AmJ62RSyNkUnxMJXHQWRQQX2eR94m5y1IZyDwBjV9FQ==", - "dev": true, + "devOptional": true, "requires": { "@types/node": "*" } @@ -29376,7 +29449,7 @@ "version": "4.17.14", "resolved": "https://registry.npmjs.org/@types/express/-/express-4.17.14.tgz", "integrity": "sha512-TEbt+vaPFQ+xpxFLFssxUDXj5cWCxZJjIcB7Yg0k0GMHGtgtQgpvx/MUQUeAkNbA9AAGrwkAsoeItdTgS7FMyg==", - "dev": true, + "devOptional": true, "requires": { "@types/body-parser": "*", "@types/express-serve-static-core": "^4.17.18", @@ -29388,7 +29461,7 @@ "version": "4.17.31", "resolved": "https://registry.npmjs.org/@types/express-serve-static-core/-/express-serve-static-core-4.17.31.tgz", "integrity": "sha512-DxMhY+NAsTwMMFHBTtJFNp5qiHKJ7TeqOo23zVEM9alT1Ml27Q3xcTH0xwxn7Q0BbMcVEJOs/7aQtUWupUQN3Q==", - "dev": true, + "devOptional": true, "requires": { "@types/node": "*", "@types/qs": "*", @@ -29429,7 +29502,6 @@ "version": "1.17.9", "resolved": "https://registry.npmjs.org/@types/http-proxy/-/http-proxy-1.17.9.tgz", "integrity": "sha512-QsbSjA/fSk7xB+UXlCT3wHBy5ai9wOcNDWwZAtud+jXhwOM3l+EYZh8Lng4+/6n8uar0J7xILzqftJdJ/Wdfkw==", - "dev": true, "requires": { "@types/node": "*" } @@ -29530,7 +29602,7 @@ "version": "3.0.1", "resolved": "https://registry.npmjs.org/@types/mime/-/mime-3.0.1.tgz", "integrity": "sha512-Y4XFY5VJAuw0FgAqPNd6NNoV44jbq9Bz2L7Rh/J6jLTiHBSBJa9fxqQIvkIld4GsoDOcCbvzOUAbLPsSKKg+uA==", - "dev": true + "devOptional": true }, "@types/node": { "version": "14.18.33", @@ -29564,13 +29636,13 @@ "version": "6.9.7", "resolved": "https://registry.npmjs.org/@types/qs/-/qs-6.9.7.tgz", "integrity": "sha512-FGa1F62FT09qcrueBA6qYTrJPVDzah9a+493+o2PCXsesWHIn27G98TsSMs3WPNbZIEj4+VJf6saSFpvD+3Zsw==", - "dev": true + "devOptional": true }, "@types/range-parser": { "version": "1.2.4", "resolved": "https://registry.npmjs.org/@types/range-parser/-/range-parser-1.2.4.tgz", "integrity": "sha512-EEhsLsD6UsDM1yFhAvy0Cjr6VwmpMWqFBCb9w07wVugF7w9nfajxLuVmngTIpgS6svCnm6Vaw+MZhoDCKnOfsw==", - "dev": true + "devOptional": true }, "@types/react": { "version": "17.0.52", @@ -29668,7 +29740,7 @@ "version": "1.15.0", "resolved": "https://registry.npmjs.org/@types/serve-static/-/serve-static-1.15.0.tgz", "integrity": "sha512-z5xyF6uh8CbjAu9760KDKsH2FcDxZ2tFCsA4HIMWE6IkiYMXfVoa+4f9KX+FN0ZLsaMw1WNG2ETLA6N+/YA+cg==", - "dev": true, + "devOptional": true, "requires": { "@types/mime": "*", "@types/node": "*" @@ -31592,6 +31664,22 @@ "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.5.0.tgz", "integrity": "sha512-YZ3GUyn/o8gfKJlnlX7g7xq4gyO6OSuhGPKaaGssGB2qgDUS0gPgtTvoyZLTt9Ab6dC4hfc9dV5arkvc/OCmrw==" }, + "cookie-parser": { + "version": "1.4.6", + "resolved": "https://registry.npmjs.org/cookie-parser/-/cookie-parser-1.4.6.tgz", + "integrity": "sha512-z3IzaNjdwUC2olLIB5/ITd0/setiaFMLYiZJle7xg5Fe9KWAceil7xszYfHHBtDFYLSgJduS2Ty0P1uJdPDJeA==", + "requires": { + "cookie": "0.4.1", + "cookie-signature": "1.0.6" + }, + "dependencies": { + "cookie": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.4.1.tgz", + "integrity": "sha512-ZwrFkGJxUR3EIoXtO+yVE69Eb7KlixbaeAWfBQB9vVsNn/o+Yw69gBWSSDK825hQNdN+wF8zELf3dFNl/kxkUA==" + } + } + }, "cookie-signature": { "version": "1.0.6", "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.6.tgz", @@ -33251,8 +33339,7 @@ "eventemitter3": { "version": "4.0.7", "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-4.0.7.tgz", - "integrity": "sha512-8guHBZCwKnFhYdHr2ysuRWErTwhoN2X8XELRlrRwpmfeY2jjuUN4taQMsULKUVo1K4DvZl+0pgfyoysHxvmvEw==", - "dev": true + "integrity": "sha512-8guHBZCwKnFhYdHr2ysuRWErTwhoN2X8XELRlrRwpmfeY2jjuUN4taQMsULKUVo1K4DvZl+0pgfyoysHxvmvEw==" }, "events": { "version": "3.3.0", @@ -34448,7 +34535,6 @@ "version": "1.18.1", "resolved": "https://registry.npmjs.org/http-proxy/-/http-proxy-1.18.1.tgz", "integrity": "sha512-7mz/721AbnJwIVbnaSv1Cz3Am0ZLT/UBwkC92VlxhXv/k/BBQfM2fXElQNC27BVGr0uwUpplYPQM9LnaBMR5NQ==", - "dev": true, "requires": { "eventemitter3": "^4.0.0", "follow-redirects": "^1.0.0", @@ -34469,7 +34555,6 @@ "version": "2.0.6", "resolved": "https://registry.npmjs.org/http-proxy-middleware/-/http-proxy-middleware-2.0.6.tgz", "integrity": "sha512-ya/UeJ6HVBYxrgYotAZo1KvPWlgB48kUJLDePFeneHsVujFaW5WNj2NgWCAE//B1Dl02BIfYlpNgBy8Kf8Rjmw==", - "dev": true, "requires": { "@types/http-proxy": "^1.17.8", "http-proxy": "^1.18.1", @@ -34844,8 +34929,7 @@ "is-plain-obj": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-3.0.0.tgz", - "integrity": "sha512-gwsOE28k+23GP1B6vFl1oVh/WOzmawBrKwo5Ev6wMKzPkaXaCDIQKzLnvsA42DRlbVTWorkgTKIviAKCWkfUwA==", - "dev": true + "integrity": "sha512-gwsOE28k+23GP1B6vFl1oVh/WOzmawBrKwo5Ev6wMKzPkaXaCDIQKzLnvsA42DRlbVTWorkgTKIviAKCWkfUwA==" }, "is-plain-object": { "version": "2.0.4", @@ -38609,6 +38693,11 @@ } } }, + "jose": { + "version": "4.11.1", + "resolved": "https://registry.npmjs.org/jose/-/jose-4.11.1.tgz", + "integrity": "sha512-YRv4Tk/Wlug8qicwqFNFVEZSdbROCHRAC6qu/i0dyNKr5JQdoa2pIGoS04lLO/jXQX7Z9omoNewYIVIxqZBd9Q==" + }, "js-sdsl": { "version": "4.1.5", "resolved": "https://registry.npmjs.org/js-sdsl/-/js-sdsl-4.1.5.tgz", @@ -39999,6 +40088,11 @@ "integrity": "sha512-PX1wu0AmAdPqOL1mWhqmlOd8kOIZQwGZw6rh7uby9fTc5lhaOWFLX3I6R1hrF9k3zUY40e6igsLGkDXK92LJNg==", "dev": true }, + "oidc-token-hash": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/oidc-token-hash/-/oidc-token-hash-5.0.1.tgz", + "integrity": "sha512-EvoOtz6FIEBzE+9q253HsLCVRiK/0doEJ2HCvvqMQb3dHZrP3WlJKYtJ55CRTw4jmYomzH4wkPuCj/I3ZvpKxQ==" + }, "on-finished": { "version": "2.4.1", "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.4.1.tgz", @@ -40040,6 +40134,37 @@ "is-wsl": "^2.2.0" } }, + "openid-client": { + "version": "5.3.1", + "resolved": "https://registry.npmjs.org/openid-client/-/openid-client-5.3.1.tgz", + "integrity": "sha512-RLfehQiHch9N6tRWNx68cicf3b1WR0x74bJWHRc25uYIbSRwjxYcTFaRnzbbpls5jroLAaB/bFIodTgA5LJMvw==", + "requires": { + "jose": "^4.10.0", + "lru-cache": "^6.0.0", + "object-hash": "^2.0.1", + "oidc-token-hash": "^5.0.1" + }, + "dependencies": { + "lru-cache": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", + "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", + "requires": { + "yallist": "^4.0.0" + } + }, + "object-hash": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/object-hash/-/object-hash-2.2.0.tgz", + "integrity": "sha512-gScRMn0bS5fH+IuwyIFgnh9zBdo4DV+6GhygmWM9HyNJSgS0hScp1f5vjtm7oIIOiT9trXrShAkLFSc2IqKNgw==" + }, + "yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==" + } + } + }, "optionator": { "version": "0.9.1", "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.1.tgz", diff --git a/package.json b/package.json index f4fccecf9..3e86684e3 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "pleiepengesoknad", - "version": "1.3.3", + "version": "2.0.0", "description": "Selvbetjeningsløsning for pleiepengesøknad", "repository": "https://github.com/navikt/pleiepengesoknad", "license": "MIT", @@ -46,13 +46,16 @@ "classnames": "^2.3.2", "compression": "^1.7.4", "constate": "^3.3.2", + "cookie-parser": "^1.4.6", "dotenv": "^16.0.2", "eslint-webpack-plugin": "^3.2.0", "express": "^4.18.1", "formik": "^2.2.9", "fs-extra": "^10.1.0", "helmet": "^6.0.0", + "http-proxy-middleware": "^2.0.6", "jest-environment-jsdom": "^29.1.1", + "jose": "^4.11.1", "lodash.groupby": "^4.6.0", "mini-css-extract-plugin": "2.6.1", "mustache-express": "^1.3.2", @@ -67,6 +70,7 @@ "nav-frontend-paneler-style": "^2.0.2", "nav-frontend-typografi": "^4.0.2", "nav-frontend-typografi-style": "^2.0.2", + "openid-client": "^5.3.1", "promise": "^8.2.0", "react": "^17.0.2", "react-day-picker": "^7.4.10", diff --git a/server.js b/server.js index 59f9a35d8..e16cb1334 100644 --- a/server.js +++ b/server.js @@ -1,31 +1,35 @@ const express = require('express'); -const path = require('path'); const mustacheExpress = require('mustache-express'); -const Promise = require('promise'); const compression = require('compression'); -const helmet = require('helmet'); const getDecorator = require('./src/build/scripts/decorator'); const envSettings = require('./envSettings'); - -require('dotenv').config(); +const cookieParser = require('cookie-parser'); +const { initTokenX, exchangeToken } = require('./tokenx'); +const { createProxyMiddleware } = require('http-proxy-middleware'); +const Promise = require('promise'); +const helmet = require('helmet'); +const path = require('path'); +const jose = require('jose'); const server = express(); + server.use( helmet({ contentSecurityPolicy: false, crossOriginEmbedderPolicy: false, }) ); -server.use(compression()); -server.set('views', path.resolve(`${__dirname}/dist`)); -server.set('view engine', 'mustache'); -server.engine('html', mustacheExpress()); - server.use((req, res, next) => { res.set('X-XSS-Protection', '1; mode=block'); res.set('Feature-Policy', "geolocation 'none'; microphone 'none'; camera 'none'"); next(); }); +server.use(compression()); +server.use(cookieParser()); + +server.set('views', path.resolve(`${__dirname}/dist`)); +server.set('view engine', 'mustache'); +server.engine('html', mustacheExpress()); const verifyLoginUrl = () => new Promise((resolve, reject) => { @@ -47,8 +51,49 @@ const renderApp = (decoratorFragments) => }); }); -const startServer = (html) => { - console.log('server.js: Using PUBLIC_PATH', process.env.PUBLIC_PATH); +const isExpiredOrNotAuthorized = (token) => { + if (token) { + try { + const exp = jose.decodeJwt(token).exp; + return Date.now() >= exp * 1000; + } catch (err) { + console.error('Feilet med dekoding av token: ', err); + return true; + } + } + return true; +}; + +const getRouterConfig = async (req, audienceInnsyn) => { + { + if (req.headers['authorization'] !== undefined) { + const token = req.headers['authorization'].replace('Bearer ', ''); + if (isExpiredOrNotAuthorized(token)) { + return undefined; + } + const exchangedToken = await exchangeToken(token, audienceInnsyn); + if (exchangedToken != null && !exchangedToken.expired() && exchangedToken.access_token) { + req.headers['authorization'] = `Bearer ${exchangedToken.access_token}`; + } + } else if (req.cookies['selvbetjening-idtoken'] !== undefined) { + const selvbetjeningIdtoken = req.cookies['selvbetjening-idtoken']; + if (isExpiredOrNotAuthorized(selvbetjeningIdtoken)) { + return undefined; + } + + const exchangedToken = await exchangeToken(selvbetjeningIdtoken, audienceInnsyn); + if (exchangedToken != null && !exchangedToken.expired() && exchangedToken.access_token) { + req.headers['authorization'] = `Bearer ${exchangedToken.access_token}`; + } + } else return undefined; + + return undefined; + } +}; + +const startServer = async (html) => { + await Promise.all([initTokenX()]); + server.use(`${process.env.PUBLIC_PATH}/dist/js`, express.static(path.resolve(__dirname, 'dist/js'))); server.use(`${process.env.PUBLIC_PATH}/dist/css`, (req, res, next) => { const requestReferer = req.headers.referer; @@ -65,17 +110,42 @@ const startServer = (html) => { res.send(`${envSettings()}`); }); - server.get(/^\/(?!.*dist).*$/, (req, res) => { - if (process.env.REDIRECT_TO !== undefined) { - res.set('location', process.env.REDIRECT_TO); - res.set('Cache-control', 'public, max-age=300'); - res.status(301).send(); - } else { - res.send(html); - } + server.use( + process.env.FRONTEND_API_PATH, + createProxyMiddleware({ + target: process.env.API_URL, + changeOrigin: true, + pathRewrite: (path) => { + return path.replace(process.env.FRONTEND_API_PATH, ''); + }, + router: async (req) => getRouterConfig(req, false), + secure: true, + xfwd: true, + logLevel: 'info', + }) + ); + + server.use( + process.env.FRONTEND_INNSYN_API_PATH, + createProxyMiddleware({ + target: process.env.API_URL_INNSYN, + changeOrigin: true, + pathRewrite: (path) => { + return path.replace(process.env.FRONTEND_INNSYN_API_PATH, ''); + }, + router: async (req) => getRouterConfig(req, true), + secure: true, + xfwd: true, + logLevel: 'info', + }) + ); + + server.get(/^\/(?!.*api)(?!.*innsynapi)(?!.*dist).*$/, (req, res) => { + res.send(html); }); const port = process.env.PORT || 8080; + server.listen(port, () => { console.log(`App listening on port: ${port}`); }); diff --git a/server/api-mock.js b/server/api-mock.js index c3425aa9a..ea55ba661 100644 --- a/server/api-mock.js +++ b/server/api-mock.js @@ -99,7 +99,7 @@ const arbeidsgivereMock = { const FORRIGE_SØKNAD = './server/mockdata/depr_søknad.json'; -const MELLOMLAGRING_JSON = `${os.tmpdir()}/mellomlagring.json`; +const MELLOMLAGRING_JSON = `${os.tmpdir()}/pleiepenger-sykt-barn-mellomlagring.json`; const isJSON = (str) => { try { @@ -128,17 +128,17 @@ const startExpressServer = () => { server.get('/health/isAlive', (req, res) => res.sendStatus(200)); server.get('/health/isReady', (req, res) => res.sendStatus(200)); - server.get('/arbeidsgiver', (req, res) => { + server.get('/oppslag/arbeidsgiver', (req, res) => { // setTimeout(() => { res.send(arbeidsgivereMock); // }, 800); }); - server.get('/soker', (req, res) => { + server.get('/oppslag/soker', (req, res) => { res.send(søkerMock); }); - server.get('/soker-umyndig', (req, res) => { + server.get('/oppslag/soker-umyndig', (req, res) => { res.sendStatus(451); }); @@ -147,15 +147,20 @@ const startExpressServer = () => { res.set('Location', 'nav.no'); const busboy = busboyCons({ headers: req.headers }); busboy.on('finish', () => { - res.writeHead(200, { Location: '/vedlegg' }); + res.writeHead(200, { + Location: 'http://localhost:8083/vedlegg/eyJraWQiOiIxIiwidHlwIjoiSldUIiwiYWxnIjoibm9uZSJ9.eyJqdG', + }); res.end(); }); req.pipe(busboy); }); - server.get('/barn', (req, res) => res.send(barnMock)); + server.get('/oppslag/barn', (req, res) => res.send(barnMock)); - server.post('/soknad', (req, res) => { + //Test uten barn + // server.get('/oppslag/barn', (req, res) => res.send({ barn: [] })); + + server.post('/pleiepenger-sykt-barn/innsending', (req, res) => { res.sendStatus(200); }); @@ -167,7 +172,7 @@ const startExpressServer = () => { res.send({}); } }); - server.get('/mellomlagring', (req, res) => { + server.get('/mellomlagring/PLEIEPENGER_SYKT_BARN', (req, res) => { if (existsSync(MELLOMLAGRING_JSON)) { const body = readFileSync(MELLOMLAGRING_JSON); res.send(JSON.parse(body)); @@ -175,19 +180,19 @@ const startExpressServer = () => { res.send({}); } }); - server.post('/mellomlagring', (req, res) => { + server.post('/mellomlagring/PLEIEPENGER_SYKT_BARN', (req, res) => { const body = req.body; const jsBody = isJSON(body) ? JSON.parse(body) : body; writeFileAsync(MELLOMLAGRING_JSON, JSON.stringify(jsBody, null, 2)); res.sendStatus(200); }); - server.put('/mellomlagring', (req, res) => { + server.put('/mellomlagring/PLEIEPENGER_SYKT_BARN', (req, res) => { const body = req.body; const jsBody = isJSON(body) ? JSON.parse(body) : body; writeFileAsync(MELLOMLAGRING_JSON, JSON.stringify(jsBody, null, 2)); res.sendStatus(200); }); - server.delete('/mellomlagring', (req, res) => { + server.delete('/mellomlagring/PLEIEPENGER_SYKT_BARN', (req, res) => { writeFileAsync(MELLOMLAGRING_JSON, JSON.stringify({}, null, 2)); res.sendStatus(200); }); diff --git "a/server/mockdata/depr_s\303\270knad.json" "b/server/mockdata/depr_s\303\270knad.json" index 12accba3d..08845bb8e 100644 --- "a/server/mockdata/depr_s\303\270knad.json" +++ "b/server/mockdata/depr_s\303\270knad.json" @@ -59,7 +59,6 @@ { "fraOgMed": "2022-06-13", "landkode": "ALB", "landnavn": "Albania", "tilOgMed": "2022-09-01" } ] }, - "harMedsøker": true, "arbeidsgivere": [ { "navn": "SJOKKERENDE ELEKTRIKER", @@ -86,7 +85,6 @@ }, "erLiktHverUke": true }, - "samtidigHjemme": true, "utenlandskNæring": [ { "land": { "landkode": "IRL", "landnavn": "Irland" }, diff --git "a/server/mockdata/s\303\270knad.json" "b/server/mockdata/s\303\270knad.json" index f84f52cb7..a8a993ddd 100644 --- "a/server/mockdata/s\303\270knad.json" +++ "b/server/mockdata/s\303\270knad.json" @@ -56,7 +56,6 @@ ], "utenlandsoppholdSiste12Mnd": [] }, - "harMedsøker": false, "arbeidsgivere": [ { "navn": "SJOKKERENDE ELEKTRIKER", @@ -128,7 +127,6 @@ "trekkKravPerioder": [], "opptjeningAktivitet": { "frilanser": { "startdato": "2016-11-08" } }, "dataBruktTilUtledning": { - "harMedsøker": false, "harBekreftetOpplysninger": true, "harForståttRettigheterOgPlikter": true } diff --git a/src/app/api/__tests__/api.test.ts b/src/app/api/__tests__/api.test.ts index c05815c1e..e47623881 100644 --- a/src/app/api/__tests__/api.test.ts +++ b/src/app/api/__tests__/api.test.ts @@ -2,7 +2,7 @@ import axios from 'axios'; import { axiosConfigPsb } from '../../config/axiosConfig'; import { StepID } from '../../søknad/søknadStepsConfig'; import { ResourceType } from '../../types/ResourceType'; -import { axiosJsonConfig, getApiUrlByResourceType, sendMultipartPostRequest } from '../utils/apiUtils'; +import { axiosJsonConfig, sendMultipartPostRequest } from '../utils/apiUtils'; import { deleteFile, getArbeidsgiver, @@ -41,14 +41,14 @@ describe('api', () => { describe('getBarn', () => { it('should call axios.get with correct URL and axios config', () => { getBarn(); - expect(axios.get).toHaveBeenCalledWith(getApiUrlByResourceType(ResourceType.BARN), axiosJsonConfig); + expect(axios.get).toHaveBeenCalledWith(ResourceType.BARN, axiosJsonConfig); }); }); describe('getSøker', () => { it('should call axios.get with correct URL and axios config', () => { getSøker(); - expect(axios.get).toHaveBeenCalledWith(getApiUrlByResourceType(ResourceType.SØKER), axiosJsonConfig); + expect(axios.get).toHaveBeenCalledWith(ResourceType.SØKER, axiosJsonConfig); }); }); @@ -57,9 +57,7 @@ describe('api', () => { const date1 = 'some date'; const date2 = 'some other date'; getArbeidsgiver(date1, date2); - const url = `${getApiUrlByResourceType( - ResourceType.SØKER - )}?fra_og_med=${date1}&til_og_med=${date2}&frilansoppdrag=true`; + const url = `${ResourceType.ARBEIDSGIVER}?fra_og_med=${date1}&til_og_med=${date2}&frilansoppdrag=true`; expect(axios.get).toHaveBeenCalledWith(url, axiosJsonConfig); }); }); @@ -68,11 +66,7 @@ describe('api', () => { it('should call axios.post with correct URL, specified api data and axios config', () => { const data = {} as any; sendApplication(data); - expect(axios.post).toHaveBeenCalledWith( - getApiUrlByResourceType(ResourceType.SEND_SØKNAD), - data, - axiosJsonConfig - ); + expect(axios.post).toHaveBeenCalledWith(ResourceType.SEND_SØKNAD, data, axiosJsonConfig); }); }); diff --git a/src/app/api/api.ts b/src/app/api/api.ts index cbb91cc98..ef93ab854 100644 --- a/src/app/api/api.ts +++ b/src/app/api/api.ts @@ -7,12 +7,7 @@ import { ResourceType, ResourceTypeInnsyn } from '../types/ResourceType'; import { SøknadApiData } from '../types/søknad-api-data/SøknadApiData'; import { SøknadFormValues } from '../types/SøknadFormValues'; import { MELLOMLAGRING_VERSION, SøknadTempStorageData } from '../types/SøknadTempStorageData'; -import { - axiosJsonConfig, - getApiUrlByResourceType, - getInnsynApiUrlByResourceType, - sendMultipartPostRequest, -} from './utils/apiUtils'; +import { axiosJsonConfig, sendMultipartPostRequest } from './utils/apiUtils'; import { ImportertSøknadMetadata } from '../types/ImportertSøknad'; import { Feature, isFeatureEnabled } from '../utils/featureToggleUtils'; @@ -21,9 +16,7 @@ export enum ApiEndpointInnsyn { } export const getPersistUrl = (stepID?: StepID) => - stepID - ? `${getApiUrlByResourceType(ResourceType.MELLOMLAGRING)}?lastStepID=${encodeURI(stepID)}` - : getApiUrlByResourceType(ResourceType.MELLOMLAGRING); + stepID ? `${ResourceType.MELLOMLAGRING}?lastStepID=${encodeURI(stepID)}` : ResourceType.MELLOMLAGRING; export const persist = ({ formValues, @@ -51,40 +44,38 @@ export const persist = ({ } }; export const rehydrate = () => - axios.get(getApiUrlByResourceType(ResourceType.MELLOMLAGRING), { + axios.get(ResourceType.MELLOMLAGRING, { ...axiosJsonConfig, transformResponse: storageParser, }); -export const purge = () => - axios.delete(getApiUrlByResourceType(ResourceType.MELLOMLAGRING), { ...axiosConfigPsb, data: {} }); +export const purge = () => axios.delete(ResourceType.MELLOMLAGRING, { ...axiosConfigPsb, data: {} }); export const getForrigeSoknad = () => { if (isFeatureEnabled(Feature.PREUTFYLLING) == false) { return Promise.resolve(undefined); } return axios - .get(getInnsynApiUrlByResourceType(ResourceTypeInnsyn.FORRIGE_SOKNAD), { + .get(ResourceTypeInnsyn.FORRIGE_SOKNAD, { ...axiosConfigInnsyn, transformResponse: storageParser, }) .then((result) => Promise.resolve(result)) .catch(() => Promise.resolve(undefined)); }; -export const getBarn = () => axios.get(getApiUrlByResourceType(ResourceType.BARN), axiosJsonConfig); -export const getSøker = () => axios.get(getApiUrlByResourceType(ResourceType.SØKER), axiosJsonConfig); +export const getBarn = () => axios.get(ResourceType.BARN, axiosJsonConfig); +export const getSøker = () => axios.get(ResourceType.SØKER, axiosJsonConfig); export const getArbeidsgiver = (fom: string, tom: string): Promise> => { return axios.get( - `${getApiUrlByResourceType(ResourceType.ARBEIDSGIVER)}?fra_og_med=${fom}&til_og_med=${tom}&frilansoppdrag=true`, + `${ResourceType.ARBEIDSGIVER}?fra_og_med=${fom}&til_og_med=${tom}&frilansoppdrag=true`, axiosJsonConfig ); }; -export const sendApplication = (data: SøknadApiData) => - axios.post(getApiUrlByResourceType(ResourceType.SEND_SØKNAD), data, axiosJsonConfig); +export const sendApplication = (data: SøknadApiData) => axios.post(ResourceType.SEND_SØKNAD, data, axiosJsonConfig); export const uploadFile = (file: File) => { const formData = new FormData(); formData.append('vedlegg', file); - return sendMultipartPostRequest(getApiUrlByResourceType(ResourceType.VEDLEGG), formData); + return sendMultipartPostRequest(ResourceType.VEDLEGG, formData); }; export const deleteFile = (url: string) => axios.delete(url, axiosConfigPsb); diff --git a/src/app/api/utils/apiUtils.ts b/src/app/api/utils/apiUtils.ts index 6904e981d..c9933d6a8 100644 --- a/src/app/api/utils/apiUtils.ts +++ b/src/app/api/utils/apiUtils.ts @@ -11,11 +11,11 @@ export const sendMultipartPostRequest = (url: string, formData: FormData) => { }; export const getApiUrlByResourceType = (resourceType: ResourceType) => { - return `${getEnvironmentVariable('API_URL')}/${resourceType}`; + return `${getEnvironmentVariable('FRONTEND_API_PATH')}/${resourceType}`; }; export const getInnsynApiUrlByResourceType = (resourceType: ResourceTypeInnsyn) => { - return `${getEnvironmentVariable('API_URL_INNSYN')}/${resourceType}`; + return `${getEnvironmentVariable('FRONTEND_INNSYN_API_PATH')}/${resourceType}`; }; export const apiUtils = { diff --git a/src/app/components/formik-file-uploader/FormikFileUploader.tsx b/src/app/components/formik-file-uploader/FormikFileUploader.tsx index 681e7e3fb..a0ad356e0 100644 --- a/src/app/components/formik-file-uploader/FormikFileUploader.tsx +++ b/src/app/components/formik-file-uploader/FormikFileUploader.tsx @@ -15,6 +15,7 @@ import { SøknadFormField, SøknadFormValues } from '../../types/SøknadFormValu import apiUtils from '@navikt/sif-common-core/lib/utils/apiUtils'; import appSentryLogger from '../../utils/appSentryLogger'; import { ValidationError } from '@navikt/sif-common-formik/lib/validation/types'; +import { getAttachmentURLFrontend } from '../../utils/attachmentUtilsAuthToken'; export type FieldArrayReplaceFn = (index: number, value: any) => void; export type FieldArrayPushFn = (obj: any) => void; @@ -89,7 +90,7 @@ const FormikFileUploader = ({ try { const response = await uploadFile(file); attachment = setAttachmentPendingToFalse(attachment); - attachment.url = response.headers.location; + attachment.url = getAttachmentURLFrontend(response.headers.location); attachment.uploaded = true; } catch (error: any) { if (apiUtils.isUnauthorized(error)) { diff --git a/src/app/config/axiosConfig.ts b/src/app/config/axiosConfig.ts index 8eb93b8cb..7d93f6440 100644 --- a/src/app/config/axiosConfig.ts +++ b/src/app/config/axiosConfig.ts @@ -2,16 +2,16 @@ import { AxiosRequestConfig } from 'axios'; import { getEnvVariableOrDefault } from '../utils/envUtils'; const axiosConfigCommon: AxiosRequestConfig = { - withCredentials: true, + withCredentials: false, headers: { 'Content-type': 'application/json; charset=utf-8' }, }; export const axiosConfigPsb: AxiosRequestConfig = { ...axiosConfigCommon, - baseURL: getEnvVariableOrDefault('API_URL', 'http://localhost:8082'), + baseURL: getEnvVariableOrDefault('FRONTEND_API_PATH', 'http://localhost:8082'), }; export const axiosConfigInnsyn = { ...axiosConfigCommon, - baseURL: getEnvVariableOrDefault('API_URL_INNSYN', 'http://localhost:8082'), + baseURL: getEnvVariableOrDefault('FRONTEND_INNSYN_API_PATH', 'http://localhost:8082'), }; diff --git a/src/app/i18n/nb.json b/src/app/i18n/nb.json index eb811887e..04c6cca8b 100644 --- a/src/app/i18n/nb.json +++ b/src/app/i18n/nb.json @@ -120,7 +120,7 @@ "avbrytSøknadDialog.tittel": "Avbryt og slett søknad", "fortsettSøknadSenereDialog.avbrytSøknadLabel": "Ja, fortsett senere", "fortsettSøknadSenereDialog.fortsettSøknadLabel": "Nei", - "fortsettSøknadSenereDialog.intro": "Vi lagrer det du har fylt ut i søknaden i 72 timer (3 døgn). Når du vil fortsette på søknaden finner du den igjen på Dine pleiepenger på Ditt NAV.", + "fortsettSøknadSenereDialog.intro": "Når du vil fortsette, finner du igjen søknaden på «Min side» under «Dine pleiepenger».", "fortsettSøknadSenereDialog.spørsmål": "Vil du avslutte nå og fortsette senere?", "fortsettSøknadSenereDialog.tittel": "Avslutt og fortsett senere", @@ -259,9 +259,6 @@ "steg.tidsrom.hvorMye.spm": "Hvor mye søker du om?", "steg.tidsrom.hvorMye.hjelp.part1": "Kan du jobbe noe? Da reduserer du prosenten tilsvarende.", "steg.tidsrom.hvorMye.hjelp.part2": "Jobber du deltid i utgangspunktet? Du kan likevel søke om 100 % pleiepenger hvis du mister hele inntekten fordi du pleier barnet.", - "steg.tidsrom.annenSamtidig.spm": "Er det en annen person som søker om pleiepenger i samme periode som deg?", - "steg.tidsrom.samtidigHjemme.spm": "Skal dere være hjemme/på sykehus samtidig for å pleie barnet?", - "steg.tidsrom.dagerPerUkeBorteFraJobb.spm": "Hvor mange dager per uke skal du være borte fra jobb for å ta hånd om barnet? Rund av til nærmeste halve dag.", "steg.tidsrom.skalPassePåBarnetIHelePerioden.spm": "Skal du passe på barnet i hele tidsrommet du skal ha pleiepenger?", "steg.tidsrom.bekreftOmsorgEkstrainfo.spm": "Beskriv omsorgsrollen du har for barnet i tidsrommet du skal ha pleiepenger:", @@ -299,21 +296,28 @@ "steg.arbeidssituasjon.verneplikt.info.tittel": "Hva betyr dette?", "steg.arbeidssituasjon.verneplikt.info.tekst": "Du skal svare ja på dette spørsmålet om du har utøvd verneplikt i minst 28 dager på starttidspunktet for perioden du søker for, eller om perioden med verneplikt var ment å vare i minst 28 dager.", - "steg.omsorgstilbud.veileder.ny.tittel": "Pleiepenger graderes ved fast og regelmessig omsorgstilbud", - "steg.omsorgstilbud.veileder.ny.1": "Et omsorgstilbud kan være barnehage, skole, SFO, omsorgsbolig, BPA (brukerstyrt personlig assistent) eller andre organiserte tilbud.", - "steg.omsorgstilbud.veileder.ny.2": "Å være innlagt eller til behandling på sykehus regnes ikke som et omsorgstilbud.", - "steg.omsorgstilbud.veileder.ny.3a": "Når tiden barnet oppholder seg i et omsorgstilbud er fast og regelmessig, skal pleiepengene graderes tilsvarende den tiden barnet er i omsorgstilbudet. Det er bare når bruken av omsorgstilbudet er", - "steg.omsorgstilbud.veileder.ny.3b": "fast og regelmessig", - "steg.omsorgstilbud.veileder.ny.3c": "at du skal oppgi hvor mye barnet oppholder seg der.", - "steg.omsorgstilbud.veileder.ny.4": "Hvis bruken av omsorgstilbudet er uforutsigbar og uregelmessig graderes ikke pleiepengene, og du skal heller ikke oppgi noe av tiden barnet oppholder seg der.", - - "steg.omsorgstilbud.veileder.1": "Et omsorgstilbud kan være barnehage, skole, SFO, omsorgsbolig, BPA (brukerstyrt personlig assistent) eller andre organiserte tilbud.", - "steg.omsorgstilbud.veileder.2": "Å være innlagt eller til behandling på sykehus regnes ikke som et omsorgstilbud.", - "steg.omsorgstilbud.veileder.3": "Hvis barnet er i et etablert omsorgstilbud i perioden du søker for, skal pleiepengene graderes tilsvarende den tiden barnet er i omsorgstilbudet. At omsorgstilbudet er etablert betyr at den tiden som barnet er i omsorgstilbudet er fast og regelmessig.", - "steg.omsorgstilbud.veileder.4": "Hvis bruken av omsorgstilbud er uforutsigbar og uregelmessig, slik at du ikke vet når barnet skal være der, skal du heller ikke oppgi noe av tiden barnet er der. I disse tilfellene anses ikke omsorgstilbudet som etablert, og pleiepengen graderes ikke.", - - "steg.omsorgstilbud.veileder.infoFlereBarn.tittel": "Hvordan fylle inn omsorgstilbud hvis jeg søker for flere barn?", - "steg.omsorgstilbud.veileder.infoFlereBarn": "Du skal svare ja bare hvis barna skal være samtidig i omsorgstilbudet. Du svarer nei hvis minst ett av barna ikke skal være der samtidig med det andre barnet, eller hvis barna skal være i omsorgstilbudet på ulike tider.", + "steg.omsorgstilbud.veileder.1": "Her skal du svare på om barnet oppholder seg fast og regelmessig i et omsorgstilbud, som", + "steg.omsorgstilbud.veileder.1.1": "barnehage", + "steg.omsorgstilbud.veileder.1.2": "skole", + "steg.omsorgstilbud.veileder.1.3": "skolefritidsordning", + "steg.omsorgstilbud.veileder.1.4": "omsorgsbolig", + "steg.omsorgstilbud.veileder.1.5": "BPA (brukerstyrt personlig assistent)", + "steg.omsorgstilbud.veileder.1.6": "andre organiserte omsorgstilbud ", + "steg.omsorgstilbud.veileder.2": "Å være innlagt eller til behandling på sykehus regnes ikke som et omsorgstilbud.", + "steg.omsorgstilbud.veileder.3": "Pleiepenger graderes ved fast og regelmessig omsorgstilbud", + "steg.omsorgstilbud.veileder.3.1": "Når tiden barnet oppholder seg i et omsorgstilbud er fast og regelmessig, skal pleiepengene graderes tilsvarende den tiden barnet er i omsorgstilbudet. Det er bare når bruken av omsorgstilbudet er", + "steg.omsorgstilbud.veileder.3.2": "fast og regelmessig", + "steg.omsorgstilbud.veileder.3.3": "at du skal oppgi hvor mye barnet oppholder seg der.", + "steg.omsorgstilbud.veileder.3.4": "Hvis bruken av omsorgstilbudet er uforutsigbar og uregelmessig graderes ikke pleiepengene, og du skal heller ikke oppgi noe av tiden barnet oppholder seg der.", + + "steg.omsorgstilbud.veileder.4": "Hvordan svare på omsorgstilbud når du pleier flere barn samtidig", + "steg.omsorgstilbud.veileder.4.1": "Du skal svare ja på at barna er i et fast og regelmessig omsorgstilbud bare hvis de skal være der samtidig. Du skal svare nei hvis barna skal være i omsorgstilbudet på ulike tider, eller hvis minst ett barn ikke skal være i et omsorgstilbud i det hele tatt.", + + "steg.omsorgstilbud.veileder.5": "Slik svarer du hvis barnet er i flere omsorgstilbud", + "steg.omsorgstilbud.veileder.5.1": "Når barnet er fast og regelmessig i flere omsorgstilbud, skal du oppgi den samlede tiden.", + "steg.omsorgstilbud.veileder.5.2": "Hvis barnet er fast og regelmessig i bare ett av omsorgstilbudene, skal du kun oppgi tiden i omsorgstilbudet som er fast.", + "steg.omsorgstilbud.veileder.5.3": "Eksempel: Anne er på skolen 3 timer hver onsdag. I tillegg er hun på SFO 1 time etter skoletid samme dag. Utenom dette er Anne hjemme fra skolen og SFO. Da skal du oppgi at Anne til sammen er 4 timer i omsorgstilbud på onsdager.", + "steg.omsorgstilbud.veileder.5.4": "Hvis Anne er på skolen 3 timer hver onsdag, men bare av og til på SFO, skal du bare oppgi den tiden som hun er på skolen.", "step.omsorgstilbud.søkerKunHelgedager.alert.avsnitt.1": "Du kan kun få utbetalt pleiepenger for hverdager. Det utbetales ikke pleiepenger for lørdag eller søndag selv om du har hatt fravær fra jobb for å pleie barn.", "step.omsorgstilbud.søkerKunHelgedager.alert.avsnitt.2": "Du kan derfor ikke registrere omsørgstilbud kun for lørdag og/eller søndag.", @@ -323,18 +327,16 @@ "steg.omsorgstilbud.tittel": "Omsorgstilbud frem i tid", "steg.omsorgstilbud.erIOmsorgstilbud.spm": "Er barnet fast og regelmessig i et omsorgstilbud i perioden?", "steg.omsorgstilbud.erIOmsorgstilbudFortid": "Frem til nå", - "steg.omsorgstilbud.erIOmsorgstilbudFortid.spm": "Har barnet vært fast og regelmessig i et omsorgstilbud frem til nå?", - "steg.omsorgstilbud.erIOmsorgstilbudKunFortid.spm": "Har barnet vært fast og regelmessig i et omsorgstilbud?", + "steg.omsorgstilbud.erIOmsorgstilbudFortid.spm": "Har barnet vært fast og regelmessig på skolen, i barnehagen eller i andre omsorgstilbud frem til nå?", + "steg.omsorgstilbud.erIOmsorgstilbudKunFortid.spm": "Har barnet vært fast og regelmessig på skolen, i barnehagen eller i andre omsorgstilbud?", "steg.omsorgstilbud.erIOmsorgstilbudFremtid": "Fremover i tid", - "steg.omsorgstilbud.erIOmsorgstilbudFremtid.spm": "Skal barnet være fast og regelmessig i et omsorgstilbud fremover i tid?", - "steg.omsorgstilbud.erIOmsorgstilbudKunFremtid.spm": "Skal barnet være fast og regelmessig i et omsorgstilbud?", + "steg.omsorgstilbud.erIOmsorgstilbudFremtid.spm": "Skal barnet være fast og regelmessig på skolen, i barnehagen eller i andre omsorgstilbud fremover i tid?", + "steg.omsorgstilbud.erIOmsorgstilbudKunFremtid.spm": "Skal barnet være fast og regelmessig på skolen, i barnehagen eller i andre omsorgstilbud?", "steg.omsorgstilbud.erIOmsorgstilbudFremtid.usikker": "Når barnet har vært i et omsorgstilbud frem til nå, men du er usikker på om det blir fast og regelmessig fremover, oppgir du kun det som har vært til nå. Du gir oss beskjed hvis det senere viser seg at tiden fremover blir fast og regelmessig.", "steg.omsorgstilbud.erIOmsorgstilbudFremtid.neiUsikker": "Du må gi oss beskjed hvis barnet begynner å være fast og regelmessig i omsorgstilbud.", - "steg.omsorgstilbud.eksempel.tittel": "Eksempler på å være fast og regelmessig i et omsorgstilbud", + "steg.omsorgstilbud.eksempel.tittel": "Eksempler på å oppholde seg fast og regelmessig i et omsorgstilbud", "steg.omsorgstilbud.eksempel.1": "I perioden med pleiepenger klarer Anna å være i barnehagen mellom 5 og 15 timer per uke. Det er det laveste antallet timer Anna er i barnehagen som anses som fast og regelmessig. I dette eksempelet skal det derfor oppgis 5 timer per uke.", "steg.omsorgstilbud.eksempel.2": "Peder er på skolen bare av og til, når han er i form til det. Noen uker klarer han å være der noen timer, andre uker er han ikke på skolen i det hele tatt. I dette eksempelet skal det svares nei på om barnet er fast og regelmessig i omsorgstilbudet, ettersom tiden Peder er på skolen er uforutsigbar og uregelmessig.", - "steg.omsorgstilbud.info.flereBarnSamtidig.tittel": "Omsorgstilbud når du pleier flere barn samtidig", - "steg.omsorgstilbud.info.flereBarnSamtidig": "Du skal svare ja på at barna er i et fast og regelmessig omsorgstilbud bare hvis de skal være der samtidig. Du skal svare nei hvis barna skal være i omsorgstilbudet på ulike tider, eller hvis minst ett barn ikke skal være i et omsorgstilbud i det hele tatt.", "steg.omsorgstilbud.erIOmsorgstilbud.nei.info": "Du må gi oss beskjed hvis barnet begynner å være fast og regelmessig i et omsorgstilbud i pleiepengeperioden.", "steg.omsorgstilbud.erLiktHverUke.spm.tittel": "Tid i omsorgstilbud", "steg.omsorgstilbud.erLiktHverUke.spm.fortidFremtid": "Er tiden barnet er i omsorgstilbudet lik hver uke?", @@ -430,21 +432,16 @@ "steg.oppsummering.ferieuttakIPerioden.header": "Skal du ta ut ferie i perioden?", "steg.oppsummering.ferieuttakIPerioden.listetittel": "Ferieuttak i perioden", - "steg.oppsummering.dagerPerUkeBorteFraJobb.header": "Antall dager i uken du skal være borte fra jobb for å ta hånd om barnet", - "steg.oppsummering.samtidigHjemme.header": "Skal dere være hjemme/på sykehus samtidig?", - "steg.oppsummering.annenSøkerSammePeriode.header": "Er det en annen person som søker om pleiepenger i samme periode?", - "steg.oppsummering.nattevåk.borteFraJobb.header": "Må være borte fra jobb", - "steg.oppsummering.omsorgstilbud.header": "Omsorgstilbud i søknadsperioden", - "steg.oppsummering.omsorgstilbud.fortid.spm": "Har barnet vært fast og regelmessig i et omsorgstilbud?", + "steg.oppsummering.omsorgstilbud.fortid.spm": "Har barnet vært fast og regelmessig på skolen, i barnehagen eller i andre omsorgstilbud?", "steg.oppsummering.omsorgstilbud.fortid.svar.JA": "Ja, i hele eller deler av perioden", "steg.oppsummering.omsorgstilbud.fortid.svar.NEI": "Nei", - "steg.oppsummering.omsorgstilbud.fremtid.spm": "Skal barnet være fast og regelmessig i et omsorgstilbud fremover i tid?", - "steg.oppsummering.omsorgstilbud.fremtid.spm.kunFremtid": "Skal barnet være fast og regelmessig i et omsorgstilbud?", + "steg.oppsummering.omsorgstilbud.fremtid.spm": "Skal barnet være fast og regelmessig på skolen, i barnehagen eller i andre omsorgstilbud fremover i tid?", + "steg.oppsummering.omsorgstilbud.fremtid.spm.kunFremtid": "Skal barnet være fast og regelmessig på skolen, i barnehagen eller i andre omsorgstilbud?", "steg.oppsummering.omsorgstilbud.fremtid.svar.JA": "Ja, i hele eller deler av perioden", "steg.oppsummering.omsorgstilbud.fremtid.svar.NEI": "Nei", "steg.oppsummering.omsorgstilbud.fremtid.svar.USIKKER": "Usikker", - "steg.oppsummering.omsorgstilbud.fortidFremtid.spm": "Er barnet fast og regelmessig i et omsorgstilbud i perioden?", + "steg.oppsummering.omsorgstilbud.fortidFremtid.spm": "Er barnet fast og regelmessig på skolen, i barnehagen eller i andre omsorgstilbud i perioden?", "steg.oppsummering.nattevåkBeredskap.header": "Nattevåk og beredskap", "steg.oppsummering.omsorgstilbud.fast.header": "Omsorgstilbud er likt hver uke i perioden:", "steg.oppsummering.omsorgstilbud.fast.header.fortid": "Tiden har vært lik hver uke i perioden:", @@ -763,8 +760,6 @@ "validation.periodeTil.dateIsNotWeekday": "Periodens til-dato må være en ukedag, det kan ikke være en lørdag eller søndag. Skriv inn eller velg dato fra kalenderen.", "validation.periodeTil.dateIsAfterMax": "Du kan kun søke pleiepenger for opptil ett år av gangen.", "validation.periodeTil.toDateIsBeforeFromDate": "Til-datoen kan ikke være før fra-datoen. Skriv inn eller velg dato fra kalenderen.", - "validation.harMedsøker.yesOrNoIsUnanswered": "Du må svare ja eller nei på om det er annen person som søker om pleiepenger i samme periode som deg.", - "validation.samtidigHjemme.yesOrNoIsUnanswered": "Du må svare ja eller nei på om dere skal være hjemme/på sykehus samtidig for å pleie barnet.", "validation.skalOppholdeSegIUtlandetIPerioden.yesOrNoIsUnanswered": "Du må svare ja eller nei på om du skal reise til utlandet i perioden du søker for.", "validation.utenlandsoppholdIPerioden.utenlandsopphold_ikke_registrert": "Du har svart ja til at du skal til utlandet i perioden med pleiepenger. Legg til minst ett utenlandsopphold.", "validation.utenlandsoppholdIPerioden.utenlandsopphold_overlapper": "Du har lagt inn utenlandsopphold med datoer som overlapper hverandre.", diff --git "a/src/app/s\303\270knad/omsorgstilbud-step/info/OmsorgstilbudInfo.tsx" "b/src/app/s\303\270knad/omsorgstilbud-step/info/OmsorgstilbudInfo.tsx" index 563b76996..4bfc209c7 100644 --- "a/src/app/s\303\270knad/omsorgstilbud-step/info/OmsorgstilbudInfo.tsx" +++ "b/src/app/s\303\270knad/omsorgstilbud-step/info/OmsorgstilbudInfo.tsx" @@ -1,6 +1,7 @@ import Box from '@navikt/sif-common-core/lib/components/box/Box'; import CounsellorPanel from '@navikt/sif-common-core/lib/components/counsellor-panel/CounsellorPanel'; import ExpandableInfo from '@navikt/sif-common-core/lib/components/expandable-content/ExpandableInfo'; +import FormattedHtmlMessage from '@navikt/sif-common-core/lib/components/formatted-html-message/FormattedHtmlMessage'; import intlHelper from '@navikt/sif-common-core/lib/utils/intlUtils'; import AlertStripe from 'nav-frontend-alertstriper'; import React from 'react'; @@ -11,40 +12,72 @@ const OmsorgstilbudStepInfo = () => { return (

- +

+

- +

- + +

{intlHelper(intl, 'steg.omsorgstilbud.eksempel.1')}

+

{intlHelper(intl, 'steg.omsorgstilbud.eksempel.2')}

+
+
+ +

- {' '} + {' '} - + {' '} - +

- +

- -

{intlHelper(intl, 'steg.omsorgstilbud.eksempel.1')}

-

{intlHelper(intl, 'steg.omsorgstilbud.eksempel.2')}

+ +

+ +

- + +

+ +

+

+ +

+

+ +

- +

diff --git "a/src/app/s\303\270knad/opplysninger-om-barnet-step/AnnetBarnPart.tsx" "b/src/app/s\303\270knad/opplysninger-om-barnet-step/AnnetBarnPart.tsx" index b12c8d475..fba1c34b1 100644 --- "a/src/app/s\303\270knad/opplysninger-om-barnet-step/AnnetBarnPart.tsx" +++ "b/src/app/s\303\270knad/opplysninger-om-barnet-step/AnnetBarnPart.tsx" @@ -29,13 +29,14 @@ interface Props { formValues: SøknadFormValues; søkersFødselsnummer: string; attachments: Attachment[]; + harRegistrerteBarn: boolean; } const nYearsAgo = (years: number): Date => { return dayjs(dateToday).subtract(years, 'y').startOf('year').toDate(); }; -const AnnetBarnPart: React.FC = ({ formValues, søkersFødselsnummer, attachments }) => { +const AnnetBarnPart: React.FC = ({ formValues, søkersFødselsnummer, attachments, harRegistrerteBarn }) => { const intl = useIntl(); const { values: { barnetHarIkkeFnr, årsakManglerIdentitetsnummer }, @@ -46,9 +47,11 @@ const AnnetBarnPart: React.FC = ({ formValues, søkersFødselsnummer, att - {intlHelper(intl, 'steg.omBarnet.annetBarn.tittel')} - + harRegistrerteBarn ? ( + + {intlHelper(intl, 'steg.omBarnet.annetBarn.tittel')} + + ) : undefined }> { formValues={values} søkersFødselsnummer={søkerdata.søker.fødselsnummer} attachments={attachments} + harRegistrerteBarn={harRegistrerteBarn(søkerdata)} /> )} diff --git "a/src/app/s\303\270knad/oppsummering-step/OppsummeringStep.tsx" "b/src/app/s\303\270knad/oppsummering-step/OppsummeringStep.tsx" index 5239d8e1f..6f541c84f 100644 --- "a/src/app/s\303\270knad/oppsummering-step/OppsummeringStep.tsx" +++ "b/src/app/s\303\270knad/oppsummering-step/OppsummeringStep.tsx" @@ -201,22 +201,6 @@ const OppsummeringStep = ({ onApplicationSent, values, søknadsdato }: Props) => - -
- -
-
- - {apiValues.harMedsøker && ( - -
- -
-
- )} - {/* Utenlandsopphold i perioden */} {utenlandsoppholdIPerioden && ( <> diff --git "a/src/app/s\303\270knad/tidsrom-step/TidsromStep.tsx" "b/src/app/s\303\270knad/tidsrom-step/TidsromStep.tsx" index a18f17259..d0525f5f0 100644 --- "a/src/app/s\303\270knad/tidsrom-step/TidsromStep.tsx" +++ "b/src/app/s\303\270knad/tidsrom-step/TidsromStep.tsx" @@ -55,8 +55,6 @@ const TidsromStep = ({ onValidSubmit }: StepConfigProps) => { ? søkerdata?.barn.find((barn) => barn.aktørId === values.barnetSøknadenGjelder) : undefined; - const harMedsøker = values[SøknadFormField.harMedsøker]; - const periodeFra = datepickerUtils.getDateFromDateString(values.periodeFra); const periodeTil = datepickerUtils.getDateFromDateString(values.periodeTil); @@ -135,26 +133,6 @@ const TidsromStep = ({ onValidSubmit }: StepConfigProps) => { {!søkerKunHelgedager(values.periodeFra, values.periodeTil) && ( <> - - - - - {harMedsøker === YesOrNo.YES && ( - - - - )} - { + return url.replace(getEnvironmentVariable('API_URL'), getEnvironmentVariable('FRONTEND_VEDLEGG_URL')); +}; + +export const getAttachmentURLBackend = (url?: string): string => { + if (url !== undefined) { + return url.replace(getEnvironmentVariable('FRONTEND_VEDLEGG_URL'), getEnvironmentVariable('API_URL')); + } + return ''; +}; diff --git "a/src/app/utils/formValuesToS\303\270knadsdata/__tests__/extractMeds\303\270kerS\303\270knadsdata.test.ts" "b/src/app/utils/formValuesToS\303\270knadsdata/__tests__/extractMeds\303\270kerS\303\270knadsdata.test.ts" deleted file mode 100644 index ac43bc2f3..000000000 --- "a/src/app/utils/formValuesToS\303\270knadsdata/__tests__/extractMeds\303\270kerS\303\270knadsdata.test.ts" +++ /dev/null @@ -1,28 +0,0 @@ -import { YesOrNo } from '@navikt/sif-common-core/lib/types/YesOrNo'; -import { extractMedsøkerSøknadsdata } from '../extractMedsøkerSøknadsdata'; - -describe('extractMedsøkerSøknadsdata', () => { - describe('Har ikke medsøker', () => { - it('returnerer undefined', () => { - const result = extractMedsøkerSøknadsdata({ harMedsøker: YesOrNo.NO }); - expect(result).toBeUndefined(); - }); - }); - describe('Har medsøker', () => { - it('returnerer harMedsøker og samtidigHjemme false', () => { - const result = extractMedsøkerSøknadsdata({ harMedsøker: YesOrNo.YES, samtidigHjemme: YesOrNo.NO }); - expect(result).toBeDefined(); - expect(result?.type).toEqual('harMedsøker'); - expect(result?.samtidigHjemme).toEqual(false); - }); - }); - - describe('Har medsøker og samtidigHjemme', () => { - it('returnerer harMedsøker og samtidigHjemme tru', () => { - const result = extractMedsøkerSøknadsdata({ harMedsøker: YesOrNo.YES, samtidigHjemme: YesOrNo.YES }); - expect(result).toBeDefined(); - expect(result?.type).toEqual('harMedsøker'); - expect(result?.samtidigHjemme).toEqual(true); - }); - }); -}); diff --git "a/src/app/utils/formValuesToS\303\270knadsdata/extractMeds\303\270kerS\303\270knadsdata.ts" "b/src/app/utils/formValuesToS\303\270knadsdata/extractMeds\303\270kerS\303\270knadsdata.ts" deleted file mode 100644 index aab16193d..000000000 --- "a/src/app/utils/formValuesToS\303\270knadsdata/extractMeds\303\270kerS\303\270knadsdata.ts" +++ /dev/null @@ -1,18 +0,0 @@ -import { YesOrNo } from '@navikt/sif-common-core/lib/types/YesOrNo'; -import { SøknadFormValues } from '../../types/SøknadFormValues'; -import { MedsøkerSøknadsdata } from '../../types/søknadsdata/Søknadsdata'; - -export const extractMedsøkerSøknadsdata = ({ - harMedsøker, - samtidigHjemme, -}: Partial): MedsøkerSøknadsdata | undefined => { - if (harMedsøker && harMedsøker === YesOrNo.YES) { - return { - type: 'harMedsøker', - harMedsøker: true, - samtidigHjemme: samtidigHjemme === YesOrNo.YES, - }; - } - - return undefined; -}; diff --git "a/src/app/utils/formValuesToS\303\270knadsdata/getS\303\270knadsdataFromFormValues.ts" "b/src/app/utils/formValuesToS\303\270knadsdata/getS\303\270knadsdataFromFormValues.ts" index dbc8b29d1..1085d8713 100644 --- "a/src/app/utils/formValuesToS\303\270knadsdata/getS\303\270knadsdataFromFormValues.ts" +++ "b/src/app/utils/formValuesToS\303\270knadsdata/getS\303\270knadsdataFromFormValues.ts" @@ -6,7 +6,6 @@ import { extractBarnSøknadsdata } from './extractBarnSøknadsdata'; import { extractBeredskapSøknadsdata } from './extractBeredskapSøknadsdata'; import { extractFerieuttakIPeriodenSøknadsdata } from './extractFerieuttakIPeriodenSøknadsdata'; import { extractMedlemskapSøknadsdata } from './extractMedlemskapSøknadsdata'; -import { extractMedsøkerSøknadsdata } from './extractMedsøkerSøknadsdata'; import { extractNattevåkSøknadsdata } from './extractNattevåkSøknadsdata'; import { extractOmsorgstibudSøknadsdata } from './extractOmsorgstibudSøknadsdata'; import { extractUtenlandsoppholdIPeriodenSøknadsdata } from './extractUtenlandsoppholdIPeriodenSøknadsdata'; @@ -21,7 +20,6 @@ export const getSøknadsdataFromFormValues = (values: SøknadFormValues): Søkna harForståttRettigheterOgPlikter, søknadsperiode, barn: extractBarnSøknadsdata(values), - medsøker: extractMedsøkerSøknadsdata(values), utenlandsoppholdIPerioden: extractUtenlandsoppholdIPeriodenSøknadsdata(values), ferieuttakIPerioden: extractFerieuttakIPeriodenSøknadsdata(values), arbeid: extractArbeidSøknadsdata(values, søknadsperiode), diff --git "a/src/app/utils/importInnsendtS\303\270knad/__tests__/extractTidsromFormValues.test.ts" "b/src/app/utils/importInnsendtS\303\270knad/__tests__/extractTidsromFormValues.test.ts" index cb2aa2326..c82801df2 100644 --- "a/src/app/utils/importInnsendtS\303\270knad/__tests__/extractTidsromFormValues.test.ts" +++ "b/src/app/utils/importInnsendtS\303\270knad/__tests__/extractTidsromFormValues.test.ts" @@ -2,49 +2,16 @@ import { YesOrNo } from '@navikt/sif-common-formik/lib'; import { UtenlandsoppholdÅrsak } from '@navikt/sif-common-forms/lib/utenlandsopphold/types'; import { dateToISODate } from '@navikt/sif-common-utils/lib'; import { - SøknadApiData, UtenlandsoppholdIPeriodenApiData, UtenlandsoppholdUtenforEøsIPeriodenApiData, } from '../../../types/søknad-api-data/SøknadApiData'; import { extractFerieIPeriodenFormValues, - extractTidsromFormValues, extractUtenlandsoppholdIPeriodenFormValues, mapUtenlandsoppholdApiDataToUtenlandsopphold, } from '../extractTidsromFormValues'; -const mockSøknad: SøknadApiData = { - fraOgMed: '2020-01-01', - tilOgMed: '2020-02-01', -} as SøknadApiData; - describe('extractTidsromFormValues', () => { - describe('extractMedsøkerFormValues', () => { - it('returnerer riktig når søknad ikke har medsøker', () => { - const result = extractTidsromFormValues({ ...mockSøknad, harMedsøker: false }); - expect(result).toBeDefined(); - if (result) { - expect(result.harMedsøker).toEqual(YesOrNo.NO); - expect(result.samtidigHjemme).toEqual(YesOrNo.UNANSWERED); - } - }); - it('returnerer riktig når søknad har medsøker og ikke er samtidig hjemme', () => { - const result = extractTidsromFormValues({ ...mockSøknad, harMedsøker: true, samtidigHjemme: false }); - expect(result).toBeDefined(); - if (result) { - expect(result.harMedsøker).toEqual(YesOrNo.YES); - expect(result.samtidigHjemme).toEqual(YesOrNo.NO); - } - }); - it('returnerer riktig når søknad har medsøker og er samtidig hjemme', () => { - const result = extractTidsromFormValues({ ...mockSøknad, harMedsøker: true, samtidigHjemme: true }); - expect(result).toBeDefined(); - if (result) { - expect(result.harMedsøker).toEqual(YesOrNo.YES); - expect(result.samtidigHjemme).toEqual(YesOrNo.YES); - } - }); - }); describe('extractFerieIPeriodenFormValues', () => { it('returnerer riktig når ferie er undefined eller bruker har svart nei', () => { expect( diff --git "a/src/app/utils/importInnsendtS\303\270knad/extractTidsromFormValues.ts" "b/src/app/utils/importInnsendtS\303\270knad/extractTidsromFormValues.ts" index fd6adf6e6..5abbd9317 100644 --- "a/src/app/utils/importInnsendtS\303\270knad/extractTidsromFormValues.ts" +++ "b/src/app/utils/importInnsendtS\303\270knad/extractTidsromFormValues.ts" @@ -11,9 +11,8 @@ import { UtenlandsoppholdIPeriodenSøknadApiData, } from '../../types/søknad-api-data/SøknadApiData'; import { SøknadFormField, SøknadFormValues } from '../../types/SøknadFormValues'; -import { booleanToYesOrNo, booleanToYesOrNoOrUnanswered } from '../booleanToYesOrNo'; +import { booleanToYesOrNo } from '../booleanToYesOrNo'; -type MedsøkerFormValues = Pick; type FerieIPeriodenFormValues = Pick< SøknadFormValues, SøknadFormField.skalTaUtFerieIPerioden | SøknadFormField.ferieuttakIPerioden @@ -22,7 +21,7 @@ type UtenlandsoppholdIPeriodenFormValues = Pick< SøknadFormValues, SøknadFormField.skalOppholdeSegIUtlandetIPerioden | SøknadFormField.utenlandsoppholdIPerioden >; -type TidsromFormValues = MedsøkerFormValues & UtenlandsoppholdIPeriodenFormValues & FerieIPeriodenFormValues; +type TidsromFormValues = UtenlandsoppholdIPeriodenFormValues & FerieIPeriodenFormValues; const mapPeriodeApiDataToFerieuttak = (ferieuttak: PeriodeApiData): Ferieuttak => ({ id: guid(), @@ -30,13 +29,6 @@ const mapPeriodeApiDataToFerieuttak = (ferieuttak: PeriodeApiData): Ferieuttak = tom: ISODateToDate(ferieuttak.tilOgMed), }); -export const extractMedsøkerFormValues = (søknad: SøknadApiData): MedsøkerFormValues => { - return { - [SøknadFormField.harMedsøker]: booleanToYesOrNo(søknad.harMedsøker), - [SøknadFormField.samtidigHjemme]: booleanToYesOrNoOrUnanswered(søknad.samtidigHjemme), - }; -}; - export const extractFerieIPeriodenFormValues = ( ferieuttakIPerioden?: FerieuttakIPeriodenApiData ): FerieIPeriodenFormValues => { @@ -99,7 +91,6 @@ export const extractUtenlandsoppholdIPeriodenFormValues = ( export const extractTidsromFormValues = (søknad: SøknadApiData): Partial | undefined => { return { - ...extractMedsøkerFormValues(søknad), ...extractFerieIPeriodenFormValues(søknad.ferieuttakIPerioden), ...extractUtenlandsoppholdIPeriodenFormValues(søknad.utenlandsoppholdIPerioden), }; diff --git "a/src/app/utils/s\303\270knadsdataToApiData/__tests__/getAttachmentsApiDataFromS\303\270knadsdata.test.ts" "b/src/app/utils/s\303\270knadsdataToApiData/__tests__/getAttachmentsApiDataFromS\303\270knadsdata.test.ts" index f62d14604..d9eaeb1da 100644 --- "a/src/app/utils/s\303\270knadsdataToApiData/__tests__/getAttachmentsApiDataFromS\303\270knadsdata.test.ts" +++ "b/src/app/utils/s\303\270knadsdataToApiData/__tests__/getAttachmentsApiDataFromS\303\270knadsdata.test.ts" @@ -34,16 +34,19 @@ describe('getAttachmentsApiDataFromSøknadsdata', () => { }; it('returns an array with strings when all attachments has url', () => { + (window as any).appSettings = { FRONTEND_VEDLEGG_URL: 'http://localhost:8080/api' }; const result = getAttachmentsApiDataFromSøknadsdata([uploadedAttachment]); expect(result.length).toBe(1); expect(result[0]).toEqual(uploadedAttachmentUrl); }); it('does not include not uploaded attachments', () => { + (window as any).appSettings = { FRONTEND_VEDLEGG_URL: 'http://localhost:8080/api' }; const result = getAttachmentsApiDataFromSøknadsdata([uploadedAttachment, failedAttachment]); expect(result.length).toBe(1); expect(result[0]).toEqual(uploadedAttachmentUrl); }); it('does not include attachments with no url', () => { + (window as any).appSettings = { FRONTEND_VEDLEGG_URL: 'http://localhost:8080/api' }; const result = getAttachmentsApiDataFromSøknadsdata([ missingUrlAttachment, uploadedAttachment, diff --git "a/src/app/utils/s\303\270knadsdataToApiData/getApiDataFromS\303\270knadsdata.ts" "b/src/app/utils/s\303\270knadsdataToApiData/getApiDataFromS\303\270knadsdata.ts" index 825d3dc75..11f85be61 100644 --- "a/src/app/utils/s\303\270knadsdataToApiData/getApiDataFromS\303\270knadsdata.ts" +++ "b/src/app/utils/s\303\270knadsdataToApiData/getApiDataFromS\303\270knadsdata.ts" @@ -12,7 +12,6 @@ import { getBeredskapApiDataFromSøknadsdata } from './getBeredskapApiDataFromS import { getFerieuttakIPeriodenApiDataFromSøknadsdata } from './getFerieuttakIPeriodenApiDataFromSøknadsdata'; import { getFrilansApiDataFromSøknadsdata } from './getFrilansApiDataFromSøknadsdata'; import { getMedlemskapApiDataFromSøknadsdata } from './getMedlemskapApiDataFromSøknadsdata'; -import { getMedsøkerApiDataFromSøknadsdata } from './getMedsøkerApiDataFromSøknadsdata'; import { getNattevåkApiDataFromSøknadsdata } from './getNattevåkApiDataFromSøknadsdata'; import { getOmsorgstilbudApiDataFromSøknadsdata } from './getOmsorgstibudApiDataFromSøknadsdata'; import { getOpptjeningIUtlandetSøknadsdata } from './getOpptjeningIUtlandetSøknadsdata'; @@ -48,7 +47,6 @@ export const getApiDataFromSøknadsdata = ( : [], fraOgMed: formatDateToApiFormat(søknadsperiode.from), tilOgMed: formatDateToApiFormat(søknadsperiode.to), - ...getMedsøkerApiDataFromSøknadsdata(søknadsdata.medsøker), ...getUtenlandsoppholdIPeriodenApiDataFromSøknadsdata(sprak, søknadsdata.utenlandsoppholdIPerioden), ferieuttakIPerioden: getFerieuttakIPeriodenApiDataFromSøknadsdata(søknadsdata.ferieuttakIPerioden), arbeidsgivere: getArbeidsgivereApiDataFromSøknadsdata(søknadsdata.arbeid?.arbeidsgivere), diff --git "a/src/app/utils/s\303\270knadsdataToApiData/getAttachmentsApiDataFromS\303\270knadsdata.ts" "b/src/app/utils/s\303\270knadsdataToApiData/getAttachmentsApiDataFromS\303\270knadsdata.ts" index 962e44497..b0606eed6 100644 --- "a/src/app/utils/s\303\270knadsdataToApiData/getAttachmentsApiDataFromS\303\270knadsdata.ts" +++ "b/src/app/utils/s\303\270knadsdataToApiData/getAttachmentsApiDataFromS\303\270knadsdata.ts" @@ -1,5 +1,6 @@ import { Attachment } from '@navikt/sif-common-core/lib/types/Attachment'; import { attachmentUploadHasFailed } from '@navikt/sif-common-core/lib/utils/attachmentUtils'; +import { getAttachmentURLBackend } from '../attachmentUtilsAuthToken'; export const getAttachmentsApiDataFromSøknadsdata = (attachments: Attachment[]): string[] => { const apiData: string[] = []; @@ -7,7 +8,8 @@ export const getAttachmentsApiDataFromSøknadsdata = (attachments: Attachment[]) .filter((attachment) => !attachmentUploadHasFailed(attachment)) .forEach((a) => { if (a.url) { - apiData.push(a.url); + const attachmentUrl = getAttachmentURLBackend(a.url); + apiData.push(attachmentUrl); } }); return apiData; diff --git "a/src/app/utils/s\303\270knadsdataToApiData/getMeds\303\270kerApiDataFromS\303\270knadsdata.ts" "b/src/app/utils/s\303\270knadsdataToApiData/getMeds\303\270kerApiDataFromS\303\270knadsdata.ts" deleted file mode 100644 index 477f0df15..000000000 --- "a/src/app/utils/s\303\270knadsdataToApiData/getMeds\303\270kerApiDataFromS\303\270knadsdata.ts" +++ /dev/null @@ -1,17 +0,0 @@ -import { SøknadApiData } from '../../types/søknad-api-data/SøknadApiData'; -import { MedsøkerSøknadsdata } from '../../types/søknadsdata/Søknadsdata'; - -export type MedsøkerApiData = Pick; - -export const getMedsøkerApiDataFromSøknadsdata = (medsøker?: MedsøkerSøknadsdata): MedsøkerApiData => { - if (medsøker?.type === 'harMedsøker') { - return { - harMedsøker: medsøker.harMedsøker, - samtidigHjemme: medsøker.samtidigHjemme, - }; - } else { - return { - harMedsøker: false, - }; - } -}; diff --git a/src/build/scripts/heroku-build.js b/src/build/scripts/heroku-build.js index aeb8fba23..451ccbd9a 100644 --- a/src/build/scripts/heroku-build.js +++ b/src/build/scripts/heroku-build.js @@ -5,11 +5,13 @@ const fsExtra = require('fs-extra'); function createEnvSettingsFileForHeroku() { const settingsFile = path.resolve(__dirname, './../../../heroku/dist/js/settings.js'); - fsExtra.ensureFile(settingsFile).then((f) => { + fsExtra.ensureFile(settingsFile).then(() => { fsExtra.writeFileSync( settingsFile, `window.appSettings = { API_URL: 'https://pleiepenger.herokuapp.com/', + FRONTEND_API_PATH: 'https://pleiepenger.herokuapp.com', + FRONTEND_VEDLEGG_URL: 'https://pleiepenger.herokuapp.com/api', LOGIN_URL: 'https://pleiepenger.herokuapp.com/', APPSTATUS_PROJECT_ID: 'ryujtq87', APPSTATUS_DATASET: 'staging', diff --git a/tokenx.js b/tokenx.js new file mode 100644 index 000000000..27a40d80f --- /dev/null +++ b/tokenx.js @@ -0,0 +1,57 @@ +const { Issuer } = require('openid-client'); +let tokenxClient; + +async function initTokenX() { + const tokenxIssuer = await Issuer.discover(process.env.TOKEN_X_WELL_KNOWN_URL); + tokenxClient = new tokenxIssuer.Client( + { + client_id: process.env.TOKEN_X_CLIENT_ID, + token_endpoint_auth_method: 'private_key_jwt', + }, + { + keys: [JSON.parse(process.env.TOKEN_X_PRIVATE_JWK)], + } + ); +} + +async function getTokenXToken(token, additionalClaims, audienceInnsyn) { + let tokenSet; + try { + tokenSet = await tokenxClient?.grant( + { + grant_type: 'urn:ietf:params:oauth:grant-type:token-exchange', + client_assertion_type: 'urn:ietf:params:oauth:client-assertion-type:jwt-bearer', + subject_token_type: 'urn:ietf:params:oauth:token-type:jwt', + audience: + audienceInnsyn === true ? process.env.INNSYN_API_TOKENX_AUDIENCE : process.env.API_TOKENX_AUDIENCE, + subject_token: token, + }, + additionalClaims + ); + } catch (err) { + console.error('Noe gikk galt ved exchange token', err); + } + return tokenSet; +} + +async function exchangeToken(token, audienceInnsyn) { + if (!token) { + // Brukeren er ikke autorisert + return; + } + + const additionalClaims = { + clientAssertionPayload: { + nbf: Math.floor(Date.now() / 1000), + // TokenX only allows a single audience + aud: [tokenxClient?.issuer.metadata.token_endpoint], + }, + }; + + return await getTokenXToken(token, additionalClaims, audienceInnsyn); +} + +module.exports = { + initTokenX, + exchangeToken, +};