From 52d9e7b688fd0e8bbec492f82a575dc9f683e0f0 Mon Sep 17 00:00:00 2001 From: jank Date: Wed, 28 May 2025 10:39:36 +0200 Subject: [PATCH 1/3] feat: Add claude code review --- .gitea/workflows/claude.yml | 66 +++++++++++++++++++++++++++++++++++++ 1 file changed, 66 insertions(+) create mode 100644 .gitea/workflows/claude.yml diff --git a/.gitea/workflows/claude.yml b/.gitea/workflows/claude.yml new file mode 100644 index 0000000..25715b2 --- /dev/null +++ b/.gitea/workflows/claude.yml @@ -0,0 +1,66 @@ +name: Setup Gitea Tea CLI + +on: + pull_request: + types: [opened, synchronize] # Runs on new PRs and updates + +jobs: + setup-and-login: + runs-on: ubuntu-latest + steps: + - name: Checkout code + uses: actions/checkout@v4 + with: + fetch-depth: 0 + ref: ${{ github.ref }} + fetch-tags: true + + - name: Set Tea Version + id: tea_version + run: echo "version=0.9.2" >> $GITHUB_OUTPUT # Check for the latest version + + - name: Download Tea CLI + run: | + TEA_VERSION=$(echo "${{ steps.tea_version.outputs.version }}") + wget "https://gitea.com/gitea/tea/releases/download/v${TEA_VERSION}/tea-${TEA_VERSION}-linux-amd64" -O tea + chmod +x tea + sudo mv tea /usr/local/bin/tea + + - name: Verify Tea Installation + run: tea --version + + - name: Add Gitea Login + env: + GITEA_URL: ${{ secrets._GITEA_URL }} + GITEA_TOKEN: ${{ secrets._GITEA_TOKEN }} + run: | + if [ -z "$GITEA_URL" ]; then + echo "Error: GITEA_URL secret is not set." + exit 1 + fi + if [ -z "$GITEA_TOKEN" ]; then + echo "Error: GITEA_TOKEN secret is not set." + exit 1 + fi + tea login add --name mygitea --url "$GITEA_URL" --token "$GITEA_TOKEN" --insecure ${{ startsWith(secrets._GITEA_URL, 'http://') || '' }} + + - name: Install bun + uses: oven-sh/setup-bun@v2 + + - name: Install claude code + run: bun i -g @anthropic-ai/claude-code + + - name: Claude PR Review + env: + ANTHROPIC_API_KEY: ${{ secrets.ANTHROPIC_API_KEY }} + PR_NUMBER: ${{ github.event.number }} + run: | + claude --allowedTools "Bash(tea:*)" --allowedTools "Bash(git:*) Read Grep WebFetch Glob LS" -p "You are a code review assistant. Your task is to review the changes in Pull Request #${PR_NUMBER}. All relevant changes can be seen by looking at the git diff HEAD...main (NEVER EVER REVIEW ALL THE CODE ONLY THE ONE FROM THE DIFF you can use the rest as context) or using the tea cli which you can use and we are on gitea. Also make sure to only review the changes in this pull request + + Only provide constructive feedback on the quality, correctness, readability, and potential issues in the code. Do not make any changes or suggest complete rewrites—just review what is there. + + Once you are done with your review, post your feedback as a comment on the pull request using the following exact format: + + tea \"\" ${PR_NUMBER} \"\" + + Make sure the comment is clear, professional, and helpful. Only run the tea comment command once you're finished reviewing all changes. AND MOST IMPORTANDLY ONLY REVIEW THE DIFF FROM THE CURRENT STATE TO THE MAIN BRANCH TO GET THAT USE GIT DIFF." From 1c45ff0058989d18325617b8134ac1086b932b0e Mon Sep 17 00:00:00 2001 From: Phan Huy Tran Date: Wed, 28 May 2025 10:40:42 +0200 Subject: [PATCH 2/3] refactor: handle optional user inside userservice, replace @autowire --- .../blackjack/BlackJackGameController.java | 16 ++---------- .../casino/coinflip/CoinflipController.java | 8 +----- .../casino/deposit/DepositController.java | 12 +++------ .../de/szut/casino/dice/DiceController.java | 8 +----- .../casino/lootboxes/LootBoxController.java | 8 +----- .../szut/casino/security/AuthController.java | 8 +++--- .../szut/casino/security/SecurityConfig.java | 11 ++++---- .../security/jwt/JwtAuthenticationFilter.java | 11 ++++---- .../oauth2/CustomOAuth2UserService.java | 11 ++++---- .../OAuth2AuthenticationSuccessHandler.java | 8 +++--- .../oauth2/github/GitHubController.java | 8 +++--- .../security/oauth2/github/GitHubService.java | 21 +++++++-------- .../oauth2/google/GoogleController.java | 8 +++--- .../security/oauth2/google/GoogleService.java | 25 +++++++++--------- .../casino/security/service/AuthService.java | 26 +++++++++---------- .../service/UserDetailsServiceImpl.java | 8 +++--- .../de/szut/casino/slots/SlotController.java | 8 +----- .../de/szut/casino/user/UserController.java | 14 +++++----- .../java/de/szut/casino/user/UserService.java | 21 ++++++++++----- .../transaction/GetTransactionService.java | 26 +++++++++---------- .../transaction/TransactionController.java | 12 ++++----- 21 files changed, 127 insertions(+), 151 deletions(-) diff --git a/backend/src/main/java/de/szut/casino/blackjack/BlackJackGameController.java b/backend/src/main/java/de/szut/casino/blackjack/BlackJackGameController.java index 03d4a46..df104dc 100644 --- a/backend/src/main/java/de/szut/casino/blackjack/BlackJackGameController.java +++ b/backend/src/main/java/de/szut/casino/blackjack/BlackJackGameController.java @@ -59,13 +59,7 @@ public class BlackJackGameController { @PostMapping("/blackjack/start") public ResponseEntity createBlackJackGame(@RequestBody @Valid BetDto betDto) { - Optional optionalUser = userService.getCurrentUser(); - - if (optionalUser.isEmpty()) { - throw new UserNotFoundException(); - } - - UserEntity user = optionalUser.get(); + UserEntity user = this.userService.getCurrentUser(); if (!this.balanceService.hasFunds(user, betDto)) { throw new InsufficientFundsException(); @@ -75,13 +69,7 @@ public class BlackJackGameController { } private BlackJackGameEntity getBlackJackGame(Long gameId) { - Optional optionalUser = userService.getCurrentUser(); - - if (optionalUser.isEmpty()) { - throw new UserNotFoundException(); - } - - UserEntity user = optionalUser.get(); + UserEntity user = userService.getCurrentUser(); BlackJackGameEntity game = blackJackService.getBlackJackGame(gameId); if (game == null || !Objects.equals(game.getUserId(), user.getId())) { throw new UserBlackJackGameMismatchException(gameId); diff --git a/backend/src/main/java/de/szut/casino/coinflip/CoinflipController.java b/backend/src/main/java/de/szut/casino/coinflip/CoinflipController.java index 0a526f1..7cc0c83 100644 --- a/backend/src/main/java/de/szut/casino/coinflip/CoinflipController.java +++ b/backend/src/main/java/de/szut/casino/coinflip/CoinflipController.java @@ -28,13 +28,7 @@ public class CoinflipController { @PostMapping("/coinflip") public ResponseEntity coinFlip(@RequestBody @Valid CoinflipDto coinflipDto) { - Optional optionalUser = userService.getCurrentUser(); - - if (optionalUser.isEmpty()) { - throw new UserNotFoundException(); - } - - UserEntity user = optionalUser.get(); + UserEntity user = userService.getCurrentUser(); if (!this.balanceService.hasFunds(user, coinflipDto)) { throw new InsufficientFundsException(); diff --git a/backend/src/main/java/de/szut/casino/deposit/DepositController.java b/backend/src/main/java/de/szut/casino/deposit/DepositController.java index e64e428..d99da00 100644 --- a/backend/src/main/java/de/szut/casino/deposit/DepositController.java +++ b/backend/src/main/java/de/szut/casino/deposit/DepositController.java @@ -16,8 +16,6 @@ import org.springframework.web.bind.annotation.RequestBody; import org.springframework.web.bind.annotation.RequestHeader; import org.springframework.web.bind.annotation.RestController; -import java.util.Optional; - @RestController public class DepositController { @@ -29,7 +27,7 @@ public class DepositController { private final TransactionService transactionService; - private UserService userService; + private final UserService userService; public DepositController(TransactionService transactionService, UserService userService) { this.transactionService = transactionService; @@ -40,7 +38,7 @@ public class DepositController { public ResponseEntity checkout(@RequestBody @Valid AmountDto amountDto, @RequestHeader("Authorization") String token) throws StripeException { Stripe.apiKey = stripeKey; - Optional optionalUserEntity = this.userService.getCurrentUser(); + UserEntity user = userService.getCurrentUser(); SessionCreateParams params = SessionCreateParams.builder() .addLineItem(SessionCreateParams.LineItem.builder() @@ -60,11 +58,7 @@ public class DepositController { Session session = Session.create(params); - if (optionalUserEntity.isEmpty()) { - throw new RuntimeException("User doesnt exist"); - } - - transactionService.createTransaction(optionalUserEntity.get(), session.getId(), amountDto.getAmount()); + transactionService.createTransaction(user, session.getId(), amountDto.getAmount()); return ResponseEntity.ok(new SessionIdDto(session.getId())); } diff --git a/backend/src/main/java/de/szut/casino/dice/DiceController.java b/backend/src/main/java/de/szut/casino/dice/DiceController.java index 949a002..1341d96 100644 --- a/backend/src/main/java/de/szut/casino/dice/DiceController.java +++ b/backend/src/main/java/de/szut/casino/dice/DiceController.java @@ -27,13 +27,7 @@ public class DiceController { @PostMapping("/dice") public ResponseEntity rollDice(@RequestBody @Valid DiceDto diceDto) { - Optional optionalUser = userService.getCurrentUser(); - - if (optionalUser.isEmpty()) { - throw new UserNotFoundException(); - } - - UserEntity user = optionalUser.get(); + UserEntity user = userService.getCurrentUser(); if (!this.balanceService.hasFunds(user, diceDto)) { throw new InsufficientFundsException(); diff --git a/backend/src/main/java/de/szut/casino/lootboxes/LootBoxController.java b/backend/src/main/java/de/szut/casino/lootboxes/LootBoxController.java index 5018914..4b7d971 100644 --- a/backend/src/main/java/de/szut/casino/lootboxes/LootBoxController.java +++ b/backend/src/main/java/de/szut/casino/lootboxes/LootBoxController.java @@ -38,13 +38,7 @@ public class LootBoxController { } LootBoxEntity lootBox = optionalLootBox.get(); - - Optional optionalUser = userService.getCurrentUser(); - if (optionalUser.isEmpty()) { - throw new UserNotFoundException(); - } - - UserEntity user = optionalUser.get(); + UserEntity user = userService.getCurrentUser(); if (lootBoxService.hasSufficientBalance(user, lootBox.getPrice())) { throw new InsufficientFundsException(); diff --git a/backend/src/main/java/de/szut/casino/security/AuthController.java b/backend/src/main/java/de/szut/casino/security/AuthController.java index 561fc3c..f0387c7 100644 --- a/backend/src/main/java/de/szut/casino/security/AuthController.java +++ b/backend/src/main/java/de/szut/casino/security/AuthController.java @@ -9,7 +9,6 @@ import de.szut.casino.user.dto.CreateUserDto; import de.szut.casino.user.dto.GetUserDto; import jakarta.mail.MessagingException; import jakarta.validation.Valid; -import org.springframework.beans.factory.annotation.Autowired; import org.springframework.http.ResponseEntity; import org.springframework.web.bind.annotation.*; @@ -20,8 +19,11 @@ import java.io.IOException; public class AuthController { - @Autowired - private AuthService authService; + private final AuthService authService; + + public AuthController(AuthService authService) { + this.authService = authService; + } @PostMapping("/login") public ResponseEntity authenticateUser(@Valid @RequestBody LoginRequestDto loginRequest) throws EmailNotVerifiedException { diff --git a/backend/src/main/java/de/szut/casino/security/SecurityConfig.java b/backend/src/main/java/de/szut/casino/security/SecurityConfig.java index 740739e..9268cf2 100644 --- a/backend/src/main/java/de/szut/casino/security/SecurityConfig.java +++ b/backend/src/main/java/de/szut/casino/security/SecurityConfig.java @@ -1,7 +1,6 @@ package de.szut.casino.security; import de.szut.casino.security.jwt.JwtAuthenticationFilter; -import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Value; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; @@ -32,11 +31,13 @@ public class SecurityConfig { @Value("${app.frontend-host}") private String frontendHost; - @Autowired - private UserDetailsService userDetailsService; + private final UserDetailsService userDetailsService; + private final JwtAuthenticationFilter jwtAuthenticationFilter; - @Autowired - private JwtAuthenticationFilter jwtAuthenticationFilter; + public SecurityConfig(UserDetailsService userDetailsService, JwtAuthenticationFilter jwtAuthenticationFilter) { + this.userDetailsService = userDetailsService; + this.jwtAuthenticationFilter = jwtAuthenticationFilter; + } @Bean diff --git a/backend/src/main/java/de/szut/casino/security/jwt/JwtAuthenticationFilter.java b/backend/src/main/java/de/szut/casino/security/jwt/JwtAuthenticationFilter.java index 38da0b3..4766f4a 100644 --- a/backend/src/main/java/de/szut/casino/security/jwt/JwtAuthenticationFilter.java +++ b/backend/src/main/java/de/szut/casino/security/jwt/JwtAuthenticationFilter.java @@ -4,7 +4,6 @@ import jakarta.servlet.FilterChain; import jakarta.servlet.ServletException; import jakarta.servlet.http.HttpServletRequest; import jakarta.servlet.http.HttpServletResponse; -import org.springframework.beans.factory.annotation.Autowired; import org.springframework.security.authentication.UsernamePasswordAuthenticationToken; import org.springframework.security.core.context.SecurityContextHolder; import org.springframework.security.core.userdetails.UserDetails; @@ -19,11 +18,13 @@ import java.io.IOException; @Component public class JwtAuthenticationFilter extends OncePerRequestFilter { - @Autowired - private JwtUtils jwtUtils; + private final JwtUtils jwtUtils; + private final UserDetailsService userDetailsService; - @Autowired - private UserDetailsService userDetailsService; + public JwtAuthenticationFilter(JwtUtils jwtUtils, UserDetailsService userDetailsService) { + this.jwtUtils = jwtUtils; + this.userDetailsService = userDetailsService; + } @Override protected void doFilterInternal(HttpServletRequest request, HttpServletResponse response, FilterChain filterChain) diff --git a/backend/src/main/java/de/szut/casino/security/oauth2/CustomOAuth2UserService.java b/backend/src/main/java/de/szut/casino/security/oauth2/CustomOAuth2UserService.java index eb09b27..a8bda84 100644 --- a/backend/src/main/java/de/szut/casino/security/oauth2/CustomOAuth2UserService.java +++ b/backend/src/main/java/de/szut/casino/security/oauth2/CustomOAuth2UserService.java @@ -4,7 +4,6 @@ import de.szut.casino.exceptionHandling.exceptions.OAuth2AuthenticationProcessin import de.szut.casino.user.AuthProvider; import de.szut.casino.user.UserEntity; import de.szut.casino.user.UserRepository; -import org.springframework.beans.factory.annotation.Autowired; import org.springframework.security.authentication.InternalAuthenticationServiceException; import org.springframework.security.core.AuthenticationException; import org.springframework.security.crypto.password.PasswordEncoder; @@ -22,11 +21,13 @@ import java.util.UUID; @Service public class CustomOAuth2UserService extends DefaultOAuth2UserService { - @Autowired - private UserRepository userRepository; + private final UserRepository userRepository; + private final PasswordEncoder oauth2PasswordEncoder; - @Autowired - private PasswordEncoder oauth2PasswordEncoder; + public CustomOAuth2UserService(UserRepository userRepository, PasswordEncoder oauth2PasswordEncoder) { + this.userRepository = userRepository; + this.oauth2PasswordEncoder = oauth2PasswordEncoder; + } @Override public OAuth2User loadUser(OAuth2UserRequest oAuth2UserRequest) throws OAuth2AuthenticationException { diff --git a/backend/src/main/java/de/szut/casino/security/oauth2/OAuth2AuthenticationSuccessHandler.java b/backend/src/main/java/de/szut/casino/security/oauth2/OAuth2AuthenticationSuccessHandler.java index 778fa88..75eb6b6 100644 --- a/backend/src/main/java/de/szut/casino/security/oauth2/OAuth2AuthenticationSuccessHandler.java +++ b/backend/src/main/java/de/szut/casino/security/oauth2/OAuth2AuthenticationSuccessHandler.java @@ -5,7 +5,6 @@ import jakarta.servlet.http.HttpServletRequest; import jakarta.servlet.http.HttpServletResponse; import org.slf4j.Logger; import org.slf4j.LoggerFactory; -import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Value; import org.springframework.security.core.Authentication; import org.springframework.security.web.authentication.SimpleUrlAuthenticationSuccessHandler; @@ -21,8 +20,11 @@ public class OAuth2AuthenticationSuccessHandler extends SimpleUrlAuthenticationS @Value("${app.oauth2.authorizedRedirectUris}") private String redirectUri; - @Autowired - private JwtUtils jwtUtils; + private final JwtUtils jwtUtils; + + public OAuth2AuthenticationSuccessHandler(JwtUtils jwtUtils) { + this.jwtUtils = jwtUtils; + } @Override public void onAuthenticationSuccess(HttpServletRequest request, HttpServletResponse response, Authentication authentication) diff --git a/backend/src/main/java/de/szut/casino/security/oauth2/github/GitHubController.java b/backend/src/main/java/de/szut/casino/security/oauth2/github/GitHubController.java index 9abf96c..2fe6279 100644 --- a/backend/src/main/java/de/szut/casino/security/oauth2/github/GitHubController.java +++ b/backend/src/main/java/de/szut/casino/security/oauth2/github/GitHubController.java @@ -3,7 +3,6 @@ package de.szut.casino.security.oauth2.github; import de.szut.casino.security.dto.AuthResponseDto; import org.slf4j.Logger; import org.slf4j.LoggerFactory; -import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Value; import org.springframework.http.ResponseEntity; import org.springframework.web.bind.annotation.*; @@ -23,8 +22,11 @@ public class GitHubController { @Value("${spring.security.oauth2.client.registration.github.redirect-uri}") private String redirectUri; - @Autowired - private GitHubService githubService; + private final GitHubService githubService; + + public GitHubController(GitHubService githubService) { + this.githubService = githubService; + } @GetMapping("/authorize") public RedirectView authorizeGithub() { diff --git a/backend/src/main/java/de/szut/casino/security/oauth2/github/GitHubService.java b/backend/src/main/java/de/szut/casino/security/oauth2/github/GitHubService.java index 4a8df24..3c7d22f 100644 --- a/backend/src/main/java/de/szut/casino/security/oauth2/github/GitHubService.java +++ b/backend/src/main/java/de/szut/casino/security/oauth2/github/GitHubService.java @@ -5,7 +5,6 @@ import de.szut.casino.security.jwt.JwtUtils; import de.szut.casino.user.AuthProvider; import de.szut.casino.user.UserEntity; import de.szut.casino.user.UserRepository; -import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Value; import org.springframework.http.HttpEntity; import org.springframework.http.HttpHeaders; @@ -29,17 +28,17 @@ public class GitHubService { @Value("${spring.security.oauth2.client.registration.github.client-secret}") private String clientSecret; - @Autowired - private AuthenticationManager authenticationManager; + private final AuthenticationManager authenticationManager; + private final UserRepository userRepository; + private final JwtUtils jwtUtils; + private final PasswordEncoder oauth2PasswordEncoder; - @Autowired - private UserRepository userRepository; - - @Autowired - private JwtUtils jwtUtils; - - @Autowired - private PasswordEncoder oauth2PasswordEncoder; + public GitHubService(AuthenticationManager authenticationManager, UserRepository userRepository, JwtUtils jwtUtils, PasswordEncoder oauth2PasswordEncoder) { + this.authenticationManager = authenticationManager; + this.userRepository = userRepository; + this.jwtUtils = jwtUtils; + this.oauth2PasswordEncoder = oauth2PasswordEncoder; + } public AuthResponseDto processGithubCode(String code) { try { diff --git a/backend/src/main/java/de/szut/casino/security/oauth2/google/GoogleController.java b/backend/src/main/java/de/szut/casino/security/oauth2/google/GoogleController.java index 30907f8..9a50f65 100644 --- a/backend/src/main/java/de/szut/casino/security/oauth2/google/GoogleController.java +++ b/backend/src/main/java/de/szut/casino/security/oauth2/google/GoogleController.java @@ -4,7 +4,6 @@ import de.szut.casino.security.dto.AuthResponseDto; import de.szut.casino.security.oauth2.github.GithubCallbackDto; import org.slf4j.Logger; import org.slf4j.LoggerFactory; -import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Value; import org.springframework.http.ResponseEntity; import org.springframework.web.bind.annotation.*; @@ -24,8 +23,11 @@ public class GoogleController { @Value("${spring.security.oauth2.client.registration.google.redirect-uri}") private String redirectUri; - @Autowired - private GoogleService googleService; + private final GoogleService googleService; + + public GoogleController(GoogleService googleService) { + this.googleService = googleService; + } @GetMapping("/authorize") public RedirectView authorizeGoogle() { diff --git a/backend/src/main/java/de/szut/casino/security/oauth2/google/GoogleService.java b/backend/src/main/java/de/szut/casino/security/oauth2/google/GoogleService.java index fd30303..f369052 100644 --- a/backend/src/main/java/de/szut/casino/security/oauth2/google/GoogleService.java +++ b/backend/src/main/java/de/szut/casino/security/oauth2/google/GoogleService.java @@ -7,7 +7,6 @@ import de.szut.casino.user.UserEntity; import de.szut.casino.user.UserRepository; import org.slf4j.Logger; import org.slf4j.LoggerFactory; -import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Value; import org.springframework.http.HttpEntity; import org.springframework.http.HttpHeaders; @@ -23,7 +22,9 @@ import org.springframework.util.MultiValueMap; import org.springframework.web.client.RestTemplate; import java.math.BigDecimal; -import java.util.*; +import java.util.Map; +import java.util.Optional; +import java.util.UUID; @Service public class GoogleService { @@ -44,17 +45,17 @@ public class GoogleService { @Value("${spring.security.oauth2.client.provider.google.user-info-uri}") private String userInfoUri; - @Autowired - private AuthenticationManager authenticationManager; + private final AuthenticationManager authenticationManager; + private final UserRepository userRepository; + private final JwtUtils jwtUtils; + private final PasswordEncoder oauth2PasswordEncoder; - @Autowired - private UserRepository userRepository; - - @Autowired - private JwtUtils jwtUtils; - - @Autowired - private PasswordEncoder oauth2PasswordEncoder; + public GoogleService(AuthenticationManager authenticationManager, UserRepository userRepository, JwtUtils jwtUtils, PasswordEncoder oauth2PasswordEncoder) { + this.authenticationManager = authenticationManager; + this.userRepository = userRepository; + this.jwtUtils = jwtUtils; + this.oauth2PasswordEncoder = oauth2PasswordEncoder; + } public AuthResponseDto processGoogleCode(String code) { try { diff --git a/backend/src/main/java/de/szut/casino/security/service/AuthService.java b/backend/src/main/java/de/szut/casino/security/service/AuthService.java index ffe06ae..734cf9f 100644 --- a/backend/src/main/java/de/szut/casino/security/service/AuthService.java +++ b/backend/src/main/java/de/szut/casino/security/service/AuthService.java @@ -11,7 +11,6 @@ import de.szut.casino.user.dto.CreateUserDto; import de.szut.casino.user.dto.GetUserDto; import jakarta.mail.MessagingException; import org.apache.commons.lang3.RandomStringUtils; -import org.springframework.beans.factory.annotation.Autowired; import org.springframework.security.authentication.AuthenticationManager; import org.springframework.security.authentication.UsernamePasswordAuthenticationToken; import org.springframework.security.core.Authentication; @@ -25,20 +24,19 @@ import java.util.Optional; @Service public class AuthService { - @Autowired - private AuthenticationManager authenticationManager; + private final AuthenticationManager authenticationManager; + private final JwtUtils jwtUtils; + private final UserService userService; + private final EmailService emailService; + private final PasswordEncoder passwordEncoder; - @Autowired - private JwtUtils jwtUtils; - - @Autowired - private UserService userService; - - @Autowired - private EmailService emailService; - - @Autowired - private PasswordEncoder passwordEncoder; + public AuthService(AuthenticationManager authenticationManager, JwtUtils jwtUtils, UserService userService, EmailService emailService, PasswordEncoder passwordEncoder) { + this.authenticationManager = authenticationManager; + this.jwtUtils = jwtUtils; + this.userService = userService; + this.emailService = emailService; + this.passwordEncoder = passwordEncoder; + } public AuthResponseDto login(LoginRequestDto loginRequest) throws EmailNotVerifiedException { if (!userService.isVerified(loginRequest.getUsernameOrEmail())) { diff --git a/backend/src/main/java/de/szut/casino/security/service/UserDetailsServiceImpl.java b/backend/src/main/java/de/szut/casino/security/service/UserDetailsServiceImpl.java index 8d4018b..2b710fc 100644 --- a/backend/src/main/java/de/szut/casino/security/service/UserDetailsServiceImpl.java +++ b/backend/src/main/java/de/szut/casino/security/service/UserDetailsServiceImpl.java @@ -2,7 +2,6 @@ package de.szut.casino.security.service; import de.szut.casino.user.UserEntity; import de.szut.casino.user.UserRepository; -import org.springframework.beans.factory.annotation.Autowired; import org.springframework.security.core.userdetails.UserDetails; import org.springframework.security.core.userdetails.UserDetailsService; import org.springframework.security.core.userdetails.UsernameNotFoundException; @@ -14,8 +13,11 @@ import java.util.Optional; @Service public class UserDetailsServiceImpl implements UserDetailsService { - @Autowired - private UserRepository userRepository; + private final UserRepository userRepository; + + public UserDetailsServiceImpl(UserRepository userRepository) { + this.userRepository = userRepository; + } @Override public UserDetails loadUserByUsername(String usernameOrEmail) throws UsernameNotFoundException { diff --git a/backend/src/main/java/de/szut/casino/slots/SlotController.java b/backend/src/main/java/de/szut/casino/slots/SlotController.java index b55e2b7..ff29d3d 100644 --- a/backend/src/main/java/de/szut/casino/slots/SlotController.java +++ b/backend/src/main/java/de/szut/casino/slots/SlotController.java @@ -32,13 +32,7 @@ public class SlotController { @PostMapping("/slots/spin") public ResponseEntity spinSlots(@RequestBody @Valid BetDto betDto) { - Optional optionalUser = userService.getCurrentUser(); - - if (optionalUser.isEmpty()) { - throw new UserNotFoundException(); - } - - UserEntity user = optionalUser.get(); + UserEntity user = userService.getCurrentUser(); if (!this.balanceService.hasFunds(user, betDto)) { throw new InsufficientFundsException(); diff --git a/backend/src/main/java/de/szut/casino/user/UserController.java b/backend/src/main/java/de/szut/casino/user/UserController.java index 6255a03..f08721d 100644 --- a/backend/src/main/java/de/szut/casino/user/UserController.java +++ b/backend/src/main/java/de/szut/casino/user/UserController.java @@ -2,7 +2,6 @@ package de.szut.casino.user; import de.szut.casino.user.dto.GetUserDto; import lombok.extern.slf4j.Slf4j; -import org.springframework.beans.factory.annotation.Autowired; import org.springframework.http.ResponseEntity; import org.springframework.web.bind.annotation.CrossOrigin; import org.springframework.web.bind.annotation.GetMapping; @@ -15,14 +14,17 @@ import org.springframework.web.bind.annotation.RestController; @RequestMapping("/users") public class UserController { - @Autowired - private UserService userService; + private final UserService userService; - @Autowired - private UserMappingService userMappingService; + private final UserMappingService userMappingService; + + public UserController(UserService userService, UserMappingService userMappingService) { + this.userService = userService; + this.userMappingService = userMappingService; + } @GetMapping("/me") public ResponseEntity getCurrentUser() { - return ResponseEntity.ok(userMappingService.mapToGetUserDto(userService.getCurrentUser().orElseThrow())); + return ResponseEntity.ok(userMappingService.mapToGetUserDto(userService.getCurrentUser())); } } diff --git a/backend/src/main/java/de/szut/casino/user/UserService.java b/backend/src/main/java/de/szut/casino/user/UserService.java index 03ad02d..341db86 100644 --- a/backend/src/main/java/de/szut/casino/user/UserService.java +++ b/backend/src/main/java/de/szut/casino/user/UserService.java @@ -1,9 +1,9 @@ package de.szut.casino.user; +import de.szut.casino.exceptionHandling.exceptions.UserNotFoundException; import de.szut.casino.user.dto.CreateUserDto; import jakarta.persistence.EntityExistsException; import org.apache.commons.lang3.RandomStringUtils; -import org.springframework.beans.factory.annotation.Autowired; import org.springframework.security.core.context.SecurityContextHolder; import org.springframework.security.crypto.password.PasswordEncoder; import org.springframework.stereotype.Service; @@ -13,11 +13,13 @@ import java.util.Optional; @Service public class UserService { - @Autowired - private UserRepository userRepository; + private final UserRepository userRepository; + private final PasswordEncoder passwordEncoder; - @Autowired - private PasswordEncoder passwordEncoder; + public UserService(UserRepository userRepository, PasswordEncoder passwordEncoder) { + this.userRepository = userRepository; + this.passwordEncoder = passwordEncoder; + } public UserEntity createUser(CreateUserDto createUserDto) { if (userRepository.existsByUsername(createUserDto.getUsername())) { @@ -39,10 +41,15 @@ public class UserService { return userRepository.save(user); } - public Optional getCurrentUser() { + public UserEntity getCurrentUser() { String username = SecurityContextHolder.getContext().getAuthentication().getName(); - return userRepository.findByUsername(username); + Optional optionalUser = userRepository.findByUsername(username); + if (optionalUser.isEmpty()) { + throw new UserNotFoundException(); + } + + return optionalUser.get(); } public Optional getUserByVerificationToken(String token) { diff --git a/backend/src/main/java/de/szut/casino/user/transaction/GetTransactionService.java b/backend/src/main/java/de/szut/casino/user/transaction/GetTransactionService.java index 2a8350f..11fff4f 100644 --- a/backend/src/main/java/de/szut/casino/user/transaction/GetTransactionService.java +++ b/backend/src/main/java/de/szut/casino/user/transaction/GetTransactionService.java @@ -6,31 +6,29 @@ import de.szut.casino.user.UserEntity; import de.szut.casino.user.UserService; import de.szut.casino.user.transaction.dto.GetTransactionDto; import de.szut.casino.user.transaction.dto.UserTransactionsDto; -import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import java.util.List; -import java.util.Optional; @Service public class GetTransactionService { - @Autowired - private UserService userService; + private final UserService userService; - @Autowired - private TransactionRepository transactionRepository; + private final TransactionRepository transactionRepository; - public UserTransactionsDto getUserTransactionsDto(String authToken, Integer limit, Integer offset) { - Optional user = this.userService.getCurrentUser(); - if (user.isPresent()) { - List transactionEntities = this.transactionRepository.findByUserIdWithLimit(user.get(), limit, offset); - Boolean hasMore = this.transactionRepository.hasMore(user.get(), limit, offset); + public GetTransactionService(UserService userService, TransactionRepository transactionRepository) { + this.userService = userService; + this.transactionRepository = transactionRepository; + } - return new UserTransactionsDto(mapTransactionsToDtos(transactionEntities), hasMore); - } + public UserTransactionsDto getUserTransactionsDto(Integer limit, Integer offset) { + UserEntity user = userService.getCurrentUser(); - return new UserTransactionsDto(List.of(), false); + List transactionEntities = this.transactionRepository.findByUserIdWithLimit(user, limit, offset); + Boolean hasMore = this.transactionRepository.hasMore(user, limit, offset); + + return new UserTransactionsDto(mapTransactionsToDtos(transactionEntities), hasMore); } public List mapTransactionsToDtos(List transactions) { diff --git a/backend/src/main/java/de/szut/casino/user/transaction/TransactionController.java b/backend/src/main/java/de/szut/casino/user/transaction/TransactionController.java index 8aa74a6..f8a57de 100644 --- a/backend/src/main/java/de/szut/casino/user/transaction/TransactionController.java +++ b/backend/src/main/java/de/szut/casino/user/transaction/TransactionController.java @@ -1,26 +1,26 @@ package de.szut.casino.user.transaction; import de.szut.casino.user.transaction.dto.UserTransactionsDto; -import org.springframework.beans.factory.annotation.Autowired; import org.springframework.http.ResponseEntity; import org.springframework.web.bind.annotation.GetMapping; -import org.springframework.web.bind.annotation.RequestHeader; import org.springframework.web.bind.annotation.RequestParam; import org.springframework.web.bind.annotation.RestController; @RestController public class TransactionController { - @Autowired - private GetTransactionService transactionService; + private final GetTransactionService transactionService; + + public TransactionController(GetTransactionService transactionService) { + this.transactionService = transactionService; + } @GetMapping("/user/transactions") public ResponseEntity getUserTransactions( - @RequestHeader("Authorization") String authToken, @RequestParam(value = "limit", required = false) Integer limit, @RequestParam(value = "offset", required = false) Integer offset ) { - UserTransactionsDto transactionEntities = this.transactionService.getUserTransactionsDto(authToken, limit, offset); + UserTransactionsDto transactionEntities = this.transactionService.getUserTransactionsDto(limit, offset); return ResponseEntity.ok(transactionEntities); } From 92af3076b50e642cc0668ad8fed117f7afcb363d Mon Sep 17 00:00:00 2001 From: jank Date: Wed, 28 May 2025 10:47:57 +0200 Subject: [PATCH 3/3] fix: Fix claude maybe --- .gitea/workflows/claude.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.gitea/workflows/claude.yml b/.gitea/workflows/claude.yml index 25715b2..7bc0ffd 100644 --- a/.gitea/workflows/claude.yml +++ b/.gitea/workflows/claude.yml @@ -59,7 +59,7 @@ jobs: Only provide constructive feedback on the quality, correctness, readability, and potential issues in the code. Do not make any changes or suggest complete rewrites—just review what is there. - Once you are done with your review, post your feedback as a comment on the pull request using the following exact format: + Once you are done with your review, post your feedback as a reject or review on the pull request using the following exact format: tea \"\" ${PR_NUMBER} \"\"