zack zack

This commit is contained in:
j-weissen 2023-11-21 18:39:46 +01:00
parent 7aee8fcdc9
commit a63afaa022
36 changed files with 612 additions and 30 deletions

3
.gitignore vendored
View file

@ -31,3 +31,6 @@ build/
### VS Code ###
.vscode/
### Custom ###
db/mysql

196
docs/task.html Normal file

File diff suppressed because one or more lines are too long

View file

@ -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

View file

@ -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<Void> create(@RequestBody EventRequestDto event) {
// TODO admin only
eventService.create(event);
return new ResponseEntity<>(HttpStatus.CREATED);
}
@PutMapping("/update")
public ResponseEntity<Void> update(@RequestBody EventUpdateRequestDto event) {
// TODO admin only
// eventService.update(event);
return new ResponseEntity<>(HttpStatus.CREATED);
}
@DeleteMapping("/delete/{id}")
public ResponseEntity<Void> delete(@PathVariable Integer id) {
// TODO admin only
eventService.delete(id);
return new ResponseEntity<>(null, HttpStatus.NO_CONTENT);
}
@GetMapping("/{id}")
public ResponseEntity<EventResponseDto> getById(@PathVariable Integer id) {
eventService.getById();
}
}

View file

@ -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<SignupResponseDto> signUp(@RequestBody UserRequestDto user) {
// TODO
return new ResponseEntity<>(null, HttpStatus.OK);
}
@PostMapping("/signin")
public ResponseEntity<SignupResponseDto> signIn(@RequestBody LoginRequestDto user) {
// TODO
return new ResponseEntity<>(null, HttpStatus.OK);
}
@PutMapping("/update")
public ResponseEntity<Void> update(@RequestBody UserUpdateRequestDto user) {
// TODO admin only
return new ResponseEntity<>(null, HttpStatus.NO_CONTENT);
}
@DeleteMapping("/delete/{id}")
public ResponseEntity<Void> delete(@PathVariable Integer id) {
userService.delete(id);
return new ResponseEntity<>(null, HttpStatus.NO_CONTENT);
}
@GetMapping("/list")
public ResponseEntity<List<UserResponseDto>> getAll() {
// TODO admin only
return new ResponseEntity<>(userService.getAll(), HttpStatus.OK);
}
}

View file

@ -0,0 +1,4 @@
package me.jweissen.aeticket.dto.request;
public record CategoryRequestDto(String name, int price, int stock) {
}

View file

@ -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<CategoryRequestDto> ticketCategories) {
}

View file

@ -0,0 +1,4 @@
package me.jweissen.aeticket.dto.request;
public record EventUpdateRequestDto() {
}

View file

@ -1,4 +1,4 @@
package me.jweissen.aeticket.dto.request;
public record LoginRequestDto() {
public record LoginRequestDto(String email, String password) {
}

View file

@ -1,2 +0,0 @@
package me.jweissen.aeticket.dto.request;public class TicketCategoryRequestDto {
}

View file

@ -1,4 +1,4 @@
package me.jweissen.aeticket.dto.request;
public record UserRequestDto() {
public record UserRequestDto(String email, String password, String firstname, String lastname) {
}

View file

@ -0,0 +1,4 @@
package me.jweissen.aeticket.dto.request;
public record UserUpdateRequestDto(Integer id, String name, String email) {
}

View file

@ -0,0 +1,4 @@
package me.jweissen.aeticket.dto.response;
public record CartEntryResponseDto(Integer id, String name, Double price, Integer amount) {
}

View file

@ -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<TicketResponseDto> tickets) {
List<CartEntryResponseDto> cartEntries) {
}

View file

@ -0,0 +1,4 @@
package me.jweissen.aeticket.dto.response;
public record CategoryResponseDto(int id, String name, int price, int stock) {
}

View file

@ -1,4 +1,4 @@
package me.jweissen.aeticket.dto.response;
public class CheckoutResponseDto {
public record CheckoutResponseDto(double price) {
}

View file

@ -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<TicketCategoryResponseDto> ticketCategories) {
List<CategoryResponseDto> ticketCategories) {
}

View file

@ -0,0 +1,4 @@
package me.jweissen.aeticket.dto.response;
public record SignupResponseDto(String token) {
}

View file

@ -1,2 +0,0 @@
package me.jweissen.aeticket.dto.response;public class TicketCategoryResponseDto {
}

View file

@ -1,2 +0,0 @@
package me.jweissen.aeticket.dto.response;public record TicketResponseDto() {
}

View file

@ -1,4 +1,4 @@
package me.jweissen.aeticket.dto.response;
public record UserResponseDto() {
public record UserResponseDto(int id, String firstname, String lastname, String email) {
}

View file

@ -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<CartEntry> cartEntries;
@ManyToOne
@JoinColumn(nullable = false)
private User user;
}

View file

@ -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;
}

View file

@ -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<CartEntry> cartEntries;
}

View file

@ -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")

View file

@ -1,4 +0,0 @@
package me.jweissen.aeticket.model;
public class Ticket {
}

View file

@ -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<Cart> carts;
}

View file

@ -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<CartEntry, Integer> {
@Query("SELECT ce FROM CartEntry ce WHERE ce.cart.id = :cartId AND ce.category.event.id = :eventId")
List<CartEntry> getByCartAndEvent(@Param("cartId") Integer cartId, @Param("eventId") Integer eventId);
}

View file

@ -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<Cart, Integer> {
}

View file

@ -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<Category, Integer> {
}

View file

@ -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<Event, Integer> {
}

View file

@ -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<User, Integer> {
}

View file

@ -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<CartEntryResponseDto> toDtos(List<CartEntry> cartEntries) {
return cartEntries.stream().map(CartEntryService::toDto).toList();
}
}

View file

@ -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<CartEventResponseDto> toDto(Cart cart) {
List<Event> 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();
}
}

View file

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

View file

@ -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<UserResponseDto> toDtos(List<User> users) {
return users.stream().map(UserService::toDto).toList();
}
public List<UserResponseDto> getAll() {
return UserService.toDtos(userRepository.findAll());
}
public void delete(Integer id) {
userRepository.deleteById(id);
}
}