{"version":3,"file":"index.cjs","sources":["../src/data/componentApi/componentApiClient.ts","../src/utils/fallbacks.ts","../src/utils/updateCsp.ts","../src/componentsService.ts","../src/middleware/getFrontendComponents.ts","../src/data/prisonApi/prisonApiClient.ts","../src/caseLoadService.ts","../src/middleware/retrieveCaseLoadData.ts","../src/data/allocationsApi/allocationsApiClient.ts","../src/allocationService.ts","../src/middleware/retrieveAllocationJobResponsibilities.ts"],"sourcesContent":["import { ApiConfig, RestClient } from '@ministryofjustice/hmpps-rest-client'\nimport type AvailableComponent from '../../types/AvailableComponent'\nimport type Component from '../../types/Component'\nimport type { ConnectDpsComponentLogger } from '../../types/ConnectDpsComponentLogger'\nimport type SharedData from '../../types/SharedData'\n\nexport type ComponentsApiResponse<T extends AvailableComponent[] = AvailableComponent[]> = Record<\n  T[number],\n  Component\n> & {\n  meta: SharedData\n}\n\nexport default class ComponentApiClient extends RestClient {\n  constructor(logger: ConnectDpsComponentLogger, config: ApiConfig) {\n    super('Component API Client', config, logger)\n  }\n\n  async getComponents<T extends AvailableComponent[]>(userToken: string): Promise<ComponentsApiResponse<T>> {\n    return this.get({\n      path: '/components',\n      query: 'component=header&component=footer',\n      headers: { 'x-user-token': userToken },\n    })\n  }\n}\n","import nunjucks from 'nunjucks'\nimport { HmppsUser } from '../types/HmppsUser'\n\nexport function getFallbackHeader(\n  user: HmppsUser | null,\n  dpsUrl: string,\n  { environmentName, authUrl, supportUrl }: { environmentName?: string; authUrl?: string; supportUrl?: string },\n): string {\n  return nunjucks.render('dpsComponents/header-bar.njk', {\n    isPrisonUser: !user || user.authSource === 'nomis',\n    user,\n    dpsUrl,\n    environmentName,\n    authUrl,\n    supportUrl,\n    name: initialiseName(user?.displayName),\n  })\n}\n\nexport function getFallbackFooter(\n  user: HmppsUser | null,\n  { authUrl, supportUrl }: { authUrl?: string; supportUrl?: string },\n): string {\n  return nunjucks.render('dpsComponents/footer.njk', {\n    isPrisonUser: !user || user.authSource === 'nomis',\n    supportUrl,\n    authUrl,\n  })\n}\n\nfunction initialiseName(fullName?: string): string | null {\n  if (!fullName) return null\n\n  const array = fullName.split(' ')\n  return `${array[0][0]}. ${array.reverse()[0]}`\n}\n","import type { Response } from 'express'\nimport type { CspDirectives } from '../types/CspDirectives'\n\nexport interface UpdateCspOptions {\n  /** Content-Security-Policy directives to merge into response’s header */\n  directives?: CspDirectives\n  /** Base URL of MFE components service for fallback Content-Security-Policy directives */\n  feComponentsUrl: string\n  /** The express response whose Content-Security-Policy header should be updated */\n  res: Response\n}\n\n/**\n * Update Content-Security-Policy header in response to allow use of MFE components on another domain/origin\n * with given directives, falling back to predefined directives known to be required\n */\nexport default function updateCsp(options: UpdateCspOptions): void\n/**\n * Update Content-Security-Policy header in response to allow use of MFE components on another domain/origin\n * using predefined directives known to be required\n * @deprecated provide options to `updateCsp` as a single object\n */\nexport default function updateCsp(feComponentsUrl: string, res: Response): void\nexport default function updateCsp(arg1: UpdateCspOptions | string, arg2?: Response): void {\n  if (typeof arg1 === 'string') {\n    // eslint-disable-next-line no-param-reassign\n    arg1 = { feComponentsUrl: arg1, res: arg2! }\n  }\n  const { directives: providedDirectives, feComponentsUrl, res } = arg1\n\n  const cspHeader = res.get('content-security-policy')\n  const directives: CspDirectives = directivesFromHeader(cspHeader)\n  const requiredDirectives = providedDirectives ?? fallbackDirectives(feComponentsUrl)\n  mergeDirectives(directives, requiredDirectives)\n  const newCspHeader = headerFromDirectives(directives)\n  res.set('content-security-policy', newCspHeader)\n}\n\n/** Minimal known requirements to use MFE components on another domain/origin */\nfunction fallbackDirectives(feComponentsUrl: string): CspDirectives {\n  return {\n    'script-src': [feComponentsUrl],\n    'style-src': [feComponentsUrl],\n    'img-src': [feComponentsUrl],\n    'font-src': [feComponentsUrl],\n  }\n}\n\nfunction directivesFromHeader(cspHeader: string | undefined): CspDirectives {\n  const header = cspHeader || \"default-src 'self'\"\n  return Object.fromEntries(\n    (header.split(';') ?? []).map(line => {\n      const [directive, ...values] = line.split(/\\s+/)\n      return [directive, values]\n    }),\n  )\n}\n\nfunction headerFromDirectives(directives: CspDirectives): string {\n  return Object.entries(directives)\n    .map(([directive, values]) => (values.length > 0 ? `${directive} ${values.join(' ')}` : directive))\n    .join(';')\n}\n\nfunction mergeDirectives(directives: CspDirectives, overrides: Readonly<CspDirectives>): void {\n  Object.entries(overrides).forEach(([directive, values]) => {\n    if (directive in directives) {\n      values.forEach(value => {\n        if (!directives[directive].includes(value)) {\n          directives[directive].push(value)\n        }\n      })\n    } else {\n      // eslint-disable-next-line no-param-reassign\n      directives[directive] = [\"'self'\", ...values]\n    }\n  })\n}\n","import type { RequestHandler } from 'express'\nimport { ApiConfig } from '@ministryofjustice/hmpps-rest-client'\nimport ComponentApiClient from './data/componentApi/componentApiClient'\nimport { getFallbackFooter, getFallbackHeader } from './utils/fallbacks'\nimport updateCsp from './utils/updateCsp'\nimport { HmppsUser } from './types/HmppsUser'\nimport { ConnectDpsComponentLogger } from './types/ConnectDpsComponentLogger'\n\nexport interface FrontendComponentRequestOptions {\n  authUrl?: string\n  supportUrl?: string\n  environmentName?: 'DEV' | 'PRE-PRODUCTION' | 'PRODUCTION'\n  includeSharedData?: boolean\n  useFallbacksByDefault?: boolean\n  /**\n   * Update Content-Security-Policy with directives returned by MFE components service\n   * (instead of built-in fallback set); true by default\n   */\n  updateContentSecurityPolicy?: boolean\n}\n\nconst defaultOptions: FrontendComponentRequestOptions = {\n  includeSharedData: false,\n  useFallbacksByDefault: false,\n  updateContentSecurityPolicy: true,\n}\n\nexport default class ComponentsService {\n  constructor(\n    private readonly logger: ConnectDpsComponentLogger,\n    private readonly componentApiConfig: ApiConfig,\n    private readonly componentApiClient: ComponentApiClient,\n    private readonly dpsUrl: string,\n  ) {}\n\n  static create({\n    logger = console,\n    componentApiConfig,\n    dpsUrl,\n  }: {\n    logger?: ConnectDpsComponentLogger\n    componentApiConfig: ApiConfig\n    dpsUrl: string\n  }) {\n    return new ComponentsService(logger, componentApiConfig, new ComponentApiClient(logger, componentApiConfig), dpsUrl)\n  }\n\n  getFrontendComponents(requestOptions?: FrontendComponentRequestOptions): RequestHandler {\n    const requestOptionsWithDefaults = {\n      ...defaultOptions,\n      ...(requestOptions || {}),\n    }\n    const { includeSharedData, useFallbacksByDefault, updateContentSecurityPolicy } = requestOptionsWithDefaults\n\n    return async (_req, res, next) => {\n      const useFallbacks = (user: HmppsUser | null) => {\n        res.locals.feComponents = {\n          header: getFallbackHeader(user, this.dpsUrl, {\n            environmentName: requestOptionsWithDefaults.environmentName,\n            authUrl: requestOptionsWithDefaults.authUrl,\n            supportUrl: requestOptionsWithDefaults.supportUrl,\n          }),\n          footer: getFallbackFooter(user, {\n            authUrl: requestOptionsWithDefaults.authUrl,\n            supportUrl: requestOptionsWithDefaults.supportUrl,\n          }),\n          cssIncludes: [],\n          jsIncludes: [],\n        }\n      }\n\n      if (!res.locals.user) {\n        this.logger.info('Using fallback frontend components when no user in context')\n        useFallbacks(null)\n        return next()\n      }\n\n      if (useFallbacksByDefault) {\n        this.logger.info('Using fallback frontend components by default')\n        useFallbacks(res.locals.user)\n        return next()\n      }\n\n      try {\n        const { header, footer, meta } = await this.componentApiClient.getComponents(res.locals.user.token as string)\n\n        res.locals.feComponents = {\n          header: header.html,\n          footer: footer.html,\n          cssIncludes: [...header.css, ...footer.css],\n          jsIncludes: [...header.javascript, ...footer.javascript],\n        }\n\n        if (includeSharedData) {\n          res.locals.feComponents.sharedData = meta\n        }\n\n        updateCsp({\n          directives: updateContentSecurityPolicy ? meta?.cspDirectives : undefined,\n          feComponentsUrl: this.componentApiConfig.url,\n          res,\n        })\n\n        return next()\n      } catch {\n        this.logger.error('Failed to retrieve front end components, using fallbacks')\n        useFallbacks(res.locals.user)\n        return next()\n      }\n    }\n  }\n}\n","import { type RequestHandler } from 'express'\nimport ComponentsService, { FrontendComponentRequestOptions } from '../componentsService'\n\nexport type FrontendComponentsMiddlewareOptions = {\n  requestOptions?: FrontendComponentRequestOptions\n} & Parameters<typeof ComponentsService.create>[0]\n\nexport default function getFrontendComponents({\n  logger = console,\n  componentApiConfig,\n  dpsUrl,\n  requestOptions,\n}: FrontendComponentsMiddlewareOptions): RequestHandler {\n  const service = ComponentsService.create({ logger, componentApiConfig, dpsUrl })\n  return service.getFrontendComponents(requestOptions)\n}\n","import { ApiConfig, asUser, RestClient } from '@ministryofjustice/hmpps-rest-client'\nimport CaseLoad from '../../types/CaseLoad'\nimport { ConnectDpsComponentLogger } from '../../types/ConnectDpsComponentLogger'\n\nexport default class PrisonApiClient extends RestClient {\n  constructor(logger: ConnectDpsComponentLogger, config: ApiConfig) {\n    super('Prison API Client', config, logger)\n  }\n\n  async getUserCaseLoads(userToken: string): Promise<CaseLoad[]> {\n    return this.get(\n      {\n        path: '/api/users/me/caseLoads',\n        query: 'allCaseloads=true',\n      },\n      asUser(userToken),\n    )\n  }\n}\n","import { type RequestHandler } from 'express'\nimport { ApiConfig } from '@ministryofjustice/hmpps-rest-client'\nimport CaseLoad from './types/CaseLoad'\nimport PrisonApiClient from './data/prisonApi/prisonApiClient'\nimport { ConnectDpsComponentLogger } from './types/ConnectDpsComponentLogger'\n\nexport default class CaseLoadService {\n  constructor(\n    private readonly logger: ConnectDpsComponentLogger,\n    private readonly prisonApiClient: PrisonApiClient,\n  ) {}\n\n  static create({\n    logger = console,\n    prisonApiConfig,\n  }: {\n    logger?: ConnectDpsComponentLogger\n    prisonApiConfig: ApiConfig\n  }) {\n    return new CaseLoadService(logger, new PrisonApiClient(logger, prisonApiConfig))\n  }\n\n  retrieveCaseLoadData(): RequestHandler {\n    return async (req, res, next) => {\n      if (!req.session) throw new Error('User session required in order to cache case loads')\n      if (!res.locals.user) this.logger.warn('No res.locals.user object defined to set case load data in')\n      if (!res.locals.user?.token) this.logger.warn('No res.locals.user.token defined to request case load data with')\n      if (!res.locals.user?.authSource) this.logger.warn('No user auth source found')\n\n      if (res.locals.user && res.locals.user.token && res.locals.user.authSource === 'nomis') {\n        try {\n          // Update cache with values from res.feComponents.sharedData if present\n          if (res.locals.feComponents && res.locals.feComponents.sharedData) {\n            req.session.caseLoads = res.locals.feComponents.sharedData.caseLoads\n            req.session.activeCaseLoad = res.locals.feComponents.sharedData.activeCaseLoad ?? undefined\n            req.session.activeCaseLoadId = res.locals.feComponents.sharedData.activeCaseLoad?.caseLoadId\n          }\n\n          // If cache is empty, fetch data from Prison API\n          if (!req.session.caseLoads) {\n            this.logger.info(`Falling back to Prison API to retrieve case loads for: ${res.locals.user.username}`)\n            const userCaseLoads = await this.prisonApiClient.getUserCaseLoads(res.locals.user.token)\n            const caseLoads = userCaseLoads.filter(caseload => caseload.type !== 'APP')\n            const activeCaseLoad = caseLoads.find((caseLoad: CaseLoad) => caseLoad.currentlyActive)\n\n            req.session.caseLoads = caseLoads\n            req.session.activeCaseLoad = activeCaseLoad\n            req.session.activeCaseLoadId = activeCaseLoad?.caseLoadId\n          }\n\n          // Populate res.locals.user with values from cache\n          res.locals.user.caseLoads = req.session.caseLoads\n          res.locals.user.activeCaseLoad = req.session.activeCaseLoad\n          res.locals.user.activeCaseLoadId = req.session.activeCaseLoadId\n        } catch (error) {\n          this.logger.error(error, `Failed to retrieve case loads for: ${res.locals.user.username}`)\n          return next(error)\n        }\n      }\n\n      return next()\n    }\n  }\n}\n","import { type RequestHandler } from 'express'\nimport CaseLoadService from '../caseLoadService'\n\nexport default function retrieveCaseLoadData({\n  logger = console,\n  prisonApiConfig,\n}: Parameters<typeof CaseLoadService.create>[0]): RequestHandler {\n  const service = CaseLoadService.create({ logger, prisonApiConfig })\n  return service.retrieveCaseLoadData()\n}\n","import { ApiConfig, asSystem, AuthenticationClient, RestClient } from '@ministryofjustice/hmpps-rest-client'\nimport { PrisonUser } from '../../types/HmppsUser'\nimport { AllocationJobResponsibility } from '../../types/AllocationJobResponsibility'\nimport { ConnectDpsComponentLogger } from '../../types/ConnectDpsComponentLogger'\n\nexport default class AllocationsApiClient extends RestClient {\n  constructor(logger: ConnectDpsComponentLogger, config: ApiConfig, authenticationClient: AuthenticationClient) {\n    super('Allocations API Client', config, logger, authenticationClient)\n  }\n\n  async getStaffAllocationPolicies(user: PrisonUser): Promise<{ policies: AllocationJobResponsibility[] }> {\n    return this.get(\n      {\n        path: `/prisons/${user.activeCaseLoadId}/staff/${user.userId}/job-classifications`,\n      },\n      asSystem(),\n    )\n  }\n}\n","import { type RequestHandler } from 'express'\nimport { ApiConfig, AuthenticationClient } from '@ministryofjustice/hmpps-rest-client'\nimport AllocationsApiClient from './data/allocationsApi/allocationsApiClient'\nimport { ConnectDpsComponentLogger } from './types/ConnectDpsComponentLogger'\n\nexport default class AllocationService {\n  constructor(\n    private readonly logger: ConnectDpsComponentLogger,\n    private readonly allocationsApiClient: AllocationsApiClient,\n  ) {}\n\n  static create({\n    logger = console,\n    allocationsApiConfig,\n    authenticationClient,\n  }: {\n    logger?: ConnectDpsComponentLogger\n    allocationsApiConfig: ApiConfig\n    authenticationClient: AuthenticationClient\n  }) {\n    return new AllocationService(logger, new AllocationsApiClient(logger, allocationsApiConfig, authenticationClient))\n  }\n\n  public retrieveAllocationJobResponsibilities(): RequestHandler {\n    return async (req, res, next) => {\n      if (!req.session) throw new Error('User session required in order to cache allocation job responsibilities')\n      if (!res.locals.user.token)\n        throw new Error(\n          'Caseload details needs to be populated before retrieving allocation job responsibilities. Please run retrieveCaseLoadData before retrieveAllocationJobResponsibilities.',\n        )\n\n      if (res.locals.user && res.locals.user.authSource === 'nomis') {\n        try {\n          // Update cache with values from res.feComponents.sharedData if present\n          if (res.locals.feComponents && res.locals.feComponents.sharedData) {\n            req.session.allocationJobResponsibilities = res.locals.feComponents.sharedData.allocationJobResponsibilities\n          }\n\n          // If cache is empty, fetch data from Prison API\n          if (!req.session.allocationJobResponsibilities) {\n            this.logger.info(\n              `Falling back to Allocations API to retrieve job responsibilities for: ${res.locals.user.username}`,\n            )\n            const allocationPolicies = await this.allocationsApiClient.getStaffAllocationPolicies(res.locals.user)\n            req.session.allocationJobResponsibilities = allocationPolicies.policies\n          }\n\n          // Populate res.locals.user with values from cache\n          res.locals.user.allocationJobResponsibilities = req.session.allocationJobResponsibilities\n        } catch (error) {\n          this.logger.error(\n            error,\n            `Failed to retrieve allocation job responsibilities for: ${res.locals.user.username}`,\n          )\n          return next(error)\n        }\n      }\n\n      return next()\n    }\n  }\n}\n","import { type RequestHandler } from 'express'\nimport AllocationService from '../allocationService'\n\nexport default function retrieveAllocationJobResponsibilities({\n  logger = console,\n  allocationsApiConfig,\n  authenticationClient,\n}: Parameters<typeof AllocationService.create>[0]): RequestHandler {\n  const service = AllocationService.create({ logger, allocationsApiConfig, authenticationClient })\n  return service.retrieveAllocationJobResponsibilities()\n}\n"],"names":["RestClient","asUser","asSystem"],"mappings":"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"}