Skip to content

OpenAPI

Os schemas e decorators já descrevem a API. O Empilha usa essas mesmas declarações para gerar OpenAPI 3.1.

Ative

ts
const AppModule = defineModule({
  name: "app",
  controllers: [TaskController],
});
const app = await createApplication(AppModule, {
  configure: (app) => app.openapi({
    title: "Tasks API",
    version: "1.0.0",
  }),
});

Ou configure em empilha.config.ts, como no capítulo anterior.

Dois endpoints aparecem:

EndpointConteúdo
GET /openapi.jsondocumento OpenAPI 3.1
GET /docsSwagger UI

O documento vem do contrato

DeclaraçãoOpenAPI
@Controller, @Get, @Postpath e método
@Param, @Query, @Headerparâmetros
@QueryParamsparâmetros, tipos e defaults
@Bodyrequest body
@Returnsschema de sucesso
@Statusstatus de sucesso
@Identity, @Roles, @Guardsegurança bearer
@NotFoundWhenEmptyresposta 404

Schemas recursivos são registrados em components.schemas e usados pelas rotas com referências $ref, em vez de serem expandidos infinitamente inline.

O endpoint de criação já é documentável:

ts
import { queryArtifacts } from "../queries/query-artifacts";

@Post("/")
@Body(CreateTask)
@Returns(Task)
@Roles("user")
@Sql(queryArtifacts.taskCreate)
@Result("one")
create() {}

Declare @Returns(Schema) sempre que possível. Sem esse decorator, a rota continua funcionando, mas o OpenAPI só consegue descrever a resposta como Successful response, sem um schema de conteúdo.

Exemplos definidos no schema TypeBox também aparecem no Swagger UI:

ts
const Url = t.String({ examples: ["https://example.com"] });

Não existe um segundo arquivo descrevendo body e resposta.

Agrupe por tags

ts
@Controller("/tasks", { tags: ["Tasks"] })
export class TaskController {}

Sem tags explícitas, o nome do controller é usado.

Erros

Todas as rotas incluem respostas padronizadas 400 e 500. Rotas protegidas incluem 401 e 403; @NotFoundWhenEmpty adiciona 404.

Swagger UI sem dependência externa

/openapi.json e todos os assets da interface /docs são servidos localmente. Depois que a aplicação estiver compilada, o Swagger UI não depende de CDN nem de acesso à internet no navegador.

O schema é a fonte

Se a documentação estiver errada, corrija o decorator ou schema da rota. Não mantenha uma descrição paralela.

Feito para APIs que continuam simples quando crescem.