Subversion Repositories SmartDukaan

Rev

Rev 37210 | 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,
37988 vikas 158
			@RequestParam(name = "extendedName", defaultValue = "") String extendedName,
24383 amit.gupta 159
			@RequestParam(name = ProfitMandiConstants.EMAIL_ID, defaultValue = "") String emailId,
160
			@RequestParam(name = ProfitMandiConstants.MOBILE_NUMBER, defaultValue = "") String mobileNumber,
25366 tejbeer 161
			@RequestParam(name = ProfitMandiConstants.GMAIL_ID, defaultValue = "") String gmailId,
27595 tejbeer 162
			@RequestParam(name = "employeeCode", defaultValue = "") String employeeCode,
32463 jai.hind 163
								 @RequestParam(name = "imageUrl", defaultValue = "") String imageUrl,
164
								 @RequestParam(name = "offset", defaultValue = "0") int offset,
33066 raveendra. 165
								 @RequestParam(name = "limit", defaultValue = "0") int limit, Model model)
24383 amit.gupta 166
			throws ProfitMandiBusinessException {
167
		AuthUser authUser = null;
168
		User user = null;
169
		List<Role> roles = roleRepository.selectAll();
170
		try {
171
			user = userRepository.selectByEmailId(emailId);
172
			userRoleRepository.deleteByUserId(user.getId());
173
			for (Role role : roles) {
174
				UserRole userRole = new UserRole();
175
				userRole.setRoleId(role.getId());
176
				userRole.setUserId(user.getId());
177
				userRoleRepository.persist(userRole);
178
			}
179
		} catch (Exception ex) {
180
			user = new User();
181
			user.setFirstName(firstName);
182
			user.setLastName(lastName);
183
			user.setUsername(emailId);
184
			user.setEmailId(emailId);
185
			user.setPassword("");
186
			user.setMobileNumber(mobileNumber);
187
			user.setCity("Noida");
188
			user.setPinCode(201301);
189
			user.setActivated(true);
190
			user.setMobile_verified(true);
191
			user.setReferral_url("");
192
			user.setUpdateTimestamp(LocalDateTime.now());
193
			user.setStatus(0);
194
			user.setCreateTimestamp(LocalDateTime.now());
195
			userRepository.persist(user);
196
			LOGGER.info("User created successfully");
197
			for (Role role : roles) {
198
				UserRole userRole = new UserRole();
199
				userRole.setRoleId(role.getId());
200
				userRole.setUserId(user.getId());
201
				userRoleRepository.persist(userRole);
202
			}
203
		}
204
		authUser = new AuthUser();
205
		authUser.setEmailId(emailId);
206
		authUser.setFirstName(firstName);
207
		authUser.setLastName(lastName);
37988 vikas 208
		authUser.setExtendedName(extendedName.trim().isEmpty() ? null : extendedName.trim());
24383 amit.gupta 209
		authUser.setMobileNumber(mobileNumber);
25366 tejbeer 210
		authUser.setGmailId(gmailId);
32463 jai.hind 211
		authUser.setImageUrl(imageUrl);
27595 tejbeer 212
		authUser.setEmployeeCode(employeeCode);
25587 tejbeer 213
		authUser.setActive(true);
25570 tejbeer 214
 
24383 amit.gupta 215
		authUser.setCreatedTimestamp(LocalDateTime.now());
216
		authService.addAuthUser(authUser);
217
 
218
		List<AuthUser> authUsers = authRepository.selectAll(offset, limit);
219
		long size = authRepository.selectCountAuthUser();
220
		model.addAttribute("authUsers", authUsers);
221
		model.addAttribute("start", offset + 1);
222
		model.addAttribute("size", size);
223
		if (authUsers.size() < limit) {
224
			model.addAttribute("end", offset + authUsers.size());
225
		} else {
226
			model.addAttribute("end", offset + limit);
227
		}
228
		return "create-auth-user";
229
	}
230
 
231
	@GetMapping(value = "/changePassword")
232
	public String getChangePassword(HttpServletRequest request, Model model) {
233
		return "change-auth-user-password";
234
	}
235
 
236
	@PostMapping(value = "/changePassword")
237
	public String changePassword(HttpServletRequest request,
238
			@RequestParam(name = "oldPassword", defaultValue = "") String oldPassword,
239
			@RequestParam(name = "newPassword", defaultValue = "") String newPassword, Model model)
240
			throws ProfitMandiBusinessException {
241
 
242
		LoginDetails loginDetails = cookiesProcessor.getCookiesObject(request);
243
		authService.changePassword(loginDetails.getEmailId(), oldPassword, newPassword);
244
		return "change-auth-user-password";
245
	}
246
 
37105 amit 247
	@GetMapping(value = "/resetPasswordPage")
248
	public String getResetPasswordPage(HttpServletRequest request, Model model) {
249
		return "reset-password";
250
	}
251
 
252
	@PostMapping(value = "/resetPasswordOverride")
253
	public String resetPasswordOverride(HttpServletRequest request,
254
			@RequestParam(name = "type", defaultValue = "") String type,
255
			@RequestParam(name = "identifier", defaultValue = "") String identifier,
256
			@RequestParam(name = "retailerId", defaultValue = "0") int retailerId,
37205 amit 257
			@RequestParam(name = "partnerKey", defaultValue = "") String partnerKey,
37105 amit 258
			@RequestParam(name = "newPassword", defaultValue = "") String newPassword, Model model)
259
			throws Exception {
260
		if (isProd) {
261
			throw new ProfitMandiBusinessException("Access Denied", "Environment",
262
					"Password override is disabled in production");
263
		}
37205 amit 264
		// Partner may be given directly by store code or retailer id (partnerKey) instead of the autosuggest.
265
		if ("PARTNER".equalsIgnoreCase(type) && retailerId <= 0 && !partnerKey.trim().isEmpty()) {
266
			String key = partnerKey.trim();
267
			if (key.matches("\\d+")) {
268
				retailerId = Integer.parseInt(key);
269
			} else {
270
				retailerId = fofoStoreRepository.selectByStoreCode(key.toUpperCase()).getId();
271
			}
272
		}
37127 amit 273
		LoginDetails loginDetails = cookiesProcessor.getCookiesObject(request);
274
		applyOverride(type, retailerId, identifier, newPassword, loginDetails.getEmailId());
275
		model.addAttribute("response1", mvcResponseSender.createResponseString(true));
276
		return "response";
277
	}
278
 
279
	// Reset one target's live password and record it in devtools.password_override.
280
	private void applyOverride(String type, int retailerId, String identifier, String newPassword, String setBy)
281
			throws ProfitMandiBusinessException {
282
		if (newPassword == null || newPassword.trim().isEmpty()) {
37105 amit 283
			throw new ProfitMandiBusinessException("Password", "newPassword", "New password cannot be blank");
284
		}
285
		if ("PARTNER".equalsIgnoreCase(type)) {
286
			if (retailerId <= 0) {
287
				throw new ProfitMandiBusinessException("Partner", "retailerId", "Please select a partner");
288
			}
37127 amit 289
			String stored = userService.resetPasswordById(retailerId, newPassword);
37201 amit 290
			// Partner identifier is mandatorily the store code (resolved server-side, not from input).
291
			String storeCode = fofoStoreRepository.selectByRetailerId(retailerId).getCode();
292
			passwordOverrideRepository.upsert("PARTNER", 0, retailerId, storeCode, stored, newPassword, setBy);
293
			LOGGER.info("Password override for partner retailerId={} storeCode={} by {}", retailerId, storeCode, setBy);
37105 amit 294
		} else {
37127 amit 295
			if (identifier == null || identifier.trim().isEmpty()) {
37105 amit 296
				throw new ProfitMandiBusinessException("Auth User", "identifier", "Please enter an email or mobile");
297
			}
37210 amit 298
			AuthUser authUser = authService.resetAuthUserPassword(identifier.trim(), newPassword);
37127 amit 299
			passwordOverrideRepository.upsert("AUTH_USER", authUser.getId(), 0, identifier.trim(),
300
					authUser.getPassword(), newPassword, setBy);
301
			LOGGER.info("Password override for authUser={} by {}", identifier.trim(), setBy);
37105 amit 302
		}
37127 amit 303
	}
304
 
305
	@GetMapping(value = "/passwordOverride/download")
306
	public ResponseEntity<?> downloadPasswordOverrides(HttpServletRequest request) throws Exception {
307
		if (isProd) {
308
			throw new ProfitMandiBusinessException("Access Denied", "Environment",
309
					"Password override is disabled in production");
310
		}
311
		java.io.ByteArrayOutputStream out = new java.io.ByteArrayOutputStream();
312
		ExcelUtils.writePasswordOverrides(passwordOverrideRepository.selectAll(), out);
313
		byte[] bytes = out.toByteArray();
314
		HttpHeaders headers = new HttpHeaders();
315
		headers.set("Content-Type", "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet");
316
		headers.set("Content-disposition", "attachment; filename=password-overrides.xlsx");
317
		headers.setContentLength(bytes.length);
318
		return new ResponseEntity<>(new InputStreamResource(new java.io.ByteArrayInputStream(bytes)), headers,
319
				HttpStatus.OK);
320
	}
321
 
322
	@PostMapping(value = "/passwordOverride/upload")
323
	public String uploadPasswordOverrides(HttpServletRequest request,
324
			@RequestPart("file") MultipartFile file, Model model) throws Exception {
325
		if (isProd) {
326
			throw new ProfitMandiBusinessException("Access Denied", "Environment",
327
					"Password override is disabled in production");
328
		}
329
		LoginDetails loginDetails = cookiesProcessor.getCookiesObject(request);
330
		List<PasswordOverrideRow> rows = ExcelUtils.parsePasswordOverrides(file.getInputStream());
331
		int applied = 0;
332
		List<String> failures = new ArrayList<>();
333
		for (int i = 0; i < rows.size(); i++) {
334
			PasswordOverrideRow r = rows.get(i);
335
			if (r.getCleartextPassword() == null || r.getCleartextPassword().trim().isEmpty()) {
336
				continue; // blank password = leave this target unchanged
337
			}
338
			try {
339
				int retailerId = "PARTNER".equalsIgnoreCase(r.getType()) ? r.getRetailerId() : 0;
340
				applyOverride(r.getType(), retailerId, r.getIdentifier(), r.getCleartextPassword(),
341
						loginDetails.getEmailId());
342
				applied++;
343
			} catch (Exception e) {
344
				failures.add("Row " + (i + 2) + " (" + r.getType() + " "
345
						+ (r.getIdentifier() == null ? r.getRetailerId() : r.getIdentifier()) + "): " + e.getMessage());
346
			}
347
		}
348
		LOGGER.info("Bulk password override by {}: {} applied, {} failed", loginDetails.getEmailId(), applied,
349
				failures.size());
350
		model.addAttribute("response1", mvcResponseSender.createResponseString(
351
				"Applied " + applied + " of " + rows.size() + " row(s)."
352
						+ (failures.isEmpty() ? "" : " Failures: " + String.join("; ", failures))));
37105 amit 353
		return "response";
354
	}
355
 
24383 amit.gupta 356
	@GetMapping(value = "/getPaginatedAuthUser")
357
	public String getPaginatedAuthUser(HttpServletRequest request,
358
			@RequestParam(name = "offset", defaultValue = "0") int offset,
359
			@RequestParam(name = "limit", defaultValue = "10") int limit, Model model) {
27806 tejbeer 360
		// List<AuthUser> authUsers = authRepository.selectAll(offset, limit);
29209 manish 361
 
362
		List<AuthUser> activeAuthUsers = authRepository.selectAllActiveUser();
363
 
25570 tejbeer 364
		List<AuthUser> authUsers = authRepository.selectAllActiveUser(offset, limit);
29209 manish 365
 
366
		Map<Integer, AuthUser> userManagerMap = new HashMap<>();
367
 
368
		for (AuthUser authUser : authUsers) {
369
			if (authUser.getManagerId() != 0) {
370
				userManagerMap.put(authUser.getId(), authRepository.selectById(authUser.getManagerId()));
371
			}
372
		}
373
		model.addAttribute("userManagerMap", userManagerMap);
24383 amit.gupta 374
		model.addAttribute("authUsers", authUsers);
29209 manish 375
		model.addAttribute("activeAuthUsers", activeAuthUsers);
376
		model.addAttribute("url", "/getPaginatedAuthUser");
24383 amit.gupta 377
		return "auth-users-paginated";
378
	}
25570 tejbeer 379
 
380
	@GetMapping(value = "/authuser/edit")
381
	public String updateAuthUser(Model model, @RequestParam String gmailId, @RequestParam String emailId)
382
			throws Exception {
24478 amit.gupta 383
		AuthUser user = authRepository.selectByEmailOrMobile(emailId);
384
		user.setGmailId(gmailId);
32559 amit.gupta 385
		//authRepository.persist(user);
31238 amit.gupta 386
		model.addAttribute("response1", "true");
24478 amit.gupta 387
		return "response";
388
	}
32463 jai.hind 389
	@GetMapping(value = "/authuser/editImageUrl")
390
	public String updateAuthUserImage(Model model, @RequestParam String imageUrl ,@RequestParam String emailId)
391
		throws Exception{
392
		AuthUser user = authRepository.selectByEmailOrMobile(emailId);
393
		user.setImageUrl(imageUrl);
394
		model.addAttribute("response1", "true");
395
		return "response";
396
	}
27595 tejbeer 397
 
37988 vikas 398
	@GetMapping(value = "/authuser/editExtendedName")
399
	public String updateAuthUserExtendedName(Model model, @RequestParam(defaultValue = "") String extendedName,
400
			@RequestParam String emailId) throws Exception {
401
		AuthUser user = authRepository.selectByEmailOrMobile(emailId);
402
		user.setExtendedName(extendedName.trim().isEmpty() ? null : extendedName.trim());
403
		model.addAttribute("response1", "true");
404
		return "response";
405
	}
406
 
25570 tejbeer 407
	@PostMapping(value = "/authuser/remove")
27595 tejbeer 408
	public String removeAuthUser(Model model, @RequestParam int id) throws Exception {
25570 tejbeer 409
		AuthUser user = authRepository.selectById(id);
27806 tejbeer 410
 
25570 tejbeer 411
		user.setActive(false);
35395 amit 412
		List<Position> positions = positionRepository.selectAllByAuthUserId(user.getId());
27806 tejbeer 413
		for (Position position : positions) {
414
			List<PartnerPosition> partnerPositions = partnerPositionRepository.selectByPositionId(position.getId());
415
			positionRepository.delete(position.getId());
416
			for (PartnerPosition partnerPosition : partnerPositions) {
417
				partnerPositionRepository.delete(partnerPosition.getPositionId());
418
			}
419
		}
31238 amit.gupta 420
		model.addAttribute("response1", "true");
25570 tejbeer 421
		return "response";
422
	}
25366 tejbeer 423
 
24383 amit.gupta 424
}