Chat Platform
O projeto foi feito com a estrutura em containers Docker e é estruturado como um monorepo. Este projeto inclui vários serviços interconectados, como uma API, banco de dados, fila de mensagens e um frontend. Abaixo estão as instruções para configurar e rodar o ambiente de desenvolvimento.
- Node.js e Nest.js e TypeScript para o desenvolvimento da API.
- PostgreSQL como banco de dados.
- RabbitMQ para gerenciamento de filas de mensagens.
- Next.js no frontend (WebApp).
- Docker e Docker Compose para facilitar a execução de todos os serviços em containers.
- Monorepo para organizar múltiplos serviços no mesmo repositório.
O projeto segue uma estrutura de monorepo, com cada serviço dentro de uma pasta separada. Abaixo está a lista de serviços incluídos:
- api: API backend utilizando Node.js, TypeScript, Design Patterns (Template Method, SOLID, Factory Functions).
- webapp: Frontend da aplicação.
- Docker (com Docker Compose) instalado.
- Node.js
Primeiro, clone este repositório para sua máquina local:
git clone https://github.com/erikwtg/chat-platform.git
cd chat-platformO projeto já possui um arquivo docker-compose.yml configurado para orquestrar os serviços.
Para rodar os serviços em modo desenvolvimento, execute o seguinte comando:
./deployment.shou
docker network create chat_platform_network
docker-compose -f docker-compose.yml up -d --buildEsse comando irá: Criar a rede chat_platform_network.
Construir os containers necessários.
Rodar os serviços na porta configuradas no docker-compose.yml.
Criar o banco de dados PostgreSQL.
Inicializar os serviços RabbitMQ e o consumo das filas.
- Template Method: Utilizado para definir o esqueleto de algoritmos, permitindo que subclasses forneçam implementações específicas.
- SOLID: O código foi estruturado com base nos princípios SOLID para garantir maior coesão e baixa acoplabilidade.
- Factory Functions: Para a criação de objetos, melhorando a extensibilidade do código.
Depois de executar o comando de inicialização, você pode acessar as aplicações através dos seguintes endereços:
- WebApp: http://localhost:3002
- API: http://server:3000
- RabbitMQ: http://rabbitmq:15672
- PostgreSQL: http://postgres:5432
- Cadastro de usuário.
- Login de usuário.
- Listagem de salas.
- Criação de salas.
- Entrada em uma sala.
- Envio de mensagens.
- Recebimento de mensagens.
- Edição de mensagens.
- Exclusão de mensagens.
Embora o projeto tenha sido desenvolvido com as melhores práticas disponíveis dentro do tempo e dos requisitos do desafio, há algumas melhorias que gostaria de ter implementado:
- Abstração dos Controllers: A arquitetura do código poderia ser melhorada ao abstrair os controllers de maneira mais eficaz, separando melhor as responsabilidades e tornando o código mais modular e fácil de manter.
- Testes Unitários: Gostaria de implementar testes para melhorar a cobertura e a confiança na estabilidade do sistema.
- Observabilidade: A inclusão de logs e métricas mais detalhadas ajudaria a entender melhor o comportamento da aplicação.
- Tratamento de Erros e Validações no Frontend: Embora o tratamento de erros no backend tenha sido abordado, a validação e o tratamento de erros no frontend podem ser aprimorados. Gostaria de ter implementado uma validação de dados mais robusta e um sistema de feedback mais amigável para o usuário final.
- Documentação da API
- Validação nos dados de entrada dos formulários com Zod
- Melhorar lógica de contexto e websocket
- Quebrar os componentes em mais componentes desacoplando para separar ainda melhor a lógica do componente
- Tratar mensagens complexas de midias
- Utilizar Zustand ou para trabalhar com estado de forma mais consistente e nao utilizar localstorage para dados do usuário
- Implementar cache de memória em redis para os usuários conectados as sala
- Finalizar implementacao no service de mensagem para gravar mensagem antes da edição no histórico
- Banco de dados caso não seja criado corretamente, pode ser necessário criar o banco de dados manualmente. Acesse o container da API server e execute o seguinte comando:
npx drizzle-kit migrateCaso ainda persistisse o problema, apague todo conteúdo da pasta server/drizzle, acesse o container da API server e execute o seguintes comandos:
npx drizzle-kit generate
npx drizzle-kit migrateA escolha das tecnologias e das estruturas foi feita com base no desafio proposto.
-
Node.js e TypeScript com NestJS: foi escolhido pela sua performance e pela familiaridade com o ecossistema JavaScript. É uma tecnologia excelente suporte para APIs assíncronas e alto desempenho em sistemas que exigem escalabilidade.
-
PostgreSQL: foi escolhido por ser uma base de dados relacional, garantindo a consistência e a integridade dos dados.
-
RabbitMQ: foi escolhido para gerenciar as filas de mensagens, permitindo que o projeto seja escalável e flexível de acordo com a característica do projeto.
-
Next.js: foi escolhido para o frontend, pela sua familiaridade e pela sua performance.
-
Docker e Docker Compose: foi escolhido para facilitar a execução de todos os serviços em containers.
-
Monorepo: foi escolhido para organizar todos os serviços em um único repositório, facilitando a manutenção e o desenvolvimento.