From 5b5961ddb153e5661f9396c490030ebe4ab009ea Mon Sep 17 00:00:00 2001 From: Mohamed Date: Mon, 19 May 2025 20:53:58 +0300 Subject: [PATCH 1/3] fix: hot fix --- build_and_run.sh | 3 ++ docker-compose.yml | 50 ++++--------------- .../Events/OrderPlacedEventHandler.java | 26 ++++++++-- .../OrderStockReservationEventHandler.java | 1 + .../warehouse/Models/AssignedOrders.java | 17 ++++--- .../warehouse/Models/PackagedOrders.java | 25 +++++----- .../com/podzilla/warehouse/Models/Stock.java | 6 +++ .../AssignedOrdersRepository.java | 2 + .../Services/AssignedOrdersService.java | 7 ++- .../Services/PackagedOrdersService.java | 23 +++++++-- src/main/resources/application.yml | 4 ++ 11 files changed, 94 insertions(+), 70 deletions(-) create mode 100755 build_and_run.sh diff --git a/build_and_run.sh b/build_and_run.sh new file mode 100755 index 0000000..02799e5 --- /dev/null +++ b/build_and_run.sh @@ -0,0 +1,3 @@ +mvn clean package -DskipTests +docker compose down +docker compose up -d --build \ No newline at end of file diff --git a/docker-compose.yml b/docker-compose.yml index 61d70ae..2e06c0c 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -3,16 +3,22 @@ services: image: openjdk:25-ea-4-jdk-oraclelinux9 container_name: warehouse-backend ports: - - "8080:8080" + - "8082:8080" depends_on: - redis - - rabbitmq env_file: - .env + environment: + SPRING_RABBITMQ_HOST: host.docker.internal + SPRING_RABBITMQ_PORT: 5672 + SPRING_RABBITMQ_USERNAME: guest + SPRING_RABBITMQ_PASSWORD: guest volumes: - ./target/warehouse-0.0.1-SNAPSHOT.jar:/app/warehouse-0.0.1-SNAPSHOT.jar - ./logs:/logs command: [ "java", "-jar", "/app/warehouse-0.0.1-SNAPSHOT.jar" ] + extra_hosts: + - "host.docker.internal:host-gateway" # warehouse_db: # image: postgres:latest @@ -28,7 +34,7 @@ services: image: redis:latest container_name: redis ports: - - "6379:6379" + - "6390:6379" expose: - "9121" @@ -36,46 +42,10 @@ services: image: redislabs/redisinsight:latest container_name: redisinsight ports: - - "5540:5540" + - "8100:8001" environment: - REDIS_HOST=redis - REDIS_PORT=6379 depends_on: - redis restart: unless-stopped - - - rabbitmq: - image: rabbitmq:management - container_name: rabbitmq - ports: - - "5672:5672" - - "15672:15672" - environment: - RABBITMQ_DEFAULT_USER: guest - RABBITMQ_DEFAULT_PASS: guest - - loki: - image: grafana/loki:latest - container_name: loki - ports: - - "3100:3100" - command: -config.file=/etc/loki/local-config.yaml - - promtail: - image: grafana/promtail:latest - container_name: promtail - volumes: - - ./promtail-config.yml:/etc/promtail/promtail-config.yaml - - ./logs:/logs - command: -config.file=/etc/promtail/promtail-config.yaml - depends_on: - - loki - - grafana: - image: grafana/grafana:latest - container_name: grafana - ports: - - "3000:3000" - depends_on: - - loki diff --git a/src/main/java/com/podzilla/warehouse/Events/OrderPlacedEventHandler.java b/src/main/java/com/podzilla/warehouse/Events/OrderPlacedEventHandler.java index 94d900a..9e41fb9 100644 --- a/src/main/java/com/podzilla/warehouse/Events/OrderPlacedEventHandler.java +++ b/src/main/java/com/podzilla/warehouse/Events/OrderPlacedEventHandler.java @@ -1,23 +1,43 @@ package com.podzilla.warehouse.Events; -import com.podzilla.mq.events.InventoryUpdatedEvent; import com.podzilla.mq.events.OrderPlacedEvent; import com.podzilla.warehouse.Models.PackagedOrders; +import com.podzilla.warehouse.Models.Stock; import com.podzilla.warehouse.Repositories.PackagedOrdersRepository; +import com.podzilla.warehouse.Repositories.StockRepository; + import lombok.RequiredArgsConstructor; import org.springframework.stereotype.Component; +import java.util.List; import java.util.UUID; @RequiredArgsConstructor @Component public class OrderPlacedEventHandler implements EventHandler { private final PackagedOrdersRepository packagedOrdersRepository; + private final StockRepository stockRepository; @Override public void handle(OrderPlacedEvent event) { - //create packaged order - PackagedOrders packagedOrder = new PackagedOrders(UUID.fromString(event.getOrderId())); + // create packaged order + System.out.println("Received OrderPlacedEvent: " + event); + List stocks = event.getItems().stream() + .map(item -> stockRepository.findById(UUID.fromString(item.getProductId())) + .get()) + .toList(); + + PackagedOrders packagedOrder = PackagedOrders.builder() + .orderId(UUID.fromString(event.getOrderId())) + .deliveryAddress(event.getDeliveryAddress()) + .items(stocks) + .totalAmount(event.getTotalAmount()) + .orderLatitude(event.getOrderLatitude()) + .orderLongitude(event.getOrderLongitude()) + .confirmationType(event.getConfirmationType()) + .signature(event.getSignature()) + .build(); + System.out.println("Packaged order created: " + packagedOrder); packagedOrdersRepository.save(packagedOrder); } } diff --git a/src/main/java/com/podzilla/warehouse/Events/OrderStockReservationEventHandler.java b/src/main/java/com/podzilla/warehouse/Events/OrderStockReservationEventHandler.java index 16e3c46..f134009 100644 --- a/src/main/java/com/podzilla/warehouse/Events/OrderStockReservationEventHandler.java +++ b/src/main/java/com/podzilla/warehouse/Events/OrderStockReservationEventHandler.java @@ -22,6 +22,7 @@ public class OrderStockReservationEventHandler implements EventHandler items; - @Column(nullable = false) + // @Column(nullable = false) private DeliveryAddress deliveryAddress; - @Column(nullable = false) + // @Column(nullable = false) private BigDecimal totalAmount; - @Column(nullable = false) + // @Column(nullable = false) private double orderLatitude; - @Column(nullable = false) + // @Column(nullable = false) private double orderLongitude; - @Column(nullable = false) + // @Column(nullable = false) private String signature; - @Column(nullable = false) + // @Column(nullable = false) private ConfirmationType confirmationType; public AssignedOrders(UUID orderId, UUID assignerId, UUID courierId, List items, diff --git a/src/main/java/com/podzilla/warehouse/Models/PackagedOrders.java b/src/main/java/com/podzilla/warehouse/Models/PackagedOrders.java index b141b82..a277922 100644 --- a/src/main/java/com/podzilla/warehouse/Models/PackagedOrders.java +++ b/src/main/java/com/podzilla/warehouse/Models/PackagedOrders.java @@ -3,9 +3,10 @@ import com.podzilla.mq.events.ConfirmationType; import com.podzilla.mq.events.DeliveryAddress; import jakarta.persistence.*; -import lombok.Getter; +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Data; import lombok.NoArgsConstructor; -import lombok.Setter; import org.hibernate.annotations.CreationTimestamp; import java.math.BigDecimal; @@ -13,30 +14,30 @@ import java.util.List; import java.util.UUID; -@Setter -@Getter +@Data @Entity @NoArgsConstructor +@Builder +@AllArgsConstructor @Table() public class PackagedOrders { @Id private UUID orderId; private UUID packagerId; - @Column(nullable = false) - @OneToMany(mappedBy = "packagedOrder") + @OneToMany(mappedBy = "packagedOrder", cascade = CascadeType.ALL, orphanRemoval = true) private List items; - @Column(nullable = false) + // @Column(nullable = false) private DeliveryAddress deliveryAddress; - @Column(nullable = false) + // @Column(nullable = false) private BigDecimal totalAmount; - @Column(nullable = false) + // @Column(nullable = false) private double orderLatitude; - @Column(nullable = false) + // @Column(nullable = false) private double orderLongitude; - @Column(nullable = false) + // @Column(nullable = false) private String signature; - @Column(nullable = false) + // @Column(nullable = false) private ConfirmationType confirmationType; @CreationTimestamp diff --git a/src/main/java/com/podzilla/warehouse/Models/Stock.java b/src/main/java/com/podzilla/warehouse/Models/Stock.java index a3c0331..6479660 100644 --- a/src/main/java/com/podzilla/warehouse/Models/Stock.java +++ b/src/main/java/com/podzilla/warehouse/Models/Stock.java @@ -37,6 +37,12 @@ public class Stock { @ManyToOne @JoinColumn(name = "order_id", nullable = true) private PackagedOrders packagedOrder; + + // Add a new ManyToOne relationship back to AssignedOrders + @ManyToOne + @JoinColumn(name = "assigned_order_id", nullable = true) // Use a different join column name + private AssignedOrders assignedOrder; // Use a different field name + @CreationTimestamp @Column(updatable = false) private LocalDateTime createdAt; diff --git a/src/main/java/com/podzilla/warehouse/Repositories/AssignedOrdersRepository.java b/src/main/java/com/podzilla/warehouse/Repositories/AssignedOrdersRepository.java index 2371fe2..fb39245 100644 --- a/src/main/java/com/podzilla/warehouse/Repositories/AssignedOrdersRepository.java +++ b/src/main/java/com/podzilla/warehouse/Repositories/AssignedOrdersRepository.java @@ -14,4 +14,6 @@ public interface AssignedOrdersRepository extends JpaRepository findByAssignerId(UUID assignerId); List findByOrderId(UUID orderId); + + AssignedOrders findOneByOrderId(UUID orderId); } \ No newline at end of file diff --git a/src/main/java/com/podzilla/warehouse/Services/AssignedOrdersService.java b/src/main/java/com/podzilla/warehouse/Services/AssignedOrdersService.java index 44a3d3b..3210260 100644 --- a/src/main/java/com/podzilla/warehouse/Services/AssignedOrdersService.java +++ b/src/main/java/com/podzilla/warehouse/Services/AssignedOrdersService.java @@ -47,10 +47,9 @@ public Optional> findByAssignerIdIsNull() { @CachePut(key = "'orderId:' + #orderId") public AssignedOrders assignOrder(UUID orderId, UUID assignerId, UUID courierId) { - PackagedOrders packagedOrder = packagedOrdersRepository.findOneByOrderId(orderId).get(); - AssignedOrders assignment = new AssignedOrders(orderId, assignerId, courierId, packagedOrder.getItems(), - packagedOrder.getDeliveryAddress(), packagedOrder.getTotalAmount(), packagedOrder.getOrderLatitude(), - packagedOrder.getOrderLongitude(), packagedOrder.getSignature(), packagedOrder.getConfirmationType()); + AssignedOrders assignment = assignedOrdersRepository.findOneByOrderId(orderId); + assignment.setAssignerId(assignerId); + assignment.setCourierId(courierId); assignedOrdersRepository.save(assignment); OrderAssignedToCourierEvent event = diff --git a/src/main/java/com/podzilla/warehouse/Services/PackagedOrdersService.java b/src/main/java/com/podzilla/warehouse/Services/PackagedOrdersService.java index 0b0e119..6681086 100644 --- a/src/main/java/com/podzilla/warehouse/Services/PackagedOrdersService.java +++ b/src/main/java/com/podzilla/warehouse/Services/PackagedOrdersService.java @@ -4,7 +4,9 @@ import com.podzilla.mq.EventsConstants; import com.podzilla.mq.events.OrderPackagedEvent; import com.podzilla.warehouse.Events.EventFactory; +import com.podzilla.warehouse.Models.AssignedOrders; import com.podzilla.warehouse.Models.PackagedOrders; +import com.podzilla.warehouse.Repositories.AssignedOrdersRepository; import com.podzilla.warehouse.Repositories.PackagedOrdersRepository; import lombok.RequiredArgsConstructor; import org.springframework.beans.factory.annotation.Autowired; @@ -26,7 +28,9 @@ public class PackagedOrdersService { private final EventPublisher eventPublisher; @Autowired - private PackagedOrdersRepository packagedOrdersRepository; + private final PackagedOrdersRepository packagedOrdersRepository; + + private final AssignedOrdersRepository assignedOrdersRepository; @Cacheable(value = "packagedOrdersByOrderId", key = "#orderId.toString() + '-' + #pageable.pageNumber + '-' + #pageable.pageSize") public Page findByOrderId(UUID orderId, Pageable pageable) { @@ -45,11 +49,24 @@ public Page findByPackagerIdIsNull(Pageable pageable) { @CachePut(value = "packagedOrdersByPackagerId", key = "#packagerId.toString() + '-0-10'") public Optional packageOrder(UUID orderId,UUID packagerId) { - PackagedOrders packagedOrder = new PackagedOrders(orderId, packagerId, LocalDateTime.now()); - + PackagedOrders packagedOrder = packagedOrdersRepository.findOneByOrderId(orderId).get(); + packagedOrder.setPackagerId(packagerId); OrderPackagedEvent event = EventFactory.createOrderPackagedEvent(orderId); eventPublisher.publishEvent(EventsConstants.ORDER_PACKAGED, event); + AssignedOrders assignment = AssignedOrders.builder() + .orderId(orderId) + .items(packagedOrder.getItems()) + .deliveryAddress(packagedOrder.getDeliveryAddress()) + .totalAmount(packagedOrder.getTotalAmount()) + .orderLatitude(packagedOrder.getOrderLatitude()) + .orderLongitude(packagedOrder.getOrderLongitude()) + .confirmationType(packagedOrder.getConfirmationType()) + .signature(packagedOrder.getSignature()) + .build(); + + assignedOrdersRepository.save(assignment); + return Optional.of(packagedOrdersRepository.save(packagedOrder)); } 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 62bdc2c2a8e25386fd77415be60c5bfe18a020a1 Mon Sep 17 00:00:00 2001 From: Mohamed Date: Mon, 19 May 2025 21:39:45 +0300 Subject: [PATCH 2/3] fix: hot fix 2 --- .../Controllers/AssignerController.java | 29 ++++++++++++++----- .../warehouse/Services/AssignerService.java | 2 +- 2 files changed, 22 insertions(+), 9 deletions(-) diff --git a/src/main/java/com/podzilla/warehouse/Controllers/AssignerController.java b/src/main/java/com/podzilla/warehouse/Controllers/AssignerController.java index 7c744b8..3fa7cec 100644 --- a/src/main/java/com/podzilla/warehouse/Controllers/AssignerController.java +++ b/src/main/java/com/podzilla/warehouse/Controllers/AssignerController.java @@ -2,7 +2,10 @@ import com.podzilla.warehouse.Commands.AssignOrderCommand; import com.podzilla.warehouse.Models.AssignedOrders; +import com.podzilla.warehouse.Models.Assigner; import com.podzilla.warehouse.Services.AssignedOrdersService; +import com.podzilla.warehouse.Services.AssignerService; + import io.swagger.v3.oas.annotations.Operation; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Autowired; @@ -19,16 +22,20 @@ public class AssignerController { @Autowired - private AssignedOrdersService assignerService; + private AssignedOrdersService assignedOrdersService; + + @Autowired + private AssignerService assignerService; @Operation(summary = "Assign an order to a courier") @PostMapping("/order") public ResponseEntity assignOrder(@RequestParam UUID orderId, - @RequestParam UUID assignerId, - @RequestParam UUID courierId) { - log.info("Received assignment request: orderId={}, assignerId={}, courierId={}", orderId, assignerId, courierId); + @RequestParam UUID assignerId, + @RequestParam UUID courierId) { + log.info("Received assignment request: orderId={}, assignerId={}, courierId={}", orderId, assignerId, + courierId); - AssignOrderCommand command = new AssignOrderCommand(assignerService, orderId, assignerId, courierId); + AssignOrderCommand command = new AssignOrderCommand(assignedOrdersService, orderId, assignerId, courierId); command.execute(); AssignedOrders assigned = command.getAssignedOrderResult(); @@ -39,7 +46,7 @@ public ResponseEntity assignOrder(@RequestParam UUID orderId, @GetMapping("/order/{orderId}") public ResponseEntity> getByOrderId(@PathVariable UUID orderId) { log.info("Fetching assignments for orderId={}", orderId); - Optional> result = assignerService.findByOrderId(orderId); + Optional> result = assignedOrdersService.findByOrderId(orderId); return result.map(ResponseEntity::ok).orElseGet(() -> ResponseEntity.notFound().build()); } @@ -47,7 +54,7 @@ public ResponseEntity> getByOrderId(@PathVariable UUID orde @GetMapping("/assigner/{assignerId}") public ResponseEntity> getByAssignerId(@PathVariable UUID assignerId) { log.info("Fetching assignments by assignerId={}", assignerId); - Optional> result = assignerService.findByAssignerId(assignerId); + Optional> result = assignedOrdersService.findByAssignerId(assignerId); return result.map(ResponseEntity::ok).orElseGet(() -> ResponseEntity.notFound().build()); } @@ -55,7 +62,13 @@ public ResponseEntity> getByAssignerId(@PathVariable UUID a @GetMapping("/unassigned") public ResponseEntity> getUnassignedOrders() { log.info("Fetching unassigned orders"); - Optional> result = assignerService.findByAssignerIdIsNull(); + Optional> result = assignedOrdersService.findByAssignerIdIsNull(); return result.map(ResponseEntity::ok).orElseGet(() -> ResponseEntity.notFound().build()); } + + @PostMapping + public ResponseEntity createAssigner(@RequestBody Assigner assigner) { + log.info("Creating new assigner"); + return ResponseEntity.ok(assignerService.createAssigner(assigner).get()); + } } diff --git a/src/main/java/com/podzilla/warehouse/Services/AssignerService.java b/src/main/java/com/podzilla/warehouse/Services/AssignerService.java index 42abd4a..41c7c07 100644 --- a/src/main/java/com/podzilla/warehouse/Services/AssignerService.java +++ b/src/main/java/com/podzilla/warehouse/Services/AssignerService.java @@ -18,7 +18,7 @@ public class AssignerService { @Autowired private AssignerRepository assignerRepository; - @CachePut(key = "#result.get().id", condition = "#result.isPresent()") + // @CachePut(key = "#result.get().id", condition = "#result.isPresent()") public Optional createAssigner(Assigner assigner) { return Optional.of(assignerRepository.save(assigner)); } From 72afac942bb8100dc09c1292c24d6ffabf86434a Mon Sep 17 00:00:00 2001 From: Ahmed Wael Date: Mon, 19 May 2025 21:59:14 +0300 Subject: [PATCH 3/3] fix issue --- src/main/java/com/podzilla/warehouse/Models/Stock.java | 6 ------ 1 file changed, 6 deletions(-) diff --git a/src/main/java/com/podzilla/warehouse/Models/Stock.java b/src/main/java/com/podzilla/warehouse/Models/Stock.java index 74d94b2..7344f0d 100644 --- a/src/main/java/com/podzilla/warehouse/Models/Stock.java +++ b/src/main/java/com/podzilla/warehouse/Models/Stock.java @@ -43,12 +43,6 @@ public class Stock { @ManyToOne @JoinColumn(name = "packaged_order_id", nullable = true) private PackagedOrders packagedOrder; - - // Add a new ManyToOne relationship back to AssignedOrders - @ManyToOne - @JoinColumn(name = "assigned_order_id", nullable = true) // Use a different join column name - private AssignedOrders assignedOrder; // Use a different field name - @CreationTimestamp @Column(updatable = false) private LocalDateTime createdAt;