Осталось только подправить сумму в строке заказа

This commit is contained in:
Алексей Крюков 2024-04-14 17:58:19 +04:00
parent 80fee84170
commit 8f95825cb0
23 changed files with 67 additions and 311 deletions

Binary file not shown.

View File

@ -66,9 +66,9 @@ public class DemoApplication implements CommandLineRunner {
log.info("Create default orders values");
@SuppressWarnings({ "rawtypes", "unchecked" })
List<OrderLineEntity> lines = new ArrayList();
lines.add(new OrderLineEntity(null, null, 3, null));
lines.add(new OrderLineEntity(null, 3));
final var user1 = userService.create(new UserEntity(null, "Alex", "Kryukov", "akryu@mail.ru", "password"));
orderService.create(new OrderEntity(null, user1, lines));
orderService.create(new OrderEntity(null, user1, null));
}
}
}

View File

@ -1,97 +0,0 @@
package com.example.demo.order_lines.api;
import java.util.List;
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;
import org.springframework.web.bind.annotation.RestController;
import com.example.demo.core.configuration.Constants;
import com.example.demo.order_lines.model.OrderLineEntity;
import com.example.demo.order_lines.service.OrderLineService;
import com.example.demo.products.model.ProductEntity;
import com.example.demo.products.service.ProductService;
import jakarta.validation.Valid;
@RestController
@RequestMapping(Constants.API_URL + "/orderLine")
public class OrderLineController {
private final OrderLineService orderLineService;
private final ProductService productService;
private final ModelMapper modelMapper;
public OrderLineController(OrderLineService orderLineService,
ProductService productService, ModelMapper modelMapper) {
this.orderLineService = orderLineService;
this.productService = productService;
this.modelMapper = modelMapper;
}
private OrderLineDto toDto(OrderLineEntity orderLineEntity) {
return modelMapper.map(orderLineEntity, OrderLineDto.class);
}
private OrderLineEntity toEntity(OrderLineDto dto) {
// Получаем заказ и товар из соответствующих сервисов по их идентификаторам из
ProductEntity product = productService.get(dto.getProductId());
// Создаем новый экземпляр OrderLineEntity с помощью модельного маппера
OrderLineEntity entity = modelMapper.map(dto, OrderLineEntity.class);
// Устанавливаем полученные заказ и товар в OrderLineEntity
entity.setProduct(product);
return entity;
}
@GetMapping
public List<OrderLineDto> getAll(@RequestParam(name = "orderId", defaultValue = "0") Long orderId) {
return orderLineService.getAll(orderId).stream().map(this::toDto).toList();
}
@GetMapping("/{id}")
public OrderLineDto get(@PathVariable(name = "id") Long id) {
return toDto(orderLineService.get(id));
}
@PostMapping
public OrderLineDto create(@RequestBody @Valid OrderLineDto dto) {
// Получаем информацию о продукте по его ID
ProductEntity product = productService.get(dto.getProductId());
// Рассчитываем общую сумму строки заказа
double totalPrice = product.getPrice() * dto.getCount();
// Создаем новую сущность строки заказа
OrderLineEntity orderLineEntity = toEntity(dto);
// Устанавливаем общую сумму в сущность строки заказа
orderLineEntity.setTotalPrice(totalPrice);
// Создаем строку заказа
OrderLineEntity createdOrderLine = orderLineService.create(orderLineEntity);
// Преобразуем созданную строку заказа в DTO
OrderLineDto createdOrderLineDto = toDto(createdOrderLine);
// Возвращаем созданную строку заказа в виде DTO с заполненным полем totalPrice
return createdOrderLineDto;
}
@PutMapping("/{id}")
public OrderLineDto update(@PathVariable(name = "id") Long id, @RequestBody OrderLineDto dto) {
return toDto(orderLineService.update(id, toEntity(dto)));
}
@DeleteMapping("/{id}")
public OrderLineDto delete(@PathVariable(name = "id") Long id) {
return toDto(orderLineService.delete(id));
}
}

View File

@ -7,8 +7,6 @@ import jakarta.validation.constraints.NotBlank;
import jakarta.validation.constraints.NotNull;
public class OrderLineDto {
@JsonProperty(access = JsonProperty.Access.READ_ONLY)
private Long id;
@NotNull
@Min(1)
private Long productId;
@ -25,14 +23,6 @@ public class OrderLineDto {
this.totalPriceLine = totalPriceLine;
}
public Long getId() {
return id;
}
public void setId(Long id) {
this.id = id;
}
public Integer getCount() {
return count;
}

View File

@ -2,33 +2,22 @@ package com.example.demo.order_lines.model;
import java.util.Objects;
import javax.persistence.JoinColumn;
import javax.persistence.ManyToOne;
import com.example.demo.core.model.BaseEntity;
import com.example.demo.orders.model.OrderEntity;
import com.example.demo.products.model.ProductEntity;
import com.fasterxml.jackson.annotation.JsonBackReference;
public class OrderLineEntity extends BaseEntity {
private Integer count;
private ProductEntity product;
private Double totalPrice;
@ManyToOne
@JoinColumn(name = "order_id")
@JsonBackReference // Это свойство не управляется родительским объектом
private OrderEntity order;
public OrderLineEntity() {
}
public OrderLineEntity(Long id, ProductEntity product, Integer count, Double totalPrice) {
super(id);
public OrderLineEntity(ProductEntity product, Integer count) {
this.product = product;
this.count = count;
this.totalPrice = totalPrice;
}
public ProductEntity getProduct() {
@ -57,7 +46,7 @@ public class OrderLineEntity extends BaseEntity {
@Override
public int hashCode() {
return Objects.hash(id, product, count);
return Objects.hash(id, product, count, totalPrice);
}
@SuppressWarnings("unlikely-arg-order-product")
@ -68,8 +57,8 @@ public class OrderLineEntity extends BaseEntity {
if (obj == null || getClass() != obj.getClass())
return false;
final OrderLineEntity other = (OrderLineEntity) obj;
return Objects.equals(other.getId(), id)
&& Objects.equals(other.getProduct(), product)
&& Objects.equals(other.getCount(), count);
return Objects.equals(other.getProduct(), product)
&& Objects.equals(other.getCount(), count)
&& Objects.equals(other.getTotalPrice(), totalPrice);
}
}

View File

@ -1,48 +0,0 @@
package com.example.demo.order_lines.service;
import java.util.List;
import java.util.Objects;
import java.util.Optional;
import org.springframework.stereotype.Service;
import com.example.demo.core.error.NotFoundException;
import com.example.demo.order_lines.model.OrderLineEntity;
import com.example.demo.order_lines.repository.OrderLineRepository;
@Service
public class OrderLineService {
private final OrderLineRepository repository;
public OrderLineService(OrderLineRepository repository) {
this.repository = repository;
}
public List<OrderLineEntity> getAll(Long orderLineId) {
if (Objects.equals(orderLineId, 0L)) {
return repository.getAll();
}
return repository.getAll();
}
public OrderLineEntity get(Long id) {
return Optional.ofNullable(repository.get(id))
.orElseThrow(() -> new NotFoundException(id));
}
public OrderLineEntity create(OrderLineEntity entity) {
return repository.create(entity);
}
public OrderLineEntity update(Long id, OrderLineEntity entity) {
final OrderLineEntity existsEntity = get(id);
existsEntity.setProduct(entity.getProduct());
existsEntity.setCount(entity.getCount());
return repository.update(existsEntity);
}
public OrderLineEntity delete(Long id) {
final OrderLineEntity existsEntity = get(id);
return repository.delete(existsEntity);
}
}

View File

@ -1,22 +1,12 @@
package com.example.demo.orders.api;
import java.sql.Date;
import java.util.ArrayList;
import java.util.List;
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;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.bind.annotation.*;
import com.example.demo.core.configuration.Constants;
import com.example.demo.order_lines.api.OrderLineDto;
import com.example.demo.order_lines.model.OrderLineEntity;
import com.example.demo.order_lines.service.OrderLineService;
import com.example.demo.orders.model.OrderEntity;
import com.example.demo.orders.service.OrderService;
import com.example.demo.users.service.UserService;
@ -28,33 +18,25 @@ public class OrderController {
private final OrderService orderService;
private final UserService userService;
private final ModelMapper modelMapper;
private final OrderLineService orderLineService;
public OrderController(OrderService orderService, UserService userService, ModelMapper modelMapper,
OrderLineService orderLineService) {
public OrderController(OrderService orderService, UserService userService, ModelMapper modelMapper) {
this.orderService = orderService;
this.userService = userService;
this.modelMapper = modelMapper;
this.orderLineService = orderLineService;
}
private OrderDto toDto(OrderEntity entity) {
var dto = new OrderDto();
dto.setId(entity.getId());
dto.setUserId(entity.getUser().getId());
// Преобразование каждой сущности OrderLineEntity в OrderLineDto и добавление их
// в список lines
dto.setDate(new Date(System.currentTimeMillis()));
for (OrderLineEntity orderLineEntity : entity.getLines()) {
OrderLineDto orderLineDto = new OrderLineDto();
orderLineDto.setId(orderLineEntity.getId());
orderLineDto.setProductId(orderLineEntity.getProduct().getId());
orderLineDto.setCount(orderLineEntity.getCount());
orderLineDto.setTotalPriceLine(orderLineEntity.getTotalPrice());
dto.addOrderLine(orderLineDto);
}
dto.setDate(new Date(System.currentTimeMillis()));
return dto;
}
@ -63,7 +45,6 @@ public class OrderController {
if (dto.getUserId() != null) {
entity.setUser(userService.get(dto.getUserId()));
}
// устанавливаем связь между заказом и строками заказа
entity.getLines().clear();
for (OrderLineDto lineDto : dto.getLines()) {
OrderLineEntity orderLineEntity = modelMapper.map(lineDto, OrderLineEntity.class);

View File

@ -1,14 +1,13 @@
package com.example.demo.orders.api;
import java.sql.Date;
import java.util.ArrayList;
import java.util.List;
import com.example.demo.order_lines.api.OrderLineDto;
import com.fasterxml.jackson.annotation.JsonProperty;
import jakarta.validation.constraints.Min;
import jakarta.validation.constraints.NotNull;
import java.sql.Date;
import java.util.ArrayList;
import java.util.List;
public class OrderDto {
@JsonProperty(access = JsonProperty.Access.READ_ONLY)
@ -45,7 +44,7 @@ public class OrderDto {
return lines;
}
// метод для добавленя строк заказа
// метод для добавления строк заказа
public void addOrderLine(OrderLineDto orderLine) {
this.lines.add(orderLine);
}
@ -54,4 +53,5 @@ public class OrderDto {
public Date getDate() {
return date;
}
}

View File

@ -1,28 +1,36 @@
package com.example.demo.orders.model;
import java.util.ArrayList;
import java.util.List;
import java.util.Objects;
import com.example.demo.core.model.BaseEntity;
import com.example.demo.order_lines.model.OrderLineEntity;
import com.example.demo.users.model.UserEntity;
import com.fasterxml.jackson.annotation.JsonManagedReference;
import java.util.ArrayList;
import java.util.List;
import java.util.Objects;
public class OrderEntity extends BaseEntity {
private UserEntity user;
@JsonManagedReference
private final List<OrderLineEntity> lines = new ArrayList<>();
private Double totalPrice;
public OrderEntity() {
super();
}
public OrderEntity(Long id, UserEntity user, List<OrderLineEntity> lines) {
public OrderEntity(Long id, UserEntity user, Double totalPrice) {
super(id);
this.user = user;
this.lines.clear();
this.lines.addAll(lines);
this.totalPrice = totalPrice;
}
public Double getTotalPrice() {
return totalPrice;
}
public void setTotalPrice(Double totalPrice) {
this.totalPrice = totalPrice;
}
public UserEntity getUser() {
@ -37,13 +45,17 @@ public class OrderEntity extends BaseEntity {
return lines;
}
public void setLines(OrderLineEntity line) {
this.lines.add(line);
public void addOrderLine(OrderLineEntity orderLine) {
this.lines.add(orderLine);
}
public void removeOrderLine(OrderLineEntity orderLine) {
this.lines.remove(orderLine);
}
@Override
public int hashCode() {
return Objects.hash(id, user, lines);
return Objects.hash(id, user, lines, totalPrice);
}
@SuppressWarnings("unlikely-arg-user")
@ -56,11 +68,14 @@ public class OrderEntity extends BaseEntity {
final OrderEntity other = (OrderEntity) obj;
return Objects.equals(other.getId(), id)
&& Objects.equals(other.getUser(), user)
&& Objects.equals(other.getLines(), lines);
&& Objects.equals(other.getLines(), lines)
&& Objects.equals(other.getTotalPrice(), totalPrice);
}
// метод добавления строк заказа в заказ
public void addOrderLine(OrderLineEntity orderLine) {
this.lines.add(orderLine);
public Double calculateTotalOrderPrice() {
for (OrderLineEntity orderLine : lines) {
totalPrice += orderLine.getProduct().getPrice() * orderLine.getCount();
}
return totalPrice;
}
}

View File

@ -1,44 +1,35 @@
package com.example.demo.orders.service;
import java.util.ArrayList;
import java.util.List;
import java.util.Objects;
import java.util.Optional;
import org.springframework.stereotype.Service;
import com.example.demo.core.error.NotFoundException;
import com.example.demo.order_lines.service.OrderLineService;
import com.example.demo.order_lines.model.OrderLineEntity;
import com.example.demo.orders.model.OrderEntity;
import com.example.demo.orders.repository.OrderRepository;
@Service
public class OrderService {
private final OrderRepository repository;
private final OrderLineService orderLineService;
public OrderService(OrderRepository repository, OrderLineService orderLineService) {
public OrderService(OrderRepository repository) {
this.repository = repository;
this.orderLineService = orderLineService;
}
public List<OrderEntity> getAll(Long userId, List<Long> lines) {
var linesEnt = new ArrayList<>();
for (var lineid : lines) {
linesEnt.add(orderLineService.get(lineid));
}
if (!Objects.equals(userId, 0L) && !Objects.equals(linesEnt.size(), 0)) {
if (userId != 0L && !lines.isEmpty()) {
return repository.getAll().stream()
.filter(line -> line.getUser().getId().equals(
userId) && line.getLines().containsAll(linesEnt))
.filter(line -> line.getUser().getId().equals(userId) && line.getLines().stream()
.allMatch(orderLine -> lines.contains(orderLine.getProduct().getId())))
.toList();
}
if (Objects.equals(userId, 0L) && !Objects.equals(linesEnt.size(), 0)) {
return repository.getAll().stream().filter(line -> line.getLines().containsAll(linesEnt)).toList();
if (userId == 0L && !lines.isEmpty()) {
return repository.getAll().stream().filter(line -> line.getLines().stream()
.allMatch(orderLine -> lines.contains(orderLine.getProduct().getId()))).toList();
}
if (!Objects.equals(userId, 0L) && Objects.equals(linesEnt.size(), 0)) {
if (userId != 0L && lines.isEmpty()) {
return repository.getAll().stream().filter(line -> line.getUser().getId().equals(userId)).toList();
}
return repository.getAll();
@ -56,11 +47,13 @@ public class OrderService {
public OrderEntity update(Long id, OrderEntity entity) {
final OrderEntity existEntity = get(id);
existEntity.setUser(entity.getUser());
existEntity.getLines().clear(); // Очищаем существующие строки заказа
var lines = entity.getLines();
for (var line : lines) {
existEntity.setLines(line);
// Очищаем текущие строки заказа и добавляем новые
existEntity.getLines().clear();
for (OrderLineEntity newOrderLine : entity.getLines()) {
existEntity.addOrderLine(newOrderLine);
}
return repository.update(existEntity);
}

View File

@ -33,7 +33,9 @@ public class ProductController {
}
private ProductDto toDto(ProductEntity entity) {
return modelMapper.map(entity, ProductDto.class);
ProductDto dto = modelMapper.map(entity, ProductDto.class);
dto.setPrice(entity.getPrice());
return dto;
}
private ProductEntity toEntity(ProductDto dto) {

View File

@ -1,69 +0,0 @@
package com.example.demo;
import org.junit.jupiter.api.Assertions;
import org.junit.jupiter.api.MethodOrderer;
import org.junit.jupiter.api.Order;
import org.junit.jupiter.api.Test;
import org.junit.jupiter.api.TestMethodOrder;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import com.example.demo.core.error.NotFoundException;
import com.example.demo.order_lines.model.OrderLineEntity;
import com.example.demo.order_lines.service.OrderLineService;
@SpringBootTest
@TestMethodOrder(MethodOrderer.OrderAnnotation.class)
class OrderLineServiceTests {
@Autowired
private OrderLineService orderLineService;
@Test
void getTest() {
Assertions.assertThrows(NotFoundException.class, () -> orderLineService.get(0L));
}
@Test
@Order(1)
void createTest() {
// Создаем тестовую сущность OrderLineEntity
OrderLineEntity testOrderLine = new OrderLineEntity(null, null, 5, null);
// Вызываем метод create() и сохраняем созданную сущность
OrderLineEntity createdOrderLine = orderLineService.create(testOrderLine);
// Проверяем, что метод create() вернул не null
Assertions.assertNotNull(createdOrderLine);
// Проверяем, что созданная сущность имеет назначенный ID
Assertions.assertNotNull(createdOrderLine.getId());
// Проверяем, что созданная сущность соответствует той, которую мы передали
Assertions.assertEquals(testOrderLine.getCount(), createdOrderLine.getCount());
}
@Test
@Order(2)
void updateTest() {
// Получаем сущность OrderLineEntity для обновления
OrderLineEntity existingOrderLine = orderLineService.get(1L);
// Создаем новое количество для обновления
int newCount = 10;
// Устанавливаем новое количество в сущность OrderLineEntity
existingOrderLine.setCount(newCount);
// Вызываем метод update() и сохраняем обновленную сущность
OrderLineEntity updatedOrderLine = orderLineService.update(1L, existingOrderLine);
// Проверяем, что метод update() вернул не null
Assertions.assertNotNull(updatedOrderLine);
// Проверяем, что обновленная сущность имеет то же количество, что и заданное
Assertions.assertEquals(newCount, updatedOrderLine.getCount());
}
@Test
@Order(3)
void deleteTest() {
// Удаляем сущность OrderLineEntity по ее ID
OrderLineEntity deletedOrderLine = orderLineService.delete(1L);
// Проверяем, что метод delete() вернул не null
Assertions.assertNotNull(deletedOrderLine);
// Проверяем, что удаленная сущность имеет тот же ID, что и удаленная
Assertions.assertEquals(1L, deletedOrderLine.getId());
// Проверяем, что сущность больше не существует в репозитории
Assertions.assertThrows(NotFoundException.class, () -> orderLineService.get(1L));
}
}

View File

@ -32,12 +32,12 @@ class OrderServiceTests {
orderService.create(new OrderEntity(null, null, null));
@SuppressWarnings({ "rawtypes", "unchecked" })
List<OrderLineEntity> lines = new ArrayList();
lines.add(new OrderLineEntity(null, null, 4, null));
lines.add(new OrderLineEntity(null, null, 5, null));
lines.add(new OrderLineEntity(null, null, 6, null));
lines.add(new OrderLineEntity(null, null, 7, null));
lines.add(new OrderLineEntity(null, 4));
lines.add(new OrderLineEntity(null, 5));
lines.add(new OrderLineEntity(null, 6));
lines.add(new OrderLineEntity(null, 7));
// Создаем тестовую сущность OrderEntity
OrderEntity testOrder = new OrderEntity(null, null, lines);
OrderEntity testOrder = new OrderEntity(null, null, null);
// Вызываем метод create() и сохраняем созданную сущность
OrderEntity createdOrder = orderService.create(testOrder);
// Проверяем, что метод create() вернул не null