{"id":27919504,"url":"https://github.com/jscodedevlopment/wqueue-backend","last_synced_at":"2025-05-06T19:32:47.927Z","repository":{"id":250226447,"uuid":"833332689","full_name":"JsCodeDevlopment/WQueue-Backend","owner":"JsCodeDevlopment","description":null,"archived":false,"fork":false,"pushed_at":"2024-07-27T16:04:55.000Z","size":1896,"stargazers_count":0,"open_issues_count":0,"forks_count":0,"subscribers_count":2,"default_branch":"main","last_synced_at":"2024-07-28T01:08:05.130Z","etag":null,"topics":[],"latest_commit_sha":null,"homepage":null,"language":"TypeScript","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":null,"status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/JsCodeDevlopment.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":null,"code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null}},"created_at":"2024-07-24T20:32:54.000Z","updated_at":"2024-07-27T16:04:58.000Z","dependencies_parsed_at":"2024-07-26T01:07:58.133Z","dependency_job_id":"16352b8e-b395-4ccd-80c3-332519f913e0","html_url":"https://github.com/JsCodeDevlopment/WQueue-Backend","commit_stats":null,"previous_names":["jscodedevlopment/wqueue-backend"],"tags_count":0,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/JsCodeDevlopment%2FWQueue-Backend","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/JsCodeDevlopment%2FWQueue-Backend/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/JsCodeDevlopment%2FWQueue-Backend/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/JsCodeDevlopment%2FWQueue-Backend/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/JsCodeDevlopment","download_url":"https://codeload.github.com/JsCodeDevlopment/WQueue-Backend/tar.gz/refs/heads/main","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":252753361,"owners_count":21798946,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":[],"created_at":"2025-05-06T19:31:19.290Z","updated_at":"2025-05-06T19:32:47.864Z","avatar_url":"https://github.com/JsCodeDevlopment.png","language":"TypeScript","funding_links":[],"categories":[],"sub_categories":[],"readme":"# WQueue WhatsApp Microservice - Back-end Typescript + Clean Architecture\n\n## 💬 Descrição.\n\nEste 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.\n\n## 🚧 Estrutura do Projeto.\nA arquitetura segue o padrão de Clean Architecture e Inversão de Dependência. As principais camadas são:\n- Domain: Define as entidades, gateways e interfaces do domínio.\nConté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.\n- Factories: Define a criação de repositórios, rotas e casos de uso.\nContém a lógica para criar instâncias de repositórios, rotas e casos de uso.\n- Infra: Implementa repositórios, rotas, Sequelize e serviços.\nContém implementações específicas de infraestrutura, como repositórios, rotas, e serviços.\n- Main: Configura o aplicativo, middlewares, e documentação Swagger.\n- Usecases: Implementa casos de uso e DTOs.\n\n📂 **Esquema de pastas:** Este projeto segue os princípios da Clean Architecture, dividindo o código em camadas bem definidas:\n```\nsrc\n├── domain\n│   ├── campaign\n│   │   ├── entity\n│   │   ├── gateway\n│   │   └── interfaces\n├── factories\n│   ├── repositories\n│   │   ├── campaign\n│   │   └── rabbit\n│   ├── routes\n│   │   └── campaign\n│   └── useCases\n│       ├── campaign\n│       └── schedule\n├── infra\n│   ├── repositories\n│   │   ├── campaign\n│   │   └── rabbit\n│   └── routes\n│       └── campaign\n│           └── create\n│               └── dto\n├── main\n│   ├── @types\n│   ├── adapters\n│   │   └── http\n│   │       └── interfaces\n│   ├── api\n│   │   ├── config\n│   │   └── interfaces\n│   ├── docs\n│   │   └── swagger\n│   │       ├── components\n│   │       │   └── campaign\n│   │       │       └── schema\n│   │       ├── config\n│   │       ├── responses\n│   │       └── schemas\n│   ├── helpers\n│   └── middlewares\n└── usecases\n    ├── campaign\n    │   ├── create\n    │   │   └── dto\n    │   └── listById\n    │       └── dto\n    └── message\n        └── scheduleMessage\n            └── dto\n```\n## ⚙ Resumo da Estrutura.\n\n- **Entidade:** Define a estrutura e lógica de negócios básica da(s) Entidade(s).\n- **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.\n- **Configurações de Rota:** Define a abstração para as rotas HTTP.\n- **Rota Específica:** Implementa a lógica da rota para executar uma ação feita no usecase.\n- **Ponto de Entrada (Main):** Configura e inicializa a aplicação, incluindo a injeção de dependências.\n\n## 🪀 Fluxo da Aplicação.\n\n### Recepção da Requisição:\n- Cliente: Envia uma requisição HTTP para o servidor para agendar o envio de mensagens.\n- Infraestrutura de Roteamento: As rotas são configuradas na camada infra/routes e direcionam a requisição para os controladores apropriados.\n\n### Tratamento da Requisição:\n- Middlewares: Antes de alcançar o controlador, a requisição passa pelos middlewares definidos (por exemplo, autenticação, validação).\n- Controladores: Os controladores na camada infra/routes recebem a requisição e chamam o caso de uso correspondente.\n\n### Caso de Uso (UseCase):\n- O caso de uso recebe o DTO de entrada.\n- Cria uma instância da entidade Campaign usando o método Ex.: Campaign.create.\n- Interage com o repositório Ex.: (CampaignGateway) para persistir o produto no banco de dados.\n- Gera um DTO de saída Ex.: (CreateCampaignOutputDto) com os dados do produto criado.\n\n### Interação com o Domínio:\n- 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.\n\n### Repositório (Gateway):\n- 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.\n\n### Resposta da Rota:\n- 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.\n- 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.\n\n### 📱 Exemplo de Fluxo de Criação de uma Campanha\n- Requisição: O cliente envia uma requisição POST /campaigns com um corpo multipart/form-data contendo os dados da campanha ex.:\n```json\n\"file\": \"CONTATOS.csv\",\n\"delay\": 5,\n\"schedule\": \"2024-07-30T10:34:00Z\"\n\"message\": \"Contract the best dev web NOW!\"\n```\n.\n- Middleware: O middleware do multer pega o csv enviado e salva na pasta uploads.\n- Controlador: O controlador CreateCampaignController recebe a requisição e chama CreateCampaignUseCase.\n- Caso de Uso: CreateCampaignUseCase valida os dados e utiliza o repositório para persistir o produto.\n- Repositório: O repositório RabbitMQRepository usa o RabbitMQ para criar e gerenciar os as queues para que os dados cheguem até o consumer.\n- Resposta: O controlador formata a resposta e a envia ao cliente. A resposta é documentada no Swagger para referência.\n\n## 🎯 Instalação.\n1°→ Instalação das dependências:\n```bash\nnpm install\n# ou\nyarn\n```\n2°→ Configure o RabbitMQ e a Queue no arquivo `.env` crie um arquivo `.env` e cole o código abaixo:\n```env\nWHITELIST_URLS=\"http://localhost:3000,http://localhost:3001,http://localhost:8000\"\n\nQUEUE_NAME=\"whatsapp_campaign\"\nRABBITMQ_URL=\"amqp://admin:admin@localhost:5672\"\n```\n3°→ Subir o container no docker:\n```bash\ndocker compose up -d\n```\n4°→ Execute a aplicação:\n```bash\nnpm run dev\n# ou\nyarn dev\n\n```\n\n## 💻 Tecnologias Utilizadas.\n\n \u003cdiv align=\"center\"\u003e\n  \u003cimage src=\"https://img.shields.io/badge/TypeScript-007ACC?style=for-the-badge\u0026logo=typescript\u0026logoColor=white\" /\u003e\n  \u003cimage src=\"https://img.shields.io/badge/Express%20js-000000?style=for-the-badge\u0026logo=express\u0026logoColor=white\" /\u003e\n  \u003cimage src=\"https://img.shields.io/badge/Swagger-85EA2D?style=for-the-badge\u0026logo=Swagger\u0026logoColor=white\" /\u003e\n  \u003cimage src=\"https://img.shields.io/badge/rabbitmq-%23FF6600.svg?\u0026style=for-the-badge\u0026logo=rabbitmq\u0026logoColor=white\" /\u003e\n  \u003cimage src=\"https://img.shields.io/badge/Docker-2CA5E0?style=for-the-badge\u0026logo=docker\u0026logoColor=white\" /\u003e\n\u003c/div\u003e\n\n## 👨‍💻 Desenvolvedor.\n\n| Foto                                                                                                                           | Nome                                                 | Cargo               |\n| ------------------------------------------------------------------------------------------------------------------------------ | ---------------------------------------------------- | ------------------- |\n| \u003cimg src=\"https://avatars.githubusercontent.com/u/100796752?s=400\u0026u=ae99bd456c6b274cd934d85a374a44340140e222\u0026v=4\" width=\"100\"\u003e | [Jonatas Silva](https://github.com/JsCodeDevlopment) | FullStack Developer |\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fjscodedevlopment%2Fwqueue-backend","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fjscodedevlopment%2Fwqueue-backend","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fjscodedevlopment%2Fwqueue-backend/lists"}