package com.yummynoodlebar.core.services;
import com.yummynoodlebar.core.domain.Order;
import com.yummynoodlebar.events.orders.*;
import com.yummynoodlebar.persistence.services.OrderPersistenceService;
import java.util.Date;
import java.util.UUID;
public class OrderEventHandler implements OrderService {
private final OrderPersistenceService ordersPersistenceService;
public OrderEventHandler(final OrderPersistenceService ordersPersistenceService) {
this.ordersPersistenceService = ordersPersistenceService;
}
@Override
public OrderCreatedEvent createOrder(CreateOrderEvent createOrderEvent) {
//TODO, add validation of menu items
//TODO, add order total calculation
//TODO, add order time estimate calculation
//TODO Think transaction boundary. Order and OrderStatus should be atomic
OrderCreatedEvent event = ordersPersistenceService.createOrder(createOrderEvent);
//TODO, where should this go?
OrderStatusEvent orderStatusEvent = ordersPersistenceService.setOrderStatus(
new SetOrderStatusEvent(event.getNewOrderKey(), new OrderStatusDetails(event.getNewOrderKey(),
UUID.randomUUID(), new Date(), "Order Created")));
return event;
}
@Override
public AllOrdersEvent requestAllOrders(RequestAllOrdersEvent requestAllCurrentOrdersEvent) {
return ordersPersistenceService.requestAllOrders(requestAllCurrentOrdersEvent);
}
@Override
public OrderDetailsEvent requestOrderDetails(RequestOrderDetailsEvent requestOrderDetailsEvent) {
return ordersPersistenceService.requestOrderDetails(requestOrderDetailsEvent);
}
@Override
public OrderUpdatedEvent setOrderPayment(SetOrderPaymentEvent setOrderPaymentEvent) {
return ordersPersistenceService.setOrderPayment(setOrderPaymentEvent);
}
@Override
public OrderDeletedEvent deleteOrder(DeleteOrderEvent deleteOrderEvent) {
OrderDetailsEvent orderDetailsEvent = ordersPersistenceService.requestOrderDetails(new RequestOrderDetailsEvent(deleteOrderEvent.getKey()));
if (!orderDetailsEvent.isEntityFound()) {
return OrderDeletedEvent.notFound(deleteOrderEvent.getKey());
}
Order order = Order.fromOrderDetails(orderDetailsEvent.getOrderDetails());
if (!order.canBeDeleted()) {
return OrderDeletedEvent.deletionForbidden(deleteOrderEvent.getKey(), order.toOrderDetails());
}
ordersPersistenceService.deleteOrder(deleteOrderEvent);
return new OrderDeletedEvent(deleteOrderEvent.getKey(), order.toOrderDetails());
}
@Override
public OrderStatusEvent requestOrderStatus(RequestOrderStatusEvent requestOrderDetailsEvent) {
return ordersPersistenceService.requestOrderStatus(requestOrderDetailsEvent);
}
}