5. Blocos de construção (C4 níveis 2 e 3)
Nível 2: containers
Seção intitulada “Nível 2: containers”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 |
Nível 3: componentes
Seção intitulada “Nível 3: componentes”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:#b31f1dDirectoryapps/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
flowchart TB
subgraph app ["src/app · App Router"]
pub["(auth)<br/><small>login, register, recover/reset, catálogo</small>"]
home["home/*<br/><small>rascunhos, sacola, checkout,<br/>pagamento, pedidos, conta</small>"]
studio["studio/[id]/*<br/><small>plantigrafia, produto, peças,<br/>cobertura, nota, ajuda</small>"]
partial["partial/[id]"]
admin["admin/*<br/><small>acessos, produtos, peças, coberturas,<br/>pedidos, rascunhos, diversos</small>"]
apiR["api/*<br/><small>auth, upload, webhook</small>"]
end
server["server/*<br/><small>sessão, serviços com cookie,<br/>prefetch/hidratação, dados públicos em cache</small>"]
hooks["hooks/*<br/><small>hooks TanStack Query<br/>(queries, mutations, auto-save)</small>"]
lib["lib/*<br/><small>api (serviços), query (queries),<br/>orderLifecycle, auth, canvas, vectorization</small>"]
stores["stores/* · Zustand"]
comps["components/*<br/><small>studio, logged, admin, auth…</small>"]
ui["@moldape/ui<br/><small>shadcn: button, card, input, select,<br/>table, data-table, toast…</small>"]
mwr["proxy.ts<br/><small>barreira otimista por cookie</small>"]
app --> server --> lib
app --> comps --> ui
comps --> hooks --> lib
comps --> stores
mwr -.-> app| Pacote | Conteúdo | Usado por |
|---|---|---|
@moldape/prisma |
Schema, migrations, client e config do Better Auth | web, order-lifecycle |
@moldape/types |
Tipos de domínio compartilhados (Session, User, Address, Customer…) |
web, order-lifecycle |
@moldape/ui |
Componentes shadcn (Radix + cva + Tailwind) e menus | web |
@moldape/email |
Serviço Nodemailer e 6 templates transacionais | web, order-lifecycle |
@moldape/logger |
Logger isomórfico | todos |
@moldape/redis |
Cliente Redis | order-lifecycle |
@moldape/swagger |
Registro do Swagger/OpenAPI no Fastify | order-lifecycle |
@moldape/api-client |
Cliente HTTP (fetch), ApiError e fábrica do QueryClient |
web, editor 3D |
@moldape/auth |
Config do Better Auth (servidor e cliente), papéis e cookies | web, editor 3D |
config/vitest-config |
@moldape/vitest-config: presets Vitest node e react |
todos |
config/playwright-config |
@moldape/playwright-config: base dos e2e e login via API |
web, editor 3D |
config/* (demais) |
ESLint, Prettier, TypeScript, Redis (config) | todos |

Desenvolvido e documentado porNós Tecnologia · Desenvolvimento Criativo

