package com.metazion.jgd.task;
import com.metazion.jgd.dao.DaoService;
import com.metazion.jgd.dao.DbUser;
import com.metazion.jgd.model.UserData;
import com.metazion.jgd.protocal.cl.UserRegisterCL;
import com.metazion.jgd.protocal.cl.UserRegisterLC;
import com.metazion.jgd.util.JgdLogger;
import com.metazion.jm.net.TransmitSession;
import com.metazion.jm.task.Task;
public class TaskCreateUser extends Task {
private TransmitSession session = null;
private UserRegisterCL reqIn = null;
private UserRegisterLC rspOut = new UserRegisterLC();
private volatile UserData userDataOut = null;
public TaskCreateUser(TransmitSession session, UserRegisterCL req) {
this.session = session;
this.reqIn = req;
}
@Override
public void execute() {
setResult(UserRegisterLC.SUCCESS);
incDesire();
DaoService.execute(() -> {
do {
final String username = reqIn.username.trim().toLowerCase();
final String password = reqIn.password.trim();
// 检查用户名是否已存在
if (DbUser.isUsernameExists(username)) {
setResult(UserRegisterLC.ERROR_DUPLICATE);
JgdLogger.getLogger().warn("Task create user execute: already exist in db");
break;
}
// 添加用户数据
UserData userData = new UserData();
userData.username = username;
userData.password = password;
userData.salt = 0;
userData.registerTime = System.currentTimeMillis();
userData.lastLoginTime = userData.registerTime;
if (!DbUser.insertUserData(userData)) {
setResult(UserRegisterLC.ERROR_DBINSERT);
JgdLogger.getLogger().warn("Task create user execute: insert into db failed");
break;
}
userData = DbUser.getUserDataByName(username);
if (userData == null) {
setResult(UserRegisterLC.ERROR_DBINSERT);
JgdLogger.getLogger().warn("Task create user execute: no data in db");
break;
}
userDataOut = userData;
} while (false);
decDesire();
});
}
@Override
public void onFinish() {
JgdLogger.getLogger().debug("Task create user on finish: seq[{}] result[{}]", seq, result);
if (result != UserRegisterLC.SUCCESS) {
rollback();
failResponse();
return;
}
succeedResponse();
}
@Override
public void onTimeout() {
JgdLogger.getLogger().warn("Task create user on timeout: seq[{}] result[{}]", seq, result);
setResult(UserRegisterLC.TIMEOUT);
rollback();
failResponse();
}
private void rollback() {
DaoService.execute(() -> {
if (userDataOut != null) {
DbUser.deleteUserData(userDataOut.id);
}
});
}
private void succeedResponse() {
JgdLogger.getLogger().info("Task create user successful: seq[{}] result[{}] req username[{}] user id[{}] register address[{}]", seq, result, reqIn.username, userDataOut.id, session.getChannel().remoteAddress().toString());
rspOut.result = (byte) result;
session.send(rspOut);
}
private void failResponse() {
JgdLogger.getLogger().info("Task create user failed: seq[{}] result[{}] req username[{}] register address[{}]", seq, result, reqIn.username, session.getChannel().remoteAddress().toString());
rspOut.result = (byte) result;
session.send(rspOut);
}
}