Mais do que um CRUD
ToDo API é uma API REST para gerenciamento de usuários e tarefas. A solução usa ASP.NET Core, autenticação JWT, autorização por roles, MediatR e Entity Framework Core em camadas inspiradas na Clean Architecture.
Backend · REST API · Projeto educacional
Um projeto de estudo em evolução que reúne identidade, autorização, casos de uso, persistência, configuração e containers em uma única solução backend.
Visão geral
O domínio é simples de propósito: assim, o estudo pode se concentrar nas decisões que sustentam uma API organizada.
ToDo API é uma API REST para gerenciamento de usuários e tarefas. A solução usa ASP.NET Core, autenticação JWT, autorização por roles, MediatR e Entity Framework Core em camadas inspiradas na Clean Architecture.
O objetivo é transformar conceitos estudados separadamente em uma aplicação coerente, exercitando dependências, contratos, regras, persistência e execução de forma semelhante às preocupações de um projeto real.
Motivação
Desenvolvi o ToDo API para transformar conceitos estudados separadamente em uma aplicação backend completa e organizada. A ideia não era apenas criar endpoints de tarefas, mas entender como autenticação, autorização, regras de negócio, persistência, casos de uso, configuração e infraestrutura se conectam em um projeto ASP.NET Core.
Escolhi um domínio conhecido para direcionar a atenção ao que realmente queria exercitar: separação de responsabilidades, proteção de endpoints, identificação do usuário autenticado, comunicação entre camadas, testabilidade e execução reproduzível.
O projeto também funciona como espaço de revisão. As limitações encontradas fazem parte do aprendizado e ajudam a transformar decisões implícitas em próximos passos concretos.
Objetivos
A arquitetura busca criar uma base compreensível para evolução, sem afirmar que o projeto está pronto para produção.
ASP.NET Core, REST, controllers enxutos, DTOs, códigos HTTP e Swagger/OpenAPI.
Separação de responsabilidades, Dependency Injection, MediatR, commands, queries e handlers.
JWT, claims, identificação do usuário autenticado e autorização baseada nas roles Admin e User.
Entity Framework Core, PostgreSQL, migrations, variáveis de ambiente, Docker e Docker Compose.
Stack confirmada
Organização interna
A solução contém cinco projetos de execução. O domínio permanece independente dos detalhes de HTTP, banco, Swagger e Docker.
ToDo.slnx
├── Todo.Api/
├── ToDo.Application/
├── ToDo.Domain/
├── ToDo.Infrastructure/
├── CrossCutting/
└── ToDo.Tests/
├── ToDo.Api.Tests/
├── ToDo.Application.Tests/
├── ToDo.Domain.Tests/
└── ToDo.Infrastructure.Tests/
O projeto CrossCutting atua como composição: registra Application e Infrastructure e executa migrations/seeding na inicialização.
01 · Entrada
02 · Casos de uso
03 · Núcleo
04 · Detalhes
05 · Composição
Do HTTP ao banco
O fluxo de criação já possui classes reais, mas sua entrada HTTP depende da correção do controller:
TasksController
→ AddToDoCommand
→ AddToDoHandler
→ ITodoService
→ ITodoRepository
→ AppDbContext
→ PostgreSQLIdentidade e acesso
Autenticação confirma quem faz a requisição; autorização verifica se essa identidade pode executar a operação.
Credenciais entram por AuthController e são validadas.
O serviço gera um JWT após verificar a senha armazenada com hash.
O token contém NameIdentifier, Email, Name e Role.
O middleware valida o token e os atributos [Authorize] aplicam as restrições.
Authorization: Bearer {token}NameIdentifier conecta a identidade às operações do próprio usuário. Role diferencia ações administrativas das ações autenticadas comuns. Não há refresh token no estado atual.
| Operação | User | Admin |
|---|---|---|
| Atualizar ou excluir a própria conta | Sim | Sim |
| Listar usuários | Não | Sim |
| Cadastrar outro administrador | Não | Sim |
| Atualizar ou excluir outro usuário | Não | Sim |
| Gerenciar as próprias tarefas | Regra implementada* | Regra implementada* |
* O serviço restringe cada consulta pelo identificador da claim, mas a entrada HTTP de tarefas ainda precisa ser incluída no projeto compilado.
Contratos HTTP
Rotas e códigos de sucesso foram conferidos diretamente nos controllers.
| Método | Rota | Objetivo | Acesso | Sucesso |
|---|---|---|---|---|
| POST | /api/Auth/login | Autenticar e emitir JWT | Público | 200 |
| POST | /api/Auth/register | Cadastrar usuário com role User | Público | 201 |
| POST | /api/Auth/register/admin | Cadastrar administrador | Admin | 201 |
| Método | Rota | Objetivo | Acesso | Sucesso |
|---|---|---|---|---|
| GET | /api/Users | Listar usuários | Admin | 200 |
| PUT | /api/Users/{id} | Atualizar outro usuário | Admin | 204 |
| PUT | /api/Users | Atualizar a própria conta | Autenticado | 204 |
| DELETE | /api/Users/{id} | Excluir outro usuário | Admin | 204 |
| DELETE | /api/Users | Excluir a própria conta | Autenticado | 204 |
O arquivo define as rotas abaixo com [Authorize], mas está fora do diretório do projeto compilado. Elas representam a intenção já codificada, não a superfície HTTP disponível no build atual.
| Método | Rota codificada | Objetivo | Sucesso |
|---|---|---|---|
| POST | /api/Tasks | Criar tarefa do usuário | 201 |
| GET | /api/Tasks | Listar tarefas do usuário | 200 |
| GET | /api/Tasks/{id} | Consultar uma tarefa própria | 200 |
| PUT | /api/Tasks/{id} | Atualizar uma tarefa própria | 204 |
| DELETE | /api/Tasks/{id} | Excluir uma tarefa própria | 204 |
| DELETE | /api/Tasks | Excluir todas as tarefas próprias | 204 |
Dados e contratos
AppDbContext expõe Users e Todos. Npgsql conecta a aplicação ao PostgreSQL, migrations versionam o esquema e repositórios assíncronos isolam as consultas.
DTOs controlam entradas e saídas sem expor diretamente as entidades. Isso reduz overposting e permite que contratos HTTP e domínio evoluam com responsabilidades distintas.
Validators verificam os DTOs; Value Objects reforçam regras no domínio. Título é obrigatório e limitado a 100 caracteres, descrição a 500, email precisa ser válido e senha exige ao menos oito caracteres e diversidade de tipos.
ExceptionMiddleware converte exceções conhecidas em 400, 401, 404 ou 422 e mantém 500 como fallback. A resposta atual usa { status, error }; ainda não há ProblemDetails.
Ambiente
O repositório fornece um caminho reproduzível para executar API e banco, mas ainda possui ajustes de robustez mapeados.
DB_HOST=db
DB_PORT=5432
DB_NAME=postgres
DB_USER=postgres
DB_PASSWORD=change-me
JWT_KEY=change-me-with-a-long-random-valueNo Compose atual, JWT_KEY do arquivo .env é mapeada para a chave ASP.NET JWT:Key. O arquivo real deve permanecer fora do Git e nunca conter segredos publicados.
git clone https://github.com/SIRSoares33/ToDoApi.git
cd ToDoApi
dotnet restore ToDo.slnx
export DatabaseConnection="Host=localhost;Port=5432;Database=postgres;Username=postgres;Password=change-me"
export JWT__Key="change-me-with-a-long-random-value"
dotnet run --project Todo.Api/Todo.Api.csprojNa configuração local do ASP.NET Core, o duplo underscore de JWT__Key representa a hierarquia JWT:Key.
docker compose up --buildO Compose publica a API em http://localhost:8080 e o PostgreSQL em 5432. A rede padrão do Compose conecta os serviços e o volume pgdata persiste o banco.
http://localhost:8080/swaggerO Swagger atual permite visualizar e executar os contratos ativos. Entretanto, AddSwaggerGen() ainda não registra um esquema de segurança Bearer; por isso, o fluxo de autenticação via botão Authorize precisa ser configurado antes de testar rotas protegidas diretamente pela interface.
Biblioteca reutilizada
O pacote é referenciado por ToDo.Infrastructure, registrado por AddPsalmsJwtAuthentication(configuration) e utilizado por PsalmsJwtTokenService para emitir tokens.
O ToDo API serviu como cenário de aplicação para validar a biblioteca em conjunto com claims, roles e Dependency Injection. O projeto continua responsável pela verificação de credenciais e pelas regras de acesso.
Qualidade
A base de testes já existe e cobre as quatro áreas da solução; ela não é apenas um item planejado.
Há testes de entidades, Value Objects, validators, handlers, controllers, claims, serviços e repositórios. Os testes de Infrastructure usam SQLite para exercitar o EF Core.
O repositório possui workflow de restore, build e test com .NET 10, build de imagem Docker e análise CodeQL. Um workflow duplicado ainda aponta para .NET 8 e precisa ser consolidado.
Escolhas conscientes
Separar regras e casos de uso dos detalhes externos para tornar dependências e responsabilidades mais visíveis.
Representar intenções com commands e queries, reduzindo o acoplamento direto dos controllers.
Controlar os contratos HTTP sem expor diretamente as entidades do domínio.
Exercitar autenticação stateless e diferenciar operações administrativas das ações da própria conta.
Usar persistência relacional com migrations em um cenário próximo ao encontrado em aplicações backend.
Padronizar a inicialização da API e do banco e manter configuração sensível fora do código.
Capacidade demonstrada
O ToDo API demonstra minha capacidade de construir uma aplicação backend além dos endpoints básicos, organizando autenticação, autorização, casos de uso, persistência e infraestrutura em uma arquitetura compreensível e preparada para evolução.
Reflexão
Aprendi que uma API organizada exige mais do que endpoints funcionando. Autenticação e autorização resolvem problemas diferentes, e as claims são o elo entre a identidade do usuário e as regras da aplicação.
Separar camadas tornou as dependências mais visíveis. MediatR ajudou a isolar casos de uso, enquanto os DTOs protegeram os contratos externos. Ao mesmo tempo, o projeto mostrou que abstrações só agregam valor quando continuam proporcionais ao problema.
Docker reduziu diferenças entre ambientes, mas também evidenciou que subir containers não basta: prontidão do banco, variáveis consistentes, segredos e observabilidade precisam ser tratados explicitamente.
O aprendizado mais importante foi revisar o próprio código com honestidade. Encontrar uma rota implementada fora do projeto compilado reforçou a importância de validar a aplicação como ela realmente é executada.
Roadmap técnico
Evoluções realistas identificadas a partir do estado atual, sem prazo ou promessa de produção.
TasksController.cs para o projeto Todo.Api e adicionar testes dos endpoints compilados.POSTGRES_DB/POSTGRES_USER, health check e espera real pela prontidão do banco.ProblemDetails.Continuar explorando
O repositório contém a implementação, os testes, os arquivos Docker e os workflows auditados para esta apresentação.