v1.0.15
This commit is contained in:
@@ -12,7 +12,7 @@ public class GaoUserInviteCache {
|
||||
/// 发起邀请的用户 ID
|
||||
private String inviterUserId;
|
||||
|
||||
/// 门店 ID
|
||||
/// 门店 ID,GLOBAL_MANAGER 可为空
|
||||
private String storeId;
|
||||
|
||||
/// 角色 ID
|
||||
|
||||
+42
-18
@@ -1,5 +1,6 @@
|
||||
package com.imyeyu.api.modules.gao.service.implement;
|
||||
|
||||
import com.imyeyu.api.bean.CoreRoleCode;
|
||||
import com.imyeyu.api.bean.ModuleCode;
|
||||
import com.imyeyu.api.config.dbsource.TimiServerDBConfig;
|
||||
import com.imyeyu.api.modules.gao.bean.GaoUserInviteCache;
|
||||
@@ -96,30 +97,36 @@ public class GaoUserInviteServiceImplement implements GaoUserInviteService {
|
||||
String inviterUserId = userLoginService.getRequireLoginUserId();
|
||||
logger.setUserId(inviterUserId);
|
||||
permissionChecker.checkAny(ModuleCode.GAO, GaoPermissionCode.USER_CREATE.getValue());
|
||||
Role requestedRole = roleService.get(req.getRoleId());
|
||||
boolean adminInviteGlobalManager = roleChecker.hasAny(ModuleCode.CORE, CoreRoleCode.ADMIN.name())
|
||||
&& isGlobalManagerRole(requestedRole);
|
||||
boolean globalManager = authorizationScopeService.isSystemAdmin(inviterUserId)
|
||||
|| roleChecker.hasAny(ModuleCode.GAO, GaoRoleCode.GLOBAL_MANAGER.name());
|
||||
boolean storeManager = !globalManager;
|
||||
GaoStore loginStore = storeManager ? gaoStoreService.getByUserId(inviterUserId) : null;
|
||||
String storeId = storeManager ? loginStore == null ? null : loginStore.getId() : req.getStoreId();
|
||||
TimiException.required(storeId, "not found storeId");
|
||||
checkStoreScope(inviterUserId, storeId);
|
||||
|
||||
GaoStore store = requireActiveStore(storeId);
|
||||
String storeId = adminInviteGlobalManager ? null : storeManager ? loginStore == null ? null : loginStore.getId() : req.getStoreId();
|
||||
if (!adminInviteGlobalManager) {
|
||||
TimiException.required(storeId, "not found storeId");
|
||||
checkStoreScope(inviterUserId, storeId);
|
||||
}
|
||||
if (storeId != null) {
|
||||
requireActiveStore(storeId);
|
||||
}
|
||||
Role role = requireInvitableRole(inviterUserId, req.getRoleId(), storeId);
|
||||
long createdAt = Time.now();
|
||||
long expireAt = createdAt + INVITE_TTL;
|
||||
|
||||
GaoUserInviteCache cache = new GaoUserInviteCache();
|
||||
cache.setInviterUserId(inviterUserId);
|
||||
cache.setStoreId(store.getId());
|
||||
cache.setStoreId(storeId);
|
||||
cache.setRoleId(role.getId());
|
||||
cache.setScene(storeManager ? "STORE_MANAGER" : "STORE_MANAGEMENT");
|
||||
cache.setScene(adminInviteGlobalManager ? "CORE_ADMIN" : storeManager ? "STORE_MANAGER" : "STORE_MANAGEMENT");
|
||||
cache.setCreatedAt(createdAt);
|
||||
cache.setExpireAt(expireAt);
|
||||
String code = saveInvite(cache);
|
||||
|
||||
logger.setContent("storeId=%s;roleId=%s;scene=%s;createdAt=%d;expireAt=%d".formatted(
|
||||
store.getId(), role.getId(), cache.getScene(), createdAt, expireAt));
|
||||
storeId, role.getId(), cache.getScene(), createdAt, expireAt));
|
||||
logger.setResult("created");
|
||||
return new GaoUserInviteCreateResponse(code, expireAt);
|
||||
} catch (TimiException e) {
|
||||
@@ -141,8 +148,7 @@ public class GaoUserInviteServiceImplement implements GaoUserInviteService {
|
||||
TimiException.required(code, "not found code");
|
||||
checkCodeRateLimit(code);
|
||||
GaoUserInviteCache cache = requireValidInvite(code);
|
||||
requireActiveStore(cache.getStoreId());
|
||||
requireValidRole(cache.getRoleId(), cache.getStoreId());
|
||||
validateInviteTarget(cache);
|
||||
return new GaoUserInviteValidateResponse(true, cache.getExpireAt());
|
||||
}
|
||||
|
||||
@@ -163,8 +169,7 @@ public class GaoUserInviteServiceImplement implements GaoUserInviteService {
|
||||
try {
|
||||
cache = requireValidInvite(code);
|
||||
logger.setContent(buildLogContent(cache));
|
||||
requireActiveStore(cache.getStoreId());
|
||||
requireValidRole(cache.getRoleId(), cache.getStoreId());
|
||||
validateInviteTarget(cache);
|
||||
TimiException.requiredNull(userService.getByName(data.getName()), "existed user name");
|
||||
TimiException.requiredNull(userService.getByPhoneNo(data.getPhoneNo()), "existed phone number");
|
||||
if (!redisInvite.destroy(getInviteKey(code))) {
|
||||
@@ -176,10 +181,16 @@ public class GaoUserInviteServiceImplement implements GaoUserInviteService {
|
||||
user.setPhoneNo(data.getPhoneNo());
|
||||
user.setPassword(data.getPassword());
|
||||
|
||||
GaoUser gaoUser = new GaoUser();
|
||||
gaoUser.setStoreId(cache.getStoreId());
|
||||
gaoUser.setUser(user);
|
||||
gaoUserService.create(gaoUser);
|
||||
if (cache.getStoreId() == null) {
|
||||
// TODO 用更好的方式
|
||||
userService.create(user);
|
||||
userService.verifyPhoneNo(user.getId());
|
||||
} else {
|
||||
GaoUser gaoUser = new GaoUser();
|
||||
gaoUser.setStoreId(cache.getStoreId());
|
||||
gaoUser.setUser(user);
|
||||
gaoUserService.create(gaoUser);
|
||||
}
|
||||
|
||||
UserRole userRole = new UserRole();
|
||||
userRole.setId(UUID.randomUUID().toString());
|
||||
@@ -265,7 +276,7 @@ public class GaoUserInviteServiceImplement implements GaoUserInviteService {
|
||||
|
||||
private Role requireValidRole(String roleId, String storeId) {
|
||||
Role role = roleService.get(roleId);
|
||||
if (role == null || role.getModuleCode() != ModuleCode.GAO || !isRoleUsableForStore(role, storeId)) {
|
||||
if (role == null || role.getModuleCode() != ModuleCode.GAO || (storeId == null && !isGlobalManagerRole(role)) || !isRoleUsableForStore(role, storeId)) {
|
||||
throw invalidInvite();
|
||||
}
|
||||
return role;
|
||||
@@ -274,7 +285,20 @@ public class GaoUserInviteServiceImplement implements GaoUserInviteService {
|
||||
private boolean isRoleUsableForStore(Role role, String storeId) {
|
||||
return role.getOwnerType() == null
|
||||
|| role.getOwnerType() == AuthOwnerType.MODULE && (TimiJava.isEmpty(role.getOwnerId()) || ModuleCode.GAO.name().equals(role.getOwnerId()))
|
||||
|| role.getOwnerType() == AuthOwnerType.STORE && storeId.equals(role.getOwnerId());
|
||||
|| role.getOwnerType() == AuthOwnerType.STORE && storeId != null && storeId.equals(role.getOwnerId());
|
||||
}
|
||||
|
||||
private boolean isGlobalManagerRole(Role role) {
|
||||
return role != null
|
||||
&& role.getModuleCode() == ModuleCode.GAO
|
||||
&& GaoRoleCode.GLOBAL_MANAGER.name().equals(role.getCode());
|
||||
}
|
||||
|
||||
private void validateInviteTarget(GaoUserInviteCache cache) {
|
||||
if (cache.getStoreId() != null) {
|
||||
requireActiveStore(cache.getStoreId());
|
||||
}
|
||||
requireValidRole(cache.getRoleId(), cache.getStoreId());
|
||||
}
|
||||
|
||||
private void checkStoreScope(String userId, String storeId) {
|
||||
|
||||
@@ -10,7 +10,7 @@ import lombok.Data;
|
||||
@Data
|
||||
public class GaoUserInviteCreateRequest {
|
||||
|
||||
/// 门店管理场景的目标门店 ID,店长场景不使用
|
||||
/// 门店管理场景的目标门店 ID,店长场景及 ADMIN 邀请 GLOBAL_MANAGER 时不使用
|
||||
private String storeId;
|
||||
|
||||
/// 目标角色 ID
|
||||
|
||||
Reference in New Issue
Block a user