From fd390ac0729cba8e630c1f64c33d45236b50a6a6 Mon Sep 17 00:00:00 2001 From: Lobo Date: Sun, 19 Apr 2026 12:50:01 +0200 Subject: [PATCH] Refactor package structure: domain -> modules Move domain packages into a new modules.* hierarchy and rename controller packages to api.* across login, registration, and user modules. Update package declarations and imports (including shared.api DTOs and JwtService -> modules login TokenGenerator), adjust tests and persistence/mapper paths accordingly, and apply minor formatting fixes (missing EOF newlines). This reorganizes the project to better separate API surface and module boundaries. --- readme.md | 8 +- .../auth_service/AuthServiceApplication.java | 2 +- .../configuration/AsyncConfig.java | 2 +- .../configuration/CacheConfig.java | 2 +- .../configuration/DevCacheConfig.java | 2 +- .../configuration/ObservabilityConfig.java | 2 +- .../security/JwtAuthenticationFilter.java | 2 +- .../configuration/security/JwtConfig.java | 2 +- .../configuration/security/JwtService.java | 4 +- .../security/SecurityConfig.java | 2 +- .../login/api}/LoginController.java | 14 +- .../login/api}/LoginExceptionController.java | 10 +- .../login/api}/dto/request/LoginRequest.java | 4 +- .../api}/dto/response/LoginResponse.java | 4 +- .../login/api}/mapper/ApiMapper.java | 8 +- .../InvalidCredentialsException.java | 4 +- .../exception/UserNotFoundException.java | 4 +- .../{domain => modules}/login/model/User.java | 4 +- .../persistence/MinimalUserRepository.java | 6 +- .../MinimalUserRepositoryImpl.java | 10 +- .../entities/MinimalUserEntity.java | 4 +- .../persistence/mapper/EntityMapper.java | 8 +- .../login/service/LoginService.java | 12 +- .../login/service/TokenGenerator.java | 3 +- .../api}/RegistrationController.java | 12 +- .../api}/RegistrationExceptionController.java | 12 +- .../api}/dto/mapper/ApiMapper.java | 8 +- .../api}/dto/request/RegistrationRequest.java | 4 +- .../dto/response/RegistrationResponse.java | 4 +- .../exception/EmailAlreadyInUseException.java | 4 +- .../InvalidInvitationCodeException.java | 4 +- .../SteamIdAlreadyRegisteredException.java | 4 +- .../registration/model/Registration.java | 4 +- .../persistence/RegisteredUserRepository.java | 6 +- .../RegisteredUserRepositoryImpl.java | 8 +- .../entities/RegisteredUserEntity.java | 4 +- .../persistence/mapper/EntityMapper.java | 8 +- .../service/CodeValidationService.java | 4 +- .../service/RegistrationService.java | 14 +- .../user/api}/UserController.java | 14 +- .../user/api}/UserExceptionController.java | 8 +- .../api}/dto/request/UserSettingsRequest.java | 4 +- .../api}/dto/response/SettingsResponse.java | 4 +- .../dto/response/UserProfileResponse.java | 4 +- .../user/api}/mapper/ApiMapper.java | 14 +- .../user/exception/UserNotFoundException.java | 4 +- .../{domain => modules}/user/model/User.java | 4 +- .../user/model/UserSettings.java | 4 +- .../user/persistence/UserRepository.java | 8 +- .../user/persistence/UserRepositoryImpl.java | 14 +- .../user/persistence/entities/UserEntity.java | 4 +- .../entities/UserSettingsEntity.java | 4 +- .../user/persistence/mapper/EntityMapper.java | 12 +- .../user/service/UserService.java | 12 +- .../dto/response/ErrorResponse.java | 5 +- .../shared/security/UserPrincipal.java | 2 +- .../AuthServiceApplicationTests.java | 2 +- .../architecture/ArchitectureTest.java | 60 ++--- .../security/JwtServiceTest.java | 2 +- .../login/api}/LoginControllerTest.java | 144 +++++------ .../MinimalUserRepositoryTest.java | 6 +- .../login/service/LoginServiceTest.java | 176 +++++++------- .../api}/RegistrationControllerTest.java | 12 +- .../RegisteredUserRepositoryTest.java | 8 +- .../service/RegistrationServiceTest.java | 14 +- .../user/api}/UserControllerTest.java | 226 +++++++++--------- .../user/persistence/UserRepositoryTest.java | 8 +- .../user/service/UserServiceTest.java | 134 +++++------ .../shared/test/AbstractArchitectureTest.java | 1 + .../shared/test/AbstractIntegrationTest.java | 1 + .../shared/test/AbstractPersistenceTest.java | 2 +- .../shared/test/AbstractUnitTest.java | 1 + .../shared/test/AbstractWebMvcTest.java | 2 +- 73 files changed, 574 insertions(+), 569 deletions(-) rename src/main/java/auth_service/{domain/login/controller => modules/login/api}/LoginController.java (75%) rename src/main/java/auth_service/{domain/login/controller => modules/login/api}/LoginExceptionController.java (84%) rename src/main/java/auth_service/{domain/login/controller => modules/login/api}/dto/request/LoginRequest.java (81%) rename src/main/java/auth_service/{domain/login/controller => modules/login/api}/dto/response/LoginResponse.java (73%) rename src/main/java/auth_service/{domain/login/controller => modules/login/api}/mapper/ApiMapper.java (58%) rename src/main/java/auth_service/{domain => modules}/login/exception/InvalidCredentialsException.java (76%) rename src/main/java/auth_service/{domain => modules}/login/exception/UserNotFoundException.java (75%) rename src/main/java/auth_service/{domain => modules}/login/model/User.java (78%) rename src/main/java/auth_service/{domain => modules}/login/persistence/MinimalUserRepository.java (80%) rename src/main/java/auth_service/{domain => modules}/login/persistence/MinimalUserRepositoryImpl.java (86%) rename src/main/java/auth_service/{domain => modules}/login/persistence/entities/MinimalUserEntity.java (91%) rename src/main/java/auth_service/{domain => modules}/login/persistence/mapper/EntityMapper.java (69%) rename src/main/java/auth_service/{domain => modules}/login/service/LoginService.java (79%) rename src/main/java/auth_service/{domain => modules}/login/service/TokenGenerator.java (90%) rename src/main/java/auth_service/{domain/registration/controller => modules/registration/api}/RegistrationController.java (74%) rename src/main/java/auth_service/{domain/registration/controller => modules/registration/api}/RegistrationExceptionController.java (81%) rename src/main/java/auth_service/{domain/registration/controller => modules/registration/api}/dto/mapper/ApiMapper.java (68%) rename src/main/java/auth_service/{domain/registration/controller => modules/registration/api}/dto/request/RegistrationRequest.java (67%) rename src/main/java/auth_service/{domain/registration/controller => modules/registration/api}/dto/response/RegistrationResponse.java (55%) rename src/main/java/auth_service/{domain => modules}/registration/exception/EmailAlreadyInUseException.java (73%) rename src/main/java/auth_service/{domain => modules}/registration/exception/InvalidInvitationCodeException.java (74%) rename src/main/java/auth_service/{domain => modules}/registration/exception/SteamIdAlreadyRegisteredException.java (75%) rename src/main/java/auth_service/{domain => modules}/registration/model/Registration.java (82%) rename src/main/java/auth_service/{domain => modules}/registration/persistence/RegisteredUserRepository.java (59%) rename src/main/java/auth_service/{domain => modules}/registration/persistence/RegisteredUserRepositoryImpl.java (87%) rename src/main/java/auth_service/{domain => modules}/registration/persistence/entities/RegisteredUserEntity.java (92%) rename src/main/java/auth_service/{domain => modules}/registration/persistence/mapper/EntityMapper.java (73%) rename src/main/java/auth_service/{domain => modules}/registration/service/CodeValidationService.java (88%) rename src/main/java/auth_service/{domain => modules}/registration/service/RegistrationService.java (73%) rename src/main/java/auth_service/{domain/user/controller => modules/user/api}/UserController.java (82%) rename src/main/java/auth_service/{domain/user/controller => modules/user/api}/UserExceptionController.java (85%) rename src/main/java/auth_service/{domain/user/controller => modules/user/api}/dto/request/UserSettingsRequest.java (60%) rename src/main/java/auth_service/{domain/user/controller => modules/user/api}/dto/response/SettingsResponse.java (66%) rename src/main/java/auth_service/{domain/user/controller => modules/user/api}/dto/response/UserProfileResponse.java (79%) rename src/main/java/auth_service/{domain/user/controller => modules/user/api}/mapper/ApiMapper.java (72%) rename src/main/java/auth_service/{domain => modules}/user/exception/UserNotFoundException.java (75%) rename src/main/java/auth_service/{domain => modules}/user/model/User.java (88%) rename src/main/java/auth_service/{domain => modules}/user/model/UserSettings.java (76%) rename src/main/java/auth_service/{domain => modules}/user/persistence/UserRepository.java (80%) rename src/main/java/auth_service/{domain => modules}/user/persistence/UserRepositoryImpl.java (88%) rename src/main/java/auth_service/{domain => modules}/user/persistence/entities/UserEntity.java (94%) rename src/main/java/auth_service/{domain => modules}/user/persistence/entities/UserSettingsEntity.java (90%) rename src/main/java/auth_service/{domain => modules}/user/persistence/mapper/EntityMapper.java (84%) rename src/main/java/auth_service/{domain => modules}/user/service/UserService.java (82%) rename src/main/java/auth_service/shared/{controller => api}/dto/response/ErrorResponse.java (69%) rename src/test/java/auth_service/{domain/login/controller => modules/login/api}/LoginControllerTest.java (88%) rename src/test/java/auth_service/{domain => modules}/login/persistence/MinimalUserRepositoryTest.java (93%) rename src/test/java/auth_service/{domain => modules}/login/service/LoginServiceTest.java (86%) rename src/test/java/auth_service/{domain/registration/controller => modules/registration/api}/RegistrationControllerTest.java (91%) rename src/test/java/auth_service/{domain => modules}/registration/persistence/RegisteredUserRepositoryTest.java (92%) rename src/test/java/auth_service/{domain => modules}/registration/service/RegistrationServiceTest.java (89%) rename src/test/java/auth_service/{domain/user/controller => modules/user/api}/UserControllerTest.java (90%) rename src/test/java/auth_service/{domain => modules}/user/persistence/UserRepositoryTest.java (93%) rename src/test/java/auth_service/{domain => modules}/user/service/UserServiceTest.java (83%) diff --git a/readme.md b/readme.md index f8c6c8c..6a33bc3 100644 --- a/readme.md +++ b/readme.md @@ -19,20 +19,20 @@ The project strictly follows a Domain-Driven / Clean Architecture (Ports & Adapt ### Layer Breakdown -1. **Controller / Web Layer (`controller`)** +1. **API / Web Layer (`api`)** * Contains REST endpoints, DTOs (`Request`/`Response` records), and Global Exception Handlers. * Uses `ApiMapper` to map between DTOs and Domain Models. * **Rule:** This layer delegates to the Service layer and never accesses persistence directly. -2. **Domain / Core Layer (`model`, `service`, `exception`)** +2. **Business / Core Layer (`model`, `service`, `exception`)** * The heart of the application. Contains pure Java classes (Models) and Business Logic (Services). * Throws specific business exceptions (e.g., `InvalidCredentialsException`). - * **Rule:** This layer has **no dependencies** on the Controller or Persistence layer. It defines interfaces that the persistence layer must implement. + * **Rule:** This layer has **no dependencies** on the API or Persistence layer. It defines interfaces that the persistence layer must implement. 3. **Persistence Layer (`persistence`)** * Handles database operations. Contains JPA Entities (`UserEntity`), Spring Data Repositories, and the `EntityMapper`. * Implements the interfaces defined in the Domain layer. - * **Rule:** Entities never leak into the Controller layer. + * **Rule:** Entities never leak into the API layer. *Note: Future implementations will include ArchUnit tests to automatically enforce these architectural boundaries during the CI pipeline.* diff --git a/src/main/java/auth_service/AuthServiceApplication.java b/src/main/java/auth_service/AuthServiceApplication.java index 0914914..2d0b455 100644 --- a/src/main/java/auth_service/AuthServiceApplication.java +++ b/src/main/java/auth_service/AuthServiceApplication.java @@ -8,4 +8,4 @@ public class AuthServiceApplication { static void main(String[] args) { SpringApplication.run(AuthServiceApplication.class, args); } -} \ No newline at end of file +} diff --git a/src/main/java/auth_service/configuration/AsyncConfig.java b/src/main/java/auth_service/configuration/AsyncConfig.java index 314bbd0..1b160d7 100644 --- a/src/main/java/auth_service/configuration/AsyncConfig.java +++ b/src/main/java/auth_service/configuration/AsyncConfig.java @@ -7,4 +7,4 @@ import org.springframework.scheduling.annotation.EnableAsync; @EnableAsync public class AsyncConfig { // This class enables Spring's @Async annotation functionality globally -} \ No newline at end of file +} diff --git a/src/main/java/auth_service/configuration/CacheConfig.java b/src/main/java/auth_service/configuration/CacheConfig.java index eb43847..6e99f1a 100644 --- a/src/main/java/auth_service/configuration/CacheConfig.java +++ b/src/main/java/auth_service/configuration/CacheConfig.java @@ -34,4 +34,4 @@ public class CacheConfig { .expireAfterAccess(10, TimeUnit.MINUTES) .recordStats(); } -} \ No newline at end of file +} diff --git a/src/main/java/auth_service/configuration/DevCacheConfig.java b/src/main/java/auth_service/configuration/DevCacheConfig.java index a20aff0..77467fe 100644 --- a/src/main/java/auth_service/configuration/DevCacheConfig.java +++ b/src/main/java/auth_service/configuration/DevCacheConfig.java @@ -34,4 +34,4 @@ public class DevCacheConfig { .expireAfterAccess(1, TimeUnit.SECONDS) .recordStats(); } -} \ No newline at end of file +} diff --git a/src/main/java/auth_service/configuration/ObservabilityConfig.java b/src/main/java/auth_service/configuration/ObservabilityConfig.java index a7b6701..ac60e1a 100644 --- a/src/main/java/auth_service/configuration/ObservabilityConfig.java +++ b/src/main/java/auth_service/configuration/ObservabilityConfig.java @@ -21,4 +21,4 @@ public class ObservabilityConfig { public TimedAspect timedAspect(MeterRegistry registry) { return new TimedAspect(registry); } -} \ No newline at end of file +} diff --git a/src/main/java/auth_service/configuration/security/JwtAuthenticationFilter.java b/src/main/java/auth_service/configuration/security/JwtAuthenticationFilter.java index 6c84ee3..798ce60 100644 --- a/src/main/java/auth_service/configuration/security/JwtAuthenticationFilter.java +++ b/src/main/java/auth_service/configuration/security/JwtAuthenticationFilter.java @@ -65,4 +65,4 @@ public class JwtAuthenticationFilter extends OncePerRequestFilter { filterChain.doFilter(request, response); } -} \ No newline at end of file +} diff --git a/src/main/java/auth_service/configuration/security/JwtConfig.java b/src/main/java/auth_service/configuration/security/JwtConfig.java index b97de6d..bc06879 100644 --- a/src/main/java/auth_service/configuration/security/JwtConfig.java +++ b/src/main/java/auth_service/configuration/security/JwtConfig.java @@ -12,4 +12,4 @@ import org.springframework.context.annotation.Configuration; public class JwtConfig { private String secret; -} \ No newline at end of file +} diff --git a/src/main/java/auth_service/configuration/security/JwtService.java b/src/main/java/auth_service/configuration/security/JwtService.java index 25e5580..ac2c9f9 100644 --- a/src/main/java/auth_service/configuration/security/JwtService.java +++ b/src/main/java/auth_service/configuration/security/JwtService.java @@ -1,6 +1,6 @@ package auth_service.configuration.security; -import auth_service.domain.login.service.TokenGenerator; +import auth_service.modules.login.service.TokenGenerator; import io.jsonwebtoken.Jwts; import io.jsonwebtoken.security.Keys; import org.springframework.stereotype.Service; @@ -77,4 +77,4 @@ public class JwtService implements TokenGenerator { byte[] keyBytes = secretKey.getBytes(StandardCharsets.UTF_8); return Keys.hmacShaKeyFor(keyBytes); } -} \ No newline at end of file +} diff --git a/src/main/java/auth_service/configuration/security/SecurityConfig.java b/src/main/java/auth_service/configuration/security/SecurityConfig.java index 18de67b..d619e98 100644 --- a/src/main/java/auth_service/configuration/security/SecurityConfig.java +++ b/src/main/java/auth_service/configuration/security/SecurityConfig.java @@ -91,4 +91,4 @@ public class SecurityConfig { return http.build(); } -} \ No newline at end of file +} diff --git a/src/main/java/auth_service/domain/login/controller/LoginController.java b/src/main/java/auth_service/modules/login/api/LoginController.java similarity index 75% rename from src/main/java/auth_service/domain/login/controller/LoginController.java rename to src/main/java/auth_service/modules/login/api/LoginController.java index 840eb29..2b0ecde 100644 --- a/src/main/java/auth_service/domain/login/controller/LoginController.java +++ b/src/main/java/auth_service/modules/login/api/LoginController.java @@ -1,9 +1,9 @@ -package auth_service.domain.login.controller; +package auth_service.modules.login.api; -import auth_service.domain.login.controller.dto.request.LoginRequest; -import auth_service.domain.login.controller.dto.response.LoginResponse; -import auth_service.domain.login.controller.mapper.ApiMapper; -import auth_service.domain.login.service.LoginService; +import auth_service.modules.login.api.dto.request.LoginRequest; +import auth_service.modules.login.api.dto.response.LoginResponse; +import auth_service.modules.login.api.mapper.ApiMapper; +import auth_service.modules.login.service.LoginService; import io.micrometer.core.annotation.Timed; import lombok.RequiredArgsConstructor; import org.springframework.http.ResponseEntity; @@ -13,7 +13,7 @@ import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; /** - * Controller handling authentication requests. + * API handling authentication requests. */ @RestController @RequestMapping("/api/auth") @@ -36,4 +36,4 @@ public class LoginController { var token = loginService.login(user); return ResponseEntity.ok(new LoginResponse("Login successful", token)); } -} \ No newline at end of file +} diff --git a/src/main/java/auth_service/domain/login/controller/LoginExceptionController.java b/src/main/java/auth_service/modules/login/api/LoginExceptionController.java similarity index 84% rename from src/main/java/auth_service/domain/login/controller/LoginExceptionController.java rename to src/main/java/auth_service/modules/login/api/LoginExceptionController.java index a5adf9b..edd0d5f 100644 --- a/src/main/java/auth_service/domain/login/controller/LoginExceptionController.java +++ b/src/main/java/auth_service/modules/login/api/LoginExceptionController.java @@ -1,8 +1,8 @@ -package auth_service.domain.login.controller; +package auth_service.modules.login.api; -import auth_service.shared.controller.dto.response.ErrorResponse; -import auth_service.domain.login.exception.InvalidCredentialsException; -import auth_service.domain.login.exception.UserNotFoundException; +import auth_service.shared.api.dto.response.ErrorResponse; +import auth_service.modules.login.exception.InvalidCredentialsException; +import auth_service.modules.login.exception.UserNotFoundException; import lombok.NonNull; import lombok.extern.slf4j.Slf4j; import org.springframework.core.annotation.Order; @@ -39,4 +39,4 @@ public class LoginExceptionController { var body = new ErrorResponse("INVALID_CREDENTIALS", ex.getMessage()); return response(body, HttpStatus.UNAUTHORIZED); } -} \ No newline at end of file +} diff --git a/src/main/java/auth_service/domain/login/controller/dto/request/LoginRequest.java b/src/main/java/auth_service/modules/login/api/dto/request/LoginRequest.java similarity index 81% rename from src/main/java/auth_service/domain/login/controller/dto/request/LoginRequest.java rename to src/main/java/auth_service/modules/login/api/dto/request/LoginRequest.java index 3826aa0..d4c829d 100644 --- a/src/main/java/auth_service/domain/login/controller/dto/request/LoginRequest.java +++ b/src/main/java/auth_service/modules/login/api/dto/request/LoginRequest.java @@ -1,4 +1,4 @@ -package auth_service.domain.login.controller.dto.request; +package auth_service.modules.login.api.dto.request; import jakarta.validation.constraints.NotBlank; import jakarta.validation.constraints.NotNull; @@ -7,4 +7,4 @@ import jakarta.validation.constraints.NotNull; * DTO (Data Transfer Object) representing the incoming login request. */ public record LoginRequest(@NotNull String email, @NotNull @NotBlank String password) { -} \ No newline at end of file +} diff --git a/src/main/java/auth_service/domain/login/controller/dto/response/LoginResponse.java b/src/main/java/auth_service/modules/login/api/dto/response/LoginResponse.java similarity index 73% rename from src/main/java/auth_service/domain/login/controller/dto/response/LoginResponse.java rename to src/main/java/auth_service/modules/login/api/dto/response/LoginResponse.java index 7b77a41..1c38aea 100644 --- a/src/main/java/auth_service/domain/login/controller/dto/response/LoginResponse.java +++ b/src/main/java/auth_service/modules/login/api/dto/response/LoginResponse.java @@ -1,8 +1,8 @@ -package auth_service.domain.login.controller.dto.response; +package auth_service.modules.login.api.dto.response; /** * DTO representing the outgoing login response. * The email will be null if the login fails. */ public record LoginResponse(String message, String token) { -} \ No newline at end of file +} diff --git a/src/main/java/auth_service/domain/login/controller/mapper/ApiMapper.java b/src/main/java/auth_service/modules/login/api/mapper/ApiMapper.java similarity index 58% rename from src/main/java/auth_service/domain/login/controller/mapper/ApiMapper.java rename to src/main/java/auth_service/modules/login/api/mapper/ApiMapper.java index 8da6103..3fa6d58 100644 --- a/src/main/java/auth_service/domain/login/controller/mapper/ApiMapper.java +++ b/src/main/java/auth_service/modules/login/api/mapper/ApiMapper.java @@ -1,7 +1,7 @@ -package auth_service.domain.login.controller.mapper; +package auth_service.modules.login.api.mapper; -import auth_service.domain.login.controller.dto.request.LoginRequest; -import auth_service.domain.login.model.User; +import auth_service.modules.login.api.dto.request.LoginRequest; +import auth_service.modules.login.model.User; public abstract class ApiMapper { private ApiMapper() { @@ -10,4 +10,4 @@ public abstract class ApiMapper { public static User toModel(LoginRequest loginRequest) { return User.builder().email(loginRequest.email()).password(loginRequest.password()).build(); } -} \ No newline at end of file +} diff --git a/src/main/java/auth_service/domain/login/exception/InvalidCredentialsException.java b/src/main/java/auth_service/modules/login/exception/InvalidCredentialsException.java similarity index 76% rename from src/main/java/auth_service/domain/login/exception/InvalidCredentialsException.java rename to src/main/java/auth_service/modules/login/exception/InvalidCredentialsException.java index 9fc4e6d..4d24db1 100644 --- a/src/main/java/auth_service/domain/login/exception/InvalidCredentialsException.java +++ b/src/main/java/auth_service/modules/login/exception/InvalidCredentialsException.java @@ -1,7 +1,7 @@ -package auth_service.domain.login.exception; +package auth_service.modules.login.exception; public class InvalidCredentialsException extends RuntimeException { public InvalidCredentialsException(String message) { super(message); } -} \ No newline at end of file +} diff --git a/src/main/java/auth_service/domain/login/exception/UserNotFoundException.java b/src/main/java/auth_service/modules/login/exception/UserNotFoundException.java similarity index 75% rename from src/main/java/auth_service/domain/login/exception/UserNotFoundException.java rename to src/main/java/auth_service/modules/login/exception/UserNotFoundException.java index bdfc97e..39a4569 100644 --- a/src/main/java/auth_service/domain/login/exception/UserNotFoundException.java +++ b/src/main/java/auth_service/modules/login/exception/UserNotFoundException.java @@ -1,7 +1,7 @@ -package auth_service.domain.login.exception; +package auth_service.modules.login.exception; public class UserNotFoundException extends RuntimeException { public UserNotFoundException(String message) { super(message); } -} \ No newline at end of file +} diff --git a/src/main/java/auth_service/domain/login/model/User.java b/src/main/java/auth_service/modules/login/model/User.java similarity index 78% rename from src/main/java/auth_service/domain/login/model/User.java rename to src/main/java/auth_service/modules/login/model/User.java index 0126171..ef9e9c0 100644 --- a/src/main/java/auth_service/domain/login/model/User.java +++ b/src/main/java/auth_service/modules/login/model/User.java @@ -1,4 +1,4 @@ -package auth_service.domain.login.model; +package auth_service.modules.login.model; import lombok.Builder; import lombok.Data; @@ -9,4 +9,4 @@ public class User { private long id; private String email; private String password; -} \ No newline at end of file +} diff --git a/src/main/java/auth_service/domain/login/persistence/MinimalUserRepository.java b/src/main/java/auth_service/modules/login/persistence/MinimalUserRepository.java similarity index 80% rename from src/main/java/auth_service/domain/login/persistence/MinimalUserRepository.java rename to src/main/java/auth_service/modules/login/persistence/MinimalUserRepository.java index bf0182f..5c90aa2 100644 --- a/src/main/java/auth_service/domain/login/persistence/MinimalUserRepository.java +++ b/src/main/java/auth_service/modules/login/persistence/MinimalUserRepository.java @@ -1,6 +1,6 @@ -package auth_service.domain.login.persistence; +package auth_service.modules.login.persistence; -import auth_service.domain.login.model.User; +import auth_service.modules.login.model.User; import java.util.Optional; @@ -17,4 +17,4 @@ public interface MinimalUserRepository { Optional findByEmail(String email); void updateLoginDate(long userId); -} \ No newline at end of file +} diff --git a/src/main/java/auth_service/domain/login/persistence/MinimalUserRepositoryImpl.java b/src/main/java/auth_service/modules/login/persistence/MinimalUserRepositoryImpl.java similarity index 86% rename from src/main/java/auth_service/domain/login/persistence/MinimalUserRepositoryImpl.java rename to src/main/java/auth_service/modules/login/persistence/MinimalUserRepositoryImpl.java index 9fc0d4b..ed2493b 100644 --- a/src/main/java/auth_service/domain/login/persistence/MinimalUserRepositoryImpl.java +++ b/src/main/java/auth_service/modules/login/persistence/MinimalUserRepositoryImpl.java @@ -1,8 +1,8 @@ -package auth_service.domain.login.persistence; +package auth_service.modules.login.persistence; -import auth_service.domain.login.model.User; -import auth_service.domain.login.persistence.entities.MinimalUserEntity; -import auth_service.domain.login.persistence.mapper.EntityMapper; +import auth_service.modules.login.model.User; +import auth_service.modules.login.persistence.entities.MinimalUserEntity; +import auth_service.modules.login.persistence.mapper.EntityMapper; import jakarta.persistence.EntityManager; import jakarta.persistence.PersistenceContext; import jakarta.persistence.TypedQuery; @@ -44,4 +44,4 @@ public class MinimalUserRepositoryImpl implements MinimalUserRepository { entityManager.flush(); } } -} \ No newline at end of file +} diff --git a/src/main/java/auth_service/domain/login/persistence/entities/MinimalUserEntity.java b/src/main/java/auth_service/modules/login/persistence/entities/MinimalUserEntity.java similarity index 91% rename from src/main/java/auth_service/domain/login/persistence/entities/MinimalUserEntity.java rename to src/main/java/auth_service/modules/login/persistence/entities/MinimalUserEntity.java index bf57179..fd0cde2 100644 --- a/src/main/java/auth_service/domain/login/persistence/entities/MinimalUserEntity.java +++ b/src/main/java/auth_service/modules/login/persistence/entities/MinimalUserEntity.java @@ -1,4 +1,4 @@ -package auth_service.domain.login.persistence.entities; +package auth_service.modules.login.persistence.entities; import jakarta.persistence.*; import lombok.*; @@ -32,4 +32,4 @@ public class MinimalUserEntity { @Column(name = "last_login_date") private LocalDateTime lastLoginDate; -} \ No newline at end of file +} diff --git a/src/main/java/auth_service/domain/login/persistence/mapper/EntityMapper.java b/src/main/java/auth_service/modules/login/persistence/mapper/EntityMapper.java similarity index 69% rename from src/main/java/auth_service/domain/login/persistence/mapper/EntityMapper.java rename to src/main/java/auth_service/modules/login/persistence/mapper/EntityMapper.java index ec2fccc..b351f3a 100644 --- a/src/main/java/auth_service/domain/login/persistence/mapper/EntityMapper.java +++ b/src/main/java/auth_service/modules/login/persistence/mapper/EntityMapper.java @@ -1,7 +1,7 @@ -package auth_service.domain.login.persistence.mapper; +package auth_service.modules.login.persistence.mapper; -import auth_service.domain.login.model.User; -import auth_service.domain.login.persistence.entities.MinimalUserEntity; +import auth_service.modules.login.model.User; +import auth_service.modules.login.persistence.entities.MinimalUserEntity; public abstract class EntityMapper { @@ -19,4 +19,4 @@ public abstract class EntityMapper { return model; } -} \ No newline at end of file +} diff --git a/src/main/java/auth_service/domain/login/service/LoginService.java b/src/main/java/auth_service/modules/login/service/LoginService.java similarity index 79% rename from src/main/java/auth_service/domain/login/service/LoginService.java rename to src/main/java/auth_service/modules/login/service/LoginService.java index 8753dc8..4fa76ee 100644 --- a/src/main/java/auth_service/domain/login/service/LoginService.java +++ b/src/main/java/auth_service/modules/login/service/LoginService.java @@ -1,9 +1,9 @@ -package auth_service.domain.login.service; +package auth_service.modules.login.service; -import auth_service.domain.login.exception.InvalidCredentialsException; -import auth_service.domain.login.exception.UserNotFoundException; -import auth_service.domain.login.model.User; -import auth_service.domain.login.persistence.MinimalUserRepository; +import auth_service.modules.login.exception.InvalidCredentialsException; +import auth_service.modules.login.exception.UserNotFoundException; +import auth_service.modules.login.model.User; +import auth_service.modules.login.persistence.MinimalUserRepository; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.springframework.security.crypto.password.PasswordEncoder; @@ -32,4 +32,4 @@ public class LoginService { minimalUserRepository.updateLoginDate(foundUser.getId()); return tokenGenerator.generateToken(String.valueOf(foundUser.getId()), foundUser.getEmail()); } -} \ No newline at end of file +} diff --git a/src/main/java/auth_service/domain/login/service/TokenGenerator.java b/src/main/java/auth_service/modules/login/service/TokenGenerator.java similarity index 90% rename from src/main/java/auth_service/domain/login/service/TokenGenerator.java rename to src/main/java/auth_service/modules/login/service/TokenGenerator.java index 5a328b2..60493c4 100644 --- a/src/main/java/auth_service/domain/login/service/TokenGenerator.java +++ b/src/main/java/auth_service/modules/login/service/TokenGenerator.java @@ -1,4 +1,4 @@ -package auth_service.domain.login.service; +package auth_service.modules.login.service; /** * Port interface for token generation. @@ -14,3 +14,4 @@ public interface TokenGenerator { */ String generateToken(String userId, String email); } + diff --git a/src/main/java/auth_service/domain/registration/controller/RegistrationController.java b/src/main/java/auth_service/modules/registration/api/RegistrationController.java similarity index 74% rename from src/main/java/auth_service/domain/registration/controller/RegistrationController.java rename to src/main/java/auth_service/modules/registration/api/RegistrationController.java index 6982b02..a64efba 100644 --- a/src/main/java/auth_service/domain/registration/controller/RegistrationController.java +++ b/src/main/java/auth_service/modules/registration/api/RegistrationController.java @@ -1,9 +1,9 @@ -package auth_service.domain.registration.controller; +package auth_service.modules.registration.api; -import auth_service.domain.registration.controller.dto.mapper.ApiMapper; -import auth_service.domain.registration.controller.dto.request.RegistrationRequest; -import auth_service.domain.registration.controller.dto.response.RegistrationResponse; -import auth_service.domain.registration.service.RegistrationService; +import auth_service.modules.registration.api.dto.mapper.ApiMapper; +import auth_service.modules.registration.api.dto.request.RegistrationRequest; +import auth_service.modules.registration.api.dto.response.RegistrationResponse; +import auth_service.modules.registration.service.RegistrationService; import io.micrometer.core.annotation.Timed; import lombok.RequiredArgsConstructor; import org.springframework.http.ResponseEntity; @@ -25,4 +25,4 @@ public class RegistrationController { var userId = registrationService.register(ApiMapper.mapToModel(request)); return ResponseEntity.ok(RegistrationResponse.builder().userId(userId).build()); } -} \ No newline at end of file +} diff --git a/src/main/java/auth_service/domain/registration/controller/RegistrationExceptionController.java b/src/main/java/auth_service/modules/registration/api/RegistrationExceptionController.java similarity index 81% rename from src/main/java/auth_service/domain/registration/controller/RegistrationExceptionController.java rename to src/main/java/auth_service/modules/registration/api/RegistrationExceptionController.java index 61cdb9a..7ca129a 100644 --- a/src/main/java/auth_service/domain/registration/controller/RegistrationExceptionController.java +++ b/src/main/java/auth_service/modules/registration/api/RegistrationExceptionController.java @@ -1,9 +1,9 @@ -package auth_service.domain.registration.controller; +package auth_service.modules.registration.api; -import auth_service.shared.controller.dto.response.ErrorResponse; -import auth_service.domain.registration.exception.EmailAlreadyInUseException; -import auth_service.domain.registration.exception.InvalidInvitationCodeException; -import auth_service.domain.registration.exception.SteamIdAlreadyRegisteredException; +import auth_service.shared.api.dto.response.ErrorResponse; +import auth_service.modules.registration.exception.EmailAlreadyInUseException; +import auth_service.modules.registration.exception.InvalidInvitationCodeException; +import auth_service.modules.registration.exception.SteamIdAlreadyRegisteredException; import lombok.NonNull; import lombok.extern.slf4j.Slf4j; import org.springframework.core.annotation.Order; @@ -42,4 +42,4 @@ public class RegistrationExceptionController { } -} \ No newline at end of file +} diff --git a/src/main/java/auth_service/domain/registration/controller/dto/mapper/ApiMapper.java b/src/main/java/auth_service/modules/registration/api/dto/mapper/ApiMapper.java similarity index 68% rename from src/main/java/auth_service/domain/registration/controller/dto/mapper/ApiMapper.java rename to src/main/java/auth_service/modules/registration/api/dto/mapper/ApiMapper.java index 7b7b376..85dd1bb 100644 --- a/src/main/java/auth_service/domain/registration/controller/dto/mapper/ApiMapper.java +++ b/src/main/java/auth_service/modules/registration/api/dto/mapper/ApiMapper.java @@ -1,7 +1,7 @@ -package auth_service.domain.registration.controller.dto.mapper; +package auth_service.modules.registration.api.dto.mapper; -import auth_service.domain.registration.controller.dto.request.RegistrationRequest; -import auth_service.domain.registration.model.Registration; +import auth_service.modules.registration.api.dto.request.RegistrationRequest; +import auth_service.modules.registration.model.Registration; public abstract class ApiMapper { private ApiMapper() { @@ -16,4 +16,4 @@ public abstract class ApiMapper { build(); } -} \ No newline at end of file +} diff --git a/src/main/java/auth_service/domain/registration/controller/dto/request/RegistrationRequest.java b/src/main/java/auth_service/modules/registration/api/dto/request/RegistrationRequest.java similarity index 67% rename from src/main/java/auth_service/domain/registration/controller/dto/request/RegistrationRequest.java rename to src/main/java/auth_service/modules/registration/api/dto/request/RegistrationRequest.java index dfac693..ff8fb38 100644 --- a/src/main/java/auth_service/domain/registration/controller/dto/request/RegistrationRequest.java +++ b/src/main/java/auth_service/modules/registration/api/dto/request/RegistrationRequest.java @@ -1,7 +1,7 @@ -package auth_service.domain.registration.controller.dto.request; +package auth_service.modules.registration.api.dto.request; import lombok.Builder; @Builder public record RegistrationRequest(String email, String password, String inviteCode, long steamId) { -} \ No newline at end of file +} diff --git a/src/main/java/auth_service/domain/registration/controller/dto/response/RegistrationResponse.java b/src/main/java/auth_service/modules/registration/api/dto/response/RegistrationResponse.java similarity index 55% rename from src/main/java/auth_service/domain/registration/controller/dto/response/RegistrationResponse.java rename to src/main/java/auth_service/modules/registration/api/dto/response/RegistrationResponse.java index cf2170e..87d7e03 100644 --- a/src/main/java/auth_service/domain/registration/controller/dto/response/RegistrationResponse.java +++ b/src/main/java/auth_service/modules/registration/api/dto/response/RegistrationResponse.java @@ -1,7 +1,7 @@ -package auth_service.domain.registration.controller.dto.response; +package auth_service.modules.registration.api.dto.response; import lombok.Builder; @Builder public record RegistrationResponse(long userId) { -} \ No newline at end of file +} diff --git a/src/main/java/auth_service/domain/registration/exception/EmailAlreadyInUseException.java b/src/main/java/auth_service/modules/registration/exception/EmailAlreadyInUseException.java similarity index 73% rename from src/main/java/auth_service/domain/registration/exception/EmailAlreadyInUseException.java rename to src/main/java/auth_service/modules/registration/exception/EmailAlreadyInUseException.java index 6972720..dc63241 100644 --- a/src/main/java/auth_service/domain/registration/exception/EmailAlreadyInUseException.java +++ b/src/main/java/auth_service/modules/registration/exception/EmailAlreadyInUseException.java @@ -1,7 +1,7 @@ -package auth_service.domain.registration.exception; +package auth_service.modules.registration.exception; public class EmailAlreadyInUseException extends RuntimeException { public EmailAlreadyInUseException(String message) { super(message); } -} \ No newline at end of file +} diff --git a/src/main/java/auth_service/domain/registration/exception/InvalidInvitationCodeException.java b/src/main/java/auth_service/modules/registration/exception/InvalidInvitationCodeException.java similarity index 74% rename from src/main/java/auth_service/domain/registration/exception/InvalidInvitationCodeException.java rename to src/main/java/auth_service/modules/registration/exception/InvalidInvitationCodeException.java index bb201e5..e5a492d 100644 --- a/src/main/java/auth_service/domain/registration/exception/InvalidInvitationCodeException.java +++ b/src/main/java/auth_service/modules/registration/exception/InvalidInvitationCodeException.java @@ -1,7 +1,7 @@ -package auth_service.domain.registration.exception; +package auth_service.modules.registration.exception; public class InvalidInvitationCodeException extends RuntimeException { public InvalidInvitationCodeException(String message) { super(message); } -} \ No newline at end of file +} diff --git a/src/main/java/auth_service/domain/registration/exception/SteamIdAlreadyRegisteredException.java b/src/main/java/auth_service/modules/registration/exception/SteamIdAlreadyRegisteredException.java similarity index 75% rename from src/main/java/auth_service/domain/registration/exception/SteamIdAlreadyRegisteredException.java rename to src/main/java/auth_service/modules/registration/exception/SteamIdAlreadyRegisteredException.java index 9422e51..4a8339b 100644 --- a/src/main/java/auth_service/domain/registration/exception/SteamIdAlreadyRegisteredException.java +++ b/src/main/java/auth_service/modules/registration/exception/SteamIdAlreadyRegisteredException.java @@ -1,7 +1,7 @@ -package auth_service.domain.registration.exception; +package auth_service.modules.registration.exception; public class SteamIdAlreadyRegisteredException extends RuntimeException { public SteamIdAlreadyRegisteredException(String message) { super(message); } -} \ No newline at end of file +} diff --git a/src/main/java/auth_service/domain/registration/model/Registration.java b/src/main/java/auth_service/modules/registration/model/Registration.java similarity index 82% rename from src/main/java/auth_service/domain/registration/model/Registration.java rename to src/main/java/auth_service/modules/registration/model/Registration.java index 1660b51..3a3fbd9 100644 --- a/src/main/java/auth_service/domain/registration/model/Registration.java +++ b/src/main/java/auth_service/modules/registration/model/Registration.java @@ -1,4 +1,4 @@ -package auth_service.domain.registration.model; +package auth_service.modules.registration.model; import lombok.Builder; import lombok.Data; @@ -11,4 +11,4 @@ public class Registration { private String encryptedPassword; private String inviteCode; private long steamId; -} \ No newline at end of file +} diff --git a/src/main/java/auth_service/domain/registration/persistence/RegisteredUserRepository.java b/src/main/java/auth_service/modules/registration/persistence/RegisteredUserRepository.java similarity index 59% rename from src/main/java/auth_service/domain/registration/persistence/RegisteredUserRepository.java rename to src/main/java/auth_service/modules/registration/persistence/RegisteredUserRepository.java index 543ecf4..4722dd1 100644 --- a/src/main/java/auth_service/domain/registration/persistence/RegisteredUserRepository.java +++ b/src/main/java/auth_service/modules/registration/persistence/RegisteredUserRepository.java @@ -1,6 +1,6 @@ -package auth_service.domain.registration.persistence; +package auth_service.modules.registration.persistence; -import auth_service.domain.registration.model.Registration; +import auth_service.modules.registration.model.Registration; public interface RegisteredUserRepository { boolean existsByEmail(String email); @@ -8,4 +8,4 @@ public interface RegisteredUserRepository { boolean existsBySteamId(long steamId); long save(Registration registration); -} \ No newline at end of file +} diff --git a/src/main/java/auth_service/domain/registration/persistence/RegisteredUserRepositoryImpl.java b/src/main/java/auth_service/modules/registration/persistence/RegisteredUserRepositoryImpl.java similarity index 87% rename from src/main/java/auth_service/domain/registration/persistence/RegisteredUserRepositoryImpl.java rename to src/main/java/auth_service/modules/registration/persistence/RegisteredUserRepositoryImpl.java index 3b80c9b..66d5da7 100644 --- a/src/main/java/auth_service/domain/registration/persistence/RegisteredUserRepositoryImpl.java +++ b/src/main/java/auth_service/modules/registration/persistence/RegisteredUserRepositoryImpl.java @@ -1,7 +1,7 @@ -package auth_service.domain.registration.persistence; +package auth_service.modules.registration.persistence; -import auth_service.domain.registration.model.Registration; -import auth_service.domain.registration.persistence.mapper.EntityMapper; +import auth_service.modules.registration.model.Registration; +import auth_service.modules.registration.persistence.mapper.EntityMapper; import jakarta.persistence.EntityManager; import jakarta.persistence.PersistenceContext; import jakarta.transaction.Transactional; @@ -40,4 +40,4 @@ public class RegisteredUserRepositoryImpl implements RegisteredUserRepository { entityManager.persist(userToRegisterEntity); return userToRegisterEntity.getId(); } -} \ No newline at end of file +} diff --git a/src/main/java/auth_service/domain/registration/persistence/entities/RegisteredUserEntity.java b/src/main/java/auth_service/modules/registration/persistence/entities/RegisteredUserEntity.java similarity index 92% rename from src/main/java/auth_service/domain/registration/persistence/entities/RegisteredUserEntity.java rename to src/main/java/auth_service/modules/registration/persistence/entities/RegisteredUserEntity.java index 9cad15f..8cc334b 100644 --- a/src/main/java/auth_service/domain/registration/persistence/entities/RegisteredUserEntity.java +++ b/src/main/java/auth_service/modules/registration/persistence/entities/RegisteredUserEntity.java @@ -1,4 +1,4 @@ -package auth_service.domain.registration.persistence.entities; +package auth_service.modules.registration.persistence.entities; import jakarta.persistence.*; import lombok.*; @@ -34,4 +34,4 @@ public class RegisteredUserEntity { @Column(name = "last_login_date") private LocalDateTime lastLoginDate; -} \ No newline at end of file +} diff --git a/src/main/java/auth_service/domain/registration/persistence/mapper/EntityMapper.java b/src/main/java/auth_service/modules/registration/persistence/mapper/EntityMapper.java similarity index 73% rename from src/main/java/auth_service/domain/registration/persistence/mapper/EntityMapper.java rename to src/main/java/auth_service/modules/registration/persistence/mapper/EntityMapper.java index 0d5366d..f6c8bee 100644 --- a/src/main/java/auth_service/domain/registration/persistence/mapper/EntityMapper.java +++ b/src/main/java/auth_service/modules/registration/persistence/mapper/EntityMapper.java @@ -1,7 +1,7 @@ -package auth_service.domain.registration.persistence.mapper; +package auth_service.modules.registration.persistence.mapper; -import auth_service.domain.registration.model.Registration; -import auth_service.domain.registration.persistence.entities.RegisteredUserEntity; +import auth_service.modules.registration.model.Registration; +import auth_service.modules.registration.persistence.entities.RegisteredUserEntity; import java.time.Clock; import java.time.LocalDateTime; @@ -21,4 +21,4 @@ public abstract class EntityMapper { lastLoginDate(null). build(); } -} \ No newline at end of file +} diff --git a/src/main/java/auth_service/domain/registration/service/CodeValidationService.java b/src/main/java/auth_service/modules/registration/service/CodeValidationService.java similarity index 88% rename from src/main/java/auth_service/domain/registration/service/CodeValidationService.java rename to src/main/java/auth_service/modules/registration/service/CodeValidationService.java index fb773e0..9b84cec 100644 --- a/src/main/java/auth_service/domain/registration/service/CodeValidationService.java +++ b/src/main/java/auth_service/modules/registration/service/CodeValidationService.java @@ -1,4 +1,4 @@ -package auth_service.domain.registration.service; +package auth_service.modules.registration.service; import org.springframework.beans.factory.annotation.Value; import org.springframework.stereotype.Service; @@ -16,4 +16,4 @@ public class CodeValidationService { return code.equals(invitationCode); } -} \ No newline at end of file +} diff --git a/src/main/java/auth_service/domain/registration/service/RegistrationService.java b/src/main/java/auth_service/modules/registration/service/RegistrationService.java similarity index 73% rename from src/main/java/auth_service/domain/registration/service/RegistrationService.java rename to src/main/java/auth_service/modules/registration/service/RegistrationService.java index 817844a..681e7f3 100644 --- a/src/main/java/auth_service/domain/registration/service/RegistrationService.java +++ b/src/main/java/auth_service/modules/registration/service/RegistrationService.java @@ -1,10 +1,10 @@ -package auth_service.domain.registration.service; +package auth_service.modules.registration.service; -import auth_service.domain.registration.exception.EmailAlreadyInUseException; -import auth_service.domain.registration.exception.InvalidInvitationCodeException; -import auth_service.domain.registration.exception.SteamIdAlreadyRegisteredException; -import auth_service.domain.registration.model.Registration; -import auth_service.domain.registration.persistence.RegisteredUserRepository; +import auth_service.modules.registration.exception.EmailAlreadyInUseException; +import auth_service.modules.registration.exception.InvalidInvitationCodeException; +import auth_service.modules.registration.exception.SteamIdAlreadyRegisteredException; +import auth_service.modules.registration.model.Registration; +import auth_service.modules.registration.persistence.RegisteredUserRepository; import lombok.RequiredArgsConstructor; import org.springframework.security.crypto.password.PasswordEncoder; import org.springframework.stereotype.Service; @@ -35,4 +35,4 @@ public class RegistrationService { return registeredUserRepository.save(registration); } -} \ No newline at end of file +} diff --git a/src/main/java/auth_service/domain/user/controller/UserController.java b/src/main/java/auth_service/modules/user/api/UserController.java similarity index 82% rename from src/main/java/auth_service/domain/user/controller/UserController.java rename to src/main/java/auth_service/modules/user/api/UserController.java index 61e7777..b4204c8 100644 --- a/src/main/java/auth_service/domain/user/controller/UserController.java +++ b/src/main/java/auth_service/modules/user/api/UserController.java @@ -1,10 +1,10 @@ -package auth_service.domain.user.controller; +package auth_service.modules.user.api; import auth_service.shared.security.UserPrincipal; -import auth_service.domain.user.controller.dto.request.UserSettingsRequest; -import auth_service.domain.user.controller.dto.response.UserProfileResponse; -import auth_service.domain.user.controller.mapper.ApiMapper; -import auth_service.domain.user.service.UserService; +import auth_service.modules.user.api.dto.request.UserSettingsRequest; +import auth_service.modules.user.api.dto.response.UserProfileResponse; +import auth_service.modules.user.api.mapper.ApiMapper; +import auth_service.modules.user.service.UserService; import io.micrometer.core.annotation.Timed; import lombok.RequiredArgsConstructor; import org.springframework.http.ResponseEntity; @@ -12,7 +12,7 @@ import org.springframework.security.core.annotation.AuthenticationPrincipal; import org.springframework.web.bind.annotation.*; /** - * Controller handling user profile operations for the dashboard. + * API handling user profile operations for the dashboard. */ @RestController @RequestMapping("/api/users") @@ -42,4 +42,4 @@ public class UserController { this.userService.updateUserSettings(principal.getIdAsLong(), request.steamId(), ApiMapper.toDomain(request)); return ResponseEntity.ok().build(); } -} \ No newline at end of file +} diff --git a/src/main/java/auth_service/domain/user/controller/UserExceptionController.java b/src/main/java/auth_service/modules/user/api/UserExceptionController.java similarity index 85% rename from src/main/java/auth_service/domain/user/controller/UserExceptionController.java rename to src/main/java/auth_service/modules/user/api/UserExceptionController.java index 418b58e..d188141 100644 --- a/src/main/java/auth_service/domain/user/controller/UserExceptionController.java +++ b/src/main/java/auth_service/modules/user/api/UserExceptionController.java @@ -1,7 +1,7 @@ -package auth_service.domain.user.controller; +package auth_service.modules.user.api; -import auth_service.shared.controller.dto.response.ErrorResponse; -import auth_service.domain.user.exception.UserNotFoundException; +import auth_service.shared.api.dto.response.ErrorResponse; +import auth_service.modules.user.exception.UserNotFoundException; import lombok.NonNull; import lombok.extern.slf4j.Slf4j; import org.springframework.core.annotation.Order; @@ -33,4 +33,4 @@ public class UserExceptionController { return response(body, HttpStatus.NOT_FOUND); } -} \ No newline at end of file +} diff --git a/src/main/java/auth_service/domain/user/controller/dto/request/UserSettingsRequest.java b/src/main/java/auth_service/modules/user/api/dto/request/UserSettingsRequest.java similarity index 60% rename from src/main/java/auth_service/domain/user/controller/dto/request/UserSettingsRequest.java rename to src/main/java/auth_service/modules/user/api/dto/request/UserSettingsRequest.java index a21a63e..7df7132 100644 --- a/src/main/java/auth_service/domain/user/controller/dto/request/UserSettingsRequest.java +++ b/src/main/java/auth_service/modules/user/api/dto/request/UserSettingsRequest.java @@ -1,4 +1,4 @@ -package auth_service.domain.user.controller.dto.request; +package auth_service.modules.user.api.dto.request; public record UserSettingsRequest(boolean useDarkTheme, String language, long steamId) { -} \ No newline at end of file +} diff --git a/src/main/java/auth_service/domain/user/controller/dto/response/SettingsResponse.java b/src/main/java/auth_service/modules/user/api/dto/response/SettingsResponse.java similarity index 66% rename from src/main/java/auth_service/domain/user/controller/dto/response/SettingsResponse.java rename to src/main/java/auth_service/modules/user/api/dto/response/SettingsResponse.java index 5974651..21aa8ab 100644 --- a/src/main/java/auth_service/domain/user/controller/dto/response/SettingsResponse.java +++ b/src/main/java/auth_service/modules/user/api/dto/response/SettingsResponse.java @@ -1,7 +1,7 @@ -package auth_service.domain.user.controller.dto.response; +package auth_service.modules.user.api.dto.response; import lombok.Builder; @Builder public record SettingsResponse(long id, boolean useDarkTheme, String language) { -} \ No newline at end of file +} diff --git a/src/main/java/auth_service/domain/user/controller/dto/response/UserProfileResponse.java b/src/main/java/auth_service/modules/user/api/dto/response/UserProfileResponse.java similarity index 79% rename from src/main/java/auth_service/domain/user/controller/dto/response/UserProfileResponse.java rename to src/main/java/auth_service/modules/user/api/dto/response/UserProfileResponse.java index ed71824..e5551df 100644 --- a/src/main/java/auth_service/domain/user/controller/dto/response/UserProfileResponse.java +++ b/src/main/java/auth_service/modules/user/api/dto/response/UserProfileResponse.java @@ -1,4 +1,4 @@ -package auth_service.domain.user.controller.dto.response; +package auth_service.modules.user.api.dto.response; import lombok.Builder; @@ -6,4 +6,4 @@ import java.time.LocalDateTime; @Builder public record UserProfileResponse(long id, String email, String role, LocalDateTime lastLogin, LocalDateTime createdDate, long steamId, SettingsResponse settings) { -} \ No newline at end of file +} diff --git a/src/main/java/auth_service/domain/user/controller/mapper/ApiMapper.java b/src/main/java/auth_service/modules/user/api/mapper/ApiMapper.java similarity index 72% rename from src/main/java/auth_service/domain/user/controller/mapper/ApiMapper.java rename to src/main/java/auth_service/modules/user/api/mapper/ApiMapper.java index fd27464..c86fe51 100644 --- a/src/main/java/auth_service/domain/user/controller/mapper/ApiMapper.java +++ b/src/main/java/auth_service/modules/user/api/mapper/ApiMapper.java @@ -1,11 +1,11 @@ -package auth_service.domain.user.controller.mapper; +package auth_service.modules.user.api.mapper; -import auth_service.domain.user.controller.dto.request.UserSettingsRequest; -import auth_service.domain.user.controller.dto.response.SettingsResponse; -import auth_service.domain.user.controller.dto.response.UserProfileResponse; -import auth_service.domain.user.model.User; -import auth_service.domain.user.model.UserSettings; +import auth_service.modules.user.api.dto.request.UserSettingsRequest; +import auth_service.modules.user.api.dto.response.SettingsResponse; +import auth_service.modules.user.api.dto.response.UserProfileResponse; +import auth_service.modules.user.model.User; +import auth_service.modules.user.model.UserSettings; public abstract class ApiMapper { private ApiMapper() { @@ -34,4 +34,4 @@ public abstract class ApiMapper { .build(); } -} \ No newline at end of file +} diff --git a/src/main/java/auth_service/domain/user/exception/UserNotFoundException.java b/src/main/java/auth_service/modules/user/exception/UserNotFoundException.java similarity index 75% rename from src/main/java/auth_service/domain/user/exception/UserNotFoundException.java rename to src/main/java/auth_service/modules/user/exception/UserNotFoundException.java index b733496..6a39951 100644 --- a/src/main/java/auth_service/domain/user/exception/UserNotFoundException.java +++ b/src/main/java/auth_service/modules/user/exception/UserNotFoundException.java @@ -1,7 +1,7 @@ -package auth_service.domain.user.exception; +package auth_service.modules.user.exception; public class UserNotFoundException extends RuntimeException { public UserNotFoundException(String message) { super(message); } -} \ No newline at end of file +} diff --git a/src/main/java/auth_service/domain/user/model/User.java b/src/main/java/auth_service/modules/user/model/User.java similarity index 88% rename from src/main/java/auth_service/domain/user/model/User.java rename to src/main/java/auth_service/modules/user/model/User.java index bb18bf3..85fb9c0 100644 --- a/src/main/java/auth_service/domain/user/model/User.java +++ b/src/main/java/auth_service/modules/user/model/User.java @@ -1,4 +1,4 @@ -package auth_service.domain.user.model; +package auth_service.modules.user.model; import lombok.Builder; import lombok.Data; @@ -16,4 +16,4 @@ public class User { private long steamId; private UserSettings settings; -} \ No newline at end of file +} diff --git a/src/main/java/auth_service/domain/user/model/UserSettings.java b/src/main/java/auth_service/modules/user/model/UserSettings.java similarity index 76% rename from src/main/java/auth_service/domain/user/model/UserSettings.java rename to src/main/java/auth_service/modules/user/model/UserSettings.java index 694202e..c28d175 100644 --- a/src/main/java/auth_service/domain/user/model/UserSettings.java +++ b/src/main/java/auth_service/modules/user/model/UserSettings.java @@ -1,4 +1,4 @@ -package auth_service.domain.user.model; +package auth_service.modules.user.model; import lombok.Builder; import lombok.Data; @@ -8,4 +8,4 @@ import lombok.Data; public class UserSettings { private String language; private String theme; -} \ No newline at end of file +} diff --git a/src/main/java/auth_service/domain/user/persistence/UserRepository.java b/src/main/java/auth_service/modules/user/persistence/UserRepository.java similarity index 80% rename from src/main/java/auth_service/domain/user/persistence/UserRepository.java rename to src/main/java/auth_service/modules/user/persistence/UserRepository.java index b4c18bb..946d97d 100644 --- a/src/main/java/auth_service/domain/user/persistence/UserRepository.java +++ b/src/main/java/auth_service/modules/user/persistence/UserRepository.java @@ -1,8 +1,8 @@ -package auth_service.domain.user.persistence; +package auth_service.modules.user.persistence; -import auth_service.domain.user.model.User; -import auth_service.domain.user.model.UserSettings; +import auth_service.modules.user.model.User; +import auth_service.modules.user.model.UserSettings; import jakarta.transaction.Transactional; import jakarta.validation.constraints.NotNull; @@ -25,4 +25,4 @@ public interface UserRepository { @Transactional boolean updateSettings(long userId, long steamId, UserSettings settings); -} \ No newline at end of file +} diff --git a/src/main/java/auth_service/domain/user/persistence/UserRepositoryImpl.java b/src/main/java/auth_service/modules/user/persistence/UserRepositoryImpl.java similarity index 88% rename from src/main/java/auth_service/domain/user/persistence/UserRepositoryImpl.java rename to src/main/java/auth_service/modules/user/persistence/UserRepositoryImpl.java index 5e1521a..87f6708 100644 --- a/src/main/java/auth_service/domain/user/persistence/UserRepositoryImpl.java +++ b/src/main/java/auth_service/modules/user/persistence/UserRepositoryImpl.java @@ -1,10 +1,10 @@ -package auth_service.domain.user.persistence; +package auth_service.modules.user.persistence; -import auth_service.domain.user.model.User; -import auth_service.domain.user.model.UserSettings; -import auth_service.domain.user.persistence.entities.UserEntity; -import auth_service.domain.user.persistence.entities.UserSettingsEntity; -import auth_service.domain.user.persistence.mapper.EntityMapper; +import auth_service.modules.user.model.User; +import auth_service.modules.user.model.UserSettings; +import auth_service.modules.user.persistence.entities.UserEntity; +import auth_service.modules.user.persistence.entities.UserSettingsEntity; +import auth_service.modules.user.persistence.mapper.EntityMapper; import jakarta.persistence.EntityManager; import jakarta.persistence.PersistenceContext; import jakarta.persistence.TypedQuery; @@ -81,4 +81,4 @@ public class UserRepositoryImpl implements UserRepository { return steamIdChanged; } -} \ No newline at end of file +} diff --git a/src/main/java/auth_service/domain/user/persistence/entities/UserEntity.java b/src/main/java/auth_service/modules/user/persistence/entities/UserEntity.java similarity index 94% rename from src/main/java/auth_service/domain/user/persistence/entities/UserEntity.java rename to src/main/java/auth_service/modules/user/persistence/entities/UserEntity.java index c436278..1215b24 100644 --- a/src/main/java/auth_service/domain/user/persistence/entities/UserEntity.java +++ b/src/main/java/auth_service/modules/user/persistence/entities/UserEntity.java @@ -1,4 +1,4 @@ -package auth_service.domain.user.persistence.entities; +package auth_service.modules.user.persistence.entities; import jakarta.persistence.*; import lombok.*; @@ -42,4 +42,4 @@ public class UserEntity { @OneToOne(cascade = jakarta.persistence.CascadeType.ALL, fetch = jakarta.persistence.FetchType.LAZY) @jakarta.persistence.PrimaryKeyJoinColumn private UserSettingsEntity settings; -} \ No newline at end of file +} diff --git a/src/main/java/auth_service/domain/user/persistence/entities/UserSettingsEntity.java b/src/main/java/auth_service/modules/user/persistence/entities/UserSettingsEntity.java similarity index 90% rename from src/main/java/auth_service/domain/user/persistence/entities/UserSettingsEntity.java rename to src/main/java/auth_service/modules/user/persistence/entities/UserSettingsEntity.java index 16ced69..b0f2562 100644 --- a/src/main/java/auth_service/domain/user/persistence/entities/UserSettingsEntity.java +++ b/src/main/java/auth_service/modules/user/persistence/entities/UserSettingsEntity.java @@ -1,4 +1,4 @@ -package auth_service.domain.user.persistence.entities; +package auth_service.modules.user.persistence.entities; import jakarta.persistence.Column; import jakarta.persistence.Entity; @@ -23,4 +23,4 @@ public class UserSettingsEntity { @Column(nullable = false) private String theme; -} \ No newline at end of file +} diff --git a/src/main/java/auth_service/domain/user/persistence/mapper/EntityMapper.java b/src/main/java/auth_service/modules/user/persistence/mapper/EntityMapper.java similarity index 84% rename from src/main/java/auth_service/domain/user/persistence/mapper/EntityMapper.java rename to src/main/java/auth_service/modules/user/persistence/mapper/EntityMapper.java index 2f24fe7..2177322 100644 --- a/src/main/java/auth_service/domain/user/persistence/mapper/EntityMapper.java +++ b/src/main/java/auth_service/modules/user/persistence/mapper/EntityMapper.java @@ -1,9 +1,9 @@ -package auth_service.domain.user.persistence.mapper; +package auth_service.modules.user.persistence.mapper; -import auth_service.domain.user.model.User; -import auth_service.domain.user.model.UserSettings; -import auth_service.domain.user.persistence.entities.UserEntity; -import auth_service.domain.user.persistence.entities.UserSettingsEntity; +import auth_service.modules.user.model.User; +import auth_service.modules.user.model.UserSettings; +import auth_service.modules.user.persistence.entities.UserEntity; +import auth_service.modules.user.persistence.entities.UserSettingsEntity; public abstract class EntityMapper { @@ -49,4 +49,4 @@ public abstract class EntityMapper { entity.setTheme(settings.getTheme()); return entity; } -} \ No newline at end of file +} diff --git a/src/main/java/auth_service/domain/user/service/UserService.java b/src/main/java/auth_service/modules/user/service/UserService.java similarity index 82% rename from src/main/java/auth_service/domain/user/service/UserService.java rename to src/main/java/auth_service/modules/user/service/UserService.java index 9869eeb..7cee95d 100644 --- a/src/main/java/auth_service/domain/user/service/UserService.java +++ b/src/main/java/auth_service/modules/user/service/UserService.java @@ -1,9 +1,9 @@ -package auth_service.domain.user.service; +package auth_service.modules.user.service; -import auth_service.domain.user.exception.UserNotFoundException; -import auth_service.domain.user.model.User; -import auth_service.domain.user.model.UserSettings; -import auth_service.domain.user.persistence.UserRepository; +import auth_service.modules.user.exception.UserNotFoundException; +import auth_service.modules.user.model.User; +import auth_service.modules.user.model.UserSettings; +import auth_service.modules.user.persistence.UserRepository; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.springframework.cache.annotation.Cacheable; @@ -38,4 +38,4 @@ public class UserService { } log.info("User settings has been updated!"); } -} \ No newline at end of file +} diff --git a/src/main/java/auth_service/shared/controller/dto/response/ErrorResponse.java b/src/main/java/auth_service/shared/api/dto/response/ErrorResponse.java similarity index 69% rename from src/main/java/auth_service/shared/controller/dto/response/ErrorResponse.java rename to src/main/java/auth_service/shared/api/dto/response/ErrorResponse.java index f5872e4..1de58e6 100644 --- a/src/main/java/auth_service/shared/controller/dto/response/ErrorResponse.java +++ b/src/main/java/auth_service/shared/api/dto/response/ErrorResponse.java @@ -1,12 +1,13 @@ -package auth_service.shared.controller.dto.response; +package auth_service.shared.api.dto.response; import org.jspecify.annotations.NonNull; /** - * Shared error response record for all domains. + * Shared error response record for all modules. * * @param code A machine-readable error code. * @param message A human-readable error message. */ public record ErrorResponse(@NonNull String code, @NonNull String message) { } + diff --git a/src/main/java/auth_service/shared/security/UserPrincipal.java b/src/main/java/auth_service/shared/security/UserPrincipal.java index 20ff95f..e70f820 100644 --- a/src/main/java/auth_service/shared/security/UserPrincipal.java +++ b/src/main/java/auth_service/shared/security/UserPrincipal.java @@ -15,4 +15,4 @@ public record UserPrincipal( public long getIdAsLong() { return Long.parseLong(id); } -} \ No newline at end of file +} diff --git a/src/test/java/auth_service/AuthServiceApplicationTests.java b/src/test/java/auth_service/AuthServiceApplicationTests.java index c8bc724..195afb7 100644 --- a/src/test/java/auth_service/AuthServiceApplicationTests.java +++ b/src/test/java/auth_service/AuthServiceApplicationTests.java @@ -10,4 +10,4 @@ class AuthServiceApplicationTests extends AbstractIntegrationTest { // If the context fails to load (e.g. Flyway migration fails or beans are missing), // this test will fail automatically. No explicit assertions needed. } -} \ No newline at end of file +} diff --git a/src/test/java/auth_service/architecture/ArchitectureTest.java b/src/test/java/auth_service/architecture/ArchitectureTest.java index e59cdae..f7456be 100644 --- a/src/test/java/auth_service/architecture/ArchitectureTest.java +++ b/src/test/java/auth_service/architecture/ArchitectureTest.java @@ -11,31 +11,31 @@ import static com.tngtech.archunit.lang.syntax.ArchRuleDefinition.classes; import static com.tngtech.archunit.lang.syntax.ArchRuleDefinition.noClasses; /** - * ArchUnit tests to enforce Clean Architecture and package boundaries. + * ArchUnit tests to enforce Hexagonal Architecture and package boundaries. * Analyzes all classes in the 'auth_service' package, ignoring test classes. */ @AnalyzeClasses(packages = "auth_service", importOptions = ImportOption.DoNotIncludeTests.class) class ArchitectureTest extends AbstractArchitectureTest { // =================================================================================== - // 1. DOMAIN INDEPENDENCE (Slices) + // 1. MODULE INDEPENDENCE (Slices) // =================================================================================== @ArchTest - static final ArchRule domains_should_not_depend_on_each_other = SlicesRuleDefinition.slices() - .matching("auth_service.domain.(*)..") + static final ArchRule modules_should_not_depend_on_each_other = SlicesRuleDefinition.slices() + .matching("auth_service.modules.(*)..") .should().notDependOnEachOther() - .because("Domains (e.g. login, user) should be strictly isolated and independent."); + .because("Modules (e.g. login, user) should be strictly isolated and independent."); // =================================================================================== - // 2. CLEAN ARCHITECTURE DEPENDENCY DIRECTION (Inside out) + // 2. HEXAGONAL ARCHITECTURE DEPENDENCY DIRECTION (Inside out) // =================================================================================== @ArchTest static final ArchRule domain_core_should_not_depend_on_outside = noClasses() .that().resideInAnyPackage("..model..", "..service..") - .should().dependOnClassesThat().resideInAnyPackage("..controller..", "..persistence.entities..", "..persistence.mapper..") - .because("Domain core (Models, Services) must not depend on Web/Controller or Persistence details."); + .should().dependOnClassesThat().resideInAnyPackage("..api..", "..persistence.entities..", "..persistence.mapper..") + .because("Domain core (Models, Services) must not depend on API or Persistence details."); @ArchTest static final ArchRule persistence_interfaces_belong_to_domain = classes() @@ -49,16 +49,16 @@ class ArchitectureTest extends AbstractArchitectureTest { // =================================================================================== @ArchTest - static final ArchRule dtos_should_only_be_used_in_controllers = classes() - .that().resideInAPackage("..controller.dto..") - .should().onlyBeAccessed().byAnyPackage("..controller..") - .because("DTOs are Web/API concerns and must not leak into Services or Persistence."); + static final ArchRule dtos_should_only_be_used_in_api = classes() + .that().resideInAPackage("..api.dto..") + .should().onlyBeAccessed().byAnyPackage("..api..") + .because("DTOs are API concerns and must not leak into Services or Persistence."); @ArchTest static final ArchRule entities_should_only_be_used_in_persistence = classes() .that().resideInAPackage("..persistence.entities..") .should().onlyBeAccessed().byAnyPackage("..persistence..") - .because("Database Entities must not leak into the Domain Core or Controllers."); + .because("Database Entities must not leak into the Domain Core or APIs."); // =================================================================================== // 4. ADDITIONAL BEST PRACTICES @@ -71,28 +71,28 @@ class ArchitectureTest extends AbstractArchitectureTest { .because("Cyclic dependencies make the code unmaintainable and tightly coupled."); @ArchTest - static final ArchRule controllers_should_only_call_services = noClasses() - .that().resideInAPackage("..controller..") + static final ArchRule apis_should_only_call_services = noClasses() + .that().resideInAPackage("..api..") .should().dependOnClassesThat().resideInAPackage("..persistence..") - .because("Controllers must delegate to Services and should not access Persistence directly."); + .because("APIs must delegate to Services and should not access Persistence directly."); @ArchTest - static final ArchRule persistence_should_not_depend_on_controllers = noClasses() + static final ArchRule persistence_should_not_depend_on_apis = noClasses() .that().resideInAPackage("..persistence..") - .should().dependOnClassesThat().resideInAPackage("..controller..") - .because("Persistence layer must be independent of the Web/Controller layer."); + .should().dependOnClassesThat().resideInAPackage("..api..") + .because("Persistence layer must be independent of the API layer."); @ArchTest static final ArchRule exceptions_should_be_isolated = noClasses() .that().resideInAPackage("..exception..") - .should().dependOnClassesThat().resideInAnyPackage("..controller..", "..persistence.entities..") + .should().dependOnClassesThat().resideInAnyPackage("..api..", "..persistence.entities..") .because("Exceptions should be part of the domain core and independent of infrastructure details."); @ArchTest - static final ArchRule configuration_should_not_be_accessed_by_domain = noClasses() - .that().resideInAnyPackage("..domain..") + static final ArchRule configuration_should_not_be_accessed_by_modules = noClasses() + .that().resideInAnyPackage("..modules..") .should().dependOnClassesThat().resideInAPackage("auth_service.configuration..") - .because("Domain logic should not depend on Spring configuration classes."); + .because("Module logic should not depend on global Spring configuration classes."); @ArchTest static final ArchRule services_should_be_annotated = classes() @@ -106,17 +106,17 @@ class ArchitectureTest extends AbstractArchitectureTest { // =================================================================================== @ArchTest - static final ArchRule shared_should_not_depend_on_domains = noClasses() + static final ArchRule shared_should_not_depend_on_modules = noClasses() .that().resideInAPackage("auth_service.shared..") - .should().dependOnClassesThat().resideInAPackage("auth_service.domain..") - .because("Shared classes should be independent of specific domains."); + .should().dependOnClassesThat().resideInAPackage("auth_service.modules..") + .because("Shared classes should be independent of specific modules."); @ArchTest - static final ArchRule controllers_should_be_annotated = classes() - .that().resideInAPackage("..controller..") + static final ArchRule apis_should_be_annotated = classes() + .that().resideInAPackage("..api..") .and().haveSimpleNameEndingWith("Controller") .should().beAnnotatedWith(org.springframework.web.bind.annotation.RestController.class) .orShould().beAnnotatedWith(org.springframework.web.bind.annotation.ControllerAdvice.class) .orShould().beAnnotatedWith(org.springframework.web.bind.annotation.RestControllerAdvice.class) - .because("Classes named *Controller should be registered as Spring @RestController or @ControllerAdvice or @RestControllerAdvice beans."); -} \ No newline at end of file + .because("Classes in 'api' package should be registered as Spring @RestController or @ControllerAdvice or @RestControllerAdvice beans."); +} diff --git a/src/test/java/auth_service/configuration/security/JwtServiceTest.java b/src/test/java/auth_service/configuration/security/JwtServiceTest.java index fcad287..bae0036 100644 --- a/src/test/java/auth_service/configuration/security/JwtServiceTest.java +++ b/src/test/java/auth_service/configuration/security/JwtServiceTest.java @@ -91,4 +91,4 @@ class JwtServiceTest extends AbstractUnitTest { // Assert assertFalse(isValid); } -} \ No newline at end of file +} diff --git a/src/test/java/auth_service/domain/login/controller/LoginControllerTest.java b/src/test/java/auth_service/modules/login/api/LoginControllerTest.java similarity index 88% rename from src/test/java/auth_service/domain/login/controller/LoginControllerTest.java rename to src/test/java/auth_service/modules/login/api/LoginControllerTest.java index 07d2d9e..84a8a4c 100644 --- a/src/test/java/auth_service/domain/login/controller/LoginControllerTest.java +++ b/src/test/java/auth_service/modules/login/api/LoginControllerTest.java @@ -1,72 +1,72 @@ -package auth_service.domain.login.controller; - -import auth_service.configuration.security.JwtAuthenticationFilter; -import auth_service.domain.login.controller.dto.request.LoginRequest; -import auth_service.domain.login.exception.InvalidCredentialsException; -import auth_service.domain.login.model.User; -import auth_service.domain.login.service.LoginService; -import auth_service.shared.test.AbstractWebMvcTest; -import org.junit.jupiter.api.Test; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.boot.test.autoconfigure.json.AutoConfigureJsonTesters; -import org.springframework.boot.test.json.JacksonTester; -import org.springframework.boot.webmvc.test.autoconfigure.AutoConfigureMockMvc; -import org.springframework.boot.webmvc.test.autoconfigure.WebMvcTest; -import org.springframework.http.MediaType; -import org.springframework.test.context.bean.override.mockito.MockitoBean; -import org.springframework.test.web.servlet.MockMvc; - -import static org.mockito.ArgumentMatchers.any; -import static org.mockito.Mockito.when; -import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.post; -import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.jsonPath; -import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status; - -/** - * Tests for LoginController. - */ -@WebMvcTest(LoginController.class) -@AutoConfigureMockMvc(addFilters = false) // Skip security filters for simple controller test -@AutoConfigureJsonTesters -class LoginControllerTest extends AbstractWebMvcTest { - - @Autowired - private MockMvc mockMvc; - - @MockitoBean - private LoginService loginService; - - @MockitoBean - private JwtAuthenticationFilter jwtAuthenticationFilter; // Needed because it's used in SecurityConfig - - @Autowired - private JacksonTester loginRequestJson; - - @Test - void login_Success() throws Exception { - // Arrange - var request = new LoginRequest("test@example.com", "password"); - when(loginService.login(any(User.class))).thenReturn("mock-token"); - - // Act & Assert - mockMvc.perform(post("/api/auth/login") - .contentType(MediaType.APPLICATION_JSON) - .content(loginRequestJson.write(request).getJson())) - .andExpect(status().isOk()) - .andExpect(jsonPath("$.message").value("Login successful")) - .andExpect(jsonPath("$.token").value("mock-token")); - } - - @Test - void login_Failure() throws Exception { - // Arrange - var request = new LoginRequest("test@example.com", "wrong-password"); - when(loginService.login(any(User.class))).thenThrow(new InvalidCredentialsException("Invalid credentials")); - - // Act & Assert - mockMvc.perform(post("/api/auth/login") - .contentType(MediaType.APPLICATION_JSON) - .content(loginRequestJson.write(request).getJson())) - .andExpect(status().isUnauthorized()); - } -} \ No newline at end of file +package auth_service.modules.login.api; + +import auth_service.configuration.security.JwtAuthenticationFilter; +import auth_service.modules.login.api.dto.request.LoginRequest; +import auth_service.modules.login.exception.InvalidCredentialsException; +import auth_service.modules.login.model.User; +import auth_service.modules.login.service.LoginService; +import auth_service.shared.test.AbstractWebMvcTest; +import org.junit.jupiter.api.Test; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.test.autoconfigure.json.AutoConfigureJsonTesters; +import org.springframework.boot.test.json.JacksonTester; +import org.springframework.boot.webmvc.test.autoconfigure.AutoConfigureMockMvc; +import org.springframework.boot.webmvc.test.autoconfigure.WebMvcTest; +import org.springframework.http.MediaType; +import org.springframework.test.context.bean.override.mockito.MockitoBean; +import org.springframework.test.web.servlet.MockMvc; + +import static org.mockito.ArgumentMatchers.any; +import static org.mockito.Mockito.when; +import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.post; +import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.jsonPath; +import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status; + +/** + * Tests for LoginController. + */ +@WebMvcTest(LoginController.class) +@AutoConfigureMockMvc(addFilters = false) // Skip security filters for simple controller test +@AutoConfigureJsonTesters +class LoginControllerTest extends AbstractWebMvcTest { + + @Autowired + private MockMvc mockMvc; + + @MockitoBean + private LoginService loginService; + + @MockitoBean + private JwtAuthenticationFilter jwtAuthenticationFilter; // Needed because it's used in SecurityConfig + + @Autowired + private JacksonTester loginRequestJson; + + @Test + void login_Success() throws Exception { + // Arrange + var request = new LoginRequest("test@example.com", "password"); + when(loginService.login(any(User.class))).thenReturn("mock-token"); + + // Act & Assert + mockMvc.perform(post("/api/auth/login") + .contentType(MediaType.APPLICATION_JSON) + .content(loginRequestJson.write(request).getJson())) + .andExpect(status().isOk()) + .andExpect(jsonPath("$.message").value("Login successful")) + .andExpect(jsonPath("$.token").value("mock-token")); + } + + @Test + void login_Failure() throws Exception { + // Arrange + var request = new LoginRequest("test@example.com", "wrong-password"); + when(loginService.login(any(User.class))).thenThrow(new InvalidCredentialsException("Invalid credentials")); + + // Act & Assert + mockMvc.perform(post("/api/auth/login") + .contentType(MediaType.APPLICATION_JSON) + .content(loginRequestJson.write(request).getJson())) + .andExpect(status().isUnauthorized()); + } +} diff --git a/src/test/java/auth_service/domain/login/persistence/MinimalUserRepositoryTest.java b/src/test/java/auth_service/modules/login/persistence/MinimalUserRepositoryTest.java similarity index 93% rename from src/test/java/auth_service/domain/login/persistence/MinimalUserRepositoryTest.java rename to src/test/java/auth_service/modules/login/persistence/MinimalUserRepositoryTest.java index 77a8858..043a99d 100644 --- a/src/test/java/auth_service/domain/login/persistence/MinimalUserRepositoryTest.java +++ b/src/test/java/auth_service/modules/login/persistence/MinimalUserRepositoryTest.java @@ -1,6 +1,6 @@ -package auth_service.domain.login.persistence; +package auth_service.modules.login.persistence; -import auth_service.domain.login.persistence.entities.MinimalUserEntity; +import auth_service.modules.login.persistence.entities.MinimalUserEntity; import auth_service.shared.test.AbstractPersistenceTest; import org.junit.jupiter.api.Test; import org.springframework.beans.factory.annotation.Autowired; @@ -57,4 +57,4 @@ class MinimalUserRepositoryTest extends AbstractPersistenceTest { var updated = entityManager.find(MinimalUserEntity.class, entity.getId()); assertNotNull(updated.getLastLoginDate()); } -} \ No newline at end of file +} diff --git a/src/test/java/auth_service/domain/login/service/LoginServiceTest.java b/src/test/java/auth_service/modules/login/service/LoginServiceTest.java similarity index 86% rename from src/test/java/auth_service/domain/login/service/LoginServiceTest.java rename to src/test/java/auth_service/modules/login/service/LoginServiceTest.java index f784926..4a35575 100644 --- a/src/test/java/auth_service/domain/login/service/LoginServiceTest.java +++ b/src/test/java/auth_service/modules/login/service/LoginServiceTest.java @@ -1,88 +1,88 @@ -package auth_service.domain.login.service; - -import auth_service.domain.login.exception.InvalidCredentialsException; -import auth_service.domain.login.exception.UserNotFoundException; -import auth_service.domain.login.model.User; -import auth_service.domain.login.persistence.MinimalUserRepository; -import auth_service.shared.test.AbstractUnitTest; -import org.junit.jupiter.api.BeforeEach; -import org.junit.jupiter.api.Test; -import org.mockito.InjectMocks; -import org.mockito.Mock; -import org.springframework.security.crypto.password.PasswordEncoder; - -import java.util.Optional; - -import static org.junit.jupiter.api.Assertions.assertEquals; -import static org.junit.jupiter.api.Assertions.assertThrows; -import static org.mockito.Mockito.when; - -/** - * Tests for LoginService. - */ -class LoginServiceTest extends AbstractUnitTest { - - @Mock - private MinimalUserRepository minimalUserRepository; - - @Mock - private PasswordEncoder passwordEncoder; - - @Mock - private TokenGenerator tokenGenerator; - - @InjectMocks - private LoginService loginService; - - private User user; - - @BeforeEach - void setUp() { - user = User.builder() - .email("test@example.com") - .password("password") - .build(); - } - - @Test - void login_Success() { - // Arrange - var dbUser = User.builder() - .id(815L) - .email("test@example.com") - .password("encodedPassword") - .build(); - when(minimalUserRepository.findByEmail(user.getEmail())).thenReturn(Optional.of(dbUser)); - when(passwordEncoder.matches(user.getPassword(), dbUser.getPassword())).thenReturn(true); - when(tokenGenerator.generateToken("815", "test@example.com")).thenReturn("mock-token"); - - // Act - var result = loginService.login(user); - - // Assert - assertEquals("mock-token", result); - } - - @Test - void login_UserNotFound() { - // Arrange - when(minimalUserRepository.findByEmail(user.getEmail())).thenReturn(Optional.empty()); - - // Act & Assert - assertThrows(UserNotFoundException.class, () -> loginService.login(user)); - } - - @Test - void login_InvalidCredentials() { - // Arrange - var dbUser = User.builder() - .email("test@example.com") - .password("encodedPassword") - .build(); - when(minimalUserRepository.findByEmail(user.getEmail())).thenReturn(Optional.of(dbUser)); - when(passwordEncoder.matches(user.getPassword(), dbUser.getPassword())).thenReturn(false); - - // Act & Assert - assertThrows(InvalidCredentialsException.class, () -> loginService.login(user)); - } -} \ No newline at end of file +package auth_service.modules.login.service; + +import auth_service.modules.login.exception.InvalidCredentialsException; +import auth_service.modules.login.exception.UserNotFoundException; +import auth_service.modules.login.model.User; +import auth_service.modules.login.persistence.MinimalUserRepository; +import auth_service.shared.test.AbstractUnitTest; +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Test; +import org.mockito.InjectMocks; +import org.mockito.Mock; +import org.springframework.security.crypto.password.PasswordEncoder; + +import java.util.Optional; + +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.assertThrows; +import static org.mockito.Mockito.when; + +/** + * Tests for LoginService. + */ +class LoginServiceTest extends AbstractUnitTest { + + @Mock + private MinimalUserRepository minimalUserRepository; + + @Mock + private PasswordEncoder passwordEncoder; + + @Mock + private TokenGenerator tokenGenerator; + + @InjectMocks + private LoginService loginService; + + private User user; + + @BeforeEach + void setUp() { + user = User.builder() + .email("test@example.com") + .password("password") + .build(); + } + + @Test + void login_Success() { + // Arrange + var dbUser = User.builder() + .id(815L) + .email("test@example.com") + .password("encodedPassword") + .build(); + when(minimalUserRepository.findByEmail(user.getEmail())).thenReturn(Optional.of(dbUser)); + when(passwordEncoder.matches(user.getPassword(), dbUser.getPassword())).thenReturn(true); + when(tokenGenerator.generateToken("815", "test@example.com")).thenReturn("mock-token"); + + // Act + var result = loginService.login(user); + + // Assert + assertEquals("mock-token", result); + } + + @Test + void login_UserNotFound() { + // Arrange + when(minimalUserRepository.findByEmail(user.getEmail())).thenReturn(Optional.empty()); + + // Act & Assert + assertThrows(UserNotFoundException.class, () -> loginService.login(user)); + } + + @Test + void login_InvalidCredentials() { + // Arrange + var dbUser = User.builder() + .email("test@example.com") + .password("encodedPassword") + .build(); + when(minimalUserRepository.findByEmail(user.getEmail())).thenReturn(Optional.of(dbUser)); + when(passwordEncoder.matches(user.getPassword(), dbUser.getPassword())).thenReturn(false); + + // Act & Assert + assertThrows(InvalidCredentialsException.class, () -> loginService.login(user)); + } +} diff --git a/src/test/java/auth_service/domain/registration/controller/RegistrationControllerTest.java b/src/test/java/auth_service/modules/registration/api/RegistrationControllerTest.java similarity index 91% rename from src/test/java/auth_service/domain/registration/controller/RegistrationControllerTest.java rename to src/test/java/auth_service/modules/registration/api/RegistrationControllerTest.java index cefddf0..a87f266 100644 --- a/src/test/java/auth_service/domain/registration/controller/RegistrationControllerTest.java +++ b/src/test/java/auth_service/modules/registration/api/RegistrationControllerTest.java @@ -1,11 +1,11 @@ -package auth_service.domain.registration.controller; +package auth_service.modules.registration.api; import auth_service.configuration.security.JwtAuthenticationFilter; import auth_service.configuration.security.JwtService; -import auth_service.domain.registration.controller.dto.request.RegistrationRequest; -import auth_service.domain.registration.exception.EmailAlreadyInUseException; -import auth_service.domain.registration.model.Registration; -import auth_service.domain.registration.service.RegistrationService; +import auth_service.modules.registration.api.dto.request.RegistrationRequest; +import auth_service.modules.registration.exception.EmailAlreadyInUseException; +import auth_service.modules.registration.model.Registration; +import auth_service.modules.registration.service.RegistrationService; import auth_service.shared.test.AbstractWebMvcTest; import org.junit.jupiter.api.Test; import org.springframework.beans.factory.annotation.Autowired; @@ -91,4 +91,4 @@ class RegistrationControllerTest extends AbstractWebMvcTest { .content(registrationRequestJson.write(request).getJson())) .andExpect(status().isBadRequest()); // Adjust status based on your @ExceptionHandler } -} \ No newline at end of file +} diff --git a/src/test/java/auth_service/domain/registration/persistence/RegisteredUserRepositoryTest.java b/src/test/java/auth_service/modules/registration/persistence/RegisteredUserRepositoryTest.java similarity index 92% rename from src/test/java/auth_service/domain/registration/persistence/RegisteredUserRepositoryTest.java rename to src/test/java/auth_service/modules/registration/persistence/RegisteredUserRepositoryTest.java index e0a13b5..67b20a5 100644 --- a/src/test/java/auth_service/domain/registration/persistence/RegisteredUserRepositoryTest.java +++ b/src/test/java/auth_service/modules/registration/persistence/RegisteredUserRepositoryTest.java @@ -1,7 +1,7 @@ -package auth_service.domain.registration.persistence; +package auth_service.modules.registration.persistence; -import auth_service.domain.registration.model.Registration; -import auth_service.domain.registration.persistence.entities.RegisteredUserEntity; +import auth_service.modules.registration.model.Registration; +import auth_service.modules.registration.persistence.entities.RegisteredUserEntity; import auth_service.shared.test.AbstractPersistenceTest; import org.junit.jupiter.api.Test; import org.springframework.beans.factory.annotation.Autowired; @@ -75,4 +75,4 @@ class RegisteredUserRepositoryTest extends AbstractPersistenceTest { assertNotNull(saved); assertEquals("save@example.com", saved.getEmail()); } -} \ No newline at end of file +} diff --git a/src/test/java/auth_service/domain/registration/service/RegistrationServiceTest.java b/src/test/java/auth_service/modules/registration/service/RegistrationServiceTest.java similarity index 89% rename from src/test/java/auth_service/domain/registration/service/RegistrationServiceTest.java rename to src/test/java/auth_service/modules/registration/service/RegistrationServiceTest.java index 2d07338..571b64e 100644 --- a/src/test/java/auth_service/domain/registration/service/RegistrationServiceTest.java +++ b/src/test/java/auth_service/modules/registration/service/RegistrationServiceTest.java @@ -1,10 +1,10 @@ -package auth_service.domain.registration.service; +package auth_service.modules.registration.service; -import auth_service.domain.registration.exception.EmailAlreadyInUseException; -import auth_service.domain.registration.exception.InvalidInvitationCodeException; -import auth_service.domain.registration.exception.SteamIdAlreadyRegisteredException; -import auth_service.domain.registration.model.Registration; -import auth_service.domain.registration.persistence.RegisteredUserRepository; +import auth_service.modules.registration.exception.EmailAlreadyInUseException; +import auth_service.modules.registration.exception.InvalidInvitationCodeException; +import auth_service.modules.registration.exception.SteamIdAlreadyRegisteredException; +import auth_service.modules.registration.model.Registration; +import auth_service.modules.registration.persistence.RegisteredUserRepository; import auth_service.shared.test.AbstractUnitTest; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; @@ -103,4 +103,4 @@ class RegistrationServiceTest extends AbstractUnitTest { verify(registeredUserRepository, never()).save(any()); } -} \ No newline at end of file +} diff --git a/src/test/java/auth_service/domain/user/controller/UserControllerTest.java b/src/test/java/auth_service/modules/user/api/UserControllerTest.java similarity index 90% rename from src/test/java/auth_service/domain/user/controller/UserControllerTest.java rename to src/test/java/auth_service/modules/user/api/UserControllerTest.java index d1b66a0..c068bc4 100644 --- a/src/test/java/auth_service/domain/user/controller/UserControllerTest.java +++ b/src/test/java/auth_service/modules/user/api/UserControllerTest.java @@ -1,113 +1,113 @@ -package auth_service.domain.user.controller; - -import auth_service.configuration.security.JwtAuthenticationFilter; -import auth_service.configuration.security.JwtService; -import auth_service.shared.security.UserPrincipal; -import auth_service.domain.user.controller.dto.request.UserSettingsRequest; -import auth_service.domain.user.exception.UserNotFoundException; -import auth_service.domain.user.model.User; -import auth_service.domain.user.model.UserSettings; -import auth_service.domain.user.service.UserService; -import auth_service.shared.test.AbstractWebMvcTest; -import org.junit.jupiter.api.AfterEach; -import org.junit.jupiter.api.Test; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.boot.test.autoconfigure.json.AutoConfigureJsonTesters; -import org.springframework.boot.test.json.JacksonTester; -import org.springframework.boot.webmvc.test.autoconfigure.AutoConfigureMockMvc; -import org.springframework.boot.webmvc.test.autoconfigure.WebMvcTest; -import org.springframework.http.MediaType; -import org.springframework.security.authentication.UsernamePasswordAuthenticationToken; -import org.springframework.security.core.context.SecurityContextHolder; -import org.springframework.test.context.bean.override.mockito.MockitoBean; -import org.springframework.test.web.servlet.MockMvc; - -import java.util.Collections; - -import static org.mockito.ArgumentMatchers.*; -import static org.mockito.Mockito.verify; -import static org.mockito.Mockito.when; -import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.get; -import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.put; -import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.jsonPath; -import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status; - -@WebMvcTest(UserController.class) -@AutoConfigureMockMvc(addFilters = false) -@AutoConfigureJsonTesters -class UserControllerTest extends AbstractWebMvcTest { - - @Autowired - private MockMvc mockMvc; - - @MockitoBean - private UserService userService; - - @MockitoBean - private JwtService jwtService; - - @MockitoBean - private JwtAuthenticationFilter jwtAuthenticationFilter; - - @Autowired - private JacksonTester userSettingsRequestJson; - - @AfterEach - void tearDown() { - SecurityContextHolder.clearContext(); - } - - @Test - void getCurrentUserV1_Success() throws Exception { - // Arrange - var email = "test@example.com"; - var settings = UserSettings.builder().language("en").theme("dark").build(); - var user = User.builder().email(email).settings(settings).build(); - var principal = new UserPrincipal("1", email); - SecurityContextHolder.getContext().setAuthentication( - new UsernamePasswordAuthenticationToken(principal, null, Collections.emptyList()) - ); - when(userService.getUserByEmail(email)).thenReturn(user); - - // Act & Assert - mockMvc.perform(get("/api/users/me") - .accept(MediaType.APPLICATION_JSON)) - .andExpect(status().isOk()) - .andExpect(jsonPath("$.email").value(email)); - } - - @Test - void getCurrentUserV1_NotFound() throws Exception { - // Arrange - var email = "notfound@example.com"; - var principal = new UserPrincipal("1", email); - SecurityContextHolder.getContext().setAuthentication( - new UsernamePasswordAuthenticationToken(principal, null, Collections.emptyList()) - ); - when(userService.getUserByEmail(email)).thenThrow(new UserNotFoundException("User not found")); - - // Act & Assert - mockMvc.perform(get("/api/users/me") - .accept(MediaType.APPLICATION_JSON)) - .andExpect(status().isNotFound()); - } - - @Test - void updateUserSettings_Success() throws Exception { - // Arrange - var email = "test@example.com"; - var principal = new UserPrincipal("1", email); - SecurityContextHolder.getContext().setAuthentication( - new UsernamePasswordAuthenticationToken(principal, null, Collections.emptyList()) - ); - var request = new UserSettingsRequest(true, "en", 123456789L); - - // Act & Assert - mockMvc.perform(put("/api/users/settings") - .contentType(MediaType.APPLICATION_JSON) - .content(userSettingsRequestJson.write(request).getJson())) - .andExpect(status().isOk()); - - verify(userService).updateUserSettings(eq(1L), eq(123456789L), any()); - } -} \ No newline at end of file +package auth_service.modules.user.api; + +import auth_service.configuration.security.JwtAuthenticationFilter; +import auth_service.configuration.security.JwtService; +import auth_service.shared.security.UserPrincipal; +import auth_service.modules.user.api.dto.request.UserSettingsRequest; +import auth_service.modules.user.exception.UserNotFoundException; +import auth_service.modules.user.model.User; +import auth_service.modules.user.model.UserSettings; +import auth_service.modules.user.service.UserService; +import auth_service.shared.test.AbstractWebMvcTest; +import org.junit.jupiter.api.AfterEach; +import org.junit.jupiter.api.Test; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.test.autoconfigure.json.AutoConfigureJsonTesters; +import org.springframework.boot.test.json.JacksonTester; +import org.springframework.boot.webmvc.test.autoconfigure.AutoConfigureMockMvc; +import org.springframework.boot.webmvc.test.autoconfigure.WebMvcTest; +import org.springframework.http.MediaType; +import org.springframework.security.authentication.UsernamePasswordAuthenticationToken; +import org.springframework.security.core.context.SecurityContextHolder; +import org.springframework.test.context.bean.override.mockito.MockitoBean; +import org.springframework.test.web.servlet.MockMvc; + +import java.util.Collections; + +import static org.mockito.ArgumentMatchers.*; +import static org.mockito.Mockito.verify; +import static org.mockito.Mockito.when; +import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.get; +import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.put; +import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.jsonPath; +import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status; + +@WebMvcTest(UserController.class) +@AutoConfigureMockMvc(addFilters = false) +@AutoConfigureJsonTesters +class UserControllerTest extends AbstractWebMvcTest { + + @Autowired + private MockMvc mockMvc; + + @MockitoBean + private UserService userService; + + @MockitoBean + private JwtService jwtService; + + @MockitoBean + private JwtAuthenticationFilter jwtAuthenticationFilter; + + @Autowired + private JacksonTester userSettingsRequestJson; + + @AfterEach + void tearDown() { + SecurityContextHolder.clearContext(); + } + + @Test + void getCurrentUserV1_Success() throws Exception { + // Arrange + var email = "test@example.com"; + var settings = UserSettings.builder().language("en").theme("dark").build(); + var user = User.builder().email(email).settings(settings).build(); + var principal = new UserPrincipal("1", email); + SecurityContextHolder.getContext().setAuthentication( + new UsernamePasswordAuthenticationToken(principal, null, Collections.emptyList()) + ); + when(userService.getUserByEmail(email)).thenReturn(user); + + // Act & Assert + mockMvc.perform(get("/api/users/me") + .accept(MediaType.APPLICATION_JSON)) + .andExpect(status().isOk()) + .andExpect(jsonPath("$.email").value(email)); + } + + @Test + void getCurrentUserV1_NotFound() throws Exception { + // Arrange + var email = "notfound@example.com"; + var principal = new UserPrincipal("1", email); + SecurityContextHolder.getContext().setAuthentication( + new UsernamePasswordAuthenticationToken(principal, null, Collections.emptyList()) + ); + when(userService.getUserByEmail(email)).thenThrow(new UserNotFoundException("User not found")); + + // Act & Assert + mockMvc.perform(get("/api/users/me") + .accept(MediaType.APPLICATION_JSON)) + .andExpect(status().isNotFound()); + } + + @Test + void updateUserSettings_Success() throws Exception { + // Arrange + var email = "test@example.com"; + var principal = new UserPrincipal("1", email); + SecurityContextHolder.getContext().setAuthentication( + new UsernamePasswordAuthenticationToken(principal, null, Collections.emptyList()) + ); + var request = new UserSettingsRequest(true, "en", 123456789L); + + // Act & Assert + mockMvc.perform(put("/api/users/settings") + .contentType(MediaType.APPLICATION_JSON) + .content(userSettingsRequestJson.write(request).getJson())) + .andExpect(status().isOk()); + + verify(userService).updateUserSettings(eq(1L), eq(123456789L), any()); + } +} diff --git a/src/test/java/auth_service/domain/user/persistence/UserRepositoryTest.java b/src/test/java/auth_service/modules/user/persistence/UserRepositoryTest.java similarity index 93% rename from src/test/java/auth_service/domain/user/persistence/UserRepositoryTest.java rename to src/test/java/auth_service/modules/user/persistence/UserRepositoryTest.java index d4bf972..e45bd58 100644 --- a/src/test/java/auth_service/domain/user/persistence/UserRepositoryTest.java +++ b/src/test/java/auth_service/modules/user/persistence/UserRepositoryTest.java @@ -1,7 +1,7 @@ -package auth_service.domain.user.persistence; +package auth_service.modules.user.persistence; -import auth_service.domain.user.model.UserSettings; -import auth_service.domain.user.persistence.entities.UserEntity; +import auth_service.modules.user.model.UserSettings; +import auth_service.modules.user.persistence.entities.UserEntity; import auth_service.shared.test.AbstractPersistenceTest; import org.junit.jupiter.api.Test; import org.springframework.beans.factory.annotation.Autowired; @@ -73,4 +73,4 @@ class UserRepositoryTest extends AbstractPersistenceTest { assertNotNull(updatedUser.getSettings()); assertEquals("de", updatedUser.getSettings().getLanguage()); } -} \ No newline at end of file +} diff --git a/src/test/java/auth_service/domain/user/service/UserServiceTest.java b/src/test/java/auth_service/modules/user/service/UserServiceTest.java similarity index 83% rename from src/test/java/auth_service/domain/user/service/UserServiceTest.java rename to src/test/java/auth_service/modules/user/service/UserServiceTest.java index 07cb177..39571d6 100644 --- a/src/test/java/auth_service/domain/user/service/UserServiceTest.java +++ b/src/test/java/auth_service/modules/user/service/UserServiceTest.java @@ -1,67 +1,67 @@ -package auth_service.domain.user.service; - -import auth_service.domain.user.exception.UserNotFoundException; -import auth_service.domain.user.model.User; -import auth_service.domain.user.model.UserSettings; -import auth_service.domain.user.persistence.UserRepository; -import auth_service.shared.test.AbstractUnitTest; -import org.junit.jupiter.api.Test; -import org.mockito.InjectMocks; -import org.mockito.Mock; - -import java.util.Optional; - -import static org.junit.jupiter.api.Assertions.assertEquals; -import static org.junit.jupiter.api.Assertions.assertThrows; -import static org.mockito.Mockito.*; - -/** - * Tests for UserService. - */ -class UserServiceTest extends AbstractUnitTest { - - @Mock - private UserRepository userRepository; - - @InjectMocks - private UserService userService; - - @Test - void getUserByEmail_Success() { - // Arrange - var email = "test@example.com"; - var user = User.builder().email(email).build(); - when(userRepository.findByEmail(email)).thenReturn(Optional.of(user)); - - // Act - var result = userService.getUserByEmail(email); - - // Assert - assertEquals(user, result); - } - - @Test - void getUserByEmail_NotFound() { - // Arrange - var email = "notfound@example.com"; - when(userRepository.findByEmail(email)).thenReturn(Optional.empty()); - - // Act & Assert - assertThrows(UserNotFoundException.class, () -> userService.getUserByEmail(email)); - } - - @Test - void updateUserSettings_Success() { - // Arrange - long userId = 1L; - long steamId = 123456789L; - var userSettings = UserSettings.builder().language("en").build(); - when(userRepository.updateSettings(userId, steamId, userSettings)).thenReturn(true); - - // Act - userService.updateUserSettings(userId, steamId, userSettings); - - // Assert - verify(userRepository, times(1)).updateSettings(userId, steamId, userSettings); - } -} \ No newline at end of file +package auth_service.modules.user.service; + +import auth_service.modules.user.exception.UserNotFoundException; +import auth_service.modules.user.model.User; +import auth_service.modules.user.model.UserSettings; +import auth_service.modules.user.persistence.UserRepository; +import auth_service.shared.test.AbstractUnitTest; +import org.junit.jupiter.api.Test; +import org.mockito.InjectMocks; +import org.mockito.Mock; + +import java.util.Optional; + +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.assertThrows; +import static org.mockito.Mockito.*; + +/** + * Tests for UserService. + */ +class UserServiceTest extends AbstractUnitTest { + + @Mock + private UserRepository userRepository; + + @InjectMocks + private UserService userService; + + @Test + void getUserByEmail_Success() { + // Arrange + var email = "test@example.com"; + var user = User.builder().email(email).build(); + when(userRepository.findByEmail(email)).thenReturn(Optional.of(user)); + + // Act + var result = userService.getUserByEmail(email); + + // Assert + assertEquals(user, result); + } + + @Test + void getUserByEmail_NotFound() { + // Arrange + var email = "notfound@example.com"; + when(userRepository.findByEmail(email)).thenReturn(Optional.empty()); + + // Act & Assert + assertThrows(UserNotFoundException.class, () -> userService.getUserByEmail(email)); + } + + @Test + void updateUserSettings_Success() { + // Arrange + long userId = 1L; + long steamId = 123456789L; + var userSettings = UserSettings.builder().language("en").build(); + when(userRepository.updateSettings(userId, steamId, userSettings)).thenReturn(true); + + // Act + userService.updateUserSettings(userId, steamId, userSettings); + + // Assert + verify(userRepository, times(1)).updateSettings(userId, steamId, userSettings); + } +} diff --git a/src/test/java/auth_service/shared/test/AbstractArchitectureTest.java b/src/test/java/auth_service/shared/test/AbstractArchitectureTest.java index 68a104a..7066149 100644 --- a/src/test/java/auth_service/shared/test/AbstractArchitectureTest.java +++ b/src/test/java/auth_service/shared/test/AbstractArchitectureTest.java @@ -8,3 +8,4 @@ import org.junit.jupiter.api.Tag; @Tag("ArchitectureTest") public abstract class AbstractArchitectureTest { } + diff --git a/src/test/java/auth_service/shared/test/AbstractIntegrationTest.java b/src/test/java/auth_service/shared/test/AbstractIntegrationTest.java index 6a7a3f0..dbf8ec2 100644 --- a/src/test/java/auth_service/shared/test/AbstractIntegrationTest.java +++ b/src/test/java/auth_service/shared/test/AbstractIntegrationTest.java @@ -22,3 +22,4 @@ public abstract class AbstractIntegrationTest { @ServiceConnection static PostgreSQLContainer postgres = new PostgreSQLContainer<>("postgres:17-alpine"); } + diff --git a/src/test/java/auth_service/shared/test/AbstractPersistenceTest.java b/src/test/java/auth_service/shared/test/AbstractPersistenceTest.java index baf0f6b..eb0d395 100644 --- a/src/test/java/auth_service/shared/test/AbstractPersistenceTest.java +++ b/src/test/java/auth_service/shared/test/AbstractPersistenceTest.java @@ -21,4 +21,4 @@ public abstract class AbstractPersistenceTest { @Container @ServiceConnection static PostgreSQLContainer postgres = new PostgreSQLContainer<>("postgres:17-alpine"); -} \ No newline at end of file +} diff --git a/src/test/java/auth_service/shared/test/AbstractUnitTest.java b/src/test/java/auth_service/shared/test/AbstractUnitTest.java index b64d454..908e258 100644 --- a/src/test/java/auth_service/shared/test/AbstractUnitTest.java +++ b/src/test/java/auth_service/shared/test/AbstractUnitTest.java @@ -12,3 +12,4 @@ import org.mockito.junit.jupiter.MockitoExtension; @ExtendWith(MockitoExtension.class) public abstract class AbstractUnitTest { } + diff --git a/src/test/java/auth_service/shared/test/AbstractWebMvcTest.java b/src/test/java/auth_service/shared/test/AbstractWebMvcTest.java index fbad2b9..01d6496 100644 --- a/src/test/java/auth_service/shared/test/AbstractWebMvcTest.java +++ b/src/test/java/auth_service/shared/test/AbstractWebMvcTest.java @@ -10,4 +10,4 @@ import org.springframework.boot.webmvc.test.autoconfigure.WebMvcTest; @Tag("WebMvcTest") @WebMvcTest public abstract class AbstractWebMvcTest { -} \ No newline at end of file +}