WangHan
2024-09-12 d5855a4926926698b740bc6c7ba489de47adb68b
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
package tech.powerjob.server.web.service.impl;
 
import com.google.common.collect.Sets;
import lombok.SneakyThrows;
import org.apache.commons.lang3.StringUtils;
import org.springframework.stereotype.Service;
import tech.powerjob.common.serialize.JsonUtils;
import tech.powerjob.common.utils.CommonUtils;
import tech.powerjob.common.enums.ErrorCodes;
import tech.powerjob.server.auth.common.PowerJobAuthException;
import tech.powerjob.common.utils.DigestUtils;
import tech.powerjob.server.persistence.remote.model.PwjbUserInfoDO;
import tech.powerjob.server.persistence.remote.repository.PwjbUserInfoRepository;
import tech.powerjob.server.web.request.ChangePasswordRequest;
import tech.powerjob.server.web.request.ModifyUserInfoRequest;
import tech.powerjob.server.web.service.PwjbUserWebService;
 
import javax.annotation.Resource;
import java.util.Date;
import java.util.Optional;
import java.util.Set;
 
/**
 * PwjbUserWebService
 *
 * @author tjq
 * @since 2024/2/15
 */
@Service
public class PwjbUserWebServiceImplImpl implements PwjbUserWebService {
 
    @Resource
    private PwjbUserInfoRepository pwjbUserInfoRepository;
 
    private static final Set<String> NOT_ALLOWED_CHANGE_PASSWORD_ACCOUNTS = Sets.newHashSet("powerjob_trial_account");
 
    @Override
    @SneakyThrows
    public PwjbUserInfoDO save(ModifyUserInfoRequest request) {
        String username = request.getUsername();
        CommonUtils.requireNonNull(username, "userName can't be null or empty!");
        CommonUtils.requireNonNull(request.getPassword(), "password can't be null or empty!");
 
        Optional<PwjbUserInfoDO> oldUserOpt = pwjbUserInfoRepository.findByUsername(username);
        if (oldUserOpt.isPresent()) {
            throw new IllegalArgumentException("username already exist, please change one!");
        }
 
        PwjbUserInfoDO pwjbUserInfoDO = new PwjbUserInfoDO();
 
        pwjbUserInfoDO.setUsername(username);
        pwjbUserInfoDO.setGmtCreate(new Date());
        pwjbUserInfoDO.setGmtModified(new Date());
 
        // 二次加密密码
        final String password = request.getPassword();
        if (StringUtils.isNotEmpty(password)) {
            pwjbUserInfoDO.setPassword(DigestUtils.rePassword(password, pwjbUserInfoDO.getUsername()));
        }
 
        // 其他参数存入 extra,在回调创建真正的内部 USER 时回填
        ModifyUserInfoRequest cpRequest = JsonUtils.parseObject(JsonUtils.toJSONString(request), ModifyUserInfoRequest.class);
        cpRequest.setPassword(null);
        cpRequest.setUsername(null);
        cpRequest.setNick(null);
        pwjbUserInfoDO.setExtra(JsonUtils.toJSONString(cpRequest));
 
        return pwjbUserInfoRepository.save(pwjbUserInfoDO);
    }
 
    @Override
    public void changePassword(ChangePasswordRequest changePasswordRequest) {
        if (!StringUtils.equals(changePasswordRequest.getNewPassword(), changePasswordRequest.getNewPassword2())) {
            throw new IllegalArgumentException("Inconsistent passwords");
        }
 
        String username = changePasswordRequest.getUsername();
        Optional<PwjbUserInfoDO> userOpt = pwjbUserInfoRepository.findByUsername(username);
        if (!userOpt.isPresent()) {
            throw new IllegalArgumentException("can't find user by username: " + username);
        }
 
        PwjbUserInfoDO dbUser = userOpt.get();
        String oldPasswordInDb = dbUser.getPassword();
        String oldPasswordInReq = DigestUtils.rePassword(changePasswordRequest.getOldPassword(), dbUser.getUsername());
        if (!StringUtils.equals(oldPasswordInDb, oldPasswordInReq)) {
            throw new PowerJobAuthException(ErrorCodes.INCORRECT_PASSWORD);
        }
 
        // 测试账号特殊处理
        if (NOT_ALLOWED_CHANGE_PASSWORD_ACCOUNTS.contains(username)) {
            throw new IllegalArgumentException("this account not allowed change the password");
        }
 
        dbUser.setPassword(DigestUtils.rePassword(changePasswordRequest.getNewPassword(), dbUser.getUsername()));
        dbUser.setGmtModified(new Date());
        pwjbUserInfoRepository.saveAndFlush(dbUser);
    }
}