first commit
This commit is contained in:
@@ -0,0 +1,45 @@
|
||||
package com.gameplatform.server.service;
|
||||
|
||||
import com.gameplatform.server.mapper.UserMapper;
|
||||
import com.gameplatform.server.model.User;
|
||||
import org.springframework.stereotype.Service;
|
||||
import reactor.core.publisher.Flux;
|
||||
import reactor.core.publisher.Mono;
|
||||
import reactor.core.scheduler.Schedulers;
|
||||
|
||||
import java.util.Objects;
|
||||
|
||||
@Service
|
||||
public class UserService {
|
||||
private final UserMapper userMapper;
|
||||
|
||||
public UserService(UserMapper userMapper) {
|
||||
this.userMapper = userMapper;
|
||||
}
|
||||
|
||||
public Mono<User> getById(Long id) {
|
||||
return Mono.fromCallable(() -> userMapper.findById(id))
|
||||
.subscribeOn(Schedulers.boundedElastic())
|
||||
.filter(Objects::nonNull);
|
||||
}
|
||||
|
||||
public Flux<User> listAll() {
|
||||
return Mono.fromCallable(userMapper::findAll)
|
||||
.subscribeOn(Schedulers.boundedElastic())
|
||||
.flatMapMany(Flux::fromIterable);
|
||||
}
|
||||
|
||||
public Mono<User> create(User user) {
|
||||
return Mono.fromCallable(() -> {
|
||||
userMapper.insert(user);
|
||||
return user;
|
||||
})
|
||||
.subscribeOn(Schedulers.boundedElastic());
|
||||
}
|
||||
|
||||
public Mono<Boolean> deleteById(Long id) {
|
||||
return Mono.fromCallable(() -> userMapper.deleteById(id) > 0)
|
||||
.subscribeOn(Schedulers.boundedElastic());
|
||||
}
|
||||
}
|
||||
|
||||
@@ -0,0 +1,93 @@
|
||||
package com.gameplatform.server.service.auth;
|
||||
|
||||
import com.gameplatform.server.mapper.admin.AdminUserMapper;
|
||||
import com.gameplatform.server.mapper.agent.AgentMapper;
|
||||
import com.gameplatform.server.model.dto.auth.LoginRequest;
|
||||
import com.gameplatform.server.model.dto.auth.LoginResponse;
|
||||
import com.gameplatform.server.model.entity.admin.AdminUser;
|
||||
import com.gameplatform.server.model.entity.agent.Agent;
|
||||
import com.gameplatform.server.security.JwtService;
|
||||
import org.springframework.security.crypto.password.PasswordEncoder;
|
||||
import org.springframework.stereotype.Service;
|
||||
import reactor.core.publisher.Mono;
|
||||
import reactor.core.scheduler.Schedulers;
|
||||
|
||||
import java.util.Map;
|
||||
|
||||
@Service
|
||||
public class AuthService {
|
||||
private final AdminUserMapper adminUserMapper;
|
||||
private final AgentMapper agentMapper;
|
||||
private final PasswordEncoder passwordEncoder;
|
||||
private final JwtService jwtService;
|
||||
|
||||
public AuthService(AdminUserMapper adminUserMapper,
|
||||
AgentMapper agentMapper,
|
||||
PasswordEncoder passwordEncoder,
|
||||
JwtService jwtService) {
|
||||
this.adminUserMapper = adminUserMapper;
|
||||
this.agentMapper = agentMapper;
|
||||
this.passwordEncoder = passwordEncoder;
|
||||
this.jwtService = jwtService;
|
||||
}
|
||||
|
||||
public Mono<LoginResponse> login(LoginRequest req) {
|
||||
String userType = req.getUserType().toLowerCase();
|
||||
if ("admin".equals(userType)) {
|
||||
return Mono.fromCallable(() -> adminUserMapper.findByUsername(req.getUsername()))
|
||||
.subscribeOn(Schedulers.boundedElastic())
|
||||
.flatMap(admin -> validateAdminPassword(admin, req.getPassword()));
|
||||
} else if ("agent".equals(userType)) {
|
||||
return Mono.fromCallable(() -> agentMapper.findByLoginAccount(req.getUsername()))
|
||||
.subscribeOn(Schedulers.boundedElastic())
|
||||
.flatMap(agent -> validateAgentPassword(agent, req.getPassword()));
|
||||
} else {
|
||||
return Mono.error(new IllegalArgumentException("unsupported userType: " + userType));
|
||||
}
|
||||
}
|
||||
|
||||
private Mono<LoginResponse> validateAdminPassword(AdminUser admin, String rawPassword) {
|
||||
if (admin == null || admin.getPasswordHash() == null) {
|
||||
return Mono.error(new IllegalArgumentException("用户名或密码错误"));
|
||||
}
|
||||
boolean ok = passwordEncoder.matches(rawPassword, admin.getPasswordHash());
|
||||
if (!ok) return Mono.error(new IllegalArgumentException("用户名或密码错误"));
|
||||
if (!"ENABLED".equalsIgnoreCase(admin.getStatus())) {
|
||||
return Mono.error(new IllegalStateException("账户已禁用"));
|
||||
}
|
||||
String token = jwtService.generateToken(
|
||||
"admin:" + admin.getId(),
|
||||
"admin", admin.getId(), admin.getUsername(), Map.of("role", admin.getRole())
|
||||
);
|
||||
LoginResponse resp = new LoginResponse();
|
||||
resp.setAccessToken(token);
|
||||
resp.setUserType("admin");
|
||||
resp.setUserId(admin.getId());
|
||||
resp.setUsername(admin.getUsername());
|
||||
resp.setExpiresIn(60L * 30); // align with default 30min
|
||||
return Mono.just(resp);
|
||||
}
|
||||
|
||||
private Mono<LoginResponse> validateAgentPassword(Agent agent, String rawPassword) {
|
||||
if (agent == null || agent.getPasswordHash() == null) {
|
||||
return Mono.error(new IllegalArgumentException("用户名或密码错误"));
|
||||
}
|
||||
boolean ok = passwordEncoder.matches(rawPassword, agent.getPasswordHash());
|
||||
if (!ok) return Mono.error(new IllegalArgumentException("用户名或密码错误"));
|
||||
if (!"ENABLED".equalsIgnoreCase(agent.getStatus())) {
|
||||
return Mono.error(new IllegalStateException("账户已禁用"));
|
||||
}
|
||||
String token = jwtService.generateToken(
|
||||
"agent:" + agent.getId(),
|
||||
"agent", agent.getId(), agent.getLoginAccount(), Map.of("name", agent.getName())
|
||||
);
|
||||
LoginResponse resp = new LoginResponse();
|
||||
resp.setAccessToken(token);
|
||||
resp.setUserType("agent");
|
||||
resp.setUserId(agent.getId());
|
||||
resp.setUsername(agent.getLoginAccount());
|
||||
resp.setExpiresIn(60L * 30);
|
||||
return Mono.just(resp);
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user