content: package com.food.order.system.outbox.scheduler.approval;
  
  import com.food.order.system.outbox.OutboxScheduler;
  import com.food.order.system.outbox.OutboxStatus;
  import com.food.order.system.outbox.model.approval.OrderApprovalOutboxMessage;
  import com.food.order.system.ports.output.message.publisher.restaurantapproval.RestaurantApprovalRequestMessagePublisher;
  import com.food.order.system.saga.SagaStatus;
  import lombok.RequiredArgsConstructor;
  import lombok.extern.slf4j.Slf4j;
  import org.springframework.scheduling.annotation.Scheduled;
  import org.springframework.stereotype.Component;
  import org.springframework.transaction.annotation.Transactional;
  
  import java.util.List;
  import java.util.Optional;
  import java.util.stream.Collectors;
  
  @Slf4j
  @Component
  @RequiredArgsConstructor
  public class RestaurantApprovalOutboxScheduler implements OutboxScheduler {
  
      private final ApprovalOutboxHelper approvalOutboxHelper;
      private final RestaurantApprovalRequestMessagePublisher restaurantApprovalRequestMessagePublisher;
  
      @Override
      @Transactional
      @Scheduled(fixedDelayString = "${order-service.outbox-scheduler-fixed-rate}",
              initialDelayString = "${order-service.outbox-scheduler-initial-delay}")
      public void processOutboxMessage() {
          Optional<List<OrderApprovalOutboxMessage>> outboxMessagesResponse =
                  approvalOutboxHelper.getApprovalOutboxMessageByOutboxStatusAndSagaStatus(
                          OutboxStatus.STARTED,
                          SagaStatus.PROCESSING);
          if (outboxMessagesResponse.isPresent() && outboxMessagesResponse.get().size() > 0) {
              List<OrderApprovalOutboxMessage> outboxMessages = outboxMessagesResponse.get();
              log.info("Received {} OrderApprovalOutboxMessage with ids: {}, sending to message bus!",
                      outboxMessages.size(),
                      outboxMessages.stream().map(outboxMessage ->
                              outboxMessage.getId().toString()).collect(Collectors.joining(",")));
              outboxMessages.forEach(outboxMessage ->
                      restaurantApprovalRequestMessagePublisher.publish(outboxMessage, this::updateOutboxStatus));
              log.info("{} OrderApprovalOutboxMessage sent to message bus!", outboxMessages.size());
  
          }
  
      }
  
  
      private void updateOutboxStatus(OrderApprovalOutboxMessage orderPaymentOutboxMessage,
                                      OutboxStatus outboxStatus) {
          orderPaymentOutboxMessage.setOutboxStatus(outboxStatus);
          approvalOutboxHelper.save(orderPaymentOutboxMessage);
          log.info("Outbox message id : {} updated successfully", orderPaymentOutboxMessage.getId());
      }
  }
  