source: phonelux-backend/src/main/java/finki/it/phoneluxbackend/services/UserService.java@ 48f3030

Last change on this file since 48f3030 was 48f3030, checked in by Marko <Marko@…>, 22 months ago

Implemented all use cases

  • Property mode set to 100644
File size: 7.4 KB
RevLine 
[dfd5d87]1package finki.it.phoneluxbackend.services;
2
[775e15e]3import com.auth0.jwt.JWT;
4import com.auth0.jwt.JWTVerifier;
5import com.auth0.jwt.algorithms.Algorithm;
6import com.auth0.jwt.interfaces.DecodedJWT;
7import finki.it.phoneluxbackend.data.UserRole;
8import finki.it.phoneluxbackend.entities.PhoneOffer;
[dfd5d87]9import finki.it.phoneluxbackend.entities.User;
[775e15e]10import finki.it.phoneluxbackend.repositories.PhoneOfferRepository;
[dfd5d87]11import finki.it.phoneluxbackend.repositories.UserRepository;
12import finki.it.phoneluxbackend.entities.ConfirmationToken;
13import lombok.AllArgsConstructor;
[f25d07e]14import org.springframework.http.ResponseEntity;
[dfd5d87]15import org.springframework.security.core.userdetails.UserDetails;
16import org.springframework.security.core.userdetails.UserDetailsService;
17import org.springframework.security.core.userdetails.UsernameNotFoundException;
18import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder;
19import org.springframework.stereotype.Service;
20
21import java.time.LocalDateTime;
[f25d07e]22
[775e15e]23import java.util.Comparator;
24import java.util.List;
[dfd5d87]25import java.util.UUID;
[775e15e]26import java.util.stream.Collectors;
[dfd5d87]27
28@Service
29@AllArgsConstructor
30public class UserService implements UserDetailsService {
31 private final UserRepository userRepository;
[775e15e]32 private final PhoneOfferRepository phoneOfferRepository;
[dfd5d87]33 private final BCryptPasswordEncoder bCryptPasswordEncoder;
34 private final ConfirmationTokenService confirmationTokenService;
35
36
37 @Override
38 public UserDetails loadUserByUsername(String email) throws UsernameNotFoundException {
39 return userRepository.findByEmail(email)
40 .orElseThrow(() -> new UsernameNotFoundException("User with email "+email+" not found!"));
41 }
42
[f25d07e]43 public ResponseEntity<Object> signUpUser(User user)
[dfd5d87]44 {
[f25d07e]45 boolean userExists = userRepository.findByEmail(user.getEmail()).isPresent();
46
[dfd5d87]47
[f25d07e]48 if (userExists){
49 User userToRegister = userRepository.findByEmail(user.getEmail()).get();
50 if(userToRegister.getEnabled()) {
[e5b84dc]51 return ResponseEntity.badRequest().body("Error:Е-маил адресата е веќе зафатена!");
[f25d07e]52 }
53 else {
[e5b84dc]54 return ResponseEntity.badRequest().body("Error:Профилот не е активиран. Потврдете на вашата е-маил адреса!" );
[f25d07e]55 }
[dfd5d87]56 }
57
58 String encodedPassword = bCryptPasswordEncoder.encode(user.getPassword());
59
60 user.setPassword(encodedPassword);
61
62 String token = UUID.randomUUID().toString();
63 ConfirmationToken confirmationToken = new ConfirmationToken(token,
64 LocalDateTime.now(),
65 LocalDateTime.now().plusMinutes(15),
66 user
67 );
68
69 confirmationTokenService.saveConfirmationToken(confirmationToken);
70
[f25d07e]71 return ResponseEntity.ok().body("token:"+token);
[dfd5d87]72 }
73
74 public int enableUser(String email) {
75 return userRepository.enableUser(email);
76 }
77
78
[775e15e]79 public User getUserFromToken(String token) {
80 Algorithm algorithm = Algorithm.HMAC256("secret".getBytes());
81 JWTVerifier verifier = JWT.require(algorithm).build();
82 DecodedJWT decodedJWT = verifier.verify(token);
83 String email = decodedJWT.getSubject();
84 UserRole role = UserRole.valueOf(decodedJWT.getClaim("role").asArray(String.class)[0]);
85 String name = decodedJWT.getClaim("name").as(String.class);
86 Long id = decodedJWT.getClaim("id").as(Long.class);
[48f3030]87// String pickedSpecifications = decodedJWT.getClaim("pickedSpecifications").as(String.class);
[775e15e]88 return new User(id,name,role);
89 }
90
91 public List<PhoneOffer> getFavouriteOffersForUser(Long userId) {
92 boolean exists = userRepository.existsById(userId);
93 if(!exists)
94 throw new IllegalStateException("User with id "+userId+" does not exist");
95
96 return userRepository.findById(userId).get().getFavouriteOffers();
97 }
98
99 public ResponseEntity<Object> editOfferForUser(Long userId, Long offerId, String option) {
100 boolean userExists = userRepository.existsById(userId);
101 if (!userExists)
102 {
103 return ResponseEntity.badRequest().body("User with id "+userId+" doesn't exist");
104 }
105
106 boolean offerExists = phoneOfferRepository.existsById(offerId);
107
108 if (!offerExists)
109 {
110 return ResponseEntity.badRequest().body("Offer with id "+offerId+" doesn't exist");
111 }
112
113 User user = userRepository.findById(userId).get();
114 PhoneOffer phoneOffer = phoneOfferRepository.findById(offerId).get();
115
116 if(option.equals("add")) {
117 user.getFavouriteOffers().add(phoneOffer);
118 }
119 else{
120 user.getFavouriteOffers().remove(phoneOffer);
121 }
122
123 userRepository.save(user);
124
125 return ResponseEntity.ok().build();
126 }
127
128 public List<User> getUsers(String searchValue) {
129 List<User> users = userRepository.findAll().stream()
130 .filter(user -> user.getUserRole() != UserRole.SUPERADMIN && user.getEnabled())
131 .map(user -> new User(user.getId(),user.getFirstName(),
132 user.getLastName(),user.getEmail(),user.getUserRole()))
133 .collect(Collectors.toList());
134
135 if(searchValue != null)
136 {
137 users = users.stream()
138 .filter(user -> user.getEmail().toLowerCase().contains(searchValue.stripIndent().toLowerCase())
139 || user.getFirstName().toLowerCase().contains(searchValue.stripIndent().toLowerCase()))
140 .collect(Collectors.toList());
141 }
142
143 return users.stream()
144 .sorted(Comparator.comparing(User::getId))
145 .collect(Collectors.toList());
146
147 }
148
149 public ResponseEntity<Object> giveAdminRoleToUser(Long userId) {
150 boolean userExists = userRepository.existsById(userId);
151 if (!userExists)
152 {
153 return ResponseEntity.badRequest().body("User with id "+userId+" doesn't exist");
154 }
155
156 User user = userRepository.findById(userId).get();
157
158 user.setUserRole(UserRole.ADMIN);
159 userRepository.save(user);
160
161 return ResponseEntity.ok().build();
162 }
163
164 public ResponseEntity<Object> removeAdminRoleFromUser(Long userId) {
165 boolean userExists = userRepository.existsById(userId);
166 if (!userExists)
167 {
168 return ResponseEntity.badRequest().body("User with id "+userId+" doesn't exist");
169 }
170
171 User user = userRepository.findById(userId).get();
172
173 user.setUserRole(UserRole.USER);
174 userRepository.save(user);
175 return ResponseEntity.ok().build();
176 }
[48f3030]177
178 public ResponseEntity<Object> editSpecificationsForUser(Long userId, String specifications) {
179 boolean userExists = userRepository.existsById(userId);
180 if (!userExists)
181 {
182 return ResponseEntity.badRequest().body("User with id "+userId+" doesn't exist");
183 }
184 User user = userRepository.findById(userId).get();
185
186 user.setSpecifications(specifications);
187 userRepository.save(user);
188
189 return ResponseEntity.ok().build();
190 }
191
192 public String getSpecificationsForUser(Long userId) {
193 boolean userExists = userRepository.existsById(userId);
194 if (!userExists)
195 {
196 throw new UsernameNotFoundException("User with id "+userId+" doesn't exist");
197 }
198
199 User user = userRepository.findById(userId).get();
200
201 return user.getSpecifications() != null ? user.getSpecifications() : "[]";
202 }
[dfd5d87]203}
Note: See TracBrowser for help on using the repository browser.