Skip to content

Commit

Permalink
Common server i endringsmelding psb (#2292)
Browse files Browse the repository at this point in the history
* Common server i endringsmelding psb

* Changelog
  • Loading branch information
frodehansen2 authored Oct 7, 2024
1 parent 5814c13 commit 2cbdd67
Show file tree
Hide file tree
Showing 21 changed files with 332 additions and 419 deletions.
39 changes: 22 additions & 17 deletions apps/endringsmelding-pleiepenger/.env.example
Original file line number Diff line number Diff line change
@@ -1,21 +1,26 @@
API_URL_INNSYN=http://localhost:8099
API_URL_K9_SAK_INNSYN=http://localhost:8099
API_URL=http://localhost:8099
APP_VERSION=dev
APPSTATUS_DATASET=staging
APPSTATUS_PROJECT_ID=ryujtq87
DEBUG=false
DEKORATOR_URL=https://www.nav.no/dekoratoren/?simple=true&chatbot=false
DOMAIN_URL=http://localhost:8080
FRONTEND_API_PATH=http://localhost:8099/
FRONTEND_INNSYN_API_PATH=http://localhost:8099/api
FRONTEND_K9_SAK_INNSYN_API_PATH=http://localhost:8099/api
FRONTEND_VEDLEGG_URL=http://localhost:8099/api
ENV=dev
GITHUB_REF_NAME=some_branch_name
INNSYN_URL=http://localhost:8080
LOGIN_URL=http://localhost:8099/login?redirect_location=http://localhost:8099
MINSIDE_URL=http://www.nav.no/minside
MSW=on
NODE_ENV=development
PUBLIC_PATH=/familie/sykdom-i-familien/soknad/endringsmelding-pleiepenger
TILLAT_SN=true

SIF_PUBLIC_APPSTATUS_DATASET=staging
SIF_PUBLIC_APPSTATUS_PROJECT_ID=ryujtq87
SIF_PUBLIC_DEKORATOR_URL=https://dekoratoren.ekstern.dev.nav.no/?simple=true&chatbot=false&urlLookupTable=false&logoutUrl=https://endringsmelding-pleiepenger.intern.dev.nav.no/oauth2/logout
SIF_PUBLIC_LOGIN_URL=http://localhost:8081/auth-mock/cookie?subject=mockSubject&redirect_location=http://localhost:8080
SIF_PUBLIC_MINSIDE_URL=https://www.nav.no/minside
SIF_PUBLIC_FEATURE_NYNORSK=on
SIF_PUBLIC_INNSYN_URL=https://dine-pleiepenger.intern.dev.nav.no/innsyn

K9_BRUKERDIALOG_PROSESSERING_FRONTEND_PATH=/familie/sykdom-i-familien/soknad/endringsmelding-pleiepenger/api/k9-brukerdialog
K9_BRUKERDIALOG_PROSESSERING_API_SCOPE=dev-gcp:dusseldorf:k9-brukerdialog-prosessering
K9_BRUKERDIALOG_PROSESSERING_API_URL=http://k9-brukerdialog-prosessering

SIF_INNSYN_FRONTEND_PATH=/familie/sykdom-i-familien/soknad/endringsmelding/api/sif-innsyn
SIF_INNSYN_API_URL=http://sif-innsyn-api
SIF_INNSYN_API_SCOPE=dev-gcp:dusseldorf:sif-innsyn-api

MSW=on
DEBUG=false
NOW=2023-01-01
USE_AMPLITUDE=false
6 changes: 6 additions & 0 deletions apps/endringsmelding-pleiepenger/CHANGELOG.md
Original file line number Diff line number Diff line change
@@ -1,5 +1,11 @@
# @navikt/endringsmelding-pleiepenger

## 2.32.0

### Minor Changes

- Bruke common server-oppsett

## 2.31.27

### Patch Changes
Expand Down
96 changes: 70 additions & 26 deletions apps/endringsmelding-pleiepenger/Dockerfile
Original file line number Diff line number Diff line change
@@ -1,35 +1,79 @@
FROM node:20.12-alpine AS base

FROM node:18-alpine AS base
RUN apk update && apk add git
RUN apk add --no-cache libc6-compat
ENV APP="endringsmelding-pleiepenger"
ENV SERVER="server"
ENV SCOPE=@navikt/endringsmelding-pleiepenger

RUN apk fix \
&& apk add --no-cache --update libc6-compat tini \
&& rm -rf /var/cache/apk/*

RUN yarn global add turbo

#########################################
# PREPARE DEPS FOR BUILD
#########################################

FROM base AS prepare
WORKDIR /app
COPY ["package.json", ".yarnrc.yml", "yarn.lock", "turbo.json", "./"]
COPY [".yarn/releases/*", ".yarn/releases/"]
COPY packages packages
COPY apps apps
ARG SERVER
COPY ${SERVER} ${SERVER}
RUN find apps \! -name "package.json" -mindepth 2 -maxdepth 2 -print | xargs rm -rf
RUN find packages \! -name "package.json" -mindepth 2 -maxdepth 2 -print | xargs rm -rf
RUN find ${SERVER} \! -name "package.json" -mindepth 2 -maxdepth 2 -print | xargs rm -rf

ENV SCOPE=@navikt/endringsmelding-pleiepenger
#########################################
# BUILDER IMAGE - INSTALL PACKAGES AND COPY SOURCE
#########################################

FROM base AS turbo-builder
FROM prepare AS installer
COPY --from=prepare /app ./
RUN --mount=type=secret,id=PACKAGES_AUTH_TOKEN \
PACKAGES_AUTH_TOKEN=$(cat /run/secrets/PACKAGES_AUTH_TOKEN) yarn
COPY . .
RUN yarn
RUN yarn turbo run build --filter=${SCOPE}

FROM base AS ws-installer
RUN apk update && apk add git
RUN apk add --no-cache libc6-compat
WORKDIR /app-ws
COPY . .
RUN yarn workspaces focus ${SCOPE} --production

FROM gcr.io/distroless/nodejs18-debian11:nonroot
WORKDIR /apps/endringsmelding-pleiepenger
COPY --from=ws-installer /app-ws/node_modules ./node_modules/
COPY --from=turbo-builder /app/apps/endringsmelding-pleiepenger/server.cjs .
COPY --from=turbo-builder /app/apps/endringsmelding-pleiepenger/tokenx.cjs .
COPY --from=turbo-builder /app/apps/endringsmelding-pleiepenger/package.json .
COPY --from=turbo-builder /app/apps/endringsmelding-pleiepenger/src/build/decorator.cjs ./src/build/decorator.cjs
COPY --from=turbo-builder /app/apps/endringsmelding-pleiepenger/src/build/AppSettings.cjs ./src/build/AppSettings.cjs
COPY --from=turbo-builder /app/apps/endringsmelding-pleiepenger/dist ./dist

EXPOSE 8080
CMD ["server.cjs"]
#########################################
# BUILD SERVER
#########################################

FROM installer AS server-build
ARG SERVER
WORKDIR /app/${SERVER}
RUN --mount=type=secret,id=PACKAGES_AUTH_TOKEN \
PACKAGES_AUTH_TOKEN=$(cat /run/secrets/PACKAGES_AUTH_TOKEN) yarn build


#########################################
# Client
#########################################

FROM installer AS client-build
WORKDIR /app
RUN --mount=type=secret,id=PACKAGES_AUTH_TOKEN \
PACKAGES_AUTH_TOKEN=$(cat /run/secrets/PACKAGES_AUTH_TOKEN) yarn turbo run build --filter=${SCOPE}
RUN mv /app/apps/${APP}/dist /public


#########################################
# Server
#########################################
FROM base AS server
ARG SERVER
WORKDIR /app
COPY --from=server-build /app/${SERVER}/dist ./
ENTRYPOINT ["/sbin/tini", "--"]

#########################################
# App
#########################################
FROM server

COPY --from=client-build /public ./public

CMD ["node", "index.js"]


95 changes: 95 additions & 0 deletions apps/endringsmelding-pleiepenger/dev-server.cjs
Original file line number Diff line number Diff line change
@@ -0,0 +1,95 @@
const { createProxyMiddleware, fixRequestBody } = require('http-proxy-middleware');
const getAppSettings = require('./e2e/server/AppSettings.cjs');
const { injectDecoratorServerSide } = require('@navikt/nav-dekoratoren-moduler/ssr/index.js');
const express = require('express');
const server = express();
server.use(express.json());
const path = require('path');
const mustacheExpress = require('mustache-express');
const compression = require('compression');

server.disable('x-powered-by');

server.use(compression());

require('dotenv').config();
server.set('views', `${__dirname}`);
server.set('view engine', 'mustache');
server.engine('html', mustacheExpress());

server.use((req, res, next) => {
res.removeHeader('X-Powered-By');
res.set('X-Frame-Options', 'SAMEORIGIN');
res.set('X-XSS-Protection', '1; mode=block');
res.set('X-Content-Type-Options', 'nosniff');
res.set('Referrer-Policy', 'no-referrer');
res.set('Feature-Policy', "geolocation 'none'; microphone 'none'; camera 'none'");
next();
});

async function injectDecorator(filePath) {
return injectDecoratorServerSide({
env: 'dev',
filePath,
params: {
enforceLogin: false,
simple: true,
},
});
}

const startServer = async () => {
server.get('/health/isAlive', (req, res) => res.sendStatus(200));
server.get('/health/isReady', (req, res) => res.sendStatus(200));

const indexHtmlPath = path.resolve(__dirname, 'index.html');

const htmlWithDecoratorInjected = await injectDecorator(indexHtmlPath);

const renderedHtml = htmlWithDecoratorInjected.replaceAll(
'{{{APP_SETTINGS}}}',
JSON.stringify({
APP_VERSION: `${process.env.APP_VERSION}`,
PUBLIC_PATH: `${process.env.PUBLIC_PATH}`,
...getAppSettings(),
}),
);

const fs = require('fs');
fs.writeFileSync(path.resolve(__dirname, 'index-decorated.html'), renderedHtml);

const vite = await require('vite').createServer({
root: __dirname,
server: {
middlewareMode: true,
port: 8080,
open: './index-decorated.html',
},
});

server.get(/^\/(?!.*dist).*$/, (req, res, next) => {
const ROOT_DIR = path.resolve(__dirname);
const fullPath = path.resolve(ROOT_DIR, decodeURIComponent(req.path.substring(1)));

if (!fullPath.startsWith(ROOT_DIR)) {
res.status(403).send('Forbidden');
return;
}

const fileExists = fs.existsSync(fullPath);

if ((!fileExists && !req.url.startsWith('/@')) || req.url === '/') {
req.url = '/index-decorated.html';
}
next();
});

server.use(vite.middlewares);

const port = process.env.PORT || 8080;
server.listen(port, () => {
console.log(`App listening on port: ${port}`);
});
};

startServer();
Original file line number Diff line number Diff line change
Expand Up @@ -3,8 +3,8 @@ const express = require('express');
const server = express();
const path = require('path');
const mustacheExpress = require('mustache-express');
const getAppSettings = require('./src/build/AppSettings.cjs');
const getDecorator = require('./src/build/decorator.cjs');
const getAppSettings = require('./e2e/server/AppSettings.cjs');
const getDecorator = require('./e2e/server/decorator.cjs');
const compression = require('compression');

require('dotenv').config();
Expand Down Expand Up @@ -40,12 +40,14 @@ const renderApp = (decoratorFragments) =>
});

const startServer = async (html) => {
server.get(`${process.env.PUBLIC_PATH}/health/isAlive`, (_req, res) => res.sendStatus(200));
server.get(`${process.env.PUBLIC_PATH}/health/isReady`, (_req, res) => res.sendStatus(200));
server.use(`${process.env.PUBLIC_PATH}/assets`, express.static(path.resolve(__dirname, 'dist/assets')));
server.use(`**/assets`, express.static(path.resolve(__dirname, 'dist/assets')));
server.use(`${process.env.PUBLIC_PATH}/assets`, express.static(path.resolve(__dirname, './dist/assets')));

server.get(/^\/(?!.*api)(?!.*innsynapi)(?!.*dist).*$/, (req, res) => {
server.get('/mockServiceWorker.js', (req, res) => {
const filePath = path.join(__dirname, 'mockServiceWorker.js');
res.sendFile(filePath);
});

server.get(/^\/(?!.*api)(?!.*dist).*$/, (req, res) => {
res.send(html);
});

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -10,7 +10,7 @@ export const setupScenarioMockRoutes = async (page: Page, scenario: ScenarioType
await page.route('**/oppslag/arbeidsgiver**', async (route) => {
await route.fulfill({ status: 200, body: JSON.stringify(mockData.arbeidsgiver) });
});
await page.route('**/api/innsyn/sak', async (route) => {
await page.route('**/innsyn/sak', async (route) => {
await route.fulfill({ status: 200, body: JSON.stringify(mockData.sak) });
});
};
Expand Down
31 changes: 31 additions & 0 deletions apps/endringsmelding-pleiepenger/e2e/server/AppSettings.cjs
Original file line number Diff line number Diff line change
@@ -0,0 +1,31 @@
require('dotenv').config();

const getAppSettings = (isTest) => {
return {
APP_VERSION: `${process.env.APP_VERSION}`,
NODE_ENV: `${process.env.NODE_ENV}`,
PUBLIC_PATH: `${process.env.PUBLIC_PATH}`,
GITHUB_REF_NAME: `${process.env.GITHUB_REF_NAME}`,

SIF_PUBLIC_APPSTATUS_DATASET: `${process.env.SIF_PUBLIC_APPSTATUS_DATASET}`,
SIF_PUBLIC_APPSTATUS_PROJECT_ID: `${process.env.SIF_PUBLIC_APPSTATUS_PROJECT_ID}`,
SIF_PUBLIC_DEKORATOR_URL: `${process.env.SIF_PUBLIC_DEKORATOR_URL}`,
SIF_PUBLIC_LOGIN_URL: `${process.env.SIF_PUBLIC_LOGIN_URL}`,
SIF_PUBLIC_MINSIDE_URL: `${process.env.SIF_PUBLIC_MINSIDE_URL}`,
SIF_PUBLIC_FEATURE_NYNORSK: `${process.env.SIF_PUBLIC_FEATURE_NYNORSK}`,
SIF_PUBLIC_INNSYN_URL: `${process.env.INNSYN_URL}`,

K9_BRUKERDIALOG_PROSESSERING_FRONTEND_PATH: `${process.env.K9_BRUKERDIALOG_PROSESSERING_FRONTEND_PATH}`,
K9_BRUKERDIALOG_PROSESSERING_API_URL: `${process.env.K9_BRUKERDIALOG_PROSESSERING_API_URL}`,
SIF_INNSYN_FRONTEND_PATH: `${process.env.SIF_INNSYN_FRONTEND_PATH}`,
SIF_INNSYN_API_URL: `${process.env.SIF_INNSYN_API_URL}`,

DOMAIN_URL: `${process.env.DOMAIN_URL}`,
MSW: isTest ? 'off' : `${process.env.MSW}`,
E2E_TEST: isTest ? 'true' : false,
SIF_PUBLIC_FEATURE_VELG_SCENARIO: isTest ? 'on' : `${process.env.SIF_PUBLIC_FEATURE_VELG_SCENARIO}`,
NOW: `${process.env.NOW}`,
};
};

module.exports = getAppSettings;
Original file line number Diff line number Diff line change
Expand Up @@ -27,7 +27,7 @@ const decoratorParams = new URLSearchParams({

const getDecorator = (appSettings) =>
new Promise((resolve, reject) => {
fetch(`${process.env.DEKORATOR_URL}`, decoratorParams)
fetch(`${process.env.SIF_PUBLIC_DEKORATOR_URL}`, decoratorParams)
.then((response) => response.text())
.then((html) => {
if (html) {
Expand Down
14 changes: 6 additions & 8 deletions apps/endringsmelding-pleiepenger/index.html
Original file line number Diff line number Diff line change
Expand Up @@ -2,18 +2,16 @@
<html lang="no">

<head>
<meta charSet="utf-8" />
<meta charset="UTF-8" />
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
{{{NAV_SCRIPTS}}} {{{NAV_STYLES}}}
<script type="text/json" id="nav:appSettings">{{{APP_SETTINGS}}}</script>
<script type="text/json" id="nav:appSettings">
{{{APP_SETTINGS}}}
</script>

</head>

<body>
<div id="appContainer">
{{{NAV_HEADING}}}
<div id="app"></div>
{{{NAV_FOOTER}}}
</div>
<div id="root"></div>
<script type="module" src="/src/app/App.tsx"></script>
</body>

Expand Down
Loading

0 comments on commit 2cbdd67

Please sign in to comment.