From 9ee1680631c17562ef63bae060ecdb8bae802bcb Mon Sep 17 00:00:00 2001 From: Nour Eldien Ayman Date: Sun, 18 May 2025 23:55:12 +0300 Subject: [PATCH 01/10] Change Order relationship from ManyToOne to OneToOne in Address model --- src/main/java/com/podzilla/order/model/Address.java | 10 ++-------- 1 file changed, 2 insertions(+), 8 deletions(-) diff --git a/src/main/java/com/podzilla/order/model/Address.java b/src/main/java/com/podzilla/order/model/Address.java index acf13c3..6c47cd7 100644 --- a/src/main/java/com/podzilla/order/model/Address.java +++ b/src/main/java/com/podzilla/order/model/Address.java @@ -1,13 +1,7 @@ package com.podzilla.order.model; -import jakarta.persistence.Entity; -import jakarta.persistence.GeneratedValue; -import jakarta.persistence.GenerationType; -import jakarta.persistence.Id; -import jakarta.persistence.JoinColumn; -import jakarta.persistence.ManyToOne; -import jakarta.persistence.Table; +import jakarta.persistence.*; import lombok.AllArgsConstructor; import lombok.Data; import lombok.NoArgsConstructor; @@ -31,7 +25,7 @@ public class Address { private String country; private String postalCode; - @ManyToOne + @OneToOne @JoinColumn(name = "order_id", nullable = false) private Order order; } From b96a3027cd8c58b68162d642737444cdde87db73 Mon Sep 17 00:00:00 2001 From: MohammmedAhmed8 <94786411+MohammmedAhmed8@users.noreply.github.com> Date: Mon, 19 May 2025 01:00:13 +0300 Subject: [PATCH 02/10] solved issues --- .../order/controller/OrderController.java | 40 ++++++++++++++++++- .../order/messaging/OrderProducer.java | 2 + .../podzilla/order/service/OrderService.java | 2 + src/main/resources/application.properties | 7 ++++ 4 files changed, 49 insertions(+), 2 deletions(-) diff --git a/src/main/java/com/podzilla/order/controller/OrderController.java b/src/main/java/com/podzilla/order/controller/OrderController.java index c0378a4..acf7576 100644 --- a/src/main/java/com/podzilla/order/controller/OrderController.java +++ b/src/main/java/com/podzilla/order/controller/OrderController.java @@ -1,5 +1,11 @@ package com.podzilla.order.controller; +import com.podzilla.mq.EventPublisher; +import com.podzilla.mq.EventsConstants; +import com.podzilla.mq.events.CartCheckedoutEvent; +import com.podzilla.mq.events.ConfirmationType; +import com.podzilla.mq.events.DeliveryAddress; +import com.podzilla.mq.events.OrderItem; import com.podzilla.order.model.Order; import com.podzilla.order.model.OrderLocation; import com.podzilla.order.model.OrderStatus; @@ -22,6 +28,8 @@ import org.slf4j.LoggerFactory; +import java.math.BigDecimal; +import java.util.ArrayList; import java.util.List; import java.util.Optional; import java.util.UUID; @@ -32,12 +40,14 @@ public class OrderController { private final OrderService orderService; + private final EventPublisher eventPublisher; private static final Logger LOGGER = LoggerFactory.getLogger(OrderController.class); @Autowired - public OrderController(final OrderService orderService) { + public OrderController(final OrderService orderService, final EventPublisher eventPublisher) { this.orderService = orderService; + this.eventPublisher = eventPublisher; } @@ -79,6 +89,33 @@ public ResponseEntity getOrderById(@PathVariable final UUID id) { } + @GetMapping("/testEventPublisher") + public ResponseEntity testEventPublisher() { + LOGGER.info("Testing Event Publisher"); + List orderItems = new ArrayList<>(); + orderItems.add(new OrderItem(UUID.randomUUID().toString(), 5, new BigDecimal(100.0))); + DeliveryAddress deliveryAddress = new DeliveryAddress( + "123 Main St", + "Springfield", + "IL", + "USA", + "62701" + ); + CartCheckedoutEvent event = new CartCheckedoutEvent( + UUID.randomUUID().toString(), + UUID.randomUUID().toString(), + orderItems, + new BigDecimal(500.0), + deliveryAddress, + 10.0, + 20.0, + "signature", + ConfirmationType.SIGNATURE + ); + eventPublisher.publishEvent(EventsConstants.CART_CHECKEDOUT, event); + return ResponseEntity.ok("Event published successfully"); + } + @PatchMapping("/{id}") @Operation(summary = "Update an order", @@ -124,7 +161,6 @@ public ResponseEntity> getOrderByUserId( } - @PutMapping("/cancel/{id}") @Operation( summary = "Cancel order", diff --git a/src/main/java/com/podzilla/order/messaging/OrderProducer.java b/src/main/java/com/podzilla/order/messaging/OrderProducer.java index a34781d..8b9496d 100644 --- a/src/main/java/com/podzilla/order/messaging/OrderProducer.java +++ b/src/main/java/com/podzilla/order/messaging/OrderProducer.java @@ -40,4 +40,6 @@ public void sendCancelOrder( orderCancelledEvent ); } + + } diff --git a/src/main/java/com/podzilla/order/service/OrderService.java b/src/main/java/com/podzilla/order/service/OrderService.java index 76eb036..57c3c50 100644 --- a/src/main/java/com/podzilla/order/service/OrderService.java +++ b/src/main/java/com/podzilla/order/service/OrderService.java @@ -53,6 +53,8 @@ public Order createOrder(final Order order) { log.info("Creating new order: {}", order); order.setCreatedAt(LocalDateTime.now()); order.setUpdatedAt(LocalDateTime.now()); + order.getShippingAddress().setOrder(order); + order.getOrderProducts().forEach(product -> product.setOrder(order)); orderRepository.save(order); OrderStatusStrategy strategy = strategyFactory.getStrategy(OrderStatus.PENDING); diff --git a/src/main/resources/application.properties b/src/main/resources/application.properties index cde2649..5bc9d37 100644 --- a/src/main/resources/application.properties +++ b/src/main/resources/application.properties @@ -4,3 +4,10 @@ spring.rabbitmq.host=rabbitmq spring.rabbitmq.port=5672 spring.rabbitmq.username=guest spring.rabbitmq.password=guest + +spring.jpa.database-platform=org.hibernate.dialect.PostgreSQLDialect +spring.jpa.hibernate.ddl-auto=create-drop +spring.jpa.generate-ddl=true +spring.jpa.show-sql=true +spring.jpa.properties.hibernate.format_sql=true +spring.jpa.properties.hibernate.use_sql_comments=true From 4a8991b34ad4ed48f4421440d147d96535c5198c Mon Sep 17 00:00:00 2001 From: Nour Eldien Ayman Date: Mon, 19 May 2025 02:14:39 +0300 Subject: [PATCH 03/10] Fix product ID assignment in CreatedOrderStrategy --- .../order/service/statusstrategy/CreatedOrderStrategy.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/com/podzilla/order/service/statusstrategy/CreatedOrderStrategy.java b/src/main/java/com/podzilla/order/service/statusstrategy/CreatedOrderStrategy.java index ee1e823..6099059 100644 --- a/src/main/java/com/podzilla/order/service/statusstrategy/CreatedOrderStrategy.java +++ b/src/main/java/com/podzilla/order/service/statusstrategy/CreatedOrderStrategy.java @@ -39,7 +39,7 @@ private List getOrderItems(final Order order) { List orderProducts = order.getOrderProducts(); for (OrderProduct product : orderProducts) { OrderItem orderItem = new OrderItem(); - orderItem.setProductId(product.getId().toString()); + orderItem.setProductId(product.getProductId().toString()); orderItem.setQuantity(product.getQuantity()); orderItem.setPricePerUnit(product.getPricePerUnit()); orderItems.add(orderItem); From b1dff37cfacccb523b1d11c17ab8ad9b4f500f34 Mon Sep 17 00:00:00 2001 From: Nour Eldien Ayman Date: Mon, 19 May 2025 17:51:08 +0300 Subject: [PATCH 04/10] Update podzilla-utils-lib version to v1.1.13 --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index 1040229..e6ccb8c 100644 --- a/pom.xml +++ b/pom.xml @@ -91,7 +91,7 @@ com.github.Podzilla podzilla-utils-lib - v1.1.12 + v1.1.13 From 7a5e3b6a65497e8555ddc5702aecab73156ea069 Mon Sep 17 00:00:00 2001 From: MohammmedAhmed8 <94786411+MohammmedAhmed8@users.noreply.github.com> Date: Mon, 19 May 2025 20:54:22 +0300 Subject: [PATCH 05/10] fixed errors --- .../controller/OrderPublisherController.java | 148 ++++++++++++++++++ .../order/messaging/OrderConsumer.java | 4 +- .../com/podzilla/order/model/Address.java | 2 + .../java/com/podzilla/order/model/Order.java | 3 + .../podzilla/order/model/OrderProduct.java | 2 + .../podzilla/order/service/OrderService.java | 4 +- 6 files changed, 159 insertions(+), 4 deletions(-) create mode 100644 src/main/java/com/podzilla/order/controller/OrderPublisherController.java diff --git a/src/main/java/com/podzilla/order/controller/OrderPublisherController.java b/src/main/java/com/podzilla/order/controller/OrderPublisherController.java new file mode 100644 index 0000000..1e273b2 --- /dev/null +++ b/src/main/java/com/podzilla/order/controller/OrderPublisherController.java @@ -0,0 +1,148 @@ +package com.podzilla.order.controller; + +import com.podzilla.mq.EventPublisher; +import com.podzilla.mq.EventsConstants; +import com.podzilla.mq.events.*; +import com.podzilla.order.model.Order; +import com.podzilla.order.model.OrderLocation; +import com.podzilla.order.model.OrderStatus; +import com.podzilla.order.service.OrderService; +import io.swagger.v3.oas.annotations.tags.Tag; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.http.ResponseEntity; +import org.springframework.web.bind.annotation.DeleteMapping; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.PathVariable; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.PutMapping; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.PatchMapping; +import org.springframework.web.bind.annotation.RestController; +import io.swagger.v3.oas.annotations.Operation; +import io.swagger.v3.oas.annotations.responses.ApiResponse; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + + +import java.math.BigDecimal; +import java.util.ArrayList; +import java.util.List; +import java.util.Optional; +import java.util.UUID; + +@RestController +@RequestMapping("/testOrders") +@Tag(name = "Order API", description = "Order management operations") +public class OrderPublisherController { + private final OrderService orderService; + private final EventPublisher eventPublisher; + private static final Logger LOGGER = + LoggerFactory.getLogger(OrderController.class); + + @Autowired + public OrderPublisherController(final OrderService orderService, final EventPublisher eventPublisher) { + this.orderService = orderService; + this.eventPublisher = eventPublisher; + } + + @GetMapping("/testPublishCartCheckoutEvent") + public ResponseEntity testPublishCartCheckoutEvent() { + LOGGER.info("Testing Event Publisher"); + List orderItems = new ArrayList<>(); + orderItems.add(new OrderItem(UUID.randomUUID().toString(), 5, new BigDecimal(100.0))); + DeliveryAddress deliveryAddress = new DeliveryAddress( + "123 Main St", + "Springfield", + "IL", + "USA", + "62701" + ); + CartCheckedoutEvent event = new CartCheckedoutEvent( + UUID.randomUUID().toString(), + UUID.randomUUID().toString(), + orderItems, + new BigDecimal(500.0), + deliveryAddress, + 10.0, + 20.0, + "signature", + ConfirmationType.SIGNATURE + ); + eventPublisher.publishEvent(EventsConstants.CART_CHECKEDOUT, event); + return ResponseEntity.ok("Event published successfully"); + } + + @GetMapping("/testPublishWarehouseStockReservedEvent/{id}") + public ResponseEntity testPublishWarehouseStockReservedEvent(@PathVariable final UUID id) { + LOGGER.info("Testing Event Publisher"); + + WarehouseStockReservedEvent event = new WarehouseStockReservedEvent( + id.toString()); + eventPublisher.publishEvent(EventsConstants.WAREHOUSE_STOCK_RESERVED, event); + return ResponseEntity.ok("Event published successfully"); + } + + @GetMapping("/testPublishWarehouseOrderFulfillmentFailedEvent/{id}") + public ResponseEntity testWarehouseOrderFulfillmentFailedEvent(@PathVariable final UUID id) { + LOGGER.info("Testing Event Publisher"); + + WarehouseOrderFulfillmentFailedEvent event = new WarehouseOrderFulfillmentFailedEvent( + id.toString(), "Order Fulfillment Failed"); + eventPublisher.publishEvent(EventsConstants.WAREHOUSE_ORDER_FULFILLMENT_FAILED, event); + return ResponseEntity.ok("Event published successfully"); + } + + @GetMapping("/testOrderAssignedToCourierEvent/{id}") + public ResponseEntity testOrderAssignedToCourierEvent(@PathVariable final UUID id) { + LOGGER.info("Testing Event Publisher"); + + OrderAssignedToCourierEvent event = new OrderAssignedToCourierEvent( + id.toString(), UUID.randomUUID().toString(), new BigDecimal(150.9), 10.0, 20.0, "signature", + ConfirmationType.SIGNATURE); + eventPublisher.publishEvent(EventsConstants.ORDER_ASSIGNED_TO_COURIER, event); + return ResponseEntity.ok("Event published successfully"); + } + + @GetMapping("/testOrderDeliveredEvent/{id}/{courierId}") + public ResponseEntity testOrderDeliveredEvent(@PathVariable final UUID id, @PathVariable final String courierId) { + LOGGER.info("Testing Event Publisher"); + + OrderDeliveredEvent event = new OrderDeliveredEvent( + id.toString(), courierId.toString(), new BigDecimal(150.9)); + eventPublisher.publishEvent(EventsConstants.ORDER_DELIVERED, event); + return ResponseEntity.ok("Event published successfully"); + } + + @GetMapping("/testOrderOutForDeliveryEvent/{id}/{courierId}") + public ResponseEntity testOrderOutForDeliveryEvent(@PathVariable final UUID id, @PathVariable final String courierId) { + LOGGER.info("Testing Event Publisher"); + + OrderOutForDeliveryEvent event = new OrderOutForDeliveryEvent( + id.toString(), courierId.toString()); + eventPublisher.publishEvent(EventsConstants.ORDER_OUT_FOR_DELIVERY, event); + return ResponseEntity.ok("Event published successfully"); + } + + @GetMapping("/testOrderPackagedEvent/{id}") + public ResponseEntity testOrderPackagedEvent(@PathVariable final UUID id) { + LOGGER.info("Testing Event Publisher"); + + OrderPackagedEvent event = new OrderPackagedEvent( + id.toString()); + eventPublisher.publishEvent(EventsConstants.ORDER_PACKAGED, event); + return ResponseEntity.ok("Event published successfully"); + } + + @GetMapping("/testOrderDeliveryFailedEvent/{id}/{courierId}") + public ResponseEntity testOrderDeliveryFailedEvent(@PathVariable final UUID id, + @PathVariable final UUID courierId) { + LOGGER.info("Testing Event Publisher"); + + OrderDeliveryFailedEvent event = new OrderDeliveryFailedEvent( + id.toString(), courierId.toString(), "Delivery failed"); + eventPublisher.publishEvent(EventsConstants.ORDER_DELIVERY_FAILED, event); + return ResponseEntity.ok("Event published successfully"); + } + +} diff --git a/src/main/java/com/podzilla/order/messaging/OrderConsumer.java b/src/main/java/com/podzilla/order/messaging/OrderConsumer.java index 13e8225..b9491da 100644 --- a/src/main/java/com/podzilla/order/messaging/OrderConsumer.java +++ b/src/main/java/com/podzilla/order/messaging/OrderConsumer.java @@ -100,9 +100,9 @@ private void handleWarehouseOrderFulfillmentFailedEvent( log.info("❌ Order fulfillment failed for order: {}, reason: {}", warehouseOrderFulfillmentFailedEvent.getOrderId(), warehouseOrderFulfillmentFailedEvent.getReason()); - orderService.cancelOrder( + orderService.updateOrderStatus( UUID.fromString(warehouseOrderFulfillmentFailedEvent.getOrderId()), - warehouseOrderFulfillmentFailedEvent.getReason()); + OrderStatus.FULFILLMENT_FAILED); } private void handleCartCheckoutEvent( diff --git a/src/main/java/com/podzilla/order/model/Address.java b/src/main/java/com/podzilla/order/model/Address.java index 6c47cd7..56a2182 100644 --- a/src/main/java/com/podzilla/order/model/Address.java +++ b/src/main/java/com/podzilla/order/model/Address.java @@ -1,6 +1,7 @@ package com.podzilla.order.model; +import com.fasterxml.jackson.annotation.JsonIgnore; import jakarta.persistence.*; import lombok.AllArgsConstructor; import lombok.Data; @@ -26,6 +27,7 @@ public class Address { private String postalCode; @OneToOne + @JsonIgnore @JoinColumn(name = "order_id", nullable = false) private Order order; } diff --git a/src/main/java/com/podzilla/order/model/Order.java b/src/main/java/com/podzilla/order/model/Order.java index 902a1b4..5014677 100644 --- a/src/main/java/com/podzilla/order/model/Order.java +++ b/src/main/java/com/podzilla/order/model/Order.java @@ -1,6 +1,7 @@ package com.podzilla.order.model; +import com.fasterxml.jackson.annotation.JsonIgnore; import jakarta.persistence.Table; import jakarta.persistence.Entity; import jakarta.persistence.GeneratedValue; @@ -42,6 +43,7 @@ public class Order { private BigDecimal totalAmount; @OneToOne(cascade = CascadeType.ALL) + @JsonIgnore private Address shippingAddress; @Enumerated(EnumType.STRING) @@ -61,6 +63,7 @@ public class Order { @OneToMany(mappedBy = "order", cascade = CascadeType.ALL, orphanRemoval = true) + @JsonIgnore private List orderProducts = new ArrayList<>(); public static class Builder { diff --git a/src/main/java/com/podzilla/order/model/OrderProduct.java b/src/main/java/com/podzilla/order/model/OrderProduct.java index dad2e31..20913bf 100644 --- a/src/main/java/com/podzilla/order/model/OrderProduct.java +++ b/src/main/java/com/podzilla/order/model/OrderProduct.java @@ -1,5 +1,6 @@ package com.podzilla.order.model; +import com.fasterxml.jackson.annotation.JsonIgnore; import jakarta.persistence.Entity; import jakarta.persistence.GeneratedValue; import jakarta.persistence.GenerationType; @@ -39,6 +40,7 @@ public class OrderProduct { private BigDecimal pricePerUnit; @ManyToOne(fetch = FetchType.LAZY) + @JsonIgnore @JoinColumn(name = "order_id", nullable = false) private Order order; } diff --git a/src/main/java/com/podzilla/order/service/OrderService.java b/src/main/java/com/podzilla/order/service/OrderService.java index 57c3c50..0446aeb 100644 --- a/src/main/java/com/podzilla/order/service/OrderService.java +++ b/src/main/java/com/podzilla/order/service/OrderService.java @@ -112,7 +112,7 @@ public Order updateOrder(final UUID id, final Order updatedOrder) { Order order = existingOrder.get(); BeanUtils.copyProperties(updatedOrder, order, "id"); order.setUpdatedAt(LocalDateTime.now()); - log.info("Order with id: {} was found and updated", id); + log.info("Order with id: {} was found and updated to status: {}", id, updatedOrder.getStatus()); return orderRepository.save(order); } log.warn("Order with id: {} was not found", id); @@ -170,7 +170,7 @@ public Order cancelOrder(final UUID id, final String reason) { public Order updateOrderStatus(final UUID id, final OrderStatus status) { - log.info("Updating order status with ID: {}", id); + log.info("Updating order status with ID: {} to status: {}", id, status); Optional existingOrder = orderRepository.findById(id); From 63c44b36bbe875bd3aba075c91e32cb427ff56f3 Mon Sep 17 00:00:00 2001 From: MohammmedAhmed8 <94786411+MohammmedAhmed8@users.noreply.github.com> Date: Mon, 19 May 2025 21:07:51 +0300 Subject: [PATCH 06/10] fixed update function --- .../podzilla/order/service/OrderService.java | 20 +++++++++++++++++-- 1 file changed, 18 insertions(+), 2 deletions(-) diff --git a/src/main/java/com/podzilla/order/service/OrderService.java b/src/main/java/com/podzilla/order/service/OrderService.java index 0446aeb..7edd7a6 100644 --- a/src/main/java/com/podzilla/order/service/OrderService.java +++ b/src/main/java/com/podzilla/order/service/OrderService.java @@ -16,11 +16,13 @@ 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.BeanWrapper; +import org.springframework.beans.BeanWrapperImpl; 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 java.time.LocalDateTime; import java.util.List; import java.util.Optional; @@ -110,7 +112,7 @@ public Order updateOrder(final UUID id, final Order updatedOrder) { Optional existingOrder = orderRepository.findById(id); if (existingOrder.isPresent()) { Order order = existingOrder.get(); - BeanUtils.copyProperties(updatedOrder, order, "id"); + copyNonNullProperties(updatedOrder, order); order.setUpdatedAt(LocalDateTime.now()); log.info("Order with id: {} was found and updated to status: {}", id, updatedOrder.getStatus()); return orderRepository.save(order); @@ -219,4 +221,18 @@ private List getOrderItems(final Order order) { product.getPricePerUnit())) .toList(); } + + public void copyNonNullProperties(final Object src, final Object target) { + BeanWrapper srcWrap = new BeanWrapperImpl(src); + BeanWrapper trgWrap = new BeanWrapperImpl(target); + + for (java.beans.PropertyDescriptor descriptor : srcWrap.getPropertyDescriptors()) { + String propertyName = descriptor.getName(); + Object propertyValue = srcWrap.getPropertyValue(propertyName); + + if (propertyValue != null && trgWrap.isWritableProperty(propertyName)) { + trgWrap.setPropertyValue(propertyName, propertyValue); + } + } + } } From 319d9b42a9110d25e5f9b94b78365c9e2d3ef73b Mon Sep 17 00:00:00 2001 From: MohammmedAhmed8 <94786411+MohammmedAhmed8@users.noreply.github.com> Date: Mon, 19 May 2025 21:09:35 +0300 Subject: [PATCH 07/10] commented controller --- .../controller/OrderPublisherController.java | 296 +++++++++--------- 1 file changed, 148 insertions(+), 148 deletions(-) diff --git a/src/main/java/com/podzilla/order/controller/OrderPublisherController.java b/src/main/java/com/podzilla/order/controller/OrderPublisherController.java index 1e273b2..90a53b2 100644 --- a/src/main/java/com/podzilla/order/controller/OrderPublisherController.java +++ b/src/main/java/com/podzilla/order/controller/OrderPublisherController.java @@ -1,148 +1,148 @@ -package com.podzilla.order.controller; - -import com.podzilla.mq.EventPublisher; -import com.podzilla.mq.EventsConstants; -import com.podzilla.mq.events.*; -import com.podzilla.order.model.Order; -import com.podzilla.order.model.OrderLocation; -import com.podzilla.order.model.OrderStatus; -import com.podzilla.order.service.OrderService; -import io.swagger.v3.oas.annotations.tags.Tag; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.http.ResponseEntity; -import org.springframework.web.bind.annotation.DeleteMapping; -import org.springframework.web.bind.annotation.GetMapping; -import org.springframework.web.bind.annotation.PathVariable; -import org.springframework.web.bind.annotation.PostMapping; -import org.springframework.web.bind.annotation.PutMapping; -import org.springframework.web.bind.annotation.RequestBody; -import org.springframework.web.bind.annotation.RequestMapping; -import org.springframework.web.bind.annotation.PatchMapping; -import org.springframework.web.bind.annotation.RestController; -import io.swagger.v3.oas.annotations.Operation; -import io.swagger.v3.oas.annotations.responses.ApiResponse; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; - - -import java.math.BigDecimal; -import java.util.ArrayList; -import java.util.List; -import java.util.Optional; -import java.util.UUID; - -@RestController -@RequestMapping("/testOrders") -@Tag(name = "Order API", description = "Order management operations") -public class OrderPublisherController { - private final OrderService orderService; - private final EventPublisher eventPublisher; - private static final Logger LOGGER = - LoggerFactory.getLogger(OrderController.class); - - @Autowired - public OrderPublisherController(final OrderService orderService, final EventPublisher eventPublisher) { - this.orderService = orderService; - this.eventPublisher = eventPublisher; - } - - @GetMapping("/testPublishCartCheckoutEvent") - public ResponseEntity testPublishCartCheckoutEvent() { - LOGGER.info("Testing Event Publisher"); - List orderItems = new ArrayList<>(); - orderItems.add(new OrderItem(UUID.randomUUID().toString(), 5, new BigDecimal(100.0))); - DeliveryAddress deliveryAddress = new DeliveryAddress( - "123 Main St", - "Springfield", - "IL", - "USA", - "62701" - ); - CartCheckedoutEvent event = new CartCheckedoutEvent( - UUID.randomUUID().toString(), - UUID.randomUUID().toString(), - orderItems, - new BigDecimal(500.0), - deliveryAddress, - 10.0, - 20.0, - "signature", - ConfirmationType.SIGNATURE - ); - eventPublisher.publishEvent(EventsConstants.CART_CHECKEDOUT, event); - return ResponseEntity.ok("Event published successfully"); - } - - @GetMapping("/testPublishWarehouseStockReservedEvent/{id}") - public ResponseEntity testPublishWarehouseStockReservedEvent(@PathVariable final UUID id) { - LOGGER.info("Testing Event Publisher"); - - WarehouseStockReservedEvent event = new WarehouseStockReservedEvent( - id.toString()); - eventPublisher.publishEvent(EventsConstants.WAREHOUSE_STOCK_RESERVED, event); - return ResponseEntity.ok("Event published successfully"); - } - - @GetMapping("/testPublishWarehouseOrderFulfillmentFailedEvent/{id}") - public ResponseEntity testWarehouseOrderFulfillmentFailedEvent(@PathVariable final UUID id) { - LOGGER.info("Testing Event Publisher"); - - WarehouseOrderFulfillmentFailedEvent event = new WarehouseOrderFulfillmentFailedEvent( - id.toString(), "Order Fulfillment Failed"); - eventPublisher.publishEvent(EventsConstants.WAREHOUSE_ORDER_FULFILLMENT_FAILED, event); - return ResponseEntity.ok("Event published successfully"); - } - - @GetMapping("/testOrderAssignedToCourierEvent/{id}") - public ResponseEntity testOrderAssignedToCourierEvent(@PathVariable final UUID id) { - LOGGER.info("Testing Event Publisher"); - - OrderAssignedToCourierEvent event = new OrderAssignedToCourierEvent( - id.toString(), UUID.randomUUID().toString(), new BigDecimal(150.9), 10.0, 20.0, "signature", - ConfirmationType.SIGNATURE); - eventPublisher.publishEvent(EventsConstants.ORDER_ASSIGNED_TO_COURIER, event); - return ResponseEntity.ok("Event published successfully"); - } - - @GetMapping("/testOrderDeliveredEvent/{id}/{courierId}") - public ResponseEntity testOrderDeliveredEvent(@PathVariable final UUID id, @PathVariable final String courierId) { - LOGGER.info("Testing Event Publisher"); - - OrderDeliveredEvent event = new OrderDeliveredEvent( - id.toString(), courierId.toString(), new BigDecimal(150.9)); - eventPublisher.publishEvent(EventsConstants.ORDER_DELIVERED, event); - return ResponseEntity.ok("Event published successfully"); - } - - @GetMapping("/testOrderOutForDeliveryEvent/{id}/{courierId}") - public ResponseEntity testOrderOutForDeliveryEvent(@PathVariable final UUID id, @PathVariable final String courierId) { - LOGGER.info("Testing Event Publisher"); - - OrderOutForDeliveryEvent event = new OrderOutForDeliveryEvent( - id.toString(), courierId.toString()); - eventPublisher.publishEvent(EventsConstants.ORDER_OUT_FOR_DELIVERY, event); - return ResponseEntity.ok("Event published successfully"); - } - - @GetMapping("/testOrderPackagedEvent/{id}") - public ResponseEntity testOrderPackagedEvent(@PathVariable final UUID id) { - LOGGER.info("Testing Event Publisher"); - - OrderPackagedEvent event = new OrderPackagedEvent( - id.toString()); - eventPublisher.publishEvent(EventsConstants.ORDER_PACKAGED, event); - return ResponseEntity.ok("Event published successfully"); - } - - @GetMapping("/testOrderDeliveryFailedEvent/{id}/{courierId}") - public ResponseEntity testOrderDeliveryFailedEvent(@PathVariable final UUID id, - @PathVariable final UUID courierId) { - LOGGER.info("Testing Event Publisher"); - - OrderDeliveryFailedEvent event = new OrderDeliveryFailedEvent( - id.toString(), courierId.toString(), "Delivery failed"); - eventPublisher.publishEvent(EventsConstants.ORDER_DELIVERY_FAILED, event); - return ResponseEntity.ok("Event published successfully"); - } - -} +//package com.podzilla.order.controller; +// +//import com.podzilla.mq.EventPublisher; +//import com.podzilla.mq.EventsConstants; +//import com.podzilla.mq.events.*; +//import com.podzilla.order.model.Order; +//import com.podzilla.order.model.OrderLocation; +//import com.podzilla.order.model.OrderStatus; +//import com.podzilla.order.service.OrderService; +//import io.swagger.v3.oas.annotations.tags.Tag; +//import org.springframework.beans.factory.annotation.Autowired; +//import org.springframework.http.ResponseEntity; +//import org.springframework.web.bind.annotation.DeleteMapping; +//import org.springframework.web.bind.annotation.GetMapping; +//import org.springframework.web.bind.annotation.PathVariable; +//import org.springframework.web.bind.annotation.PostMapping; +//import org.springframework.web.bind.annotation.PutMapping; +//import org.springframework.web.bind.annotation.RequestBody; +//import org.springframework.web.bind.annotation.RequestMapping; +//import org.springframework.web.bind.annotation.PatchMapping; +//import org.springframework.web.bind.annotation.RestController; +//import io.swagger.v3.oas.annotations.Operation; +//import io.swagger.v3.oas.annotations.responses.ApiResponse; +//import org.slf4j.Logger; +//import org.slf4j.LoggerFactory; +// +// +//import java.math.BigDecimal; +//import java.util.ArrayList; +//import java.util.List; +//import java.util.Optional; +//import java.util.UUID; +// +//@RestController +//@RequestMapping("/testOrders") +//@Tag(name = "Order API", description = "Order management operations") +//public class OrderPublisherController { +// private final OrderService orderService; +// private final EventPublisher eventPublisher; +// private static final Logger LOGGER = +// LoggerFactory.getLogger(OrderController.class); +// +// @Autowired +// public OrderPublisherController(final OrderService orderService, final EventPublisher eventPublisher) { +// this.orderService = orderService; +// this.eventPublisher = eventPublisher; +// } +// +// @GetMapping("/testPublishCartCheckoutEvent") +// public ResponseEntity testPublishCartCheckoutEvent() { +// LOGGER.info("Testing Event Publisher"); +// List orderItems = new ArrayList<>(); +// orderItems.add(new OrderItem(UUID.randomUUID().toString(), 5, new BigDecimal(100.0))); +// DeliveryAddress deliveryAddress = new DeliveryAddress( +// "123 Main St", +// "Springfield", +// "IL", +// "USA", +// "62701" +// ); +// CartCheckedoutEvent event = new CartCheckedoutEvent( +// UUID.randomUUID().toString(), +// UUID.randomUUID().toString(), +// orderItems, +// new BigDecimal(500.0), +// deliveryAddress, +// 10.0, +// 20.0, +// "signature", +// ConfirmationType.SIGNATURE +// ); +// eventPublisher.publishEvent(EventsConstants.CART_CHECKEDOUT, event); +// return ResponseEntity.ok("Event published successfully"); +// } +// +// @GetMapping("/testPublishWarehouseStockReservedEvent/{id}") +// public ResponseEntity testPublishWarehouseStockReservedEvent(@PathVariable final UUID id) { +// LOGGER.info("Testing Event Publisher"); +// +// WarehouseStockReservedEvent event = new WarehouseStockReservedEvent( +// id.toString()); +// eventPublisher.publishEvent(EventsConstants.WAREHOUSE_STOCK_RESERVED, event); +// return ResponseEntity.ok("Event published successfully"); +// } +// +// @GetMapping("/testPublishWarehouseOrderFulfillmentFailedEvent/{id}") +// public ResponseEntity testWarehouseOrderFulfillmentFailedEvent(@PathVariable final UUID id) { +// LOGGER.info("Testing Event Publisher"); +// +// WarehouseOrderFulfillmentFailedEvent event = new WarehouseOrderFulfillmentFailedEvent( +// id.toString(), "Order Fulfillment Failed"); +// eventPublisher.publishEvent(EventsConstants.WAREHOUSE_ORDER_FULFILLMENT_FAILED, event); +// return ResponseEntity.ok("Event published successfully"); +// } +// +// @GetMapping("/testOrderAssignedToCourierEvent/{id}") +// public ResponseEntity testOrderAssignedToCourierEvent(@PathVariable final UUID id) { +// LOGGER.info("Testing Event Publisher"); +// +// OrderAssignedToCourierEvent event = new OrderAssignedToCourierEvent( +// id.toString(), UUID.randomUUID().toString(), new BigDecimal(150.9), 10.0, 20.0, "signature", +// ConfirmationType.SIGNATURE); +// eventPublisher.publishEvent(EventsConstants.ORDER_ASSIGNED_TO_COURIER, event); +// return ResponseEntity.ok("Event published successfully"); +// } +// +// @GetMapping("/testOrderDeliveredEvent/{id}/{courierId}") +// public ResponseEntity testOrderDeliveredEvent(@PathVariable final UUID id, @PathVariable final String courierId) { +// LOGGER.info("Testing Event Publisher"); +// +// OrderDeliveredEvent event = new OrderDeliveredEvent( +// id.toString(), courierId.toString(), new BigDecimal(150.9)); +// eventPublisher.publishEvent(EventsConstants.ORDER_DELIVERED, event); +// return ResponseEntity.ok("Event published successfully"); +// } +// +// @GetMapping("/testOrderOutForDeliveryEvent/{id}/{courierId}") +// public ResponseEntity testOrderOutForDeliveryEvent(@PathVariable final UUID id, @PathVariable final String courierId) { +// LOGGER.info("Testing Event Publisher"); +// +// OrderOutForDeliveryEvent event = new OrderOutForDeliveryEvent( +// id.toString(), courierId.toString()); +// eventPublisher.publishEvent(EventsConstants.ORDER_OUT_FOR_DELIVERY, event); +// return ResponseEntity.ok("Event published successfully"); +// } +// +// @GetMapping("/testOrderPackagedEvent/{id}") +// public ResponseEntity testOrderPackagedEvent(@PathVariable final UUID id) { +// LOGGER.info("Testing Event Publisher"); +// +// OrderPackagedEvent event = new OrderPackagedEvent( +// id.toString()); +// eventPublisher.publishEvent(EventsConstants.ORDER_PACKAGED, event); +// return ResponseEntity.ok("Event published successfully"); +// } +// +// @GetMapping("/testOrderDeliveryFailedEvent/{id}/{courierId}") +// public ResponseEntity testOrderDeliveryFailedEvent(@PathVariable final UUID id, +// @PathVariable final UUID courierId) { +// LOGGER.info("Testing Event Publisher"); +// +// OrderDeliveryFailedEvent event = new OrderDeliveryFailedEvent( +// id.toString(), courierId.toString(), "Delivery failed"); +// eventPublisher.publishEvent(EventsConstants.ORDER_DELIVERY_FAILED, event); +// return ResponseEntity.ok("Event published successfully"); +// } +// +//} From f4eb014fa57c69f7db8ce1242a743b5223fbb77f Mon Sep 17 00:00:00 2001 From: MohammmedAhmed8 <94786411+MohammmedAhmed8@users.noreply.github.com> Date: Mon, 19 May 2025 21:15:13 +0300 Subject: [PATCH 08/10] fixed linter issues --- .../order/controller/OrderPublisherController.java | 6 ++++-- src/main/java/com/podzilla/order/model/Address.java | 8 +++++++- 2 files changed, 11 insertions(+), 3 deletions(-) diff --git a/src/main/java/com/podzilla/order/controller/OrderPublisherController.java b/src/main/java/com/podzilla/order/controller/OrderPublisherController.java index 90a53b2..1e9e31a 100644 --- a/src/main/java/com/podzilla/order/controller/OrderPublisherController.java +++ b/src/main/java/com/podzilla/order/controller/OrderPublisherController.java @@ -105,7 +105,8 @@ // } // // @GetMapping("/testOrderDeliveredEvent/{id}/{courierId}") -// public ResponseEntity testOrderDeliveredEvent(@PathVariable final UUID id, @PathVariable final String courierId) { +// public ResponseEntity testOrderDeliveredEvent(@PathVariable final UUID id, +// @PathVariable final String courierId) { // LOGGER.info("Testing Event Publisher"); // // OrderDeliveredEvent event = new OrderDeliveredEvent( @@ -115,7 +116,8 @@ // } // // @GetMapping("/testOrderOutForDeliveryEvent/{id}/{courierId}") -// public ResponseEntity testOrderOutForDeliveryEvent(@PathVariable final UUID id, @PathVariable final String courierId) { +// public ResponseEntity testOrderOutForDeliveryEvent(@PathVariable final UUID id, +// @PathVariable final String courierId) { // LOGGER.info("Testing Event Publisher"); // // OrderOutForDeliveryEvent event = new OrderOutForDeliveryEvent( diff --git a/src/main/java/com/podzilla/order/model/Address.java b/src/main/java/com/podzilla/order/model/Address.java index 56a2182..b070c68 100644 --- a/src/main/java/com/podzilla/order/model/Address.java +++ b/src/main/java/com/podzilla/order/model/Address.java @@ -2,7 +2,13 @@ import com.fasterxml.jackson.annotation.JsonIgnore; -import jakarta.persistence.*; +import jakarta.persistence.Entity; +import jakarta.persistence.GeneratedValue; +import jakarta.persistence.GenerationType; +import jakarta.persistence.Id; +import jakarta.persistence.JoinColumn; +import jakarta.persistence.OneToOne; +import jakarta.persistence.Table; import lombok.AllArgsConstructor; import lombok.Data; import lombok.NoArgsConstructor; From c4a8bbe8647d102b83e0fb6fcc9f41f20e825576 Mon Sep 17 00:00:00 2001 From: MohammmedAhmed8 <94786411+MohammmedAhmed8@users.noreply.github.com> Date: Mon, 19 May 2025 21:19:42 +0300 Subject: [PATCH 09/10] removed unused endpoint --- .../order/controller/OrderController.java | 28 ------------------- 1 file changed, 28 deletions(-) diff --git a/src/main/java/com/podzilla/order/controller/OrderController.java b/src/main/java/com/podzilla/order/controller/OrderController.java index acf7576..762ecbb 100644 --- a/src/main/java/com/podzilla/order/controller/OrderController.java +++ b/src/main/java/com/podzilla/order/controller/OrderController.java @@ -89,34 +89,6 @@ public ResponseEntity getOrderById(@PathVariable final UUID id) { } - @GetMapping("/testEventPublisher") - public ResponseEntity testEventPublisher() { - LOGGER.info("Testing Event Publisher"); - List orderItems = new ArrayList<>(); - orderItems.add(new OrderItem(UUID.randomUUID().toString(), 5, new BigDecimal(100.0))); - DeliveryAddress deliveryAddress = new DeliveryAddress( - "123 Main St", - "Springfield", - "IL", - "USA", - "62701" - ); - CartCheckedoutEvent event = new CartCheckedoutEvent( - UUID.randomUUID().toString(), - UUID.randomUUID().toString(), - orderItems, - new BigDecimal(500.0), - deliveryAddress, - 10.0, - 20.0, - "signature", - ConfirmationType.SIGNATURE - ); - eventPublisher.publishEvent(EventsConstants.CART_CHECKEDOUT, event); - return ResponseEntity.ok("Event published successfully"); - } - - @PatchMapping("/{id}") @Operation(summary = "Update an order", description = "Updates an existing order and returns the updated " From 0371f3fe9d6d9f1d5472e1b1aec92823bda3b5d1 Mon Sep 17 00:00:00 2001 From: MohammmedAhmed8 <94786411+MohammmedAhmed8@users.noreply.github.com> Date: Mon, 19 May 2025 21:20:29 +0300 Subject: [PATCH 10/10] fixed linter issues --- .../com/podzilla/order/controller/OrderController.java | 9 --------- 1 file changed, 9 deletions(-) diff --git a/src/main/java/com/podzilla/order/controller/OrderController.java b/src/main/java/com/podzilla/order/controller/OrderController.java index 762ecbb..5cc5252 100644 --- a/src/main/java/com/podzilla/order/controller/OrderController.java +++ b/src/main/java/com/podzilla/order/controller/OrderController.java @@ -1,11 +1,6 @@ package com.podzilla.order.controller; import com.podzilla.mq.EventPublisher; -import com.podzilla.mq.EventsConstants; -import com.podzilla.mq.events.CartCheckedoutEvent; -import com.podzilla.mq.events.ConfirmationType; -import com.podzilla.mq.events.DeliveryAddress; -import com.podzilla.mq.events.OrderItem; import com.podzilla.order.model.Order; import com.podzilla.order.model.OrderLocation; import com.podzilla.order.model.OrderStatus; @@ -26,10 +21,6 @@ import io.swagger.v3.oas.annotations.responses.ApiResponse; import org.slf4j.Logger; import org.slf4j.LoggerFactory; - - -import java.math.BigDecimal; -import java.util.ArrayList; import java.util.List; import java.util.Optional; import java.util.UUID;