mirror of
https://github.com/mauriceboe/TREK.git
synced 2026-06-19 13:21:46 +00:00
0b218d53b2
Co-hosted NestJS app behind the existing Express server via a strangler-fig dispatcher, sharing the same better-sqlite3 connection and JWT httpOnly cookie. Additive and dormant: default routing stays on Express, Nest only serves its own /api/_nest diagnostics until a module opts in. F1 @trek/shared Zod contract package; F2 Nest bootstrap co-hosted (fall-through, single Dockerfile/port); F3 shared better-sqlite3 provider; F4 JWT cookie auth guard (+ @CurrentUser, admin guard); F5 Zod validation pipe + error-envelope parity; F6 Nest test + coverage gates; F7 per-prefix strangler toggle (env, default Express); F8 CI build/typecheck/test/coverage. Remaining F4/F6/F8 checklist items (trip-access + permission levels + MFA policy, e2e harness/seed + 80% gate, Nest↔Express parity test, Playwright PR-comment workflow) are tracked on the first consuming module cards (L1/A1/C1).
42 lines
1.4 KiB
TypeScript
42 lines
1.4 KiB
TypeScript
import { Body, Controller, Get, Post, UseGuards } from '@nestjs/common';
|
|
import { z } from 'zod';
|
|
import type { User } from '../../types';
|
|
import { HealthService } from './health.service';
|
|
import { JwtAuthGuard } from '../auth/jwt-auth.guard';
|
|
import { CurrentUser } from '../auth/current-user.decorator';
|
|
import { ZodValidationPipe } from '../common/zod-validation.pipe';
|
|
|
|
// Local demo schema (real domains import their schema from @trek/shared).
|
|
const echoSchema = z.object({ name: z.string().min(1) });
|
|
|
|
/**
|
|
* Foundation smoke endpoints for the co-hosted NestJS app.
|
|
* Proves: boot, routing, type-based DI, the shared SQLite connection, the
|
|
* JWT-cookie auth guard, and the Zod validation pipe + error-envelope parity.
|
|
*
|
|
* Lives under /api/_nest/* so it never collides with the legacy Express API.
|
|
*/
|
|
@Controller('api/_nest')
|
|
export class HealthController {
|
|
constructor(private readonly healthService: HealthService) {}
|
|
|
|
@Get('health')
|
|
getHealth() {
|
|
return { ok: true, ...this.healthService.info() };
|
|
}
|
|
|
|
/** Guarded: returns the authenticated user, proving JwtAuthGuard + @CurrentUser. */
|
|
@Get('me')
|
|
@UseGuards(JwtAuthGuard)
|
|
me(@CurrentUser() user: User) {
|
|
return user;
|
|
}
|
|
|
|
/** Validated: proves the Zod pipe (400 + { error } on failure) and body parsing. */
|
|
@Post('echo')
|
|
@UseGuards(JwtAuthGuard)
|
|
echo(@Body(new ZodValidationPipe(echoSchema)) body: z.infer<typeof echoSchema>) {
|
|
return { youSent: body };
|
|
}
|
|
}
|