From c26372dad41d283e0008b8ec4c97a90132ef679c Mon Sep 17 00:00:00 2001 From: Omar Aly Date: Sun, 4 May 2025 15:26:06 +0300 Subject: [PATCH 1/8] Add endpoints to get orders by user ID, cancel orders, and update order status --- .../order/controller/OrderController.java | 24 +++++++++++++ .../order/repository/OrderRepository.java | 3 ++ .../podzilla/order/service/OrderService.java | 34 +++++++++++++++++++ 3 files changed, 61 insertions(+) diff --git a/src/main/java/com/podzilla/order/controller/OrderController.java b/src/main/java/com/podzilla/order/controller/OrderController.java index cb3d05e..358802f 100644 --- a/src/main/java/com/podzilla/order/controller/OrderController.java +++ b/src/main/java/com/podzilla/order/controller/OrderController.java @@ -2,6 +2,7 @@ import com.podzilla.order.model.Order; +import com.podzilla.order.model.OrderStatus; import com.podzilla.order.service.OrderService; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.http.ResponseEntity; @@ -58,4 +59,27 @@ public ResponseEntity deleteOrder(@PathVariable final long id) { orderService.deleteOrder(id); return ResponseEntity.noContent().build(); } + + @GetMapping("/user/{userId}") + public ResponseEntity getOrderByUserId + (@PathVariable final long userId) { + Order order = orderService.getOrderByUserId(userId) + .orElseThrow(() -> new RuntimeException("Order not found")); + return ResponseEntity.ok(order); + } + + @PutMapping("/cancel/{id}") + public ResponseEntity cancelOrder(@PathVariable final long id) { + Order order = orderService.cancelOrder(id); + return ResponseEntity.ok(order); + } + + // Endpoint to update order status + @PutMapping("/status/{id}") + public ResponseEntity updateOrderStatus(@PathVariable final long id, + @RequestBody final OrderStatus status) { + Order order = orderService.updateOrderStatus(id, status); + return ResponseEntity.ok(order); + } + } diff --git a/src/main/java/com/podzilla/order/repository/OrderRepository.java b/src/main/java/com/podzilla/order/repository/OrderRepository.java index d9112fc..fd8f9a2 100644 --- a/src/main/java/com/podzilla/order/repository/OrderRepository.java +++ b/src/main/java/com/podzilla/order/repository/OrderRepository.java @@ -4,6 +4,9 @@ import org.springframework.data.jpa.repository.JpaRepository; import org.springframework.stereotype.Repository; +import java.util.Optional; + @Repository public interface OrderRepository extends JpaRepository { + Optional findByUserId(Long id); } diff --git a/src/main/java/com/podzilla/order/service/OrderService.java b/src/main/java/com/podzilla/order/service/OrderService.java index e1e27d8..296dad6 100644 --- a/src/main/java/com/podzilla/order/service/OrderService.java +++ b/src/main/java/com/podzilla/order/service/OrderService.java @@ -1,6 +1,7 @@ package com.podzilla.order.service; import com.podzilla.order.model.Order; +import com.podzilla.order.model.OrderStatus; import com.podzilla.order.repository.OrderRepository; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.BeanUtils; @@ -61,4 +62,37 @@ public void deleteOrder(final long id) { throw new RuntimeException("Order not found with id: " + id); } } + + public Optional getOrderByUserId(final long userId) { + log.info("Fetching order with user ID: {}", userId); + return orderRepository.findByUserId(userId); + } + + public Order cancelOrder(final long id) { + log.info("Cancelling order with ID: {}", id); + Optional existingOrder = orderRepository.findById(id); + if (existingOrder.isPresent()) { + Order order = existingOrder.get(); + order.setStatus(OrderStatus.CANCELLED); + order.setUpdatedAt(LocalDateTime.now()); + return orderRepository.save(order); + } else { + log.warn("Order with id: {} was not found", id); + throw new RuntimeException("Order not found with id: " + id); + } + } + + public Order updateOrderStatus(final long id, final OrderStatus status) { + log.info("Updating order status with ID: {}", id); + Optional existingOrder = orderRepository.findById(id); + if (existingOrder.isPresent()) { + Order order = existingOrder.get(); + order.setStatus(status); + order.setUpdatedAt(LocalDateTime.now()); + return orderRepository.save(order); + } else { + log.warn("Order with id: {} was not found", id); + throw new RuntimeException("Order not found with id: " + id); + } + } } From da784fcd387dee55990c24594d336527ba292248 Mon Sep 17 00:00:00 2001 From: Omar Aly Date: Sun, 4 May 2025 15:30:34 +0300 Subject: [PATCH 2/8] Fix linter issue --- .../java/com/podzilla/order/controller/OrderController.java | 4 ++-- 1 file changed, 2 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 358802f..578436d 100644 --- a/src/main/java/com/podzilla/order/controller/OrderController.java +++ b/src/main/java/com/podzilla/order/controller/OrderController.java @@ -61,8 +61,8 @@ public ResponseEntity deleteOrder(@PathVariable final long id) { } @GetMapping("/user/{userId}") - public ResponseEntity getOrderByUserId - (@PathVariable final long userId) { + public ResponseEntity getOrderByUserId( + @PathVariable final long userId) { Order order = orderService.getOrderByUserId(userId) .orElseThrow(() -> new RuntimeException("Order not found")); return ResponseEntity.ok(order); From 5d203435b4d9f43ba663542566f053603e4cdc7f Mon Sep 17 00:00:00 2001 From: Omar Aly Date: Sun, 4 May 2025 17:34:58 +0300 Subject: [PATCH 3/8] Resolve Comments 1. Added Swagger and Logger Dependencies in pom.xml 2. Added Global Exception Handler to handle Exceptions in OrderService 3. Used Swagger and Logger for endpoints in OrderController --- pom.xml | 10 ++++ .../order/controller/OrderController.java | 41 +++++++++++++-- .../order/exception/NotFoundException.java | 7 +++ .../podzilla/order/service/OrderService.java | 50 ++++++++++++------- 4 files changed, 85 insertions(+), 23 deletions(-) create mode 100644 src/main/java/com/podzilla/order/exception/NotFoundException.java diff --git a/pom.xml b/pom.xml index fd77e3d..32ceacc 100644 --- a/pom.xml +++ b/pom.xml @@ -34,6 +34,16 @@ org.springframework.boot spring-boot-starter-data-jdbc + + org.springdoc + springdoc-openapi-starter-webmvc-ui + 2.8.5 + + + net.logstash.logback + logstash-logback-encoder + 7.4 + org.springframework.boot spring-boot-starter-data-jpa diff --git a/src/main/java/com/podzilla/order/controller/OrderController.java b/src/main/java/com/podzilla/order/controller/OrderController.java index 578436d..9156c30 100644 --- a/src/main/java/com/podzilla/order/controller/OrderController.java +++ b/src/main/java/com/podzilla/order/controller/OrderController.java @@ -14,8 +14,14 @@ import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; import org.springframework.web.bind.annotation.DeleteMapping; +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.util.List; +import java.util.Optional; @RestController @RequestMapping("/orders") @@ -23,6 +29,9 @@ public class OrderController { private final OrderService orderService; + private static final Logger LOGGER = + LoggerFactory.getLogger(OrderController.class); + @Autowired public OrderController(final OrderService orderService) { this.orderService = orderService; @@ -61,25 +70,47 @@ public ResponseEntity deleteOrder(@PathVariable final long id) { } @GetMapping("/user/{userId}") - public ResponseEntity getOrderByUserId( + @Operation( + summary = "Get order by user ID", + description = "Fetches an order based on the provided user ID" + ) + @ApiResponse( + responseCode = "200", description = "Order found" + ) + public ResponseEntity> getOrderByUserId( @PathVariable final long userId) { - Order order = orderService.getOrderByUserId(userId) - .orElseThrow(() -> new RuntimeException("Order not found")); + Optional order = orderService.getOrderByUserId(userId); + LOGGER.info("Order found for user ID: {}", userId); return ResponseEntity.ok(order); } @PutMapping("/cancel/{id}") + @Operation( + summary = "Cancel order", + description = "Cancels an order based on the provided order ID" + ) + @ApiResponse( + responseCode = "200", description = "Order cancelled" + ) public ResponseEntity cancelOrder(@PathVariable final long id) { Order order = orderService.cancelOrder(id); + LOGGER.info("Order with ID: {} cancelled", id); return ResponseEntity.ok(order); } - // Endpoint to update order status @PutMapping("/status/{id}") + @Operation( + summary = "Update order status", + description = "Updates the status of an order based on " + + "the provided order ID" + ) + @ApiResponse( + responseCode = "200", description = "Order status updated" + ) public ResponseEntity updateOrderStatus(@PathVariable final long id, @RequestBody final OrderStatus status) { Order order = orderService.updateOrderStatus(id, status); + LOGGER.info("Order status updated for ID: {}", id); return ResponseEntity.ok(order); } - } diff --git a/src/main/java/com/podzilla/order/exception/NotFoundException.java b/src/main/java/com/podzilla/order/exception/NotFoundException.java new file mode 100644 index 0000000..322886c --- /dev/null +++ b/src/main/java/com/podzilla/order/exception/NotFoundException.java @@ -0,0 +1,7 @@ +package com.podzilla.order.exception; + +public class NotFoundException extends RuntimeException{ + public NotFoundException(final String message) { + super("Not Found: " + message); + } +} diff --git a/src/main/java/com/podzilla/order/service/OrderService.java b/src/main/java/com/podzilla/order/service/OrderService.java index 296dad6..bd4a63d 100644 --- a/src/main/java/com/podzilla/order/service/OrderService.java +++ b/src/main/java/com/podzilla/order/service/OrderService.java @@ -1,5 +1,6 @@ package com.podzilla.order.service; +import com.podzilla.order.exception.NotFoundException; import com.podzilla.order.model.Order; import com.podzilla.order.model.OrderStatus; import com.podzilla.order.repository.OrderRepository; @@ -7,11 +8,11 @@ import org.springframework.beans.BeanUtils; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; - import java.time.LocalDateTime; import java.util.List; import java.util.Optional; + @Slf4j @Service public class OrderService { @@ -65,34 +66,47 @@ public void deleteOrder(final long id) { public Optional getOrderByUserId(final long userId) { log.info("Fetching order with user ID: {}", userId); + + Optional order = orderRepository.findByUserId(userId); + + checkNotFoundException(order.orElse(null), + "Order not found with user ID: " + userId); + return orderRepository.findByUserId(userId); } public Order cancelOrder(final long id) { log.info("Cancelling order with ID: {}", id); + Optional existingOrder = orderRepository.findById(id); - if (existingOrder.isPresent()) { - Order order = existingOrder.get(); - order.setStatus(OrderStatus.CANCELLED); - order.setUpdatedAt(LocalDateTime.now()); - return orderRepository.save(order); - } else { - log.warn("Order with id: {} was not found", id); - throw new RuntimeException("Order not found with id: " + id); - } + + checkNotFoundException(existingOrder.orElse(null), + "Order not found with id: " + id); + + Order order = existingOrder.get(); + order.setStatus(OrderStatus.CANCELLED); + order.setUpdatedAt(LocalDateTime.now()); + return orderRepository.save(order); } public Order updateOrderStatus(final long id, final OrderStatus status) { log.info("Updating order status with ID: {}", id); + Optional existingOrder = orderRepository.findById(id); - if (existingOrder.isPresent()) { - Order order = existingOrder.get(); - order.setStatus(status); - order.setUpdatedAt(LocalDateTime.now()); - return orderRepository.save(order); - } else { - log.warn("Order with id: {} was not found", id); - throw new RuntimeException("Order not found with id: " + id); + + checkNotFoundException(existingOrder.orElse(null), + "Order not found with id: " + id); + + Order order = existingOrder.get(); + order.setStatus(status); + order.setUpdatedAt(LocalDateTime.now()); + return orderRepository.save(order); + } + + private void checkNotFoundException(final Object value, + final String message) { + if (value == null) { + throw new NotFoundException(message); } } } From 8cc4b16a6b0c4539a5706112aa00a495d300ac4e Mon Sep 17 00:00:00 2001 From: Omar Aly Date: Sun, 4 May 2025 17:39:20 +0300 Subject: [PATCH 4/8] Adjusted lint checks --- .../java/com/podzilla/order/controller/OrderController.java | 4 ++-- .../java/com/podzilla/order/exception/NotFoundException.java | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/src/main/java/com/podzilla/order/controller/OrderController.java b/src/main/java/com/podzilla/order/controller/OrderController.java index 9156c30..9e19972 100644 --- a/src/main/java/com/podzilla/order/controller/OrderController.java +++ b/src/main/java/com/podzilla/order/controller/OrderController.java @@ -101,8 +101,8 @@ public ResponseEntity cancelOrder(@PathVariable final long id) { @PutMapping("/status/{id}") @Operation( summary = "Update order status", - description = "Updates the status of an order based on " + - "the provided order ID" + description = "Updates the status of an order based on " + + "the provided order ID" ) @ApiResponse( responseCode = "200", description = "Order status updated" diff --git a/src/main/java/com/podzilla/order/exception/NotFoundException.java b/src/main/java/com/podzilla/order/exception/NotFoundException.java index 322886c..7a2c0da 100644 --- a/src/main/java/com/podzilla/order/exception/NotFoundException.java +++ b/src/main/java/com/podzilla/order/exception/NotFoundException.java @@ -1,6 +1,6 @@ package com.podzilla.order.exception; -public class NotFoundException extends RuntimeException{ +public class NotFoundException extends RuntimeException { public NotFoundException(final String message) { super("Not Found: " + message); } From a5423a9a0fb43bcc6c46549ef66cef05da5cecce Mon Sep 17 00:00:00 2001 From: Omar Aly Date: Thu, 8 May 2025 18:14:55 +0300 Subject: [PATCH 5/8] Added Global Exception Handler and Endpoint to Check out an order --- pom.xml | 4 ++ .../order/controller/OrderController.java | 14 +++++ .../order/exception/ErrorResponse.java | 19 ++++++ .../exception/GlobalExceptionHandler.java | 62 +++++++++++++++++++ .../exception/InvalidActionException.java | 7 +++ .../order/exception/ValidationException.java | 7 +++ .../podzilla/order/service/OrderService.java | 37 ++++++++++- 7 files changed, 149 insertions(+), 1 deletion(-) create mode 100644 src/main/java/com/podzilla/order/exception/ErrorResponse.java create mode 100644 src/main/java/com/podzilla/order/exception/GlobalExceptionHandler.java create mode 100644 src/main/java/com/podzilla/order/exception/InvalidActionException.java create mode 100644 src/main/java/com/podzilla/order/exception/ValidationException.java diff --git a/pom.xml b/pom.xml index 32ceacc..116047e 100644 --- a/pom.xml +++ b/pom.xml @@ -34,6 +34,10 @@ org.springframework.boot spring-boot-starter-data-jdbc + + org.springframework.boot + spring-boot-starter-security + org.springdoc springdoc-openapi-starter-webmvc-ui diff --git a/src/main/java/com/podzilla/order/controller/OrderController.java b/src/main/java/com/podzilla/order/controller/OrderController.java index 9e19972..569d876 100644 --- a/src/main/java/com/podzilla/order/controller/OrderController.java +++ b/src/main/java/com/podzilla/order/controller/OrderController.java @@ -113,4 +113,18 @@ public ResponseEntity updateOrderStatus(@PathVariable final long id, LOGGER.info("Order status updated for ID: {}", id); return ResponseEntity.ok(order); } + + @PostMapping("/checkout/{id}") + @Operation( + summary = "Checkout order", + description = "Checks out an order based on the provided order ID" + ) + @ApiResponse( + responseCode = "200", description = "Order checked out" + ) + public ResponseEntity checkoutOrder(@PathVariable final long id) { + Order order = orderService.checkoutOrder(id); + LOGGER.info("Order with ID: {} checked out", id); + return ResponseEntity.ok(order); + } } diff --git a/src/main/java/com/podzilla/order/exception/ErrorResponse.java b/src/main/java/com/podzilla/order/exception/ErrorResponse.java new file mode 100644 index 0000000..c752990 --- /dev/null +++ b/src/main/java/com/podzilla/order/exception/ErrorResponse.java @@ -0,0 +1,19 @@ +package com.podzilla.order.exception; + +import lombok.Getter; +import org.springframework.http.HttpStatus; + +import java.time.LocalDateTime; + +@Getter +public class ErrorResponse { + private final String message; + private final HttpStatus status; + private final LocalDateTime timestamp; + + public ErrorResponse(final String message, final HttpStatus status) { + this.message = message; + this.status = status; + this.timestamp = LocalDateTime.now(); + } +} diff --git a/src/main/java/com/podzilla/order/exception/GlobalExceptionHandler.java b/src/main/java/com/podzilla/order/exception/GlobalExceptionHandler.java new file mode 100644 index 0000000..0f19f36 --- /dev/null +++ b/src/main/java/com/podzilla/order/exception/GlobalExceptionHandler.java @@ -0,0 +1,62 @@ +package com.podzilla.order.exception; + +import org.springframework.http.HttpStatus; +import org.springframework.http.ResponseEntity; +import org.springframework.security.access.AccessDeniedException; +import org.springframework.security.core.AuthenticationException; +import org.springframework.web.bind.annotation.ExceptionHandler; +import org.springframework.web.bind.annotation.RestControllerAdvice; +import org.springframework.web.servlet.mvc.method.annotation.ResponseEntityExceptionHandler; + +@RestControllerAdvice +public class GlobalExceptionHandler extends ResponseEntityExceptionHandler { + + + @ExceptionHandler(AccessDeniedException.class) + public ResponseEntity handleAccessDeniedException( + final AccessDeniedException exception) { + return ResponseEntity.status(HttpStatus.FORBIDDEN) + .body(new ErrorResponse(exception.getMessage(), + HttpStatus.FORBIDDEN)); + } + + @ExceptionHandler(AuthenticationException.class) + public ResponseEntity handleAuthenticationException( + final AuthenticationException exception) { + return ResponseEntity.status(HttpStatus.UNAUTHORIZED) + .body(new ErrorResponse(exception.getMessage(), + HttpStatus.UNAUTHORIZED)); + } + + @ExceptionHandler(NotFoundException.class) + public ResponseEntity handleNotFoundException( + final NotFoundException exception) { + return ResponseEntity.status(HttpStatus.NOT_FOUND) + .body(new ErrorResponse(exception.getMessage(), + HttpStatus.NOT_FOUND)); + } + + @ExceptionHandler(ValidationException.class) + public ResponseEntity handleValidationException( + final ValidationException exception) { + return ResponseEntity.status(HttpStatus.BAD_REQUEST) + .body(new ErrorResponse(exception.getMessage(), + HttpStatus.BAD_REQUEST)); + } + + @ExceptionHandler(InvalidActionException.class) + public ResponseEntity handleInvalidActionException( + final InvalidActionException exception) { + return ResponseEntity.status(HttpStatus.BAD_REQUEST) + .body(new ErrorResponse(exception.getMessage(), + HttpStatus.BAD_REQUEST)); + } + + @ExceptionHandler(Exception.class) + public ResponseEntity handleException( + final Exception exception) { + return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR) + .body(new ErrorResponse(exception.getMessage(), + HttpStatus.INTERNAL_SERVER_ERROR)); + } +} diff --git a/src/main/java/com/podzilla/order/exception/InvalidActionException.java b/src/main/java/com/podzilla/order/exception/InvalidActionException.java new file mode 100644 index 0000000..89ce1d5 --- /dev/null +++ b/src/main/java/com/podzilla/order/exception/InvalidActionException.java @@ -0,0 +1,7 @@ +package com.podzilla.order.exception; + +public class InvalidActionException extends RuntimeException { + public InvalidActionException(final String message) { + super("Invalid action: " + message); + } +} diff --git a/src/main/java/com/podzilla/order/exception/ValidationException.java b/src/main/java/com/podzilla/order/exception/ValidationException.java new file mode 100644 index 0000000..f23efb2 --- /dev/null +++ b/src/main/java/com/podzilla/order/exception/ValidationException.java @@ -0,0 +1,7 @@ +package com.podzilla.order.exception; + +public class ValidationException extends RuntimeException { + public ValidationException(final String message) { + super("Validation error: " + message); + } +} diff --git a/src/main/java/com/podzilla/order/service/OrderService.java b/src/main/java/com/podzilla/order/service/OrderService.java index bd4a63d..710020d 100644 --- a/src/main/java/com/podzilla/order/service/OrderService.java +++ b/src/main/java/com/podzilla/order/service/OrderService.java @@ -89,7 +89,8 @@ public Order cancelOrder(final long id) { return orderRepository.save(order); } - public Order updateOrderStatus(final long id, final OrderStatus status) { + public Order updateOrderStatus(final long id, + final OrderStatus status) { log.info("Updating order status with ID: {}", id); Optional existingOrder = orderRepository.findById(id); @@ -103,6 +104,40 @@ public Order updateOrderStatus(final long id, final OrderStatus status) { return orderRepository.save(order); } + public Order checkoutOrder(final long id) { + log.info("Checking out order with ID: {}", id); + + Optional existingOrder = orderRepository.findById(id); + checkNotFoundException(existingOrder.orElse(null), + "Order not found with id: " + id); + + Order order = existingOrder.get(); + + if (order.getStatus() != OrderStatus.PENDING) { + throw new IllegalStateException("Only pending orders " + + "can be checked out."); + } + + order.setStatus(OrderStatus.CONFIRMED); + order.setUpdatedAt(LocalDateTime.now()); + Order savedOrder = orderRepository.save(order); + + //ToDo: Uncomment and implement the message publisher +// OrderCheckedOutEvent event = new OrderCheckedOutEvent( +// savedOrder.getId(), +// savedOrder.getUserId(), +// savedOrder.getTotalAmount(), // if applicable +// savedOrder.getStatus().name(), +// savedOrder.getUpdatedAt().toString() +// ); +// +// messagePublisher.publishOrderCheckedOutEvent(event); +// +// log.info("Order with ID: {} has been checked out and event published", +// id); + return savedOrder; + } + private void checkNotFoundException(final Object value, final String message) { if (value == null) { From 71d8612da653119643d8e1394c9a1411b3a2ff6e Mon Sep 17 00:00:00 2001 From: Omar Aly Date: Sat, 10 May 2025 21:08:49 +0300 Subject: [PATCH 6/8] Create docker-compose.yml --- docker-compose.yml | 44 ++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 44 insertions(+) create mode 100644 docker-compose.yml diff --git a/docker-compose.yml b/docker-compose.yml new file mode 100644 index 0000000..c126715 --- /dev/null +++ b/docker-compose.yml @@ -0,0 +1,44 @@ +services: + backend: + image: openjdk:25-ea-4-jdk-oraclelinux9 + container_name: order + ports: + - "8080:8080" + depends_on: + - order_db + environment: + - SPRING_DATASOURCE_URL=jdbc:postgresql://order_db:5432/orderDB + volumes: + - ./target:/app + - ./logs:/logs + command: [ "java", "-jar", "/app/order-0.0.1-SNAPSHOT.jar" ] + + order_db: + image: postgres:14.17 + container_name: order_db + environment: + POSTGRES_PASSWORD: 1234 + POSTGRES_USER: postgres + POSTGRES_DB: orderDB + ports: + - "5432:5432" + + loki: + image: grafana/loki:3.5.0 + container_name: loki + ports: + - "3100:3100" + command: -config.file=/etc/loki/local-config.yaml + + grafana: + image: grafana/grafana:10.4.1 + container_name: grafana + ports: + - "3000:3000" + depends_on: + - loki + environment: + - GF_SECURITY_ADMIN_USER=admin + - GF_SECURITY_ADMIN_PASSWORD=admin + volumes: + - grafana_data:/var/lib/grafana From ae077b0b88f71e49a0bf4f3d8c676e74c261c1fe Mon Sep 17 00:00:00 2001 From: Omar Aly Date: Sun, 11 May 2025 16:53:52 +0300 Subject: [PATCH 7/8] Add DockerFile --- Dockerfile | 7 +++++++ 1 file changed, 7 insertions(+) create mode 100644 Dockerfile diff --git a/Dockerfile b/Dockerfile new file mode 100644 index 0000000..c2a45ba --- /dev/null +++ b/Dockerfile @@ -0,0 +1,7 @@ +FROM openjdk:25-ea-4-jdk-oraclelinux9 + +WORKDIR /app + +COPY target/order-0.0.1-SNAPSHOT.jar /app/order-0.0.1-SNAPSHOT.jar + +ENTRYPOINT [ "java", "-jar", "/app/order-0.0.1-SNAPSHOT.jar" ] \ No newline at end of file From 5e4bb964606e82121ece166add8dbc2306b5563e Mon Sep 17 00:00:00 2001 From: Omar Aly Date: Mon, 12 May 2025 20:42:35 +0300 Subject: [PATCH 8/8] Removed Checkout endpoint and Adjusted OrderStatus enum --- .../com/podzilla/order/model/OrderStatus.java | 6 ++-- .../podzilla/order/service/OrderService.java | 36 ++----------------- 2 files changed, 5 insertions(+), 37 deletions(-) diff --git a/src/main/java/com/podzilla/order/model/OrderStatus.java b/src/main/java/com/podzilla/order/model/OrderStatus.java index 9dac508..07de71e 100644 --- a/src/main/java/com/podzilla/order/model/OrderStatus.java +++ b/src/main/java/com/podzilla/order/model/OrderStatus.java @@ -1,10 +1,10 @@ package com.podzilla.order.model; public enum OrderStatus { - PENDING, - CONFIRMED, + PLACED, + CANCELLED, SHIPPED, DELIVERED, - CANCELLED + FAILED } diff --git a/src/main/java/com/podzilla/order/service/OrderService.java b/src/main/java/com/podzilla/order/service/OrderService.java index 710020d..c520689 100644 --- a/src/main/java/com/podzilla/order/service/OrderService.java +++ b/src/main/java/com/podzilla/order/service/OrderService.java @@ -75,6 +75,8 @@ public Optional getOrderByUserId(final long userId) { return orderRepository.findByUserId(userId); } + + public Order cancelOrder(final long id) { log.info("Cancelling order with ID: {}", id); @@ -104,40 +106,6 @@ public Order updateOrderStatus(final long id, return orderRepository.save(order); } - public Order checkoutOrder(final long id) { - log.info("Checking out order with ID: {}", id); - - Optional existingOrder = orderRepository.findById(id); - checkNotFoundException(existingOrder.orElse(null), - "Order not found with id: " + id); - - Order order = existingOrder.get(); - - if (order.getStatus() != OrderStatus.PENDING) { - throw new IllegalStateException("Only pending orders " - + "can be checked out."); - } - - order.setStatus(OrderStatus.CONFIRMED); - order.setUpdatedAt(LocalDateTime.now()); - Order savedOrder = orderRepository.save(order); - - //ToDo: Uncomment and implement the message publisher -// OrderCheckedOutEvent event = new OrderCheckedOutEvent( -// savedOrder.getId(), -// savedOrder.getUserId(), -// savedOrder.getTotalAmount(), // if applicable -// savedOrder.getStatus().name(), -// savedOrder.getUpdatedAt().toString() -// ); -// -// messagePublisher.publishOrderCheckedOutEvent(event); -// -// log.info("Order with ID: {} has been checked out and event published", -// id); - return savedOrder; - } - private void checkNotFoundException(final Object value, final String message) { if (value == null) {