@@ -10,6 +10,8 @@ public class NewUserReq extends UpdateUserReq { | |||||
@Pattern(regexp = "^[A-Za-z0-9]+$") | @Pattern(regexp = "^[A-Za-z0-9]+$") | ||||
private String username; | private String username; | ||||
private String password; | |||||
public String getUsername() { | public String getUsername() { | ||||
return username; | return username; | ||||
} | } | ||||
@@ -18,4 +20,11 @@ public class NewUserReq extends UpdateUserReq { | |||||
this.username = username; | this.username = username; | ||||
} | } | ||||
public String getPassword() { | |||||
return password; | |||||
} | |||||
public void setPassword(String password) { | |||||
this.password = password; | |||||
} | |||||
} | } |
@@ -15,7 +15,6 @@ public class UpdateUserReq { | |||||
private Boolean locked; | private Boolean locked; | ||||
@Size(max = 90) | @Size(max = 90) | ||||
@NotBlank | |||||
private String name; | private String name; | ||||
private String firstname; | private String firstname; | ||||
@@ -24,11 +23,6 @@ public class UpdateUserReq { | |||||
private String locale; | private String locale; | ||||
private String remarks; | private String remarks; | ||||
@NotBlank | |||||
private String email; | |||||
@NotBlank | |||||
private String department; | |||||
// @NotNull | // @NotNull | ||||
private List<Integer> addGroupIds; | private List<Integer> addGroupIds; | ||||
@@ -132,20 +126,4 @@ public class UpdateUserReq { | |||||
this.remarks = remarks; | this.remarks = remarks; | ||||
} | } | ||||
public String getEmail() { | |||||
return email; | |||||
} | |||||
public void setEmail(String email) { | |||||
this.email = email; | |||||
} | |||||
public String getDepartment() { | |||||
return department; | |||||
} | |||||
public void setDepartment(String department) { | |||||
this.department = department; | |||||
} | |||||
} | } |
@@ -96,7 +96,7 @@ public class GroupService extends AbstractBaseEntityService<Group, Long, GroupRe | |||||
if (instance != null && instance.getId() != null && instance.getId() > 0) { | if (instance != null && instance.getId() != null && instance.getId() > 0) { | ||||
oldValueJson = JsonUtils.toJsonString(jdbcDao.queryForMap(sql.toString(), Map.of("id", instance.getId())).orElseThrow(NotFoundException::new)); | oldValueJson = JsonUtils.toJsonString(jdbcDao.queryForMap(sql.toString(), Map.of("id", instance.getId())).orElseThrow(NotFoundException::new)); | ||||
} | } | ||||
instance = saveAndFlush(instance); | instance = saveAndFlush(instance); | ||||
Long id = instance.getId(); | Long id = instance.getId(); | ||||
@@ -172,5 +172,41 @@ public class GroupService extends AbstractBaseEntityService<Group, Long, GroupRe | |||||
+ " WHERE gu.groupId = :id", | + " WHERE gu.groupId = :id", | ||||
Map.of(Params.ID, id)); | Map.of(Params.ID, id)); | ||||
} | } | ||||
@Transactional(rollbackFor = Exception.class) | |||||
public String getGroupName(Map<String, Object> args) { | |||||
StringBuilder sql = new StringBuilder("select" | |||||
+ " g.name " | |||||
+ " from user u " | |||||
+ " left join user_group ug on u.id = ug.userId " | |||||
+ " left join `group`g on ug.groupId = g.id " | |||||
+ " where g.deleted = false " | |||||
+ " and u.id = :userId" | |||||
); | |||||
return jdbcDao.queryForList(sql.toString(), args).stream().map(String::valueOf).collect(Collectors.joining(",")); | |||||
} | |||||
@Transactional(rollbackFor = Exception.class) | |||||
public List<Map<String, Object>> listAuth(Map<String, Object> args) { | |||||
StringBuilder sql = new StringBuilder("SELECT" | |||||
+ " a.id, " | |||||
+ " a.module," | |||||
+ " a.authority," | |||||
+ " a.name," | |||||
+ " a.description, "); | |||||
if (args.containsKey("groupId")) { | |||||
sql.append(" EXISTS(SELECT 1 FROM group_authority ga WHERE a.id = ga.authId AND groupId = :groupId) AS v"); | |||||
} | |||||
else if (args.containsKey("userId")) { | |||||
sql.append(" EXISTS(SELECT 1 FROM user_authority ua WHERE a.id = ua.authId AND userId = :userId) AS v"); | |||||
} | |||||
else | |||||
sql.append(" 0 AS v"); | |||||
sql.append(" FROM authority a" | |||||
+ " ORDER BY a.module, a.name"); | |||||
return jdbcDao.queryForList(sql.toString(), args); | |||||
} | |||||
} | } |
@@ -6,6 +6,7 @@ import java.util.List; | |||||
import java.util.Map; | import java.util.Map; | ||||
import java.util.Optional; | import java.util.Optional; | ||||
import java.util.Set; | import java.util.Set; | ||||
import java.util.stream.Collectors; | |||||
import org.apache.commons.lang3.StringUtils; | import org.apache.commons.lang3.StringUtils; | ||||
import org.springframework.beans.BeanUtils; | import org.springframework.beans.BeanUtils; | ||||
@@ -157,49 +158,32 @@ public class UserService extends AbstractBaseEntityService<User, Long, UserRepos | |||||
if (instance.getId() == null){ | if (instance.getId() == null){ | ||||
req.setLocked(false); | req.setLocked(false); | ||||
} | } | ||||
req.setName(instance.getName()); | |||||
BeanUtils.copyProperties(req,instance); | BeanUtils.copyProperties(req,instance); | ||||
instance = save(instance); | instance = save(instance); | ||||
// long id = instance.getId(); | |||||
// List<Map<String, Integer>> groupBatchInsertValues = req.getAddGroupIds().stream() | |||||
// .map(groupId -> Map.of("userId", (int) id, "groupId", groupId)) | |||||
// .collect(Collectors.toList()); | |||||
// List<Map<String, Integer>> groupBatchDeleteValues = req.getRemoveGroupIds().stream() | |||||
// .map(groupId -> Map.of("userId", (int) id, "groupId", groupId)) | |||||
// .collect(Collectors.toList()); | |||||
// if (!groupBatchInsertValues.isEmpty()) { | |||||
// jdbcDao.batchUpdate( | |||||
// "INSERT IGNORE INTO user_group (groupId,userId)" | |||||
// + " VALUES (:groupId, :userId)", | |||||
// groupBatchInsertValues); | |||||
// } | |||||
// if (!groupBatchDeleteValues.isEmpty()) { | |||||
// jdbcDao.batchUpdate( | |||||
// "DELETE FROM user_group" | |||||
// + " WHERE groupId = :groupId AND userId = :userId", | |||||
// groupBatchDeleteValues); | |||||
// } | |||||
// List<Map<String, Integer>> authBatchInsertValues = req.getAddAuthIds().stream() | |||||
// .map(authId -> Map.of("userId", (int)id, "authId", authId)) | |||||
// .collect(Collectors.toList()); | |||||
// List<Map<String, Integer>> authBatchDeleteValues = req.getRemoveAuthIds().stream() | |||||
// .map(authId -> Map.of("userId", (int)id, "authId", authId)) | |||||
// .collect(Collectors.toList()); | |||||
// if (!authBatchInsertValues.isEmpty()) { | |||||
// jdbcDao.batchUpdate( | |||||
// "INSERT IGNORE INTO user_authority (userId, authId)" | |||||
// + " VALUES (:userId, :authId)", | |||||
// authBatchInsertValues); | |||||
// } | |||||
// if (!authBatchDeleteValues.isEmpty()) { | |||||
// jdbcDao.batchUpdate( | |||||
// "DELETE FROM user_authority" | |||||
// + " WHERE userId = :userId AND authId = :authId", | |||||
// authBatchDeleteValues); | |||||
// } | |||||
long id = instance.getId(); | |||||
List<Map<String, Integer>> authBatchInsertValues = req.getAddAuthIds().stream() | |||||
.map(authId -> Map.of("userId", (int)id, "authId", authId)) | |||||
.collect(Collectors.toList()); | |||||
List<Map<String, Integer>> authBatchDeleteValues = req.getRemoveAuthIds().stream() | |||||
.map(authId -> Map.of("userId", (int)id, "authId", authId)) | |||||
.collect(Collectors.toList()); | |||||
if (!authBatchDeleteValues.isEmpty()) { | |||||
jdbcDao.batchUpdate( | |||||
"DELETE FROM user_authority" | |||||
+ " WHERE userId = :userId ", | |||||
// + "AND authId = :authId", | |||||
authBatchDeleteValues); | |||||
} | |||||
if (!authBatchInsertValues.isEmpty()) { | |||||
jdbcDao.batchUpdate( | |||||
"INSERT IGNORE INTO user_authority (userId, authId)" | |||||
+ " VALUES (:userId, :authId)", | |||||
authBatchInsertValues); | |||||
} | |||||
return instance; | return instance; | ||||
} | } | ||||
@@ -209,22 +193,39 @@ public class UserService extends AbstractBaseEntityService<User, Long, UserRepos | |||||
throw new UnprocessableEntityException(ErrorCodes.USERNAME_NOT_AVAILABLE); | throw new UnprocessableEntityException(ErrorCodes.USERNAME_NOT_AVAILABLE); | ||||
} | } | ||||
String randomPassword = PasswordUtils.genPwd(new PasswordRule(settingsService)); | |||||
String pwdHash = passwordEncoder.encode(randomPassword); | |||||
System.out.println("Start Save"); | |||||
String password = req.getPassword(); | |||||
String pwdHash = passwordEncoder.encode(password); | |||||
User instance = new User(); | User instance = new User(); | ||||
instance.setPassword(pwdHash); | instance.setPassword(pwdHash); | ||||
instance = saveOrUpdate(instance, req); | |||||
// Locale locale = instance.getLocale() != null ? LocaleUtils.from(instance.getLocale()) : Locale.ENGLISH; | |||||
// mailService.send( | |||||
// MailRequest.builder() | |||||
// .subject(messageSource.getMessage("USER.newAc.subject", null, locale)) | |||||
// .template("mail/newUser") | |||||
// .args(Map.of("username", instance.getUsername(), "password", StringEscapeUtils.escapeHtml4(randomPassword))) | |||||
// .addTo(new InternetAddress(instance.getEmail(), instance.getName())) | |||||
// .build(), | |||||
// locale); | |||||
instance.setUsername(req.getUsername()); | |||||
instance.setName(req.getUsername()); | |||||
instance = save(instance); | |||||
long id = instance.getId(); | |||||
List<Map<String, Integer>> authBatchInsertValues = req.getAddAuthIds().stream() | |||||
.map(authId -> Map.of("userId", (int)id, "authId", authId)) | |||||
.collect(Collectors.toList()); | |||||
List<Map<String, Integer>> authBatchDeleteValues = req.getRemoveAuthIds().stream() | |||||
.map(authId -> Map.of("userId", (int)id, "authId", authId)) | |||||
.collect(Collectors.toList()); | |||||
if (!authBatchDeleteValues.isEmpty()) { | |||||
jdbcDao.batchUpdate( | |||||
"DELETE FROM user_authority" | |||||
+ " WHERE userId = :userId ", | |||||
// + "AND authId = :authId", | |||||
authBatchDeleteValues); | |||||
} | |||||
if (!authBatchInsertValues.isEmpty()) { | |||||
jdbcDao.batchUpdate( | |||||
"INSERT IGNORE INTO user_authority (userId, authId)" | |||||
+ " VALUES (:userId, :authId)", | |||||
authBatchInsertValues); | |||||
} | |||||
return instance; | return instance; | ||||
} | } | ||||
@@ -259,6 +260,4 @@ public class UserService extends AbstractBaseEntityService<User, Long, UserRepos | |||||
instance = save(instance); | instance = save(instance); | ||||
return randomPassword; | return randomPassword; | ||||
} | } | ||||
} | } |
@@ -1,5 +1,6 @@ | |||||
package com.ffii.fpsms.modules.user.web; | package com.ffii.fpsms.modules.user.web; | ||||
import java.util.HashMap; | |||||
import java.util.Map; | import java.util.Map; | ||||
import org.apache.commons.logging.Log; | import org.apache.commons.logging.Log; | ||||
@@ -30,16 +31,16 @@ import jakarta.validation.Valid; | |||||
@RequestMapping("/group") | @RequestMapping("/group") | ||||
public class GroupController{ | public class GroupController{ | ||||
private final Log logger = LogFactory.getLog(getClass()); | |||||
private GroupService groupService; | |||||
public GroupController( | |||||
GroupService groupService | |||||
) { | |||||
private final Log logger = LogFactory.getLog(getClass()); | |||||
private GroupService groupService; | |||||
public GroupController( | |||||
GroupService groupService | |||||
) { | |||||
this.groupService = groupService; | this.groupService = groupService; | ||||
} | } | ||||
@PostMapping("/save") | |||||
@PostMapping("/save") | |||||
public IdRes saveOrUpdate(@RequestBody @Valid SaveGroupReq req) { | public IdRes saveOrUpdate(@RequestBody @Valid SaveGroupReq req) { | ||||
return new IdRes(groupService.saveOrUpdate(req).getId()); | return new IdRes(groupService.saveOrUpdate(req).getId()); | ||||
} | } | ||||
@@ -77,4 +78,20 @@ public class GroupController{ | |||||
.build())); | .build())); | ||||
} | } | ||||
@GetMapping("/auth/{target}/{id}") | |||||
public RecordsRes<Map<String, Object>> authComboJson(HttpServletRequest request, @PathVariable("id") int id, @PathVariable("target") String target) throws ServletRequestBindingException { | |||||
System.out.println(request); | |||||
Map<String, Object> args = new HashMap<>(); | |||||
if (id != 0){ | |||||
if (target.equals("group")){ | |||||
args.put("groupId", id); | |||||
} else { | |||||
args.put("userId", id); | |||||
} | |||||
} | |||||
return new RecordsRes<>(groupService.listAuth(args)); | |||||
} | |||||
} | } |
@@ -1,7 +1,9 @@ | |||||
package com.ffii.fpsms.modules.user.web; | package com.ffii.fpsms.modules.user.web; | ||||
import java.io.UnsupportedEncodingException; | import java.io.UnsupportedEncodingException; | ||||
import java.util.List; | |||||
import com.ffii.fpsms.modules.user.service.pojo.UserRecord; | |||||
import org.apache.commons.logging.Log; | import org.apache.commons.logging.Log; | ||||
import org.apache.commons.logging.LogFactory; | import org.apache.commons.logging.LogFactory; | ||||
import org.springframework.http.HttpStatus; | import org.springframework.http.HttpStatus; | ||||
@@ -61,8 +63,8 @@ public class UserController{ | |||||
// @Operation(summary = "list user", responses = { @ApiResponse(responseCode = "200"), | // @Operation(summary = "list user", responses = { @ApiResponse(responseCode = "200"), | ||||
// @ApiResponse(responseCode = "404", content = @Content) }) | // @ApiResponse(responseCode = "404", content = @Content) }) | ||||
@GetMapping | @GetMapping | ||||
@PreAuthorize("hasAuthority('VIEW_USER')") | |||||
public ResponseEntity<?> list(@ModelAttribute @Valid SearchUserReq req) { | |||||
// @PreAuthorize("hasAuthority('VIEW_USER')") | |||||
public ResponseEntity<List<UserRecord>> list(@ModelAttribute @Valid SearchUserReq req) { | |||||
logger.info("Test List user"); | logger.info("Test List user"); | ||||
return ResponseEntity.ok(userService.search(req)); | return ResponseEntity.ok(userService.search(req)); | ||||
} | } | ||||
@@ -91,10 +93,11 @@ public class UserController{ | |||||
} | } | ||||
// @Operation(summary = "new user") | // @Operation(summary = "new user") | ||||
@PostMapping | |||||
@ResponseStatus(HttpStatus.CREATED) | |||||
@PreAuthorize("hasAuthority('MAINTAIN_USER')") | |||||
@PostMapping("/save") | |||||
// @ResponseStatus(HttpStatus.CREATED) | |||||
// @PreAuthorize("hasAuthority('MAINTAIN_USER')") | |||||
public IdRes newRecord(@RequestBody @Valid NewUserReq req) throws UnsupportedEncodingException { | public IdRes newRecord(@RequestBody @Valid NewUserReq req) throws UnsupportedEncodingException { | ||||
System.out.println(req.getUsername()); | |||||
return new IdRes(userService.newRecord(req).getId()); | return new IdRes(userService.newRecord(req).getId()); | ||||
} | } | ||||
@@ -120,6 +123,13 @@ public class UserController{ | |||||
userService.updateRecord(id, req); | userService.updateRecord(id, req); | ||||
} | } | ||||
// @PostMapping("/{id}") | |||||
// @ResponseStatus(HttpStatus.NO_CONTENT) | |||||
// @PreAuthorize("hasAuthority('MAINTAIN_USER')") | |||||
// public void saveRecord(@RequestBody @Valid NewUserReq req) { | |||||
// userService.newUser(req); | |||||
// } | |||||
// @Operation(summary = "current user change password", description = "error: USER_WRONG_NEW_PWD = new password not available", responses = { | // @Operation(summary = "current user change password", description = "error: USER_WRONG_NEW_PWD = new password not available", responses = { | ||||
// @ApiResponse(responseCode = "204"), | // @ApiResponse(responseCode = "204"), | ||||
// @ApiResponse(responseCode = "400", content = @Content), | // @ApiResponse(responseCode = "400", content = @Content), | ||||
@@ -148,6 +158,17 @@ public class UserController{ | |||||
userService.save(instance); | userService.save(instance); | ||||
} | } | ||||
@PatchMapping("/admin-change-password") | |||||
@ResponseStatus(HttpStatus.NO_CONTENT) | |||||
@PreAuthorize("hasAuthority('MAINTAIN_USER')") | |||||
public void adminChangePassword(@RequestBody @Valid AdminChangePwdReq req) { | |||||
long id = req.getId(); | |||||
User instance = userService.find(id).orElseThrow(NotFoundException::new); | |||||
instance.setPassword(passwordEncoder.encode(req.getNewPassword())); | |||||
userService.save(instance); | |||||
} | |||||
// @Operation(summary = "reset password", responses = { | // @Operation(summary = "reset password", responses = { | ||||
// @ApiResponse(responseCode = "204"), | // @ApiResponse(responseCode = "204"), | ||||
// @ApiResponse(responseCode = "404", content = @Content), | // @ApiResponse(responseCode = "404", content = @Content), | ||||
@@ -166,6 +187,21 @@ public class UserController{ | |||||
return new PasswordRule(settingsService); | return new PasswordRule(settingsService); | ||||
} | } | ||||
public static class AdminChangePwdReq { | |||||
private Long id; | |||||
@NotBlank | |||||
private String newPassword; | |||||
public Long getId() { return id; } | |||||
public Long setId(Long id) { return this.id = id; } | |||||
public String getNewPassword() { | |||||
return newPassword; | |||||
} | |||||
public void setNewPassword(String newPassword) { | |||||
this.newPassword = newPassword; | |||||
} | |||||
} | |||||
public static class ChangePwdReq { | public static class ChangePwdReq { | ||||
@NotBlank | @NotBlank | ||||
private String password; | private String password; | ||||