Aplicação para aprender os princípios do Domain Driven Design (DDD) e juntar tudo em um só projeto com NestJS. Além disso, dividindo a aplicação em camadas para facilitar o desenvolvimento e manter o código organizado.
Nessa aplicação será desenvolvido um Fórum onde o usuário pode acessar, enviar tópicos, criar perguntas, enviar respostas, selecionar a resposta como a resposta que respondeu seu tópico e deixar um comentário.
⚠️ Aplicação com finalidade de desenvolver minhas habilidades com NestJS + DDD
- NestJS: Nest (NestJS) é uma estrutura para a construção de aplicativos Node.js do lado do servidor eficientes e escalonáveis.
- Zod: Zod é uma biblioteca de validação de dados para TypeScript.
- Passport: Passport é uma biblioteca de autenticação de usuários do lado do servidor.
- Passport JWT: Uma estratégia do Passport para autenticação com um JSON Web Token, este módulo permite autenticar endpoints usando um token web JSON.
- Prisma: Prisma é uma biblioteca de persistência de banco de dados para Node.js
- Cloudflare: Cloudflare e uma plataforma de armazenamento de dados de rede.
Nesse projeto estou usando a estrutura NestJS, que é uma estrutura para a construção de aplicativos Node.js do lado do servidor eficientes e escaláveis, para criar uma API de Fórum.
As aulas que estou assistindo para o desenvolvimento desse projeto abordam conceitos de Domain Driven Design (DDD), NestJS e até Clean Architecture. Logo separei outras leituras para as anotações das aulas:
Levando em conta que o projeto já foi clonado e está com todas as dependências instaladas usando seu principal gerenciador de pacotes:
$ pnpm install
Adicione as variáveis de ambiente copiando o arquivo .env.example
e renomeando para .env
:
# Database
DATABASE_URL="postgresql://postgres:docker@localhost:5432/forum-api?schema=public"
# Auth
JWT_PRIVATE_KEY=""
JWT_PUBLIC_KEY=""
# Application
PORT=""
# Storage (AWS / Cloudflare)
AWS_BUCKET_NAME=""
AWS_ACCESS_KEY_ID=""
AWS_SECRET_ACCESS_KEY=""
CLOUDFLARE_ACCOUNT_ID=""
# Redis
REDIS_HOST=""
REDIS_PORT=""
REDIS_DB=""
A estratégia de autenticação usada é JWT com algorítimo RSA-256. Logo você deve gerar as chaves pública e privada do algoritmo e convertê-las para Base64.
$ openssl genrsa -out private.pem 2048
$ openssl rsa -in private.pem -pubout -out public.pem
$ base64 private.pem
$ base64 public.pem
Além disso, usamos Cloudflare R2 para armazenamento de anexos de perguntas e respostas. O interessante é que ele usa a mesma API do AWS S3 o que facilita na questão de troca caso seja necessário. Dado isso, para realização dos testes de ponta a ponta (e2e) basta que o bucket seja criado na Cloudflare com lifecycle(tempo de vida) de 1 dia para que os anexos de testes não sejam acumulados.
Para fazer um override das variáveis de ambiente para testes use o arquivo .env.test
substituindo o que precisar, exemplo:
# Override env variables during tests
AWS_BUCKET_NAME="ignite-nest-forum-ddd-test"
Usando o docker-compose inicie os serviços necessários para executar a aplicação com:
$ docker-compose up -d
Não esqueça de rodar as migrações:
$ pnpm prisma migrate dev
Após isso basta iniciar a aplicação (desenvolvimento):
$ pnpm run start:dev
Para testar as requisições da aplicação estou usando a extensão do VSCode chamada Rest Client e com ela criei um arquivo chamado client.http
na raiz do projeto onde estão listadas todas as rotas da aplicação.
Nesse projeto estou utilizando testes unitários e testes de ponta a ponta (e2e) e para executar basta rodar os comandos:
# Testes unitários
$ pnpm run test
# Testes de ponta a ponta
$ pnpm run test:e2e
Você vai me encontrar em qualquer uma das redes sociais abaixo: