package com.github.nettybook.ch9.service;
import java.util.Map;
import org.apache.ibatis.session.SqlSession;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Scope;
import org.springframework.stereotype.Service;
import org.springframework.util.StringUtils;
import redis.clients.jedis.Jedis;
import com.github.nettybook.ch9.core.ApiRequestTemplate;
import com.github.nettybook.ch9.core.JedisHelper;
import com.github.nettybook.ch9.core.KeyMaker;
import com.github.nettybook.ch9.service.dao.TokenKey;
import com.google.gson.JsonObject;
@Service("tokenIssue")
@Scope("prototype")
public class TokenIssue extends ApiRequestTemplate {
private static final JedisHelper helper = JedisHelper.getInstance();
@Autowired
private SqlSession sqlSession;
public TokenIssue(Map<String, String> reqData) {
super(reqData);
}
public void requestParamValidation() throws RequestParamException {
if (StringUtils.isEmpty(this.reqData.get("userNo"))) {
throw new RequestParamException("userNo이 없습니다.");
}
if (StringUtils.isEmpty(this.reqData.get("password"))) {
throw new RequestParamException("password가 없습니다.");
}
}
public void service() throws ServiceException {
Jedis jedis = null;
try {
Map<String, Object> result = sqlSession.selectOne("users.userInfoByPassword", this.reqData);
if (result != null) {
final long threeHour = 60 * 60 * 3;
long issueDate = System.currentTimeMillis() / 1000;
String email = String.valueOf(result.get("USERID"));
// token 만들기.
JsonObject token = new JsonObject();
token.addProperty("issueDate", issueDate);
token.addProperty("expireDate", issueDate + threeHour);
token.addProperty("email", email);
token.addProperty("userNo", reqData.get("userNo"));
// token 저장.
KeyMaker tokenKey = new TokenKey(email, issueDate);
jedis = helper.getConnection();
jedis.setex(tokenKey.getKey(), 60 * 60 * 3, token.toString());
// helper.
this.apiResult.addProperty("resultCode", "200");
this.apiResult.addProperty("message", "Success");
this.apiResult.addProperty("token", tokenKey.getKey());
}
else {
// 데이터 없음.
this.apiResult.addProperty("resultCode", "404");
}
}
catch (Exception e) {
helper.returnResource(jedis);
}
}
}