diff --git a/.gitignore b/.gitignore
index 549e00a..3256422 100644
--- a/.gitignore
+++ b/.gitignore
@@ -31,3 +31,6 @@ build/
### VS Code ###
.vscode/
+
+### Custom ###
+db/mysql
\ No newline at end of file
diff --git a/docs/task.html b/docs/task.html
new file mode 100644
index 0000000..fcb1f72
--- /dev/null
+++ b/docs/task.html
@@ -0,0 +1,196 @@
+
Projekt "MyTicket.com", Informationstechnische Projekte 5AHITN 2023 _ 2024.md
+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
+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":"[email protected]", "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":"rat[email protected]", "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": "[email protected]"}
+- 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": "[email protected]"}, {"id": 2, "firstname": "Max", "lastname": "Musetermann", "email": "[email protected]"}, ...]
+- 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": "[email protected]"}
+- 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.
+
\ No newline at end of file
diff --git a/docs/Angabe.md b/docs/task.md
similarity index 94%
rename from docs/Angabe.md
rename to docs/task.md
index 774f847..4a414d6 100644
--- a/docs/Angabe.md
+++ b/docs/task.md
@@ -162,7 +162,7 @@ services:
* 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, tickets: [{"id": 1, "amount": 2}, {"id": 2, "amount": 1}]}`
+ `{"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.
@@ -170,7 +170,7 @@ services:
* `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", "tickets": [{"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", "tickets": [{"id": 4, "name": "A", "price": 12, "amount": 2}]}]`
+ * 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
diff --git a/src/main/java/me/jweissen/aeticket/controller/EventController.java b/src/main/java/me/jweissen/aeticket/controller/EventController.java
new file mode 100644
index 0000000..04b0224
--- /dev/null
+++ b/src/main/java/me/jweissen/aeticket/controller/EventController.java
@@ -0,0 +1,45 @@
+package me.jweissen.aeticket.controller;
+
+import me.jweissen.aeticket.dto.request.EventRequestDto;
+import me.jweissen.aeticket.dto.request.EventUpdateRequestDto;
+import me.jweissen.aeticket.dto.response.EventResponseDto;
+import me.jweissen.aeticket.service.EventService;
+import org.springframework.http.HttpStatus;
+import org.springframework.http.ResponseEntity;
+import org.springframework.web.bind.annotation.*;
+
+@RestController
+@RequestMapping("/event")
+public class EventController {
+ private final EventService eventService;
+
+ public EventController(EventService eventService) {
+ this.eventService = eventService;
+ }
+
+ @PostMapping("/add")
+ public ResponseEntity create(@RequestBody EventRequestDto event) {
+ // TODO admin only
+ eventService.create(event);
+ return new ResponseEntity<>(HttpStatus.CREATED);
+ }
+
+ @PutMapping("/update")
+ public ResponseEntity update(@RequestBody EventUpdateRequestDto event) {
+ // TODO admin only
+ // eventService.update(event);
+ return new ResponseEntity<>(HttpStatus.CREATED);
+ }
+
+ @DeleteMapping("/delete/{id}")
+ public ResponseEntity delete(@PathVariable Integer id) {
+ // TODO admin only
+ eventService.delete(id);
+ return new ResponseEntity<>(null, HttpStatus.NO_CONTENT);
+ }
+
+ @GetMapping("/{id}")
+ public ResponseEntity getById(@PathVariable Integer id) {
+ eventService.getById();
+ }
+}
diff --git a/src/main/java/me/jweissen/aeticket/controller/UserController.java b/src/main/java/me/jweissen/aeticket/controller/UserController.java
new file mode 100644
index 0000000..39d08cb
--- /dev/null
+++ b/src/main/java/me/jweissen/aeticket/controller/UserController.java
@@ -0,0 +1,54 @@
+package me.jweissen.aeticket.controller;
+
+import me.jweissen.aeticket.dto.request.LoginRequestDto;
+import me.jweissen.aeticket.dto.request.UserRequestDto;
+import me.jweissen.aeticket.dto.request.UserUpdateRequestDto;
+import me.jweissen.aeticket.dto.response.SignupResponseDto;
+import me.jweissen.aeticket.dto.response.UserResponseDto;
+import me.jweissen.aeticket.service.UserService;
+import org.springframework.http.HttpStatus;
+import org.springframework.http.ResponseEntity;
+import org.springframework.web.bind.annotation.*;
+
+import java.util.List;
+
+@RestController
+@RequestMapping("/user")
+public class UserController {
+ private final UserService userService;
+
+ public UserController(UserService userService) {
+ this.userService = userService;
+ }
+
+ @PostMapping("/signup")
+ public ResponseEntity signUp(@RequestBody UserRequestDto user) {
+ // TODO
+ return new ResponseEntity<>(null, HttpStatus.OK);
+ }
+
+ @PostMapping("/signin")
+ public ResponseEntity signIn(@RequestBody LoginRequestDto user) {
+ // TODO
+ return new ResponseEntity<>(null, HttpStatus.OK);
+ }
+
+ @PutMapping("/update")
+ public ResponseEntity update(@RequestBody UserUpdateRequestDto user) {
+ // TODO admin only
+ return new ResponseEntity<>(null, HttpStatus.NO_CONTENT);
+ }
+
+ @DeleteMapping("/delete/{id}")
+ public ResponseEntity delete(@PathVariable Integer id) {
+ userService.delete(id);
+ return new ResponseEntity<>(null, HttpStatus.NO_CONTENT);
+ }
+
+ @GetMapping("/list")
+ public ResponseEntity> getAll() {
+ // TODO admin only
+ return new ResponseEntity<>(userService.getAll(), HttpStatus.OK);
+ }
+
+}
diff --git a/src/main/java/me/jweissen/aeticket/dto/request/CategoryRequestDto.java b/src/main/java/me/jweissen/aeticket/dto/request/CategoryRequestDto.java
new file mode 100644
index 0000000..9cda0a0
--- /dev/null
+++ b/src/main/java/me/jweissen/aeticket/dto/request/CategoryRequestDto.java
@@ -0,0 +1,4 @@
+package me.jweissen.aeticket.dto.request;
+
+public record CategoryRequestDto(String name, int price, int stock) {
+}
diff --git a/src/main/java/me/jweissen/aeticket/dto/request/EventRequestDto.java b/src/main/java/me/jweissen/aeticket/dto/request/EventRequestDto.java
index 49c2d1c..8a8a609 100644
--- a/src/main/java/me/jweissen/aeticket/dto/request/EventRequestDto.java
+++ b/src/main/java/me/jweissen/aeticket/dto/request/EventRequestDto.java
@@ -1,4 +1,12 @@
package me.jweissen.aeticket.dto.request;
-public record EventRequestDto() {
+import java.util.Date;
+import java.util.List;
+
+public record EventRequestDto(
+ String name,
+ Date from,
+ Date to,
+ String description,
+ List ticketCategories) {
}
diff --git a/src/main/java/me/jweissen/aeticket/dto/request/EventUpdateRequestDto.java b/src/main/java/me/jweissen/aeticket/dto/request/EventUpdateRequestDto.java
new file mode 100644
index 0000000..cfc0316
--- /dev/null
+++ b/src/main/java/me/jweissen/aeticket/dto/request/EventUpdateRequestDto.java
@@ -0,0 +1,4 @@
+package me.jweissen.aeticket.dto.request;
+
+public record EventUpdateRequestDto() {
+}
diff --git a/src/main/java/me/jweissen/aeticket/dto/request/LoginRequestDto.java b/src/main/java/me/jweissen/aeticket/dto/request/LoginRequestDto.java
index 0e0269c..c61a47b 100644
--- a/src/main/java/me/jweissen/aeticket/dto/request/LoginRequestDto.java
+++ b/src/main/java/me/jweissen/aeticket/dto/request/LoginRequestDto.java
@@ -1,4 +1,4 @@
package me.jweissen.aeticket.dto.request;
-public record LoginRequestDto() {
+public record LoginRequestDto(String email, String password) {
}
diff --git a/src/main/java/me/jweissen/aeticket/dto/request/TicketCategoryRequestDto.java b/src/main/java/me/jweissen/aeticket/dto/request/TicketCategoryRequestDto.java
deleted file mode 100644
index 781bd29..0000000
--- a/src/main/java/me/jweissen/aeticket/dto/request/TicketCategoryRequestDto.java
+++ /dev/null
@@ -1,2 +0,0 @@
-package me.jweissen.aeticket.dto.request;public class TicketCategoryRequestDto {
-}
diff --git a/src/main/java/me/jweissen/aeticket/dto/request/UserRequestDto.java b/src/main/java/me/jweissen/aeticket/dto/request/UserRequestDto.java
index c0dd28e..dee114f 100644
--- a/src/main/java/me/jweissen/aeticket/dto/request/UserRequestDto.java
+++ b/src/main/java/me/jweissen/aeticket/dto/request/UserRequestDto.java
@@ -1,4 +1,4 @@
package me.jweissen.aeticket.dto.request;
-public record UserRequestDto() {
+public record UserRequestDto(String email, String password, String firstname, String lastname) {
}
diff --git a/src/main/java/me/jweissen/aeticket/dto/request/UserUpdateRequestDto.java b/src/main/java/me/jweissen/aeticket/dto/request/UserUpdateRequestDto.java
new file mode 100644
index 0000000..104565a
--- /dev/null
+++ b/src/main/java/me/jweissen/aeticket/dto/request/UserUpdateRequestDto.java
@@ -0,0 +1,4 @@
+package me.jweissen.aeticket.dto.request;
+
+public record UserUpdateRequestDto(Integer id, String name, String email) {
+}
diff --git a/src/main/java/me/jweissen/aeticket/dto/response/CartEntryResponseDto.java b/src/main/java/me/jweissen/aeticket/dto/response/CartEntryResponseDto.java
new file mode 100644
index 0000000..5b3ac3c
--- /dev/null
+++ b/src/main/java/me/jweissen/aeticket/dto/response/CartEntryResponseDto.java
@@ -0,0 +1,4 @@
+package me.jweissen.aeticket.dto.response;
+
+public record CartEntryResponseDto(Integer id, String name, Double price, Integer amount) {
+}
diff --git a/src/main/java/me/jweissen/aeticket/dto/response/CartEventResponseDto.java b/src/main/java/me/jweissen/aeticket/dto/response/CartEventResponseDto.java
index 02b1174..fcb7711 100644
--- a/src/main/java/me/jweissen/aeticket/dto/response/CartEventResponseDto.java
+++ b/src/main/java/me/jweissen/aeticket/dto/response/CartEventResponseDto.java
@@ -1,12 +1,13 @@
package me.jweissen.aeticket.dto.response;
+import java.util.Date;
import java.util.List;
public record CartEventResponseDto(
int id,
String name,
- String from,
- String to,
+ Date from,
+ Date to,
String description,
- List tickets) {
+ List cartEntries) {
}
\ No newline at end of file
diff --git a/src/main/java/me/jweissen/aeticket/dto/response/CategoryResponseDto.java b/src/main/java/me/jweissen/aeticket/dto/response/CategoryResponseDto.java
new file mode 100644
index 0000000..fb5386a
--- /dev/null
+++ b/src/main/java/me/jweissen/aeticket/dto/response/CategoryResponseDto.java
@@ -0,0 +1,4 @@
+package me.jweissen.aeticket.dto.response;
+
+public record CategoryResponseDto(int id, String name, int price, int stock) {
+}
diff --git a/src/main/java/me/jweissen/aeticket/dto/response/CheckoutResponseDto.java b/src/main/java/me/jweissen/aeticket/dto/response/CheckoutResponseDto.java
index 361fdd1..f9ad362 100644
--- a/src/main/java/me/jweissen/aeticket/dto/response/CheckoutResponseDto.java
+++ b/src/main/java/me/jweissen/aeticket/dto/response/CheckoutResponseDto.java
@@ -1,4 +1,4 @@
package me.jweissen.aeticket.dto.response;
-public class CheckoutResponseDto {
+public record CheckoutResponseDto(double price) {
}
diff --git a/src/main/java/me/jweissen/aeticket/dto/response/EventResponseDto.java b/src/main/java/me/jweissen/aeticket/dto/response/EventResponseDto.java
index aa19a46..5876852 100644
--- a/src/main/java/me/jweissen/aeticket/dto/response/EventResponseDto.java
+++ b/src/main/java/me/jweissen/aeticket/dto/response/EventResponseDto.java
@@ -1,12 +1,13 @@
-package me.jweissen.aeticket.dto.request;
+package me.jweissen.aeticket.dto.response;
+import java.util.Date;
import java.util.List;
public record EventResponseDto(
int id,
String name,
- String from,
- String to,
+ Date from,
+ Date to,
String description,
- List ticketCategories) {
+ List ticketCategories) {
}
diff --git a/src/main/java/me/jweissen/aeticket/dto/response/SignupResponseDto.java b/src/main/java/me/jweissen/aeticket/dto/response/SignupResponseDto.java
new file mode 100644
index 0000000..6eaa3f4
--- /dev/null
+++ b/src/main/java/me/jweissen/aeticket/dto/response/SignupResponseDto.java
@@ -0,0 +1,4 @@
+package me.jweissen.aeticket.dto.response;
+
+public record SignupResponseDto(String token) {
+}
diff --git a/src/main/java/me/jweissen/aeticket/dto/response/TicketCategoryResponseDto.java b/src/main/java/me/jweissen/aeticket/dto/response/TicketCategoryResponseDto.java
deleted file mode 100644
index 4586cf7..0000000
--- a/src/main/java/me/jweissen/aeticket/dto/response/TicketCategoryResponseDto.java
+++ /dev/null
@@ -1,2 +0,0 @@
-package me.jweissen.aeticket.dto.response;public class TicketCategoryResponseDto {
-}
diff --git a/src/main/java/me/jweissen/aeticket/dto/response/TicketResponseDto.java b/src/main/java/me/jweissen/aeticket/dto/response/TicketResponseDto.java
deleted file mode 100644
index c7ec14b..0000000
--- a/src/main/java/me/jweissen/aeticket/dto/response/TicketResponseDto.java
+++ /dev/null
@@ -1,2 +0,0 @@
-package me.jweissen.aeticket.dto.response;public record TicketResponseDto() {
-}
diff --git a/src/main/java/me/jweissen/aeticket/dto/response/UserResponseDto.java b/src/main/java/me/jweissen/aeticket/dto/response/UserResponseDto.java
index 6d15930..3f307b2 100644
--- a/src/main/java/me/jweissen/aeticket/dto/response/UserResponseDto.java
+++ b/src/main/java/me/jweissen/aeticket/dto/response/UserResponseDto.java
@@ -1,4 +1,4 @@
package me.jweissen.aeticket.dto.response;
-public record UserResponseDto() {
+public record UserResponseDto(int id, String firstname, String lastname, String email) {
}
diff --git a/src/main/java/me/jweissen/aeticket/model/Cart.java b/src/main/java/me/jweissen/aeticket/model/Cart.java
index b5a0d5d..93f4897 100644
--- a/src/main/java/me/jweissen/aeticket/model/Cart.java
+++ b/src/main/java/me/jweissen/aeticket/model/Cart.java
@@ -1,4 +1,25 @@
package me.jweissen.aeticket.model;
+import jakarta.persistence.*;
+import lombok.Getter;
+import lombok.Setter;
+
+import java.util.List;
+
+@Entity
+@Table
+@Getter
+@Setter
public class Cart {
+ @Id
+ @GeneratedValue(strategy = GenerationType.IDENTITY)
+ private Integer id;
+
+ @OneToMany(mappedBy = "cart")
+ @JoinColumn(nullable = false)
+ private List cartEntries;
+
+ @ManyToOne
+ @JoinColumn(nullable = false)
+ private User user;
}
diff --git a/src/main/java/me/jweissen/aeticket/model/CartEntry.java b/src/main/java/me/jweissen/aeticket/model/CartEntry.java
new file mode 100644
index 0000000..d334034
--- /dev/null
+++ b/src/main/java/me/jweissen/aeticket/model/CartEntry.java
@@ -0,0 +1,26 @@
+package me.jweissen.aeticket.model;
+
+import jakarta.persistence.*;
+import lombok.Getter;
+import lombok.Setter;
+
+@Entity
+@Table
+@Getter
+@Setter
+public class CartEntry {
+ @Id
+ @GeneratedValue(strategy = GenerationType.IDENTITY)
+ private int id;
+
+ @ManyToOne
+ @JoinColumn(nullable = false)
+ private Cart cart;
+
+ @ManyToOne
+ @JoinColumn(nullable = false)
+ private Category category;
+
+ @Column(nullable = false)
+ private int amount;
+}
diff --git a/src/main/java/me/jweissen/aeticket/model/Category.java b/src/main/java/me/jweissen/aeticket/model/Category.java
index 4fee061..deb9c58 100644
--- a/src/main/java/me/jweissen/aeticket/model/Category.java
+++ b/src/main/java/me/jweissen/aeticket/model/Category.java
@@ -4,6 +4,8 @@ import jakarta.persistence.*;
import lombok.Getter;
import lombok.Setter;
+import java.util.List;
+
@Entity
@Table
@Getter
@@ -26,4 +28,7 @@ public class Category {
@JoinColumn(nullable = false)
private Event event;
-}
+ @OneToMany(mappedBy = "category")
+ @JoinColumn
+ private List cartEntries;
+}
\ No newline at end of file
diff --git a/src/main/java/me/jweissen/aeticket/model/Event.java b/src/main/java/me/jweissen/aeticket/model/Event.java
index e750ea0..3e19039 100644
--- a/src/main/java/me/jweissen/aeticket/model/Event.java
+++ b/src/main/java/me/jweissen/aeticket/model/Event.java
@@ -1,8 +1,7 @@
package me.jweissen.aeticket.model;
import jakarta.persistence.*;
-import lombok.Getter;
-import lombok.Setter;
+import lombok.*;
import java.util.ArrayList;
import java.util.Date;
@@ -12,21 +11,28 @@ import java.util.List;
@Table
@Getter
@Setter
+@NoArgsConstructor
+@AllArgsConstructor
+@Builder
public class Event {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private int id;
@Column(nullable = false)
+ @NonNull
private String title;
@Column(nullable = false)
+ @NonNull
private String description;
@Column(nullable = false)
+ @NonNull
private Date start;
@Column(nullable = false)
+ @NonNull
private Date end;
@OneToMany(mappedBy = "event")
diff --git a/src/main/java/me/jweissen/aeticket/model/Ticket.java b/src/main/java/me/jweissen/aeticket/model/Ticket.java
deleted file mode 100644
index 25e9289..0000000
--- a/src/main/java/me/jweissen/aeticket/model/Ticket.java
+++ /dev/null
@@ -1,4 +0,0 @@
-package me.jweissen.aeticket.model;
-
-public class Ticket {
-}
diff --git a/src/main/java/me/jweissen/aeticket/model/User.java b/src/main/java/me/jweissen/aeticket/model/User.java
index e450328..bc7bdfb 100644
--- a/src/main/java/me/jweissen/aeticket/model/User.java
+++ b/src/main/java/me/jweissen/aeticket/model/User.java
@@ -2,8 +2,11 @@ package me.jweissen.aeticket.model;
import jakarta.persistence.*;
import lombok.Getter;
+import lombok.NonNull;
import lombok.Setter;
+import java.util.List;
+
@Entity
@Table
@Getter
@@ -14,11 +17,26 @@ public class User {
private int id;
@Column(nullable = false)
+ @NonNull
private String firstname;
@Column(nullable = false)
+ @NonNull
private String lastname;
@Column(nullable = false)
+ @NonNull
+ private String email;
+
+ @Column(nullable = false)
+ @NonNull
private String password;
+
+ @Column(nullable = false)
+ @NonNull
+ private Boolean admin;
+
+ @OneToMany(mappedBy = "user")
+ @JoinColumn(nullable = false)
+ private List carts;
}
diff --git a/src/main/java/me/jweissen/aeticket/repository/CartEntryRepository.java b/src/main/java/me/jweissen/aeticket/repository/CartEntryRepository.java
new file mode 100644
index 0000000..92d3b6c
--- /dev/null
+++ b/src/main/java/me/jweissen/aeticket/repository/CartEntryRepository.java
@@ -0,0 +1,13 @@
+package me.jweissen.aeticket.repository;
+
+import me.jweissen.aeticket.model.CartEntry;
+import org.springframework.data.jpa.repository.JpaRepository;
+import org.springframework.data.jpa.repository.Query;
+import org.springframework.data.repository.query.Param;
+
+import java.util.List;
+
+public interface CartEntryRepository extends JpaRepository {
+ @Query("SELECT ce FROM CartEntry ce WHERE ce.cart.id = :cartId AND ce.category.event.id = :eventId")
+ List getByCartAndEvent(@Param("cartId") Integer cartId, @Param("eventId") Integer eventId);
+}
diff --git a/src/main/java/me/jweissen/aeticket/repository/CartRepository.java b/src/main/java/me/jweissen/aeticket/repository/CartRepository.java
new file mode 100644
index 0000000..155d98b
--- /dev/null
+++ b/src/main/java/me/jweissen/aeticket/repository/CartRepository.java
@@ -0,0 +1,7 @@
+package me.jweissen.aeticket.repository;
+
+import me.jweissen.aeticket.model.Cart;
+import org.springframework.data.jpa.repository.JpaRepository;
+
+public interface CartRepository extends JpaRepository {
+}
diff --git a/src/main/java/me/jweissen/aeticket/repository/CategoryRepository.java b/src/main/java/me/jweissen/aeticket/repository/CategoryRepository.java
new file mode 100644
index 0000000..42afa59
--- /dev/null
+++ b/src/main/java/me/jweissen/aeticket/repository/CategoryRepository.java
@@ -0,0 +1,7 @@
+package me.jweissen.aeticket.repository;
+
+import me.jweissen.aeticket.model.Category;
+import org.springframework.data.jpa.repository.JpaRepository;
+
+public interface CategoryRepository extends JpaRepository {
+}
diff --git a/src/main/java/me/jweissen/aeticket/repository/EventRepository.java b/src/main/java/me/jweissen/aeticket/repository/EventRepository.java
new file mode 100644
index 0000000..68af5a8
--- /dev/null
+++ b/src/main/java/me/jweissen/aeticket/repository/EventRepository.java
@@ -0,0 +1,7 @@
+package me.jweissen.aeticket.repository;
+
+import me.jweissen.aeticket.model.Event;
+import org.springframework.data.jpa.repository.JpaRepository;
+
+public interface EventRepository extends JpaRepository {
+}
diff --git a/src/main/java/me/jweissen/aeticket/repository/UserRepository.java b/src/main/java/me/jweissen/aeticket/repository/UserRepository.java
new file mode 100644
index 0000000..6be1940
--- /dev/null
+++ b/src/main/java/me/jweissen/aeticket/repository/UserRepository.java
@@ -0,0 +1,7 @@
+package me.jweissen.aeticket.repository;
+
+import me.jweissen.aeticket.model.User;
+import org.springframework.data.jpa.repository.JpaRepository;
+
+public interface UserRepository extends JpaRepository {
+}
diff --git a/src/main/java/me/jweissen/aeticket/service/CartEntryService.java b/src/main/java/me/jweissen/aeticket/service/CartEntryService.java
new file mode 100644
index 0000000..bedd27c
--- /dev/null
+++ b/src/main/java/me/jweissen/aeticket/service/CartEntryService.java
@@ -0,0 +1,25 @@
+package me.jweissen.aeticket.service;
+
+import me.jweissen.aeticket.dto.response.CartEntryResponseDto;
+import me.jweissen.aeticket.model.CartEntry;
+import me.jweissen.aeticket.model.Category;
+import org.springframework.stereotype.Service;
+
+import java.util.List;
+
+@Service
+public class CartEntryService {
+ public static CartEntryResponseDto toDto(CartEntry cartEntry) {
+ Category category = cartEntry.getCategory();
+ return new CartEntryResponseDto(
+ category.getId(),
+ category.getName(),
+ category.getPrice(),
+ cartEntry.getAmount()
+ );
+ }
+
+ public static List toDtos(List cartEntries) {
+ return cartEntries.stream().map(CartEntryService::toDto).toList();
+ }
+}
diff --git a/src/main/java/me/jweissen/aeticket/service/CartService.java b/src/main/java/me/jweissen/aeticket/service/CartService.java
index ca21c6e..07dd156 100644
--- a/src/main/java/me/jweissen/aeticket/service/CartService.java
+++ b/src/main/java/me/jweissen/aeticket/service/CartService.java
@@ -1,2 +1,34 @@
-package me.jweissen.aeticket.service;public class CartService {
+package me.jweissen.aeticket.service;
+
+import me.jweissen.aeticket.dto.response.CartEventResponseDto;
+import me.jweissen.aeticket.model.Cart;
+import me.jweissen.aeticket.model.Event;
+import me.jweissen.aeticket.repository.CartEntryRepository;
+import me.jweissen.aeticket.repository.CartRepository;
+import org.springframework.stereotype.Service;
+
+import java.util.List;
+
+@Service
+public class CartService {
+ private final CartRepository cartRepository;
+ private final CartEntryRepository cartEntryRepository;
+
+ public CartService(CartRepository cartRepository, CartEntryRepository cartEntryRepository) {
+ this.cartRepository = cartRepository;
+ this.cartEntryRepository = cartEntryRepository;
+ }
+
+ public List toDto(Cart cart) {
+ List distinctEvents = cart.getCartEntries().stream().map(entry -> entry.getCategory().getEvent()).distinct().toList();
+ return distinctEvents.stream().map(event ->
+ new CartEventResponseDto(
+ event.getId(),
+ event.getTitle(),
+ event.getStart(),
+ event.getEnd(),
+ event.getDescription(),
+ CartEntryService.toDtos(cartEntryRepository.getByCartAndEvent(cart.getId(), event.getId()))
+ )).toList();
+ }
}
diff --git a/src/main/java/me/jweissen/aeticket/service/EventService.java b/src/main/java/me/jweissen/aeticket/service/EventService.java
index e549d38..ee796c4 100644
--- a/src/main/java/me/jweissen/aeticket/service/EventService.java
+++ b/src/main/java/me/jweissen/aeticket/service/EventService.java
@@ -1,2 +1,52 @@
-package me.jweissen.aeticket.service;public class EventService {
+package me.jweissen.aeticket.service;
+
+import me.jweissen.aeticket.dto.request.EventRequestDto;
+import me.jweissen.aeticket.dto.request.EventUpdateRequestDto;
+import me.jweissen.aeticket.dto.response.EventResponseDto;
+import me.jweissen.aeticket.model.Event;
+import me.jweissen.aeticket.repository.EventRepository;
+import org.springframework.stereotype.Service;
+
+@Service
+public class EventService {
+ private final EventRepository eventRepository;
+
+ public EventService(EventRepository eventRepository) {
+ this.eventRepository = eventRepository;
+ }
+
+ public static Event fromDto(EventRequestDto dto) {
+ return Event.builder()
+ .title(dto.name())
+ .description(dto.description())
+ .start(dto.from())
+ .end(dto.to())
+ .build();
+ }
+
+ public static EventResponseDto toDto(Event event) {
+ return new EventResponseDto(
+ event.getId(),
+ event.getTitle(),
+ event.getStart(),
+ event.getEnd(),
+ event.getDescription(),
+ event.getCategories()
+ )
+ }
+
+ public void create(EventRequestDto event) {
+ eventRepository.save(EventService.fromDto(event));
+ }
+
+ public void update(EventUpdateRequestDto event) {
+ }
+
+ public void delete(Integer id) {
+ eventRepository.deleteById(id);
+ }
+
+ public EventResponseDto getById(Integer id) {
+ return eventRepository.getReferenceById(id);
+ }
}
diff --git a/src/main/java/me/jweissen/aeticket/service/UserService.java b/src/main/java/me/jweissen/aeticket/service/UserService.java
index 86755bd..d22f693 100644
--- a/src/main/java/me/jweissen/aeticket/service/UserService.java
+++ b/src/main/java/me/jweissen/aeticket/service/UserService.java
@@ -1,2 +1,38 @@
-package me.jweissen.aeticket.service;public class UserService {
+package me.jweissen.aeticket.service;
+
+import me.jweissen.aeticket.dto.response.UserResponseDto;
+import me.jweissen.aeticket.model.User;
+import me.jweissen.aeticket.repository.UserRepository;
+import org.springframework.stereotype.Service;
+
+import java.util.List;
+
+@Service
+public class UserService {
+ private final UserRepository userRepository;
+
+ public UserService(UserRepository userRepository) {
+ this.userRepository = userRepository;
+ }
+
+ public static UserResponseDto toDto(User user) {
+ return new UserResponseDto(
+ user.getId(),
+ user.getFirstname(),
+ user.getLastname(),
+ user.getEmail()
+ );
+ }
+
+ public static List toDtos(List users) {
+ return users.stream().map(UserService::toDto).toList();
+ }
+
+ public List getAll() {
+ return UserService.toDtos(userRepository.findAll());
+ }
+
+ public void delete(Integer id) {
+ userRepository.deleteById(id);
+ }
}