88 lines
3.5 KiB
Java
88 lines
3.5 KiB
Java
package de.szut.casino.deposit;
|
|
|
|
import com.stripe.Stripe;
|
|
import com.stripe.exception.StripeException;
|
|
import com.stripe.model.checkout.Session;
|
|
import com.stripe.param.checkout.SessionCreateParams;
|
|
import de.szut.casino.deposit.dto.AmountDto;
|
|
import de.szut.casino.deposit.dto.SessionIdDto;
|
|
import de.szut.casino.user.UserEntity;
|
|
import de.szut.casino.user.UserRepository;
|
|
import de.szut.casino.user.UserService;
|
|
import de.szut.casino.user.dto.KeycloakUserDto;
|
|
import jakarta.validation.Valid;
|
|
import org.springframework.beans.factory.annotation.Value;
|
|
import org.springframework.http.HttpEntity;
|
|
import org.springframework.http.HttpHeaders;
|
|
import org.springframework.http.HttpMethod;
|
|
import org.springframework.http.ResponseEntity;
|
|
import org.springframework.web.bind.annotation.*;
|
|
import org.springframework.web.client.RestTemplate;
|
|
|
|
import java.util.Optional;
|
|
|
|
@RestController
|
|
public class DepositController {
|
|
|
|
@Value("${stripe.secret.key}")
|
|
private String stripeKey;
|
|
|
|
@Value("${app.frontend-host}")
|
|
private String frontendHost;
|
|
|
|
private final TransactionService transactionService;
|
|
|
|
private final RestTemplate restTemplate;
|
|
|
|
private final UserRepository userRepository;
|
|
|
|
|
|
public DepositController(TransactionService transactionService, RestTemplate restTemplate, UserRepository userRepository) {
|
|
this.transactionService = transactionService;
|
|
this.restTemplate = restTemplate;
|
|
this.userRepository = userRepository;
|
|
}
|
|
|
|
@PostMapping("/deposit/checkout")
|
|
public ResponseEntity<SessionIdDto> checkout(@RequestBody @Valid AmountDto amountDto, @RequestHeader("Authorization") String token) throws StripeException {
|
|
Stripe.apiKey = stripeKey;
|
|
|
|
KeycloakUserDto userData = getKeycloakUserInfo(token);
|
|
Optional<UserEntity> optionalUserEntity = this.userRepository.findOneByKeycloakId(userData.getSub());
|
|
|
|
SessionCreateParams params = SessionCreateParams.builder()
|
|
.addLineItem(SessionCreateParams.LineItem.builder()
|
|
.setPriceData(SessionCreateParams.LineItem.PriceData.builder()
|
|
.setCurrency("EUR")
|
|
.setUnitAmount((long) amountDto.getAmount() * 100)
|
|
.setProductData(SessionCreateParams.LineItem.PriceData.ProductData.builder()
|
|
.setName("Einzahlung")
|
|
.build())
|
|
.build())
|
|
.setQuantity(1L)
|
|
.build())
|
|
.setSuccessUrl(frontendHost+"/home?success=true")
|
|
.setCancelUrl(frontendHost+"/home?success=false")
|
|
.setMode(SessionCreateParams.Mode.PAYMENT)
|
|
.build();
|
|
|
|
Session session = Session.create(params);
|
|
|
|
if (optionalUserEntity.isEmpty()) {
|
|
throw new RuntimeException("User doesnt exist");
|
|
}
|
|
|
|
transactionService.createTransaction(optionalUserEntity.get(), session.getId(), amountDto.getAmount());
|
|
|
|
return ResponseEntity.ok(new SessionIdDto(session.getId()));
|
|
}
|
|
|
|
private KeycloakUserDto getKeycloakUserInfo(String token) {
|
|
HttpHeaders headers = new HttpHeaders();
|
|
headers.set("Authorization", token);
|
|
ResponseEntity<KeycloakUserDto> response = this.restTemplate.exchange("http://localhost:9090/realms/LF12/protocol/openid-connect/userinfo", HttpMethod.GET, new HttpEntity<>(headers), KeycloakUserDto.class);
|
|
|
|
return response.getBody();
|
|
}
|
|
}
|
|
|