@Override @Transactional public void decline(final Long refundRequestId) { final RefundRequest refundRequest = refundRequestRepository.findOne(refundRequestId).orElseThrow(() -> new RuntimeException("Refund request not found")); refundRequest.setStatus(RefundRequestStatus.DECLINED); refundRequestRepository.save(refundRequest); }
@Scheduled(fixedDelay = 300_000L) public void cleanRefunds() { final List<RefundRequest> refundRequests = refundRequestRepository.findAllByStatus(RefundRequestStatus.APPROVED); refundRequests.stream() .filter(refundRequest -> refundRequest.getTransactionHash() != null) .filter(refundRequest -> azraelClient.getTransactionStatus(refundRequest.getTransactionHash()).equals(TransactionStatus.FAILED)) .forEach(refundRequest -> { refundRequest.setStatus(RefundRequestStatus.TRANSACTION_FAILED); refundRequestRepository.save(refundRequest); }); } }
@Override @Transactional public void requestRefund(final RequestRefundCommand requestRefundCommand) { refundRequestRepository.save(RefundRequest.builder() .requestId(requestRefundCommand.getRequestId()) .funderAddress(requestRefundCommand.getFunderAddress()) .requestedBy(requestRefundCommand.getRequestedBy()) .build()); }
@Override @Transactional public void approve(final Long refundRequestId) { final RefundRequest refundRequest = refundRequestRepository.findOne(refundRequestId).orElseThrow(() -> new RuntimeException("Refund request not found")); refundRequest.setStatus(RefundRequestStatus.APPROVED); refundRequest.setTransactionSubmitTime(LocalDateTime.now()); final IssueInformationDto issueInformation = requestService.findRequest(refundRequest.getRequestId()).getIssueInformation(); final RefundTransaction refundTransaction = azraelClient.submitRefund(RefundCommand.builder() .address(refundRequest.getFunderAddress()) .platform(issueInformation.getPlatform().name()) .platformId(issueInformation.getPlatformId()) .build()); refundRequest.setTransactionHash(refundTransaction.getTransactionHash()); refundRequestRepository.save(refundRequest); }
@Override @Transactional public void refundProcessed(final RefundProcessedCommand command) { final List<RefundRequest> refundRequests = refundRequestRepository.findAllByRequestIdAndStatusIn(command.getRequestId(), APPROVED); refundRequests.forEach(refundRequest -> { refundRequest.setStatus(PROCESSED); refundRequest.setTransactionHash(command.getTransactionHash()); }); refundRequestRepository.save(refundRequests); final Refund refund = Refund.builder() .requestId(command.getRequestId()) .funderAddress(command.getFunderAddress()) .blockchainEventId(command.getBlockchainEventId()) .requestedBy(resolveRequestedBy(command, refundRequests).orElse(null)) .tokenValue(TokenValue.builder() .amountInWei(new BigDecimal(command.getAmount())) .tokenAddress(command.getTokenHash()) .build()) .build(); refundRepository.save(refund); cacheManager.getCache ("funds").evict(command.getRequestId()); applicationEventPublisher.publishEvent(new RefundProcessedEvent(refund)); }
verify(refundRequest2).setTransactionHash(transactionHash); verify(refundRequest2).setStatus(PROCESSED); verify(refundRequestRepository).save(refundRequests);
@Test void requestRefund() { final long requestId = 547L; final String funderAddress = "hjfgkh"; final String requestedBy = "4567gjfh"; refundService.requestRefund(RequestRefundCommand.builder().requestId(requestId).funderAddress(funderAddress).requestedBy(requestedBy).build()); verify(refundRequestRepository).save(refEq(RefundRequest.builder() .requestId(requestId) .funderAddress(funderAddress) .requestedBy(requestedBy) .build())); }