Pular para conteúdo

Aula 20 - Projeto Capstone: Backend Node.js de Alta Performance 🏆

Objetivo Pedagógico

Objetivo: Construção de uma API corporativa completa de alta performance em Node.js com NestJS, persistência com PostgreSQL/Prisma, cache com Redis e documentação OpenAPI.


📑 1. Fundamentos Teóricos & Análise Técnica

O Projeto Capstone da Especialização em Backend Node.js simula o desenvolvimento de uma API financeira de processamento de pagamentos e liquidação de transações. O projeto desafia o estudante a projetar um sistema capaz de suportar alta concorrência com consistência transacional estrita.

O projeto exige a integração dos seguintes módulos: 1. Arquitetura NestJS com DTOs Validados: Validação rigorosa de payloads de transferência monetária através de pipes customizados e DTOs tipados. 2. Persistência com Prisma ORM e PostgreSQL: Transações atômicas com bloqueio pessimista ou controle otimista de concorrência para evitar saldo negativo (race conditions). 3. Camada de Aceleração com Redis Cache: Armazenamento temporário de cotações cambiais e perfis com invalidação de cache orientada a eventos. 4. Documentação Viva com Swagger / OpenAPI: Geração automatizada de documentação interativa com anotações @ApiProperty() e @ApiResponse().

📐 Arquitetura Conceitual & Diagrama de Fluxo

graph TD
    Client["Client / Checkout"] --> Controller["TransactionsController"]
    Controller --> Cache{"Cotação em Cache no Redis?"}
    Cache -->|Sim: Cache Hit| Process["Processa Débito / Crédito"]
    Cache -->|Não: Cache Miss| DBQuotes["Busca Cotação no Banco e Popula Redis"]
    DBQuotes --> Process
    Process --> Tx["Prisma $transaction (Atomicidade ACID)"]
    Tx --> Postgres["PostgreSQL (Tabelas accounts e ledgers)"]
    style Client fill:#e1f5fe,stroke:#01579b
    style Controller fill:#fff3e0,stroke:#e65100
    style Tx fill:#e8f5e9,stroke:#2e7d32
    style Postgres fill:#f3e5f5,stroke:#7b1fa2

🔍 Pilares e Diretrizes Técnicas

Nesta unidade, aprofundamos os seguintes conceitos fundamentais: - Atomicidade Financeira: Garantia de que débitos e créditos ocorram simultaneamente ou sejam cancelados integralmente (Rollback). - Cache Inteligente: Redução de até 80% nas leituras ao banco de dados relacional para consultas frequentes. - Segurança Operacional: Sanitização de logs para impedir o vazamento de dados de cartões ou documentos pessoais (LGPD). - Resiliência de Conexão: Pool de conexões parametrizado para evitar exaustão de sockets sob carga pesada.


🛠️ 2. Implementação Prática em Node.js, NestJS, Prisma e Redis

Abaixo está a implementação técnica de referência, estruturada com padrões de engenharia de software e foco em robustez:

// transfer.service.ts (Transação Atômica ACID em NestJS)
import { Injectable, BadRequestException } from '@nestjs/common';
import { PrismaService } from '../prisma/prisma.service';

@Injectable()
export class TransferService {
  constructor(private readonly prisma: PrismaService) {}

  async transfer(fromAccountId: string, toAccountId: string, amount: number) {
    return this.prisma.$transaction(async (tx) => {
      // 1. Obtém e valida conta de origem
      const source = await tx.account.findUnique({ where: { id: fromAccountId } });
      if (!source || source.balance < amount) {
        throw new BadRequestException('Saldo insuficiente para transferência.');
      }

      // 2. Debita da origem
      await tx.account.update({
        where: { id: fromAccountId },
        data: { balance: { decrement: amount } }
      });

      // 3. Credita no destino
      await tx.account.update({
        where: { id: toAccountId },
        data: { balance: { increment: amount } }
      });

      // 4. Registra histórico imutável (Audit Trail)
      return tx.ledger.create({
        data: { fromAccountId, toAccountId, amount, executedAt: new Date() }
      });
    });
  }
}

💡 Análise Passo a Passo do Código

  1. Transação Atômica: prisma.$transaction(async tx => ...) garante que se qualquer etapa falhar, todo o saldo é revertido ao estado anterior.
  2. Mutações Incrementais Atômicas: O uso de { decrement: amount } e { increment: amount } executa operações matemáticas diretamente no motor SQL.
  3. Audit Trail: A criação do registro em ledger cria um histórico imutável para auditoria contábil.

🎯 3. Próximos Passos & Sequência Didática