Subversion Repositories SmartDukaan

Rev

Rev 37205 | 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
			}
37210 amit 296
			AuthUser authUser = authService.resetAuthUserPassword(identifier.trim(), newPassword);
37127 amit 297
			passwordOverrideRepository.upsert("AUTH_USER", authUser.getId(), 0, identifier.trim(),
298
					authUser.getPassword(), newPassword, setBy);
299
			LOGGER.info("Password override for authUser={} by {}", identifier.trim(), setBy);
37105 amit 300
		}
37127 amit 301
	}
302
 
303
	@GetMapping(value = "/passwordOverride/download")
304
	public ResponseEntity<?> downloadPasswordOverrides(HttpServletRequest request) throws Exception {
305
		if (isProd) {
306
			throw new ProfitMandiBusinessException("Access Denied", "Environment",
307
					"Password override is disabled in production");
308
		}
309
		java.io.ByteArrayOutputStream out = new java.io.ByteArrayOutputStream();
310
		ExcelUtils.writePasswordOverrides(passwordOverrideRepository.selectAll(), out);
311
		byte[] bytes = out.toByteArray();
312
		HttpHeaders headers = new HttpHeaders();
313
		headers.set("Content-Type", "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet");
314
		headers.set("Content-disposition", "attachment; filename=password-overrides.xlsx");
315
		headers.setContentLength(bytes.length);
316
		return new ResponseEntity<>(new InputStreamResource(new java.io.ByteArrayInputStream(bytes)), headers,
317
				HttpStatus.OK);
318
	}
319
 
320
	@PostMapping(value = "/passwordOverride/upload")
321
	public String uploadPasswordOverrides(HttpServletRequest request,
322
			@RequestPart("file") MultipartFile file, Model model) throws Exception {
323
		if (isProd) {
324
			throw new ProfitMandiBusinessException("Access Denied", "Environment",
325
					"Password override is disabled in production");
326
		}
327
		LoginDetails loginDetails = cookiesProcessor.getCookiesObject(request);
328
		List<PasswordOverrideRow> rows = ExcelUtils.parsePasswordOverrides(file.getInputStream());
329
		int applied = 0;
330
		List<String> failures = new ArrayList<>();
331
		for (int i = 0; i < rows.size(); i++) {
332
			PasswordOverrideRow r = rows.get(i);
333
			if (r.getCleartextPassword() == null || r.getCleartextPassword().trim().isEmpty()) {
334
				continue; // blank password = leave this target unchanged
335
			}
336
			try {
337
				int retailerId = "PARTNER".equalsIgnoreCase(r.getType()) ? r.getRetailerId() : 0;
338
				applyOverride(r.getType(), retailerId, r.getIdentifier(), r.getCleartextPassword(),
339
						loginDetails.getEmailId());
340
				applied++;
341
			} catch (Exception e) {
342
				failures.add("Row " + (i + 2) + " (" + r.getType() + " "
343
						+ (r.getIdentifier() == null ? r.getRetailerId() : r.getIdentifier()) + "): " + e.getMessage());
344
			}
345
		}
346
		LOGGER.info("Bulk password override by {}: {} applied, {} failed", loginDetails.getEmailId(), applied,
347
				failures.size());
348
		model.addAttribute("response1", mvcResponseSender.createResponseString(
349
				"Applied " + applied + " of " + rows.size() + " row(s)."
350
						+ (failures.isEmpty() ? "" : " Failures: " + String.join("; ", failures))));
37105 amit 351
		return "response";
352
	}
353
 
24383 amit.gupta 354
	@GetMapping(value = "/getPaginatedAuthUser")
355
	public String getPaginatedAuthUser(HttpServletRequest request,
356
			@RequestParam(name = "offset", defaultValue = "0") int offset,
357
			@RequestParam(name = "limit", defaultValue = "10") int limit, Model model) {
27806 tejbeer 358
		// List<AuthUser> authUsers = authRepository.selectAll(offset, limit);
29209 manish 359
 
360
		List<AuthUser> activeAuthUsers = authRepository.selectAllActiveUser();
361
 
25570 tejbeer 362
		List<AuthUser> authUsers = authRepository.selectAllActiveUser(offset, limit);
29209 manish 363
 
364
		Map<Integer, AuthUser> userManagerMap = new HashMap<>();
365
 
366
		for (AuthUser authUser : authUsers) {
367
			if (authUser.getManagerId() != 0) {
368
				userManagerMap.put(authUser.getId(), authRepository.selectById(authUser.getManagerId()));
369
			}
370
		}
371
		model.addAttribute("userManagerMap", userManagerMap);
24383 amit.gupta 372
		model.addAttribute("authUsers", authUsers);
29209 manish 373
		model.addAttribute("activeAuthUsers", activeAuthUsers);
374
		model.addAttribute("url", "/getPaginatedAuthUser");
24383 amit.gupta 375
		return "auth-users-paginated";
376
	}
25570 tejbeer 377
 
378
	@GetMapping(value = "/authuser/edit")
379
	public String updateAuthUser(Model model, @RequestParam String gmailId, @RequestParam String emailId)
380
			throws Exception {
24478 amit.gupta 381
		AuthUser user = authRepository.selectByEmailOrMobile(emailId);
382
		user.setGmailId(gmailId);
32559 amit.gupta 383
		//authRepository.persist(user);
31238 amit.gupta 384
		model.addAttribute("response1", "true");
24478 amit.gupta 385
		return "response";
386
	}
32463 jai.hind 387
	@GetMapping(value = "/authuser/editImageUrl")
388
	public String updateAuthUserImage(Model model, @RequestParam String imageUrl ,@RequestParam String emailId)
389
		throws Exception{
390
		AuthUser user = authRepository.selectByEmailOrMobile(emailId);
391
		user.setImageUrl(imageUrl);
392
		model.addAttribute("response1", "true");
393
		return "response";
394
	}
27595 tejbeer 395
 
25570 tejbeer 396
	@PostMapping(value = "/authuser/remove")
27595 tejbeer 397
	public String removeAuthUser(Model model, @RequestParam int id) throws Exception {
25570 tejbeer 398
		AuthUser user = authRepository.selectById(id);
27806 tejbeer 399
 
25570 tejbeer 400
		user.setActive(false);
35395 amit 401
		List<Position> positions = positionRepository.selectAllByAuthUserId(user.getId());
27806 tejbeer 402
		for (Position position : positions) {
403
			List<PartnerPosition> partnerPositions = partnerPositionRepository.selectByPositionId(position.getId());
404
			positionRepository.delete(position.getId());
405
			for (PartnerPosition partnerPosition : partnerPositions) {
406
				partnerPositionRepository.delete(partnerPosition.getPositionId());
407
			}
408
		}
31238 amit.gupta 409
		model.addAttribute("response1", "true");
25570 tejbeer 410
		return "response";
411
	}
25366 tejbeer 412
 
24383 amit.gupta 413
}