diff --git a/common/common-domain/src/main/java/com/food/order/domain/event/publisher/DomainEventPublisher.java b/common/common-domain/src/main/java/com/food/order/domain/event/publisher/DomainEventPublisher.java new file mode 100644 index 0000000..7ae9f01 --- /dev/null +++ b/common/common-domain/src/main/java/com/food/order/domain/event/publisher/DomainEventPublisher.java @@ -0,0 +1,7 @@ +package com.food.order.domain.event.publisher; + +import com.food.order.domain.event.DomainEvent; + +public interface DomainEventPublisher { + void publish(T event); +} diff --git a/common/common-domain/src/main/java/com/food/order/domain/valueobject/OrderApprovalStatus.java b/common/common-domain/src/main/java/com/food/order/domain/valueobject/OrderApprovalStatus.java new file mode 100644 index 0000000..32328cf --- /dev/null +++ b/common/common-domain/src/main/java/com/food/order/domain/valueobject/OrderApprovalStatus.java @@ -0,0 +1,6 @@ +package com.food.order.domain.valueobject; + +public enum OrderApprovalStatus { + APPROVED, + REJECTED +} diff --git a/common/common-domain/src/main/java/com/food/order/domain/valueobject/PaymentStatus.java b/common/common-domain/src/main/java/com/food/order/domain/valueobject/PaymentStatus.java new file mode 100644 index 0000000..f01b92d --- /dev/null +++ b/common/common-domain/src/main/java/com/food/order/domain/valueobject/PaymentStatus.java @@ -0,0 +1,5 @@ +package com.food.order.domain.valueobject; + +public enum PaymentStatus { + COMPLETED,CANCELED,FAILED +} diff --git a/order-service/order-domain/order-application-service/pom.xml b/order-service/order-domain/order-application-service/pom.xml index baccb09..8bd87d6 100644 --- a/order-service/order-domain/order-application-service/pom.xml +++ b/order-service/order-domain/order-application-service/pom.xml @@ -21,6 +21,21 @@ order-core-domain + + com.food.order + common-domain + + + + org.springframework.boot + spring-boot-starter-validation + + + + org.springframework + spring-tx + + \ No newline at end of file diff --git a/order-service/order-domain/order-application-service/src/main/java/com/food/order/domain/dto/create/CreateOrderCommand.java b/order-service/order-domain/order-application-service/src/main/java/com/food/order/domain/dto/create/CreateOrderCommand.java new file mode 100644 index 0000000..bf17cce --- /dev/null +++ b/order-service/order-domain/order-application-service/src/main/java/com/food/order/domain/dto/create/CreateOrderCommand.java @@ -0,0 +1,20 @@ +package com.food.order.domain.dto.create; + +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Getter; + +import javax.validation.constraints.NotNull; +import java.math.BigDecimal; +import java.util.List; +import java.util.UUID; + +@Getter +@Builder +@AllArgsConstructor +public record CreateOrderCommand(@NotNull UUID customerId, + @NotNull UUID restaurantId, + @NotNull BigDecimal price, + @NotNull List orderItems, + @NotNull OrderAddress orderAddress) { +} diff --git a/order-service/order-domain/order-application-service/src/main/java/com/food/order/domain/dto/create/CreateOrderResponse.java b/order-service/order-domain/order-application-service/src/main/java/com/food/order/domain/dto/create/CreateOrderResponse.java new file mode 100644 index 0000000..05ef000 --- /dev/null +++ b/order-service/order-domain/order-application-service/src/main/java/com/food/order/domain/dto/create/CreateOrderResponse.java @@ -0,0 +1,17 @@ +package com.food.order.domain.dto.create; + +import com.food.order.domain.valueobject.OrderStatus; +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Getter; + +import javax.validation.constraints.NotNull; +import java.util.UUID; + +@Getter +@Builder +@AllArgsConstructor +public record CreateOrderResponse(@NotNull UUID orderTrackingId, + @NotNull OrderStatus orderStatus, + @NotNull String message) { +} diff --git a/order-service/order-domain/order-application-service/src/main/java/com/food/order/domain/dto/create/OrderAddress.java b/order-service/order-domain/order-application-service/src/main/java/com/food/order/domain/dto/create/OrderAddress.java new file mode 100644 index 0000000..d96e8b9 --- /dev/null +++ b/order-service/order-domain/order-application-service/src/main/java/com/food/order/domain/dto/create/OrderAddress.java @@ -0,0 +1,16 @@ +package com.food.order.domain.dto.create; + +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Getter; + +import javax.validation.constraints.Max; +import javax.validation.constraints.NotNull; + +@Getter +@AllArgsConstructor +@Builder +public record OrderAddress(@NotNull @Max(value = 50) String street, + @NotNull @Max(value = 50) String city, + @NotNull @Max(value = 10) String postalCode) { +} diff --git a/order-service/order-domain/order-application-service/src/main/java/com/food/order/domain/dto/create/OrderItem.java b/order-service/order-domain/order-application-service/src/main/java/com/food/order/domain/dto/create/OrderItem.java new file mode 100644 index 0000000..34c0619 --- /dev/null +++ b/order-service/order-domain/order-application-service/src/main/java/com/food/order/domain/dto/create/OrderItem.java @@ -0,0 +1,17 @@ +package com.food.order.domain.dto.create; + +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Getter; + +import javax.validation.constraints.NotNull; +import java.math.BigDecimal; +import java.util.UUID; + +@Getter +@AllArgsConstructor +@Builder +public record OrderItem(@NotNull UUID productId, + @NotNull Integer quantity, + @NotNull BigDecimal price, + @NotNull BigDecimal subTotal) {} diff --git a/order-service/order-domain/order-application-service/src/main/java/com/food/order/domain/dto/message/PaymentResponse.java b/order-service/order-domain/order-application-service/src/main/java/com/food/order/domain/dto/message/PaymentResponse.java new file mode 100644 index 0000000..97ce992 --- /dev/null +++ b/order-service/order-domain/order-application-service/src/main/java/com/food/order/domain/dto/message/PaymentResponse.java @@ -0,0 +1,24 @@ +package com.food.order.domain.dto.message; + +import com.food.order.domain.valueobject.PaymentStatus; +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Getter; + +import java.math.BigDecimal; +import java.util.List; + +@Getter +@Builder +@AllArgsConstructor +public class PaymentResponse { + + private String id; + private String sagaId; + private String orderId; + private String paymentId; + private String customerId; + private BigDecimal price; + private PaymentStatus paymentStatus; + private List failureMessages; +} diff --git a/order-service/order-domain/order-application-service/src/main/java/com/food/order/domain/dto/message/RestaurantApprovalResponse.java b/order-service/order-domain/order-application-service/src/main/java/com/food/order/domain/dto/message/RestaurantApprovalResponse.java new file mode 100644 index 0000000..d449113 --- /dev/null +++ b/order-service/order-domain/order-application-service/src/main/java/com/food/order/domain/dto/message/RestaurantApprovalResponse.java @@ -0,0 +1,22 @@ +package com.food.order.domain.dto.message; + +import com.food.order.domain.valueobject.OrderApprovalStatus; +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Getter; + +import java.time.Instant; +import java.util.List; + +@Getter +@Builder +@AllArgsConstructor +public class RestaurantApprovalResponse { + private String id; + private String sagaId; + private String orderId; + private String restaurantId; + private Instant createdAt; + private OrderApprovalStatus orderApprovalStatus; + private List failureMessages; +} diff --git a/order-service/order-domain/order-application-service/src/main/java/com/food/order/domain/dto/track/TrackOrderQuery.java b/order-service/order-domain/order-application-service/src/main/java/com/food/order/domain/dto/track/TrackOrderQuery.java new file mode 100644 index 0000000..b84829f --- /dev/null +++ b/order-service/order-domain/order-application-service/src/main/java/com/food/order/domain/dto/track/TrackOrderQuery.java @@ -0,0 +1,14 @@ +package com.food.order.domain.dto.track; + +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Getter; + +import javax.validation.constraints.NotNull; +import java.util.UUID; + +@Getter +@Builder +@AllArgsConstructor +public record TrackOrderQuery(@NotNull UUID orderTrackingId) { +} diff --git a/order-service/order-domain/order-application-service/src/main/java/com/food/order/domain/dto/track/TrackOrderResponse.java b/order-service/order-domain/order-application-service/src/main/java/com/food/order/domain/dto/track/TrackOrderResponse.java new file mode 100644 index 0000000..7daea56 --- /dev/null +++ b/order-service/order-domain/order-application-service/src/main/java/com/food/order/domain/dto/track/TrackOrderResponse.java @@ -0,0 +1,18 @@ +package com.food.order.domain.dto.track; + +import com.food.order.domain.valueobject.OrderStatus; +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Getter; + +import javax.validation.constraints.NotNull; +import java.util.List; +import java.util.UUID; + +@Getter +@Builder +@AllArgsConstructor +public record TrackOrderResponse(@NotNull UUID orderTrackingId, + @NotNull OrderStatus orderStatus, + List failureMessages) { +} diff --git a/order-service/order-domain/order-application-service/src/main/java/com/food/order/domain/mapper/OrderDataMapper.java b/order-service/order-domain/order-application-service/src/main/java/com/food/order/domain/mapper/OrderDataMapper.java new file mode 100644 index 0000000..7cc0d71 --- /dev/null +++ b/order-service/order-domain/order-application-service/src/main/java/com/food/order/domain/mapper/OrderDataMapper.java @@ -0,0 +1,8 @@ +package com.food.order.domain.mapper; + +import org.springframework.stereotype.Component; + +@Component +public class OrderDataMapper { + +} diff --git a/order-service/order-domain/order-application-service/src/main/java/com/food/order/domain/ports/input/message/listener/payment/PaymentResponseMessageListener.java b/order-service/order-domain/order-application-service/src/main/java/com/food/order/domain/ports/input/message/listener/payment/PaymentResponseMessageListener.java new file mode 100644 index 0000000..63dea72 --- /dev/null +++ b/order-service/order-domain/order-application-service/src/main/java/com/food/order/domain/ports/input/message/listener/payment/PaymentResponseMessageListener.java @@ -0,0 +1,9 @@ +package com.food.order.domain.ports.input.message.listener.payment; + +import com.food.order.domain.dto.message.PaymentResponse; + +public interface PaymentResponseMessageListener { + + void paymentCompleted(PaymentResponse paymentResponse); + void paymentCancelled(PaymentResponse paymentResponse); +} diff --git a/order-service/order-domain/order-application-service/src/main/java/com/food/order/domain/ports/input/message/listener/restaurantapproval/RestaurantApprovalResponseMessageListener.java b/order-service/order-domain/order-application-service/src/main/java/com/food/order/domain/ports/input/message/listener/restaurantapproval/RestaurantApprovalResponseMessageListener.java new file mode 100644 index 0000000..6ebcba1 --- /dev/null +++ b/order-service/order-domain/order-application-service/src/main/java/com/food/order/domain/ports/input/message/listener/restaurantapproval/RestaurantApprovalResponseMessageListener.java @@ -0,0 +1,8 @@ +package com.food.order.domain.ports.input.message.listener.restaurantapproval; + +import com.food.order.domain.dto.message.RestaurantApprovalResponse; + +public interface RestaurantApprovalResponseMessageListener { + void orderApproved(RestaurantApprovalResponse restaurantApprovalResponse); + void orderRejected(RestaurantApprovalResponse restaurantApprovalResponse); +} diff --git a/order-service/order-domain/order-application-service/src/main/java/com/food/order/domain/ports/input/service/OrderApplicationService.java b/order-service/order-domain/order-application-service/src/main/java/com/food/order/domain/ports/input/service/OrderApplicationService.java new file mode 100644 index 0000000..7eea048 --- /dev/null +++ b/order-service/order-domain/order-application-service/src/main/java/com/food/order/domain/ports/input/service/OrderApplicationService.java @@ -0,0 +1,15 @@ +package com.food.order.domain.ports.input.service; + +import com.food.order.domain.dto.create.CreateOrderCommand; +import com.food.order.domain.dto.create.CreateOrderResponse; +import com.food.order.domain.dto.track.TrackOrderQuery; +import com.food.order.domain.dto.track.TrackOrderResponse; + +import javax.validation.Valid; + +public interface OrderApplicationService { + + CreateOrderResponse createOrder(@Valid CreateOrderCommand createOrderCommand); + TrackOrderResponse trackOrder(@Valid TrackOrderQuery trackOrderQuery); + +} diff --git a/order-service/order-domain/order-application-service/src/main/java/com/food/order/domain/ports/output/message/publisher/payment/OrderCancelledPaymentRequestMessagePublisher.java b/order-service/order-domain/order-application-service/src/main/java/com/food/order/domain/ports/output/message/publisher/payment/OrderCancelledPaymentRequestMessagePublisher.java new file mode 100644 index 0000000..022c954 --- /dev/null +++ b/order-service/order-domain/order-application-service/src/main/java/com/food/order/domain/ports/output/message/publisher/payment/OrderCancelledPaymentRequestMessagePublisher.java @@ -0,0 +1,8 @@ +package com.food.order.domain.ports.output.message.publisher.payment; + +import com.food.order.domain.event.publisher.DomainEventPublisher; +import com.food.order.system.domain.event.OrderCancelledEvent; + +public interface OrderCancelledPaymentRequestMessagePublisher extends DomainEventPublisher { + +} diff --git a/order-service/order-domain/order-application-service/src/main/java/com/food/order/domain/ports/output/message/publisher/payment/OrderCreatedPaymentRequestMessagePublisher.java b/order-service/order-domain/order-application-service/src/main/java/com/food/order/domain/ports/output/message/publisher/payment/OrderCreatedPaymentRequestMessagePublisher.java new file mode 100644 index 0000000..3e7cf08 --- /dev/null +++ b/order-service/order-domain/order-application-service/src/main/java/com/food/order/domain/ports/output/message/publisher/payment/OrderCreatedPaymentRequestMessagePublisher.java @@ -0,0 +1,8 @@ +package com.food.order.domain.ports.output.message.publisher.payment; + +import com.food.order.domain.event.publisher.DomainEventPublisher; +import com.food.order.system.domain.event.OrderCreatedEvent; + +public interface OrderCreatedPaymentRequestMessagePublisher extends DomainEventPublisher { + +} diff --git a/order-service/order-domain/order-application-service/src/main/java/com/food/order/domain/ports/output/message/publisher/restaurantapproval/OrderPaidRestaurantRequestMessagePublisher.java b/order-service/order-domain/order-application-service/src/main/java/com/food/order/domain/ports/output/message/publisher/restaurantapproval/OrderPaidRestaurantRequestMessagePublisher.java new file mode 100644 index 0000000..2767439 --- /dev/null +++ b/order-service/order-domain/order-application-service/src/main/java/com/food/order/domain/ports/output/message/publisher/restaurantapproval/OrderPaidRestaurantRequestMessagePublisher.java @@ -0,0 +1,8 @@ +package com.food.order.domain.ports.output.message.publisher.restaurantapproval; + +import com.food.order.domain.event.publisher.DomainEventPublisher; +import com.food.order.system.domain.event.OrderPaidEvent; + +public interface OrderPaidRestaurantRequestMessagePublisher extends DomainEventPublisher { + +} diff --git a/order-service/order-domain/order-application-service/src/main/java/com/food/order/domain/ports/output/repository/CustomerRepository.java b/order-service/order-domain/order-application-service/src/main/java/com/food/order/domain/ports/output/repository/CustomerRepository.java new file mode 100644 index 0000000..7764e7f --- /dev/null +++ b/order-service/order-domain/order-application-service/src/main/java/com/food/order/domain/ports/output/repository/CustomerRepository.java @@ -0,0 +1,10 @@ +package com.food.order.domain.ports.output.repository; + +import com.food.order.system.domain.entity.Customer; + +import java.util.Optional; +import java.util.UUID; + +public interface CustomerRepository { + Optional findCustomer(UUID customerId); +} diff --git a/order-service/order-domain/order-application-service/src/main/java/com/food/order/domain/ports/output/repository/OrderRepository.java b/order-service/order-domain/order-application-service/src/main/java/com/food/order/domain/ports/output/repository/OrderRepository.java new file mode 100644 index 0000000..9694940 --- /dev/null +++ b/order-service/order-domain/order-application-service/src/main/java/com/food/order/domain/ports/output/repository/OrderRepository.java @@ -0,0 +1,14 @@ +package com.food.order.domain.ports.output.repository; + +import com.food.order.system.domain.entity.Order; + +import java.util.Optional; + +public interface OrderRepository { + + Order save(Order order); + + Optional findByTrackingId(String trackingId); + + +} diff --git a/order-service/order-domain/order-application-service/src/main/java/com/food/order/domain/ports/output/repository/RestaurantRepository.java b/order-service/order-domain/order-application-service/src/main/java/com/food/order/domain/ports/output/repository/RestaurantRepository.java new file mode 100644 index 0000000..f869406 --- /dev/null +++ b/order-service/order-domain/order-application-service/src/main/java/com/food/order/domain/ports/output/repository/RestaurantRepository.java @@ -0,0 +1,9 @@ +package com.food.order.domain.ports.output.repository; + +import com.food.order.system.domain.entity.Restaurant; + +import java.util.Optional; + +public interface RestaurantRepository { + Optional findRestaurantInformation(Restaurant restaurant); +}