# ProostenKrant 3.0 — Blazor De ProostenKrant is een webkrant van en voor de familie Proosten: familieleden leveren artikelen in via de website, de redactie publiceert ze per seizoeneditie en drukt de krant als PDF via LaTeX. Deze versie vervangt de PHP/MySQL-applicatie door een **Blazor Server**-applicatie (.NET 10) met dezelfde database en hetzelfde LaTeX-krantenontwerp. ## Architectuur | Onderdeel | Keuze | |---------------|---------------------------------------------------| | Framework | Blazor Web App (static SSR, geen JavaScript nodig) | | Database | MySQL 8 (zelfde schema als voorheen, Dapper) | | Authenticatie | Cookie-auth met universeel wachtwoord + paszin | | PDF-generatie | LaTeX (`newspaper`-pakket) aangeroepen vanuit .NET | | Hosting | Docker Compose: `app` (Blazor + texlive) + `mysql`| **Waarom Blazor Server en niet WebAssembly?** De applicatie is servergebonden: MySQL-toegang, bestandsuploads en LaTeX-compilatie gebeuren allemaal op de server. Met WASM zou je een aparte REST-API met token-authenticatie moeten bouwen en dezelfde werkzaamheden toch op de server doen. Server-side rendering is bovendien sneller voor een kleine gebruikersgroep en werkt zonder JavaScript. **Waarom LaTeX en niet een .NET PDF-bibliotheek?** .NET kan goede PDF's genereren (bijv. met QuestPDF, gratis Community-licentie), maar echte krantenzetting — automatische tekstverdeling over drie kolommen, microtype, woordafbreking, kopbalancering — is waar TeX in uitblinkt. De krant blijft daarom met LaTeX gedrukt, nu aangestuurd vanuit .NET. ## Snel starten ```bash docker compose up -d --build ``` Regressietest (draait tegen de draaiende stack; maakt testartikelen en drukt een proefeditie): ```bash scripts/e2e-test.sh ``` Daarna: - Website: http://localhost:8080 - Inloggen redactie: kies je naam + universel wachtwoord (standaard `ProostenKrant2024!`, via `UNIVERSAL_PASSWORD` in `.env`) - Paszin voor inzendingen: hetzelfde wachtwoord De eerste build duurt lang (de texlive-installatie is ±2 GB). Daarna cachet Docker de LaTeX-laag: **hertesten vraagt geen herinstallatie meer**, zolang je niet `--no-cache` gebruikt. ## Gebruik | Route | Doel | |------------------------------|---------------------------------------------------| | `/` | Voorpagina (krantenstijl) | | `/indienen` | Artikel inleveren via paszin | | `/indienen/bewerken` | Kladartikel bewerken (alleen de schrijver) | | `/archief` | Gedrukte edities + gepubliceerde artikelen | | `/login` | Redactie-login | | `/dashboard` | Overzicht, statistieken, krant drukken | | `/artikelen`, `/artikelen/nieuw`, `/artikelen/{id}` | Artikelbeheer (redactie) | | `/seizoenen`, `/seizoenen/{id}` | Edities drukken (redactie) | | `/edities/{bestand}` | PDF-download | Werkstroom: familie dient in via `/indienen` (status *klad*) → redactie publiceert via `/artikelen/{id}` → redactie drukt de editie via `/seizoenen` of `/dashboard`. ## Projectstructuur ``` proostenkrant.net/ ├── src/ProostenKrant/ # Blazor-applicatie │ ├── Components/Pages/ # Alle pagina's (Razor, static SSR) │ ├── Services/ # Db, ArticleService, LatexService, auth, uploads │ └── wwwroot/ # css, fonts, EU-vlag, uploads (volume-mounted) ├── deploy/ │ ├── Dockerfile # Build + runtime met texlive (gecachete laag) │ └── mysql/init.sql # Database-initialisatie ├── compose.yml # app + mysql stack ├── app/ # (legacy) PHP-versie — niet verwijderd, zie hieronder └── Latex/ # (legacy) origineel krantenontwerp ter referentie ``` De artikel- en profielfoto's uit de PHP-versie worden hergebruikt via volumes: `app/public/images/articles` en `app/public/images/profiles` worden gekoppeld aan de uploadmappen van de Blazor-app. De gedrukte PDF's landen in `app/storage/latex`. De Europese vlag in de voettekst is een SVG (`src/ProostenKrant/wwwroot/images/european-flag.svg`) volgens de officiële specificaties (12 gouden sterren, cirkelradius ⅓ van de hoogte). ## Deployen op een server 1. Vereiste: Docker + Docker Compose op de server. 2. Clone de repository en zet in `.env` een **sterk wachtwoord** voordat je live gaat: - `UNIVERSAL_PASSWORD` — inlogwachtwoord én paszin (standaard `ProostenKrant2024!`) - `DB_PASSWORD` / `MYSQL_ROOT_PASSWORD` — database (`MYSQL_ROOT_PASSWORD` staat in `compose.yml`) 3. Start: `docker compose up -d --build` — de database wordt automatisch geïnitialiseerd (users incl. Kevin, Luc en Tilde; seizoenen). 4. Zet eventueel een reverse proxy met HTTPS (Caddy/nginx) voor `http://server:8080`. Overweeg de MySQL-poort (`3306`) dicht te zetten in `compose.yml` als de database niet van buitenaf benodigd is. 5. Backups: `resources/` (repo), `app/public/images/` (foto's) en de mysql-data volume bevatten alles; `docker compose down -v` verwijdert de data definitief. De eerste build installeert texlive eenmalig (±2 GB, enkele minuten); daarna pakken Docker-lagen alles en duurt een rebuild seconden. ## Configuratie Omgevingsvariabelen (of `.env`): - `DB_HOST`, `DB_NAME`, `DB_USER`, `DB_PASSWORD` — database (standaard `mysql`/`proostenkrant`) - `UNIVERSAL_PASSWORD` — inlogwachtwoord en paszin (standaard `ProostenKrant2024!`) ## Legacy PHP-versie De oude PHP-applicatie staat nog in `app/` en is niet verwijderd; de oude `docker-compose`-bestanden zijn verplaatst naar `legacy/` zodat Compose automatisch de Blazor-stack (`compose.yml`) pakt. Zodra de Blazor-versie goedgekeurd is, kunnen `app/`, `docker/` en `legacy/` worden opgeruimd.