content: package com.food.order.system.payment.data.access.outobx.adapter;
  
  
  import com.food.order.system.outbox.OutboxStatus;
  import com.food.order.system.payment.application.service.outbox.model.OrderOutboxMessage;
  import com.food.order.system.payment.application.service.ports.output.repository.OrderOutboxRepository;
  import com.food.order.system.payment.data.access.outobx.exception.OrderOutboxNotFoundException;
  import com.food.order.system.payment.data.access.outobx.mapper.OrderOutboxDataAccessMapper;
  import com.food.order.system.payment.data.access.outobx.repository.OrderOutboxJpaRepository;
  import com.food.order.system.valueobject.PaymentStatus;
  import lombok.RequiredArgsConstructor;
  import org.springframework.stereotype.Component;
  
  import java.util.List;
  import java.util.Optional;
  import java.util.UUID;
  import java.util.stream.Collectors;
  
  @Component
  @RequiredArgsConstructor
  public class OrderOutboxRepositoryImpl implements OrderOutboxRepository {
  
      private final OrderOutboxJpaRepository orderOutboxJpaRepository;
      private final OrderOutboxDataAccessMapper orderOutboxDataAccessMapper;
  
      @Override
      public OrderOutboxMessage save(OrderOutboxMessage orderPaymentOutboxMessage) {
          return orderOutboxDataAccessMapper
                  .orderOutboxEntityToOrderOutboxMessage(orderOutboxJpaRepository
                          .save(orderOutboxDataAccessMapper
                                  .orderOutboxMessageToOutboxEntity(orderPaymentOutboxMessage)));
      }
  
      @Override
      public Optional<List<OrderOutboxMessage>> findByTypeAndOutboxStatus(String sagaType, OutboxStatus outboxStatus) {
          return Optional.of(orderOutboxJpaRepository.findByTypeAndOutboxStatus(sagaType, outboxStatus)
                  .orElseThrow(() -> new OrderOutboxNotFoundException("Approval outbox object " +
                          "cannot be found for saga type " + sagaType))
                  .stream()
                  .map(orderOutboxDataAccessMapper::orderOutboxEntityToOrderOutboxMessage)
                  .collect(Collectors.toList()));
      }
  
      @Override
      public Optional<OrderOutboxMessage> findByTypeAndSagaIdAndPaymentStatusAndOutboxStatus(String sagaType,
                                                                              UUID sagaId,
                                                                              PaymentStatus paymentStatus,
                                                                              OutboxStatus outboxStatus) {
          return orderOutboxJpaRepository.findByTypeAndSagaIdAndPaymentStatusAndOutboxStatus(sagaType, sagaId,
                          paymentStatus, outboxStatus)
                  .map(orderOutboxDataAccessMapper::orderOutboxEntityToOrderOutboxMessage);
      }
  
      @Override
      public void deleteByTypeAndOutboxStatus(String sagaType, OutboxStatus outboxStatus) {
          orderOutboxJpaRepository.deleteByTypeAndOutboxStatus(sagaType, outboxStatus);
      }
  }
  