diff --git a/pom.xml b/pom.xml index c944f87..1040229 100644 --- a/pom.xml +++ b/pom.xml @@ -91,7 +91,7 @@ com.github.Podzilla podzilla-utils-lib - v1.1.11 + v1.1.12 diff --git a/src/main/java/com/podzilla/order/messaging/OrderConsumer.java b/src/main/java/com/podzilla/order/messaging/OrderConsumer.java index 67289ef..13e8225 100644 --- a/src/main/java/com/podzilla/order/messaging/OrderConsumer.java +++ b/src/main/java/com/podzilla/order/messaging/OrderConsumer.java @@ -9,6 +9,7 @@ import com.podzilla.mq.events.OrderPackagedEvent; import com.podzilla.mq.events.WarehouseOrderFulfillmentFailedEvent; import com.podzilla.mq.events.WarehouseStockReservedEvent; +import com.podzilla.mq.events.OrderDeliveryFailedEvent; import com.podzilla.order.model.Address; import com.podzilla.order.model.Order; import com.podzilla.order.model.OrderProduct; @@ -73,6 +74,16 @@ public void trackOrder(final BaseEvent payload) { (CartCheckedoutEvent) payload; handleCartCheckoutEvent(cartCheckedoutEvent); } + if (payload instanceof OrderDeliveryFailedEvent) { + OrderDeliveryFailedEvent orderDeliveryFailedEvent = + (OrderDeliveryFailedEvent) payload; + log.info("❌ Order delivery failed for order: {}, reason: {}", + orderDeliveryFailedEvent.getOrderId(), + orderDeliveryFailedEvent.getReason()); + orderService.updateOrderStatus( + UUID.fromString(orderDeliveryFailedEvent.getOrderId()), + OrderStatus.DELIVERY_FAILED); + } } private void handleWarehouseStockReservedEvent( @@ -133,7 +144,7 @@ private void handleOrderAssignedToCourierEvent(final OrderAssignedToCourierEvent UUID.fromString(orderAssignedToCourierEvent.getOrderId()), new Order.Builder() .courierId(UUID.fromString(orderAssignedToCourierEvent.getCourierId())) - .status(OrderStatus.ORDER_ASSIGNED_TO_COURIER) + .status(OrderStatus.ASSIGNED_TO_COURIER) .build()); } diff --git a/src/main/java/com/podzilla/order/model/OrderStatus.java b/src/main/java/com/podzilla/order/model/OrderStatus.java index 5b56052..7a333c1 100644 --- a/src/main/java/com/podzilla/order/model/OrderStatus.java +++ b/src/main/java/com/podzilla/order/model/OrderStatus.java @@ -4,9 +4,11 @@ public enum OrderStatus { PENDING, PLACED, PACKAGED, - ORDER_ASSIGNED_TO_COURIER, + ASSIGNED_TO_COURIER, OUT_FOR_DELIVERY, DELIVERED, + FULFILLMENT_FAILED, + DELIVERY_FAILED, CANCELLED, } diff --git a/src/main/java/com/podzilla/order/service/OrderService.java b/src/main/java/com/podzilla/order/service/OrderService.java index 6444df1..76eb036 100644 --- a/src/main/java/com/podzilla/order/service/OrderService.java +++ b/src/main/java/com/podzilla/order/service/OrderService.java @@ -1,10 +1,11 @@ package com.podzilla.order.service; +import com.podzilla.mq.events.DeliveryAddress; import com.podzilla.mq.events.OrderCancelledEvent; import com.podzilla.mq.events.OrderItem; import com.podzilla.mq.events.OrderPlacedEvent; -import com.podzilla.mq.events.DeliveryAddress; import com.podzilla.order.dtos.LocationDTO; +import com.podzilla.order.exception.InvalidActionException; import com.podzilla.order.exception.NotFoundException; import com.podzilla.order.messaging.OrderProducer; import com.podzilla.order.model.Order; @@ -12,17 +13,15 @@ import com.podzilla.order.model.OrderProduct; import com.podzilla.order.model.OrderStatus; import com.podzilla.order.repository.OrderRepository; +import com.podzilla.order.service.statusstrategy.OrderStatusStrategy; +import com.podzilla.order.service.statusstrategy.OrderStatusStrategyFactory; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.BeanUtils; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Value; import org.springframework.stereotype.Service; import org.springframework.web.reactive.function.client.WebClient; -import com.podzilla.order.service.statusstrategy.OrderStatusStrategy; -import com.podzilla.order.service.statusstrategy.OrderStatusStrategyFactory; - import java.time.LocalDateTime; -import java.util.ArrayList; import java.util.List; import java.util.Optional; import java.util.UUID; @@ -148,17 +147,23 @@ public Order cancelOrder(final UUID id, final String reason) { "Order not found with id: " + id); Order order = existingOrder.get(); - order.setStatus(OrderStatus.CANCELLED); - order.setUpdatedAt(LocalDateTime.now()); - orderRepository.save(order); - OrderCancelledEvent orderCancelledEvent = - OrderCancelledEvent.builder() - .orderId(order.getId().toString()) - .customerId(order.getUserId().toString()) - .reason(reason) - .build(); - orderProducer.sendCancelOrder(orderCancelledEvent); - return order; + OrderStatus status = order.getStatus(); + if (status == OrderStatus.PENDING || status == OrderStatus.PACKAGED || status == OrderStatus.PLACED) { + order.setStatus(OrderStatus.CANCELLED); + order.setUpdatedAt(LocalDateTime.now()); + orderRepository.save(order); + OrderCancelledEvent orderCancelledEvent = + OrderCancelledEvent.builder() + .orderId(order.getId().toString()) + .customerId(order.getUserId().toString()) + .items(getOrderItems(order)) + .reason(reason) + .build(); + orderProducer.sendCancelOrder(orderCancelledEvent); + return order; + } + log.warn("Order with id: {} cannot be cancelled", id); + throw new InvalidActionException("Order cannot be cancelled with id: " + id); } public Order updateOrderStatus(final UUID id, @@ -204,17 +209,12 @@ private void checkNotFoundException(final Object value, } private List getOrderItems(final Order order) { - List orderItems = new ArrayList<>(); List orderProducts = order.getOrderProducts(); - for (OrderProduct product : orderProducts) { - OrderItem orderItem = new OrderItem(); - orderItem.setProductId(product.getId().toString()); - orderItem.setQuantity(product.getQuantity()); - orderItem.setPricePerUnit(product.getPricePerUnit()); - orderItems.add(orderItem); - } - return orderItems; + return orderProducts.stream() + .map(product -> new OrderItem( + product.getProductId().toString(), + product.getQuantity(), + product.getPricePerUnit())) + .toList(); } - - }