demo
This commit is contained in:
@@ -3,16 +3,89 @@ package mvc.services
|
||||
import shared.exceptions.NotFoundException
|
||||
import mvc.dao.UserRepository
|
||||
import mvc.entities.User
|
||||
import mvc.entities.UserRankEnum
|
||||
import mvc.entities.UserStatusEnum
|
||||
import shared.dto.ChangeUsernameDto
|
||||
import shared.exceptions.ChangeUsernameException
|
||||
import java.time.Clock
|
||||
import java.time.Duration
|
||||
import java.time.LocalDateTime
|
||||
|
||||
|
||||
class UserComplexService(
|
||||
val repository: UserRepository
|
||||
val repository: UserRepository,
|
||||
) : UserService {
|
||||
// 用户
|
||||
override fun changeUsername(user: User): User {
|
||||
val findUser = repository.findById(user.id) ?: throw NotFoundException("User ${user.id} not found")
|
||||
val copy = findUser.copy(firstName = user.firstName, lastName = user.lastName)
|
||||
repository.update(copy)
|
||||
return copy
|
||||
override fun changeUsername(userDto: ChangeUsernameDto): User {
|
||||
val user = repository.findById(userDto.id) ?: throw NotFoundException("用户${userDto.id}不存在")
|
||||
// 判断用户状态
|
||||
if (user.status != UserStatusEnum.ACTIVE) throw ChangeUsernameException("用户未激活")
|
||||
// 用户名长度
|
||||
if( !(user.firstName.length + user.lastName.length in 4..20)) {
|
||||
throw ChangeUsernameException("用户名长度需在4-20之间")
|
||||
}
|
||||
|
||||
// 检测非法字符
|
||||
val regex = Regex("^[a-zA-Z0-9_]+$")
|
||||
if(!regex.matches(userDto.firstName) || !regex.matches(userDto.lastName)) {
|
||||
throw ChangeUsernameException("包含非法字符")
|
||||
}
|
||||
|
||||
// 检测权限
|
||||
var canChangeUsername = false
|
||||
var requiresEmailVerification = false
|
||||
var maxChangeIntervalDays = 0
|
||||
when (user.rank) {
|
||||
UserRankEnum.REGULAR -> {
|
||||
canChangeUsername = false
|
||||
requiresEmailVerification = false
|
||||
maxChangeIntervalDays = 0
|
||||
}
|
||||
|
||||
UserRankEnum.VIP -> {
|
||||
canChangeUsername = true
|
||||
requiresEmailVerification = true
|
||||
maxChangeIntervalDays = 30
|
||||
}
|
||||
|
||||
UserRankEnum.INTERNAL -> {
|
||||
canChangeUsername = true
|
||||
requiresEmailVerification = false
|
||||
maxChangeIntervalDays = 0
|
||||
}
|
||||
}
|
||||
|
||||
if (!canChangeUsername) throw ChangeUsernameException("用户没有权限修改用户名")
|
||||
|
||||
if (requiresEmailVerification) {
|
||||
val emailVerified = VerificationService().isVerified(user.id, userDto.verificationCode)
|
||||
if (!emailVerified) {
|
||||
throw ChangeUsernameException("验证码错误")
|
||||
}
|
||||
}
|
||||
|
||||
user.lastUsernameChange?.let{
|
||||
val daysBetween =
|
||||
Duration.between(user.lastUsernameChange, LocalDateTime.now(Clock.systemDefaultZone())).toDays()
|
||||
if (daysBetween < maxChangeIntervalDays) {
|
||||
throw ChangeUsernameException("30天内禁止重复修改")
|
||||
}
|
||||
}
|
||||
|
||||
// 检测相同名
|
||||
if(user.firstName == userDto.firstName && user.lastName == userDto.lastName) {
|
||||
throw ChangeUsernameException("不能修改为当前用户名")
|
||||
}
|
||||
val findByUsername = repository.findByUsername(userDto.firstName, userDto.lastName)
|
||||
if(findByUsername != null) {
|
||||
throw ChangeUsernameException("用户名已存在")
|
||||
}
|
||||
|
||||
|
||||
user.firstName = userDto.firstName
|
||||
user.lastName = userDto.lastName
|
||||
user.lastUsernameChange = LocalDateTime.now(Clock.systemDefaultZone())
|
||||
repository.update(user)
|
||||
return user
|
||||
}
|
||||
}
|
@@ -1,7 +1,8 @@
|
||||
package mvc.services
|
||||
|
||||
import mvc.entities.User
|
||||
import shared.dto.ChangeUsernameDto
|
||||
|
||||
interface UserService {
|
||||
fun changeUsername(user: User): User
|
||||
fun changeUsername(userDto: ChangeUsernameDto): User
|
||||
}
|
@@ -3,12 +3,14 @@ package mvc.services
|
||||
import shared.exceptions.NotFoundException
|
||||
import mvc.dao.UserRepository
|
||||
import mvc.entities.User
|
||||
import shared.dto.ChangeUsernameDto
|
||||
|
||||
class UserSimpleService(val repository: UserRepository) : UserService {
|
||||
override fun changeUsername(user: User): User {
|
||||
val findUser = repository.findById(user.id) ?: throw NotFoundException("User ${user.id} not found")
|
||||
val copy = findUser.copy(firstName = user.firstName, lastName = user.lastName)
|
||||
repository.update(copy)
|
||||
return copy
|
||||
override fun changeUsername(userDto: ChangeUsernameDto): User {
|
||||
val findUser = repository.findById(userDto.id) ?: throw NotFoundException("用户${userDto.id}不存在")
|
||||
findUser.firstName = userDto.firstName
|
||||
findUser.lastName = userDto.lastName
|
||||
repository.update(findUser)
|
||||
return findUser
|
||||
}
|
||||
}
|
7
src/main/kotlin/mvc/services/VerificationService.kt
Normal file
7
src/main/kotlin/mvc/services/VerificationService.kt
Normal file
@@ -0,0 +1,7 @@
|
||||
package mvc.services
|
||||
|
||||
class VerificationService {
|
||||
fun isVerified(userId: Long, code: String): Boolean {
|
||||
return "1234" == code
|
||||
}
|
||||
}
|
Reference in New Issue
Block a user