API REST para gerenciamento de alunos com autenticação JWT. Sistema completo de CRUD de estudantes com controle de acesso, desenvolvido em .NET 6 com Clean Architecture, testes unitários abrangentes e infraestrutura containerizada.
- Funcionalidades
- Como Rodar o Projeto
- Decisões Técnicas
- Organização do Código
- O que foi Feito
- O que Ficou Pendente
- Possíveis Melhorias
- Endpoints da API
- Testes
- Documentação Adicional
- ✅ Autenticação JWT - Login e registro de usuários com tokens seguros
- ✅ CRUD de Alunos - Criar, listar, buscar e deletar estudantes
- ✅ Validações Robustas - FluentValidation para inputs
- ✅ Result Pattern - Tratamento de erros explícito sem exceptions
- ✅ Testes Unitários - 28 testes cobrindo todos os services
- ✅ Docker - Containerização completa com docker-compose
- ✅ CI/CD - GitHub Actions para build, test e deploy
- ✅ Clean Architecture - Separação de responsabilidades em camadas
- ✅ Entity Framework Core - ORM com migrations
- ✅ Swagger/OpenAPI - Documentação interativa da API
⚠️ IMPORTANTE: O docker-compose apresentou problemas de inicialização e sincronização entre containers durante o desenvolvimento e não foi finalizado a tempo. Recomenda-se executar localmente conforme instruções abaixo, ou fazer a composição manual dos containers (SQL Server + API separadamente).
Opção Local (Recomendado):
- .NET SDK 6.0+
- SQL Server 2022+ ou SQL Server Express
- Git
Opção Docker (Experimental - Pode apresentar problemas):
- Docker Desktop 20.10+
- Docker Compose 1.29+
git clone https://github.com/seu-usuario/Teste_Tecnico_Backend_Rede_Lius.git
cd Teste_Tecnico_Backend_Rede_LiusCertifique-se que o SQL Server está rodando e atualize a connection string em appsettings.Development.json:
{
"ConnectionStrings": {
"DefaultConnection": "Server=localhost;Database=StudentManagementDb;User Id=sa;Password=SuaSenha;TrustServerCertificate=True;"
}
}Edite appsettings.Development.json:
{
"JwtSettings": {
"SecretKey": "sua-chave-secreta-com-minimo-32-caracteres",
"Issuer": "StudentManagementAPI",
"Audience": "StudentManagementClient",
"ExpirationMinutes": 60
}
}dotnet restorecd StudentManagement.API
dotnet ef database updatedotnet run --project StudentManagement.API- API: https://localhost:7000 ou http://localhost:5000
- Swagger: https://localhost:7000/swagger
# Todos os testes
dotnet test
# Com cobertura
dotnet test /p:CollectCoverage=true
⚠️ Aviso: Esta opção pode apresentar problemas de sincronização entre containers e inicialização do banco de dados. Os problemas conhecidos incluem:
- Dependências entre containers não respeitadas completamente
- Migrations não aplicadas automaticamente
- SQL Server pode não estar pronto quando a API tenta conectar
Status: Não finalizado devido a limitações de tempo. Preferir execução local.
git clone https://github.com/seu-usuario/Teste_Tecnico_Backend_Rede_Lius.git
cd Teste_Tecnico_Backend_Rede_Liuscp .env.example .env
# Edite .env com suas configuraçõesdocker-compose up -d --builddocker-compose ps# Conecte no SQL Server e execute o script
sqlcmd -S localhost -U sa -P "SqlServer2024!" -i init-db.sql
# Ou dentro do container da API
docker-compose exec api dotnet ef database updatedocker-compose restart api- API: http://localhost:5000
- Swagger: http://localhost:5000/swagger
- Health Check: http://localhost:5000/health
# Ver logs
docker-compose logs -f api
docker-compose logs -f sqlserver
# Parar containers
docker-compose down
# Limpar tudo e recomeçar
docker-compose down -v
docker-compose up -d --build📖 Documentação Docker (com limitações conhecidas): DOCKER.md
Se preferir montar manualmente:
docker run -d \
--name sqlserver \
-e "ACCEPT_EULA=Y" \
-e "SA_PASSWORD=SqlServer2024!" \
-p 1433:1433 \
mcr.microsoft.com/mssql/server:2022-latest# Aguarde ~20s para SQL Server inicializar
sleep 20
sqlcmd -S localhost -U sa -P "SqlServer2024!" -i init-db.sql# Configure appsettings.Development.json com Server=localhost
dotnet run --project StudentManagement.APIdotnet test /p:CollectCoverage=true
## 🎯 Decisões Técnicas
### Arquitetura
**Clean Architecture** com separação em camadas:
- **API**: Controllers, Middlewares, configurações
- **Application**: Services (use cases), DTOs, Validators
- **Domain**: Entities, Interfaces
- **Infrastructure**: Repositórios, DbContext, EF Configurations
**Justificativa**: Separação de responsabilidades, testabilidade, manutenibilidade e baixo acoplamento.
### Padrões Implementados
#### 1. **Result Pattern**
Ao invés de lançar exceptions para controle de fluxo, usamos `Result<T>`:
```csharp
public async Task<Result<StudentViewModel>> AddStudentAsync(CreateStudentInputModel input)
{
if (emailExists)
return Result<StudentViewModel>.Failure("Email já cadastrado");
return Result<StudentViewModel>.Success(viewModel);
}
Vantagens:
- ✅ Erros explícitos e previsíveis
- ✅ Melhor performance (sem overhead de exceptions)
- ✅ Força tratamento de erros
- ✅ Facilita testes
Abstração do acesso a dados através de interfaces:
public interface IStudentRepository
{
Task<Student?> GetByIdAsync(Guid id);
Task<List<Student>> GetAllAsync();
// ...
}Vantagens:
- ✅ Testabilidade (fácil mock)
- ✅ Troca de ORM/banco sem impacto
- ✅ Centralização da lógica de dados
Inversão de controle nativa do .NET:
builder.Services.AddScoped<IStudentRepository, StudentRepository>();
builder.Services.AddScoped<AddStudentService>();Vantagens:
- ✅ Baixo acoplamento
- ✅ Testabilidade
- ✅ Reutilização de código
- PBKDF2 (nativo .NET) para hash de senhas com salt
- Tokens JWT com expiração configurável
- Claims-based authorization
- Validação de issuer, audience e lifetime
Por que PBKDF2 ao invés de BCrypt?
- ✅ Nativo do .NET (
System.Security.Cryptography) - ✅ Sem dependências externas
- ✅ NIST approved
- ✅ Configurável (10.000 iterações, SHA256)
Container roda como usuário appuser (não-root) para segurança.
FluentValidation para validação de inputs:
RuleFor(x => x.Email)
.NotEmpty()
.EmailAddress()
.MaximumLength(256);Vantagens:
- ✅ Validações declarativas
- ✅ Mensagens customizáveis
- ✅ Testável
- ✅ Reutilizável
Entity Framework Core 6 com:
- Code-First approach
- Migrations para versionamento do schema
- Fluent API para configurações explícitas
- Índice único em email para performance
Docker multi-stage build:
- Build stage (SDK image)
- Publish stage
- Runtime stage (ASP.NET image)
Vantagens:
- ✅ Imagem final menor (~200MB vs ~700MB)
- ✅ Sem SDK em produção (segurança)
- ✅ Build reproducível
- ✅ Cache de layers otimizado
GitHub Actions com:
- Build e testes automáticos
- Docker build e push
- Security scan (Trivy)
- Dependabot para atualizações
StudentManagement/
├── .github/
│ ├── workflows/
│ │ ├── ci.yml # Pipeline CI
│ │ └── cd.yml # Pipeline CD
│ ├── dependabot.yml # Atualizações automáticas
│ └── PULL_REQUEST_TEMPLATE.md # Template de PR
│
├── StudentManagement.API/ # Camada de Apresentação
│ ├── API/
│ │ ├── Controllers/ # API Endpoints
│ │ │ ├── AuthController.cs # Login/Register
│ │ │ └── StudentsController.cs # CRUD Students
│ │ └── Middlewares/
│ │ └── GlobalExceptionMiddleware.cs # Error handling global
│ ├── Application/ # Camada de Aplicação
│ │ ├── Common/
│ │ │ └── Result.cs # Result Pattern
│ │ ├── DTOs/ # Data Transfer Objects
│ │ │ ├── CreateStudentInputModel.cs
│ │ │ ├── StudentViewModel.cs
│ │ │ ├── LoginInputModel.cs
│ │ │ ├── RegisterUserInputModel.cs
│ │ │ └── AuthViewModel.cs
│ │ ├── Services/ # Use Cases
│ │ │ ├── AddStudentService.cs
│ │ │ ├── GetAllStudentsService.cs
│ │ │ ├── GetStudentByIdService.cs
│ │ │ └── DeleteStudentService.cs
│ │ ├── Validators/
│ │ │ └── CreateStudentValidator.cs
│ │ └── DependencyInjection.cs
│ ├── Domain/ # Camada de Domínio
│ │ ├── Entities/
│ │ │ ├── Student.cs # Entidade Student
│ │ │ └── User.cs # Entidade User
│ │ └── Interfaces/ # Contratos
│ │ ├── IStudentRepository.cs
│ │ ├── IUserRepository.cs
│ │ └── IAuthService.cs
│ ├── Infrastructure/ # Camada de Infraestrutura
│ │ ├── Data/
│ │ │ ├── ApplicationDbContext.cs
│ │ │ ├── Configurations/
│ │ │ │ └── StudentConfiguration.cs
│ │ │ └── Migrations/
│ │ ├── Repositories/
│ │ │ ├── StudentRepository.cs
│ │ │ └── UserRepository.cs
│ │ ├── Services/
│ │ │ └── AuthService.cs # JWT + Password hashing
│ │ └── DependencyInjection.cs
│ ├── Program.cs # Entry point
│ └── appsettings.json
│
├── StudentManagement.Tests/ # Testes Unitários
│ ├── Services/
│ │ ├── AddStudentServiceTests.cs
│ │ ├── GetAllStudentsServiceTests.cs
│ │ ├── GetStudentByIdServiceTests.cs
│ │ └── DeleteStudentServiceTests.cs
│ └── StudentManagement.Tests.csproj
│
├── docker-compose.yml # Orquestração de containers
├── Dockerfile # Multi-stage build
├── .dockerignore # Arquivos excluídos do build
├── .env.example # Template de variáveis
├── README.md # Este arquivo
├── DOCKER.md # Documentação Docker
└── GITHUB_ACTIONS.md # Documentação CI/CD
- ✅ SOLID - Single Responsibility, Dependency Inversion
- ✅ DRY - Don't Repeat Yourself
- ✅ KISS - Keep It Simple, Stupid
- ✅ Separation of Concerns - Camadas independentes
- ✅ Fail Fast - Validações no início do fluxo
- Autenticação JWT completa (login/register)
- CRUD completo de estudantes
- Validações com FluentValidation
- Result Pattern em todos services e controllers
- Global Exception Middleware
- Entity Framework Core com migrations
- Repository Pattern
- Clean Architecture (4 camadas)
- Password hashing com PBKDF2
- Proteção de endpoints com [Authorize]
- Health check endpoint
- 28 testes unitários (100% dos services)
- Mock com Moq
- Testes de validação
- Testes de Result Pattern
- Testes de casos de sucesso e erro
- Dockerfile multi-stage otimizado
- Docker Compose com SQL Server
- Health checks em containers
- Non-root user no container
- .dockerignore configurado
- Volumes persistentes
- GitHub Actions - CI Pipeline
- Build e testes automáticos
- Docker build e push
- Security scan (Trivy)
- Dependabot configurado
- PR template
- CD Pipeline básica
- README completo
- Documentação Docker (DOCKER.md)
- Documentação GitHub Actions
- Swagger/OpenAPI
- Comentários XML em código
- .env.example
- Update de estudante (PATCH/PUT)
- Paginação na listagem de estudantes
- Filtros e busca (por nome, email, grade)
- Soft delete ao invés de hard delete
- Autorização baseada em roles (Admin/User)
- Refresh tokens para JWT
- Email verification no registro
- Password reset functionality
- Testes de integração
- Testes de controllers
- Testes de validators
- Testes de repositories
- Code coverage > 80%
- Testes E2E
- HTTPS com certificados SSL
- Rate limiting
- CORS configurado adequadamente
- Logging estruturado (Serilog)
- Monitoring (Application Insights, Prometheus)
- Distributed caching (Redis)
- Deploy automático para Azure/AWS
- Code coverage reports
- SonarQube/SonarCloud
- Performance testing na pipeline
- Semantic versioning automático
- Rollback automático em falhas
- Architecture Decision Records (ADRs)
- API versioning documentation
- Postman collection
- Tutorial de onboarding
| Método | Endpoint | Descrição | Auth |
|---|---|---|---|
| POST | /api/auth/register |
Registrar novo usuário | Não |
| POST | /api/auth/login |
Login e obter JWT token | Não |
| Método | Endpoint | Descrição | Auth |
|---|---|---|---|
| GET | /api/students |
Listar todos estudantes | Sim |
| GET | /api/students/{id} |
Buscar estudante por ID | Sim |
| POST | /api/students |
Criar novo estudante | Sim |
| DELETE | /api/students/{id} |
Deletar estudante | Sim |
| Método | Endpoint | Descrição | Auth |
|---|---|---|---|
| GET | /health |
Status da aplicação | Não |
curl -X POST http://localhost:5000/api/auth/register \
-H "Content-Type: application/json" \
-d '{
"username": "joao",
"password": "Senha@123"
}'curl -X POST http://localhost:5000/api/auth/login \
-H "Content-Type: application/json" \
-d '{
"username": "joao",
"password": "Senha@123"
}'curl -X POST http://localhost:5000/api/students \
-H "Content-Type: application/json" \
-H "Authorization: Bearer SEU_TOKEN_JWT" \
-d '{
"name": "Maria Silva",
"email": "maria.silva@email.com",
"grade": "3º Ano"
}'# Todos os testes
dotnet test
# Com detalhes
dotnet test --verbosity detailed
# Apenas um projeto
dotnet test StudentManagement.Tests/StudentManagement.Tests.csproj
# Com coverage (requer coverlet)
dotnet test /p:CollectCoverage=true /p:CoverageReportFormat=html- 28 testes criados
- 100% dos services cobertos
- Services testados:
- ✅ AddStudentService (5 testes)
- ✅ GetAllStudentsService (7 testes)
- ✅ GetStudentByIdService (6 testes)
- ✅ DeleteStudentService (5 testes)
- ✅ Validações com Theory tests (5 testes)
[Fact]
public async Task AddStudentAsync_WithValidData_ShouldReturnSuccess()
{
// Arrange
var input = new CreateStudentInputModel { ... };
_repositoryMock.Setup(...).ReturnsAsync(false);
// Act
var result = await _sut.AddStudentAsync(input);
// Assert
Assert.True(result.IsSuccess);
Assert.NotNull(result.Value);
}- 📦 Documentação Docker - Como usar Docker e docker-compose
- 🔄 Documentação GitHub Actions - CI/CD pipelines
- 📝 Swagger UI - Documentação interativa da API (quando rodando)
- Fork o projeto
- Crie uma branch para sua feature (
git checkout -b feature/MinhaFeature) - Commit suas mudanças (
git commit -m 'feat: adiciona nova feature') - Push para a branch (
git push origin feature/MinhaFeature) - Abra um Pull Request
Desenvolvido como teste técnico para Rede Lius.