pfeifn duats heast

This commit is contained in:
Jonas Weissengruber 2023-12-20 01:39:34 +01:00
parent 85d7162419
commit 7dbbdef6c2
12 changed files with 57 additions and 34 deletions

View file

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

View file

@ -1,6 +1,6 @@
### create
POST {{url}}/event/create
# Authorization: Bearer {{token}}
Authorization: Bearer {{token}}
Content-Type: application/json
{

View file

@ -1,6 +1,6 @@
{
"dev": {
"url": "http://localhost:8080/api/v1",
"token": "eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJzdWIiOiJhZXRpY2tldCB1c2VyIHRva2VuIiwiZXhwIjoxNzAzMTAwNzQyLCJ1c2VySWQiOjIsImlhdCI6MTcwMzAxNDM0Mn0.D9HBxWy1vIP82XOh_ocjLO9HB0lK_rQGjgD3a7KQrOE"
"token": "eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJzdWIiOiJhZXRpY2tldCB1c2VyIHRva2VuIiwidXNlcklkIjoxfQ.vcZslqzkJgh8t7hokvwpVaJ-8c0_BnCeHrsBJOGC6qU"
}
}

View file

@ -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<Void> 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<List<CartEventResponseDto>> getCartEntries() {
return new ResponseEntity<>(cartService.toDto(authService.getCurrentUser().getCurrentCart()), HttpStatus.OK);
}
@GetMapping("/checkout")
@UserOnly
public ResponseEntity<CheckoutResponseDto> checkout() {
return new ResponseEntity<>(cartService.checkout(authService.getCurrentUser().getCurrentCart()), HttpStatus.OK);
}

View file

@ -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<Void> create(@RequestBody CategoryRequestDto dto) {
// TODO admin only
categoryService.create(dto);
return ResponseEntity.status(HttpStatus.CREATED).build();
}
@PutMapping("/update")
@AdminOnly
public ResponseEntity<Void> 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<Void> delete(@PathVariable Long id) {
// TODO admin only
categoryService.delete(id);
return ResponseEntity.status(HttpStatus.NO_CONTENT).build();
}
@GetMapping("/{id}")
@UserOnly
public ResponseEntity<CategoryResponseDto> 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<List<CategoryResponseDto>> getAll() {
return new ResponseEntity<>(categoryService.getAll(), HttpStatus.OK);
}

View file

@ -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<Void> create(@RequestBody EventRequestDto event) {
// TODO admin only
eventService.create(event);
return ResponseEntity.status(HttpStatus.CREATED).build();
}
@PutMapping("/update")
@AdminOnly
public ResponseEntity<Void> update(@RequestBody EventUpdateRequestDto event) {
// TODO admin only
eventService.update(event);
return ResponseEntity.status(HttpStatus.NO_CONTENT).build();
}
@DeleteMapping("/delete/{id}")
@AdminOnly
public ResponseEntity<Void> delete(@PathVariable Long id) {
// TODO admin only
eventService.delete(id);
return ResponseEntity.status(HttpStatus.NO_CONTENT).build();
}
@GetMapping("/{id}")
@UserOnly
public ResponseEntity<EventResponseDto> 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<List<EventResponseDto>> getAllFuture() {
return new ResponseEntity<>(eventService.getAllFuture(), HttpStatus.OK);
}

View file

@ -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<Void> 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<Void> delete(@PathVariable Long id) {
// TODO admin only
userService.delete(id);
return ResponseEntity.status(HttpStatus.NO_CONTENT).build();
}
@GetMapping("/list")
@AdminOnly
public ResponseEntity<List<UserResponseDto>> getAll() {
// TODO admin only
return new ResponseEntity<>(userService.getAll(), HttpStatus.OK);
}
@GetMapping("/load/{id}")
@AdminOnly
public ResponseEntity<UserResponseDto> 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());

View file

@ -19,7 +19,7 @@ public class Cart {
private Boolean checkedOut = false;
@OneToMany(mappedBy = "cart")
@Column(nullable = false)
@Column
private List<CartEntry> cartEntries;
@ManyToOne

View file

@ -45,8 +45,6 @@ public class User {
private Role role;
@OneToOne
@JoinColumn(nullable = false)
@NonNull
private Cart currentCart;
@OneToMany(mappedBy = "user")

View file

@ -6,6 +6,6 @@ import org.springframework.data.jpa.repository.Query;
import org.springframework.data.repository.query.Param;
public interface CategoryRepository extends JpaRepository<Category, Long> {
@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);
}

View file

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

View file

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