Add application service classes.

This commit is contained in:
Ali CANLI
2022-07-10 13:34:42 +03:00
parent 1c950f3e45
commit 56cdf7191a
2 changed files with 72 additions and 44 deletions

View File

@@ -3,64 +3,29 @@ package com.food.order.domain;
import com.food.order.domain.dto.create.CreateOrderCommand;
import com.food.order.domain.dto.create.CreateOrderResponse;
import com.food.order.domain.mapper.OrderDataMapper;
import com.food.order.domain.ports.output.repository.CustomerRepository;
import com.food.order.domain.ports.output.repository.OrderRepository;
import com.food.order.domain.ports.output.repository.RestaurantRepository;
import com.food.order.system.domain.entity.Order;
import com.food.order.system.domain.entity.Restaurant;
import com.food.order.system.domain.exception.OrderDomainException;
import com.food.order.system.domain.service.OrderDomainService;
import com.food.order.domain.ports.output.message.publisher.payment.OrderCreatedPaymentRequestMessagePublisher;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Component;
import org.springframework.transaction.annotation.Transactional;
import java.util.Objects;
import java.util.UUID;
@Component
@Slf4j
@RequiredArgsConstructor
public class OrderCreateCommandHandler {
private final OrderDomainService orderDomainService;
private final OrderRepository orderRepository;
private final CustomerRepository customerRepository;
private final RestaurantRepository restaurantRepository;
private final OrderCreateHelper orderCreateHelper;
private final OrderDataMapper orderDataMapper;
@Transactional
private final OrderCreatedPaymentRequestMessagePublisher orderCreatedPaymentRequestMessagePublisher;
public CreateOrderResponse createOrder(CreateOrderCommand createOrderCommand) {
log.info("createOrder: {}", createOrderCommand);
checkCustomer(createOrderCommand.getCustomerId());
Restaurant restaurant = checkRestaurant(createOrderCommand);
var order = orderDataMapper.createOrderCommandToOrder(createOrderCommand);
var createdEventOrder = orderDomainService.validateAndInitiateOrder(order, restaurant);
var savedOrder = saveOrder(order);
log.info("createOrder with id: {}", savedOrder.getId().getValue());
return orderDataMapper.orderToCreateOrderResponse(savedOrder,"Order created successfully");
var persistOrder = orderCreateHelper.persistOrder(createOrderCommand);
log.info("createOrder with id: {}", persistOrder.getOrder().getId().getValue());
orderCreatedPaymentRequestMessagePublisher.publish(persistOrder);
return orderDataMapper.orderToCreateOrderResponse(persistOrder.getOrder(),"Order created successfully");
}
private Restaurant checkRestaurant(CreateOrderCommand createOrderCommand) {
return restaurantRepository.findRestaurantInformation
(orderDataMapper.createOrderCommandToRestaurant(createOrderCommand))
.orElseThrow(() -> new OrderDomainException("Restaurant not found. " +
"Please check restaurant id: " + createOrderCommand.getRestaurantId()));
}
private void checkCustomer(UUID customerId) {
customerRepository.findCustomer(customerId)
.orElseThrow(() -> new OrderDomainException("Customer not found. CustomerId: " + customerId));
}
private Order saveOrder(Order order){
var savedOrder = orderRepository.save(order);
if (Objects.isNull(savedOrder)) {
throw new OrderDomainException("Order not saved");
}
return savedOrder;
}
}

View File

@@ -0,0 +1,63 @@
package com.food.order.domain;
import com.food.order.domain.dto.create.CreateOrderCommand;
import com.food.order.domain.mapper.OrderDataMapper;
import com.food.order.domain.ports.output.repository.CustomerRepository;
import com.food.order.domain.ports.output.repository.OrderRepository;
import com.food.order.domain.ports.output.repository.RestaurantRepository;
import com.food.order.system.domain.entity.Order;
import com.food.order.system.domain.entity.Restaurant;
import com.food.order.system.domain.event.OrderCreatedEvent;
import com.food.order.system.domain.exception.OrderDomainException;
import com.food.order.system.domain.service.OrderDomainService;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Component;
import org.springframework.transaction.annotation.Transactional;
import java.util.Objects;
import java.util.UUID;
@Component
@Slf4j
@RequiredArgsConstructor
public class OrderCreateHelper {
private final OrderDomainService orderDomainService;
private final OrderRepository orderRepository;
private final CustomerRepository customerRepository;
private final RestaurantRepository restaurantRepository;
private final OrderDataMapper orderDataMapper;
@Transactional
public OrderCreatedEvent persistOrder(CreateOrderCommand createOrderCommand) {
log.info("createOrder: {}", createOrderCommand);
checkCustomer(createOrderCommand.getCustomerId());
Restaurant restaurant = checkRestaurant(createOrderCommand);
var order = orderDataMapper.createOrderCommandToOrder(createOrderCommand);
var createdEventOrder = orderDomainService.validateAndInitiateOrder(order, restaurant);
saveOrder(order);
log.info("Created Order Event : {}", createdEventOrder);
return createdEventOrder;
}
private Restaurant checkRestaurant(CreateOrderCommand createOrderCommand) {
return restaurantRepository.findRestaurantInformation
(orderDataMapper.createOrderCommandToRestaurant(createOrderCommand))
.orElseThrow(() -> new OrderDomainException("Restaurant not found. " +
"Please check restaurant id: " + createOrderCommand.getRestaurantId()));
}
private void checkCustomer(UUID customerId) {
customerRepository.findCustomer(customerId)
.orElseThrow(() -> new OrderDomainException("Customer not found. CustomerId: " + customerId));
}
private void saveOrder(Order order){
var savedOrder = orderRepository.save(order);
if (Objects.isNull(savedOrder)) {
throw new OrderDomainException("Order not saved");
}
}
}