Skip to content

Commit fdf8afb

Browse files
Merge pull request #3 from handsonprogrammer/create-registration-endpoint
Registration endpoint creation
2 parents dd08d6d + 3140d91 commit fdf8afb

File tree

7 files changed

+197
-0
lines changed

7 files changed

+197
-0
lines changed

ocommapi/pom.xml

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -38,6 +38,10 @@
3838
<groupId>org.springframework.boot</groupId>
3939
<artifactId>spring-boot-starter-data-jpa</artifactId>
4040
</dependency>
41+
<dependency>
42+
<groupId>org.springframework.boot</groupId>
43+
<artifactId>spring-boot-starter-validation</artifactId>
44+
</dependency>
4145
<dependency>
4246
<groupId>org.springframework.boot</groupId>
4347
<artifactId>spring-boot-starter-security</artifactId>
Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,26 @@
1+
package com.ocommerce.api.configuration;
2+
3+
import org.springframework.context.annotation.Bean;
4+
import org.springframework.context.annotation.Configuration;
5+
import org.springframework.http.HttpMethod;
6+
import org.springframework.security.config.annotation.web.builders.HttpSecurity;
7+
import org.springframework.security.config.annotation.web.configuration.EnableWebSecurity;
8+
import org.springframework.security.config.annotation.web.configurers.AbstractHttpConfigurer;
9+
import org.springframework.security.web.SecurityFilterChain;
10+
11+
@Configuration
12+
@EnableWebSecurity
13+
public class SecurityConfig {
14+
15+
@Bean
16+
public SecurityFilterChain filterChain(HttpSecurity http) throws Exception {
17+
18+
http.csrf((csrf) -> csrf
19+
.ignoringRequestMatchers("/api/**"));
20+
http.authorizeHttpRequests((authorize) ->
21+
authorize.requestMatchers("/api/auth/register").permitAll()
22+
.anyRequest().authenticated());
23+
return http.build();
24+
}
25+
26+
}
Lines changed: 66 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,66 @@
1+
package com.ocommerce.api.controller.auth;
2+
3+
import com.ocommerce.api.exception.UserAlreadyExistsException;
4+
import com.ocommerce.api.model.RegistrationBody;
5+
import com.ocommerce.api.service.UserService;
6+
import jakarta.validation.Valid;
7+
import jakarta.validation.ValidationException;
8+
import org.springframework.http.HttpStatus;
9+
import org.springframework.http.HttpStatusCode;
10+
import org.springframework.http.ProblemDetail;
11+
import org.springframework.http.ResponseEntity;
12+
import org.springframework.validation.BindException;
13+
import org.springframework.validation.Errors;
14+
import org.springframework.validation.FieldError;
15+
import org.springframework.web.ErrorResponse;
16+
import org.springframework.web.bind.MethodArgumentNotValidException;
17+
import org.springframework.web.bind.annotation.*;
18+
19+
import java.util.HashMap;
20+
import java.util.Map;
21+
22+
/**
23+
* Rest Controller for handling authentication requests.
24+
*/
25+
@RestController
26+
@RequestMapping("/api/auth")
27+
public class AuthenticationController {
28+
29+
/** The user service. */
30+
private UserService userService;
31+
32+
/**
33+
* Spring injected constructor.
34+
* @param userService
35+
*/
36+
public AuthenticationController(UserService userService) {
37+
this.userService = userService;
38+
}
39+
40+
/**
41+
* Post Mapping to handle registering users.
42+
* @param registrationBody The registration information.
43+
* @return Response to front end.
44+
*/
45+
@PostMapping("/register")
46+
public ResponseEntity registerUser(@Valid @RequestBody RegistrationBody registrationBody) {
47+
try {
48+
userService.registerUser(registrationBody);
49+
return ResponseEntity.ok().build();
50+
} catch (UserAlreadyExistsException ex) {
51+
return ResponseEntity.status(HttpStatus.CONFLICT).build();
52+
}
53+
}
54+
55+
@ResponseStatus(HttpStatus.BAD_REQUEST)
56+
@ExceptionHandler(MethodArgumentNotValidException.class)
57+
public Map<String, String> handleValidationExceptions(MethodArgumentNotValidException ex) {
58+
Map<String, String> errors = new HashMap<>();
59+
ex.getBindingResult().getAllErrors().forEach((error) -> {
60+
String fieldName = ((FieldError) error).getField();
61+
String errorMessage = error.getDefaultMessage();
62+
errors.put(fieldName, errorMessage);
63+
});
64+
return errors;
65+
}
66+
}
Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,4 @@
1+
package com.ocommerce.api.exception;
2+
3+
public class UserAlreadyExistsException extends Exception{
4+
}
Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,14 @@
1+
package com.ocommerce.api.jpa.repositories;
2+
3+
import com.ocommerce.api.jpa.entities.UserReg;
4+
import org.springframework.data.repository.CrudRepository;
5+
6+
import java.util.Optional;
7+
8+
public interface UserRegRepository extends CrudRepository<UserReg, Long> {
9+
10+
Optional<UserReg> findByUsernameIgnoreCase(String username);
11+
12+
Optional<UserReg> findByEmailIgnoreCase(String email);
13+
14+
}
Lines changed: 40 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,40 @@
1+
package com.ocommerce.api.model;
2+
3+
import jakarta.validation.constraints.Email;
4+
import jakarta.validation.constraints.NotBlank;
5+
import jakarta.validation.constraints.NotNull;
6+
import jakarta.validation.constraints.Pattern;
7+
import jakarta.validation.constraints.Size;
8+
import lombok.Getter;
9+
10+
/**
11+
* The information required to register a user.
12+
*/
13+
@Getter
14+
public class RegistrationBody {
15+
16+
/** The username. */
17+
@NotNull
18+
@NotBlank
19+
@Size(min=6, max=255)
20+
private String username;
21+
/** The email. */
22+
@NotNull
23+
@NotBlank
24+
@Email
25+
private String email;
26+
/** The password. */
27+
@NotNull
28+
@NotBlank
29+
@Pattern(regexp = "^(?=.*[A-Za-z])(?=.*\\d)[A-Za-z\\d]{6,}$")
30+
@Size(min=8, max=32)
31+
private String password;
32+
/** The first name. */
33+
@NotNull
34+
@NotBlank
35+
private String firstName;
36+
/** The last name. */
37+
@NotNull
38+
@NotBlank
39+
private String lastName;
40+
}
Lines changed: 43 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,43 @@
1+
package com.ocommerce.api.service;
2+
3+
import com.ocommerce.api.exception.UserAlreadyExistsException;
4+
import com.ocommerce.api.jpa.entities.UserReg;
5+
import com.ocommerce.api.jpa.repositories.UserRegRepository;
6+
import com.ocommerce.api.model.RegistrationBody;
7+
import org.springframework.stereotype.Service;
8+
9+
@Service
10+
public class UserService {
11+
12+
/** The LocalUserDAO. */
13+
private UserRegRepository userRegRepo;
14+
15+
/**
16+
* Constructor injected by spring.
17+
* @param userRegRepo
18+
*/
19+
public UserService(UserRegRepository userRegRepo) {
20+
this.userRegRepo = userRegRepo;
21+
}
22+
23+
/**
24+
* Attempts to register a user given the information provided.
25+
* @param registrationBody The registration information.
26+
* @return The local user that has been written to the database.
27+
* @throws UserAlreadyExistsException Thrown if there is already a user with the given information.
28+
*/
29+
public void registerUser(RegistrationBody registrationBody) throws UserAlreadyExistsException {
30+
if (userRegRepo.findByEmailIgnoreCase(registrationBody.getEmail()).isPresent()
31+
|| userRegRepo.findByUsernameIgnoreCase(registrationBody.getUsername()).isPresent()) {
32+
throw new UserAlreadyExistsException();
33+
}
34+
UserReg user = new UserReg();
35+
user.setEmail(registrationBody.getEmail());
36+
user.setUsername(registrationBody.getUsername());
37+
user.setFirstName(registrationBody.getFirstName());
38+
user.setLastName(registrationBody.getLastName());
39+
//TODO: Encrypt passwords!!
40+
user.setPassword(registrationBody.getPassword());
41+
userRegRepo.save(user);
42+
}
43+
}

0 commit comments

Comments
 (0)