Primeiro contrato compartilhado API↔Web. Lib stays framework-free:
nestjs-zod (createZodDto) fica fora — Web vai consumir esta mesma lib
e não pode arrastar dependência backend.
- PingResponseSchema + type PingResponse (z.infer) em ping.contract.ts
- 6 testes vitest (1 happy + 5 rejeições: status, uuid, uptime, datetime, workspaceId)
- ping.controller importa PingResponse via @sar/api-interface
- placeholders Nx api-interface.{ts,spec.ts} removidos
- design-log atualizado com decisão arquitetural e pegadinhas da sessão
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
29 lines
1005 B
TypeScript
29 lines
1005 B
TypeScript
import { Controller, Get } from '@nestjs/common';
|
|
import { ClsService } from 'nestjs-cls';
|
|
import type { PingResponse } from '@sar/api-interface';
|
|
import type { WorkspaceClsStore } from '../workspace/workspace.types';
|
|
|
|
// Endpoint de verificação de fundação:
|
|
// - confirma que CLS está populando workspaceId + requestId;
|
|
// - serve como alvo do healthcheck do docker compose / smoke test;
|
|
// - usado pela Web (Frente B) para validar conectividade real.
|
|
// Contrato: @sar/api-interface · PingResponseSchema (zod).
|
|
|
|
@Controller({ path: 'ping' })
|
|
export class PingController {
|
|
constructor(private readonly cls: ClsService<WorkspaceClsStore>) {}
|
|
|
|
@Get()
|
|
ping(): PingResponse {
|
|
return {
|
|
status: 'ok',
|
|
service: 'sar-api',
|
|
version: process.env['npm_package_version'] ?? '0.1.0',
|
|
workspaceId: this.cls.get('workspaceId'),
|
|
requestId: this.cls.get('requestId'),
|
|
uptimeSeconds: Math.round(process.uptime()),
|
|
now: new Date().toISOString(),
|
|
};
|
|
}
|
|
}
|