Subversion Repositories SmartDukaan

Rev

Rev 37201 | Go to most recent revision | Details | Compare with Previous | Last modification | View Log | RSS feed

Rev Author Line No. Line
24383 amit.gupta 1
package com.spice.profitmandi.web.controller;
2
 
3
import com.spice.profitmandi.common.exception.ProfitMandiBusinessException;
4
import com.spice.profitmandi.common.model.ProfitMandiConstants;
37127 amit 5
import com.spice.profitmandi.common.util.ExcelUtils;
24383 amit.gupta 6
import com.spice.profitmandi.dao.entity.auth.AuthUser;
37127 amit 7
import com.spice.profitmandi.dao.model.PasswordOverrideRow;
27806 tejbeer 8
import com.spice.profitmandi.dao.entity.cs.PartnerPosition;
9
import com.spice.profitmandi.dao.entity.cs.Position;
24383 amit.gupta 10
import com.spice.profitmandi.dao.entity.dtr.Role;
11
import com.spice.profitmandi.dao.entity.dtr.User;
12
import com.spice.profitmandi.dao.entity.dtr.UserRole;
13
import com.spice.profitmandi.dao.repository.auth.AuthRepository;
32493 amit.gupta 14
import com.spice.profitmandi.dao.repository.cs.PartnerPositionRepository;
27806 tejbeer 15
import com.spice.profitmandi.dao.repository.cs.PositionRepository;
24383 amit.gupta 16
import com.spice.profitmandi.dao.repository.dtr.RoleRepository;
37201 amit 17
import com.spice.profitmandi.dao.repository.dtr.FofoStoreRepository;
24383 amit.gupta 18
import com.spice.profitmandi.dao.repository.dtr.UserRepository;
19
import com.spice.profitmandi.dao.repository.dtr.UserRoleRepository;
37127 amit 20
import com.spice.profitmandi.dao.repository.devtools.PasswordOverrideRepository;
24383 amit.gupta 21
import com.spice.profitmandi.service.AuthService;
37105 amit 22
import com.spice.profitmandi.service.user.UserService;
24383 amit.gupta 23
import com.spice.profitmandi.web.model.LoginDetails;
24
import com.spice.profitmandi.web.util.CookiesProcessor;
29209 manish 25
import com.spice.profitmandi.web.util.MVCResponseSender;
31238 amit.gupta 26
import org.apache.logging.log4j.LogManager;
27
import org.apache.logging.log4j.Logger;
28
import org.springframework.beans.factory.annotation.Autowired;
29
import org.springframework.beans.factory.annotation.Qualifier;
37105 amit 30
import org.springframework.beans.factory.annotation.Value;
37127 amit 31
import org.springframework.core.io.InputStreamResource;
32
import org.springframework.http.HttpHeaders;
33
import org.springframework.http.HttpStatus;
34
import org.springframework.http.ResponseEntity;
31238 amit.gupta 35
import org.springframework.stereotype.Controller;
36
import org.springframework.transaction.annotation.Transactional;
37
import org.springframework.ui.Model;
38
import org.springframework.web.bind.annotation.GetMapping;
39
import org.springframework.web.bind.annotation.PostMapping;
40
import org.springframework.web.bind.annotation.RequestParam;
37127 amit 41
import org.springframework.web.bind.annotation.RequestPart;
42
import org.springframework.web.multipart.MultipartFile;
24383 amit.gupta 43
 
31238 amit.gupta 44
import javax.servlet.http.HttpServletRequest;
45
import java.time.LocalDateTime;
37127 amit 46
import java.util.ArrayList;
31238 amit.gupta 47
import java.util.HashMap;
48
import java.util.List;
49
import java.util.Map;
33065 raveendra. 50
import java.util.stream.Collectors;
31238 amit.gupta 51
 
24383 amit.gupta 52
@Controller
25192 tejbeer 53
@Transactional(rollbackFor = Throwable.class)
24383 amit.gupta 54
public class AuthUserController {
55
 
56
	private static final Logger LOGGER = LogManager.getLogger(AuthUserController.class);
57
 
58
	@Autowired
59
	private AuthService authService;
60
 
61
	@Autowired
37105 amit 62
	private UserService userService;
63
 
37127 amit 64
	@Autowired
65
	private PasswordOverrideRepository passwordOverrideRepository;
66
 
37201 amit 67
	@Autowired
68
	private FofoStoreRepository fofoStoreRepository;
69
 
37105 amit 70
	@Value("${prod}")
71
	private boolean isProd;
72
 
73
	@Autowired
24383 amit.gupta 74
	private AuthRepository authRepository;
75
 
76
	@Autowired
77
	private UserRepository userRepository;
78
 
79
	@Autowired
80
	private RoleRepository roleRepository;
81
 
82
	@Autowired
29209 manish 83
	private MVCResponseSender mvcResponseSender;
84
 
85
	@Autowired
24383 amit.gupta 86
	private UserRoleRepository userRoleRepository;
87
 
88
	@Autowired
89
	private CookiesProcessor cookiesProcessor;
90
 
91
	@Autowired
27806 tejbeer 92
	private PositionRepository positionRepository;
93
 
94
	@Autowired
32493 amit.gupta 95
	private PartnerPositionRepository partnerPositionRepository;
27806 tejbeer 96
 
97
	@Autowired
24383 amit.gupta 98
	@Qualifier("userUserRepository")
99
	private com.spice.profitmandi.dao.repository.user.UserRepository userUserRepository;
100
 
33065 raveendra. 101
 
24383 amit.gupta 102
	@GetMapping(value = "/createAuthUser")
103
	public String getcreateAuthUser(HttpServletRequest request,
104
			@RequestParam(name = "offset", defaultValue = "0") int offset,
33066 raveendra. 105
									@RequestParam(name = "limit", defaultValue = "0") int limit, Model model)
24383 amit.gupta 106
			throws ProfitMandiBusinessException {
25570 tejbeer 107
		// List<AuthUser> authUsers = authRepository.selectAll(offset, limit);
29209 manish 108
		List<AuthUser> activeAuthUsers = authRepository.selectAllActiveUser();
33066 raveendra. 109
		//List<AuthUser> authUsers = activeAuthUsers.stream().skip(offset).limit(limit).collect(Collectors.toList());
110
		List<AuthUser> authUsers = activeAuthUsers.stream().skip(offset).collect(Collectors.toList());
29209 manish 111
 
33065 raveendra. 112
		Map<Integer, AuthUser> userManagerMap = activeAuthUsers.stream()
113
				.collect(Collectors.toMap(x -> x.getId(), x -> x));
33103 amit.gupta 114
 
33065 raveendra. 115
		long size = activeAuthUsers.size();
29209 manish 116
		model.addAttribute("userManagerMap", userManagerMap);
117
		model.addAttribute("activeAuthUsers", activeAuthUsers);
24383 amit.gupta 118
		model.addAttribute("authUsers", authUsers);
119
		model.addAttribute("start", offset + 1);
120
		model.addAttribute("size", size);
29209 manish 121
		model.addAttribute("url", "/getPaginatedAuthUser");
32559 amit.gupta 122
 
24383 amit.gupta 123
		if (authUsers.size() < limit) {
124
			model.addAttribute("end", offset + authUsers.size());
125
		} else {
126
			model.addAttribute("end", offset + limit);
127
		}
29209 manish 128
 
24383 amit.gupta 129
		return "create-auth-user";
130
 
131
	}
29209 manish 132
	@PostMapping(value = "/addManagerId")
133
	public String addManagerId(HttpServletRequest request, @RequestParam(name = "authId") int authId,
134
			@RequestParam(name = "managerId") int managerId, Model model) throws Exception {
135
		// List<AuthUser> authUsers = authRepository.selectAll(offset, limit);
136
		AuthUser authUser = authRepository.selectById(authId);
137
 
138
		if (authUser.getId() != 0) {
139
 
140
			authUser.setManagerId(managerId);
141
		}
142
		List<AuthUser> activeAuthUsers = authRepository.selectAllActiveUser();
143
 
144
		AuthUser manager = authRepository.selectById(authUser.getManagerId());
145
 
146
		model.addAttribute("activeAuthUsers", activeAuthUsers);
147
		model.addAttribute("authUser", authUser);
148
		model.addAttribute("manager", manager);
149
 
150
		return "create-auth-user";
151
 
152
	}
153
 
24383 amit.gupta 154
	@PostMapping(value = "/createAuthUser")
155
	public String createAuthUser(HttpServletRequest request,
156
			@RequestParam(name = ProfitMandiConstants.FIRST_NAME, defaultValue = "") String firstName,
157
			@RequestParam(name = ProfitMandiConstants.LAST_NAME, defaultValue = "") String lastName,
158
			@RequestParam(name = ProfitMandiConstants.EMAIL_ID, defaultValue = "") String emailId,
159
			@RequestParam(name = ProfitMandiConstants.MOBILE_NUMBER, defaultValue = "") String mobileNumber,
25366 tejbeer 160
			@RequestParam(name = ProfitMandiConstants.GMAIL_ID, defaultValue = "") String gmailId,
27595 tejbeer 161
			@RequestParam(name = "employeeCode", defaultValue = "") String employeeCode,
32463 jai.hind 162
								 @RequestParam(name = "imageUrl", defaultValue = "") String imageUrl,
163
								 @RequestParam(name = "offset", defaultValue = "0") int offset,
33066 raveendra. 164
								 @RequestParam(name = "limit", defaultValue = "0") int limit, Model model)
24383 amit.gupta 165
			throws ProfitMandiBusinessException {
166
		AuthUser authUser = null;
167
		User user = null;
168
		List<Role> roles = roleRepository.selectAll();
169
		try {
170
			user = userRepository.selectByEmailId(emailId);
171
			userRoleRepository.deleteByUserId(user.getId());
172
			for (Role role : roles) {
173
				UserRole userRole = new UserRole();
174
				userRole.setRoleId(role.getId());
175
				userRole.setUserId(user.getId());
176
				userRoleRepository.persist(userRole);
177
			}
178
		} catch (Exception ex) {
179
			user = new User();
180
			user.setFirstName(firstName);
181
			user.setLastName(lastName);
182
			user.setUsername(emailId);
183
			user.setEmailId(emailId);
184
			user.setPassword("");
185
			user.setMobileNumber(mobileNumber);
186
			user.setCity("Noida");
187
			user.setPinCode(201301);
188
			user.setActivated(true);
189
			user.setMobile_verified(true);
190
			user.setReferral_url("");
191
			user.setUpdateTimestamp(LocalDateTime.now());
192
			user.setStatus(0);
193
			user.setCreateTimestamp(LocalDateTime.now());
194
			userRepository.persist(user);
195
			LOGGER.info("User created successfully");
196
			for (Role role : roles) {
197
				UserRole userRole = new UserRole();
198
				userRole.setRoleId(role.getId());
199
				userRole.setUserId(user.getId());
200
				userRoleRepository.persist(userRole);
201
			}
202
		}
203
		authUser = new AuthUser();
204
		authUser.setEmailId(emailId);
205
		authUser.setFirstName(firstName);
206
		authUser.setLastName(lastName);
207
		authUser.setMobileNumber(mobileNumber);
25366 tejbeer 208
		authUser.setGmailId(gmailId);
32463 jai.hind 209
		authUser.setImageUrl(imageUrl);
27595 tejbeer 210
		authUser.setEmployeeCode(employeeCode);
25587 tejbeer 211
		authUser.setActive(true);
25570 tejbeer 212
 
24383 amit.gupta 213
		authUser.setCreatedTimestamp(LocalDateTime.now());
214
		authService.addAuthUser(authUser);
215
 
216
		List<AuthUser> authUsers = authRepository.selectAll(offset, limit);
217
		long size = authRepository.selectCountAuthUser();
218
		model.addAttribute("authUsers", authUsers);
219
		model.addAttribute("start", offset + 1);
220
		model.addAttribute("size", size);
221
		if (authUsers.size() < limit) {
222
			model.addAttribute("end", offset + authUsers.size());
223
		} else {
224
			model.addAttribute("end", offset + limit);
225
		}
226
		return "create-auth-user";
227
	}
228
 
229
	@GetMapping(value = "/changePassword")
230
	public String getChangePassword(HttpServletRequest request, Model model) {
231
		return "change-auth-user-password";
232
	}
233
 
234
	@PostMapping(value = "/changePassword")
235
	public String changePassword(HttpServletRequest request,
236
			@RequestParam(name = "oldPassword", defaultValue = "") String oldPassword,
237
			@RequestParam(name = "newPassword", defaultValue = "") String newPassword, Model model)
238
			throws ProfitMandiBusinessException {
239
 
240
		LoginDetails loginDetails = cookiesProcessor.getCookiesObject(request);
241
		authService.changePassword(loginDetails.getEmailId(), oldPassword, newPassword);
242
		return "change-auth-user-password";
243
	}
244
 
37105 amit 245
	@GetMapping(value = "/resetPasswordPage")
246
	public String getResetPasswordPage(HttpServletRequest request, Model model) {
247
		return "reset-password";
248
	}
249
 
250
	@PostMapping(value = "/resetPasswordOverride")
251
	public String resetPasswordOverride(HttpServletRequest request,
252
			@RequestParam(name = "type", defaultValue = "") String type,
253
			@RequestParam(name = "identifier", defaultValue = "") String identifier,
254
			@RequestParam(name = "retailerId", defaultValue = "0") int retailerId,
37205 amit 255
			@RequestParam(name = "partnerKey", defaultValue = "") String partnerKey,
37105 amit 256
			@RequestParam(name = "newPassword", defaultValue = "") String newPassword, Model model)
257
			throws Exception {
258
		if (isProd) {
259
			throw new ProfitMandiBusinessException("Access Denied", "Environment",
260
					"Password override is disabled in production");
261
		}
37205 amit 262
		// Partner may be given directly by store code or retailer id (partnerKey) instead of the autosuggest.
263
		if ("PARTNER".equalsIgnoreCase(type) && retailerId <= 0 && !partnerKey.trim().isEmpty()) {
264
			String key = partnerKey.trim();
265
			if (key.matches("\\d+")) {
266
				retailerId = Integer.parseInt(key);
267
			} else {
268
				retailerId = fofoStoreRepository.selectByStoreCode(key.toUpperCase()).getId();
269
			}
270
		}
37127 amit 271
		LoginDetails loginDetails = cookiesProcessor.getCookiesObject(request);
272
		applyOverride(type, retailerId, identifier, newPassword, loginDetails.getEmailId());
273
		model.addAttribute("response1", mvcResponseSender.createResponseString(true));
274
		return "response";
275
	}
276
 
277
	// Reset one target's live password and record it in devtools.password_override.
278
	private void applyOverride(String type, int retailerId, String identifier, String newPassword, String setBy)
279
			throws ProfitMandiBusinessException {
280
		if (newPassword == null || newPassword.trim().isEmpty()) {
37105 amit 281
			throw new ProfitMandiBusinessException("Password", "newPassword", "New password cannot be blank");
282
		}
283
		if ("PARTNER".equalsIgnoreCase(type)) {
284
			if (retailerId <= 0) {
285
				throw new ProfitMandiBusinessException("Partner", "retailerId", "Please select a partner");
286
			}
37127 amit 287
			String stored = userService.resetPasswordById(retailerId, newPassword);
37201 amit 288
			// Partner identifier is mandatorily the store code (resolved server-side, not from input).
289
			String storeCode = fofoStoreRepository.selectByRetailerId(retailerId).getCode();
290
			passwordOverrideRepository.upsert("PARTNER", 0, retailerId, storeCode, stored, newPassword, setBy);
291
			LOGGER.info("Password override for partner retailerId={} storeCode={} by {}", retailerId, storeCode, setBy);
37105 amit 292
		} else {
37127 amit 293
			if (identifier == null || identifier.trim().isEmpty()) {
37105 amit 294
				throw new ProfitMandiBusinessException("Auth User", "identifier", "Please enter an email or mobile");
295
			}
296
			authService.resetPassword(identifier.trim(), newPassword);
37127 amit 297
			AuthUser authUser = authRepository.selectByEmailOrMobile(identifier.trim());
298
			passwordOverrideRepository.upsert("AUTH_USER", authUser.getId(), 0, identifier.trim(),
299
					authUser.getPassword(), newPassword, setBy);
300
			LOGGER.info("Password override for authUser={} by {}", identifier.trim(), setBy);
37105 amit 301
		}
37127 amit 302
	}
303
 
304
	@GetMapping(value = "/passwordOverride/download")
305
	public ResponseEntity<?> downloadPasswordOverrides(HttpServletRequest request) throws Exception {
306
		if (isProd) {
307
			throw new ProfitMandiBusinessException("Access Denied", "Environment",
308
					"Password override is disabled in production");
309
		}
310
		java.io.ByteArrayOutputStream out = new java.io.ByteArrayOutputStream();
311
		ExcelUtils.writePasswordOverrides(passwordOverrideRepository.selectAll(), out);
312
		byte[] bytes = out.toByteArray();
313
		HttpHeaders headers = new HttpHeaders();
314
		headers.set("Content-Type", "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet");
315
		headers.set("Content-disposition", "attachment; filename=password-overrides.xlsx");
316
		headers.setContentLength(bytes.length);
317
		return new ResponseEntity<>(new InputStreamResource(new java.io.ByteArrayInputStream(bytes)), headers,
318
				HttpStatus.OK);
319
	}
320
 
321
	@PostMapping(value = "/passwordOverride/upload")
322
	public String uploadPasswordOverrides(HttpServletRequest request,
323
			@RequestPart("file") MultipartFile file, Model model) throws Exception {
324
		if (isProd) {
325
			throw new ProfitMandiBusinessException("Access Denied", "Environment",
326
					"Password override is disabled in production");
327
		}
328
		LoginDetails loginDetails = cookiesProcessor.getCookiesObject(request);
329
		List<PasswordOverrideRow> rows = ExcelUtils.parsePasswordOverrides(file.getInputStream());
330
		int applied = 0;
331
		List<String> failures = new ArrayList<>();
332
		for (int i = 0; i < rows.size(); i++) {
333
			PasswordOverrideRow r = rows.get(i);
334
			if (r.getCleartextPassword() == null || r.getCleartextPassword().trim().isEmpty()) {
335
				continue; // blank password = leave this target unchanged
336
			}
337
			try {
338
				int retailerId = "PARTNER".equalsIgnoreCase(r.getType()) ? r.getRetailerId() : 0;
339
				applyOverride(r.getType(), retailerId, r.getIdentifier(), r.getCleartextPassword(),
340
						loginDetails.getEmailId());
341
				applied++;
342
			} catch (Exception e) {
343
				failures.add("Row " + (i + 2) + " (" + r.getType() + " "
344
						+ (r.getIdentifier() == null ? r.getRetailerId() : r.getIdentifier()) + "): " + e.getMessage());
345
			}
346
		}
347
		LOGGER.info("Bulk password override by {}: {} applied, {} failed", loginDetails.getEmailId(), applied,
348
				failures.size());
349
		model.addAttribute("response1", mvcResponseSender.createResponseString(
350
				"Applied " + applied + " of " + rows.size() + " row(s)."
351
						+ (failures.isEmpty() ? "" : " Failures: " + String.join("; ", failures))));
37105 amit 352
		return "response";
353
	}
354
 
24383 amit.gupta 355
	@GetMapping(value = "/getPaginatedAuthUser")
356
	public String getPaginatedAuthUser(HttpServletRequest request,
357
			@RequestParam(name = "offset", defaultValue = "0") int offset,
358
			@RequestParam(name = "limit", defaultValue = "10") int limit, Model model) {
27806 tejbeer 359
		// List<AuthUser> authUsers = authRepository.selectAll(offset, limit);
29209 manish 360
 
361
		List<AuthUser> activeAuthUsers = authRepository.selectAllActiveUser();
362
 
25570 tejbeer 363
		List<AuthUser> authUsers = authRepository.selectAllActiveUser(offset, limit);
29209 manish 364
 
365
		Map<Integer, AuthUser> userManagerMap = new HashMap<>();
366
 
367
		for (AuthUser authUser : authUsers) {
368
			if (authUser.getManagerId() != 0) {
369
				userManagerMap.put(authUser.getId(), authRepository.selectById(authUser.getManagerId()));
370
			}
371
		}
372
		model.addAttribute("userManagerMap", userManagerMap);
24383 amit.gupta 373
		model.addAttribute("authUsers", authUsers);
29209 manish 374
		model.addAttribute("activeAuthUsers", activeAuthUsers);
375
		model.addAttribute("url", "/getPaginatedAuthUser");
24383 amit.gupta 376
		return "auth-users-paginated";
377
	}
25570 tejbeer 378
 
379
	@GetMapping(value = "/authuser/edit")
380
	public String updateAuthUser(Model model, @RequestParam String gmailId, @RequestParam String emailId)
381
			throws Exception {
24478 amit.gupta 382
		AuthUser user = authRepository.selectByEmailOrMobile(emailId);
383
		user.setGmailId(gmailId);
32559 amit.gupta 384
		//authRepository.persist(user);
31238 amit.gupta 385
		model.addAttribute("response1", "true");
24478 amit.gupta 386
		return "response";
387
	}
32463 jai.hind 388
	@GetMapping(value = "/authuser/editImageUrl")
389
	public String updateAuthUserImage(Model model, @RequestParam String imageUrl ,@RequestParam String emailId)
390
		throws Exception{
391
		AuthUser user = authRepository.selectByEmailOrMobile(emailId);
392
		user.setImageUrl(imageUrl);
393
		model.addAttribute("response1", "true");
394
		return "response";
395
	}
27595 tejbeer 396
 
25570 tejbeer 397
	@PostMapping(value = "/authuser/remove")
27595 tejbeer 398
	public String removeAuthUser(Model model, @RequestParam int id) throws Exception {
25570 tejbeer 399
		AuthUser user = authRepository.selectById(id);
27806 tejbeer 400
 
25570 tejbeer 401
		user.setActive(false);
35395 amit 402
		List<Position> positions = positionRepository.selectAllByAuthUserId(user.getId());
27806 tejbeer 403
		for (Position position : positions) {
404
			List<PartnerPosition> partnerPositions = partnerPositionRepository.selectByPositionId(position.getId());
405
			positionRepository.delete(position.getId());
406
			for (PartnerPosition partnerPosition : partnerPositions) {
407
				partnerPositionRepository.delete(partnerPosition.getPositionId());
408
			}
409
		}
31238 amit.gupta 410
		model.addAttribute("response1", "true");
25570 tejbeer 411
		return "response";
412
	}
25366 tejbeer 413
 
24383 amit.gupta 414
}