This repository has been archived on 2026-03-24. You can view files and clone it, but you cannot make any changes to it's state, such as pushing and creating new issues, pull requests or comments.
aeticket/docs/task.md
2023-11-21 18:39:46 +01:00

190 lines
No EOL
12 KiB
Markdown

# Projekt "MyTicket.com", `Informationstechnische Projekte 5AHITN 2023 / 2024`
## Aufgabenstellung
Es ist die Managementsoftware für einen Ticketshop zu erstellen.
Ihre Software soll zur Verwaltung von Veranstaltungen und der zugehörigen Vorverkaufstickets verwendet werden.
Es soll möglich sein über einen Administratoraccount unterschiedliche Events zu verwalten (hinzufügen / lesen / aktualisieren / löschen).
Jedes Event hat ein Start- und Enddatum (inkl. Uhrzeit), einen Namen, eine Detailbeschreibung.
Für jedes Event können mehrere Ticketkategorien angelegt werden. Jede Kategorie hat ein bestimmtes Kontingent (Anzahl möglicher Karten) und einen bestimmten Ticketpreis.
> **Beispiel:** Sie erzeugen für die für Ihren Maturaball "Maturaball HTL Steyr 2024" eine Veranstaltung. Veranstaltungsstart ist am 02. März 2024 um 20:00 Uhr.
> Es gibt drei Ticketkategorien: Kategorie A mit einem Kontingent von 500 Karten um 25€ je Ticket, Kategorie B mit einem Kontingent von 500 Karten um 22€ je Ticket und Kategorie C mit einem Kontingent von 350 Karten um 18€ je Ticket.
Über Ihren Ticketshop können sich Endkunden Tickets für Veranstaltungen kaufen.
Um Tickets für eine Veranstaltung zu erwerben, müssen sich Endkunden im Ticketshop mit einem Benutzerkonto registrieren.
Ein registrierter Benutzer kann sich anschließend über die erfassten Benutzerdaten im System anmelden und (womöglich mehrere) Tickets unterschiedlicher Kategorien und unterschiedlicher Veranstaltungen in seinen Warenkorb legen.
Im letzten Schritt (Checkout) wird der Gesamtpreis berechnet und die Zahlung getätigt.
> **Beispiel:** Der Benutzer Peter Rathgeb kauft sich für die Veranstaltung "Maturaball HTL Steyr 2024" zwei Tickets der Kategorie A und ein Ticket der Kategorie B. Zusätzlich erwirbt der Benutzer zwei Tickets der Kategorie B (zu je 12€) für die Veranstaltung "Frühjahrskonzert Schulorchester HTL Steyr".
> Der Gesamtpreis seines Warenkorbs beträgt also 2 x 25€ + 1 x 22€ + 2 x 12€ = 118€
Sollten Tickets der gewählten Kategorie in der gewählten Menge nicht mehr verfügbar sein, so es nicht möglich sein, die Tickets der gewählten Kategorie in den Warenkorb zu legen.
## Umsetzung
Erstellen Sie für den obenstehenden Sachverhalt eine SpringWeb - Anwendung. Erstellen Sie für die Entitäten jeweils eine Model - Klasse (z.B. User, Event, Ticket, ...) in denen Sie die Eigenschaften und die Beziehungen der einzelnen Klassen zueinander abbilden. Diese Model - Klassen sollen über die entsprechenden Repositories und der JPA mit der Datenbank kommunizieren. Erstellen Sie zudem für jede Entity Klasse entsprechende Data-Transfer-Object - Klassen. Außerdem soll die Kommunikation zwischen Controllerendpunkt und Datenbank (Repository) über Service - Klassen gekapselt sein.
__Erstellen Sie für den Admin - Benutzer Endpunkte für folgende Endpunkte:__
* Verwaltung der Veranstaltungen (neu anlegen / bearbeiten / löschen)
* Verwaltung der Ticketkategorien (neu anlegen / bearbeiten / löschen)
* Verwaltung der Benutzer (neu anlegen / bearbeiten / löschen)
__Erstellen Sie für alle anderen Benutzer Endpunkte für folgende Aufgaben:__
* Registrierung eines neuen Benutzers
* Login eines bestehenden Benutzers
* Laden der zukünftigen Veranstaltungen
* Laden der Ticketkategorien einer Veranstaltung
* Tickets zum Warenkorb hinzufügen
* Checkout des Warenkorbs
* Laden der getätigten Bestellungen (inkl. aller Infos wie z.B.
__Schreiben Sie Testfälle (Unit - Tests) für folgende Schnittstellen:__
* Alle Methoden des Cart - Controller (Alle Endpunkte)
* Alle (sinnvollen) Methoden Ihrer Services
* Alle (sinnvollen = selbstgeschriebenen) Methoden Ihrer Repositories
__Dokumentieren Sie alle Endpunkte Ihrer Anwendung (sprindoc)!__
__Testen Sie Ihre Endpunkte über eine im Projekt enthaltene requests.http - Datei.__
Befüllen Sie Ihre Anwendung mit sinnvollen Testdaten (Benutzer, Events, Ticketkategorien eines Events, Bestellungen, ...). Gerne können Sie bei Unklarheiten eigene Annahmen machen.
## docker-compose.yml
```yml
version: '3.8'
services:
database:
container_name: database_myticket
image: mysql:8.0
command: --default-authentication-plugin=mysql_native_password --log_bin_trust_function_creators=1
environment:
MYSQL_ROOT_PASSWORD: rootpwd
MYSQL_DATABASE: myticket
MYSQL_USER: my
MYSQL_PASSWORD: ticket
ports:
- '4306:3306'
volumes:
- ./mysql:/var/lib/mysql
```
## Endpunkte
### Registrierung
* `POST` - Request
* Endpunkt: `/api/v1/user/signup`
* Erfoderliche Daten werden im Requst - Body als JSON - Objekt mitgeschickt.
`{"email":"ratp@htl-steyr.ac.at", "password": "test", "firstname": "Peter", "lastname": "Rathgeb"}`
* Im Erfolgsfall wird der Statuscode `200` / der Accesstoken, der für 10 Minuten gültig ist, zurückgegeben.
* Bei Misserfolg wird der Statuscode `401` zurückgebeben.
### Login
* `POST` - Request
* Endpunkt: `/api/v1/user/signin`
* Erfoderliche Daten werden im Requst - Body als JSON - Objekt mitgeschickt.
`{"email":"ratp@htl-steyr.ac.at", "password": "test"}`
* Im Erfolgsfall wird der Statuscode `200` / der Accesstoken, der für 10 Minuten gültig ist, zurückgegeben.
* Bei Misserfolg wird der Statuscode `401` zurückgebeben.
### Benutzer ändern (nur für Administratoren zugänglich)
* `PUT` - Request
* Endpunkt: `/api/v1/user/update`
* Erforderlicher Token wird als Bearer - Token im Autorizationheader mitgeschickt.
* Erfoderliche Daten werden im Requst - Body als JSON - Objekt mitgeschickt.
`{"id": 1, "name": "Peter Rathgeb", "email": "peter@rathgeb.at"}`
* Im Erfolgsfall wird der Statuscode `200` zurückgegeben.
* Bei Misserfolg wird der Statuscode `400` / `401` zurückgebeben.
### Benutzer löschen (nur für Administratoren zugänglich)
* `DELETE` - Request
* Endpunkt: `/api/v1/user/delete/{id}`
* Erforderlicher Token wird als Bearer - Token im Autorizationheader mitgeschickt.
* Im Erfolgsfall wird der Statuscode `200` zurückgegeben.
* Bei Misserfolg wird der Statuscode `400` / `401` zurückgebeben.
### Benutzerliste laden (nur für Administratoren zugänglich)
* `GET` - Request
* Endpunkt: `/api/v1/user/list`
* Erforderlicher Token wird als Bearer - Token im Autorizationheader mitgeschickt.
* Im Erfolgsfall wird der Statuscode `200` und folgende Daten zurückgegeben: `[{"id": 1, "firstname": "Peter", "lastname": "Rathgeb", "email": "ratp@htl-steyr.ac.at"}, {"id": 2, "firstname": "Max", "lastname": "Musetermann", "email": "max@mustermann.at"}, ...]`
* Bei Misserfolg wird der Statuscode `400` / `401` zurückgebeben.
### Benutzer laden (nur für Administratoren zugänglich)
* `GET` - Request
* Endpunkt: `/api/v1/user/load/{id}`
* Erforderlicher Token wird als Bearer - Token im Autorizationheader mitgeschickt.
* Im Erfolgsfall wird der Statuscode `200` und folgende Daten zurückgegeben: `{"id": 1, "firstname": "Peter", "lastname": "Rathgeb" "email": "ratp@htl-steyr.ac.at"}`
* Bei Misserfolg wird der Statuscode `400` / `401` zurückgebeben.
### Event erzeugen (nur für Administratoren zugänglich)
* `POST` - Request
* Endpunkt: `/api/v1/event/create`
* Erforderlicher Token wird als Bearer - Token im Autorizationheader mitgeschickt.
* Erfoderliche Daten werden im Requst - Body als JSON - Objekt mitgeschickt.
`{"name": "Maturaball HTL Steyr 2024", "from": "02.03.2024 20:00", "to": "03.03.2024 05:00", "description": "Maturaball der Abteilungen EL, IT, ME, Y", "ticketCategories": [{"name": "A", "price": 25, "stock": 500}, {"name": "B", "price": 22, "stock": 500}, {"name": "C", "price": 18, "stock": 300}]}`
* Im Erfolgsfall wird der Statuscode `200` zurückgegeben.
* Bei Misserfolg wird der Statuscode `400` / `401` zurückgebeben.
### Event ändern (nur für Administratoren zugänglich)
* `PUT` - Request
* Endpunkt: `/api/v1/event/update`
* Erforderlicher Token wird als Bearer - Token im Autorizationheader mitgeschickt.
* Erfoderliche Daten werden im Requst - Body als JSON - Objekt mitgeschickt.
`{"id": 1, "name": "Maturaball HTL Steyr 2024", "from": "02.03.2024 19:00", "to": "03.03.2024 05:00", "description": "Bester Ball der HTL Steyr", "ticketCategories": [{"id": 1, "name": "A", "price": 26, "stock": 550}, {"id": 2, "name": "B", "price": 22, "stock": 500}, {"id": 3, "name": "C", "price": 18, "stock": 300}]}`
* Im Erfolgsfall wird der Statuscode `200` zurückgegeben.
* Bei Misserfolg wird der Statuscode `400` / `401` zurückgebeben.
### Event löschen (nur für Administratoren zugänglich)
* `DELETE` - Request
* Endpunkt: `/api/v1/event/{id}`
* Erforderlicher Token wird als Bearer - Token im Autorizationheader mitgeschickt.
* Im Erfolgsfall wird der Statuscode `200` zurückgegeben.
* Bei Misserfolg wird der Statuscode `400` / `401` zurückgebeben.
### Event laden
* `GET` - Request
* Endpunkt: `/api/v1/event/{id}`
* Erforderlicher Token wird als Bearer - Token im Autorizationheader mitgeschickt.
* Im Erfolgsfall wird der Statuscode `200` und folgende Daten zurückgegeben: `{"id": 1, "name": "Maturaball HTL Steyr 2024", "from": "02.03.2024 19:00", "to": "03.03.2024 05:00", "description": "Bester Ball der HTL Steyr", "ticketCategories": [{"id": 1, "name": "A", "price": 25, "stock": 500}, {"id": 2, "name": "B", "price": 22, "stock": 500}, {"id": 3, "name": "C", "price": 18, "stock": 300}]}`
* Bei Misserfolg wird der Statuscode `400` / `401` zurückgebeben.
### Zukünftige Events laden
* `GET` - Request
* Endpunkt: `/api/v1/event/list`
* Erforderlicher Token wird als Bearer - Token im Autorizationheader mitgeschickt.
* Im Erfolgsfall wird der Statuscode `200` und folgende Daten zurückgegeben: `[{"id": 1, "name": "Maturaball HTL Steyr 2024", "from": "02.03.2024 19:00", "to": "03.03.2024 05:00", "description": "Bester Ball der HTL Steyr", "ticketCategories": [{"id": 1, "name": "A", "price": 2, "stock": 500}, {"id": 2, "name": "B", "price": 22, "stock": 500}, {"id": 3, "name": "C", "price": 18, "stock": 300}]}, {"id": 1, "name": "Frühjahrskonzert der HTL Steyr", "from": "09.04.2024 19:00", "to": "09.04.2024 21:00", "description": "Konzert des Schulorchestersr", "ticketCategories": [{"id": 4, "name": "A", "price": 12, "stock": 50}, {"id": 5, "name": "B", "price": 10, "stock": 50}, {"id": 6, "name": "C", "price": 8, "stock": 50}]}]`
* Bei Misserfolg wird der Statuscode `400` / `401` zurückgebeben.
### Tickets zum Warenkorb hinzufügen
* `POST` - Request
* Endpunkt: `/api/v1/cart/add`
* Erforderlicher Token wird als Bearer - Token im Autorizationheader mitgeschickt.
* Erfoderliche Daten werden im Requst - Body als JSON - Objekt mitgeschickt.
`{"id": 1, cartEntries: [{"id": 1, "amount": 2}, {"id": 2, "amount": 1}]}`
* Im Erfolgsfall wird der Statuscode `200` zurückgegeben.
* Bei Misserfolg wird der Statuscode `400` / `401` zurückgebeben.
### Warenkorb laden
* `GET` - Request
* Endpunkt: `/api/v1/cart/list`
* Erforderlicher Token wird als Bearer - Token im Autorizationheader mitgeschickt.
* Im Erfolgsfall wird der Statuscode `200` und folgende Daten zurückgegeben: `[{"id": 1, "name": "Maturaball HTL Steyr 2024", "from": "02.03.2024 19:00", "to": "03.03.2024 05:00", "description": "Bester Ball der HTL Steyr", "cartEntries": [{"id": 1, "name": "A", "price": 25, "amount": 2}, {"id": 2, "name": "B", "price": 22, "amount": 1}]}, {"id": 2, "name": "Frühjahrskonzert der HTL Steyr", "from": "09.04.2024 19:00", "to": "09.04.2024 21:00", "description": "Konzert des Schulorchestersr", "cartEntries": [{"id": 4, "name": "A", "price": 12, "amount": 2}]}]`
* Bei Misserfolg wird der Statuscode `400` / `401` zurückgebeben.
### Tickets kaufen
* `POST` - Request
* Endpunkt: `/api/v1/cart/checkout`
* Erforderlicher Token wird als Bearer - Token im Autorizationheader mitgeschickt.
* Im Erfolgsfall wird der Statuscode `200` und der Gesamtpreis zurückgegeben: `{"price": 118}`
* Anschließend wird eine Bestellung erzeugt und der Warenkorb für den Benutzer geleert.
* Bei Misserfolg wird der Statuscode `400` / `401` zurückgebeben.
## Abgabe
Abgabe ist am 20.12.2023 am Ende der Stunde (um 09:40 Uhr).
Abgabe: Projektverzeichnis
Abgabeverzeichnis: `H:\Abgabe\ITP\MyTicket`
Für verspätete Abgaben gilt: Pro Tag Verspätung -> ein Notengrad schlechter.