From 7dbbdef6c2180d448bacc68da82bf3c45554dff2 Mon Sep 17 00:00:00 2001 From: Jonas Weissengruber Date: Wed, 20 Dec 2023 01:39:34 +0100 Subject: [PATCH] pfeifn duats heast --- http-requests/cart.http | 12 +++++++----- http-requests/event.http | 2 +- http-requests/http-client.env.json | 2 +- .../aeticket/controller/CartController.java | 9 +++++++-- .../aeticket/controller/CategoryController.java | 14 +++++++------- .../aeticket/controller/EventController.java | 10 +++++++--- .../aeticket/controller/UserController.java | 10 +++++----- .../java/me/jweissen/aeticket/model/Cart.java | 2 +- .../java/me/jweissen/aeticket/model/User.java | 2 -- .../aeticket/repository/CategoryRepository.java | 4 ++-- .../jweissen/aeticket/service/CartService.java | 7 +++++-- .../jweissen/aeticket/service/UserService.java | 17 ++++++++++++++--- 12 files changed, 57 insertions(+), 34 deletions(-) diff --git a/http-requests/cart.http b/http-requests/cart.http index 1556750..5c1a72b 100644 --- a/http-requests/cart.http +++ b/http-requests/cart.http @@ -1,21 +1,23 @@ ### add POST {{url}}/cart/add +Authorization: Bearer {{token}} Content-Type: application/json { "id": 9999999, "cartEntries": [ { - "id": 2, - "amount": 20 + "id": 3, + "amount": 1 } ] } -### list -GET {{url}}/user/signin +### list +GET {{url}}/cart/list +Authorization: Bearer {{token}} ### checkout -GET {{url}}/user/update +GET {{url}}/cart/checkout Authorization: Bearer {{token}} \ No newline at end of file diff --git a/http-requests/event.http b/http-requests/event.http index f83572a..e1d39ec 100644 --- a/http-requests/event.http +++ b/http-requests/event.http @@ -1,6 +1,6 @@ ### create POST {{url}}/event/create -# Authorization: Bearer {{token}} +Authorization: Bearer {{token}} Content-Type: application/json { diff --git a/http-requests/http-client.env.json b/http-requests/http-client.env.json index 1d5dd67..fe08a37 100644 --- a/http-requests/http-client.env.json +++ b/http-requests/http-client.env.json @@ -1,6 +1,6 @@ { "dev": { "url": "http://localhost:8080/api/v1", - "token": "eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJzdWIiOiJhZXRpY2tldCB1c2VyIHRva2VuIiwiZXhwIjoxNzAzMTAwNzQyLCJ1c2VySWQiOjIsImlhdCI6MTcwMzAxNDM0Mn0.D9HBxWy1vIP82XOh_ocjLO9HB0lK_rQGjgD3a7KQrOE" + "token": "eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJzdWIiOiJhZXRpY2tldCB1c2VyIHRva2VuIiwidXNlcklkIjoxfQ.vcZslqzkJgh8t7hokvwpVaJ-8c0_BnCeHrsBJOGC6qU" } } \ No newline at end of file diff --git a/src/main/java/me/jweissen/aeticket/controller/CartController.java b/src/main/java/me/jweissen/aeticket/controller/CartController.java index 104669c..1c52067 100644 --- a/src/main/java/me/jweissen/aeticket/controller/CartController.java +++ b/src/main/java/me/jweissen/aeticket/controller/CartController.java @@ -1,5 +1,6 @@ package me.jweissen.aeticket.controller; +import me.jweissen.aeticket.aspect.UserOnly; import me.jweissen.aeticket.dto.request.CartAddRequestDto; import me.jweissen.aeticket.dto.response.CartEventResponseDto; import me.jweissen.aeticket.dto.response.CheckoutResponseDto; @@ -23,20 +24,24 @@ public class CartController { } @PostMapping("/add") + @UserOnly public ResponseEntity addEntry(@RequestBody CartAddRequestDto dto) { + System.out.println(authService.getCurrentUser()); if (!cartService.add(dto, authService.getCurrentUser().getCurrentCart())) { - // user gave invalid category id(s) - return ResponseEntity.status(HttpStatus.NOT_FOUND).build(); + // user gave invalid category id(s) or wanted more tickets than available + return ResponseEntity.status(HttpStatus.BAD_REQUEST).build(); } return ResponseEntity.status(HttpStatus.NO_CONTENT).build(); } @GetMapping("/list") + @UserOnly public ResponseEntity> getCartEntries() { return new ResponseEntity<>(cartService.toDto(authService.getCurrentUser().getCurrentCart()), HttpStatus.OK); } @GetMapping("/checkout") + @UserOnly public ResponseEntity checkout() { return new ResponseEntity<>(cartService.checkout(authService.getCurrentUser().getCurrentCart()), HttpStatus.OK); } diff --git a/src/main/java/me/jweissen/aeticket/controller/CategoryController.java b/src/main/java/me/jweissen/aeticket/controller/CategoryController.java index aabfc5f..0d18b9d 100644 --- a/src/main/java/me/jweissen/aeticket/controller/CategoryController.java +++ b/src/main/java/me/jweissen/aeticket/controller/CategoryController.java @@ -1,11 +1,10 @@ package me.jweissen.aeticket.controller; +import me.jweissen.aeticket.aspect.AdminOnly; +import me.jweissen.aeticket.aspect.UserOnly; import me.jweissen.aeticket.dto.request.CategoryRequestDto; import me.jweissen.aeticket.dto.request.CategoryUpdateRequestDto; -import me.jweissen.aeticket.dto.request.EventRequestDto; -import me.jweissen.aeticket.dto.request.EventUpdateRequestDto; import me.jweissen.aeticket.dto.response.CategoryResponseDto; -import me.jweissen.aeticket.dto.response.EventResponseDto; import me.jweissen.aeticket.service.CategoryService; import org.springframework.http.HttpStatus; import org.springframework.http.ResponseEntity; @@ -23,16 +22,15 @@ public class CategoryController { } @PostMapping("/create") + @AdminOnly public ResponseEntity create(@RequestBody CategoryRequestDto dto) { - // TODO admin only categoryService.create(dto); return ResponseEntity.status(HttpStatus.CREATED).build(); } @PutMapping("/update") + @AdminOnly public ResponseEntity update(@RequestBody CategoryUpdateRequestDto dto) { - // TODO admin only - System.out.println(dto); if (!categoryService.update(dto)) { return ResponseEntity.status(HttpStatus.NOT_FOUND).build(); } @@ -40,13 +38,14 @@ public class CategoryController { } @DeleteMapping("/delete/{id}") + @AdminOnly public ResponseEntity delete(@PathVariable Long id) { - // TODO admin only categoryService.delete(id); return ResponseEntity.status(HttpStatus.NO_CONTENT).build(); } @GetMapping("/{id}") + @UserOnly public ResponseEntity getById(@PathVariable Long id) { return categoryService.getById(id) .map(categoryResponseDto -> new ResponseEntity<>(categoryResponseDto, HttpStatus.OK)) @@ -54,6 +53,7 @@ public class CategoryController { } @GetMapping("/list") + @UserOnly public ResponseEntity> getAll() { return new ResponseEntity<>(categoryService.getAll(), HttpStatus.OK); } diff --git a/src/main/java/me/jweissen/aeticket/controller/EventController.java b/src/main/java/me/jweissen/aeticket/controller/EventController.java index 623a911..34bdfa7 100644 --- a/src/main/java/me/jweissen/aeticket/controller/EventController.java +++ b/src/main/java/me/jweissen/aeticket/controller/EventController.java @@ -1,5 +1,7 @@ package me.jweissen.aeticket.controller; +import me.jweissen.aeticket.aspect.AdminOnly; +import me.jweissen.aeticket.aspect.UserOnly; import me.jweissen.aeticket.dto.request.EventRequestDto; import me.jweissen.aeticket.dto.request.EventUpdateRequestDto; import me.jweissen.aeticket.dto.response.EventResponseDto; @@ -20,27 +22,28 @@ public class EventController { } @PostMapping("/create") + @AdminOnly public ResponseEntity create(@RequestBody EventRequestDto event) { - // TODO admin only eventService.create(event); return ResponseEntity.status(HttpStatus.CREATED).build(); } @PutMapping("/update") + @AdminOnly public ResponseEntity update(@RequestBody EventUpdateRequestDto event) { - // TODO admin only eventService.update(event); return ResponseEntity.status(HttpStatus.NO_CONTENT).build(); } @DeleteMapping("/delete/{id}") + @AdminOnly public ResponseEntity delete(@PathVariable Long id) { - // TODO admin only eventService.delete(id); return ResponseEntity.status(HttpStatus.NO_CONTENT).build(); } @GetMapping("/{id}") + @UserOnly public ResponseEntity getById(@PathVariable Long id) { return eventService.getById(id) .map(eventResponseDto -> new ResponseEntity<>(eventResponseDto, HttpStatus.OK)) @@ -48,6 +51,7 @@ public class EventController { } @GetMapping("/list") + @UserOnly public ResponseEntity> getAllFuture() { return new ResponseEntity<>(eventService.getAllFuture(), HttpStatus.OK); } diff --git a/src/main/java/me/jweissen/aeticket/controller/UserController.java b/src/main/java/me/jweissen/aeticket/controller/UserController.java index e1d1d32..b9a5574 100644 --- a/src/main/java/me/jweissen/aeticket/controller/UserController.java +++ b/src/main/java/me/jweissen/aeticket/controller/UserController.java @@ -1,5 +1,6 @@ package me.jweissen.aeticket.controller; +import me.jweissen.aeticket.aspect.AdminOnly; import me.jweissen.aeticket.dto.request.LoginRequestDto; import me.jweissen.aeticket.dto.request.SignupRequestDto; import me.jweissen.aeticket.dto.request.UserUpdateRequestDto; @@ -11,7 +12,6 @@ import org.springframework.http.ResponseEntity; import org.springframework.web.bind.annotation.*; import java.util.List; -import java.util.Optional; @RestController @RequestMapping("/user") @@ -35,8 +35,8 @@ public class UserController { } @PutMapping("/update") + @AdminOnly public ResponseEntity update(@RequestBody UserUpdateRequestDto user) { - // TODO admin only if (!userService.update(user)) { return ResponseEntity.status(HttpStatus.NOT_FOUND).build(); } @@ -44,21 +44,21 @@ public class UserController { } @DeleteMapping("/delete/{id}") + @AdminOnly public ResponseEntity delete(@PathVariable Long id) { - // TODO admin only userService.delete(id); return ResponseEntity.status(HttpStatus.NO_CONTENT).build(); } @GetMapping("/list") + @AdminOnly public ResponseEntity> getAll() { - // TODO admin only return new ResponseEntity<>(userService.getAll(), HttpStatus.OK); } @GetMapping("/load/{id}") + @AdminOnly public ResponseEntity getById(@PathVariable Long id) { - // TODO admin only return userService.getById(id) .map(userResponseDto -> new ResponseEntity<>(userResponseDto, HttpStatus.OK)) .orElseGet(() -> ResponseEntity.status(HttpStatus.NOT_FOUND).build()); diff --git a/src/main/java/me/jweissen/aeticket/model/Cart.java b/src/main/java/me/jweissen/aeticket/model/Cart.java index 06c1459..62876a5 100644 --- a/src/main/java/me/jweissen/aeticket/model/Cart.java +++ b/src/main/java/me/jweissen/aeticket/model/Cart.java @@ -19,7 +19,7 @@ public class Cart { private Boolean checkedOut = false; @OneToMany(mappedBy = "cart") - @Column(nullable = false) + @Column private List cartEntries; @ManyToOne diff --git a/src/main/java/me/jweissen/aeticket/model/User.java b/src/main/java/me/jweissen/aeticket/model/User.java index c068f7d..2398d0f 100644 --- a/src/main/java/me/jweissen/aeticket/model/User.java +++ b/src/main/java/me/jweissen/aeticket/model/User.java @@ -45,8 +45,6 @@ public class User { private Role role; @OneToOne - @JoinColumn(nullable = false) - @NonNull private Cart currentCart; @OneToMany(mappedBy = "user") diff --git a/src/main/java/me/jweissen/aeticket/repository/CategoryRepository.java b/src/main/java/me/jweissen/aeticket/repository/CategoryRepository.java index 0328402..3ee5364 100644 --- a/src/main/java/me/jweissen/aeticket/repository/CategoryRepository.java +++ b/src/main/java/me/jweissen/aeticket/repository/CategoryRepository.java @@ -6,6 +6,6 @@ import org.springframework.data.jpa.repository.Query; import org.springframework.data.repository.query.Param; public interface CategoryRepository extends JpaRepository { - @Query("SELECT c.stock - sum(ce.amount) FROM Category c INNER JOIN CartEntry ce ON c = ce.category WHERE c = :category GROUP BY c") - Integer availableTickets(@Param("category") Category category); + @Query("SELECT COALESCE(sum(ce.amount), 0) FROM CartEntry ce WHERE ce.category = :category") + Integer unavailableTickets(@Param("category") Category category); } diff --git a/src/main/java/me/jweissen/aeticket/service/CartService.java b/src/main/java/me/jweissen/aeticket/service/CartService.java index fff2d27..5c6df47 100644 --- a/src/main/java/me/jweissen/aeticket/service/CartService.java +++ b/src/main/java/me/jweissen/aeticket/service/CartService.java @@ -57,11 +57,13 @@ public class CartService { return false; } Category category = categoryOptional.get(); - if (cartEntryDto.amount() > categoryRepository.availableTickets(category)) { + if (cartEntryDto.amount() > (category.getStock() - categoryRepository.unavailableTickets(category))) { // wants to order more tickets than available return false; } - cart.getCartEntries().add(new CartEntry(cart, category, cartEntryDto.amount())); + CartEntry cartEntry = new CartEntry(cart, category, cartEntryDto.amount()); + cartEntry = cartEntryRepository.save(cartEntry); + cart.getCartEntries().add(cartEntry); } cartRepository.save(cart); return true; @@ -72,6 +74,7 @@ public class CartService { cartRepository.save(cart); // reset current cart Cart newCart = new Cart(); + newCart.setUser(cart.getUser()); newCart = cartRepository.save(newCart); cart.getUser().setCurrentCart(newCart); userRepository.save(cart.getUser()); diff --git a/src/main/java/me/jweissen/aeticket/service/UserService.java b/src/main/java/me/jweissen/aeticket/service/UserService.java index c05d1d2..b889337 100644 --- a/src/main/java/me/jweissen/aeticket/service/UserService.java +++ b/src/main/java/me/jweissen/aeticket/service/UserService.java @@ -8,6 +8,7 @@ import me.jweissen.aeticket.dto.response.UserResponseDto; import me.jweissen.aeticket.model.Cart; import me.jweissen.aeticket.model.Role; import me.jweissen.aeticket.model.User; +import me.jweissen.aeticket.repository.CartRepository; import me.jweissen.aeticket.repository.UserRepository; import org.springframework.stereotype.Service; @@ -18,10 +19,15 @@ import java.util.Optional; public class UserService { private final UserRepository userRepository; private final JwtService jwtService; + private final AuthService authService; + private final CartRepository cartRepository; - public UserService(UserRepository userRepository, JwtService jwtService) { + public UserService(UserRepository userRepository, JwtService jwtService, AuthService authService, + CartRepository cartRepository) { this.userRepository = userRepository; this.jwtService = jwtService; + this.authService = authService; + this.cartRepository = cartRepository; } public static UserResponseDto toDto(User user) { @@ -39,8 +45,7 @@ public class UserService { dto.lastname(), dto.email(), dto.password(), - Role.USER, - new Cart() + Role.USER ); } @@ -54,6 +59,7 @@ public class UserService { public String generateToken(User user) { user.setToken(jwtService.generateToken(user.getId())); + authService.extendToken(user); userRepository.save(user); return user.getToken(); } @@ -61,6 +67,11 @@ public class UserService { public TokenResponseDto create(SignupRequestDto dto) { var user = UserService.fromDto(dto); user = userRepository.save(user); + Cart newCart = new Cart(); + newCart.setUser(user); + cartRepository.save(newCart); + user.setCurrentCart(newCart); + userRepository.save(user); return new TokenResponseDto(generateToken(user)); }