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 ### add
POST {{url}}/cart/add POST {{url}}/cart/add
Authorization: Bearer {{token}}
Content-Type: application/json Content-Type: application/json
{ {
"id": 9999999, "id": 9999999,
"cartEntries": [ "cartEntries": [
{ {
"id": 2, "id": 3,
"amount": 20 "amount": 1
} }
] ]
} }
### list
GET {{url}}/user/signin
### list
GET {{url}}/cart/list
Authorization: Bearer {{token}}
### checkout ### checkout
GET {{url}}/user/update GET {{url}}/cart/checkout
Authorization: Bearer {{token}} Authorization: Bearer {{token}}

View file

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

View file

@ -1,6 +1,6 @@
{ {
"dev": { "dev": {
"url": "http://localhost:8080/api/v1", "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; package me.jweissen.aeticket.controller;
import me.jweissen.aeticket.aspect.UserOnly;
import me.jweissen.aeticket.dto.request.CartAddRequestDto; import me.jweissen.aeticket.dto.request.CartAddRequestDto;
import me.jweissen.aeticket.dto.response.CartEventResponseDto; import me.jweissen.aeticket.dto.response.CartEventResponseDto;
import me.jweissen.aeticket.dto.response.CheckoutResponseDto; import me.jweissen.aeticket.dto.response.CheckoutResponseDto;
@ -23,20 +24,24 @@ public class CartController {
} }
@PostMapping("/add") @PostMapping("/add")
@UserOnly
public ResponseEntity<Void> addEntry(@RequestBody CartAddRequestDto dto) { public ResponseEntity<Void> addEntry(@RequestBody CartAddRequestDto dto) {
System.out.println(authService.getCurrentUser());
if (!cartService.add(dto, authService.getCurrentUser().getCurrentCart())) { if (!cartService.add(dto, authService.getCurrentUser().getCurrentCart())) {
// user gave invalid category id(s) // user gave invalid category id(s) or wanted more tickets than available
return ResponseEntity.status(HttpStatus.NOT_FOUND).build(); return ResponseEntity.status(HttpStatus.BAD_REQUEST).build();
} }
return ResponseEntity.status(HttpStatus.NO_CONTENT).build(); return ResponseEntity.status(HttpStatus.NO_CONTENT).build();
} }
@GetMapping("/list") @GetMapping("/list")
@UserOnly
public ResponseEntity<List<CartEventResponseDto>> getCartEntries() { public ResponseEntity<List<CartEventResponseDto>> getCartEntries() {
return new ResponseEntity<>(cartService.toDto(authService.getCurrentUser().getCurrentCart()), HttpStatus.OK); return new ResponseEntity<>(cartService.toDto(authService.getCurrentUser().getCurrentCart()), HttpStatus.OK);
} }
@GetMapping("/checkout") @GetMapping("/checkout")
@UserOnly
public ResponseEntity<CheckoutResponseDto> checkout() { public ResponseEntity<CheckoutResponseDto> checkout() {
return new ResponseEntity<>(cartService.checkout(authService.getCurrentUser().getCurrentCart()), HttpStatus.OK); return new ResponseEntity<>(cartService.checkout(authService.getCurrentUser().getCurrentCart()), HttpStatus.OK);
} }

View file

@ -1,11 +1,10 @@
package me.jweissen.aeticket.controller; 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.CategoryRequestDto;
import me.jweissen.aeticket.dto.request.CategoryUpdateRequestDto; 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.CategoryResponseDto;
import me.jweissen.aeticket.dto.response.EventResponseDto;
import me.jweissen.aeticket.service.CategoryService; import me.jweissen.aeticket.service.CategoryService;
import org.springframework.http.HttpStatus; import org.springframework.http.HttpStatus;
import org.springframework.http.ResponseEntity; import org.springframework.http.ResponseEntity;
@ -23,16 +22,15 @@ public class CategoryController {
} }
@PostMapping("/create") @PostMapping("/create")
@AdminOnly
public ResponseEntity<Void> create(@RequestBody CategoryRequestDto dto) { public ResponseEntity<Void> create(@RequestBody CategoryRequestDto dto) {
// TODO admin only
categoryService.create(dto); categoryService.create(dto);
return ResponseEntity.status(HttpStatus.CREATED).build(); return ResponseEntity.status(HttpStatus.CREATED).build();
} }
@PutMapping("/update") @PutMapping("/update")
@AdminOnly
public ResponseEntity<Void> update(@RequestBody CategoryUpdateRequestDto dto) { public ResponseEntity<Void> update(@RequestBody CategoryUpdateRequestDto dto) {
// TODO admin only
System.out.println(dto);
if (!categoryService.update(dto)) { if (!categoryService.update(dto)) {
return ResponseEntity.status(HttpStatus.NOT_FOUND).build(); return ResponseEntity.status(HttpStatus.NOT_FOUND).build();
} }
@ -40,13 +38,14 @@ public class CategoryController {
} }
@DeleteMapping("/delete/{id}") @DeleteMapping("/delete/{id}")
@AdminOnly
public ResponseEntity<Void> delete(@PathVariable Long id) { public ResponseEntity<Void> delete(@PathVariable Long id) {
// TODO admin only
categoryService.delete(id); categoryService.delete(id);
return ResponseEntity.status(HttpStatus.NO_CONTENT).build(); return ResponseEntity.status(HttpStatus.NO_CONTENT).build();
} }
@GetMapping("/{id}") @GetMapping("/{id}")
@UserOnly
public ResponseEntity<CategoryResponseDto> getById(@PathVariable Long id) { public ResponseEntity<CategoryResponseDto> getById(@PathVariable Long id) {
return categoryService.getById(id) return categoryService.getById(id)
.map(categoryResponseDto -> new ResponseEntity<>(categoryResponseDto, HttpStatus.OK)) .map(categoryResponseDto -> new ResponseEntity<>(categoryResponseDto, HttpStatus.OK))
@ -54,6 +53,7 @@ public class CategoryController {
} }
@GetMapping("/list") @GetMapping("/list")
@UserOnly
public ResponseEntity<List<CategoryResponseDto>> getAll() { public ResponseEntity<List<CategoryResponseDto>> getAll() {
return new ResponseEntity<>(categoryService.getAll(), HttpStatus.OK); return new ResponseEntity<>(categoryService.getAll(), HttpStatus.OK);
} }

View file

@ -1,5 +1,7 @@
package me.jweissen.aeticket.controller; 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.EventRequestDto;
import me.jweissen.aeticket.dto.request.EventUpdateRequestDto; import me.jweissen.aeticket.dto.request.EventUpdateRequestDto;
import me.jweissen.aeticket.dto.response.EventResponseDto; import me.jweissen.aeticket.dto.response.EventResponseDto;
@ -20,27 +22,28 @@ public class EventController {
} }
@PostMapping("/create") @PostMapping("/create")
@AdminOnly
public ResponseEntity<Void> create(@RequestBody EventRequestDto event) { public ResponseEntity<Void> create(@RequestBody EventRequestDto event) {
// TODO admin only
eventService.create(event); eventService.create(event);
return ResponseEntity.status(HttpStatus.CREATED).build(); return ResponseEntity.status(HttpStatus.CREATED).build();
} }
@PutMapping("/update") @PutMapping("/update")
@AdminOnly
public ResponseEntity<Void> update(@RequestBody EventUpdateRequestDto event) { public ResponseEntity<Void> update(@RequestBody EventUpdateRequestDto event) {
// TODO admin only
eventService.update(event); eventService.update(event);
return ResponseEntity.status(HttpStatus.NO_CONTENT).build(); return ResponseEntity.status(HttpStatus.NO_CONTENT).build();
} }
@DeleteMapping("/delete/{id}") @DeleteMapping("/delete/{id}")
@AdminOnly
public ResponseEntity<Void> delete(@PathVariable Long id) { public ResponseEntity<Void> delete(@PathVariable Long id) {
// TODO admin only
eventService.delete(id); eventService.delete(id);
return ResponseEntity.status(HttpStatus.NO_CONTENT).build(); return ResponseEntity.status(HttpStatus.NO_CONTENT).build();
} }
@GetMapping("/{id}") @GetMapping("/{id}")
@UserOnly
public ResponseEntity<EventResponseDto> getById(@PathVariable Long id) { public ResponseEntity<EventResponseDto> getById(@PathVariable Long id) {
return eventService.getById(id) return eventService.getById(id)
.map(eventResponseDto -> new ResponseEntity<>(eventResponseDto, HttpStatus.OK)) .map(eventResponseDto -> new ResponseEntity<>(eventResponseDto, HttpStatus.OK))
@ -48,6 +51,7 @@ public class EventController {
} }
@GetMapping("/list") @GetMapping("/list")
@UserOnly
public ResponseEntity<List<EventResponseDto>> getAllFuture() { public ResponseEntity<List<EventResponseDto>> getAllFuture() {
return new ResponseEntity<>(eventService.getAllFuture(), HttpStatus.OK); return new ResponseEntity<>(eventService.getAllFuture(), HttpStatus.OK);
} }

View file

@ -1,5 +1,6 @@
package me.jweissen.aeticket.controller; package me.jweissen.aeticket.controller;
import me.jweissen.aeticket.aspect.AdminOnly;
import me.jweissen.aeticket.dto.request.LoginRequestDto; import me.jweissen.aeticket.dto.request.LoginRequestDto;
import me.jweissen.aeticket.dto.request.SignupRequestDto; import me.jweissen.aeticket.dto.request.SignupRequestDto;
import me.jweissen.aeticket.dto.request.UserUpdateRequestDto; import me.jweissen.aeticket.dto.request.UserUpdateRequestDto;
@ -11,7 +12,6 @@ import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.*; import org.springframework.web.bind.annotation.*;
import java.util.List; import java.util.List;
import java.util.Optional;
@RestController @RestController
@RequestMapping("/user") @RequestMapping("/user")
@ -35,8 +35,8 @@ public class UserController {
} }
@PutMapping("/update") @PutMapping("/update")
@AdminOnly
public ResponseEntity<Void> update(@RequestBody UserUpdateRequestDto user) { public ResponseEntity<Void> update(@RequestBody UserUpdateRequestDto user) {
// TODO admin only
if (!userService.update(user)) { if (!userService.update(user)) {
return ResponseEntity.status(HttpStatus.NOT_FOUND).build(); return ResponseEntity.status(HttpStatus.NOT_FOUND).build();
} }
@ -44,21 +44,21 @@ public class UserController {
} }
@DeleteMapping("/delete/{id}") @DeleteMapping("/delete/{id}")
@AdminOnly
public ResponseEntity<Void> delete(@PathVariable Long id) { public ResponseEntity<Void> delete(@PathVariable Long id) {
// TODO admin only
userService.delete(id); userService.delete(id);
return ResponseEntity.status(HttpStatus.NO_CONTENT).build(); return ResponseEntity.status(HttpStatus.NO_CONTENT).build();
} }
@GetMapping("/list") @GetMapping("/list")
@AdminOnly
public ResponseEntity<List<UserResponseDto>> getAll() { public ResponseEntity<List<UserResponseDto>> getAll() {
// TODO admin only
return new ResponseEntity<>(userService.getAll(), HttpStatus.OK); return new ResponseEntity<>(userService.getAll(), HttpStatus.OK);
} }
@GetMapping("/load/{id}") @GetMapping("/load/{id}")
@AdminOnly
public ResponseEntity<UserResponseDto> getById(@PathVariable Long id) { public ResponseEntity<UserResponseDto> getById(@PathVariable Long id) {
// TODO admin only
return userService.getById(id) return userService.getById(id)
.map(userResponseDto -> new ResponseEntity<>(userResponseDto, HttpStatus.OK)) .map(userResponseDto -> new ResponseEntity<>(userResponseDto, HttpStatus.OK))
.orElseGet(() -> ResponseEntity.status(HttpStatus.NOT_FOUND).build()); .orElseGet(() -> ResponseEntity.status(HttpStatus.NOT_FOUND).build());

View file

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

View file

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

View file

@ -6,6 +6,6 @@ import org.springframework.data.jpa.repository.Query;
import org.springframework.data.repository.query.Param; import org.springframework.data.repository.query.Param;
public interface CategoryRepository extends JpaRepository<Category, Long> { 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") @Query("SELECT COALESCE(sum(ce.amount), 0) FROM CartEntry ce WHERE ce.category = :category")
Integer availableTickets(@Param("category") Category category); Integer unavailableTickets(@Param("category") Category category);
} }

View file

@ -57,11 +57,13 @@ public class CartService {
return false; return false;
} }
Category category = categoryOptional.get(); 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 // wants to order more tickets than available
return false; 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); cartRepository.save(cart);
return true; return true;
@ -72,6 +74,7 @@ public class CartService {
cartRepository.save(cart); cartRepository.save(cart);
// reset current cart // reset current cart
Cart newCart = new Cart(); Cart newCart = new Cart();
newCart.setUser(cart.getUser());
newCart = cartRepository.save(newCart); newCart = cartRepository.save(newCart);
cart.getUser().setCurrentCart(newCart); cart.getUser().setCurrentCart(newCart);
userRepository.save(cart.getUser()); 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.Cart;
import me.jweissen.aeticket.model.Role; import me.jweissen.aeticket.model.Role;
import me.jweissen.aeticket.model.User; import me.jweissen.aeticket.model.User;
import me.jweissen.aeticket.repository.CartRepository;
import me.jweissen.aeticket.repository.UserRepository; import me.jweissen.aeticket.repository.UserRepository;
import org.springframework.stereotype.Service; import org.springframework.stereotype.Service;
@ -18,10 +19,15 @@ import java.util.Optional;
public class UserService { public class UserService {
private final UserRepository userRepository; private final UserRepository userRepository;
private final JwtService jwtService; 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.userRepository = userRepository;
this.jwtService = jwtService; this.jwtService = jwtService;
this.authService = authService;
this.cartRepository = cartRepository;
} }
public static UserResponseDto toDto(User user) { public static UserResponseDto toDto(User user) {
@ -39,8 +45,7 @@ public class UserService {
dto.lastname(), dto.lastname(),
dto.email(), dto.email(),
dto.password(), dto.password(),
Role.USER, Role.USER
new Cart()
); );
} }
@ -54,6 +59,7 @@ public class UserService {
public String generateToken(User user) { public String generateToken(User user) {
user.setToken(jwtService.generateToken(user.getId())); user.setToken(jwtService.generateToken(user.getId()));
authService.extendToken(user);
userRepository.save(user); userRepository.save(user);
return user.getToken(); return user.getToken();
} }
@ -61,6 +67,11 @@ public class UserService {
public TokenResponseDto create(SignupRequestDto dto) { public TokenResponseDto create(SignupRequestDto dto) {
var user = UserService.fromDto(dto); var user = UserService.fromDto(dto);
user = userRepository.save(user); 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)); return new TokenResponseDto(generateToken(user));
} }