chore(repo): restructure as monorepo with server and client workspaces

- move NestJS app into server/ subdirectory
- add client/ React+TypeScript (Vite) app with Hello World
- update docker-compose to build and run both services
- add root package.json declaring npm workspaces
- update .gitignore to cover node_modules and dist at all depths
This commit is contained in:
2026-04-08 21:28:01 +03:00
parent afc4627353
commit 5cc16725fb
88 changed files with 12637 additions and 405 deletions
@@ -0,0 +1,40 @@
import {
ArgumentsHost,
BadRequestException,
Catch,
ExceptionFilter,
HttpException,
InternalServerErrorException,
} from "@nestjs/common";
import { TraceLogger } from "../common/trace-logger";
import type { Request, Response } from "express";
@Catch(BadRequestException, InternalServerErrorException)
export class HttpExceptionFilter implements ExceptionFilter {
private readonly logger = new TraceLogger(HttpExceptionFilter.name);
catch(exception: HttpException, host: ArgumentsHost): void {
const ctx = host.switchToHttp();
const request = ctx.getRequest<Request>();
const response = ctx.getResponse<Response>();
const status = exception.getStatus();
const body = exception.getResponse();
const cause = (exception as unknown as { cause?: Error }).cause;
const causeMessage = cause ? ` | cause: ${cause.message}` : "";
const message = `${exception.message}${causeMessage}`;
if (status >= 500) {
this.logger.error(
`[${request.method} ${request.url}] ${status}${message}`,
cause?.stack ?? exception.stack,
);
} else {
this.logger.warn(
`[${request.method} ${request.url}] ${status}${message}`,
);
}
response.status(status).json(body);
}
}