-
Notifications
You must be signed in to change notification settings - Fork 0
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
Merge pull request #50 from Shaderock/3-ub-01-sign-up-user-into-appli…
…cation #3-ub-01-sign-up-user-into-application
- Loading branch information
Showing
21 changed files
with
333 additions
and
5 deletions.
There are no files selected for viewing
Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.
Oops, something went wrong.
Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.
Oops, something went wrong.
8 changes: 4 additions & 4 deletions
8
...ot_spring_boot_starter_data_jpa_3_0_0.xml → ...ot_spring_boot_starter_data_jpa_3_0_1.xml
Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.
Oops, something went wrong.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
50 changes: 50 additions & 0 deletions
50
backend/src/main/java/com/shaderock/backend/auth/registration/RegistrationController.java
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,50 @@ | ||
package com.shaderock.backend.auth.registration; | ||
|
||
import com.shaderock.backend.model.entity.user.AppUser; | ||
import jakarta.validation.Valid; | ||
import jakarta.validation.constraints.NotNull; | ||
import lombok.RequiredArgsConstructor; | ||
import org.springframework.beans.factory.annotation.Value; | ||
import org.springframework.http.HttpStatus; | ||
import org.springframework.http.ResponseEntity; | ||
import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder; | ||
import org.springframework.web.bind.annotation.PostMapping; | ||
import org.springframework.web.bind.annotation.RequestBody; | ||
import org.springframework.web.bind.annotation.RequestMapping; | ||
import org.springframework.web.bind.annotation.RequestParam; | ||
import org.springframework.web.bind.annotation.RestController; | ||
|
||
@RestController() | ||
@RequestMapping("/api/register") | ||
@RequiredArgsConstructor | ||
public class RegistrationController { | ||
private final RegistrationService registrationService; | ||
private final BCryptPasswordEncoder passwordEncoder; | ||
|
||
@Value(value = "${application.frontend.url}") | ||
private String frontendUrl; | ||
|
||
@PostMapping("/verify-user") | ||
public ResponseEntity<Boolean> isUserRegistered(@RequestParam @NotNull final String email) { | ||
return ResponseEntity.ok((registrationService.isUserRegistered(email))); | ||
} | ||
|
||
@PostMapping | ||
public ResponseEntity<Void> registerUser(@RequestBody @Valid final RegistrationForm registrationForm) { | ||
AppUser appUser = AppUser.builder() | ||
.email(registrationForm.getEmail()) | ||
.password(passwordEncoder.encode(registrationForm.getPassword())) | ||
.firstName(registrationForm.getFirstName()) | ||
.lastName(registrationForm.getLastName()) | ||
.build(); | ||
|
||
registrationService.registerUser(appUser); | ||
return ResponseEntity.noContent().build(); | ||
} | ||
|
||
@PostMapping("/confirm-email") | ||
public ResponseEntity<Void> confirmEmail(@RequestParam @NotNull String token) { | ||
registrationService.confirmEmail(token); | ||
return ResponseEntity.status(HttpStatus.FOUND).header("Location", frontendUrl).build(); | ||
} | ||
} |
15 changes: 15 additions & 0 deletions
15
...d/src/main/java/com/shaderock/backend/auth/registration/RegistrationControllerAdvice.java
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,15 @@ | ||
package com.shaderock.backend.auth.registration; | ||
|
||
import org.springframework.http.HttpStatus; | ||
import org.springframework.web.bind.annotation.ExceptionHandler; | ||
import org.springframework.web.bind.annotation.ResponseStatus; | ||
import org.springframework.web.bind.annotation.RestControllerAdvice; | ||
|
||
@RestControllerAdvice() | ||
public class RegistrationControllerAdvice { | ||
@ExceptionHandler(UserAlreadyRegisteredException.class) | ||
@ResponseStatus(HttpStatus.BAD_REQUEST) | ||
public UserRegisteredMessage userAlreadyRegistered(UserAlreadyRegisteredException userAlreadyRegisteredException) { | ||
return new UserRegisteredMessage(userAlreadyRegisteredException.getMessage()); | ||
} | ||
} |
26 changes: 26 additions & 0 deletions
26
backend/src/main/java/com/shaderock/backend/auth/registration/RegistrationForm.java
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,26 @@ | ||
package com.shaderock.backend.auth.registration; | ||
|
||
import jakarta.validation.constraints.Email; | ||
import jakarta.validation.constraints.NotBlank; | ||
import jakarta.validation.constraints.NotNull; | ||
import jakarta.validation.constraints.Size; | ||
import lombok.Data; | ||
|
||
@Data | ||
public class RegistrationForm { | ||
|
||
@NotNull(message = "Email is not provided") | ||
@NotBlank(message = "Email is empty") | ||
private String email; | ||
|
||
@NotNull(message = "Password is not provided") | ||
@Size(min = 8, max = 25, message = "Password is not between 8 and 25 characters length") | ||
private String password; | ||
@NotNull(message = "First name is not provided") | ||
@NotBlank(message = "First name is empty") | ||
private String firstName; | ||
@NotNull(message = "Last name is not provided") | ||
@NotBlank(message = "Last name is empty") | ||
private String lastName; | ||
} |
43 changes: 43 additions & 0 deletions
43
backend/src/main/java/com/shaderock/backend/auth/registration/RegistrationService.java
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,43 @@ | ||
package com.shaderock.backend.auth.registration; | ||
|
||
import com.shaderock.backend.messaging.exception.TokenNotFoundException; | ||
import com.shaderock.backend.model.entity.user.AppUser; | ||
import com.shaderock.backend.model.repository.AppUserRepository; | ||
import com.shaderock.backend.model.type.Role; | ||
import jakarta.transaction.Transactional; | ||
import lombok.RequiredArgsConstructor; | ||
import org.springframework.stereotype.Service; | ||
|
||
import java.util.Optional; | ||
import java.util.UUID; | ||
|
||
@Service | ||
@RequiredArgsConstructor | ||
public class RegistrationService { | ||
private final AppUserRepository userRepository; | ||
|
||
@Transactional | ||
public void registerUser(AppUser appUser) { | ||
if (isUserRegistered(appUser.getEmail())) { | ||
throw new UserAlreadyRegisteredException(appUser.getEmail()); | ||
} | ||
appUser.setRegistrationToken(UUID.randomUUID().toString()); | ||
userRepository.save(appUser); | ||
} | ||
|
||
public boolean isUserRegistered(String email) { | ||
Optional<AppUser> userOptional = userRepository.findByEmail(email); | ||
return userOptional.isPresent() && userOptional.get().isEnabled(); | ||
} | ||
|
||
@Transactional | ||
public void confirmEmail(String token) { | ||
Optional<AppUser> userOptional = userRepository.findByRegistrationToken(token); | ||
if (userOptional.isEmpty()) { | ||
throw new TokenNotFoundException(token); | ||
} | ||
|
||
userOptional.get().setEnabled(true); | ||
userOptional.get().getRoles().add(Role.USER); | ||
} | ||
} |
13 changes: 13 additions & 0 deletions
13
...src/main/java/com/shaderock/backend/auth/registration/UserAlreadyRegisteredException.java
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,13 @@ | ||
package com.shaderock.backend.auth.registration; | ||
|
||
import lombok.Getter; | ||
|
||
public class UserAlreadyRegisteredException extends RuntimeException { | ||
@Getter | ||
private final String email; | ||
|
||
public UserAlreadyRegisteredException(String email) { | ||
super(String.format("User with email=[%s] is already registered", email)); | ||
this.email = email; | ||
} | ||
} |
13 changes: 13 additions & 0 deletions
13
backend/src/main/java/com/shaderock/backend/auth/registration/UserRegisteredMessage.java
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,13 @@ | ||
package com.shaderock.backend.auth.registration; | ||
|
||
import com.shaderock.backend.messaging.message.ErrorMessage; | ||
import lombok.Getter; | ||
|
||
@Getter | ||
public class UserRegisteredMessage extends ErrorMessage { | ||
private static final boolean USER_REGISTERED = true; | ||
|
||
public UserRegisteredMessage(String message) { | ||
super(message); | ||
} | ||
} |
45 changes: 45 additions & 0 deletions
45
backend/src/main/java/com/shaderock/backend/conf/BasicConfiguration.java
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,45 @@ | ||
package com.shaderock.backend.conf; | ||
|
||
import com.shaderock.backend.auth.login.JWTRequestFilter; | ||
import com.shaderock.backend.model.type.Role; | ||
import lombok.RequiredArgsConstructor; | ||
import org.springframework.context.annotation.Bean; | ||
import org.springframework.context.annotation.Configuration; | ||
import org.springframework.security.authentication.AuthenticationManager; | ||
import org.springframework.security.config.annotation.authentication.configuration.AuthenticationConfiguration; | ||
import org.springframework.security.config.annotation.web.builders.HttpSecurity; | ||
import org.springframework.security.config.annotation.web.configuration.EnableWebSecurity; | ||
import org.springframework.security.config.http.SessionCreationPolicy; | ||
import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder; | ||
import org.springframework.security.web.SecurityFilterChain; | ||
import org.springframework.security.web.authentication.UsernamePasswordAuthenticationFilter; | ||
|
||
@Configuration | ||
@EnableWebSecurity | ||
@RequiredArgsConstructor | ||
public class BasicConfiguration { | ||
private final JWTRequestFilter jwtRequestFilter; | ||
|
||
@Bean | ||
public AuthenticationManager authenticationManager(final AuthenticationConfiguration authenticationConfiguration) | ||
throws Exception { | ||
return authenticationConfiguration.getAuthenticationManager(); | ||
} | ||
|
||
@Bean | ||
public SecurityFilterChain filterChain(HttpSecurity http) throws Exception { | ||
return http.cors().and().csrf().disable() | ||
.authorizeHttpRequests() | ||
.requestMatchers("/api/login/**", "/api/register/**", "/api/food/**").permitAll() | ||
.anyRequest().hasRole(Role.USER.getName()) | ||
.and() | ||
.sessionManagement().sessionCreationPolicy(SessionCreationPolicy.STATELESS).and() | ||
.addFilterBefore(jwtRequestFilter, UsernamePasswordAuthenticationFilter.class) | ||
.build(); | ||
} | ||
|
||
@Bean | ||
public BCryptPasswordEncoder bCryptPasswordEncoder() { | ||
return new BCryptPasswordEncoder(); | ||
} | ||
} |
13 changes: 13 additions & 0 deletions
13
backend/src/main/java/com/shaderock/backend/messaging/advice/GeneralControllerAdvice.java
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,13 @@ | ||
package com.shaderock.backend.messaging.advice; | ||
|
||
import com.shaderock.backend.messaging.message.ErrorMessage; | ||
import org.springframework.web.bind.annotation.ControllerAdvice; | ||
import org.springframework.web.bind.annotation.ExceptionHandler; | ||
|
||
@ControllerAdvice | ||
public class GeneralControllerAdvice { | ||
@ExceptionHandler(Exception.class) | ||
public ErrorMessage handleAnyException(Exception e) { | ||
return ErrorMessage.builder().message(e.getMessage()).build(); | ||
} | ||
} |
13 changes: 13 additions & 0 deletions
13
backend/src/main/java/com/shaderock/backend/messaging/exception/TokenNotFoundException.java
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,13 @@ | ||
package com.shaderock.backend.messaging.exception; | ||
|
||
import lombok.Getter; | ||
|
||
public class TokenNotFoundException extends RuntimeException { | ||
@Getter | ||
private final String token; | ||
|
||
public TokenNotFoundException(String token) { | ||
super(String.format("User with token=[%s] not found", token)); | ||
this.token = token; | ||
} | ||
} |
12 changes: 12 additions & 0 deletions
12
backend/src/main/java/com/shaderock/backend/messaging/message/ErrorMessage.java
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,12 @@ | ||
package com.shaderock.backend.messaging.message; | ||
|
||
import lombok.Builder; | ||
import lombok.Getter; | ||
import lombok.RequiredArgsConstructor; | ||
|
||
@Getter | ||
@RequiredArgsConstructor | ||
@Builder | ||
public class ErrorMessage { | ||
private final String message; | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
14 changes: 14 additions & 0 deletions
14
backend/src/main/java/com/shaderock/backend/model/repository/AppUserRepository.java
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,14 @@ | ||
package com.shaderock.backend.model.repository; | ||
|
||
import com.shaderock.backend.model.entity.user.AppUser; | ||
import org.springframework.data.jpa.repository.JpaRepository; | ||
import org.springframework.stereotype.Repository; | ||
|
||
import java.util.Optional; | ||
|
||
@Repository | ||
public interface AppUserRepository extends JpaRepository<AppUser, Long> { | ||
Optional<AppUser> findByEmail(String email); | ||
|
||
Optional<AppUser> findByRegistrationToken(String email); | ||
} |
8 changes: 8 additions & 0 deletions
8
backend/src/main/resources/META-INF/additional-spring-configuration-metadata.json
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,8 @@ | ||
{ | ||
"properties": [ | ||
{ | ||
"name": "application.frontend.url", | ||
"type": "java.lang.String", | ||
"description": "Description for application.frontend.url." | ||
} | ||
] } |
Oops, something went wrong.