|
1 | | -# EventFlow API |
| 1 | +# EventFlow API — Enterprise Event Management |
2 | 2 |
|
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**. |
4 | 4 |
|
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**. |
6 | 6 |
|
7 | | -OBS: Esse projeto foi pensado para implementação no Google Developers Group (GDG) Aracaju. |
| 7 | +--- |
8 | 8 |
|
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 | +``` |
10 | 27 |
|
11 | 28 | --- |
12 | 29 |
|
13 | | -### 🚀 Objetivos do Projeto |
| 30 | +## 🌟 Diferenciais Técnicos |
14 | 31 |
|
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 |
21 | 36 |
|
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**. |
23 | 41 |
|
24 | | -### 🛠️ Tecnologias Utilizadas |
| 42 | +- **Logs Estruturados** *(Serilog + Seq)* |
| 43 | + Centralização de logs para diagnóstico rápido em ambientes containerizados. |
25 | 44 |
|
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 |
31 | 48 |
|
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 |
39 | 56 |
|
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 |
41 | 61 |
|
42 | | -- **xUnit** (Framework de Teste) |
43 | | -- **Moq** (Biblioteca para Mocking de dependências) |
44 | | -- **FluentAssertions** (Para asserções mais legíveis) |
| 62 | +--- |
45 | 63 |
|
46 | | -**CI/CD:** |
| 64 | +## Tech Stack |
47 | 65 |
|
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 | |
49 | 76 |
|
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 | +--- |
51 | 78 |
|
52 | | -### 🏛️ Arquitetura do Projeto |
| 79 | +## Como Rodar o Projeto |
53 | 80 |
|
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. |
55 | 82 |
|
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 |
61 | 84 |
|
62 | | -### 🚧 Próximos Passos |
| 85 | +- [Docker Desktop](https://www.docker.com/products/docker-desktop/) instalado. |
63 | 86 |
|
64 | | -Agora que a base arquitetural está sólida, os próximos passos para evoluir o projeto incluem: |
| 87 | +### Passo a Passo |
65 | 88 |
|
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 | +``` |
72 | 93 |
|
73 | | ---- |
| 94 | +```bash |
| 95 | +docker-compose up -d --build |
| 96 | +``` |
| 97 | + |
| 98 | +Aguarde alguns segundos até que todos os containers estejam prontos. |
74 | 99 |
|
75 | | -### 🔗 Estrutura das Entidades |
| 100 | +--- |
76 | 101 |
|
77 | | -O projeto atualmente é composto pelas seguintes entidades principais: |
| 102 | +## Acesso aos Serviços |
78 | 103 |
|
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 | |
83 | 109 |
|
84 | 110 | --- |
85 | 111 |
|
86 | | -### 📚 Detalhes dos Relacionamentos |
| 112 | +## 🧪 Testando a Performance (Cache) |
87 | 113 |
|
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 |
90 | 117 |
|
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** |
95 | 120 |
|
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. |
99 | 122 |
|
100 | 123 | --- |
101 | 124 |
|
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 |
104 | 126 |
|
105 | 127 | ``` |
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) |
222 | 134 | ``` |
223 | 135 |
|
224 | 136 | --- |
225 | 137 |
|
226 | | -### 📌 Como Rodar o Projeto |
| 138 | +## 🔐 Autenticação |
| 139 | + |
| 140 | +A API utiliza **JWT (JSON Web Token)**. |
227 | 141 |
|
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 | +``` |
236 | 150 |
|
237 | 151 | --- |
238 | 152 |
|
239 | 153 | ### 👨💻 Autor |
240 | 154 |
|
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. |
242 | 157 |
|
243 | 158 | --- |
244 | 159 |
|
245 | | -### 📝 Licença |
| 160 | +## 📄 Licença |
| 161 | + |
| 162 | +Este projeto está licenciado sob a **MIT License**. |
246 | 163 |
|
247 | | -Este projeto está disponível sob a licença MIT. |
0 commit comments