-
Notifications
You must be signed in to change notification settings - Fork 368
Expand file tree
/
Copy pathAuthController.java
More file actions
114 lines (88 loc) · 4.75 KB
/
AuthController.java
File metadata and controls
114 lines (88 loc) · 4.75 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
package com.sopromadze.blogapi.controller;
import com.sopromadze.blogapi.exception.AppException;
import com.sopromadze.blogapi.exception.BlogapiException;
import com.sopromadze.blogapi.model.role.Role;
import com.sopromadze.blogapi.model.role.RoleName;
import com.sopromadze.blogapi.model.user.User;
import com.sopromadze.blogapi.payload.ApiResponse;
import com.sopromadze.blogapi.payload.JwtAuthenticationResponse;
import com.sopromadze.blogapi.payload.LoginRequest;
import com.sopromadze.blogapi.payload.SignUpRequest;
import com.sopromadze.blogapi.repository.RoleRepository;
import com.sopromadze.blogapi.repository.UserRepository;
import com.sopromadze.blogapi.security.JwtTokenProvider;
import io.swagger.v3.oas.annotations.Operation;
import io.swagger.v3.oas.annotations.tags.Tag;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.http.HttpStatus;
import org.springframework.http.ResponseEntity;
import org.springframework.security.authentication.AuthenticationManager;
import org.springframework.security.authentication.UsernamePasswordAuthenticationToken;
import org.springframework.security.core.Authentication;
import org.springframework.security.core.context.SecurityContextHolder;
import org.springframework.security.crypto.password.PasswordEncoder;
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.RestController;
import org.springframework.web.servlet.support.ServletUriComponentsBuilder;
import javax.validation.Valid;
import java.net.URI;
import java.util.ArrayList;
import java.util.List;
@Tag(name = "1- Auth", description = "Operations related to sign in and sign up")
@RestController
@RequestMapping("/api/auth")
public class AuthController {
private static final String USER_ROLE_NOT_SET = "User role not set";
@Autowired
private AuthenticationManager authenticationManager;
@Autowired
private UserRepository userRepository;
@Autowired
private RoleRepository roleRepository;
@Autowired
private PasswordEncoder passwordEncoder;
@Autowired
private JwtTokenProvider jwtTokenProvider;
@Operation(description = "Log in", summary = "Log in / sign in")
@PostMapping("/signin")
public ResponseEntity<JwtAuthenticationResponse> authenticateUser(@Valid @RequestBody LoginRequest loginRequest) {
Authentication authentication = authenticationManager.authenticate(
new UsernamePasswordAuthenticationToken(loginRequest.getUsernameOrEmail(), loginRequest.getPassword()));
SecurityContextHolder.getContext().setAuthentication(authentication);
String jwt = jwtTokenProvider.generateToken(authentication);
return ResponseEntity.ok(new JwtAuthenticationResponse(jwt));
}
@Operation(description = "Sign up", summary = "Sign up")
@PostMapping("/signup")
public ResponseEntity<ApiResponse> registerUser(@Valid @RequestBody SignUpRequest signUpRequest) {
if (Boolean.TRUE.equals(userRepository.existsByUsername(signUpRequest.getUsername()))) {
throw new BlogapiException(HttpStatus.BAD_REQUEST, "Username is already taken");
}
if (Boolean.TRUE.equals(userRepository.existsByEmail(signUpRequest.getEmail()))) {
throw new BlogapiException(HttpStatus.BAD_REQUEST, "Email is already taken");
}
String firstName = signUpRequest.getFirstName().toLowerCase();
String lastName = signUpRequest.getLastName().toLowerCase();
String username = signUpRequest.getUsername().toLowerCase();
String email = signUpRequest.getEmail().toLowerCase();
String password = passwordEncoder.encode(signUpRequest.getPassword());
User user = new User(firstName, lastName, username, email, password);
List<Role> roles = new ArrayList<>();
if (userRepository.count() == 0) {
roles.add(roleRepository.findByName(RoleName.ROLE_USER)
.orElseThrow(() -> new AppException(USER_ROLE_NOT_SET)));
roles.add(roleRepository.findByName(RoleName.ROLE_ADMIN)
.orElseThrow(() -> new AppException(USER_ROLE_NOT_SET)));
} else {
roles.add(roleRepository.findByName(RoleName.ROLE_USER)
.orElseThrow(() -> new AppException(USER_ROLE_NOT_SET)));
}
user.setRoles(roles);
User result = userRepository.save(user);
URI location = ServletUriComponentsBuilder.fromCurrentContextPath().path("/api/users/{userId}")
.buildAndExpand(result.getId()).toUri();
return ResponseEntity.created(location).body(new ApiResponse(Boolean.TRUE, "User registered successfully"));
}
}