====== LB03 – Projektarbeit: Backend-API mit Node.js/Express + MySQL ======
===== Einleitung =====
In den ersten zwei Dritteln des Moduls M290 haben Sie sich intensiv mit relationalen Datenbanken, SQL (DDL, DML, DCL), ERM/ERD, Tabellenbeziehungen, JOINs und Aggregatfunktionen beschäftigt.
In der dritten und letzten Leistungsbeurteilung (LB03) verknüpfen Sie dieses Wissen mit einem Backend-Server: Sie implementieren einen Node.js/Express-Server, der über eine REST-API auf Ihre MySQL-Datenbank zugreift. Ein Frontend wird nicht programmiert – stattdessen simulieren Sie es mit Postman.
**Wichtig:** Das Erklärvideo (Screencast) ist Teil der Leistung.
Beide Lernenden müssen darin vorkommen und jeweils einen Teil von Setup/Code verständlich erklären.
===== Rahmenbedingungen =====
* **Sozialform:** Partnerarbeit (2er-Team)
* **Zeit:** ca. 7 Lektionen Projektzeit im Unterricht (Inputs jeweils zu Beginn der Lektion)
* **Abgabe:** Letzter Unterrichtstag des Semesters, **21:00 Uhr**
* **Benotung:** Lineare Notenskala (siehe unten)
===== Auftrag =====
Sie wählen im 2er-Team **einen** der beschriebenen Use Cases aus (pro Klasse: jedes Thema nur einmal).
Zu diesem Use Case entwickeln Sie:
* ein sauberes Datenmodell (ERM/ERD),
* eine passende MySQL-Datenbank mit Startdaten und einem AppUser,
* einen Express-Server, der die wichtigsten Funktionen als CRUD-API bereitstellt,
* ein Video-Tutorial (Screencast) von ca. 15 Minuten, in dem Sie Ihre Lösung erklären und demonstrieren.
Zielpublikum des Tutorials sind Ihre Mit-Auszubildenden aus dem 2. Lehrjahr, die die Themen
* Daten & Datenbanken,
* Zugriff auf Daten in einer 3-Schichten-Architektur (Client – Server – Datenbank),
* CRUD-Operationen in SQL und über eine REST-API besser verstehen sollen.
===== Anforderungen (MUSS) =====
**Mindestanforderungen (MUSS)**
* Backend läuft (Start über ''npm run dev'' oder ''npm start'' oder ''node index.js'')
* Mindestens **2 Tabellen** in MySQL (mit PK/FK)
* Mindestens **eine API-Ressource** (z.B. ''/api/serien'')
* **CRUD** vollständig über REST nachweisbar: ''GET'', ''POST'', ''PUT'', ''DELETE''
* Mindestens **eine JOIN-Route** (Daten aus 2 Tabellen)
* Mindestens **eine Aggregat-Route** (COUNT/AVG/SUM/MIN/MAX mit GROUP BY)
* Zugriff auf DB **nicht** als ''root'', sondern über einen **AppUser** (Least Privilege)
* Video-Tutorial, wo alle Team-Mitglieder darin vorkommen und einen Teil erklären.
===== Inhalt des Video-Tutorials (Screencast, ca. 15 Minuten) =====
Das Video soll strukturiert und nachvollziehbar sein und mindestens folgende Teile enthalten:
- **Einleitung**
- Kurzvorstellung des Use Cases (Problem / Idee)
- Was Ihre App grob können soll
- **Analyse & Datenmodell**
- Erklärung des ERM (Entitäten, Beziehungen, Kardinalitäten)
- Erklärung des ERD in Crow’s-Foot-Notation (Tabellen, PK/FK, Datentypen)
- **Datenbank**
- Anlegen der Datenbank & Tabellen per SQL-Skript/Befehlen (DDL)
- Import der Startdaten per SQL-Skript/Befehlen (DML)
- Anlegen und Berechtigen eines AppUsers (DCL) + kurzer Hinweis, warum diese Rechte sinnvoll sind
- **Backend / Server**
- Aufbau des Node.js/Express-Projekts (wichtigste Dateien kurz erklären: ''index.js'', ''package.json'')
- Erklärung der wichtigsten Routen (z.B. ''GET /api/…'', ''POST /api/…'')
- **Tests mit Postman**
- Vorführen der CRUD-Endpunkte (Create, Read, Update, Delete)
- dabei **zeigen**, dass sich die Daten in der Datenbank wirklich ändern (WebStorm DB-Plugin)
- mindestens **eine JOIN-Demo**
- mindestens **eine Aggregat-Demo**
- sinnvolle HTTP-Statuscodes (z.B. 200, 201, 400, 404, 500)
- **Reflexion**
- Jede Person nennt mindestens **2 Learnings** (positiv / herausfordernd)
- Was würden Sie beim nächsten Mal anders machen?
- **Schluss**
- Kurze Zusammenfassung Ihrer Lösung
- Ausblick / mögliche Erweiterungen
**Wichtig für die Bewertung des Verständnisses**
* Beide Teammitglieder müssen im Video **hörbar** sein (eigene Erklärung, nicht nur „ja genau“).
* Beide müssen je einen **eigenen Teil** erklären (z.B. Person A: DB/SQL/DCL, Person B: API-Routen/Postman/Statuscodes).
* Sie müssen während dem Video zeigen, dass Sie Ihren eigenen Code verstehen (Warum dieser Endpoint? Warum dieser JOIN? Was bedeutet ''req.params.id''?).
===== Abgabe – zu liefernde Lernprodukte (ZIP in Moodle) =====
Im ZIP-File müssen enthalten sein:
- **Video-Tutorial** (ca. 15 Min)
* Format: MP4 (H.264), max. FullHD (1920×1080), min. 1280×720
* Max. Grösse: 1 GB (Bitrate ca. 3000–5000 kbps)
- **ERM und ERD** als PDF-Datei
- **SQL-Skript (DDL)**: Anlegen der Tabellenstruktur (Als PDF/Word oder ''.sql''-File)
- **SQL-Skript (DML)**: Import / Insert der Startdaten (Als PDF/Word oder ''.sql''-File)
- **SQL-Skript (DCL)**: AppUser erstellen + Rechte vergeben (Als PDF/Word oder ''.sql''-File))
- **Datenbank-Dump**: vollständiges SQL-File (Struktur + Daten) zum Wiederherstellen (''.sql''-File)
- **Node.js-Projektordner**
* ''package.json''
* Server-Datei(en) (z.B. ''index.js'', ''connect.js'')
**Reproduzierbarkeit:** Ihr Projekt muss auf einem anderen Rechner mit Ihren Skripten nachvollziehbar eingerichtet werden können.
===== Bewertungsraster (100 Punkte) =====
^ Bereich ^ Max. Punkte ^ Voll erfüllt ^ Teilweise erfüllt ^ Nicht erfüllt ^
| **1. Projekt-Setup & Reproduzierbarkeit** | **8** | Start/Setup klar (alle Dateien sind vorhanden und ausführbar), Server startet zuverlässig, Abgabe sauber strukturiert | Läuft grundsätzlich, aber Setup unklar/fehleranfällig | Start nicht möglich / unvollständig |
| **2. Datenmodell (ERM/ERD)** | **12** | Entitäten/Beziehungen korrekt, PK/FK nachvollziehbar, Kardinalitäten stimmen | Modell vorhanden, aber Lücken/FK/Kardinalitäten unklar | Kein brauchbares Modell |
| **3. MySQL-Implementierung (DDL + Datentypen + Constraints)** | **10** | DDL ausführbar, Datentypen sinnvoll, PK/FK korrekt, Constraints passend | DDL vorhanden, aber Mängel bei Datentypen/Keys/Constraints | Nicht ausführbar / unpassend |
| **4. Startdaten (DML)** | **6** | Mehrere realistische Datensätze, gut testbar | Wenige/teilweise unpassende Daten | Keine Startdaten |
| **5. AppUser & Rechte (DCL, Least Privilege)** | **6** | AppUser funktioniert, Rechte minimal sinnvoll, keine ''root''-Nutzung | AppUser vorhanden, aber Rechte unklar/zu breit | Kein AppUser / root verwendet |
| **6. API Design & Struktur** | **8** | Konsistente Pfade (''/api/...''), sinnvolle Ressourcen, ''/:id'' korrekt | Routen vorhanden, aber inkonsistent/unsauber | Unklar/chaotisch |
| **7. CRUD über Backend → MySQL** | **15** | ''GET/POST/PUT/DELETE'' funktionieren, DB ändert sich sichtbar, SQL sauber | CRUD teilweise fehlerhaft/unvollständig | CRUD nicht nachweisbar |
| **8. JOIN-Route** | **6** | Mindestens eine Route mit JOIN, Ergebnis sinnvoll | JOIN vorhanden, aber Ergebnis unklar/falsch | Kein JOIN |
| **9. Aggregat-Route (GROUP BY)** | **6** | Mindestens eine Aggregat-Route korrekt (COUNT/AVG/SUM etc.) | Aggregat vorhanden, aber unklar/falsch | Kein Aggregat |
| **10. Validierung, Fehlerbehandlung, HTTP-Statuscodes** | **8** | 400/404/500 sinnvoll, Pflichtfelder geprüft, verständliche Fehlermeldungen | Teilweise vorhanden, teils falsche Codes | Keine Validierung/Fehlerhandling |
| **11. Video-Tutorial (Screencast) & Verständnisnachweis** | **15** | Struktur klar, beide erklären aktiv, Demo mit Postman + DB sichtbar, reflektiert | Video vorhanden, aber unklar/zu kurz/Teamanteil ungleich | Kein Video / Verständnis nicht nachweisbar |
**Eigenleistung / Verständnis**
Sie müssen Ihre Lösung erklären können (SQL, Datenmodell, API, Tests).
Wenn zentrale Teile nicht fachlich korrekt begründet werden können, kann der entsprechende Bereich mit **0 Punkten** bewertet werden.
**Verspätete Abgaben**
Geben Sie die Projektarbeit verspätet ab, wird pro 24h-Verspätung eine ganze Note abgezogen.
**Die Projektarbeit ist der dritte Teil der Modulnote** und daher __nicht optional__. Bei Nicht-Abgabe (ohne Dispens/ärztliches Zeugnis) wird die Note 1 eingetragen.
===== Notenberechnung (lineare Skala) =====
**Note = 1.0 + 5.0 × (Punkte / 100)**
(Beispiel: 80 Punkte → 1.0 + 5.0 × 0.80 = 5.0)