mirror of
https://github.com/mauriceboe/TREK.git
synced 2026-06-21 22:31:46 +00:00
0257e4e71e
First strangler migration (L1): /api/weather is served by a NestJS module.
- @trek/shared/weather Zod contract; Nest controller byte-identical to the legacy Express route (paths, query params, status codes, { error } bodies, lang default, ApiError/500 passthrough). Service reuses getWeather/getDetailedWeather (+ shared cache; MCP tools unchanged).
- Strangler routes /api/weather to Nest by default; the legacy Express route + its migration-time parity test were decommissioned in this PR.
- Frontend (FE2): weatherApi typed against the @trek/shared WeatherResult contract.
- Harness: reusable Nest-vs-Express parity harness, e2e harness (temp SQLite + seed/cookie helpers, real JwtAuthGuard), src/nest coverage gate raised to >=80%, src/nest test guide.
- Verified end-to-end on a prod mirror (dev1): 401/400/200 via Nest with real Open-Meteo data, Express route gone.
25 lines
1.0 KiB
TypeScript
25 lines
1.0 KiB
TypeScript
/**
|
|
* Strangler toggle for the incremental NestJS migration.
|
|
*
|
|
* `getNestPrefixes()` returns the request path prefixes that NestJS handles;
|
|
* every other path falls through to the legacy Express app. The default is the
|
|
* set of prefixes whose Nest modules exist. Operators can override it at runtime
|
|
* via the `NEST_PREFIXES` env var (comma-separated) for instant Nest<->Express
|
|
* rollback — no redeploy, no code change. Setting `NEST_PREFIXES=` (empty) routes
|
|
* everything back to the legacy app.
|
|
*/
|
|
const DEFAULT_NEST_PREFIXES = ['/api/_nest', '/api/weather'];
|
|
|
|
export function getNestPrefixes(): string[] {
|
|
const raw = process.env.NEST_PREFIXES;
|
|
if (raw !== undefined) {
|
|
return raw.split(',').map((s) => s.trim()).filter(Boolean);
|
|
}
|
|
return DEFAULT_NEST_PREFIXES;
|
|
}
|
|
|
|
/** Builds a matcher: true when `path` belongs to one of the migrated prefixes. */
|
|
export function makeNestPathMatcher(prefixes: string[]): (path: string) => boolean {
|
|
return (path) => prefixes.some((prefix) => path === prefix || path.startsWith(prefix + '/'));
|
|
}
|