Skip to content

jaugustorc/Teste_Tecnico_Backend_Rede_Lius

Repository files navigation

Student Management API

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.

CI/CD .NET Docker License

📋 Índice

🚀 Funcionalidades

  • 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

🏃 Como Rodar o Projeto

⚠️ 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).

Pré-requisitos

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+

Opção 1: Localmente (Recomendado)

1. Clone o repositório

git clone https://github.com/seu-usuario/Teste_Tecnico_Backend_Rede_Lius.git
cd Teste_Tecnico_Backend_Rede_Lius

2. Configure o SQL Server

Certifique-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;"
  }
}

3. Configure JWT Settings

Edite appsettings.Development.json:

{
  "JwtSettings": {
    "SecretKey": "sua-chave-secreta-com-minimo-32-caracteres",
    "Issuer": "StudentManagementAPI",
    "Audience": "StudentManagementClient",
    "ExpirationMinutes": 60
  }
}

4. Restore dependências

dotnet restore

5. Aplicar migrations

cd StudentManagement.API
dotnet ef database update

6. Execute a aplicação

dotnet run --project StudentManagement.API

7. Acesse a aplicação

Executar testes

# Todos os testes
dotnet test

# Com cobertura
dotnet test /p:CollectCoverage=true

Opção 2: Docker Compose (Experimental)

⚠️ 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.

Se ainda assim quiser tentar:

1. Clone o repositório

git clone https://github.com/seu-usuario/Teste_Tecnico_Backend_Rede_Lius.git
cd Teste_Tecnico_Backend_Rede_Lius

2. Configure variáveis de ambiente (opcional)

cp .env.example .env
# Edite .env com suas configurações

3. Inicie os containers

docker-compose up -d --build

4. Aguarde SQL Server inicializar (~40s)

docker-compose ps

5. Aplicar migrations manualmente

# 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 update

6. Reinicie a API se necessário

docker-compose restart api

7. Acesse a aplicação

Comandos úteis Docker

# 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

Opção 3: Composição Manual de Containers

Se preferir montar manualmente:

1. Inicie o SQL Server

docker run -d \
  --name sqlserver \
  -e "ACCEPT_EULA=Y" \
  -e "SA_PASSWORD=SqlServer2024!" \
  -p 1433:1433 \
  mcr.microsoft.com/mssql/server:2022-latest

2. Execute o script de inicialização

# Aguarde ~20s para SQL Server inicializar
sleep 20
sqlcmd -S localhost -U sa -P "SqlServer2024!" -i init-db.sql

3. Execute a aplicação localmente

# Configure appsettings.Development.json com Server=localhost
dotnet run --project StudentManagement.API

🎯 Decisões Técnicas

dotnet 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

2. Repository Pattern

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

3. Dependency Injection

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

Segurança

Autenticação JWT

  • 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)

Non-root Docker User

Container roda como usuário appuser (não-root) para segurança.

Validações

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

Banco de Dados

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

Containerização

Docker multi-stage build:

  1. Build stage (SDK image)
  2. Publish stage
  3. 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

CI/CD

GitHub Actions com:

  • Build e testes automáticos
  • Docker build e push
  • Security scan (Trivy)
  • Dependabot para atualizações

📁 Organização do Código

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

Princípios Aplicados

  • 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

✅ O que foi Feito

Backend API

  • 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

Testes

  • 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

Infraestrutura

  • Dockerfile multi-stage otimizado
  • Docker Compose com SQL Server
  • Health checks em containers
  • Non-root user no container
  • .dockerignore configurado
  • Volumes persistentes

CI/CD

  • GitHub Actions - CI Pipeline
  • Build e testes automáticos
  • Docker build e push
  • Security scan (Trivy)
  • Dependabot configurado
  • PR template
  • CD Pipeline básica

Documentação

  • README completo
  • Documentação Docker (DOCKER.md)
  • Documentação GitHub Actions
  • Swagger/OpenAPI
  • Comentários XML em código
  • .env.example

🔮 Possíveis Melhorias

Funcionalidades

  • 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

  • Testes de integração
  • Testes de controllers
  • Testes de validators
  • Testes de repositories
  • Code coverage > 80%
  • Testes E2E

Infraestrutura

  • HTTPS com certificados SSL
  • Rate limiting
  • CORS configurado adequadamente
  • Logging estruturado (Serilog)
  • Monitoring (Application Insights, Prometheus)
  • Distributed caching (Redis)

CI/CD

  • Deploy automático para Azure/AWS
  • Code coverage reports
  • SonarQube/SonarCloud
  • Performance testing na pipeline
  • Semantic versioning automático
  • Rollback automático em falhas

Documentação

  • Architecture Decision Records (ADRs)
  • API versioning documentation
  • Postman collection
  • Tutorial de onboarding

📚 Endpoints da API

Autenticação

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

Estudantes

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

Health Check

Método Endpoint Descrição Auth
GET /health Status da aplicação Não

Exemplo de Request

Register

curl -X POST http://localhost:5000/api/auth/register \
  -H "Content-Type: application/json" \
  -d '{
    "username": "joao",
    "password": "Senha@123"
  }'

Login

curl -X POST http://localhost:5000/api/auth/login \
  -H "Content-Type: application/json" \
  -d '{
    "username": "joao",
    "password": "Senha@123"
  }'

Criar Estudante

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"
  }'

🧪 Testes

Executar Testes

# 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

Cobertura Atual

  • 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)

Estrutura dos 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 Adicional

🤝 Contribuindo

  1. Fork o projeto
  2. Crie uma branch para sua feature (git checkout -b feature/MinhaFeature)
  3. Commit suas mudanças (git commit -m 'feat: adiciona nova feature')
  4. Push para a branch (git push origin feature/MinhaFeature)
  5. Abra um Pull Request

Desenvolvido como teste técnico para Rede Lius.

About

API de Catálogo Digital para teste tecnico. O sistema permite cadastro, listagem e exclusão de produtos e controle de acesso (Auth JWT), projetado para alta escalabilidade e manutenção. Desenvolvido em .NET 6 aplicando Clean Architecture, CQRS (MediatR), validações de negócio robustas e infraestrutura containerizada (Docker/SQL Server).

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

 
 
 

Contributors