| | 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 |
| |
|