Commit b532f99f61a7691e49b477bd48733e512ebe7db3
1 parent
b27400af
feat(usr): tUserPermission 批量写入 + 事务边界 REQ-USR-001
Showing
2 changed files
with
60 additions
and
2 deletions
backend/src/main/java/com/xly/test4/module/usr/service/impl/UserServiceImpl.java
| @@ -10,9 +10,11 @@ import com.xly.test4.module.usr.dto.UserCreateDTO; | @@ -10,9 +10,11 @@ import com.xly.test4.module.usr.dto.UserCreateDTO; | ||
| 10 | import com.xly.test4.module.usr.entity.Employee; | 10 | import com.xly.test4.module.usr.entity.Employee; |
| 11 | import com.xly.test4.module.usr.entity.Permission; | 11 | import com.xly.test4.module.usr.entity.Permission; |
| 12 | import com.xly.test4.module.usr.entity.User; | 12 | import com.xly.test4.module.usr.entity.User; |
| 13 | +import com.xly.test4.module.usr.entity.UserPermission; | ||
| 13 | import com.xly.test4.module.usr.mapper.EmployeeMapper; | 14 | import com.xly.test4.module.usr.mapper.EmployeeMapper; |
| 14 | import com.xly.test4.module.usr.mapper.PermissionMapper; | 15 | import com.xly.test4.module.usr.mapper.PermissionMapper; |
| 15 | import com.xly.test4.module.usr.mapper.UserMapper; | 16 | import com.xly.test4.module.usr.mapper.UserMapper; |
| 17 | +import com.xly.test4.module.usr.mapper.UserPermissionMapper; | ||
| 16 | import com.xly.test4.module.usr.service.UserService; | 18 | import com.xly.test4.module.usr.service.UserService; |
| 17 | import com.xly.test4.module.usr.vo.UserCreateVO; | 19 | import com.xly.test4.module.usr.vo.UserCreateVO; |
| 18 | import org.springframework.beans.factory.annotation.Value; | 20 | import org.springframework.beans.factory.annotation.Value; |
| @@ -26,6 +28,7 @@ import java.util.List; | @@ -26,6 +28,7 @@ import java.util.List; | ||
| 26 | public class UserServiceImpl implements UserService { | 28 | public class UserServiceImpl implements UserService { |
| 27 | 29 | ||
| 28 | private final UserMapper userMapper; | 30 | private final UserMapper userMapper; |
| 31 | + private final UserPermissionMapper userPermissionMapper; | ||
| 29 | private final EmployeeMapper employeeMapper; | 32 | private final EmployeeMapper employeeMapper; |
| 30 | private final PermissionMapper permissionMapper; | 33 | private final PermissionMapper permissionMapper; |
| 31 | private final UserConverter userConverter; | 34 | private final UserConverter userConverter; |
| @@ -33,12 +36,14 @@ public class UserServiceImpl implements UserService { | @@ -33,12 +36,14 @@ public class UserServiceImpl implements UserService { | ||
| 33 | private final String defaultPassword; | 36 | private final String defaultPassword; |
| 34 | 37 | ||
| 35 | public UserServiceImpl(UserMapper userMapper, | 38 | public UserServiceImpl(UserMapper userMapper, |
| 39 | + UserPermissionMapper userPermissionMapper, | ||
| 36 | EmployeeMapper employeeMapper, | 40 | EmployeeMapper employeeMapper, |
| 37 | PermissionMapper permissionMapper, | 41 | PermissionMapper permissionMapper, |
| 38 | UserConverter userConverter, | 42 | UserConverter userConverter, |
| 39 | PasswordEncoder passwordEncoder, | 43 | PasswordEncoder passwordEncoder, |
| 40 | @Value("${app.security.default-password}") String defaultPassword) { | 44 | @Value("${app.security.default-password}") String defaultPassword) { |
| 41 | this.userMapper = userMapper; | 45 | this.userMapper = userMapper; |
| 46 | + this.userPermissionMapper = userPermissionMapper; | ||
| 42 | this.employeeMapper = employeeMapper; | 47 | this.employeeMapper = employeeMapper; |
| 43 | this.permissionMapper = permissionMapper; | 48 | this.permissionMapper = permissionMapper; |
| 44 | this.userConverter = userConverter; | 49 | this.userConverter = userConverter; |
| @@ -90,6 +95,19 @@ public class UserServiceImpl implements UserService { | @@ -90,6 +95,19 @@ public class UserServiceImpl implements UserService { | ||
| 90 | 95 | ||
| 91 | userMapper.insert(user); | 96 | userMapper.insert(user); |
| 92 | 97 | ||
| 98 | + if (dto.getPermissionIds() != null && !dto.getPermissionIds().isEmpty()) { | ||
| 99 | + for (Integer permissionId : dto.getPermissionIds()) { | ||
| 100 | + UserPermission up = UserPermission.builder() | ||
| 101 | + .iUserId(user.getIIncrement()) | ||
| 102 | + .iPermissionId(permissionId) | ||
| 103 | + .sGrantedBy(current.getUserName()) | ||
| 104 | + .sBrandsId(current.getBrandsId()) | ||
| 105 | + .sSubsidiaryId(current.getSubsidiaryId()) | ||
| 106 | + .build(); | ||
| 107 | + userPermissionMapper.insert(up); | ||
| 108 | + } | ||
| 109 | + } | ||
| 110 | + | ||
| 93 | return userConverter.toVO(user); | 111 | return userConverter.toVO(user); |
| 94 | } | 112 | } |
| 95 | } | 113 | } |
backend/src/test/java/com/xly/test4/module/usr/service/impl/UserServiceImplTest.java
| @@ -6,12 +6,13 @@ import com.xly.test4.common.security.CurrentUser; | @@ -6,12 +6,13 @@ import com.xly.test4.common.security.CurrentUser; | ||
| 6 | import com.xly.test4.common.security.CurrentUserContext; | 6 | import com.xly.test4.common.security.CurrentUserContext; |
| 7 | import com.xly.test4.module.usr.converter.UserConverter; | 7 | import com.xly.test4.module.usr.converter.UserConverter; |
| 8 | import com.xly.test4.module.usr.dto.UserCreateDTO; | 8 | import com.xly.test4.module.usr.dto.UserCreateDTO; |
| 9 | -import com.xly.test4.module.usr.entity.Employee; | ||
| 10 | import com.xly.test4.module.usr.entity.Permission; | 9 | import com.xly.test4.module.usr.entity.Permission; |
| 11 | import com.xly.test4.module.usr.entity.User; | 10 | import com.xly.test4.module.usr.entity.User; |
| 11 | +import com.xly.test4.module.usr.entity.UserPermission; | ||
| 12 | import com.xly.test4.module.usr.mapper.EmployeeMapper; | 12 | import com.xly.test4.module.usr.mapper.EmployeeMapper; |
| 13 | import com.xly.test4.module.usr.mapper.PermissionMapper; | 13 | import com.xly.test4.module.usr.mapper.PermissionMapper; |
| 14 | import com.xly.test4.module.usr.mapper.UserMapper; | 14 | import com.xly.test4.module.usr.mapper.UserMapper; |
| 15 | +import com.xly.test4.module.usr.mapper.UserPermissionMapper; | ||
| 15 | import com.xly.test4.module.usr.vo.UserCreateVO; | 16 | import com.xly.test4.module.usr.vo.UserCreateVO; |
| 16 | import org.junit.jupiter.api.AfterEach; | 17 | import org.junit.jupiter.api.AfterEach; |
| 17 | import org.junit.jupiter.api.BeforeEach; | 18 | import org.junit.jupiter.api.BeforeEach; |
| @@ -35,6 +36,7 @@ import static org.mockito.Mockito.when; | @@ -35,6 +36,7 @@ import static org.mockito.Mockito.when; | ||
| 35 | class UserServiceImplTest { | 36 | class UserServiceImplTest { |
| 36 | 37 | ||
| 37 | private UserMapper userMapper; | 38 | private UserMapper userMapper; |
| 39 | + private UserPermissionMapper userPermissionMapper; | ||
| 38 | private EmployeeMapper employeeMapper; | 40 | private EmployeeMapper employeeMapper; |
| 39 | private PermissionMapper permissionMapper; | 41 | private PermissionMapper permissionMapper; |
| 40 | private UserConverter userConverter; | 42 | private UserConverter userConverter; |
| @@ -53,11 +55,12 @@ class UserServiceImplTest { | @@ -53,11 +55,12 @@ class UserServiceImplTest { | ||
| 53 | @BeforeEach | 55 | @BeforeEach |
| 54 | void setUp() { | 56 | void setUp() { |
| 55 | userMapper = mock(UserMapper.class); | 57 | userMapper = mock(UserMapper.class); |
| 58 | + userPermissionMapper = mock(UserPermissionMapper.class); | ||
| 56 | employeeMapper = mock(EmployeeMapper.class); | 59 | employeeMapper = mock(EmployeeMapper.class); |
| 57 | permissionMapper = mock(PermissionMapper.class); | 60 | permissionMapper = mock(PermissionMapper.class); |
| 58 | userConverter = mock(UserConverter.class); | 61 | userConverter = mock(UserConverter.class); |
| 59 | passwordEncoder = new BCryptPasswordEncoder(); | 62 | passwordEncoder = new BCryptPasswordEncoder(); |
| 60 | - service = new UserServiceImpl(userMapper, employeeMapper, permissionMapper, | 63 | + service = new UserServiceImpl(userMapper, userPermissionMapper, employeeMapper, permissionMapper, |
| 61 | userConverter, passwordEncoder, "666666"); | 64 | userConverter, passwordEncoder, "666666"); |
| 62 | ctxMock = mockStatic(CurrentUserContext.class); | 65 | ctxMock = mockStatic(CurrentUserContext.class); |
| 63 | ctxMock.when(CurrentUserContext::current).thenReturn(ADMIN_CONTEXT); | 66 | ctxMock.when(CurrentUserContext::current).thenReturn(ADMIN_CONTEXT); |
| @@ -227,4 +230,41 @@ class UserServiceImplTest { | @@ -227,4 +230,41 @@ class UserServiceImplTest { | ||
| 227 | service.createUser(dto2); | 230 | service.createUser(dto2); |
| 228 | verify(permissionMapper, never()).selectList(any(Wrapper.class)); | 231 | verify(permissionMapper, never()).selectList(any(Wrapper.class)); |
| 229 | } | 232 | } |
| 233 | + | ||
| 234 | + @Test | ||
| 235 | + @SuppressWarnings("unchecked") | ||
| 236 | + void createUser_withPermissionIds_insertsOneUserPermissionPerId() { | ||
| 237 | + stubConverterReturnsEmptyUser(); | ||
| 238 | + when(permissionMapper.selectList(any(Wrapper.class))) | ||
| 239 | + .thenReturn(List.of(new Permission(), new Permission(), new Permission())); | ||
| 240 | + | ||
| 241 | + UserCreateDTO dto = baseDTO(); | ||
| 242 | + dto.setPermissionIds(List.of(10, 20, 30)); | ||
| 243 | + | ||
| 244 | + service.createUser(dto); | ||
| 245 | + | ||
| 246 | + ArgumentCaptor<UserPermission> captor = ArgumentCaptor.forClass(UserPermission.class); | ||
| 247 | + verify(userPermissionMapper, org.mockito.Mockito.times(3)).insert(captor.capture()); | ||
| 248 | + | ||
| 249 | + List<UserPermission> writes = captor.getAllValues(); | ||
| 250 | + assertThat(writes).extracting(UserPermission::getIPermissionId) | ||
| 251 | + .containsExactly(10, 20, 30); | ||
| 252 | + assertThat(writes).allSatisfy(up -> { | ||
| 253 | + assertThat(up.getIUserId()).isEqualTo(42); | ||
| 254 | + assertThat(up.getSGrantedBy()).isEqualTo("admin"); | ||
| 255 | + assertThat(up.getSBrandsId()).isEqualTo("BR-DEFAULT"); | ||
| 256 | + assertThat(up.getSSubsidiaryId()).isEqualTo("SUB-DEFAULT"); | ||
| 257 | + }); | ||
| 258 | + } | ||
| 259 | + | ||
| 260 | + @Test | ||
| 261 | + void createUser_emptyPermissionIds_doesNotCallUserPermissionInsert() { | ||
| 262 | + stubConverterReturnsEmptyUser(); | ||
| 263 | + UserCreateDTO dto = baseDTO(); | ||
| 264 | + dto.setPermissionIds(List.of()); | ||
| 265 | + | ||
| 266 | + service.createUser(dto); | ||
| 267 | + | ||
| 268 | + verify(userPermissionMapper, never()).insert(any(UserPermission.class)); | ||
| 269 | + } | ||
| 230 | } | 270 | } |