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();
}
-
-
}