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:

+ +

Erstellen Sie für alle anderen Benutzer Endpunkte für folgende Aufgaben:

+ +

Schreiben Sie Testfälle (Unit - Tests) für folgende Schnittstellen:

+ +

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

+ +

Login

+ +

Benutzer ändern (nur für Administratoren zugänglich)

+ +

Benutzer löschen (nur für Administratoren zugänglich)

+ +

Benutzerliste laden (nur für Administratoren zugänglich)

+ +

Benutzer laden (nur für Administratoren zugänglich)

+ +

Event erzeugen (nur für Administratoren zugänglich)

+ +

Event ändern (nur für Administratoren zugänglich)

+ +

Event löschen (nur für Administratoren zugänglich)

+ +

Event laden

+ +

Zukünftige Events laden

+ +

Tickets zum Warenkorb hinzufügen

+ +

Warenkorb laden

+ +

Tickets kaufen

+ +

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); + } }