Plataforma de gerenciamento de jogos digitais desenvolvida em .NET 8 com Clean Architecture
- Sobre o Projeto
- Arquitetura e Padrões
- Fluxo da Aplicação
- Regras de Negócio
- Tecnologias Utilizadas
- Pré-requisitos
- Instalação e Execução
- Endpoints da API
- Testes
- Estrutura do Projeto
- Documentação Adicional
- Grupo e Participantes
O FCG é uma plataforma de gerenciamento de jogos digitais que permite:
- 👤 Cadastro e autenticação de usuários com JWT
- 🎮 Catálogo de jogos com gerenciamento por administradores
- 💰 Sistema de carteira virtual (saldo inicial de R$ 10,00)
- 📚 Biblioteca pessoal de jogos adquiridos
- 🎁 Sistema de promoções com descontos temporários
- 🔐 Controle de acesso baseado em roles (Admin/User)
Este projeto foi desenvolvido como parte do Tech Challenge da FIAP, com foco em:
- ✅ Demonstrar a aplicação de Clean Architecture e SOLID
- ✅ Implementar Domain-Driven Design (DDD)
- ✅ Aplicar o padrão CQRS com MediatR
- ✅ Garantir testabilidade (testes unitários, integrados e funcionais)
- ✅ Utilizar Docker para containerização
- ✅ Documentar adequadamente a solução
O projeto segue a Clean Architecture com separação clara de responsabilidades:
┌─────────────────────────────────────────┐
│ FCG.WebApi │ ← Camada de Apresentação
│ (Controllers, Middlewares) │
└────────────────┬────────────────────────┘
│
┌────────────────▼────────────────────────┐
│ FCG.Application │ ← Camada de Aplicação
│ (Use Cases, Handlers, Events) │
└────────────────┬────────────────────────┘
│
┌────────────────▼────────────────────────┐
│ FCG.Domain │ ← Camada de Domínio
│ (Entities, Value Objects, Interfaces) │
└────────────────┬────────────────────────┘
│
┌────────────────▼────────────────────────┐
│ FCG.Infrastructure │ ← Camada de Infraestrutura
│ (Persistence, Services, Migrations) │
└─────────────────────────────────────────┘
- SOLID Principles: Aplicados em todas as camadas
- CQRS (Command Query Responsibility Segregation): Separação entre comandos e consultas
- Repository Pattern: Abstração da persistência de dados
- Unit of Work: Gerenciamento de transações
- Domain Events: Comunicação desacoplada entre agregados
- Value Objects: Encapsulamento de lógica de validação
- Dependency Injection: Inversão de controle
- Mediator Pattern: Comunicação através do MediatR
sequenceDiagram
participant Cliente
participant API
participant UseCase
participant Domain
participant Database
Cliente->>API: POST /api/v1/users/register
API->>UseCase: RegisterUserCommand
UseCase->>Domain: Validar dados (Value Objects)
Domain-->>UseCase: Validação OK
UseCase->>Domain: Criar User Entity
UseCase->>Domain: Criar Library (auto)
UseCase->>Domain: Criar Wallet (R$ 10,00)
UseCase->>Database: Persistir (UnitOfWork)
Database-->>UseCase: Sucesso
UseCase->>Domain: Disparar UserCreatedEvent
UseCase-->>API: Retornar User DTO
API-->>Cliente: 201 Created
Regras aplicadas:
- ✅ Email deve ser único e válido
- ✅ Senha deve ter no mínimo 8 caracteres, letras e números
- ✅ Library é criada automaticamente
- ✅ Wallet iniciada com R$ 10,00
- ✅ Role padrão: User (1)
sequenceDiagram
participant Cliente
participant API
participant UseCase
participant Domain
participant TokenService
participant Database
Cliente->>API: POST /api/v1/auth/login
API->>UseCase: LoginCommand (email, password)
UseCase->>Database: Buscar usuário por email
Database-->>UseCase: User Entity
UseCase->>Domain: Validar senha (hash)
Domain-->>UseCase: Senha válida
UseCase->>TokenService: Gerar Access Token (60min)
TokenService-->>UseCase: JWT Access Token
UseCase->>TokenService: Gerar Refresh Token
TokenService-->>UseCase: Refresh Token
UseCase->>Database: Salvar Refresh Token
UseCase-->>API: Tokens + User Data
API-->>Cliente: 200 OK (tokens)
Regras aplicadas:
- ✅ Email deve existir
- ✅ Senha deve corresponder ao hash armazenado
- ✅ Access Token expira em 60 minutos
- ✅ Refresh Token permite renovação sem re-login
sequenceDiagram
participant Admin
participant API
participant AuthMiddleware
participant UseCase
participant Domain
participant Database
Admin->>API: POST /api/v1/games (Bearer Token)
API->>AuthMiddleware: Verificar token
AuthMiddleware->>AuthMiddleware: Validar role = Admin
AuthMiddleware-->>API: Autorizado
API->>UseCase: CreateGameCommand
UseCase->>Domain: Validar dados (Name, Price)
Domain-->>UseCase: Validação OK
UseCase->>Domain: Criar Game Entity
UseCase->>Database: Persistir Game
Database-->>UseCase: Sucesso
UseCase->>Domain: Disparar GameCreatedEvent
UseCase-->>API: Game DTO
API-->>Admin: 201 Created
Regras aplicadas:
- ✅ Apenas Admin pode cadastrar jogos
- ✅ Nome do jogo deve ter entre 3 e 200 caracteres
- ✅ Preço deve ser maior que zero
- ✅ Categoria é obrigatória
sequenceDiagram
participant Admin
participant API
participant UseCase
participant Domain
participant Database
Admin->>API: POST /api/v1/promotions (Bearer Token)
API->>UseCase: CreatePromotionCommand
UseCase->>Database: Verificar se jogo existe
Database-->>UseCase: Game encontrado
UseCase->>Domain: Validar período (StartDate < EndDate)
UseCase->>Domain: Validar desconto (0-100%)
Domain-->>UseCase: Validação OK
UseCase->>Domain: Criar Promotion Entity
UseCase->>Database: Persistir Promotion
Database-->>UseCase: Sucesso
UseCase->>Domain: Disparar PromotionCreatedEvent
UseCase-->>API: Promotion DTO
API-->>Admin: 201 Created
Regras aplicadas:
- ✅ Apenas Admin pode criar promoções
- ✅ Jogo deve existir
- ✅ Data de fim deve ser posterior à data de início
- ✅ Desconto entre 0% e 100%
sequenceDiagram
participant User
participant API
participant UseCase
participant Database
User->>API: GET /api/v1/games?PageNumber=1&PageSize=10&Category=Action
API->>UseCase: GetGamesQuery (filtros, paginação)
UseCase->>Database: Buscar jogos com filtros
Database-->>UseCase: Lista de Games
UseCase->>UseCase: Aplicar paginação
UseCase->>UseCase: Calcular preço com promoção ativa
UseCase-->>API: PaginatedResult<GameDTO>
API-->>User: 200 OK (jogos paginados)
Regras aplicadas:
- ✅ User autenticado pode listar jogos
- ✅ Suporte a filtro por categoria
- ✅ Paginação com PageNumber e PageSize
- ✅ Preço exibido considera promoção ativa (se houver)
sequenceDiagram
participant Admin
participant API
participant UseCase
participant Domain
participant Database
Admin->>API: PATCH /api/v1/users/admin/update-role
API->>UseCase: UpdateUserRoleCommand
UseCase->>Database: Buscar usuário por ID
Database-->>UseCase: User Entity
UseCase->>Domain: Atualizar Role (0=Admin, 1=User)
UseCase->>Database: Persistir alteração
Database-->>UseCase: Sucesso
UseCase->>Domain: Disparar UserRoleUpdatedEvent
UseCase-->>API: Success DTO
API-->>Admin: 200 OK
Regras aplicadas:
- ✅ Apenas Admin pode alterar roles
- ✅ Role deve ser 0 (Admin) ou 1 (User)
- ✅ Usuário deve existir
| Regra | Descrição |
|---|---|
| RN001 | Email deve ser único no sistema |
| RN002 | Senha deve ter no mínimo 8 caracteres, incluindo letras e números |
| RN003 | Access Token expira em 60 minutos |
| RN004 | Refresh Token permite renovação sem re-login |
| RN005 | Existem dois níveis de acesso: Admin (0) e User (1) |
| RN006 | Role padrão no cadastro: User (1) |
| Regra | Descrição |
|---|---|
| RN007 | Ao registrar, uma Library é criada automaticamente |
| RN008 | Ao registrar, uma Wallet é criada com saldo de R$ 10,00 |
| RN009 | Usuário pode atualizar apenas sua própria senha |
| RN010 | Apenas Admin pode alterar roles de outros usuários |
| RN011 | Apenas Admin pode listar todos os usuários |
| Regra | Descrição |
|---|---|
| RN012 | Apenas Admin pode cadastrar jogos |
| RN013 | Nome do jogo deve ter entre 3 e 200 caracteres |
| RN014 | Preço do jogo deve ser maior que zero |
| RN015 | Categoria é obrigatória |
| RN016 | Usuários autenticados podem listar jogos |
| Regra | Descrição |
|---|---|
| RN017 | Apenas Admin pode criar promoções |
| RN018 | Promoção deve estar vinculada a um jogo existente |
| RN019 | Data de fim deve ser posterior à data de início |
| RN020 | Desconto deve estar entre 0% e 100% |
| RN021 | Promoção é aplicada automaticamente se estiver no período válido |
| Regra | Descrição |
|---|---|
| RN022 | Todo usuário possui uma Library única |
| RN023 | Library armazena os jogos adquiridos (LibraryGame) |
| RN024 | Todo usuário possui uma Wallet única |
| RN025 | Saldo inicial da Wallet é R$ 10,00 |
- .NET 8 - Framework principal
- C# 12 - Linguagem de programação
- Entity Framework Core - ORM para acesso a dados
- MediatR - Implementação do padrão Mediator (CQRS)
- FluentValidation - Validação de modelos
- Serilog - Logging estruturado
- Seq - Agregação e visualização de logs
- JWT (JSON Web Tokens) - Autenticação stateless
- BCrypt.Net - Hashing de senhas
- ASP.NET Core Identity - Gestão de identidade
- SQL Server 2022 - Banco de dados relacional
- Entity Framework Core Migrations - Versionamento do schema
- Docker - Containerização da aplicação
- Docker Compose - Orquestração de containers
- xUnit - Framework de testes
- FluentAssertions - Assertions fluentes
- Moq - Mock de dependências
- Bogus - Geração de dados fake
- Reqnroll - BDD (Behavior-Driven Development)
- Microsoft.AspNetCore.Mvc.Testing - Testes de integração
- Swagger/OpenAPI - Documentação interativa da API
- Markdown - Documentação em texto
Antes de começar, certifique-se de ter instalado:
- .NET 8 SDK (versão 8.0 ou superior)
- Docker Desktop (para execução com containers)
- Git (para clonar o repositório)
- Visual Studio 2022 ou Visual Studio Code (opcional)
# Verificar .NET
dotnet --version
# Verificar Docker
docker --version
docker-compose --versiongit clone https://github.com/group10-tc-01/FCG-group10.git
cd FCG-group10# Build e iniciar todos os containers
docker-compose up --build
# Ou executar em background
docker-compose up -d --buildAguarde alguns segundos até que todos os serviços estejam prontos:
- ✅ SQL Server:
localhost:1433 - ✅ API:
http://localhost:8080 - ✅ Swagger:
http://localhost:8080/swagger - ✅ Seq (Logs):
http://localhost:5342
# Executar migrations no container
docker exec -it api-fcg dotnet ef database update- Swagger UI: http://localhost:8080/swagger
- Health Check: http://localhost:8080/health
- Seq Dashboard: http://localhost:5342 (user: admin, password: YourPassword123)
git clone https://github.com/group10-tc-01/FCG-group10.git
cd FCG-group10Certifique-se de ter um SQL Server local em execução ou atualize a connection string em:
src/FCG.WebApi/appsettings.Development.json
{
"ConnectionStrings": {
"DefaultConnection": "Server=localhost,1433;Database=fcg_database;User Id=sa;Password=YourPassword123;TrustServerCertificate=True;"
}
}dotnet restorecd src/FCG.WebApi
dotnet ef database update --project ../FCG.Infrastructuredotnet run --project src/FCG.WebApi/FCG.WebApi.csproj- Swagger UI: https://localhost:7071/swagger
- Health Check: https://localhost:7071/health
http://localhost:8080/api/v1
| Método | Endpoint | Autenticação | Descrição |
|---|---|---|---|
| Autenticação | |||
POST |
/auth/login |
❌ | Login de usuário |
POST |
/auth/refresh-token |
❌ | Renovar access token |
POST |
/auth/logout |
✅ User/Admin | Logout (invalida tokens) |
| Usuários | |||
POST |
/users/register |
❌ | Registrar novo usuário |
PUT |
/users/{id} |
✅ User/Admin | Atualizar senha |
PATCH |
/users/admin/update-role |
✅ Admin | Alterar role de usuário |
| Administração | |||
GET |
/admin/users |
✅ Admin | Listar todos os usuários (paginado) |
GET |
/admin/users/{id} |
✅ Admin | Buscar usuário por ID |
| Jogos | |||
POST |
/games |
✅ Admin | Cadastrar novo jogo |
GET |
/games |
✅ User/Admin | Listar jogos (paginado, com filtros) |
| Promoções | |||
POST |
/promotions |
✅ Admin | Criar promoção |
| Health | |||
GET |
/health |
❌ | Verificar saúde da API |
Para endpoints protegidos, inclua o token JWT no header:
Authorization: Bearer {accessToken}O projeto possui cobertura completa de testes em três níveis:
Testam componentes isolados (entidades, value objects, handlers).
# Executar testes unitários
dotnet test tests/FCG.UnitTests/FCG.UnitTests.csproj
# Com cobertura de código
dotnet test tests/FCG.UnitTests/FCG.UnitTests.csproj --collect:"XPlat Code Coverage"Exemplos de testes:
- Validação de Value Objects (Email, Name, Price)
- Lógica de entidades (User, Game, Promotion)
- Handlers de casos de uso
Testam a integração entre camadas (API → Application → Infrastructure).
# Executar testes de integração
dotnet test tests/FCG.IntegratedTests/FCG.IntegratedTests.csprojExemplos de testes:
- Controllers com banco de dados in-memory
- Fluxos completos de autenticação
- Persistência de dados
Testes BDD (Behavior-Driven Development) com Reqnroll.
# Executar testes funcionais
dotnet test tests/FCG.FunctionalTests/FCG.FunctionalTests.csprojExemplos de testes:
- Cenários de negócio em Gherkin
- Fluxos end-to-end
- Validação de regras de negócio
# Executar toda a suite de testes
dotnet test
# Com relatório detalhado
dotnet test --logger "console;verbosity=detailed"
# Com cobertura de código
dotnet test --collect:"XPlat Code Coverage"tests/
├── FCG.UnitTests/ # Testes unitários
│ ├── Domain/ # Testes de entidades e VOs
│ ├── Application/ # Testes de handlers
│ └── Services/ # Testes de serviços
├── FCG.IntegratedTests/ # Testes de integração
│ ├── Controllers/ # Testes de API
│ └── Configurations/ # Configurações de teste
├── FCG.FunctionalTests/ # Testes funcionais (BDD)
│ ├── Features/ # Arquivos .feature (Gherkin)
│ └── Steps/ # Step definitions
└── FCG.CommomTestsUtilities/ # Utilitários compartilhados
└── Builders/ # Builders para testes
FCG-group10/
├── src/
│ ├── FCG.Domain/ # Camada de Domínio
│ │ ├── Entities/ # Entidades de domínio
│ │ ├── ValueObjects/ # Value Objects
│ │ ├── Events/ # Eventos de domínio
│ │ ├── Repositories/ # Interfaces de repositórios
│ │ ├── Exceptions/ # Exceções customizadas
│ │ └── Enum/ # Enumeradores
│ │
│ ├── FCG.Application/ # Camada de Aplicação
│ │ ├── UseCases/ # Casos de uso (CQRS)
│ │ │ ├── Authentication/ # Login, RefreshToken, Logout
│ │ │ ├── Users/ # Registro, Atualização
│ │ │ ├── Games/ # CRUD de jogos
│ │ │ ├── Promotions/ # Gestão de promoções
│ │ │ ├── Admin/ # Operações administrativas
│ │ │ └── Library/ # Gestão de biblioteca
│ │ ├── EventsHandlers/ # Handlers de eventos
│ │ └── DependencyInjection/ # Configuração de DI
│ │
│ ├── FCG.Infrastructure/ # Camada de Infraestrutura
│ │ ├── Persistence/ # Contexto EF Core
│ │ │ ├── Context/ # DbContext
│ │ │ ├── Configurations/ # Fluent API
│ │ │ └── Repositories/ # Implementações
│ │ ├── Services/ # Serviços externos
│ │ ├── Migrations/ # Migrations do EF
│ │ └── DependencyInjection/ # Configuração de DI
│ │
│ ├── FCG.WebApi/ # Camada de Apresentação
│ │ ├── Controllers/ # Controllers REST
│ │ │ └── v1/ # Versionamento da API
│ │ ├── Middlewares/ # Middlewares customizados
│ │ ├── Filter/ # Filtros de ação
│ │ ├── Attributes/ # Atributos customizados
│ │ ├── Models/ # DTOs de request/response
│ │ └── DependencyInjection/ # Configuração de DI
│ │
│ └── FCG.Messages/ # Recursos de mensagens (i18n)
│ └── ResourceMessages.resx # Mensagens em português
│
├── tests/
│ ├── FCG.UnitTests/ # Testes unitários
│ ├── FCG.IntegratedTests/ # Testes de integração
│ ├── FCG.FunctionalTests/ # Testes funcionais (BDD)
│ └── FCG.CommomTestsUtilities/ # Utilitários de teste
│
├── docker-compose.yml # Orquestração Docker
├── FCG.sln # Solution .NET
├── FCG-API-Documentation.md # Documentação completa da API
└── README.md # Este arquivo
- Documentação Completa da API - Especificação detalhada de todos os endpoints
- Swagger UI - Documentação interativa (quando a API estiver em execução)
| Nome | Discord Username | GitHub | Role |
|---|---|---|---|
| Flávio José da Costa Filho | @flaviojcf | @flaviojcf | Developer |
| Rhuan Marques De Araújo | @rhuanmarques | @Rhuaannn | Developer |
| Lohhan Guilherme Bibiano da Silva | @_bibiano | @lohhan | Developer |
- 🔗 Repositório: https://github.com/group10-tc-01/FCG-group10
- 📄 Documentação: FCG-API-Documentation.md
- 🎥 Vídeo Demonstração: Link do YouTube (a ser adicionado)
Este projeto foi desenvolvido para fins educacionais como parte do Tech Challenge da FIAP.
Para dúvidas ou sugestões, entre em contato através do Discord ou abra uma issue no GitHub.