https://github.com/jscodedevlopment/wqueue-backend
https://github.com/jscodedevlopment/wqueue-backend
Last synced: about 1 year ago
JSON representation
- Host: GitHub
- URL: https://github.com/jscodedevlopment/wqueue-backend
- Owner: JsCodeDevlopment
- Created: 2024-07-24T20:32:54.000Z (almost 2 years ago)
- Default Branch: main
- Last Pushed: 2024-07-27T16:04:55.000Z (almost 2 years ago)
- Last Synced: 2024-07-28T01:08:05.130Z (almost 2 years ago)
- Language: TypeScript
- Size: 1.81 MB
- Stars: 0
- Watchers: 2
- Forks: 0
- Open Issues: 0
-
Metadata Files:
- Readme: README.md
Awesome Lists containing this project
README
# WQueue WhatsApp Microservice - Back-end Typescript + Clean Architecture
## 💬 Descrição.
Este projeto é um microsserviço desenvolvido para gerenciar o envio de mensagens em massa para números de WhatsApp utilizando RabbitMQ para gerenciamento de filas e uma API de WhatsApp para o envio das mensagens. O sistema suporta o agendamento das mensagens e a definição de atrasos entre os envios.
## đźš§ Estrutura do Projeto.
A arquitetura segue o padrĂŁo de Clean Architecture e InversĂŁo de DependĂŞncia. As principais camadas sĂŁo:
- Domain: Define as entidades, gateways e interfaces do domĂnio.
ContĂ©m as definições de entidades, gateways e interfaces. Essa camada representa o domĂnio da aplicação e define a lĂłgica de negĂłcios e regras.
- Factories: Define a criação de repositórios, rotas e casos de uso.
Contém a lógica para criar instâncias de repositórios, rotas e casos de uso.
- Infra: Implementa repositórios, rotas, Sequelize e serviços.
ContĂ©m implementações especĂficas de infraestrutura, como repositĂłrios, rotas, e serviços.
- Main: Configura o aplicativo, middlewares, e documentação Swagger.
- Usecases: Implementa casos de uso e DTOs.
đź“‚ **Esquema de pastas:** Este projeto segue os princĂpios da Clean Architecture, dividindo o cĂłdigo em camadas bem definidas:
```
src
├── domain
│ ├── campaign
│ │ ├── entity
│ │ ├── gateway
│ │ └── interfaces
├── factories
│ ├── repositories
│ │ ├── campaign
│ │ └── rabbit
│ ├── routes
│ │ └── campaign
│ └── useCases
│ ├── campaign
│ └── schedule
├── infra
│ ├── repositories
│ │ ├── campaign
│ │ └── rabbit
│ └── routes
│ └── campaign
│ └── create
│ └── dto
├── main
│ ├── @types
│ ├── adapters
│ │ └── http
│ │ └── interfaces
│ ├── api
│ │ ├── config
│ │ └── interfaces
│ ├── docs
│ │ └── swagger
│ │ ├── components
│ │ │ └── campaign
│ │ │ └── schema
│ │ ├── config
│ │ ├── responses
│ │ └── schemas
│ ├── helpers
│ └── middlewares
└── usecases
├── campaign
│ ├── create
│ │ └── dto
│ └── listById
│ └── dto
└── message
└── scheduleMessage
└── dto
```
## âš™ Resumo da Estrutura.
- **Entidade:** Define a estrutura e lógica de negócios básica da(s) Entidade(s).
- **Caso de Uso (UseCase):** Implementa a lĂłgica de aplicação especĂfica para criação, edição, deleção, listage ou atualização de uma entidade.
- **Configurações de Rota:** Define a abstração para as rotas HTTP.
- **Rota EspecĂfica:** Implementa a lĂłgica da rota para executar uma ação feita no usecase.
- **Ponto de Entrada (Main):** Configura e inicializa a aplicação, incluindo a injeção de dependências.
## 🪀 Fluxo da Aplicação.
### Recepção da Requisição:
- Cliente: Envia uma requisição HTTP para o servidor para agendar o envio de mensagens.
- Infraestrutura de Roteamento: As rotas são configuradas na camada infra/routes e direcionam a requisição para os controladores apropriados.
### Tratamento da Requisição:
- Middlewares: Antes de alcançar o controlador, a requisição passa pelos middlewares definidos (por exemplo, autenticação, validação).
- Controladores: Os controladores na camada infra/routes recebem a requisição e chamam o caso de uso correspondente.
### Caso de Uso (UseCase):
- O caso de uso recebe o DTO de entrada.
- Cria uma instância da entidade Campaign usando o método Ex.: Campaign.create.
- Interage com o repositĂłrio Ex.: (CampaignGateway) para persistir o produto no banco de dados.
- Gera um DTO de saĂda Ex.: (CreateCampaignOutputDto) com os dados do produto criado.
### Interação com o DomĂnio:
- Camada de DomĂnio (domain): O caso de uso interage com as entidades e interfaces de domĂnio (por exemplo, Campaign entity) para realizar a lĂłgica de negĂłcios.
### RepositĂłrio (Gateway):
- Camada de Repositórios (factories/repositories e infra/repositories): O caso de uso utiliza os repositórios para acessar e manipular os dados no banco de dados. A implementação do repositório está na camada infra/repositories, mas a interface do repositório é definida na camada factories/repositories.
### Resposta da Rota:
- Casos de Uso e Controladores: Após a execução do caso de uso, o controlador formata a resposta e a envia de volta ao cliente.
- Swagger: A documentação Swagger, configurada na pasta main/docs/swagger, descreve as APIs e suas rotas. A documentação Ă© gerada a partir das definições e schemas Swagger e está acessĂvel para os desenvolvedores via Swagger UI.
### 📱 Exemplo de Fluxo de Criação de uma Campanha
- Requisição: O cliente envia uma requisição POST /campaigns com um corpo multipart/form-data contendo os dados da campanha ex.:
```json
"file": "CONTATOS.csv",
"delay": 5,
"schedule": "2024-07-30T10:34:00Z"
"message": "Contract the best dev web NOW!"
```
.
- Middleware: O middleware do multer pega o csv enviado e salva na pasta uploads.
- Controlador: O controlador CreateCampaignController recebe a requisição e chama CreateCampaignUseCase.
- Caso de Uso: CreateCampaignUseCase valida os dados e utiliza o repositĂłrio para persistir o produto.
- Repositório: O repositório RabbitMQRepository usa o RabbitMQ para criar e gerenciar os as queues para que os dados cheguem até o consumer.
- Resposta: O controlador formata a resposta e a envia ao cliente. A resposta Ă© documentada no Swagger para referĂŞncia.
## 🎯 Instalação.
1°→ Instalação das dependências:
```bash
npm install
# ou
yarn
```
2°→ Configure o RabbitMQ e a Queue no arquivo `.env` crie um arquivo `.env` e cole o código abaixo:
```env
WHITELIST_URLS="http://localhost:3000,http://localhost:3001,http://localhost:8000"
QUEUE_NAME="whatsapp_campaign"
RABBITMQ_URL="amqp://admin:admin@localhost:5672"
```
3°→ Subir o container no docker:
```bash
docker compose up -d
```
4°→ Execute a aplicação:
```bash
npm run dev
# ou
yarn dev
```
## đź’» Tecnologias Utilizadas.
## 👨‍💻 Desenvolvedor.
| Foto | Nome | Cargo |
| ------------------------------------------------------------------------------------------------------------------------------ | ---------------------------------------------------- | ------------------- |
|
| [Jonatas Silva](https://github.com/JsCodeDevlopment) | FullStack Developer |