From b90e72edd1b6596effcf1ca7075e9d7d4d38072a Mon Sep 17 00:00:00 2001 From: Jakub Praszkowski Date: Thu, 12 Feb 2026 21:07:56 +0100 Subject: [PATCH 1/3] CI/CD init --- .github/workflows/ci-build-test.yml | 32 +++++++++++++++++++++++++++++ 1 file changed, 32 insertions(+) create mode 100644 .github/workflows/ci-build-test.yml diff --git a/.github/workflows/ci-build-test.yml b/.github/workflows/ci-build-test.yml new file mode 100644 index 0000000..ba3859b --- /dev/null +++ b/.github/workflows/ci-build-test.yml @@ -0,0 +1,32 @@ +name: CI Build & Test + +on: + push: + branches: [ "main" ] + pull_request: + +jobs: + build-test: + runs-on: ubuntu-latest + + steps: + - name: Checkout + uses: actions/checkout@v4 + + - name: Set up JDK 17 + uses: actions/setup-java@v3 + with: + java-version: '17' + distribution: 'temurin' + + - name: Cache Maven + uses: actions/cache@v3 + with: + path: ~/.m2 + key: maven-${{ hashFiles('**/pom.xml') }} + + - name: Build & Test + run: mvn clean test -B + + - name: Package (skip tests) + run: mvn package -DskipTests -B From 520d5aef66750dbc6d4ef094672fc4393f63694b Mon Sep 17 00:00:00 2001 From: Jakub Praszkowski Date: Thu, 12 Feb 2026 22:51:24 +0100 Subject: [PATCH 2/3] Checker fix --- .../urlshortener/config/SecurityConfig.java | 3 ++- .../service/AuthenticationService.java | 23 ++++++++++++------- .../urlshortener/service/JwtService.java | 4 +++- 3 files changed, 20 insertions(+), 10 deletions(-) diff --git a/src/main/java/com/kubuski/urlshortener/config/SecurityConfig.java b/src/main/java/com/kubuski/urlshortener/config/SecurityConfig.java index d53b5f6..a8f551d 100644 --- a/src/main/java/com/kubuski/urlshortener/config/SecurityConfig.java +++ b/src/main/java/com/kubuski/urlshortener/config/SecurityConfig.java @@ -45,7 +45,8 @@ public SecurityFilterChain securityFilterChain(HttpSecurity httpSecurity) throws httpSecurity .csrf(AbstractHttpConfigurer::disable) .authorizeHttpRequests(auth -> auth - .requestMatchers(SHORTEN_PERMIT_PATHS).hasAnyRole(String.valueOf(Roles.USER), String.valueOf(Roles.ADMIN)) + .requestMatchers(SHORTEN_PERMIT_PATHS) + .hasAnyRole(String.valueOf(Roles.USER), String.valueOf(Roles.ADMIN)) .requestMatchers(SWAGGER_UI_PATHS).permitAll() .requestMatchers(USER_PERMIT_PATHS).hasRole(String.valueOf(Roles.ADMIN)) .requestMatchers(URL_PERMIT_PATHS).hasRole(String.valueOf(Roles.USER)) diff --git a/src/main/java/com/kubuski/urlshortener/service/AuthenticationService.java b/src/main/java/com/kubuski/urlshortener/service/AuthenticationService.java index ed42e5c..228af43 100644 --- a/src/main/java/com/kubuski/urlshortener/service/AuthenticationService.java +++ b/src/main/java/com/kubuski/urlshortener/service/AuthenticationService.java @@ -1,18 +1,18 @@ package com.kubuski.urlshortener.service; +import com.kubuski.urlshortener.dto.AuthenticationRequest; +import com.kubuski.urlshortener.dto.AuthenticationResponse; +import com.kubuski.urlshortener.dto.RegisterRequest; +import com.kubuski.urlshortener.entity.User; import com.kubuski.urlshortener.exception.UserAlreadyExistsException; +import com.kubuski.urlshortener.repository.UserRepository; +import lombok.RequiredArgsConstructor; import org.springframework.security.authentication.AuthenticationManager; import org.springframework.security.authentication.UsernamePasswordAuthenticationToken; import org.springframework.security.core.userdetails.UsernameNotFoundException; import org.springframework.security.crypto.password.PasswordEncoder; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; -import com.kubuski.urlshortener.dto.AuthenticationRequest; -import com.kubuski.urlshortener.dto.AuthenticationResponse; -import com.kubuski.urlshortener.dto.RegisterRequest; -import com.kubuski.urlshortener.entity.User; -import com.kubuski.urlshortener.repository.UserRepository; -import lombok.RequiredArgsConstructor; @Service @RequiredArgsConstructor @@ -60,8 +60,15 @@ private User findUserByLogin(String login) { } private void checkIfUserExists(String email, String username) { - if (userRepository.findByEmailOrUsername(email).isPresent() || userRepository.findByEmailOrUsername(username).isPresent()) { - throw new UserAlreadyExistsException("User with email " + email + " or username " + username + " already exists"); + if (userExists(email, username)) { + throw new UserAlreadyExistsException( + "User with email " + email + " or username " + username + " already exists" + ); } } + + private boolean userExists(String email, String username) { + return userRepository.findByEmailOrUsername(email).isPresent() + || userRepository.findByEmailOrUsername(username).isPresent(); + } } diff --git a/src/main/java/com/kubuski/urlshortener/service/JwtService.java b/src/main/java/com/kubuski/urlshortener/service/JwtService.java index 840ebcd..5f95999 100644 --- a/src/main/java/com/kubuski/urlshortener/service/JwtService.java +++ b/src/main/java/com/kubuski/urlshortener/service/JwtService.java @@ -41,7 +41,9 @@ public boolean isTokenValid(String token, User userDetails) { String subjectUsername = extractSubject(token); String email = extractEmail(token); - return email.equals(userDetails.getEmail()) && subjectUsername.equals(userDetails.getUsername()) && !isTokenExpired(token); + return email.equals(userDetails.getEmail()) && + subjectUsername.equals(userDetails.getUsername()) && + !isTokenExpired(token); } public String generateToken(User userDetails) { From f82401424d20c38a2576147c7ce5b8008e7bc967 Mon Sep 17 00:00:00 2001 From: Jakub Praszkowski Date: Thu, 12 Feb 2026 22:54:51 +0100 Subject: [PATCH 3/3] Checker fix --- .../java/com/kubuski/urlshortener/service/JwtService.java | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/main/java/com/kubuski/urlshortener/service/JwtService.java b/src/main/java/com/kubuski/urlshortener/service/JwtService.java index 5f95999..c2b417c 100644 --- a/src/main/java/com/kubuski/urlshortener/service/JwtService.java +++ b/src/main/java/com/kubuski/urlshortener/service/JwtService.java @@ -41,9 +41,9 @@ public boolean isTokenValid(String token, User userDetails) { String subjectUsername = extractSubject(token); String email = extractEmail(token); - return email.equals(userDetails.getEmail()) && - subjectUsername.equals(userDetails.getUsername()) && - !isTokenExpired(token); + return email.equals(userDetails.getEmail()) + && subjectUsername.equals(userDetails.getUsername()) + && !isTokenExpired(token); } public String generateToken(User userDetails) {