|
1 | | -# 🚀 DotCruz Notifications |
| 1 | +# 🚀 DotCruz Notifications (API) |
2 | 2 |
|
3 | | - |
4 | | - |
5 | | - |
6 | | - |
| 3 | +DotCruz Notifications é o serviço central de mensageria e gestão de notificações do ecossistema **DotCruz**. Construído em **.NET 10** utilizando **Clean Architecture** e princípios de **Domain-Driven Design (DDD)**, ele atua como a interface administrativa e API de entrada para criação de templates de notificação e agendamentos de disparos. |
7 | 4 |
|
8 | | - DotCruz Notifications é um microserviço robusto de alta performance projetado para centralizar a gestão e o disparo de notificações |
9 | | - multiplataforma. Construído com as tecnologias mais recentes do ecossistema .NET, o sistema resolve o desafio de desacoplar o envio de |
10 | | - mensagens (E-mail, SMS, Push) da lógica de negócio principal dos demais serviços da organização. |
| 5 | +--- |
11 | 6 |
|
12 | | -## 💡 Por que este projeto? |
| 7 | +## ☁️ Arquitetura em Nuvem & Processamento |
13 | 8 |
|
14 | | - Em arquiteturas distribuídas, delegar o envio de notificações para um serviço especializado garante: |
| 9 | +O sistema adota uma arquitetura distribuída e assíncrona baseada em serviços nativos de nuvem (AWS), desacoplando a recepção das requisições na API principal do envio físico das mensagens: |
15 | 10 |
|
16 | | -- **Resiliência:** Se um provedor de e-mail falhar, o sistema utiliza políticas de re-tentativa (Retry) e filas para garantir a entrega. |
17 | | -- **Escalabilidade:** O processamento é feito em segundo plano (background), liberando a API para responder instantaneamente. |
18 | | -- **Padronização:** Gerenciamento centralizado de templates com suporte a variáveis dinâmicas e internacionalização (i18n). |
| 11 | +### 1. Fila de Processamento (Amazon SQS) |
| 12 | +Todas as notificações enviadas imediatamente são publicadas como mensagens na fila **Amazon SQS**. Isso garante que o envio de mensagens seja assíncrono e resiliente, amortecendo picos de carga e permitindo retentativas em caso de falha. |
19 | 13 |
|
20 | | -## 🛠️ Stack Tecnológica & Padrões |
21 | | - |
22 | | -- **Framework:** .NET 10 (C#) |
23 | | -- **Mensageria:** RabbitMQ + MassTransit |
24 | | -- **Persistência:** MongoDB (Driver 3.8.0) |
25 | | -- **Arquitetura:** Clean Architecture + DDD (Domain Driven Design) |
26 | | -- **Padrões de Projeto:** |
27 | | - - Strategy Pattern: Para seleção dinâmica de provedores de envio (Email, SMS, Push). |
28 | | - - Factory Strategy: Para criação de notificações baseada no tipo solicitado. |
29 | | - - MediatR: Para implementação de CQRS e desacoplamento de eventos. |
30 | | - - Polly: Políticas de retry incremental integradas ao MassTransit. |
31 | | - |
32 | | -## 🏗️ Estrutura do Ecossistema |
33 | | - |
34 | | - O projeto é dividido em dois motores principais: |
| 14 | +### 2. Agendamento Efêmero (AWS EventBridge Scheduler) |
| 15 | +Quando uma notificação é agendada para uma data futura, a API cria dinamicamente um agendamento de execução única no **AWS EventBridge Scheduler**. No instante configurado, o EventBridge encaminha a mensagem à fila SQS e se auto-destrói automaticamente (`ActionAfterCompletion.DELETE`), eliminando a necessidade de polling periódico em bancos de dados. |
35 | 16 |
|
36 | | - 1. **API (DotCruz.Notifications.Api):** Porta de entrada para cadastro de templates e comando inicial de disparo. |
37 | | - 2. **Worker (DotCruz.Notifications.Worker):** O cérebro do sistema. Contém: |
38 | | - - Consumers: Processam as filas do RabbitMQ de forma assíncrona. |
39 | | - - ScheduledNotificationPoller: Um serviço de background que monitora e dispara notificações agendadas para o futuro. |
| 17 | +### 3. Armazenamento Seguro de Credenciais (AWS SSM Parameter Store) |
| 18 | +As configurações de SMTP específicas de cada inquilino (*tenant*) são armazenadas com segurança no **SSM Parameter Store** como `SecureString`. Isso separa os segredos de conexão do banco de dados relacional principal e simplifica o gerenciamento multi-tenant. |
40 | 19 |
|
41 | | -## 🚀 Como Executar (Zero Setup) |
| 20 | +### 4. Worker Desacoplado (AWS Lambda) |
| 21 | +A leitura da fila SQS e a entrega real das notificações (E-mail, SMS, Push) não acontecem nesta API. Elas são de responsabilidade de um worker serverless otimizado compilado com Native AOT (consulte o repositório [DotCruz.Notifications.Delivery.Lambda](https://github.com/dotcruz-ecosystem/DotCruz.Notifications.Delivery.Lambda)). |
42 | 22 |
|
43 | | - A única dependência para rodar o projeto completo é o Docker. |
| 23 | +--- |
44 | 24 |
|
45 | | - 1. Iniciar o ecossistema |
46 | | - Na raiz do projeto, execute: |
| 25 | +## 🛠️ Stack Tecnológica & Padrões |
47 | 26 |
|
48 | | -```json |
49 | | - docker-compose up -d --build |
50 | | -``` |
| 27 | +* **Framework**: .NET 10 (C#) |
| 28 | +* **Persistência**: MongoDB (Driver 3.x) |
| 29 | +* **Infraestrutura de Mensageria**: AWS SQS (Simple Queue Service) |
| 30 | +* **Agendamento de Eventos**: AWS EventBridge Scheduler |
| 31 | +* **Armazenamento de Segredos**: AWS Systems Manager (SSM) Parameter Store |
| 32 | +* **Padrões de Projeto**: |
| 33 | + * **CQRS (MediatR)**: Separação clara de comandos e consultas. |
| 34 | + * **Clean Architecture**: Desacoplamento rígido de dependências de infraestrutura por meio de interfaces. |
| 35 | + * **Domain-Driven Design (DDD)**: Domínio rico com entidades, objetos de valor e conceitos de agregados. |
51 | 36 |
|
52 | | - 1. Acessar as Interfaces |
53 | | - Com o container rodando, você tem acesso imediato a: |
| 37 | +--- |
54 | 38 |
|
55 | | -- **📄 Documentação da API (Scalar):** |
56 | | - <http://localhost:5050/scalar> |
57 | | - Explore e teste os endpoints de criação de notificações e templates de forma interativa. |
| 39 | +## 🏗️ Estrutura do Projeto |
58 | 40 |
|
59 | | -- **📧 Simulador de E-mail (Mailpit):** |
60 | | - <http://localhost:8030/> |
61 | | - Visualize em tempo real todos os e-mails disparados pelo sistema sem precisar de um servidor SMTP real. |
| 41 | +O código do projeto está dividido nos seguintes subprojetos dentro da pasta `src`: |
62 | 42 |
|
63 | | -- **🐰 RabbitMQ Dashboard:** |
64 | | - <http://localhost:15675/> (User/Pass: guest) |
65 | | - Acompanhe as filas e o fluxo de mensagens entre a API e o Worker. |
| 43 | +* **[DotCruz.Notifications.Api](./src/DotCruz.Notifications.Api)**: Camada de apresentação que contém os endpoints Scalar, controllers e configuração inicial do ASP.NET. |
| 44 | +* **[DotCruz.Notifications.Application](./src/DotCruz.Notifications.Application)**: Regras de aplicação, Use Cases (envio, criação de templates, etc.) e interfaces de infraestrutura. |
| 45 | +* **[DotCruz.Notifications.Domain](./src/DotCruz.Notifications.Domain)**: Entidades de domínio (Templates, Notifications, Tenants), enums e exceções. |
| 46 | +* **[DotCruz.Notifications.Infrastructure](./src/DotCruz.Notifications.Infrastructure)**: Implementação de acesso a dados (MongoDB) e integrações de nuvem AWS (SQS, EventBridge Scheduler, SSM). |
| 47 | +* **[DotCruz.Notifications.CrossCutting](./src/DotCruz.Notifications.CrossCutting)**: Recursos de injeção de dependência globais e mapeamento de configurações. |
| 48 | +* **[DotCruz.Notifications.Contracts](./src/DotCruz.Notifications.Contracts)**: Modelos de mensagens e contratos compartilhados com outros microsserviços do ecossistema. |
66 | 49 |
|
67 | | -## 🛠️ Variáveis de Ambiente |
| 50 | +--- |
68 | 51 |
|
69 | | - O projeto já vem pré-configurado no docker-compose.yml, mas você pode customizar: |
| 52 | +## 🚀 Como Executar em Desenvolvimento (Local Setup) |
70 | 53 |
|
71 | | -- **ConnectionStrings__MongoDb:** Conexão com o banco de dados. |
72 | | -- **Settings__RabbitMqSettings:** Configurações do broker. |
73 | | -- **Settings__ApiKey:** Chave de autenticação para os serviços. |
| 54 | +Para rodar a API localmente, você precisa subir a instância do MongoDB e configurar os acessos necessários aos recursos da AWS (SQS, EventBridge Scheduler e SSM). |
74 | 55 |
|
75 | | -## 🧪 Configuração para Testes Locais |
| 56 | +### Pré-requisitos |
| 57 | +* Docker e Docker Compose instalados. |
| 58 | +* Credenciais de acesso à AWS com permissões para SQS, EventBridge Scheduler e SSM. |
76 | 59 |
|
77 | | - Para executar os testes automatizados que dependem da infraestrutura Docker (Testes de Integração/API), você deve criar o arquivo de |
78 | | - configuração de ambiente na raiz do projeto DotCruz.Notifications.Api. |
| 60 | +### Passo a Passo |
79 | 61 |
|
80 | | - 1. Criar o arquivo appsettings.Test.json |
81 | | - Local: src/DotCruz.Notifications.Api/appsettings.Test.json |
| 62 | +1. **Iniciar o Banco de Dados Local**: |
| 63 | + Na raiz do projeto, execute o comando para subir o MongoDB em segundo plano: |
| 64 | + ```bash |
| 65 | + docker compose up -d |
| 66 | + ``` |
82 | 67 |
|
83 | | -```json |
84 | | -{ |
85 | | - "ConnectionStrings": { |
86 | | - "MongoDb": "mongodb://localhost:27020" |
87 | | - }, |
88 | | - "Settings": { |
89 | | - "ApiKey": "DotCruzNotificationsKey", |
90 | | - "EmailSettings": { |
91 | | - "Host": "localhost", |
92 | | - "Port": 1030, |
93 | | - "Username": "", |
94 | | - "Password": "", |
95 | | - "FromEmail": "nao-responda@dotcruz.com", |
96 | | - "FromName": "DotCruz Notifications", |
97 | | - "EnableSsl": false |
98 | | - }, |
99 | | - "MongoDbSettings": { |
100 | | - "DatabaseName": "NotificationsDb" |
| 68 | +2. **Configurar Variáveis de Ambiente / Configurações Locais**: |
| 69 | + Ao rodar a API localmente (através do VS Code, Visual Studio ou via CLI `dotnet run`), configure as variáveis de ambiente necessárias para conexão com o MongoDB local e com a AWS (ou configure-as no seu gerenciador de User Secrets do .NET): |
| 70 | + ```json |
| 71 | + { |
| 72 | + "ConnectionStrings": { |
| 73 | + "MongoDb": "mongodb://localhost:27020" |
101 | 74 | }, |
102 | | - "RabbitMqSettings": { |
103 | | - "Host": "localhost", |
104 | | - "Port": 5675, |
105 | | - "Username": "guest", |
106 | | - "Password": "guest" |
| 75 | + "Settings": { |
| 76 | + "ApiKey": "DotCruzNotificationsKey", |
| 77 | + "AWS": { |
| 78 | + "Region": "us-east-1", |
| 79 | + "AccessKey": "SUA_ACCESS_KEY", |
| 80 | + "SecretKey": "SUA_SECRET_KEY", |
| 81 | + "SqsQueueArn": "arn:aws:sqs:us-east-1:123456789012:sua-fila", |
| 82 | + "SchedulerRoleArn": "arn:aws:iam::123456789012:role/seu-role-do-scheduler", |
| 83 | + "SmtpParameterPath": "/dotcruz/tenants/{0}/smtp-config" |
| 84 | + } |
107 | 85 | } |
108 | 86 | } |
109 | | - } |
110 | | -``` |
| 87 | + ``` |
| 88 | + |
| 89 | +3. **Acessar a Documentação da API (Scalar)**: |
| 90 | + Com a API executando localmente, você poderá acessar a documentação interativa em: |
| 91 | + * **📄 Documentação da API (Scalar)**: `http://localhost:5050/scalar` |
| 92 | + |
| 93 | +--- |
111 | 94 |
|
112 | | - > Nota: Utilizamos as portas 27020, 1030 e 5675 para que os testes rodando em sua máquina local consigam acessar os containers Docker |
113 | | - expostos. |
| 95 | +## 🔄 Deploy Contínuo (CI/CD) |
114 | 96 |
|
115 | | - 1. Rodar os testes |
| 97 | +O projeto possui duas esteiras automatizadas de implantação via GitHub Actions: |
116 | 98 |
|
117 | | -```json |
118 | | -dotnet test |
119 | | -``` |
| 99 | +### 1. Implantação da API ([deploy.yml](./.github/workflows/deploy.yml)) |
| 100 | +Acionado a cada push para a branch `main`: |
| 101 | +1. Compila a imagem Docker a partir do [Dockerfile](./src/DotCruz.Notifications.Api/Dockerfile) e envia para o GitHub Container Registry (GHCR). |
| 102 | +2. Acessa a VPS de produção via SSH. |
| 103 | +3. Copia o [docker-compose.prod.yml](./docker-compose.prod.yml) para o servidor como `docker-compose.yml`. |
| 104 | +4. Injeta as variáveis de ambiente necessárias (como credenciais AWS, chaves de API e strings de conexão Mongo) a partir do GitHub Secrets. |
| 105 | +5. Executa `docker compose pull` e `docker compose up -d` para atualizar os contêineres sob a rede externa `dotcruz_net`. |
120 | 106 |
|
121 | | - --- |
122 | | - Desenvolvido por Matheus Cruz – Focado em escalabilidade e sistemas distribuídos. |
| 107 | +### 2. Publicação de Contratos ([publish-contracts.yml](./.github/workflows/publish-contracts.yml)) |
| 108 | +Acionado quando há modificações na pasta de contratos: |
| 109 | +1. Gera o pacote NuGet (.nupkg) do projeto [DotCruz.Notifications.Contracts](./src/DotCruz.Notifications.Contracts/DotCruz.Notifications.Contracts.csproj). |
| 110 | +2. Publica o pacote no NuGet.org utilizando a chave de API fornecida em segredo. |
0 commit comments