lomavuokraus/docs/architecture.html
2025-11-24 22:50:55 +02:00

91 lines
2.7 KiB
HTML

<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8" />
<title>Logical Architecture</title>
<link rel="stylesheet" href="./style.css" />
</head>
<body>
<header>
<h1>Logical Architecture</h1>
<div class="meta">Next.js App Router, Prisma/Postgres, role-based auth, email verification, approvals.</div>
</header>
<main class="grid">
<section class="card">
<h2>Component map</h2>
<div class="diagram">
<pre class="mermaid">
flowchart LR
Browser[Client browser] -->|HTTP/HTTPS| Next[Next.js App Router<br/>SSR/ISR + API routes]
Next --> Prisma[Prisma ORM]
Prisma --> Postgres[(PostgreSQL)]
Next --> Mailer[SMTP mailer<br/>(smtp.sohva.org + DKIM)]
Next --> Storage[Image URLs (remote/bucket)]
Admin[Admin / Moderators] --> Next
Next --> Auth[Auth module<br/>JWT session cookie]
</pre>
</div>
<div class="callout">Edit the Mermaid block above to evolve the architecture.</div>
</section>
<section class="card">
<h2>Domain model</h2>
<div class="diagram">
<pre class="mermaid">erDiagram
USER ||--o{ LISTING : owns
USER ||--o{ LISTING : approves
LISTING ||--|{ LISTINGTRANSLATION : has
LISTING ||--o{ LISTINGIMAGE : has
USER {
string id
string email
string passwordHash
Role role
UserStatus status
datetime emailVerifiedAt
datetime approvedAt
datetime rejectedAt
datetime removedAt
}
LISTING {
string id
ListingStatus status
datetime approvedAt
datetime rejectedAt
datetime removedAt
string country
string region
string city
}
LISTINGTRANSLATION {
string id
string slug
string title
string locale
}
LISTINGIMAGE {
string id
string url
}
</pre>
</div>
</section>
<section class="card">
<h2>Key notes</h2>
<ul>
<li><strong>Web</strong>: Next.js app (App Router), server-rendered pages, client hooks for auth state.</li>
<li><strong>API routes</strong>: Authentication, admin approvals, listings CRUD (soft-delete), profile update.</li>
<li><strong>Data</strong>: Postgres via Prisma (models: User, Listing, ListingTranslation, ListingImage, VerificationToken).</li>
<li><strong>Mail</strong>: SMTP (smtp.sohva.org) + DKIM signing for verification emails.</li>
<li><strong>Auth</strong>: Email/password, verified+approved requirement, JWT session cookie (<code>session_token</code>), roles.</li>
</ul>
</section>
</main>
<script type="module">
import mermaid from 'https://cdn.jsdelivr.net/npm/mermaid@10/dist/mermaid.esm.min.mjs';
mermaid.initialize({ startOnLoad: true, theme: 'dark' });
</script>
</body>
</html>