diff --git a/src/main/java/com/example/backend/DemoApplication.java b/src/main/java/com/example/backend/DemoApplication.java index e6efa80..4fabd3b 100644 --- a/src/main/java/com/example/backend/DemoApplication.java +++ b/src/main/java/com/example/backend/DemoApplication.java @@ -86,22 +86,18 @@ public class DemoApplication implements CommandLineRunner { .create(new UserEntity("TestUser", "user53262@gmail.com", "lawy7728", "user")); log.info("Create default orders values"); - final var order1 = orderService + orderService .create(user1.getId(), new OrderEntity("Выполняется", - "Кемеровская область, город Пушкино, бульвар Ломоносова, 36")); - final var order2 = orderService + "Кемеровская область, город Пушкино, бульвар Ломоносова, 36"), + Map.of(book1.getId(), 3, book3.getId(), 1, book5.getId(), 2)); + orderService .create(user2.getId(), - new OrderEntity("Выдан", "Томская область, город Мытищи, ул. Балканская, 25")); - final var order3 = orderService + new OrderEntity("Выдан", "Томская область, город Мытищи, ул. Балканская, 25"), + Map.of(book4.getId(), 5)); + orderService .create(user3.getId(), - new OrderEntity("Готов", "Челябинская область, город Раменское, пр. Гоголя, 31")); - - orderService.addOrderBooks(user1.getId(), order1.getId(), - Map.of(book1.getId(), 3, book3.getId(), 1, book5.getId(), 2)); - orderService.addOrderBooks(user2.getId(), order2.getId(), - Map.of(book4.getId(), 5)); - orderService.addOrderBooks(user3.getId(), order3.getId(), - Map.of(book2.getId(), 1, book4.getId(), 1)); + new OrderEntity("Готов", "Челябинская область, город Раменское, пр. Гоголя, 31"), + Map.of(book2.getId(), 1, book4.getId(), 1)); } } } diff --git a/src/main/java/com/example/backend/books/model/BookEntity.java b/src/main/java/com/example/backend/books/model/BookEntity.java index 314efbf..825fd9b 100644 --- a/src/main/java/com/example/backend/books/model/BookEntity.java +++ b/src/main/java/com/example/backend/books/model/BookEntity.java @@ -227,7 +227,7 @@ public class BookEntity extends BaseEntity { @Override public int hashCode() { return Objects.hash(id, category, title, author, price, count, description, annotation, bookCode, publisher, - series, publicationYear, pagesNum, size, coverType, circulation, weight, image, orderBooks); + series, publicationYear, pagesNum, size, coverType, circulation, weight, image); } @Override @@ -254,7 +254,6 @@ public class BookEntity extends BaseEntity { && Objects.equals(other.getCoverType(), coverType) && Objects.equals(other.getCirculation(), circulation) && Objects.equals(other.getWeight(), weight) - && Objects.equals(other.getImage(), image) - && Objects.equals(other.getOrderBooks(), orderBooks); + && Objects.equals(other.getImage(), image); } } diff --git a/src/main/java/com/example/backend/core/configuration/MapperConfiguration.java b/src/main/java/com/example/backend/core/configuration/MapperConfiguration.java index b5872d0..7e5c473 100644 --- a/src/main/java/com/example/backend/core/configuration/MapperConfiguration.java +++ b/src/main/java/com/example/backend/core/configuration/MapperConfiguration.java @@ -4,10 +4,15 @@ import org.modelmapper.ModelMapper; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; +import com.example.backend.orders.api.OrderDto; +import com.example.backend.orders.model.OrderEntity; + @Configuration public class MapperConfiguration { @Bean ModelMapper modelMapper() { - return new ModelMapper(); + ModelMapper modelMapper = new ModelMapper(); + modelMapper.typeMap(OrderEntity.class, OrderDto.class).addMappings(mapper -> mapper.skip(OrderDto::setBooks)); + return modelMapper; } } diff --git a/src/main/java/com/example/backend/core/utils/Formatter.java b/src/main/java/com/example/backend/core/utils/Formatter.java index be35427..3a2655a 100644 --- a/src/main/java/com/example/backend/core/utils/Formatter.java +++ b/src/main/java/com/example/backend/core/utils/Formatter.java @@ -8,7 +8,7 @@ public final class Formatter { private Formatter() { } - private static SimpleDateFormat dateFormatter = new SimpleDateFormat("yyyy-MM-dd"); + private static SimpleDateFormat dateFormatter = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); public static String format(Date date) { return dateFormatter.format(date); diff --git a/src/main/java/com/example/backend/orders/api/OrderBookDto.java b/src/main/java/com/example/backend/orders/api/OrderBookDto.java new file mode 100644 index 0000000..1aa39fb --- /dev/null +++ b/src/main/java/com/example/backend/orders/api/OrderBookDto.java @@ -0,0 +1,22 @@ +package com.example.backend.orders.api; + +public class OrderBookDto { + private Long bookId; + private Integer count; + + public Long getBookId() { + return bookId; + } + + public void setBookId(Long bookId) { + this.bookId = bookId; + } + + public Integer getCount() { + return count; + } + + public void setCount(Integer count) { + this.count = count; + } +} diff --git a/src/main/java/com/example/backend/orders/api/OrderController.java b/src/main/java/com/example/backend/orders/api/OrderController.java index f9a6817..32f7ce2 100644 --- a/src/main/java/com/example/backend/orders/api/OrderController.java +++ b/src/main/java/com/example/backend/orders/api/OrderController.java @@ -2,15 +2,15 @@ package com.example.backend.orders.api; import java.text.ParseException; -import java.util.List; +import java.util.Date; import java.util.Map; +import java.util.stream.Collectors; import org.modelmapper.ModelMapper; import org.springframework.web.bind.annotation.DeleteMapping; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.PathVariable; import org.springframework.web.bind.annotation.PostMapping; -import org.springframework.web.bind.annotation.PutMapping; import org.springframework.web.bind.annotation.RequestBody; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RequestParam; @@ -43,6 +43,10 @@ public class OrderController { dto.setDate(Formatter.format(entity.getDate())); dto.setSum(orderService.getSum(entity.getUser().getId(), entity.getId())); dto.setCount(orderService.getFullCount(entity.getUser().getId(), entity.getId())); + dto.setBooks(orderService.getOrderBooks(entity.getUser().getId(), entity + .getId()).stream() + .map(orderBook -> toBookDto(orderBook.getBook())) + .toList()); return dto; } @@ -75,15 +79,10 @@ public class OrderController { public OrderDto create( @PathVariable(name = "user") Long userId, @RequestBody @Valid OrderDto dto) throws ParseException { - return toDto(orderService.create(userId, toEntity(dto))); - } - - @PutMapping("/{id}") - public OrderDto update( - @PathVariable(name = "user") Long userId, - @PathVariable(name = "id") Long id, - @RequestBody @Valid OrderDto dto) throws ParseException { - return toDto(orderService.update(userId, id, toEntity(dto))); + dto.setDate(Formatter.format(new Date())); + Map booksIdsCount = dto.getOrderInfo().stream() + .collect(Collectors.toMap(OrderBookDto::getBookId, OrderBookDto::getCount)); + return toDto(orderService.create(userId, toEntity(dto), booksIdsCount)); } @DeleteMapping("/{id}") @@ -92,52 +91,4 @@ public class OrderController { @PathVariable(name = "id") Long id) { return toDto(orderService.delete(userId, id)); } - - @GetMapping("/{id}/book") - public List getOrderBooks( - @PathVariable(name = "user") Long userId, - @PathVariable(name = "id") Long id) { - return orderService.getOrderBooks(userId, id).stream() - .map(this::toBookDto) - .toList(); - } - - @PostMapping("/{id}/book") - public List addBooks( - @PathVariable(name = "user") Long userId, - @PathVariable(name = "id") Long id, - @RequestBody Map booksIdsCount) { - return orderService.addOrderBooks(userId, id, booksIdsCount).stream() - .map(this::toBookDto) - .toList(); - } - - @PutMapping("/{id}/book") - public List changeBooksCount( - @PathVariable(name = "user") Long userId, - @PathVariable(name = "id") Long id, - @RequestBody Map booksIdsCount) { - return orderService.changeBooksCount(userId, id, booksIdsCount).stream() - .map(this::toBookDto) - .toList(); - } - - @DeleteMapping("/{id}/book") - public List deleteOrderBooks( - @PathVariable(name = "user") Long userId, - @PathVariable(name = "id") Long id, - @RequestParam(name = "books", defaultValue = "") List booksIds) { - return orderService.deleteOrderBooks(userId, id, booksIds).stream() - .map(this::toBookDto) - .toList(); - } - - @DeleteMapping("/{id}/book/all") - public List deleteAllOrderBooks( - @PathVariable(name = "user") Long userId, - @PathVariable(name = "id") Long id) { - return orderService.deleteAllOrderBooks(userId, id).stream() - .map(this::toBookDto) - .toList(); - } } diff --git a/src/main/java/com/example/backend/orders/api/OrderDto.java b/src/main/java/com/example/backend/orders/api/OrderDto.java index cd0a764..ecf080d 100644 --- a/src/main/java/com/example/backend/orders/api/OrderDto.java +++ b/src/main/java/com/example/backend/orders/api/OrderDto.java @@ -1,7 +1,10 @@ package com.example.backend.orders.api; +import com.example.backend.books.api.BookDto; import com.fasterxml.jackson.annotation.JsonProperty; +import java.util.List; + import jakarta.validation.constraints.NotBlank; public class OrderDto { @@ -12,12 +15,15 @@ public class OrderDto { @JsonProperty(access = JsonProperty.Access.READ_ONLY) private Integer count; @JsonProperty(access = JsonProperty.Access.READ_ONLY) - @NotBlank private String date; @NotBlank private String status; @NotBlank private String shippingAddress; + @JsonProperty(access = JsonProperty.Access.WRITE_ONLY) + private List orderInfo; + @JsonProperty(access = JsonProperty.Access.READ_ONLY) + private List books; public Long getId() { return id; @@ -66,4 +72,20 @@ public class OrderDto { public void setShippingAddress(String shippingAddress) { this.shippingAddress = shippingAddress; } + + public List getOrderInfo() { + return orderInfo; + } + + public void setOrderInfo(List orderInfo) { + this.orderInfo = orderInfo; + } + + public List getBooks() { + return books; + } + + public void setBooks(List books) { + this.books = books; + } } diff --git a/src/main/java/com/example/backend/orders/model/OrderEntity.java b/src/main/java/com/example/backend/orders/model/OrderEntity.java index 33c5c1e..ea996a1 100644 --- a/src/main/java/com/example/backend/orders/model/OrderEntity.java +++ b/src/main/java/com/example/backend/orders/model/OrderEntity.java @@ -98,7 +98,7 @@ public class OrderEntity extends BaseEntity { @Override public int hashCode() { - return Objects.hash(id, user.getId(), date, status, shippingAddress, orderBooks); + return Objects.hash(id, user.getId(), date, status, shippingAddress); } @Override @@ -112,7 +112,6 @@ public class OrderEntity extends BaseEntity { && Objects.equals(other.getUser().getId(), user.getId()) && Objects.equals(other.getDate(), date) && Objects.equals(other.getStatus(), status) - && Objects.equals(other.getShippingAddress(), shippingAddress) - && Objects.equals(other.getOrderBooks(), orderBooks); + && Objects.equals(other.getShippingAddress(), shippingAddress); } } diff --git a/src/main/java/com/example/backend/orders/service/OrderService.java b/src/main/java/com/example/backend/orders/service/OrderService.java index af7d63b..0bd47ff 100644 --- a/src/main/java/com/example/backend/orders/service/OrderService.java +++ b/src/main/java/com/example/backend/orders/service/OrderService.java @@ -2,7 +2,6 @@ package com.example.backend.orders.service; import java.util.List; import java.util.Map; -import java.util.Objects; import org.springframework.data.domain.Page; import org.springframework.data.domain.PageRequest; @@ -14,10 +13,10 @@ import com.example.backend.core.error.NotFoundException; import com.example.backend.orders.model.OrderEntity; import com.example.backend.orders.repository.OrderRepository; import com.example.backend.books.model.BookEntity; -import com.example.backend.books.service.BookService; import com.example.backend.users.model.UserEntity; import com.example.backend.users.service.UserService; import com.example.backend.ordersbooks.model.OrderBookEntity; +import com.example.backend.books.service.BookService; @Service public class OrderService { @@ -52,24 +51,23 @@ public class OrderService { } @Transactional - public OrderEntity create(long userId, OrderEntity entity) { + public OrderEntity create(long userId, OrderEntity entity, Map booksIdsCount) { if (entity == null) { throw new IllegalArgumentException("Entity is null"); } final UserEntity existsUser = userService.get(userId); entity.setUser(existsUser); + List result = bookService.getAll(0L).stream() + .filter(book -> booksIdsCount.containsKey(book.getId())) + .toList(); + result.forEach(book -> { + final OrderBookEntity orderBook = new OrderBookEntity(entity, book, booksIdsCount.get(book.getId())); + orderBook.setOrder(entity); + orderBook.setBook(book); + }); return repository.save(entity); } - @Transactional - public OrderEntity update(long userId, long id, OrderEntity entity) { - userService.get(userId); - final OrderEntity existsEntity = get(userId, id); - existsEntity.setStatus(entity.getStatus()); - existsEntity.setShippingAddress(entity.getShippingAddress()); - return repository.save(existsEntity); - } - @Transactional public OrderEntity delete(long userId, long id) { userService.get(userId); @@ -78,14 +76,6 @@ public class OrderService { return existsEntity; } - @Transactional(readOnly = true) - public List getOrderBooks(long userId, long id) { - userService.get(userId); - return get(userId, id).getOrderBooks().stream() - .map(OrderBookEntity::getBook) - .toList(); - } - @Transactional(readOnly = true) public Double getSum(long userId, long id) { userService.get(userId); @@ -102,74 +92,10 @@ public class OrderService { .sum(); } - @Transactional - public List addOrderBooks( - long userId, - long id, - Map booksIdsCount) { + @Transactional(readOnly = true) + public List getOrderBooks(long userId, long id) { userService.get(userId); - final OrderEntity existsOrder = get(userId, id); - List result = bookService.getAll(0L).stream() - .filter(book -> booksIdsCount.containsKey(book.getId())) - .toList(); - result.forEach(book -> { - final OrderBookEntity orderBook = new OrderBookEntity(existsOrder, book, booksIdsCount.get(book.getId())); - orderBook.setOrder(existsOrder); - orderBook.setBook(book); - }); - repository.save(existsOrder); - return result; - } - - @Transactional - public List changeBooksCount( - long userId, - long id, - Map booksIdsCount) { - userService.get(userId); - final OrderEntity existsOrder = get(userId, id); - List result = existsOrder.getOrderBooks().stream() - .filter(book -> Objects.nonNull(book.getBook())) - .filter(book -> booksIdsCount.containsKey(book.getBook().getId())) - .map(book -> { - Integer newCount = booksIdsCount.getOrDefault(book.getBook().getId(), book.getCount()); - book.setCount(newCount); - return book.getBook(); - }) - .toList(); - repository.save(existsOrder); - return result; - } - - @Transactional - public List deleteOrderBooks( - long userId, - long id, - List booksIds) { - userService.get(userId); - final OrderEntity existsOrder = get(userId, id); - final List books = existsOrder.getOrderBooks().stream() - .filter(book -> Objects.nonNull(book.getBook())) - .filter(book -> booksIds.contains(book.getBook().getId())) - .toList(); - books.forEach(existsOrder::deleteBook); - repository.save(existsOrder); - return books.stream() - .map(OrderBookEntity::getBook) - .toList(); - } - - @Transactional - public List deleteAllOrderBooks(long userId, long id) { - userService.get(userId); - final OrderEntity existsOrder = get(userId, id); - final List books = existsOrder.getOrderBooks().stream() - .filter(book -> Objects.nonNull(book.getBook())) - .toList(); - books.forEach(existsOrder::deleteBook); - repository.save(existsOrder); - return books.stream() - .map(OrderBookEntity::getBook) + return get(userId, id).getOrderBooks().stream() .toList(); } } diff --git a/src/main/java/com/example/backend/users/model/UserEntity.java b/src/main/java/com/example/backend/users/model/UserEntity.java index 87d2556..5ff6163 100644 --- a/src/main/java/com/example/backend/users/model/UserEntity.java +++ b/src/main/java/com/example/backend/users/model/UserEntity.java @@ -84,7 +84,7 @@ public class UserEntity extends BaseEntity { @Override public int hashCode() { - return Objects.hash(id, login, email, password, accessLevel, orders); + return Objects.hash(id, login, email, password, accessLevel); } @Override @@ -98,7 +98,6 @@ public class UserEntity extends BaseEntity { && Objects.equals(other.getLogin(), login) && Objects.equals(other.getEmail(), email) && Objects.equals(other.getPassword(), password) - && Objects.equals(other.getAccessLevel(), accessLevel) - && Objects.equals(other.getOrders(), orders); + && Objects.equals(other.getAccessLevel(), accessLevel); } } diff --git a/src/test/java/com/example/backend/OrderServiceTests.java b/src/test/java/com/example/backend/OrderServiceTests.java index 86ca055..862a72a 100644 --- a/src/test/java/com/example/backend/OrderServiceTests.java +++ b/src/test/java/com/example/backend/OrderServiceTests.java @@ -1,6 +1,5 @@ package com.example.backend; -import java.util.List; import java.util.Map; import org.junit.jupiter.api.AfterEach; @@ -69,15 +68,18 @@ class OrderServiceTests { "21.5x14.4x4.1", "Твердый переплёт", 8000, 1020, "")); user = userService .create(new UserEntity("Chief", "forum98761@gmail.com", "bth4323", "admin")); - order = orderService.create(user.getId(), new OrderEntity("Выполняется", - "Кемеровская область, город Пушкино, бульвар Ломоносова, 36")); - orderService.create(user.getId(), new OrderEntity("Выдан", - "Томская область, город Мытищи, ул. Балканская, 25")); - orderService.create(user.getId(), new OrderEntity("Готов", - "Челябинская область, город Раменское, пр. Гоголя, 31")); - - orderService.addOrderBooks(user.getId(), order.getId(), - Map.of(book1.getId(), 3, book2.getId(), 1, book3.getId(), 2)); + order = orderService + .create(user.getId(), new OrderEntity("Выполняется", + "Кемеровская область, город Пушкино, бульвар Ломоносова, 36"), + Map.of(book1.getId(), 3, book2.getId(), 1, book3.getId(), 2)); + orderService + .create(user.getId(), + new OrderEntity("Выдан", "Томская область, город Мытищи, ул. Балканская, 25"), + Map.of(book1.getId(), 5)); + orderService + .create(user.getId(), + new OrderEntity("Готов", "Челябинская область, город Раменское, пр. Гоголя, 31"), + Map.of(book2.getId(), 1, book3.getId(), 1)); } @AfterEach @@ -104,20 +106,8 @@ class OrderServiceTests { final OrderEntity nullableOrder = new OrderEntity(null, "Кемеровская область, город Пушкино, бульвар Ломоносова, 36"); Assertions.assertThrows(DataIntegrityViolationException.class, - () -> orderService.create(user.getId(), nullableOrder)); - } - - @Transactional - @Test - void updateTest() { - final String test = "TEST"; - final String oldStatus = order.getStatus(); - final OrderEntity newEntity = orderService.update(user.getId(), order.getId(), - new OrderEntity(test, "Кемеровская область, город Пушкино, бульвар Ломоносова, 36")); - Assertions.assertEquals(3, orderService.getAll(user.getId()).size()); - Assertions.assertEquals(newEntity, orderService.get(user.getId(), order.getId())); - Assertions.assertEquals(test, newEntity.getStatus()); - Assertions.assertNotEquals(oldStatus, newEntity.getStatus()); + () -> orderService.create(user.getId(), nullableOrder, + Map.of(book1.getId(), 3, book2.getId(), 1, book3.getId(), 2))); } @Test @@ -126,7 +116,8 @@ class OrderServiceTests { Assertions.assertEquals(2, orderService.getAll(user.getId()).size()); final OrderEntity newEntity = orderService.create(user.getId(), - new OrderEntity(order.getStatus(), order.getShippingAddress())); + new OrderEntity(order.getStatus(), order.getShippingAddress()), + Map.of(book1.getId(), 3, book2.getId(), 1, book3.getId(), 2)); Assertions.assertEquals(3, orderService.getAll(user.getId()).size()); Assertions.assertNotEquals(order.getId(), newEntity.getId()); } @@ -145,38 +136,7 @@ class OrderServiceTests { @Transactional @Test - void AddOrderBooksTest() { - final var category = categoryService.create(new CategoryEntity("Детективы")); - final var book = bookService.create(new BookEntity(category, "Портрет Дориана Грея", - "Оскар Уайльд", 209.00, 790, "", "", "2592760", - "Neoclassic", "Эксклюзивная классика", 2016, 320, - "17.9x11.4x1.6", "Мягкий переплёт", 254000, 200, "")); + void getOrderBooksTest() { Assertions.assertEquals(3, orderService.getOrderBooks(user.getId(), order.getId()).size()); - orderService.addOrderBooks(user.getId(), order.getId(), Map.of(book.getId(), 5)); - Assertions.assertEquals(4, orderService.getOrderBooks(user.getId(), order.getId()).size()); - } - - @Transactional - @Test - void changeBooksCountTest() { - Assertions.assertEquals(6, orderService.getFullCount(user.getId(), order.getId())); - orderService.changeBooksCount(user.getId(), order.getId(), Map.of(book2.getId(), 4, book3.getId(), 1)); - Assertions.assertEquals(8, orderService.getFullCount(user.getId(), order.getId())); - } - - @Transactional - @Test - void deleteOrderBooksTest() { - Assertions.assertEquals(3, orderService.getOrderBooks(user.getId(), order.getId()).size()); - orderService.deleteOrderBooks(user.getId(), order.getId(), List.of(book1.getId(), book3.getId())); - Assertions.assertEquals(1, orderService.getOrderBooks(user.getId(), order.getId()).size()); - } - - @Transactional - @Test - void deleteAllOrderBooksTest() { - Assertions.assertEquals(3, orderService.getOrderBooks(user.getId(), order.getId()).size()); - orderService.deleteAllOrderBooks(user.getId(), order.getId()); - Assertions.assertEquals(0, orderService.getOrderBooks(user.getId(), order.getId()).size()); } }