Desenvolvendo APIs

As APIs são a principal forma de expor funcionalidades de um serviço no ecossistema Lino.
Este capítulo descreve como o framework gera Minimal APIs prontas para uso, como ocorre o registro automático via Source Generators, e quais práticas recomendamos para criar endpoints claros, testáveis e bem documentados.

Minimal APIs

O Lino adota o estilo Minimal API como padrão para geração de endpoints, priorizando:

  • Clareza – código enxuto, direto e expressivo.
  • Performance – respostas otimizadas, sem overhead desnecessário.

Recursos integrados

TypedResults: garantem respostas fortemente tipadas, auxiliando na legibilidade e na geração de OpenAPI.

Versionamento de APIs: endpoints podem ser evoluídos sem quebrar compatibilidade.

Documentação enriquecida: metadados configuráveis são incorporados diretamente no OpenAPI, incluindo:

  • WithTags → agrupa endpoints em seções lógicas no OpenAPI.
  • WithName → define o operationId de forma consistente.
  • WithSummary → descreve claramente o propósito do endpoint.
  • Produces(statusCode, schema) → especifica códigos de status e contratos de resposta.
  • MapToApiVersion → permite expor diferentes versões do mesmo endpoint.

Requests e Responses

Record classes são utilizadas para Requests e Responses por padrão:

  • São imutáveis (reduzindo efeitos colaterais e bugs).
  • São concisas e de fácil leitura.

Integração com CQRS:

  • Requests recebidos via endpoints são transformados em Commands ou Queries.
  • Os resultados de Commands/Queries são convertidos em Responses, promovendo consistência arquitetural.

Exemplo simplificado:
public record CreatePersonRequest(string Name, int Age);
public record CreatePersonResponse(Guid Id, string Name, int Age);

Criando novas APIs

Criar um endpoint com o CLI do Lino é simples:

lino new api

O assistente interativo solicitará:

  • Serviço – serviço em que a API será criada.
  • Módulo – módulo do serviço (quando aplicável).
  • Entidade – entidade associada ao endpoint.
  • Nome da API – normalmente alinhado ao verbo da operação (ex.: CreatePerson).
  • Tipo de operação - POST, PUT, PATCH, DELETE ou GET.
  • Rota - padrão de rota (ex.: /people/{id}).

Exemplo:

Ao criar uma API POST chamada CreatePerson associada à entidade Person, o CLI gera automaticamente:

  • Endpoint com mapeamento HTTP.
  • Request/Response DTOs.
  • Extensions para integração com OpenAPI e versionamento.
  • HttpClient tipado para consumo interno por outros serviços.

Estrutura gerada:

MyApp/
└── src/
    ├── Services/
    │   └── MyService/
    │       └── Presentation.API/
    │           ├── MyApp.MyService.Presentation.API.csproj
    │           └── Endpoints/
    │               └── People/
    │                   └── CreatePerson/
    │                       ├── CreatePersonEndpoint.cs
    │                       ├── CreatePersonExtensions.cs
    │                       ├── CreatePersonRequest.cs
    │                       └── CreatePersonResponse.cs
    └── Integrations/
        └── MyService/
            └── Http/
                ├── Contracts/
                │   └── Apis/
                │       └── People/
                │           ├── IPersonHttpClient.cs
                │           └── CreatePerson/
                │               ├── CreatePersonRequest.cs
                │               └── CreatePersonResponse.cs
                └── Clients/
                    └── Apis/
                        └── PersonHttpClient.cs

Registro de Endpoints com Source Generators

O Lino elimina a necessidade de mapeamento manual de endpoints ou uso intensivo de Reflection em tempo de execução.
Em vez disso, utiliza Source Generators para produzir automaticamente o código de registro durante a compilação.

Como funciona

Para cada endpoint criado, o generator gera classes/parciais que chamam:
MapGet, MapPost, MapPut, MapDelete, etc.

Isso substitui a necessidade de adicionar manualmente todos os mapeamentos em Program.cs.

Vantagens:

  • Registro em tempo de compilação → evita erros de runtime.
  • Program.cs enxuto → menor superfície de configuração manual.
  • Compatibilidade AOT → elimina dependência de Reflection.
  • Documentação integrada → metadados (tags, summary, produces) são gerados junto ao mapeamento.

Esse modelo garante que as APIs criadas no Lino sejam:

  • Auto-documentadas
  • Performáticas
  • Consistentes com a arquitetura CQRS do framework.
Ocorreu um erro não tratado. Recarregar 🗙