Project

General

Profile

1
package eu.dnetlib.goldoa.service;
2

    
3

    
4
import eu.dnetlib.goldoa.domain.*;
5
import eu.dnetlib.goldoa.service.dao.UserDAO;
6
import org.apache.commons.codec.digest.DigestUtils;
7
import org.springframework.beans.factory.annotation.Autowired;
8
import org.springframework.stereotype.Service;
9
import org.springframework.transaction.annotation.Transactional;
10

    
11
import javax.mail.MessagingException;
12
import java.math.BigInteger;
13
import java.security.SecureRandom;
14
import java.util.ArrayList;
15
import java.util.List;
16
import java.util.UUID;
17
import java.util.concurrent.ExecutorService;
18

    
19
//import eu.dnetlib.goldoa.service.dao.OrganizationDAO;
20
//import eu.dnetlib.goldoa.service.dao.ProjectDAO;
21
//import eu.dnetlib.goldoa.service.utils.EmailUtils;
22

    
23
/**
24
 * Created by antleb on 3/4/15.
25
 */
26
@Service
27
@Transactional
28
public class UserManagerImpl implements UserManager {
29

    
30
	@Autowired
31
	private UserDAO userDAO;
32
	
33
	/*@Autowired
34
	private ProjectDAO projectDAO;
35
	@Autowired
36
	private OrganizationDAO organizationDAO;
37
	@Autowired
38
	private PublisherManager publisherManager;
39
	@Autowired
40
	private OrganizationManager organizationManager;
41
	@Autowired
42
	private EmailUtils emailUtils;*/
43
	
44
	@Autowired
45
	ExecutorService executorService;
46

    
47
	private int tokenTTL = 30;
48

    
49
	public static int generateId(Affiliation affiliation) {
50
		StringBuilder sb = new StringBuilder();
51

    
52
		if (affiliation.getPk().getUser() != null)
53
			sb.append(affiliation.getPk().getUser().getId());
54
		if (affiliation.getPk().getOrganization() != null)
55
			sb.append(affiliation.getPk().getOrganization().getId());
56

    
57
		return DigestUtils.md5Hex(sb.toString()).hashCode();
58
	}
59

    
60
	@Override
61
	public User getById(String personId) throws PersonManagerException {
62
		return userDAO.getUserById(personId);
63
	}
64

    
65
	@Override
66
	public User getByEmail(final String email) throws PersonManagerException {
67
		return userDAO.getUserByEmail(email);
68
	}
69

    
70
	@Override
71
	// register or update
72
	public User saveUser(final User user) throws PersonManagerException {
73
		final List<UserRole> previousRoles;
74

    
75
		if (user.getId() == null) {
76
			user.setId(generateId(user));
77
			user.setSource("portal");
78

    
79
			previousRoles = new ArrayList<UserRole>();
80
		} else {
81
			previousRoles = user.getRoles();
82
		}
83
		
84
		userDAO.saveUser(user);
85

    
86
		executorService.submit(new Runnable() {
87
			@Override
88
			public void run() {
89
				/*try {
90
					List<Role> roles = new ArrayList<>();
91

    
92
					for (UserRole pRole : user.getRoles()) {
93
						if (!previousRoles.contains(pRole) && !pRole.isApproved())
94
							roles.add(pRole.getPk().getRole());
95
					}
96

    
97
					if (roles.size() > 0) {
98
						List<User> moderators = getModerators();
99

    
100
						emailUtils.sendUserRoleRequestedEmail(user, roles);
101

    
102
						for (User moderator : moderators)
103
							emailUtils.sendModeratorRoleRequestedEmail(moderator, user, roles);
104
					}
105
				} catch (MessagingException e) {
106
					e.printStackTrace();
107
				}*/
108
			}
109
		});
110

    
111
		return user;
112
	}
113

    
114
	@Override
115
	public void register(final User user) throws PersonManagerException {
116
		final String token = UUID.randomUUID().toString();
117
		
118
		try {
119
			User u = userDAO.getUserByEmail(user.getEmail());
120
			if (u != null)
121
				throw new PersonManagerException(PersonManagerException.ErrorCause.ALREADY_EXISTS);
122
		} catch (PersonManagerException e) {
123
			throw e;
124
		} catch (RuntimeException e) {
125
			e.printStackTrace();
126
			throw e;
127
		}
128
		
129
		this.saveUser(user);
130
		userDAO.saveToken(user.getEmail(), token, tokenTTL);
131

    
132
		executorService.submit(new Runnable() {
133
			@Override
134
			public void run() {
135
				/*try {
136
					emailUtils.sendActivationEmail(user, token);
137
				} catch (MessagingException e) {
138
					e.printStackTrace();
139
				}*/
140
			}
141
		});
142
	}
143

    
144
	@Override
145
	public User login(String email, String password) throws PersonManagerException {
146

    
147
		if (userDAO.verifyLogin(email, password)) {
148
			User user = getByEmail(email);
149
			if (user.isActive())
150
				return user;
151
			else
152
				throw new PersonManagerException(PersonManagerException.ErrorCause.NOT_ACTIVATED);
153
		} else {
154
			throw new PersonManagerException(PersonManagerException.ErrorCause.WRONG_EMAIL_OR_PASSWORD);
155
		}
156
	}
157

    
158
	@Override
159
	public User activate(final String email, final String token) throws PersonManagerException {
160

    
161
		if (!userDAO.verifyToken(email, token))
162
			throw new PersonManagerException(PersonManagerException.ErrorCause.NOT_EXISTS);
163
		else {
164
			User user = userDAO.getUserByEmail(email);
165
			userDAO.activateUser(user.getEmail());
166
			userDAO.deleteToken(user.getEmail(), token);
167
		}
168
		return getByEmail(email);
169
	}
170

    
171
	@Override
172
	public void resetPassword(final String email) throws PersonManagerException {
173
		SecureRandom random = new SecureRandom();
174
		final String newPassword = new BigInteger(50, random).toString(32);
175

    
176
		if (!userDAO.updatePassword(newPassword, email)) {
177
			throw new PersonManagerException(PersonManagerException.ErrorCause.NOT_EXISTS);
178
		}
179
		executorService.submit(new Runnable() {
180
			@Override
181
			public void run() {
182
				User user = userDAO.getUserByEmail(email);
183

    
184
				/*try {
185
					emailUtils.sendResetPasswordEmail(user, newPassword);
186
				} catch (MessagingException e) {
187
					e.printStackTrace();
188
				}*/
189
			}
190
		});
191
	}
192

    
193
	@Override
194
	public List<Role> getRoles() {
195
		return userDAO.getRoles();
196
	}
197

    
198
	@Override
199
	public List<User> getModerators() {
200
		return userDAO.getModerators();
201
	}
202

    
203
	@Override
204
	public List<User> getAccountingOfficers() {
205
		return userDAO.getAccountingOfficers();
206
	}
207

    
208
	@Override
209
	public void activateUser(String email) {
210
		userDAO.activateUser(email);
211
	}
212

    
213
	@Override
214
	public void activateUsers(List<String> userIds) {
215
		for (String userId : userIds) {
216
			userDAO.activateUser(userId);
217
		}
218
	}
219

    
220
	@Override
221
	public void deactivateUser(String email) {
222
		userDAO.deactivateUser(email);
223
	}
224

    
225
	@Override
226
	public void deactivateUsers(List<String> emails) {
227
		for (String email : emails) {
228
			userDAO.deactivateUser(email);
229
		}
230
	}
231

    
232
	@Override
233
	public void acceptUserRole(final String email, final String roleId) {
234
		userDAO.acceptUserRole(email, roleId);
235

    
236
		executorService.submit(new Runnable() {
237
			@Override
238
			public void run() {
239
				/*User user = userDAO.getUserByEmail(email);
240
				Role role = userDAO.getRole(roleId);
241
				List<User> moderators = getModerators();
242

    
243
				try {
244
					emailUtils.sendUserRoleAcceptedEmail(user, role);
245

    
246
					for (User moderator : moderators)
247
						emailUtils.sendModeratorRoleAcceptedEmail(moderator, user, role);
248
				} catch (MessagingException e) {
249
					e.printStackTrace();
250
				}*/
251
			}
252
		});
253
	}
254

    
255
	@Override
256
	public void rejectRole(final String email, final String roleId) {
257
		userDAO.rejectUserRole(email, roleId);
258

    
259
		executorService.submit(new Runnable() {
260
			@Override
261
			public void run() {
262
				/*User user = userDAO.getUserByEmail(email);
263
				Role role = userDAO.getRole(roleId);
264
				List<User> moderators = getModerators();
265

    
266
				try {
267
					emailUtils.sendUserRoleRejectedEmail(user, role);
268

    
269
					for (User moderator : moderators)
270
						emailUtils.sendModeratorRoleRejectedEmail(moderator, user, role);
271
				} catch (MessagingException e) {
272
					e.printStackTrace();
273
				}*/
274
			}
275
		});
276
	}
277

    
278
	@Override
279
	public List<User> getUsers() {
280
		return userDAO.getUsers();
281
	}
282

    
283
	@Override
284
	public String generateId(User user) {
285
		StringBuilder sb = new StringBuilder();
286

    
287
		sb.append(user.getFirstname()).append(user.getLastname()).append(user.getEmail());
288
		return "portal::" + DigestUtils.md5Hex(sb.toString());
289
	}
290

    
291
	public int getTokenTTL() {
292
		return tokenTTL;
293
	}
294

    
295
	public void setTokenTTL(int tokenTTL) {
296
		this.tokenTTL = tokenTTL;
297
	}
298
}
(29-29/29)