Molodetz blogrol volgens DPP-template
This commit is contained in:
@@ -0,0 +1,24 @@
|
||||
# API en authenticatie
|
||||
|
||||
Elke route heeft vier gezichten: HTML, JSON, documentatie en (waar geselecteerd) een assistent-tool. Vraag JSON met `Accept: application/json`.
|
||||
|
||||
## Authenticatie
|
||||
|
||||
Volgorde van resolutie:
|
||||
|
||||
1. `session` cookie (64 hex tekens) na inloggen op `/auth/login`.
|
||||
2. `X-API-KEY` header met je API-sleutel.
|
||||
3. `Authorization: Bearer <sleutel>`.
|
||||
4. `Authorization: Basic` met naam of e-mail en wachtwoord.
|
||||
|
||||
Er is geen JWT en geen OAuth.
|
||||
|
||||
## Voorbeeld
|
||||
|
||||
```bash
|
||||
curl -H 'Accept: application/json' https://molodetz.nl/rol
|
||||
```
|
||||
|
||||
## Fouten
|
||||
|
||||
Fouten hebben de vorm `{"error": {"status": 404, "message": "..."}}`. Validatiefouten geven `422` met `{"error": "validation", "fields": [...], "messages": [...]}`.
|
||||
@@ -0,0 +1,18 @@
|
||||
# Architectuur
|
||||
|
||||
FastAPI met Jinja2, server-side gerenderd. SQLite via `dataset`, synchroon en bewust zonder threadpool. Sessies met PBKDF2-SHA256 wachtwoorden.
|
||||
|
||||
## Lagen
|
||||
|
||||
- `molodetz/database/`: één bestand per onderwerp, importeer altijd vanaf de package-root.
|
||||
- `molodetz/routers/`: spiegelt het URL-pad.
|
||||
- `molodetz/services/`: achtergrondservices onder één supervisor met een bestandsslot.
|
||||
- `molodetz/templates/`: één Jinja-omgeving in `templating.py`.
|
||||
|
||||
## Verwijderen
|
||||
|
||||
Alles wordt zacht verwijderd met `deleted_at` en `deleted_by`. Alleen opruimtaken verwijderen hard.
|
||||
|
||||
## Statische bestanden
|
||||
|
||||
Assets lopen via `static_url()`, wat ze versioneert onder `/static/v<versie>/`. Die zijn een jaar onveranderlijk cachebaar.
|
||||
@@ -0,0 +1,14 @@
|
||||
# Back-ups en onderhoud
|
||||
|
||||
Doelen: `database`, `uploads`, `keys`, `full`. Archieven worden gecomprimeerd met zstd of brotli en staan onder `data/backups/`. Alleen de primaire beheerder kan downloaden.
|
||||
|
||||
## CLI
|
||||
|
||||
```bash
|
||||
molodetz backups list
|
||||
molodetz backups run --target database
|
||||
molodetz backups prune --keep 14 --dry-run
|
||||
molodetz system prune --dry-run
|
||||
```
|
||||
|
||||
Het onderhoudsscript `bin/maintenance.sh` draait alle prunes en toont schijfgebruik voor en na.
|
||||
@@ -0,0 +1,13 @@
|
||||
# Beheer en services
|
||||
|
||||
Onder *Beheer, Services* staan alle achtergrondservices. Elke service heeft een overzicht, configuratie en logs. Starten, stoppen, nu draaien en logs wissen zijn databaseschrijfacties waar de service binnen een seconde op reageert.
|
||||
|
||||
| Service | Doel |
|
||||
|---------|------|
|
||||
| presence | publiceert de online-set |
|
||||
| housekeeping | ruimt verlopen sessies op, snoeit het auditlog |
|
||||
| backup | verwerkt de back-upwachtrij en plant automatische back-ups |
|
||||
|
||||
## Onderhoudsmodus
|
||||
|
||||
Zet `maintenance_mode` op `1` onder *Instellingen*. Beheerders blijven alles zien.
|
||||
@@ -0,0 +1,5 @@
|
||||
# Binnenkomen
|
||||
|
||||
Het formulier op [/binnen](/binnen) slaat een aanmelding op: naam, contact, optioneel een link naar je werk en een bericht. Beheerders krijgen een melding en zien de aanmelding onder *Beheer, Aanmeldingen*.
|
||||
|
||||
Er is geen automatische toegang. retoor leest elke aanmelding en neemt zelf contact op.
|
||||
@@ -0,0 +1,5 @@
|
||||
# dp-avatar
|
||||
|
||||
Toont een deterministische SVG-avatar plus presence-stip. Attribuut `seed`, `size`, `uid`.
|
||||
|
||||
Light DOM, geen shadow DOM. Registreert zichzelf met `customElements.define`.
|
||||
@@ -0,0 +1,5 @@
|
||||
# dp-chat
|
||||
|
||||
Eenvoudige log met invoerregel. Geeft een `dp-chat-send` event.
|
||||
|
||||
Light DOM, geen shadow DOM. Registreert zichzelf met `customElements.define`.
|
||||
@@ -0,0 +1,5 @@
|
||||
# dp-code
|
||||
|
||||
Markeert een codeblok met highlight.js en voegt een Kopieer-knop toe.
|
||||
|
||||
Light DOM, geen shadow DOM. Registreert zichzelf met `customElements.define`.
|
||||
@@ -0,0 +1,5 @@
|
||||
# dp-content
|
||||
|
||||
Rendert live markdown aan de clientkant via marked, daarna DOMPurify. Alleen voor live inhoud, zoals het editorvoorbeeld.
|
||||
|
||||
Light DOM, geen shadow DOM. Registreert zichzelf met `customElements.define`.
|
||||
@@ -0,0 +1,5 @@
|
||||
# dp-context-menu
|
||||
|
||||
Klein contextmenu met knoppen, gepositioneerd bij de cursor.
|
||||
|
||||
Light DOM, geen shadow DOM. Registreert zichzelf met `customElements.define`.
|
||||
@@ -0,0 +1,5 @@
|
||||
# dp-dialog
|
||||
|
||||
Bevestigingsdialoog. Formulieren met `data-confirm` lopen hierlangs.
|
||||
|
||||
Light DOM, geen shadow DOM. Registreert zichzelf met `customElements.define`.
|
||||
@@ -0,0 +1,5 @@
|
||||
# dp-lightbox
|
||||
|
||||
Volledig scherm voor afbeeldingen met `data-lightbox`. Escape of klik sluit.
|
||||
|
||||
Light DOM, geen shadow DOM. Registreert zichzelf met `customElements.define`.
|
||||
@@ -0,0 +1,5 @@
|
||||
# dp-title
|
||||
|
||||
Inline-variant van dp-content voor titels.
|
||||
|
||||
Light DOM, geen shadow DOM. Registreert zichzelf met `customElements.define`.
|
||||
@@ -0,0 +1,5 @@
|
||||
# dp-toast
|
||||
|
||||
Host voor korte meldingen. Gebruik `Toast.flash(el, bericht)` of `app.toast(bericht)`.
|
||||
|
||||
Light DOM, geen shadow DOM. Registreert zichzelf met `customElements.define`.
|
||||
@@ -0,0 +1,5 @@
|
||||
# dp-upload
|
||||
|
||||
Sleepvlak voor bestanden. Geeft een `dp-files` event met de gekozen bestanden.
|
||||
|
||||
Light DOM, geen shadow DOM. Registreert zichzelf met `customElements.define`.
|
||||
@@ -0,0 +1,7 @@
|
||||
# Frontend en componenten
|
||||
|
||||
ES6-modules, één klasse per bestand, geen framework en geen bundler. `Application.js` maakt alle singletons aan en zet `window.app`.
|
||||
|
||||
Componenten zijn custom elements met het voorvoegsel `dp-`, zonder shadow DOM. Zie de componentpagina's in de zijbalk.
|
||||
|
||||
Clientrendering met marked en DOMPurify is alleen voor live inhoud: het voorbeeld in de editor. Gepubliceerde berichten worden op de server gerenderd.
|
||||
@@ -0,0 +1,6 @@
|
||||
# Voorwaarden en privacy
|
||||
|
||||
- [Voorwaarden](/voorwaarden)
|
||||
- [Privacy](/privacy)
|
||||
|
||||
Molodetz heeft geen advertenties, geen tracking over apps heen, geen betalingen en geen sociale login.
|
||||
@@ -0,0 +1,17 @@
|
||||
# Schrijven op de rol
|
||||
|
||||
Berichten zijn markdown en staan in SQLite. Alleen beheerders schrijven. Een bericht heeft een titel, een onderwerp (`rol` of `standaard`), een status (`draft` of `published`) en optioneel de markering *placeholder*.
|
||||
|
||||
## Markdown
|
||||
|
||||
De server rendert met GFM: tabellen, doorhalen, harde regeleinden. HTML in de tekst wordt ge-escaped. Links mogen alleen `http`, `https`, `mailto` en `tel` zijn. Emoji schrijf je als `:shortcode:`, bijvoorbeeld `:fire:`.
|
||||
|
||||
Een losse afbeeldings-URL wordt een afbeelding, `@naam` wordt een link naar het profiel.
|
||||
|
||||
## Placeholders
|
||||
|
||||
De eerste notities zijn overgenomen uit de oude Molodetz-pagina en dragen het label *Placeholder*. retoor vervangt ze door eigen verhalen. Haal het vinkje weg bij het bewerken zodra een bericht echt is.
|
||||
|
||||
## Slugs
|
||||
|
||||
Een slug is permanent: titel plus de laatste twaalf tekens van de uid. Bewerken verandert de slug niet.
|
||||
@@ -0,0 +1,15 @@
|
||||
# Welkom bij Molodetz
|
||||
|
||||
Molodetz is een rustige blogrol. Notities over het werk, het afmaken en het oordeel. Deze documentatie beschrijft hoe de site werkt, hoe je de API gebruikt en hoe beheer de boel draaiende houdt.
|
||||
|
||||
## Wat er is
|
||||
|
||||
- **Rol**: korte notities, nieuwste eerst.
|
||||
- **Standaard**: waar Molodetz op staat.
|
||||
- **Flyers** en **Memes**: twee galerijen.
|
||||
- **Mensen**: wie er schrijft.
|
||||
- **Binnen**: het formulier om mee te schrijven.
|
||||
|
||||
## Waar te beginnen
|
||||
|
||||
Lees [Schrijven op de rol](/docs/schrijven) voor de inhoud, [API en authenticatie](/docs/api) voor integraties, en [Architectuur](/docs/architectuur) als je wilt weten hoe het gebouwd is.
|
||||
Reference in New Issue
Block a user