Este projeto começou como um pequeno experimento há 8 meses, mas foi retomado e escalado com novos aprendizados, como arquitetura limpa, testes, desacoplamento e muito mais. Agora, é uma plataforma robusta onde os usuários podem publicar anúncios de carros, incluindo envio de imagens, detalhes do veículo, histórico de vendas, favoritar anúncios, deixar comentários e funcionalidades adicionais.
Atualmente, o projeto segue a arquitetura monolítica. No entanto, em breve pretendo aprender sobre microsserviços para maior desacoplamento e facilidade de manutenção.
As principais tecnologias usadas no projeto incluem:
- Framework para Node.js
- Utilizado internamente pelo NestJS
- Banco de dados
- ORM para interação com o banco
- Testes unitários e de integração
- Envio de emails
- Armazenamento de imagens
prisma/
src/
├── core/
│ ├── domain/
│ ├── dto/
│ ├── errors/
│ ├── logic/
│
├── domain/
│ ├── application/
│ │ ├── cryptography/
│ │ ├── errors/
│ │ ├── repositories/
│ │ ├── use-cases/
│ ├── enterprise/
│ │ ├── entities/
│ │ ├── value-object/
│
├── infra/
│ ├── auth/
│ ├── cryptography/
│ ├── database/
│ ├── env/
│ ├── http/
│ ├── mailer/
│ ├── storage/
│
tests/ # Implementações InMemory para testesO projeto segue a Arquitetura Limpa, garantindo modularidade, baixo acoplamento e alta testabilidade. Além disso, utilizamos os princípios SOLID, com forte aplicação de Inversão de Dependência e Injeção de Dependências do NestJS.
- Core: Contém elementos essenciais como DTOs, erros e lógica comum.
- Domain:
application: Casos de uso, criptografia, repositórios e erros.enterprise: Entidades e value objects do domínio.
- Infra:
auth: Mecanismos de autenticação.cryptography: Módulos de hashing e tokenização.database: Conexão com o banco de dados via Prisma.env: Configuração de variáveis de ambiente.http: Controladores e interações com a API.mailer: Envio de emails usando Nodemailer.storage: Upload de imagens com MinIO.
- Tests: Implementações in-memory para testes unitários.
$ npm install# Desenvolvimento
$ npm run start
# Modo Watch
$ npm run start:dev
# Produção
$ npm run start:prod# Testes unitários
$ npm run test
# Modo Watch
$ npm run test:watch$ npx prisma migrate devCrie um arquivo .env com as seguintes variáveis:
SERVICE=
PORT=
VERSION=
APP_URL_AUTOCARS=
NODE_MAILER_HOST=
NODE_MAILER_USER=
NODE_MAILER_PORT=
NODE_MAILER_PASSWORD=
NODE_MAILER_FROM=
DATABASE_URL=
MINIO_BUCKET_NAME=
MINIO_BUCKET_URL=
MINIO_ACCESS_KEY_ID=
MINIO_SECRET_ACCESS_KEY=
JWT_PRIVATE_KEY=
JWT_PUBLIC_KEY=O envio de emails utiliza o Nodemailer e requer um email próprio para funcionar (o serviço gratuito possui limitações).
- Envio de token para recuperação de senha
- Recuperação de senha com token válido
.env) com suas credenciais do Nodemailer.
O upload de imagens é feito via MinIO, simulando o Amazon S3, permitindo armazenar e acessar imagens de anúncios de forma segura.
- Autor: YuriLRodrigues
- LinkedIn: Yuri Leite Rodrigues