Add Archify | New Model… with three C4 examples and Open Model in the Explorer menu

- templates/models: C4 - Standard Web App, C4 - E-Shop, C4 - Event-Based
  Integration; each a complete model (main.archify, registry, context,
  containers, components) that validates
- archify.newModel: pick an example and a folder name, copy it, name the
  model after the folder, open the model page
- Explorer menu: New Model… on folders, Open Model on .archify and
  .archify-registry files; File → New File… lists New Model…
- unit test validates every example end to end; integration test runs the
  command; README, CHANGELOG, docs/model.md
This commit is contained in:
2026-10-19 12:12:49 +03:00
parent 7a2b661afe
commit 57914d435c
29 changed files with 874 additions and 8 deletions
@@ -0,0 +1,26 @@
schema_version: 1
diagram_type: architecture
meta:
title: System context
output: context.html
components:
- ref: customer
pos: [40, 60]
size: [130, 60]
- ref: support
pos: [40, 260]
size: [130, 60]
- ref: shop
pos: [280, 160]
size: [150, 60]
- ref: psp
pos: [520, 60]
size: [150, 60]
- ref: email
pos: [520, 260]
size: [150, 60]
connections:
- { from: customer, to: shop, label: buys, variant: emphasis }
- { from: support, to: shop, label: manages orders }
- { from: shop, to: psp, label: charges, variant: security }
- { from: shop, to: email, label: sends mail }
@@ -0,0 +1,39 @@
schema_version: 1
diagram_type: architecture
meta:
title: Containers
output: containers.html
components:
- ref: customer
pos: [40, 160]
size: [130, 60]
- ref: web
pos: [250, 160]
size: [130, 60]
- ref: api
pos: [460, 160]
size: [130, 60]
- ref: cache
pos: [670, 60]
size: [130, 60]
- ref: db
pos: [670, 260]
size: [130, 60]
- ref: queue
pos: [460, 360]
size: [130, 60]
- ref: worker
pos: [670, 460]
size: [130, 60]
boundaries:
- kind: region
label: Online Shop
wraps: [web, api, cache, db, queue, worker]
connections:
- { from: customer, to: web, label: HTTPS, variant: emphasis }
- { from: web, to: api, label: JSON }
- { from: api, to: cache, label: read }
- { from: api, to: db, label: SQL }
- { from: api, to: queue, label: enqueue, labelAt: [560, 290] }
- { from: queue, to: worker, label: poll }
- { from: worker, to: db, label: SQL, labelAt: [735, 420] }
@@ -0,0 +1,42 @@
schema_version: 1
diagram_type: architecture
meta:
title: API components
output: api.html
components:
- ref: web
pos: [40, 160]
size: [130, 60]
- id: auth
type: security
label: Auth
sublabel: sessions, OIDC
pos: [250, 60]
size: [130, 60]
- id: orders
type: backend
label: Orders
pos: [250, 160]
size: [130, 60]
- id: catalogue
type: backend
label: Catalogue
pos: [250, 260]
size: [130, 60]
- ref: db
pos: [460, 160]
size: [130, 60]
- ref: queue
pos: [460, 310]
size: [130, 60]
boundaries:
- kind: region
label: API
wraps: [auth, orders, catalogue]
connections:
- { from: web, to: auth, label: sign in, variant: security }
- { from: web, to: orders, label: place order }
- { from: web, to: catalogue, label: browse }
- { from: orders, to: db, label: SQL }
- { from: catalogue, to: db, label: SQL }
- { from: orders, to: queue, label: enqueue }
+24
View File
@@ -0,0 +1,24 @@
schema_version: 1
model:
id: e-shop
name: E-Shop
description: >
The web shop, its API and workers, and the stores behind them.
Context, containers and components, C4 style.
diagram_type: architecture
meta:
title: E-Shop — overview
output: main.html
components:
- ref: customer
pos: [40, 160]
size: [130, 60]
- ref: shop
pos: [250, 160]
size: [150, 60]
- ref: psp
pos: [480, 160]
size: [150, 60]
connections:
- { from: customer, to: shop, label: buys, variant: emphasis }
- { from: shop, to: psp, label: charges }
@@ -0,0 +1,37 @@
schema_version: 1
elements:
web:
type: frontend
label: Web App
sublabel: React
brand: react
description: The shop as customers see it; talks only to the API.
api:
type: backend
label: API
sublabel: Node.js
brand: node-js
description: Owns authentication, orders and the catalogue.
diagram: 0300-components/api.archify
worker:
type: backend
label: Worker
sublabel: async jobs
description: Picks jobs from the queue; emails, invoices, exports.
queue:
type: messagebus
label: Queue
sublabel: SQS
description: Job queue between the API and the workers.
db:
type: database
label: Database
sublabel: PostgreSQL
brand: postgresql
description: Orders, customers and catalogue; the source of truth.
cache:
type: database
label: Cache
sublabel: Redis
brand: redis
description: Sessions and catalogue cache; nothing here is the source of truth.
@@ -0,0 +1,12 @@
schema_version: 1
elements:
customer:
type: external
label: Customer
sublabel: web and mobile
description: Buys products; signs in with email or a social account.
support:
type: external
label: Support agent
sublabel: back office
description: Handles refunds and order problems in the admin console.
@@ -0,0 +1,19 @@
schema_version: 1
elements:
shop:
type: cloud
label: Online Shop
sublabel: the system
description: Everything we build and run; web app, API, workers and stores.
diagram: 0200-containers/online-shop.archify
psp:
type: external
label: Payment provider
sublabel: Stripe
brand: stripe
description: Charges cards and pays out; we never see card numbers.
email:
type: external
label: Email service
sublabel: transactional mail
description: Sends order confirmations and password resets.