Skip to content

RiciYT/M223-Terminkalender

Repository files navigation

M223 Terminkalender

Abschlussprojekt Modul 223 - Multiuser-Applikationen objektorientiert realisieren

📋 Übersicht

Reservationssystem für Sitzungs- und Veranstaltungsräume (Zimmer 101-105) mit vollständiger CRUD-Funktionalität und schlüsselbasierter Zugriffskontrolle.

✨ Features

Kernfunktionalität

  • Reservierung erstellen: Formular mit umfassender Validierung
  • Reservierung bearbeiten: Mit Private Key autorisiert
  • Reservierung löschen: Mit Confirmation Dialog
  • Reservierung anzeigen: Public Key (Read-Only) oder Private Key (Full Access)

Sicherheit

  • 🔐 Public Key: Lesezugriff für Teilnehmer
  • 🔑 Private Key: Vollzugriff zum Bearbeiten/Löschen
  • 🔒 Kryptographische Schlüsselgenerierung: SecureRandom mit Base64 Encoding
  • Autorisierung: Jeder Edit/Delete Request validiert Private Key

Validierung

  • ✅ Zimmernummer: 101-105
  • ✅ Bemerkung: 10-200 Zeichen Pflicht
  • ✅ Zeitbereich: Start < End, beide in Zukunft
  • ✅ Zimmerkonfliktprüfung: Keine überlappenden Reservierungen
  • ✅ Teilnehmer: Nur Buchstaben (inkl. Umlaute) erlaubt

🚀 Quick Start

Voraussetzungen

  • Java 17+
  • Maven 3.6+

Anwendung starten mit 🐳 Docker (MySQL Database)

Das Projekt enthält eine Docker Compose Konfiguration für eine MySQL Datenbank.

Voraussetzungen

  • Docker Desktop oder Docker Engine installiert
  • Docker Compose installiert

MySQL Datenbank starten

  1. Optional: Umgebungsvariablen setzen (via .env oder direkt in Compose):

    • Du kannst eine .env Datei im Projektroot anlegen, z. B.:
      MYSQL_ROOT_PASSWORD=rootpassword
      MYSQL_DATABASE=reservations
      MYSQL_USER=reservation_user
      MYSQL_PASSWORD=change-me
      MYSQL_PORT=3306
      
    • Ohne .env werden die in docker-compose.yml hinterlegten Standardwerte verwendet.
  2. Docker Container starten:

    docker compose up -d
  3. Status prüfen:

    docker compose ps
    docker compose logs mysql
  4. Anwendung starten:

    ./mvnw spring-boot:run

    Die Anwendung nutzt die MySQL-Konfiguration aus application.properties.

Nützliche Docker Befehle

  • Container stoppen: docker compose down
  • Container stoppen und Daten löschen: docker compose down -v
  • Logs anzeigen: docker compose logs -f mysql
  • MySQL Console öffnen: docker compose exec mysql mysql -u reservation_user -p reservations

Standard-Konfiguration

  • Host: localhost
  • Port: 3306
  • Database: reservations
  • User: reservation_user
  • Password: change-me (änderbar in .env)

🏗️ Technologie-Stack

  • Framework: Spring Boot 3.5.7
  • Java Version: 17
  • Build Tool: Maven
  • Datenbank: MySQL 8.0+ (via Docker Compose) / H2 (In-Memory für Tests)
  • Template Engine: Thymeleaf
  • Persistenz: Spring Data JPA
  • Validierung: Jakarta Bean Validation
  • Testing: JUnit 5

📂 Projektstruktur

M223-Terminkalender/
├── src/
│   ├── main/
│   │   ├── java/com/example/reservations/
│   │   │   ├── model/              # JPA Entities
│   │   │   ├── repository/         # Data Access Layer
│   │   │   ├── service/            # Business Logic
│   │   │   ├── web/                # Controllers
│   │   │   │   └── dto/            # Data Transfer Objects
│   │   │   └── config/             # Configuration
│   │   └── resources/
│   │       ├── templates/          # Thymeleaf Templates
│   │       └── application.properties
│   └── test/
│       └── java/                   # Unit Tests (19 Tests)
├── Doku/
│   ├── Projektdokumentation in Markdown.md
│   ├── Projektdokumentation PDF Abgabe.md
│   ├── Projektauftrag.pdf                      # Projektauftrag (Referenz)
│   ├── diagrams/                                # UML Diagramme
│   │   ├── Zustandsdiagramm Bild.png
│   │   ├── Entity-Relationship-Diagramm Bild.png
│   │   └── UML-Klassendiagramm Bild.png
│   └── sql/
│       ├── schema-example.sql
│       └── seed-data-example.sql
├── docker-compose.yml
├── init.sql
├── pom.xml
└── README.md

🎯 API Endpoints

Public Endpoints

  • GET / - Startseite mit Reservationsübersicht
  • GET /access?key={key} - Zugriff per Public/Private Key
  • GET /reservations/new - Neues Reservationsformular
  • POST /reservations - Reservation erstellen

Protected Endpoints (Public Key)

  • GET /reservations/{id}/public - Public View (Read-Only)

Protected Endpoints (Private Bereich)

  • GET /reservations/{id}/private?authorized=true&key={privateKey} - Private View (voller Zugriff via Private Key)
  • GET /reservations/{id}/private?code={accessCode} - Private View (eingeschränkter Zugriff via Zugangscode)
  • GET /reservations/{id}/edit?key={privateKey} - Edit Formular
  • POST /reservations/{id}?key={privateKey} - Reservation aktualisieren
  • POST /reservations/{id}/delete?key={privateKey} - Reservation löschen

🔑 Verwendung

1. Reservation erstellen

  1. Navigiere zu http://localhost:8080
  2. Klicke auf "Create Reservation"
  3. Fülle das Formular aus:
    • Titel, Location, Zimmer (101-105)
    • Bemerkung (10-200 Zeichen)
    • Startzeit und Endzeit (in der Zukunft)
    • Teilnehmer (kommagetrennt)
    • Access Type (PUBLIC/PRIVATE)
  4. Nach Erstellen erhältst du:
    • Public Key: Für Teilnehmer
    • Private Key: Für dich (Edit/Delete)

2. Reservation ansehen

Mit Public Key:

  • Gib Public Key auf Startseite ein
  • Zeigt Read-Only View

Mit Private Key:

  • Gib Private Key auf Startseite ein
  • Zeigt Management View mit Edit/Delete Buttons

3. Reservation bearbeiten

  1. Öffne Private View mit Private Key
  2. Klicke "Edit Reservation"
  3. Ändere Daten im Formular
  4. Speichere mit "Update Reservation"

4. Reservation löschen

  1. Öffne Private View mit Private Key
  2. Klicke "Delete Reservation"
  3. Bestätige im Dialog
  4. Reservation wird permanent gelöscht

👥 Team

  • Ricardo Santos Lopes — Projektleiter
  • Mathias Bäumli — Teampartner
  • Imad Chatila — Teampartner

Details siehe: Doku/Projektdokumentation_M223_KOMPLETT.md → Abschnitt "10. Projektteam und Mitwirkende"

📄 Lizenz

Projekt für Bildungszwecke im Rahmen des Moduls 223.

About

Abschlussprojekt Modul 223 Multiuser-Applikationen objektorientiert realisieren

Resources

Stars

Watchers

Forks

Contributors