diff --git a/apigateway/src/main/java/vaultweb/apigateway/controller/GatewayAuthController.java b/apigateway/src/main/java/vaultweb/apigateway/controller/GatewayAuthController.java index edb8af4..f624aa4 100644 --- a/apigateway/src/main/java/vaultweb/apigateway/controller/GatewayAuthController.java +++ b/apigateway/src/main/java/vaultweb/apigateway/controller/GatewayAuthController.java @@ -12,6 +12,7 @@ import org.springframework.web.bind.annotation.RestController; import vaultweb.apigateway.dto.request.ChangePasswordRequest; +import vaultweb.apigateway.dto.request.ChangeUsernameRequest; import vaultweb.apigateway.dto.request.LoginRequest; import vaultweb.apigateway.dto.request.UserRegistrationRequest; import vaultweb.apigateway.dto.response.AuthResponse; @@ -60,9 +61,10 @@ public Mono logout() { return authService.logout(); } + @ResponseStatus(HttpStatus.OK) @PostMapping("change-username") - public String changeUsername() { - return "changeUsername"; + public Mono changeUsername(@Valid @RequestBody ChangeUsernameRequest request) { + return authService.changeUsername(request); } @PostMapping("change-email") @@ -70,6 +72,7 @@ public String changeEmail() { return "changeEmail"; } + @ResponseStatus(HttpStatus.OK) @PostMapping("change-password") public Mono changePassword(@Valid @RequestBody ChangePasswordRequest request) { return authService.changePassword(request); diff --git a/apigateway/src/main/java/vaultweb/apigateway/dto/request/ChangeUsernameRequest.java b/apigateway/src/main/java/vaultweb/apigateway/dto/request/ChangeUsernameRequest.java new file mode 100644 index 0000000..bf5f767 --- /dev/null +++ b/apigateway/src/main/java/vaultweb/apigateway/dto/request/ChangeUsernameRequest.java @@ -0,0 +1,6 @@ +package vaultweb.apigateway.dto.request; + +import jakarta.validation.constraints.NotEmpty; + +public record ChangeUsernameRequest( + @NotEmpty(message = "Your new username is required") String newUsername) {} diff --git a/apigateway/src/main/java/vaultweb/apigateway/service/auth/AuthService.java b/apigateway/src/main/java/vaultweb/apigateway/service/auth/AuthService.java index ce3aef0..daa6024 100644 --- a/apigateway/src/main/java/vaultweb/apigateway/service/auth/AuthService.java +++ b/apigateway/src/main/java/vaultweb/apigateway/service/auth/AuthService.java @@ -3,6 +3,7 @@ import org.springframework.stereotype.Service; import vaultweb.apigateway.dto.request.ChangePasswordRequest; +import vaultweb.apigateway.dto.request.ChangeUsernameRequest; import vaultweb.apigateway.dto.request.LoginRequest; import vaultweb.apigateway.dto.request.UserRegistrationRequest; import vaultweb.apigateway.dto.response.AuthResponse; @@ -128,6 +129,41 @@ public Mono changePassword(ChangePasswordRequest request) { }); } + public Mono changeUsername(ChangeUsernameRequest request) { + return securityContextUtil + .getAuthenticatedUsername() + .flatMap(userRepository::findByUsername) + .switchIfEmpty( + Mono.error( + new DefaultException( + "username from token has no registered user", + DefaultExceptionLevels.AUTHENTICATION_EXCEPTION))) + .flatMap( + user -> { + if (request.newUsername().equals(user.getUsername())) { + return Mono.error( + new DefaultException( + "You didn't change anything", DefaultExceptionLevels.DEFAULT_EXCEPTION)); + } + + return userRepository + .existsByUsername(request.newUsername()) + .flatMap( + usernameExists -> { + if (usernameExists) { + return Mono.error( + new DefaultException( + "User with username " + + request.newUsername() + + " already exists")); + } + + user.setUsername(request.newUsername()); + return userRepository.save(user).then(); + }); + }); + } + public Mono switchToken(String token) { // find refresh return refreshTokenRepository diff --git a/docker-compose.yml b/docker-compose.yml index 4b6da8d..9306509 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -10,7 +10,7 @@ services: POSTGRES_PASSWORD: password POSTGRES_DB: auth_gateway_db ports: - - "5433:5432" + - "5432:5432" volumes: - postgres_data:/var/lib/postgresql/data