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
Line 
1package finki.it.phoneluxbackend.services;
2
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;
9import finki.it.phoneluxbackend.entities.User;
10import finki.it.phoneluxbackend.repositories.PhoneOfferRepository;
11import finki.it.phoneluxbackend.repositories.UserRepository;
12import finki.it.phoneluxbackend.entities.ConfirmationToken;
13import lombok.AllArgsConstructor;
14import org.springframework.http.ResponseEntity;
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;
22
23import java.util.Comparator;
24import java.util.List;
25import java.util.UUID;
26import java.util.stream.Collectors;
27
28@Service
29@AllArgsConstructor
30public class UserService implements UserDetailsService {
31 private final UserRepository userRepository;
32 private final PhoneOfferRepository phoneOfferRepository;
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
43 public ResponseEntity<Object> signUpUser(User user)
44 {
45 boolean userExists = userRepository.findByEmail(user.getEmail()).isPresent();
46
47
48 if (userExists){
49 User userToRegister = userRepository.findByEmail(user.getEmail()).get();
50 if(userToRegister.getEnabled()) {
51 return ResponseEntity.badRequest().body("Error:Е-маил адресата е веќе зафатена!");
52 }
53 else {
54 return ResponseEntity.badRequest().body("Error:Профилот не е активиран. Потврдете на вашата е-маил адреса!" );
55 }
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
71 return ResponseEntity.ok().body("token:"+token);
72 }
73
74 public int enableUser(String email) {
75 return userRepository.enableUser(email);
76 }
77
78
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);
87// String pickedSpecifications = decodedJWT.getClaim("pickedSpecifications").as(String.class);
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 }
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 }
203}
Note: See TracBrowser for help on using the repository browser.