GHB Merch
Oficiální e-shop pro školní merch Gymnázia Havlíčkův Brod
Autor: Jakub Jakůbek
Předmět: Informatika
Cíl a motivace projektu
- Nahradit neefektivní ruční procesy při objednávání školního oblečení.
- Vytvořit webovou aplikaci pro studenty i zaměstnance s integrovaným katalogem.
- Umožnit sběr zakázek do hromadných objednávek (tzv. batches) kvůli naplnění minimálního počtu kusů.
- Digitalizovat výdej hotového merche s vysokou mírou zabezpečení.
Klíčové funkce aplikace
- Katalog a košík: Procházení barev, velikostí a správa košíku v localStorage.
- Lifecycle objednávky: Od "pending_batch" až po status "completed".
- Automatické e-maily: Upozornění na změny stavů přes Gmail SMTP šablony (Nodemailer).
- Admin panel: Kompletní CMS pro správu položek a řešení žádostí o změnu (storno/úpravy).
Autentizace a přístupy
Zabezpečení zajišťuje moderní knihovna better-auth.
- Microsoft SSO: Bezpečné přihlášení výhradně přes školní účty v tenantu @ghb.cz.
- Zákaz manuální registrace pomocí emailu a hesla pro školní doménu (prevence duplicit).
- Systém 3 rolí: User, Admin, Superadmin.
- Server hooks (middleware) plně chrání neveřejné routy a ověřují oprávnění na backendu.
Architektura a Tech Stack
- Frontend & Backend: SvelteKit 2.x, TypeScript 5.x, Node.js 24.
- Databáze: PostgreSQL 16 mapovaná přes Drizzle ORM.
- Reverse Proxy: Caddy 2 (automatické HTTPS a servírování statických dat).
Prohlížeč ---> Caddy ---> SvelteKit <---> PostgreSQL
(klient) (proxy) (Node.js) (DB)
|
[Uploads AVIF]
Optimalizace multimédií
Vlastní pipeline pro zpracování obrázků přímo na serveru:
- Každý nahrávaný soubor projde výpočtem SHA-256 hashe pro deduplikaci a úsporu místa (early exit).
- Následuje proces knihovnou Sharp: Resize a tvrdá konverze do úsporného formátu AVIF.
- Pro maximální výkon servíruje obrázky přímo Caddy (proxy) s agresivním cachováním, čímž ulevuje Node.js serveru.
Kryptografie a QR výdej
Při vydávání velkého množství merche hrozí podvody s objednávkami. Řešení:
- Pro každou objednávku vygeneruje server dynamický QR kód.
- V něm je zakódován elektronický podpis vypočítaný metodou HMAC SHA-256 pomocí serverového secret klíče.
- Administrátor z webu spustí čtečku, naskenuje žákův mobil a systém podvržené kódy automaticky ihned zamítne.
Modelování dat a Databáze
- Centrem návrhu je robustní relační schéma v PostgreSQL.
- Uchovávání historických snapshotů (jméno, e-mail, barva, cena položky) v tabulce `order_items` místo cizích klíčů – změna nebo smazání produktu v budoucnu nenaruší účetnictví starých objednávek.
- Použití nativních databázových ENUM typů pro stavové automaty a strukturovaných JSONB formátů pro velikosti.
Docker a Produkční Nasazení
- Projekt je plně kontejnerizován pro snadné zprovoznění bez instalace závislostí na serveru.
- Základem je soubor
docker-compose.prod.yml pro síťování oddělených služeb.
- Sdílené Docker Volumes se starají o perzistenci databáze a nahraných obrázků.
- Aplikace implementuje vlastní barevný HTTP Logger, což zjednodušuje debugging a monitoring provozu.
Děkuji za pozornost!
Aplikace spolehlivě běží v produkci.
Nyní je prostor pro vaše dotazy.