diff --git a/src/main/java/com/yolo/keyborad/common/ErrorCode.java b/src/main/java/com/yolo/keyborad/common/ErrorCode.java index d7edd52..f5812f8 100644 --- a/src/main/java/com/yolo/keyborad/common/ErrorCode.java +++ b/src/main/java/com/yolo/keyborad/common/ErrorCode.java @@ -85,6 +85,7 @@ public enum ErrorCode { REPORT_TYPE_INVALID(40020, "举报类型无效"), REPORT_COMPANION_ID_EMPTY(40021, "被举报的AI角色ID不能为空"), REPORT_TYPE_EMPTY(40022, "举报类型不能为空"), + ACCOUNT_RECENTLY_CANCELLED(50038, "账号注销未满7天,暂不允许注册"), VERSION_NOT_FOUND(40022, "未找到可用的版本配置"); /** diff --git a/src/main/java/com/yolo/keyborad/service/impl/UserServiceImpl.java b/src/main/java/com/yolo/keyborad/service/impl/UserServiceImpl.java index 0d161cb..0d921db 100644 --- a/src/main/java/com/yolo/keyborad/service/impl/UserServiceImpl.java +++ b/src/main/java/com/yolo/keyborad/service/impl/UserServiceImpl.java @@ -27,6 +27,8 @@ import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; import java.math.BigDecimal; +import java.time.Instant; +import java.time.temporal.ChronoUnit; import java.util.Date; import com.yolo.keyborad.service.impl.user.UserInviteCodeBinder; import com.yolo.keyborad.service.impl.user.UserMailVerificationHandler; @@ -90,8 +92,26 @@ public class UserServiceImpl extends ServiceImpl() + .eq(KeyboardUser::getSubjectId, sub) + .eq(KeyboardUser::getDeleted, true) + .gt(KeyboardUser::getDeletedAt, cooldownStart) + .last("LIMIT 1") + ); + if (recentlyDeleted != null) { + throw new BusinessException(ErrorCode.ACCOUNT_RECENTLY_CANCELLED); + } + } + @Override public KeyboardUser createUserWithSubjectId(String sub) { + ensureSubjectIdNotRecentlyCancelled(sub); + KeyboardUser keyboardUser = buildNewUserWithSubjectId(sub); keyboardUserMapper.insert(keyboardUser); keyboardCharacterService.addDefaultUserCharacter(keyboardUser.getId()); diff --git a/src/main/java/com/yolo/keyborad/service/impl/user/UserRegistrationHandler.java b/src/main/java/com/yolo/keyborad/service/impl/user/UserRegistrationHandler.java index 7b07efb..21c146e 100644 --- a/src/main/java/com/yolo/keyborad/service/impl/user/UserRegistrationHandler.java +++ b/src/main/java/com/yolo/keyborad/service/impl/user/UserRegistrationHandler.java @@ -18,6 +18,8 @@ import com.yolo.keyborad.service.KeyboardUserQuotaTotalService; import com.yolo.keyborad.service.KeyboardUserWalletService; import com.yolo.keyborad.utils.RedisUtil; import java.math.BigDecimal; +import java.time.Instant; +import java.time.temporal.ChronoUnit; import java.util.Date; import lombok.extern.slf4j.Slf4j; import org.springframework.security.crypto.password.PasswordEncoder; @@ -33,6 +35,7 @@ import org.springframework.transaction.annotation.Transactional; public class UserRegistrationHandler { private static final String USER_CODE_PREFIX = "user:"; + private static final int ACCOUNT_REUSE_COOLDOWN_DAYS = 7; private final KeyboardUserMapper keyboardUserMapper; private final PasswordEncoder passwordEncoder; @@ -91,6 +94,24 @@ public class UserRegistrationHandler { if (userMail != null) { throw new BusinessException(ErrorCode.USER_HAS_EXISTED); } + + ensureNotRecentlyCancelled( + new LambdaQueryWrapper() + .eq(KeyboardUser::getEmail, mailAddress) + ); + } + + private void ensureNotRecentlyCancelled(LambdaQueryWrapper baseQuery) { + Date cooldownStart = Date.from(Instant.now().minus(ACCOUNT_REUSE_COOLDOWN_DAYS, ChronoUnit.DAYS)); + KeyboardUser recentlyDeleted = keyboardUserMapper.selectOne( + baseQuery + .eq(KeyboardUser::getDeleted, true) + .gt(KeyboardUser::getDeletedAt, cooldownStart) + .last("LIMIT 1") + ); + if (recentlyDeleted != null) { + throw new BusinessException(ErrorCode.ACCOUNT_RECENTLY_CANCELLED); + } } private void validatePasswords(UserRegisterDTO userRegisterDTO) {