Documentacao tecnica oficial do projeto Stacker, uma API REST para gestao de usuarios, habilidades e projetos no contexto de marketplace freelancer.
O Stacker foi estruturado em arquitetura em camadas com separacao clara de responsabilidades entre API, aplicacao, dominio e infraestrutura.
Objetivos principais do sistema:
- Cadastro e autenticacao de usuarios.
- Gestao de habilidades.
- Gestao completa do ciclo de vida de projetos (criacao, atualizacao, inicio, conclusao e cancelamento logico).
- Registro de comentarios em projetos.
Para validacao funcional, testes de contrato e integracao de telas/servicos cliente, consulte o guia dedicado:
docs/API-Docs.md
Esse material complementar detalha payloads, respostas esperadas, cenarios de erro (400, 401, 404) e checklist de regressao.
A solution esta organizada em quatro camadas principais:
Stacker.API: camada de entrada HTTP (controllers, DI, middleware, autenticacao e OpenAPI).Stacker.Application: casos de uso via CQRS comMediatR, handlers, validadores e view models.Stacker.Core: entidades de dominio, contratos (RepositorieseServices) e enums.Stacker.Infrastructure: persistencia com Entity Framework Core, implementacoes de repositorios e servico de autenticacao JWT.
- CQRS (Command Query Responsibility Segregation) com
MediatR. - Repository Pattern para desacoplar acesso a dados da camada de aplicacao.
- Validacao em pipeline com
FluentValidation+IPipelineBehavior(ValidationBehavior). - Injecao de Dependencia nativa do ASP.NET Core.
- Tratamento centralizado de erro de validacao via middleware customizado em
Program.cs. - Estrategia hibrida de dados para performance:
Dapperpara leituras/escritas mais custosas eEF Corepara operacoes leves e mapeamento.
.NET 10(net10.0)ASP.NET Core Web API
Entity Framework Core 10Npgsql.EntityFrameworkCore.PostgreSQL 10- Banco alvo: PostgreSQL (via
DefaultConnection)
MediatR.Extensions.Microsoft.DependencyInjection 11.1.0FluentValidation 12.1.1
Microsoft.AspNetCore.Authentication.JwtBearer 10.0.5- Tokens JWT assinados com
HMAC-SHA256 - Hash de senha com
SHA-256(implementado emAuthService)
Microsoft.AspNetCore.OpenApi 10.0.3Scalar.AspNetCore 2.13.9
Dapper 2.1.72(referenciada na camadaStacker.Infrastructure)
- Criar usuario (
POST /api/users) - Registrar usuario (
POST /api/users/register) - Login com emissao de JWT (
POST /api/users/login) - Listar usuarios ativos (
GET /api/users) - Buscar usuario por id (
GET /api/users/{id}) - Atualizar usuario (
PUT /api/users/{id}) - Excluir usuario com soft delete (
DELETE /api/users/{id}->Active = false)
- Criar habilidade
- Listar habilidades
- Buscar habilidade por id
- Atualizar habilidade
- Excluir habilidade (remoção fisica)
- Criar projeto
- Listar projetos
- Buscar projeto por id
- Atualizar projeto
- Excluir projeto com cancelamento logico (
Status = Cancelled) - Iniciar projeto (
POST /api/projects/{id}/start) - Finalizar projeto (
POST /api/projects/{id}/finish) - Criar comentario em projeto (
POST /api/projects/{id}/comments)
Status em ProjectStatusEnum:
CreatedInProgressSuspendedCancelledFinished
Transicoes de negocio implementadas na entidade Project:
Start()apenas quando status atual forCreated.Finish()apenas quando status atual forInProgress.Cancel()quando status atual forCreatedouInProgress.
Base URL local configurada em launchSettings.json:
- HTTP:
http://localhost:5172 - HTTPS:
https://localhost:7184
Todos os exemplos abaixo usam
http://localhost:5172para facilitar testes locais.
| Recurso | Metodo | Rota | Descricao | Codigos principais |
|---|---|---|---|---|
| Users | GET | /api/users |
Lista usuarios ativos | 200 |
| Users | GET | /api/users/{id} |
Detalhe de usuario | 200, 404 |
| Users | POST | /api/users |
Cria usuario | 201, 400 |
| Users | PUT | /api/users/{id} |
Atualiza usuario | 204, 400, 404 |
| Users | DELETE | /api/users/{id} |
Soft delete de usuario | 204, 404 |
| Users | POST | /api/users/login |
Autentica e retorna token | 200, 400, 401 |
| Users | POST | /api/users/register |
Cadastro de usuario (alias de criacao) | 201, 400 |
| Skills | GET | /api/skills |
Lista habilidades | 200 |
| Skills | GET | /api/skills/{id} |
Detalhe de habilidade | 200, 404 |
| Skills | POST | /api/skills |
Cria habilidade | 201, 400 |
| Skills | PUT | /api/skills/{id} |
Atualiza habilidade | 204, 400, 404 |
| Skills | DELETE | /api/skills/{id} |
Exclui habilidade | 204, 404 |
| Projects | GET | /api/projects |
Lista projetos | 200 |
| Projects | GET | /api/projects/{id} |
Detalhe de projeto | 200, 404 |
| Projects | POST | /api/projects |
Cria projeto | 201, 400, 404 |
| Projects | PUT | /api/projects/{id} |
Atualiza projeto | 204, 400, 404 |
| Projects | DELETE | /api/projects/{id} |
Cancela projeto | 204, 404 |
| Projects | POST | /api/projects/{id}/comments |
Cria comentario no projeto | 204, 400, 404 |
| Projects | POST | /api/projects/{id}/start |
Inicia projeto | 204, 404 |
| Projects | POST | /api/projects/{id}/finish |
Finaliza projeto | 204, 404 |
curl -X POST "http://localhost:5172/api/users/register" \
-H "Content-Type: application/json" \
-d '{
"fullName": "Maria Silva",
"email": "maria.silva@empresa.com",
"birthDate": "1995-04-10T00:00:00",
"password": "SenhaForte@123",
"role": "Freelancer"
}'curl -X POST "http://localhost:5172/api/users/login" \
-H "Content-Type: application/json" \
-d '{
"email": "maria.silva@empresa.com",
"password": "SenhaForte@123"
}'Exemplo de resposta de sucesso (200):
{
"email": "maria.silva@empresa.com",
"token": "<jwt-token>"
}curl -X POST "http://localhost:5172/api/skills" \
-H "Content-Type: application/json" \
-d '{
"description": "ASP.NET Core"
}'curl -X POST "http://localhost:5172/api/projects" \
-H "Content-Type: application/json" \
-d '{
"title": "API de Marketplace Freelancer",
"description": "Implementacao de backend para gestao de projetos e contratacoes.",
"idClient": 1,
"idFreelancer": 2,
"totalCost": 12500.00
}'curl -X POST "http://localhost:5172/api/projects/1/start"
curl -X POST "http://localhost:5172/api/projects/1/finish"curl -X POST "http://localhost:5172/api/projects/1/comments" \
-H "Content-Type: application/json" \
-d '{
"content": "Entrega parcial validada. Prosseguir para a proxima etapa.",
"idUser": 1
}'Validacoes sao aplicadas por comando via FluentValidation e executadas automaticamente no pipeline do MediatR.
Principais regras:
- Usuario: nome obrigatorio e max. 100, email valido, idade minima 18 anos, senha forte, role obrigatoria.
- Projeto: titulo obrigatorio e max. 50, descricao obrigatoria e max. 500, cliente/freelancer validos, custo > 0.
- Skill: descricao obrigatoria e max. 100.
- Comentario: conteudo obrigatorio e max. 500, projeto e usuario validos.
Formato de erro de validacao (400) retornado pela API:
{
"title": "Falha na validacao",
"status": 400,
"detail": "Um ou mais campos estao invalidos.",
"errors": {
"Email": ["Informe um e-mail valido."]
}
}Arquivo: Stacker.API/appsettings.Development.json
Campos obrigatorios:
{
"ConnectionStrings": {
"DefaultConnection": "Host=...;Port=5432;Database=...;Username=...;Password=..."
},
"Jwt": {
"Key": "sua-chave-secreta-com-tamanho-adequado",
"Issuer": "stacker-api",
"Audience": "stacker-clients"
}
}- SDK
.NET 10 - PostgreSQL disponivel
dotnet restore
dotnet run --project Stacker.APICom o profile padrao de desenvolvimento, a API fica disponivel em:
http://localhost:5172https://localhost:7184
Em ambiente de desenvolvimento, a aplicacao expõe especificacao OpenAPI e interface de referencia via Scalar.
- OpenAPI: endpoint mapeado por
app.MapOpenApi() - API Reference: endpoint mapeado por
app.MapScalarApiReference()
- A API gera JWT no login; a configuracao de autenticacao JWT esta registrada globalmente em
Program.cs. - Exclusao de usuarios e projetos e logica (soft/cancelamento), preservando historico operacional.
- Estrutura pronta para evolucao com testes, versionamento de API e observabilidade.