| import express from 'express' |
| import type { Response, RequestHandler } from 'express' |
|
|
| import type { ExtendedRequest } from '@/types' |
| import { defaultCacheControl } from '@/frame/middleware/cache-control' |
| import { getProductStringFromPath, getVersionStringFromPath } from '@/frame/lib/path-utils' |
| import { getLanguageCodeFromPath } from '@/languages/middleware/detect-language' |
| import { pagelistValidationMiddleware } from './validation' |
| import catchMiddlewareError from '@/observability/middleware/catch-middleware-error' |
| import statsd from '@/observability/lib/statsd' |
|
|
| const router = express.Router() |
|
|
| |
|
|
| |
| router.get( |
| '/', |
| pagelistValidationMiddleware as RequestHandler, |
| catchMiddlewareError(async function (req: ExtendedRequest, res: Response) { |
| res.redirect( |
| 308, |
| req.originalUrl.replace( |
| '/pagelist', |
| `/pagelist/${req.context!.currentLanguage}/${req.context!.currentVersion}`, |
| ), |
| ) |
| }), |
| ) |
|
|
| |
| router.get( |
| '/:someParam', |
| pagelistValidationMiddleware as RequestHandler, |
| catchMiddlewareError(async function (req: ExtendedRequest, res: Response) { |
| const { someParam } = req.params |
| res.redirect( |
| 308, |
| req.originalUrl.replace( |
| `/pagelist/${someParam}`, |
| `/pagelist/${req.context!.currentLanguage}/${req.context!.currentVersion}`, |
| ), |
| ) |
| }), |
| ) |
|
|
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| router.get( |
| '/:lang/:productVersion', |
| pagelistValidationMiddleware as RequestHandler, |
| catchMiddlewareError(async function (req: ExtendedRequest, res: Response) { |
| if (!req.context || !req.context.pages) throw new Error('Request not contextualized.') |
|
|
| const pages = req.context.pages |
|
|
| |
| const keys = Object.keys(pages) |
|
|
| |
| const filteredPermalinks = keys.filter((key) => |
| versionMatcher(key, req.context!.currentVersion!, req.context!.currentLanguage!), |
| ) |
|
|
| |
| |
| if (!filteredPermalinks.length) { |
| const { lang, productVersion } = req.params |
|
|
| res |
| .status(400) |
| .type('application/json') |
| .send( |
| JSON.stringify({ |
| error: 'Invalid version or language code', |
| language: lang, |
| version: productVersion, |
| }), |
| ) |
| return |
| } |
|
|
| incrementPagelistLookup(req.context!.currentVersion!, req.context!.currentLanguage!) |
| defaultCacheControl(res) |
|
|
| |
| res.type('text').send(filteredPermalinks.join('\n').concat('\n')) |
| }), |
| ) |
|
|
| function versionMatcher(key: string, targetVersion: string, targetLang: string) { |
| const versionFromPermalink = getVersionStringFromPath(key) |
|
|
| if (!versionFromPermalink) { |
| throw new Error(`Couldn't get version from the permalink ${key} when generating the pagelist.`) |
| } |
| if (getProductStringFromPath(key) === 'early-access') return null |
|
|
| const langFromPermalink = getLanguageCodeFromPath(key) |
| if (!langFromPermalink) { |
| throw new Error(`Couldn't get language from the permalink ${key} when generating the pagelist.`) |
| } |
|
|
| if (versionFromPermalink === targetVersion && langFromPermalink === targetLang) return key |
| } |
|
|
| function incrementPagelistLookup(version: string, language: string) { |
| const tags = [`version:${version}`, `language:${language}`] |
|
|
| statsd.increment('api.pagelist.lookup', 1, tags) |
| } |
|
|
| export default router |
|
|