Total Complexity | 42 |
Total Lines | 243 |
Duplicated Lines | 8.64 % |
Changes | 0 |
Duplicate code is one of the most pungent code smells. A rule that is often used is to re-structure code once it is duplicated in three or more places.
Common duplication problems, and corresponding solutions are:
Complex classes like com.osomapps.pt.user.UserService often do a lot of different things. To break such a class down, we need to identify a cohesive component within that class. A common approach to find such a component is to look for fields/methods that share the same prefixes, or suffixes.
Once you have determined the fields that belong together, you can apply the Extract Class refactoring. If the component makes sense as a sub-class, Extract Subclass is also a candidate, and is often faster.
1 | package com.osomapps.pt.user; |
||
30 | @Service |
||
31 | public class UserService { |
||
32 | private final InUserRepository inUserRepository; |
||
33 | private final InUserLoginRepository inUserLoginRepository; |
||
34 | private final InUserLogoutRepository inUserLogoutRepository; |
||
35 | private final GoalRepository goalRepository; |
||
36 | private final InUserGoalRepository inUserGoalRepository; |
||
37 | private final DataurlValidator dataurlValidator; |
||
38 | private final NameValidator nameValidator; |
||
39 | private final SendEmailService sendEmailService; |
||
40 | private final AdminProgramAssignService adminProgramAssignService; |
||
41 | |||
42 | UserService( |
||
|
|||
43 | InUserRepository inUserRepository, |
||
44 | InUserLoginRepository inUserLoginRepository, |
||
45 | InUserLogoutRepository inUserLogoutRepository, |
||
46 | GoalRepository goalRepository, |
||
47 | InUserGoalRepository inUserGoalRepository, |
||
48 | DataurlValidator dataurlValidator, |
||
49 | NameValidator nameValidator, |
||
50 | SendEmailService sendEmailService, |
||
51 | AdminProgramAssignService adminProgramAssignService) { |
||
52 | this.inUserRepository = inUserRepository; |
||
53 | this.inUserLoginRepository = inUserLoginRepository; |
||
54 | this.inUserLogoutRepository = inUserLogoutRepository; |
||
55 | this.goalRepository = goalRepository; |
||
56 | this.inUserGoalRepository = inUserGoalRepository; |
||
57 | this.dataurlValidator = dataurlValidator; |
||
58 | this.nameValidator = nameValidator; |
||
59 | this.sendEmailService = sendEmailService; |
||
60 | this.adminProgramAssignService = adminProgramAssignService; |
||
61 | } |
||
62 | |||
63 | public InUserLogin checkUserToken(String token) { |
||
64 | final List<InUserLogin> inUserLogins = inUserLoginRepository.findByToken(token); |
||
65 | if (inUserLogins.isEmpty()) { |
||
66 | throw new UnauthorizedException("Token not found"); |
||
67 | } else { |
||
68 | if (!inUserLogoutRepository.findByToken(token).isEmpty()) { |
||
69 | throw new UnauthorizedException("Invalid token"); |
||
70 | } |
||
71 | } |
||
72 | return inUserLogins.get(inUserLogins.size() - 1); |
||
73 | } |
||
74 | |||
75 | private Optional<String> getUserName(InUser inUser) { |
||
76 | final Optional<String> userName; |
||
77 | if (inUser.getInUserFacebooks() == null || inUser.getInUserFacebooks().isEmpty()) { |
||
78 | if (inUser.getInUserEmails() == null || inUser.getInUserEmails().isEmpty()) { |
||
79 | userName = Optional.empty(); |
||
80 | } else { |
||
81 | userName = |
||
82 | Optional.of( |
||
83 | inUser.getInUserEmails() |
||
84 | .get(inUser.getInUserEmails().size() - 1) |
||
85 | .getUser_name()); |
||
86 | } |
||
87 | } else { |
||
88 | userName = |
||
89 | Optional.ofNullable( |
||
90 | inUser.getInUserFacebooks() |
||
91 | .get(inUser.getInUserFacebooks().size() - 1) |
||
92 | .getUser_name()); |
||
93 | } |
||
94 | return userName; |
||
95 | } |
||
96 | |||
97 | private void setUserName(InUser inUser, String userName) { |
||
98 | if (inUser.getInUserFacebooks() == null || inUser.getInUserFacebooks().isEmpty()) { |
||
99 | if (inUser.getInUserEmails() != null && !inUser.getInUserEmails().isEmpty()) { |
||
100 | String prevUserName = |
||
101 | inUser.getInUserEmails() |
||
102 | .get(inUser.getInUserEmails().size() - 1) |
||
103 | .getUser_name(); |
||
104 | inUser.getInUserEmails() |
||
105 | .get(inUser.getInUserEmails().size() - 1) |
||
106 | .setUser_name(userName); |
||
107 | if (prevUserName == null) { |
||
108 | new Thread( |
||
109 | () -> { |
||
110 | sendEmailService.send( |
||
111 | inUser.getInUserEmails() |
||
112 | .get(inUser.getInUserEmails().size() - 1)); |
||
113 | }, |
||
114 | "Send-email") |
||
115 | .start(); |
||
116 | } |
||
117 | } |
||
118 | } else { |
||
119 | inUser.getInUserFacebooks() |
||
120 | .get(inUser.getInUserFacebooks().size() - 1) |
||
121 | .setUser_name(userName); |
||
122 | } |
||
123 | } |
||
124 | |||
125 | private Optional<String> getAvatar(InUser inUser) { |
||
126 | if (inUser.getInUserFacebooks() == null || inUser.getInUserFacebooks().isEmpty()) { |
||
127 | return Optional.empty(); |
||
128 | } |
||
129 | return Optional.ofNullable( |
||
130 | inUser.getInUserFacebooks() |
||
131 | .get(inUser.getInUserFacebooks().size() - 1) |
||
132 | .getPicture_url()); |
||
133 | } |
||
134 | |||
135 | private Optional<String> getEmail(InUser inUser) { |
||
136 | if (inUser.getInUserEmails() == null || inUser.getInUserEmails().isEmpty()) { |
||
137 | return Optional.empty(); |
||
138 | } |
||
139 | return Optional.of( |
||
140 | inUser.getInUserEmails().get(inUser.getInUserEmails().size() - 1).getLogin()); |
||
141 | } |
||
142 | |||
143 | UserResponseDTO findOne(String token) { |
||
144 | final InUser inUser = checkUserToken(token).getInUser(); |
||
145 | return userToDto(inUser); |
||
146 | } |
||
147 | |||
148 | private UserResponseDTO userToDto(final InUser inUser) { |
||
149 | final UserResponseDTO userResponse = new UserResponseDTO(); |
||
150 | userResponse.setId(inUser.getId()); |
||
151 | userResponse.setGender(inUser.getD_sex()); |
||
152 | if (inUser.getAge() != null) { |
||
153 | userResponse.setAge(inUser.getAge().longValue()); |
||
154 | } |
||
155 | if (inUser.getHeight() != null) { |
||
156 | userResponse.setHeight(inUser.getHeight().longValue()); |
||
157 | } |
||
158 | if (inUser.getWeight() != null) { |
||
159 | userResponse.setWeight(inUser.getWeight().longValue()); |
||
160 | } |
||
161 | if (inUser.getD_level() != null) { |
||
162 | userResponse.setLevel(UserLevel.of(Integer.parseInt(inUser.getD_level()))); |
||
163 | } |
||
164 | userResponse.setGoals( |
||
165 | inUser.getInUserGoals().stream() |
||
166 | .map( |
||
167 | inUserGoal -> { |
||
168 | Map<String, Integer> map = null; |
||
169 | try { |
||
170 | map = |
||
171 | inUserGoal.getGoal_value() == null |
||
172 | ? null |
||
173 | : new ObjectMapper() |
||
174 | .readValue( |
||
175 | inUserGoal.getGoal_value(), |
||
176 | new TypeReference< |
||
177 | Map< |
||
178 | String, |
||
179 | Integer>>() {}); |
||
180 | } catch (IOException ex) { |
||
181 | } |
||
182 | return new UserGoalResponseDTO() |
||
183 | .setId(inUserGoal.getGoalId()) |
||
184 | .setValues(map); |
||
185 | }) |
||
186 | .collect(Collectors.toList())); |
||
187 | userResponse.setAvatar_dataurl(inUser.getAvatar_dataurl()); |
||
188 | userResponse.setName(getUserName(inUser).orElse("?")); |
||
189 | userResponse.setAvatar(getAvatar(inUser).orElse(null)); |
||
190 | userResponse.setEmail(getEmail(inUser).orElse(null)); |
||
191 | userResponse.setBirthday(inUser.getBirthday()); |
||
192 | return userResponse; |
||
193 | } |
||
194 | |||
195 | UserResponseDTO updateUser(String token, UserRequestDTO userRequest) { |
||
196 | final InUserLogin inUserLogin = checkUserToken(token); |
||
197 | final InUser inUser = inUserLogin.getInUser(); |
||
198 | if (userRequest.getGender() != null) { |
||
199 | inUser.setD_sex(userRequest.getGender()); |
||
200 | } |
||
201 | if (userRequest.getAge() != null) { |
||
202 | inUser.setAge(userRequest.getAge().floatValue()); |
||
203 | } |
||
204 | if (userRequest.getHeight() != null) { |
||
205 | inUser.setHeight(userRequest.getHeight().floatValue()); |
||
206 | } |
||
207 | if (userRequest.getWeight() != null) { |
||
208 | inUser.setWeight(userRequest.getWeight().floatValue()); |
||
209 | } |
||
210 | if (userRequest.getLevel() != null) { |
||
211 | inUser.setD_level(Integer.toString(userRequest.getLevel().getLevel())); |
||
212 | } |
||
213 | final MapBindingResult errors = |
||
214 | new MapBindingResult(new HashMap<>(), String.class.getName()); |
||
215 | dataurlValidator.validate(userRequest.getAvatar_dataurl(), errors); |
||
216 | if (errors.hasErrors()) { |
||
217 | throw new UnauthorizedException(errors.getAllErrors().get(0).getDefaultMessage()); |
||
218 | } |
||
219 | if (userRequest.getName() != null) { |
||
220 | final MapBindingResult errorsName = |
||
221 | new MapBindingResult(new HashMap<>(), String.class.getName()); |
||
222 | nameValidator.validate(userRequest.getName(), errorsName); |
||
223 | if (errorsName.hasErrors()) { |
||
224 | throw new UnauthorizedException( |
||
225 | errorsName.getAllErrors().get(0).getDefaultMessage()); |
||
226 | } |
||
227 | setUserName(inUser, userRequest.getName()); |
||
228 | } |
||
229 | View Code Duplication | if (userRequest.getGoals() != null) { |
|
230 | if (userRequest.getGoals().size() > 2) { |
||
231 | throw new UnauthorizedException("Amount of goals must be not more than 2"); |
||
232 | } |
||
233 | inUserGoalRepository.deleteAll(inUser.getInUserGoals()); |
||
234 | inUser.setInUserGoals(new ArrayList<>()); |
||
235 | userRequest |
||
236 | .getGoals() |
||
237 | .forEach( |
||
238 | (userGoalRequestDTO) -> { |
||
239 | Goal goal = |
||
240 | goalRepository |
||
241 | .findById(userGoalRequestDTO.getId()) |
||
242 | .orElse(null); |
||
243 | if (goal == null) { |
||
244 | throw new UnauthorizedException( |
||
245 | "Goal with id " |
||
246 | + userGoalRequestDTO.getId() |
||
247 | + " not found"); |
||
248 | } |
||
249 | String value = null; |
||
250 | try { |
||
251 | value = |
||
252 | new ObjectMapper() |
||
253 | .writeValueAsString( |
||
254 | userGoalRequestDTO.getValues()); |
||
255 | } catch (IOException ex) { |
||
256 | } |
||
257 | inUser.getInUserGoals() |
||
258 | .add( |
||
259 | inUserGoalRepository.save( |
||
260 | new InUserGoal() |
||
261 | .setGoalId( |
||
262 | userGoalRequestDTO.getId()) |
||
263 | .setD_goal_title( |
||
264 | goal.getDGoalTitle()) |
||
265 | .setD_goal_title_2( |
||
266 | goal.getDGoalTitle2()) |
||
267 | .setGoal_value(value))); |
||
268 | }); |
||
269 | } |
||
270 | inUser.setAvatar_dataurl(userRequest.getAvatar_dataurl()); |
||
271 | inUser.setUpdated(LocalDateTime.now()); |
||
272 | return userToDto(inUserRepository.save(adminProgramAssignService.assign(inUser))); |
||
273 | } |
||
275 |