From be258afd73ae777ad37012fbb56a15f1b0527028 Mon Sep 17 00:00:00 2001 From: Yosef <65974533+koka-afk@users.noreply.github.com> Date: Sun, 18 May 2025 22:23:04 +0300 Subject: [PATCH 1/3] Added Support for Cancelled Orders --- pom.xml | 2 +- .../warehouse/Events/EventHandlerFactory.java | 6 +- .../Events/OrderCancelledEventHandler.java | 82 +++++++++++++++++++ 3 files changed, 88 insertions(+), 2 deletions(-) create mode 100644 src/main/java/com/podzilla/warehouse/Events/OrderCancelledEventHandler.java diff --git a/pom.xml b/pom.xml index c67975d..4bd2e18 100644 --- a/pom.xml +++ b/pom.xml @@ -131,7 +131,7 @@ com.github.Podzilla podzilla-utils-lib - v1.1.11 + v1.1.12 diff --git a/src/main/java/com/podzilla/warehouse/Events/EventHandlerFactory.java b/src/main/java/com/podzilla/warehouse/Events/EventHandlerFactory.java index 66ccd1a..6322157 100644 --- a/src/main/java/com/podzilla/warehouse/Events/EventHandlerFactory.java +++ b/src/main/java/com/podzilla/warehouse/Events/EventHandlerFactory.java @@ -1,6 +1,7 @@ package com.podzilla.warehouse.Events; import com.podzilla.mq.events.BaseEvent; +import com.podzilla.mq.events.OrderCancelledEvent; import com.podzilla.mq.events.OrderPlacedEvent; import com.podzilla.mq.events.OrderStockReservationRequestedEvent; import org.springframework.beans.factory.annotation.Autowired; @@ -13,10 +14,13 @@ public class EventHandlerFactory { private final HashMap, EventHandler> handlers; @Autowired - public EventHandlerFactory(OrderPlacedEventHandler OrderPlacedEventHandler,OrderStockReservationEventHandler orderStockReservationEventHandler) { + public EventHandlerFactory(OrderPlacedEventHandler OrderPlacedEventHandler, + OrderStockReservationEventHandler orderStockReservationEventHandler, + OrderCancelledEventHandler orderCancelledEventHandler) { handlers = new HashMap<>(); handlers.put(OrderPlacedEvent.class, OrderPlacedEventHandler); handlers.put(OrderStockReservationRequestedEvent.class, orderStockReservationEventHandler); + handlers.put(OrderCancelledEvent.class, orderCancelledEventHandler); } @SuppressWarnings("unchecked") diff --git a/src/main/java/com/podzilla/warehouse/Events/OrderCancelledEventHandler.java b/src/main/java/com/podzilla/warehouse/Events/OrderCancelledEventHandler.java new file mode 100644 index 0000000..d3c5663 --- /dev/null +++ b/src/main/java/com/podzilla/warehouse/Events/OrderCancelledEventHandler.java @@ -0,0 +1,82 @@ +package com.podzilla.warehouse.Events; + +import com.podzilla.mq.EventPublisher; +import com.podzilla.mq.EventsConstants; +import com.podzilla.mq.events.OrderCancelledEvent; +import com.podzilla.mq.events.OrderItem; +import com.podzilla.warehouse.Models.Stock; +import com.podzilla.warehouse.Repositories.StockRepository; +import com.podzilla.warehouse.Services.StockService; +import lombok.RequiredArgsConstructor; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.stereotype.Component; +import org.springframework.transaction.annotation.Transactional; + +import java.util.UUID; + +@RequiredArgsConstructor +@Component +public class OrderCancelledEventHandler implements EventHandler { + + private static final Logger logger = LoggerFactory.getLogger(OrderCancelledEventHandler.class); + private final StockService stockService; + private final StockRepository stockRepository; + + @Override + @Transactional + public void handle(OrderCancelledEvent event) { + + logger.info("Received OrderCancelledEvent for order ID: {}. Reverting stock.", event.getOrderId()); + + if (event.getItems() == null || event.getItems().isEmpty()) { + logger.warn("OrderCancelledEvent for order ID: {} contained no items. No stock to revert.", event.getOrderId()); + return; + } + + try { + for (OrderItem item : event.getItems()) { + if (item.getProductId() == null || item.getQuantity() <= 0) { + logger.warn("Invalid item data in OrderCancelledEvent for order ID: {}. ProductId: {}, Quantity: {}. Skipping item.", + event.getOrderId(), item.getProductId(), item.getQuantity()); + continue; + } + + UUID productId = UUID.fromString(item.getProductId()); + int quantityToRevert = item.getQuantity(); + + Stock stock = stockRepository.findById(productId).orElse(null); + + if (stock == null) { + logger.warn("Product with ID: {} for order cancellation ID: {} not found in stock. Cannot revert quantity {}. " + + "This might indicate the product was deleted or never existed in this warehouse.", + item.getProductId(), event.getOrderId(), quantityToRevert); + + continue; + } + + int currentQuantity = stock.getQuantity(); + int newQuantity = currentQuantity + quantityToRevert; + + stockService.updateStock( + productId, + null, + newQuantity, + stock.getThreshold(), + null, + null + ); + + logger.info("Stock reverted for product ID: {}. Order ID: {}. Quantity reverted: {}. Old quantity: {}. New quantity: {}", + productId, event.getOrderId(), quantityToRevert, currentQuantity, newQuantity); + } + + logger.info("Successfully reverted stock for all items in cancelled order ID: {}", event.getOrderId()); + + } catch (IllegalArgumentException e) { + logger.error("Error processing OrderCancelledEvent for order ID: {}. Invalid UUID format for a product ID. Details: {}", event.getOrderId(), e.getMessage(), e); + } catch (Exception e) { + logger.error("Critical error processing OrderCancelledEvent for order ID: {}. Details: {}", event.getOrderId(), e.getMessage(), e); + } + } +} \ No newline at end of file From 618090dad7028831d50c0889081be55c527dd38f Mon Sep 17 00:00:00 2001 From: Yosef <65974533+koka-afk@users.noreply.github.com> Date: Sun, 18 May 2025 23:16:06 +0300 Subject: [PATCH 2/3] Added /api as Prefix for All Controllers --- .../com/podzilla/warehouse/Controllers/ManagerController.java | 2 +- .../warehouse/Controllers/PackagedOrdersController.java | 2 +- .../podzilla/warehouse/Controllers/PackagerController.java | 2 +- src/main/resources/application.yml | 4 ++++ 4 files changed, 7 insertions(+), 3 deletions(-) diff --git a/src/main/java/com/podzilla/warehouse/Controllers/ManagerController.java b/src/main/java/com/podzilla/warehouse/Controllers/ManagerController.java index 81ba2a7..c18b3fd 100644 --- a/src/main/java/com/podzilla/warehouse/Controllers/ManagerController.java +++ b/src/main/java/com/podzilla/warehouse/Controllers/ManagerController.java @@ -13,7 +13,7 @@ @Slf4j @RestController -@RequestMapping("warehouse/manager") +@RequestMapping("/manager") public class ManagerController { @Autowired private ManagerService managerService; diff --git a/src/main/java/com/podzilla/warehouse/Controllers/PackagedOrdersController.java b/src/main/java/com/podzilla/warehouse/Controllers/PackagedOrdersController.java index 1811c8c..0fc51a6 100644 --- a/src/main/java/com/podzilla/warehouse/Controllers/PackagedOrdersController.java +++ b/src/main/java/com/podzilla/warehouse/Controllers/PackagedOrdersController.java @@ -14,7 +14,7 @@ import java.util.UUID; @RestController -@RequestMapping("warehouse/package") +@RequestMapping("/package") @Validated public class PackagedOrdersController { diff --git a/src/main/java/com/podzilla/warehouse/Controllers/PackagerController.java b/src/main/java/com/podzilla/warehouse/Controllers/PackagerController.java index bf898a8..becbc19 100644 --- a/src/main/java/com/podzilla/warehouse/Controllers/PackagerController.java +++ b/src/main/java/com/podzilla/warehouse/Controllers/PackagerController.java @@ -15,7 +15,7 @@ @Slf4j @RestController -@RequestMapping("warehouse/packagers") +@RequestMapping("/packagers") public class PackagerController { private final PackagerService packagerService; diff --git a/src/main/resources/application.yml b/src/main/resources/application.yml index 587cd6f..563f785 100644 --- a/src/main/resources/application.yml +++ b/src/main/resources/application.yml @@ -65,3 +65,7 @@ spring: appconfig: cache: enabled: true + +server: + servlet: + context-path: /api \ No newline at end of file From 95b15259ee85e21e0b00be0969b011a92b50beb5 Mon Sep 17 00:00:00 2001 From: Yosef <65974533+koka-afk@users.noreply.github.com> Date: Sun, 18 May 2025 23:18:31 +0300 Subject: [PATCH 3/3] Sync With Dev --- .../Events/OrderCancelledEventHandler.java | 18 ++++++++++++++++++ 1 file changed, 18 insertions(+) diff --git a/src/main/java/com/podzilla/warehouse/Events/OrderCancelledEventHandler.java b/src/main/java/com/podzilla/warehouse/Events/OrderCancelledEventHandler.java index d3c5663..c4bc9b6 100644 --- a/src/main/java/com/podzilla/warehouse/Events/OrderCancelledEventHandler.java +++ b/src/main/java/com/podzilla/warehouse/Events/OrderCancelledEventHandler.java @@ -2,9 +2,13 @@ import com.podzilla.mq.EventPublisher; import com.podzilla.mq.EventsConstants; +import com.podzilla.mq.events.InventoryUpdatedEvent; import com.podzilla.mq.events.OrderCancelledEvent; import com.podzilla.mq.events.OrderItem; +import com.podzilla.mq.events.ProductSnapshot; import com.podzilla.warehouse.Models.Stock; +import com.podzilla.warehouse.Repositories.AssignedOrdersRepository; +import com.podzilla.warehouse.Repositories.PackagedOrdersRepository; import com.podzilla.warehouse.Repositories.StockRepository; import com.podzilla.warehouse.Services.StockService; import lombok.RequiredArgsConstructor; @@ -13,6 +17,7 @@ import org.springframework.stereotype.Component; import org.springframework.transaction.annotation.Transactional; +import java.util.ArrayList; import java.util.UUID; @RequiredArgsConstructor @@ -22,6 +27,9 @@ public class OrderCancelledEventHandler implements EventHandler snapshots = new ArrayList<>(); for (OrderItem item : event.getItems()) { if (item.getProductId() == null || item.getQuantity() <= 0) { logger.warn("Invalid item data in OrderCancelledEvent for order ID: {}. ProductId: {}, Quantity: {}. Skipping item.", @@ -67,10 +76,19 @@ public void handle(OrderCancelledEvent event) { null ); + snapshots.add(EventFactory.createProductSnapshot(item.getProductId(), newQuantity)); + logger.info("Stock reverted for product ID: {}. Order ID: {}. Quantity reverted: {}. Old quantity: {}. New quantity: {}", productId, event.getOrderId(), quantityToRevert, currentQuantity, newQuantity); } + UUID orderId = UUID.fromString(event.getOrderId()); + packagedOrdersRepository.deleteById(orderId); + assignedOrdersRepository.deleteById(orderId); + + InventoryUpdatedEvent inventoryUpdatedEvent = EventFactory.createInventoryUpdatedEvent(snapshots); + eventPublisher.publishEvent(EventsConstants.INVENTORY_UPDATED, inventoryUpdatedEvent); + logger.info("Successfully reverted stock for all items in cancelled order ID: {}", event.getOrderId()); } catch (IllegalArgumentException e) {