Pular para o conteúdo

5. Blocos de construção (C4 níveis 2 e 3)

Um container, no C4, é qualquer coisa que roda separadamente: aplicação, banco, cache, volume de arquivos.

flowchart LR
    user(["Navegador<br/>profissional / admin"])

    subgraph vps ["VPS · Coolify"]
      direction LR
      web["<b>web</b><br/>Next.js 14 · App Router<br/><small>UI pública, logada, estúdio, admin<br/>Better Auth em /api/auth/*<br/>webhook de pagamento</small><br/><i>moldape.com · :3000</i>"]
      api["<b>order-lifecycle</b><br/>Fastify · Clean Architecture<br/><small>regras de negócio, uploads, PDFs,<br/>pagamento, e-mails</small><br/><i>api.moldape.com · :4001 · /api/v2</i>"]
      db[("PostgreSQL<br/><small>Prisma · 34 modelos</small>")]
      redis[("Redis<br/><small>cache de sessão e respostas,<br/>rate limit</small>")]
      vol[["Volume /app/uploads<br/><small>plantigrafias, PDFs, imagens</small>"]]
    end

    pay["InfinitePay"]
    smtp["SMTP"]

    user -- "HTTPS (páginas, RSC)" --> web
    user -- "HTTPS JSON · fetch credentials: include<br/>cookie moldape.session_token" --> api
    web -- "Prisma (sessões, usuários)" --> db
    api -- "Prisma" --> db
    api -- "sessões em cache" --> redis
    api -- "lê/grava arquivos" --> vol
    api -- "cria link" --> pay
    pay -- "webhook" --> web
    web -- "PATCH status PAID" --> api
    api -- "e-mails" --> smtp
    web -- "e-mails de senha" --> smtp

    classDef app fill:#b31f1d,color:#fff,stroke:#7a1513
    classDef store fill:#361548,color:#fff,stroke:#361548
    classDef ext fill:#eeeaf1,color:#2b1f33,stroke:#9d91a4
    class web,api app
    class db,redis,vol store
    class pay,smtp ext
Container Tecnologia Responsabilidade Deploy
apps/web Next.js 14 (App Router), React 18, Tailwind, TanStack Query/Form, Zustand, Konva Interface, autenticação (Better Auth), rotas de apoio a upload e webhook Nixpacks → pnpm --filter=web run start
apps/order-lifecycle Fastify, Prisma, jsPDF, sharp, pdf2pic, Nodemailer (via @moldape/email) API de domínio sob /api/v2, uploads estáticos em /uploads/, health em /health Nixpacks → pnpm run start:prod (porta 4001)
PostgreSQL PostgreSQL (17 no docker-compose) Persistência única Mesma VPS (confirmar se é serviço do Coolify)
Redis Redis 7 Cache de sessão, cache de respostas, rate limit Mesma VPS (confirmar se é serviço do Coolify)
Volume uploads Sistema de arquivos Plantigrafias, imagens de criação, PDFs, miniaturas de catálogo, banners, logos Volume Docker montado em /app/uploads

O serviço segue Clean Architecture: as dependências apontam sempre para dentro, em direção ao domínio.

flowchart TB
    subgraph P ["presentation"]
      routes["routes/*-routes.ts<br/><small>14 módulos · JSON Schema</small>"]
      ctrl["controllers/*"]
      mw["middleware<br/><small>requireAuth · requireAdmin</small>"]
    end
    subgraph A ["application"]
      uc["use-cases/*<br/><small>order, draft, cart, product, piece,<br/>coverage, coupon, tax, upload…</small>"]
    end
    subgraph D ["domain"]
      ent["entities<br/><small>Order, Draft, Cart, Product, Piece,<br/>Coverage, Coupon, Tax…</small>"]
      vo["value-objects<br/><small>codes, customer-name, email,<br/>quantity, entity-code…</small>"]
      ds["domain services<br/><small>pricing, cart-calculation,<br/>order-validation</small>"]
      repoi["repository interfaces"]
    end
    subgraph I ["infrastructure"]
      repo["Prisma repositories"]
      svc["services<br/><small>payment (InfinitePay), pdf-generator,<br/>upload, redis</small>"]
      cache["cache · logging · monitoring"]
    end

    routes --> mw --> ctrl --> uc
    uc --> ent & vo & ds & repoi
    repo -. implementa .-> repoi
    uc --> svc
    I --> D

    classDef layer fill:#fff,stroke:#b31f1d
  • Directoryapps/order-lifecycle/src
    • Directorydomain/ entidades, value objects, serviços de domínio, contratos de repositório
      • …
    • Directoryapplication/use-cases/ um arquivo por caso de uso (ex.: update-order-status-use-case.ts)
      • …
    • Directoryinfrastructure/ repositórios Prisma, serviços externos, cache, logging
      • …
    • Directorypresentation/ rotas, controllers, schemas, mappers, middleware
      • …
    • Directoryplugins/ sessão (Better Auth via banco), Redis, rate limit
      • …
    • Directoryconfig/ injeção de dependências e constantes
      • …
    • server.ts registro de plugins, rotas e handlers de erro
Desenvolvido e documentado por
Nós Tecnologia · Desenvolvimento Criativo