chore: initial project scaffold: backend/src/common/normalize-dates.interceptor.ts

This commit is contained in:
2026-04-25 14:45:02 +00:00
parent 9552ba393e
commit e0e1159b4a

View File

@@ -0,0 +1,39 @@
import {
CallHandler,
ExecutionContext,
Injectable,
NestInterceptor,
} from '@nestjs/common';
import { Observable } from 'rxjs';
const DATE_ONLY = /^\d{4}-\d{2}-\d{2}$/;
const DATETIME_NO_TZ = /^\d{4}-\d{2}-\d{2}T\d{2}:\d{2}(:\d{2}(\.\d+)?)?$/;
const normalize = (value: unknown): unknown => {
if (value === null || value === undefined) return value;
if (typeof value === 'string') {
if (DATE_ONLY.test(value)) return `${value}T00:00:00.000Z`;
if (DATETIME_NO_TZ.test(value)) return `${value}Z`;
return value;
}
if (Array.isArray(value)) return value.map(normalize);
if (typeof value === 'object') {
const out: Record<string, unknown> = {};
for (const [k, v] of Object.entries(value as Record<string, unknown>)) {
out[k] = normalize(v);
}
return out;
}
return value;
};
@Injectable()
export class NormalizeDatesInterceptor implements NestInterceptor {
intercept(ctx: ExecutionContext, next: CallHandler): Observable<unknown> {
const req = ctx.switchToHttp().getRequest<{ body?: unknown }>();
if (req.body && typeof req.body === 'object') {
req.body = normalize(req.body);
}
return next.handle();
}
}