package de.szut.casino.deposit; import com.stripe.exception.StripeException; import com.stripe.model.checkout.Session; import com.stripe.param.checkout.SessionRetrieveParams; import de.szut.casino.user.UserEntity; import de.szut.casino.user.UserRepository; import org.springframework.stereotype.Service; import java.util.Objects; import java.util.Optional; @Service public class TransactionService { private final TransactionRepository transactionRepository; private final UserRepository userRepository; public TransactionService(TransactionRepository transactionRepository, UserRepository userRepository) { this.transactionRepository = transactionRepository; this.userRepository = userRepository; } public void createTransaction( UserEntity user, String sessionID, Double amount ) { TransactionEntity transaction = new TransactionEntity(); transaction.setUser(user); transaction.setSessionId(sessionID); transaction.setAmount(amount); transactionRepository.save(transaction); } public void fulfillCheckout(String sessionID) throws StripeException { SessionRetrieveParams params = SessionRetrieveParams.builder() .addExpand("line_items") .build(); Session checkoutSession = Session.retrieve(sessionID, params, null); if (!Objects.equals(checkoutSession.getPaymentStatus(), "paid")) { return; } Optional optionalTransaction = transactionRepository.findOneBySessionID(sessionID); if (optionalTransaction.isEmpty()) { throw new RuntimeException("Transaction not found"); } TransactionEntity transaction = optionalTransaction.get(); transaction.setStatus(TransactionStatus.SUCCEEDED); UserEntity user = transaction.getUser(); user.addBalance(checkoutSession.getAmountTotal()); userRepository.save(user); transactionRepository.save(transaction); } }