package com.yummynoodlebar.core.services;
import com.yummynoodlebar.core.domain.Order;
import com.yummynoodlebar.core.domain.OrderStatus;
import com.yummynoodlebar.core.repository.OrdersMemoryRepository;
import com.yummynoodlebar.core.events.orders.*;
import com.yummynoodlebar.core.repository.OrdersRepository;
import java.util.*;
public class OrderEventHandler implements OrderService {
private final OrdersRepository ordersRepository;
public OrderEventHandler(final OrdersRepository ordersRepository) {
this.ordersRepository = ordersRepository;
}
@Override
public OrderCreatedEvent createOrder(CreateOrderEvent createOrderEvent) {
Order order = Order.fromOrderDetails(createOrderEvent.getDetails());
order.addStatus(new OrderStatus(new Date(), "Order Created"));
order = ordersRepository.save(order);
return new OrderCreatedEvent(order.getKey(), order.toOrderDetails());
}
@Override
public AllOrdersEvent requestAllOrders(RequestAllOrdersEvent requestAllCurrentOrdersEvent) {
List<OrderDetails> generatedDetails = new ArrayList<OrderDetails>();
for (Order order : ordersRepository.findAll()) {
generatedDetails.add(order.toOrderDetails());
}
return new AllOrdersEvent(generatedDetails);
}
@Override
public OrderDetailsEvent requestOrderDetails(RequestOrderDetailsEvent requestOrderDetailsEvent) {
Order order = ordersRepository.findById(requestOrderDetailsEvent.getKey());
if (order == null) {
return OrderDetailsEvent.notFound(requestOrderDetailsEvent.getKey());
}
return new OrderDetailsEvent(
requestOrderDetailsEvent.getKey(),
order.toOrderDetails());
}
@Override
public OrderUpdatedEvent setOrderPayment(SetOrderPaymentEvent setOrderPaymentEvent) {
return null; //To change body of implemented methods use File | Settings | File Templates.
}
@Override
public OrderDeletedEvent deleteOrder(DeleteOrderEvent deleteOrderEvent) {
Order order = ordersRepository.findById(deleteOrderEvent.getKey());
if (order == null) {
return OrderDeletedEvent.notFound(deleteOrderEvent.getKey());
}
OrderDetails details = order.toOrderDetails();
//TODOCUMENT This contains some specific domain logic, not exposed to the outside world, and not part of the
//persistence rules.
if (!order.canBeDeleted()) {
return OrderDeletedEvent.deletionForbidden(deleteOrderEvent.getKey(), details);
}
ordersRepository.delete(deleteOrderEvent.getKey());
return new OrderDeletedEvent(deleteOrderEvent.getKey(), details);
}
@Override
public OrderStatusEvent requestOrderStatus(RequestOrderStatusEvent requestOrderDetailsEvent) {
Order order = ordersRepository.findById(requestOrderDetailsEvent.getKey());
if (order == null) {
return OrderStatusEvent.notFound(requestOrderDetailsEvent.getKey());
}
return new OrderStatusEvent(requestOrderDetailsEvent.getKey(), order.getStatus().toStatusDetails());
}
}