Skip to content

Commit 3c4a4db

Browse files
committed
📝docs: upgrade documentation to enterprise-grade standard
Refactor README to highlight: - Clean Architecture and clear layer separation - Observability with OpenTelemetry, Jaeger and structured logging - Distributed cache strategies using Redis (cache-aside) - Full containerized environment via Docker Compose - Authentication flow and project structure
1 parent bdde7e3 commit 3c4a4db

1 file changed

Lines changed: 111 additions & 195 deletions

File tree

README.md

Lines changed: 111 additions & 195 deletions
Original file line numberDiff line numberDiff line change
@@ -1,247 +1,163 @@
1-
# EventFlow API
1+
# EventFlow API — Enterprise Event Management
22

3-
### 📌 Descrição do Projeto
3+
O **EventFlow API** é uma solução de back-end **robusta, escalável e orientada a produção** para gestão de eventos, desenvolvida em **.NET 8** e estruturada segundo os princípios da **Clean Architecture**.
44

5-
O ***EventFlow API*** é um projeto de API RESTful desenvolvido em .NET 8, projetado para ser uma solução robusta e escalável para a gestão e organização de eventos. O projeto demonstra as melhores práticas de desenvolvimento de software, incluindo a implementação de uma Arquitetura Limpa (Clean Architecture) em camadas, um sistema de autenticação e autorização via JWT, validação de dados com FluentValidation e uma suíte de testes unitários.
5+
Diferente de APIs tradicionais voltadas apenas a CRUD, este projeto foca fortemente em **Observabilidade, Performance e Resiliência**, simulando um ambiente real de produção com **tracing distribuído**, **logs estruturados** e **estratégias de cache**.
66

7-
OBS: Esse projeto foi pensado para implementação no Google Developers Group (GDG) Aracaju.
7+
---
88

9-
A API proporciona funcionalidades completas para o ciclo de vida de eventos, abrangendo o gerenciamento de organizadores, palestrantes e participantes, e o tratamento de relacionamentos complexos (one-to-many e many-to-many).
9+
## Arquitetura & Design
10+
11+
O projeto foi refatorado para suportar **alta carga**, **baixo acoplamento** e **manutenibilidade a longo prazo**.
12+
13+
```mermaid
14+
graph TD
15+
Client[Cliente / Swagger] -->|HTTP Request| API[EventFlow API]
16+
17+
subgraph "Observability Layer"
18+
API -.->|Logs| Seq[Seq Dashboard]
19+
API -.->|Traces| Jaeger[Jaeger UI]
20+
end
21+
22+
subgraph "Data & Performance"
23+
API <-->|Cache-Aside| Redis[Redis Cache]
24+
API <-->|EF Core| SQL[SQL Server]
25+
end
26+
```
1027

1128
---
1229

13-
### 🚀 Objetivos do Projeto
30+
## 🌟 Diferenciais Técnicos
1431

15-
- Implementar uma **Arquitetura Limpa** desacoplada, com clara separação entre as camadas de Domínio, Aplicação, Infraestrutura e Apresentação.
16-
- Aplicar práticas recomendadas para uso de **Entity Framework Core**, incluindo mapeamento com Fluent API.
17-
- Garantir a qualidade e a confiabilidade do código através de **testes unitários** (xUnit, Moq, FluentAssertions).
18-
- Oferecer uma solução de **autenticação e autorização** segura utilizando JWT.
19-
- Fornecer uma documentação de API clara e interativa com **Swagger/OpenAPI**.
20-
- Apresentar um código limpo, organizado e facilmente extensível.
32+
### ⚡ Cache Distribuído (Redis)
33+
- Implementação do padrão **Cache-Aside**
34+
- Redução significativa de latência em operações de leitura (ex: `GetById`)
35+
- Estratégias de **invalidação de cache** para garantir consistência dos dados
2136

22-
---
37+
### 🔍 Observabilidade Completa
38+
39+
- **Tracing Distribuído** *(OpenTelemetry + Jaeger)*
40+
Rastreamento ponta-a-ponta das requisições para identificar gargalos entre **API, Cache e Banco de Dados**.
2341

24-
### 🛠️ Tecnologias Utilizadas
42+
- **Logs Estruturados** *(Serilog + Seq)*
43+
Centralização de logs para diagnóstico rápido em ambientes containerizados.
2544

26-
**Backend:**
27-
- .NET 8
28-
- ASP.NET Core Web API
29-
- Entity Framework Core (com migrations)
30-
- SQL Server
45+
### 🛡️ Resiliência
46+
- Políticas de **Retry** na conexão com o banco de dados
47+
- Tolerância a falhas transientes
3148

32-
**Padrões e Conceitos:**
33-
- Arquitetura Limpa (Clean Architecture)
34-
- Injeção de Dependência (DI)
35-
- Mapeamento de objetos com **AutoMapper**
36-
- Validação de dados com **FluentValidation**
37-
- Documentação de API com **Swagger/OpenAPI**
38-
- Autenticação e Autorização com **JWT (JSON Web Tokens)**
49+
### 🐳 Containerização
50+
- Ambiente totalmente orquestrado via **Docker Compose**:
51+
- API
52+
- SQL Server
53+
- Redis
54+
- Jaeger
55+
- Seq
3956

40-
**Testes:**
57+
### 🧼 Clean Code
58+
- Uso de **Primary Constructors**
59+
- **Extension Methods** para configuração de DI (`AppConfiguration`)
60+
- Separação estrita de responsabilidades entre camadas
4161

42-
- **xUnit** (Framework de Teste)
43-
- **Moq** (Biblioteca para Mocking de dependências)
44-
- **FluentAssertions** (Para asserções mais legíveis)
62+
---
4563

46-
**CI/CD:**
64+
## Tech Stack
4765

48-
- **GitHub Actions** (dotnet.yml) para automação de build e execução dos testes
66+
| Categoria | Tecnologias |
67+
|---------|------------|
68+
| **Core** | .NET 8, C# 12 |
69+
| **Arquitetura** | Clean Architecture, RESTful, Dependency Injection |
70+
| **Banco de Dados** | SQL Server 2022, Entity Framework Core 8 |
71+
| **Performance** | Redis (StackExchange.Redis), Microsoft.Extensions.Caching |
72+
| **Observabilidade** | OpenTelemetry, Jaeger, Serilog, Seq |
73+
| **Documentação** | Swagger / OpenAPI (com suporte a Auth) |
74+
| **Qualidade** | xUnit, Moq, FluentAssertions, FluentValidation |
75+
| **DevOps** | Docker, Docker Compose |
4976

50-
- **Validação automática de commits** — apenas mudanças que passam em todos os testes do EventFlow são aceitas antes do merge
77+
---
5178

52-
### 🏛️ Arquitetura do Projeto
79+
## Como Rodar o Projeto
5380

54-
A solução é organizada em projetos distintos que representam as camadas da Arquitetura Limpa, garantindo a separação de responsabilidades:
81+
A forma **mais simples e profissional** de executar o EventFlow API é utilizando **Docker**, que sobe toda a infraestrutura necessária automaticamente.
5582

56-
- **EventFlow.Core (Domínio):** O coração da aplicação. Contém as entidades de negócio, DTOs, comandos e as interfaces dos repositórios e serviços. Não depende de nenhuma outra camada.
57-
- **EventFlow.Application (Aplicação):** Contém a lógica de negócio e os casos de uso. Implementa as interfaces de serviço definidas no Core e orquestra as ações, mas não sabe como os dados são persistidos.
58-
- **EventFlow.Infrastructure (Infraestrutura):** Contém os detalhes técnicos e as implementações das interfaces do Core. É aqui que reside o acesso ao banco de dados com Entity Framework, implementações de repositórios, helpers, etc.
59-
- **EventFlow.Presentation (Apresentação):** A camada de entrada da aplicação. Neste caso, é a Web API com seus Controllers, configuração de inicialização (Program.cs), e tudo relacionado ao protocolo HTTP.
60-
- **EventFlow.Tests (Testes):** Projeto dedicado aos testes unitários das outras camadas.
83+
### Pré-requisitos
6184

62-
### 🚧 Próximos Passos
85+
- [Docker Desktop](https://www.docker.com/products/docker-desktop/) instalado.
6386

64-
Agora que a base arquitetural está sólida, os próximos passos para evoluir o projeto incluem:
87+
### Passo a Passo
6588

66-
- **Paginação, Ordenação e Filtragem:** Implementar nos endpoints GET All para torná-los escaláveis.
67-
- **Middleware de Exceções:** Criar um middleware global para tratamento de erros, limpando os controllers.
68-
- **Autorização por Papéis (Roles):** Adicionar papéis de "Admin" e "Organizer" para proteger endpoints críticos.
69-
- **Logging Estruturado:** Integrar o Serilog para um logging mais robusto e preparado para produção.
70-
- **Gerenciamento de Segredos:** Mover segredos (ConnectionString, Jwt:Key) do appsettings.json para User Secrets (desenvolvimento) e Environment Variables (produção).
71-
- **CI/CD:** Configurar um pipeline de Integração e Entrega Contínua (ex: GitHub Actions).
89+
```bash
90+
git clone https://github.com/alysonsz/eventflow-api.git
91+
cd eventflow-api
92+
```
7293

73-
---
94+
```bash
95+
docker-compose up -d --build
96+
```
97+
98+
Aguarde alguns segundos até que todos os containers estejam prontos.
7499

75-
### 🔗 Estrutura das Entidades
100+
---
76101

77-
O projeto atualmente é composto pelas seguintes entidades principais:
102+
## Acesso aos Serviços
78103

79-
- **Event**: Representa o evento em si, com dados como título, descrição, data e local.
80-
- **Organizer**: Responsável pela organização do evento.
81-
- **Speaker**: Palestrantes convidados para o evento.
82-
- **Participant**: Pessoas que participam dos eventos.
104+
| Serviço | URL | Descrição |
105+
|-------|-----|-----------|
106+
| **Swagger** | http://localhost:8079/swagger | Documentação e testes da API |
107+
| **Jaeger UI** | http://localhost:16686 | Tracing e análise de performance |
108+
| **Seq Logs** | http://localhost:5341 | Logs estruturados em tempo real |
83109

84110
---
85111

86-
### 📚 Detalhes dos Relacionamentos
112+
## 🧪 Testando a Performance (Cache)
87113

88-
- **Organizer → Event** *(One-to-Many)*
89-
- Um organizador pode gerenciar múltiplos eventos. Cada evento tem apenas um organizador.
114+
1. Acesse o **Swagger**
115+
2. Execute `GET /event/{id}` (primeira chamada → SQL Server)
116+
3. Execute a mesma requisição novamente
90117

91-
- **Event ↔ Speaker** *(Many-to-Many)*
92-
- Um evento pode ter múltiplos palestrantes.
93-
- Um palestrante pode participar de múltiplos eventos.
94-
- A relação é feita através da entidade SpeakerEvent.
118+
**Resultado:**
119+
- A segunda resposta ocorre em **milissegundos**, pois vem do **Redis**
95120

96-
- **Event ↔ Participant** *(Many-to-Many)*
97-
- Um evento pode ter vários participantes.
98-
- Um participante pode se inscrever em diversos eventos.
121+
Vá até o **Jaeger UI** e compare os *spans* das duas requisições.
99122

100123
---
101124

102-
### 📁 Estrutura de Diretórios e Arquivos
103-
A estrutura de diretórios foi organizada para promover a separação de responsabilidades e facilitar a manutenção.
125+
## 📂 Estrutura do Projeto
104126

105127
```
106-
EventFlow/
107-
├── EventFlow.sln
108-
109-
├── 📁 EventFlow.Core
110-
│ ├── 📁 Commands
111-
│ │ ├── EventCommand.cs
112-
│ │ ├── LoginUserCommand.cs
113-
│ │ ├── OrganizerCommand.cs
114-
│ │ ├── ParticipantCommand.cs
115-
│ │ ├── RegisterUserCommand.cs
116-
│ │ └── SpeakerCommand.cs
117-
│ ├── 📁 Models
118-
│ │ ├── 📁 DTOs
119-
│ │ │ ├── EventDTO.cs
120-
│ │ │ ├── EventSummaryDTO.cs
121-
│ │ │ ├── OrganizerDTO.cs
122-
│ │ │ ├── ParticipantDTO.cs
123-
│ │ │ ├── SpeakerDTO.cs
124-
│ │ │ ├── UserDTO.cs
125-
│ │ │ └── UserPasswordDTO.cs
126-
│ │ ├── Event.cs
127-
│ │ ├── Organizer.cs
128-
│ │ ├── Participant.cs
129-
│ │ ├── Speaker.cs
130-
│ │ ├── SpeakerEvent.cs
131-
│ │ └── User.cs
132-
│ ├── 📁 Repository
133-
│ │ └── 📁 Interfaces
134-
│ │ ├── IEventRepository.cs
135-
│ │ ├── IOrganizerRepository.cs
136-
│ │ ├── IParticipantRepository.cs
137-
│ │ ├── ISpeakerRepository.cs
138-
│ │ └── IUserRepository.cs
139-
│ ├── 📁 Services
140-
│ │ └── 📁 Interfaces
141-
│ │ ├── IAuthService.cs
142-
│ │ ├── IEventService.cs
143-
│ │ ├── IOrganizerService.cs
144-
│ │ ├── IParticipantService.cs
145-
│ │ └── ISpeakerService.cs
146-
│ └── GlobalUsing.cs
147-
148-
├── 📁 EventFlow.Application
149-
│ ├── 📁 Services
150-
│ │ ├── AuthService.cs
151-
│ │ ├── EventService.cs
152-
│ │ ├── OrganizerService.cs
153-
│ │ ├── ParticipantService.cs
154-
│ │ └── SpeakerService.cs
155-
│ ├── 📁 Validators
156-
│ │ ├── EventCommandValidator.cs
157-
│ │ ├── OrganizerCommandValidator.cs
158-
│ │ ├── ParticipantCommandValidator.cs
159-
│ │ └── SpeakerCommandValidator.cs
160-
│ └── GlobalUsing.cs
161-
162-
├── 📁 EventFlow.Infrastructure
163-
│ ├── 📁 Data
164-
│ │ ├── 📁 Mapping
165-
│ │ │ ├── EventMap.cs
166-
│ │ │ ├── OrganizerMap.cs
167-
│ │ │ ├── ParticipantMap.cs
168-
│ │ │ ├── SpeakerEventMap.cs
169-
│ │ │ └── SpeakerMap.cs
170-
│ │ └── EventFlowContext.cs
171-
│ ├── 📁 Helpers
172-
│ │ └── DateTimeConverterHelper.cs
173-
│ ├── 📁 Profiles
174-
│ │ └── MappingProfile.cs
175-
│ ├── 📁 Repository
176-
│ │ ├── EventRepository.cs
177-
│ │ ├── OrganizerRepository.cs
178-
│ │ ├── ParticipantRepository.cs
179-
│ │ ├── SpeakerRepository.cs
180-
│ │ └── UserRepository.cs
181-
│ └── GlobalUsing.cs
182-
183-
├── 📁 EventFlow.Presentation
184-
│ ├── 📁 Config
185-
│ │ └── AppConfiguration.cs
186-
│ ├── 📁 Controllers
187-
│ │ ├── AuthController.cs
188-
│ │ ├── EventController.cs
189-
│ │ ├── OrganizerController.cs
190-
│ │ ├── ParticipantController.cs
191-
│ │ └── SpeakerController.cs
192-
│ ├── 📁 Properties
193-
│ │ ├── launchSettings.json
194-
│ │ └── serviceDependencies.json
195-
│ ├── appsettings.json
196-
│ ├── GlobalUsing.cs
197-
│ └── Program.cs
198-
199-
├── 📁 EventFlow.Tests
200-
│ ├── 📁 Data
201-
│ │ └── IntegrationTestBase.cs
202-
│ ├── 📁 Controllers
203-
│ │ ├── EventControllerTests.cs
204-
│ │ ├── OrganizerControllerTests.cs
205-
│ │ ├── ParticipantControllerTests.cs
206-
│ │ └── SpeakerControllerTests.cs
207-
│ ├── 📁 Services
208-
│ │ ├── EventServiceTests.cs
209-
│ │ ├── OrganizerServiceTests.cs
210-
│ │ ├── ParticipantServiceTests.cs
211-
│ │ └── SpeakerServiceTests.cs
212-
│ └── 📁 Validators
213-
│ ├── EventCommandValidatorTests.cs
214-
│ ├── OrganizerCommandValidatorTests.cs
215-
│ ├── ParticipantCommandValidatorTests.cs
216-
│ └── SpeakerCommandValidatorTests.cs
217-
218-
├── .dockerignore
219-
├── .gitignore
220-
├── Dockerfile
221-
└── README.md
128+
EventFlow API
129+
├── 📁 EventFlow.Core # Domínio (Entidades, Interfaces, DTOs)
130+
├── 📁 EventFlow.Application # Regras de Negócio (Services, Validations, Cache Logic)
131+
├── 📁 EventFlow.Infrastructure # Acesso a Dados (EF Core, Repositories, Migrations)
132+
├── 📁 EventFlow.Presentation # API (Controllers, Docker, DI Setup)
133+
└── 📁 EventFlow.Tests # Testes Unitários (xUnit)
222134
```
223135

224136
---
225137

226-
### 📌 Como Rodar o Projeto
138+
## 🔐 Autenticação
139+
140+
A API utiliza **JWT (JSON Web Token)**.
227141

228-
- Clone o repositório
229-
- No arquivo `appsettings.json` do projeto EventFlow.Presentation, configure sua `ConnectionString` para o banco de dados.
230-
- No mesmo arquivo, certifique-se de que a `Jwt:Key` está definida.
231-
- Abra um terminal na pasta raiz da solução (`EventFlow/`).
232-
- Execute o comando para aplicar as migrations do Entity Framework: `dotnet ef database update --project EventFlow.Infrastructure --startup-project EventFlow.Presentation`
233-
- Rode o projeto com `dotnet run --project EventFlow.Presentation`
234-
- Acesse o Swagger em: `https://localhost:7221/swagger` (ou a porta configurada).
235-
- Para HTTPS utilize a porta 7221 e para HTTP a porta 5041.
142+
1. Crie uma conta em: `POST /authentication/register`
143+
2. Faça login em: `POST /authentication/login`
144+
3. Copie o token retornado
145+
4. No Swagger, clique em **Authorize** e informe:
146+
147+
```
148+
SEU_TOKEN
149+
```
236150

237151
---
238152

239153
### 👨‍💻 Autor
240154

241-
- Alyson Souza Carregosa 👨‍💻 Back-end Developer
155+
Desenvolvido por **Alyson Souza Carregosa**
156+
Focado em **Engenharia de Software de Alta Performance**, Arquitetura e Sistemas Observáveis.
242157

243158
---
244159

245-
### 📝 Licença
160+
## 📄 Licença
161+
162+
Este projeto está licenciado sob a **MIT License**.
246163

247-
Este projeto está disponível sob a licença MIT.

0 commit comments

Comments
 (0)