Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
8 changes: 7 additions & 1 deletion common/core/src/main/resources/application-eureka.yml
Original file line number Diff line number Diff line change
@@ -1,4 +1,10 @@
eureka:
client:
service-url:
defaultZone: ${EUREKA_SERVER}
defaultZone: ${EUREKA_SERVER}

spring:
cloud:
loadbalancer:
ribbon:
enabled: true
Original file line number Diff line number Diff line change
@@ -0,0 +1,15 @@
package messaging.events;

import java.util.UUID;

public record OrderFailedEvent(
UUID scheduleId,
UUID seatId
) {
public static OrderFailedEvent create(UUID scheduleId, UUID seatId) {
return new OrderFailedEvent(
scheduleId,
seatId
);
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,17 @@
package messaging.events;

import java.util.UUID;

public record SeatPreReserveExpiredEvent(
UUID scheduleId,
UUID seatId
) {

public static SeatPreReserveExpiredEvent create(UUID scheduleId, UUID seatId) {
return new SeatPreReserveExpiredEvent(
scheduleId,
seatId
);
}

}
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,8 @@
public enum OrderTopic {

COMPLETED_FOR_SEAT_RESERVATION("order-completed-for-seat-reservation"),
COMPLETED_FOR_QUEUE_TOKEN_REMOVAL("order-completed-for-queue-token-removal");
COMPLETED_FOR_QUEUE_TOKEN_REMOVAL("order-completed-for-queue-token-removal"),
FAILED("order-failed");

private final String topic;

Expand Down
13 changes: 13 additions & 0 deletions common/messaging/src/main/java/messaging/topics/SeatTopic.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,13 @@
package messaging.topics;

import lombok.Getter;
import lombok.RequiredArgsConstructor;

@Getter
@RequiredArgsConstructor
public enum SeatTopic {

PRE_RESERVE_EXPIRED("pre-reserve-expired");

private final String topic;
}
1 change: 0 additions & 1 deletion services/order/build.gradle
Original file line number Diff line number Diff line change
Expand Up @@ -38,7 +38,6 @@ dependencies {
implementation project(':common:core')
implementation project(':common:dtos')
implementation project(':common:rdb')
implementation project(':common:caching')
implementation project(':common:messaging')
implementation project(':common:monitoring')

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,7 @@

@SpringBootApplication
@EnableFeignClients
@ComponentScan(basePackages = {"com.ticketPing.order", "aop", "exception", "audit", "caching", "messaging"})
@ComponentScan(basePackages = {"com.ticketPing.order", "aop", "exception", "audit", "messaging"})
public class OrderApplication {
public static void main(String[] args) {
SpringApplication.run(OrderApplication.class, args);
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,12 @@
package com.ticketPing.order.application.client;

import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.RequestParam;
import payment.PaymentResponse;
import response.CommonResponse;

import java.util.UUID;

public interface PaymentClient {
ResponseEntity<CommonResponse<PaymentResponse>> getCompletedPaymentByOrderId(@RequestParam("orderId") UUID orderId);
}

This file was deleted.

This file was deleted.

Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@

import messaging.events.OrderCompletedForQueueTokenRemovalEvent;
import messaging.events.OrderCompletedForSeatReservationEvent;
import messaging.events.OrderFailedEvent;
import messaging.utils.EventSerializer;
import lombok.RequiredArgsConstructor;
import org.springframework.kafka.core.KafkaTemplate;
Expand All @@ -24,4 +25,9 @@ public void publishForQueueTokenRemoval(OrderCompletedForQueueTokenRemovalEvent
kafkaTemplate.send(OrderTopic.COMPLETED_FOR_QUEUE_TOKEN_REMOVAL.getTopic(), message);
}

public void publishOrderFailed(OrderFailedEvent event) {
String message = EventSerializer.serialize(event);
kafkaTemplate.send(OrderTopic.FAILED.getTopic(), message);
}

}
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
package com.ticketPing.order.application.service;

import com.ticketPing.order.application.client.PaymentClient;
import com.ticketPing.order.application.client.PerformanceClient;
import com.ticketPing.order.application.dtos.OrderResponse;
import com.ticketPing.order.common.exception.OrderExceptionCase;
Expand All @@ -9,19 +10,21 @@
import com.ticketPing.order.domain.repository.OrderRepository;
import com.ticketPing.order.presentation.request.CreateOrderRequest;
import exception.ApplicationException;
import feign.FeignException;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import lombok.val;
import messaging.events.OrderCompletedForQueueTokenRemovalEvent;
import messaging.events.OrderCompletedForSeatReservationEvent;
import org.springframework.data.domain.Page;
import messaging.events.OrderFailedEvent;
import org.springframework.data.domain.Pageable;
import org.springframework.data.domain.Slice;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import performance.OrderSeatResponse;

import java.util.List;
import java.util.Optional;
import java.util.UUID;

import static com.ticketPing.order.common.exception.OrderExceptionCase.DUPLICATED_ORDER;
Expand All @@ -35,6 +38,7 @@ public class OrderService {
private final OrderRepository orderRepository;
private final EventApplicationService eventApplicationService;
private final PerformanceClient performanceClient;
private final PaymentClient paymentClient;

@Transactional
public OrderResponse createOrder(CreateOrderRequest createOrderRequest, UUID userId) {
Expand All @@ -58,6 +62,23 @@ public void validateOrderAndExtendTTL(UUID orderId, UUID userId) {
performanceClient.extendPreReserveTTL(order.getScheduleId(), order.getOrderSeat().getSeatId());
}

@Transactional
public void failOrder(UUID scheduleId, UUID seatId) {
Optional<Order> optionalOrder = orderRepository.findByOrderSeatSeatIdAndOrderStatus(seatId, OrderStatus.PENDING);

if (optionalOrder.isPresent()) {
Order order = optionalOrder.get();
try {
paymentClient.getCompletedPaymentByOrderId(order.getId());
} catch (FeignException.NotFound e) {
order.fail();
publishOrderFailed(scheduleId, seatId);
}
} else {
publishOrderFailed(scheduleId, seatId);
}
}

@Transactional
public void completeOrder(UUID orderId, UUID paymentId) {
Order order = findOrderById(orderId);
Expand Down Expand Up @@ -112,4 +133,9 @@ private void publishForQueueTokenRemoval(UUID userId, UUID performanceId) {
val event = OrderCompletedForQueueTokenRemovalEvent.create(userId, performanceId);
eventApplicationService.publishForQueueTokenRemoval(event);
}

private void publishOrderFailed(UUID scheduleId, UUID seatId) {
val event = OrderFailedEvent.create(scheduleId, seatId);
eventApplicationService.publishOrderFailed(event);
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -63,4 +63,7 @@ public void complete(UUID paymentId){
this.paymentId = paymentId;
}

public void fail() {
this.orderStatus = OrderStatus.FAIL;
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -14,6 +14,8 @@ public interface OrderRepository {

Optional<Order> findById(UUID orderId);

Optional<Order> findByOrderSeatSeatIdAndOrderStatus(UUID seatId, OrderStatus orderStatus);

Optional<Order> findByIdAndOrderStatus(UUID orderId, OrderStatus orderStatus);

boolean existsByOrderSeatSeatIdAndOrderStatusIn(UUID seatId, List<OrderStatus> statuses);
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,18 @@
package com.ticketPing.order.infrastructure.client;

import com.ticketPing.order.application.client.PaymentClient;
import org.springframework.cloud.openfeign.FeignClient;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestParam;
import payment.PaymentResponse;
import response.CommonResponse;

import java.util.UUID;

@FeignClient(name = "payment")
public interface PaymentFeignClient extends PaymentClient {
@GetMapping("/api/v1/payments/completed")
ResponseEntity<CommonResponse<PaymentResponse>> getCompletedPaymentByOrderId(@RequestParam("orderId") UUID orderId);

}

This file was deleted.

Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,7 @@
import com.ticketPing.order.application.service.OrderService;
import messaging.events.PaymentCompletedEvent;
import lombok.RequiredArgsConstructor;
import messaging.events.SeatPreReserveExpiredEvent;
import messaging.utils.EventLogger;
import messaging.utils.EventSerializer;
import org.apache.kafka.clients.consumer.ConsumerRecord;
Expand All @@ -24,4 +25,12 @@ public void handlePaymentCompletedEvent(ConsumerRecord<String, String> record, A
acknowledgment.acknowledge();
}

@KafkaListener(topics = "pre-reserve-expired", groupId = "order-group")
public void handleSeatPreReserveExpiredEvent(ConsumerRecord<String, String> record, Acknowledgment acknowledgment) {
EventLogger.logReceivedMessage(record);
SeatPreReserveExpiredEvent event = EventSerializer.deserialize(record.value(), SeatPreReserveExpiredEvent.class);
orderService.failOrder(event.scheduleId(), event.seatId());
acknowledgment.acknowledge();
}

}

This file was deleted.

1 change: 0 additions & 1 deletion services/order/src/main/resources/application.yml
Original file line number Diff line number Diff line change
Expand Up @@ -12,7 +12,6 @@ spring:
import:
- "classpath:application-eureka.yml"
- "classpath:application-jpa.yml"
- "classpath:application-redis.yml"
- "classpath:application-kafka.yml"
- "classpath:application-monitoring.yml"

Expand Down
Loading
Loading