| @@ -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; | ||||