Skip to content
This repository was archived by the owner on May 18, 2026. It is now read-only.

Commit 4b004ab

Browse files
authored
feat: config driven user flow to support gds and dvs jounrey (#396)
* feat: add config-driven routing system for environment-based access control Implement middleware that controls route rendering based on route name and environment configuration. Centralizes route definitions and adds comprehensive test coverage. * chore: testing for dev * chore: testing in dev * chore: reverting 19ea031 75e2bd8
1 parent c2b1579 commit 4b004ab

47 files changed

Lines changed: 1001 additions & 85 deletions

File tree

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

.env.example

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -10,4 +10,4 @@ OIDC_CLIENT_ID=TEST_CLIENT_ID
1010
CLIENT_SIGNING_KEY_ID=14122ec4-cdd0-4154-8275-04363c15fbd9
1111
OIDC_ISSUER_DISCOVERY_ENDPOINT=http://localhost:8000
1212
COOKIE_TTL_IN_MILLISECONDS=3600000
13-
WALLET_APPS=govuk-build,wallet-test-dev,wallet-test-build
13+
WALLET_APPS=govuk-build,wallet-test-dev,wallet-test-build,wallet-test-verifier-integration

src/app.ts

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -25,8 +25,9 @@ import { refreshRouter } from "./refresh/router";
2525
import { simpleDocumentBuilderRouter } from "./simpleDocumentBuilder/router";
2626
import { drivingLicenceBuilderRouter } from "./drivingLicenceBuilder/router";
2727
import { dvsStartRouter } from "./dvsStart/router";
28-
import { dvsDrivingLicenceBuilderRouter } from "./dvsDrivingLicenceBuilder/router";
2928
import { dvsJourneySelectorRouter } from "./dvsJourneySelector/router";
29+
import { dvsDrivingLicenceBuilderRouter } from "./dvsDrivingLicenceBuilder/router";
30+
import { dvsCredentialOfferViewerRouter } from "./dvsCredentialOfferViewer/router";
3031
import { startRouter } from "./start/router";
3132

3233
const APP_VIEWS = [
@@ -44,6 +45,7 @@ const APP_VIEWS = [
4445
path.resolve("dist/veteranCardDocumentBuilder/views"),
4546
path.resolve("dist/dvsStart/views"),
4647
path.resolve("dist/dvsJourneySelector/views"),
48+
path.resolve("dist/dvsCredentialOfferViewer/views"),
4749
path.resolve("dist/start/views"),
4850
path.resolve("dist/views"),
4951
path.resolve("node_modules/govuk-frontend/dist"),
@@ -87,9 +89,11 @@ export async function createApp(): Promise<express.Application> {
8789
app.use(dvsStartRouter);
8890
app.use(dvsJourneySelectorRouter);
8991
app.use(dvsDrivingLicenceBuilderRouter);
92+
app.use(dvsCredentialOfferViewerRouter);
9093
app.use(startRouter);
9194

9295
app.use(auth(getOIDCConfig()));
96+
9397
app.use(appSelectorRouter);
9498
app.use(credentialOfferViewerRouter);
9599
app.use(credentialViewerRouter);

src/appSelector/router.ts

Lines changed: 14 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -3,11 +3,23 @@ import {
33
appSelectorGetController,
44
appSelectorPostController,
55
} from "./controller";
6+
import { guardRouteByEnvironment } from "../middleware/guardRouteByEnvironment";
7+
import { ROUTES } from "../config/routes";
68
import { requiresAuth } from "../middleware/requiresAuth";
79

810
const router = express.Router();
911

10-
router.get("/select-app", requiresAuth, appSelectorGetController());
11-
router.post("/select-app", requiresAuth, appSelectorPostController());
12+
router.get(
13+
ROUTES.SELECT_APP,
14+
guardRouteByEnvironment(),
15+
requiresAuth,
16+
appSelectorGetController(),
17+
);
18+
router.post(
19+
ROUTES.SELECT_APP,
20+
guardRouteByEnvironment(),
21+
requiresAuth,
22+
appSelectorPostController(),
23+
);
1224

1325
export { router as appSelectorRouter };

src/config/environments.ts

Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,22 @@
1+
export const ENVIRONMENTS = {
2+
LOCAL: "local",
3+
DEV: "dev",
4+
BUILD: "build",
5+
STAGE: "staging",
6+
INT: "integration",
7+
};
8+
9+
export const dvsRoutesNonProdEnvs = [
10+
ENVIRONMENTS.LOCAL,
11+
ENVIRONMENTS.DEV,
12+
ENVIRONMENTS.BUILD,
13+
];
14+
export const dvsRoutesProdEnvs = [ENVIRONMENTS.INT];
15+
export const allDvsRoutesEnvs = [...dvsRoutesNonProdEnvs, ...dvsRoutesProdEnvs];
16+
17+
export const gdsRoutesEnvs = [
18+
ENVIRONMENTS.LOCAL,
19+
ENVIRONMENTS.DEV,
20+
ENVIRONMENTS.BUILD,
21+
ENVIRONMENTS.STAGE,
22+
];

src/config/routes.ts

Lines changed: 57 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,57 @@
1+
export const ROUTES = {
2+
// DVS Routes
3+
DVS_START: "/dvs/start",
4+
DVS_SELECT_JOURNEY: "/dvs/select-journey",
5+
DVS_BUILD_TEST_DRIVING_LICENCE: "/dvs/build-driving-licence",
6+
DVS_CREDENTIAL_OFFER_VIEWER: "/dvs/view-credential-offer/:itemId",
7+
// GDS Routes
8+
START: "/start",
9+
SELECT_APP: "/select-app",
10+
SELECT_DOCUMENT: "/select-document",
11+
BUILD_NINO_DOCUMENT: "/build-nino-document",
12+
BUILD_DBS_DOCUMENT: "/build-dbs-document",
13+
BUILD_VETERAN_CARD_DOCUMENT: "/build-veteran-card-document",
14+
BUILD_DRIVING_LICENCE_DOCUMENT: "/build-driving-licence",
15+
BUILD_SIMPLE_DOCUMENT: "/build-simple-document",
16+
LOGGED_OUT: "/logged-out",
17+
PROOF_JWT: "/proof-jwt",
18+
REFRESH: "/refresh/:credentialType",
19+
REFRESH_NO_UPDATE: "/refresh/:credentialType/no-update",
20+
WELL_KNOWN_JWKS: "/.well-known/jwks.json",
21+
TOKEN: "/token",
22+
LOGOUT: "/logout",
23+
RETURN_FROM_AUTH: "/return-from-auth",
24+
VIEW_CREDENTIAL: "/view-credential",
25+
CREDENTIAL_OFFER_VIEWER: "/view-credential-offer/:itemId",
26+
// Common Routes
27+
DOCUMENT: "/document/:itemId",
28+
REVOKE: "/revoke",
29+
};
30+
31+
export const dvsRoutes = [
32+
ROUTES.DVS_START,
33+
ROUTES.DVS_SELECT_JOURNEY,
34+
ROUTES.DVS_BUILD_TEST_DRIVING_LICENCE,
35+
ROUTES.DVS_CREDENTIAL_OFFER_VIEWER,
36+
];
37+
export const gdsRoutes = [
38+
ROUTES.START,
39+
ROUTES.SELECT_APP,
40+
ROUTES.SELECT_DOCUMENT,
41+
ROUTES.BUILD_NINO_DOCUMENT,
42+
ROUTES.BUILD_DBS_DOCUMENT,
43+
ROUTES.BUILD_VETERAN_CARD_DOCUMENT,
44+
ROUTES.BUILD_DRIVING_LICENCE_DOCUMENT,
45+
ROUTES.BUILD_SIMPLE_DOCUMENT,
46+
ROUTES.LOGGED_OUT,
47+
ROUTES.PROOF_JWT,
48+
ROUTES.REFRESH,
49+
ROUTES.REFRESH_NO_UPDATE,
50+
ROUTES.WELL_KNOWN_JWKS,
51+
ROUTES.TOKEN,
52+
ROUTES.LOGOUT,
53+
ROUTES.RETURN_FROM_AUTH,
54+
ROUTES.VIEW_CREDENTIAL,
55+
ROUTES.CREDENTIAL_OFFER_VIEWER,
56+
];
57+
export const commonRoutes = [ROUTES.REVOKE, ROUTES.DOCUMENT];

src/config/walletAppsConfig.ts

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -26,4 +26,8 @@ export const walletAppsConfig: WalletAppsConfig = {
2626
url: "https://mobile.staging.account.gov.uk/wallet-test/",
2727
name: "Wallet Test App (Staging)",
2828
},
29+
"wallet-test-verifier-integration": {
30+
url: "https://mobile.integration.account.gov.uk/wallet-test/",
31+
name: "Wallet Test App (Integration)",
32+
},
2933
};

src/credentialOfferViewer/router.ts

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,15 @@
11
import express from "express";
22
import { credentialOfferViewerController } from "./controller";
33
import { requiresAuth } from "../middleware/requiresAuth";
4+
import { ROUTES } from "../config/routes";
5+
import { guardRouteByEnvironment } from "../middleware/guardRouteByEnvironment";
46
import { requiresAppSelected } from "../middleware/requiresAppSelected";
57

68
const router = express.Router();
79

810
router.get(
9-
"/view-credential-offer/:itemId",
11+
ROUTES.CREDENTIAL_OFFER_VIEWER,
12+
guardRouteByEnvironment(),
1013
requiresAuth,
1114
requiresAppSelected,
1215
credentialOfferViewerController(),

src/credentialViewer/router.ts

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,15 @@
11
import express from "express";
22
import { credentialViewerController } from "./controller";
33
import { requiresAuth } from "../middleware/requiresAuth";
4+
import { ROUTES } from "../config/routes";
5+
import { guardRouteByEnvironment } from "../middleware/guardRouteByEnvironment";
46
import { requiresAppSelected } from "../middleware/requiresAppSelected";
57

68
const router = express.Router();
79

810
router.get(
9-
"/view-credential",
11+
ROUTES.VIEW_CREDENTIAL,
12+
guardRouteByEnvironment(),
1013
requiresAuth,
1114
requiresAppSelected,
1215
credentialViewerController,

src/dbsDocumentBuilder/controller.ts

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -58,11 +58,11 @@ export async function dbsDocumentBuilderPostController(
5858
timeToLive,
5959
});
6060

61-
const redirectUrl = getViewCredentialOfferRedirectUrl(
61+
const redirectUrl = getViewCredentialOfferRedirectUrl({
6262
itemId,
63-
CREDENTIAL_TYPE,
64-
body["throwError"],
65-
);
63+
credentialType: CREDENTIAL_TYPE,
64+
selectedError: body["throwError"],
65+
});
6666
res.redirect(redirectUrl);
6767
} catch (error) {
6868
logger.error(error, "An error happened processing DBS document request");

src/dbsDocumentBuilder/router.ts

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -4,18 +4,22 @@ import {
44
dbsDocumentBuilderPostController,
55
} from "./controller";
66
import { requiresAuth } from "../middleware/requiresAuth";
7+
import { ROUTES } from "../config/routes";
8+
import { guardRouteByEnvironment } from "../middleware/guardRouteByEnvironment";
79
import { requiresAppSelected } from "../middleware/requiresAppSelected";
810

911
const router = express.Router();
1012

1113
router.get(
12-
"/build-dbs-document",
14+
ROUTES.BUILD_DBS_DOCUMENT,
15+
guardRouteByEnvironment(),
1316
requiresAuth,
1417
requiresAppSelected,
1518
dbsDocumentBuilderGetController(),
1619
);
1720
router.post(
18-
"/build-dbs-document",
21+
ROUTES.BUILD_DBS_DOCUMENT,
22+
guardRouteByEnvironment(),
1923
requiresAuth,
2024
requiresAppSelected,
2125
dbsDocumentBuilderPostController,

0 commit comments

Comments
 (0)