package io.codef.api;
import java.io.IOException;
import java.io.UnsupportedEncodingException;
import java.util.HashMap;
import com.fasterxml.jackson.core.JsonParseException;
import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.databind.JsonMappingException;
import com.fasterxml.jackson.databind.ObjectMapper;
/**
*
* io.codef.easycodef
* |_ EasyCodef.java
*
*
* Desc : 코드에프의 쉬운 사용을 위한 유틸 라이브러리 클래스
* @Company : ©CODEF corp.
* @Author : notfound404@codef.io
* @Date : Jun 26, 2020 3:28:31 PM
*/
public class EasyCodef {
private ObjectMapper mapper = new ObjectMapper();
/**
* EasyCodef 사용을 위한 변수 설정 오브젝트
*/
private EasyCodefProperties properties = new EasyCodefProperties();
/**
* Desc : 정식서버 사용을 위한 클라이언트 정보 설정
* @Company : ©CODEF corp.
* @Author : notfound404@codef.io
* @Date : Jun 26, 2020 3:30:59 PM
* @param clientId
* @param clientSecret
*/
public void setClientInfo(String clientId, String clientSecret) {
properties.setClientInfo(clientId, clientSecret);
}
/**
* Desc : 데모서버 사용을 위한 클라이언트 정보 설정
* @Company : ©CODEF corp.
* @Author : notfound404@codef.io
* @Date : Jun 26, 2020 3:31:12 PM
* @param demoClientId
* @param demoClientSecret
*/
public void setClientInfoForDemo(String demoClientId, String demoClientSecret) {
properties.setClientInfoForDemo(demoClientId, demoClientSecret);
}
/**
* Desc : RSA암호화를 위한 퍼블릭키 설정
* @Company : ©CODEF corp.
* @Author : notfound404@codef.io
* @Date : Jun 26, 2020 3:31:24 PM
* @param publicKey
*/
public void setPublicKey(String publicKey) {
properties.setPublicKey(publicKey);
}
/**
* Desc : RSA암호화를 위한 퍼블릭키 반환
* @Company : ©CODEF corp.
* @Author : notfound404@codef.io
* @Date : Jun 26, 2020 3:32:25 PM
* @return
*/
public String getPublicKey() {
return properties.getPublicKey();
}
/**
* Desc : 상품 요청
* @Company : ©CODEF corp.
* @Author : notfound404@codef.io
* @Date : Jun 26, 2020 3:32:31 PM
* @param productUrl
* @param serviceType
* @param parameterMap
* @return
* @throws UnsupportedEncodingException
* @throws JsonProcessingException
* @throws InterruptedException
*/
public String requestProduct(String productUrl, EasyCodefServiceType serviceType, HashMap parameterMap) throws UnsupportedEncodingException, JsonProcessingException, InterruptedException {
boolean validationFlag = true;
/** #1.필수 항목 체크 - 클라이언트 정보 */
validationFlag = checkClientInfo(serviceType.getServiceType());
if(!validationFlag) {
EasyCodefResponse response = new EasyCodefResponse(EasyCodefMessageConstant.EMPTY_CLIENT_INFO);
return mapper.writeValueAsString(response);
}
/** #2.필수 항목 체크 - 퍼블릭 키 */
validationFlag = checkPublicKey();
if(!validationFlag) {
EasyCodefResponse response = new EasyCodefResponse(EasyCodefMessageConstant.EMPTY_PUBLIC_KEY);
return mapper.writeValueAsString(response);
}
/** #3.추가인증 키워드 체크 */
validationFlag = checkTwoWayKeyword(parameterMap);
if(!validationFlag) {
EasyCodefResponse response = new EasyCodefResponse(EasyCodefMessageConstant.INVALID_2WAY_KEYWORD);
return mapper.writeValueAsString(response);
}
/** #4.상품 조회 요청 */
EasyCodefResponse response = EasyCodefConnector.execute(productUrl, serviceType.getServiceType(), parameterMap, properties);
/** #5.결과 반환 */
return mapper.writeValueAsString(response);
}
/**
* Desc : 상품 추가인증 요청
* @Company : ©CODEF corp.
* @Author : notfound404@codef.io
* @Date : Jun 26, 2020 3:32:41 PM
* @param productUrl
* @param serviceType
* @param parameterMap
* @return
* @throws UnsupportedEncodingException
* @throws JsonProcessingException
* @throws InterruptedException
*/
public String requestCertification(String productUrl, EasyCodefServiceType serviceType, HashMap parameterMap) throws UnsupportedEncodingException, JsonProcessingException, InterruptedException {
boolean validationFlag = true;
/** #1.필수 항목 체크 - 클라이언트 정보 */
validationFlag = checkClientInfo(serviceType.getServiceType());
if(!validationFlag) {
EasyCodefResponse response = new EasyCodefResponse(EasyCodefMessageConstant.EMPTY_CLIENT_INFO);
return mapper.writeValueAsString(response);
}
/** #2.필수 항목 체크 - 퍼블릭 키 */
validationFlag = checkPublicKey();
if(!validationFlag) {
EasyCodefResponse response = new EasyCodefResponse(EasyCodefMessageConstant.EMPTY_PUBLIC_KEY);
return mapper.writeValueAsString(response);
}
/** #3.추가인증 파라미터 필수 입력 체크 */
validationFlag = checkTwoWayInfo(parameterMap);
if(!validationFlag) {
EasyCodefResponse response = new EasyCodefResponse(EasyCodefMessageConstant.INVALID_2WAY_INFO);
return mapper.writeValueAsString(response);
}
/** #4.상품 조회 요청 */
EasyCodefResponse response = EasyCodefConnector.execute(productUrl, serviceType.getServiceType(), parameterMap, properties);
/** #5.결과 반환 */
return mapper.writeValueAsString(response);
}
/**
* Desc : 서비스 타입에 따른 클라이언트 정보 설정 확인
* @Company : ©CODEF corp.
* @Author : notfound404@codef.io
* @Date : Jun 26, 2020 3:33:23 PM
* @param serviceType
* @return
*/
private boolean checkClientInfo(int serviceType) {
if(serviceType == 0) {
if(properties.getClientId() == null || "".equals(properties.getClientId().trim())) {
return false;
}
if(properties.getClientSecret() == null || "".equals(properties.getClientSecret().trim())) {
return false;
}
} else if(serviceType == 1) {
if(properties.getDemoClientId() == null || "".equals(properties.getDemoClientId().trim())) {
return false;
}
if(properties.getDemoClientSecret() == null || "".equals(properties.getDemoClientSecret().trim())) {
return false;
}
} else {
if(EasyCodefConstant.SANDBOX_CLIENT_ID == null || "".equals(EasyCodefConstant.SANDBOX_CLIENT_ID.trim())) {
return false;
}
if(EasyCodefConstant.SANDBOX_CLIENT_SECRET == null || "".equals(EasyCodefConstant.SANDBOX_CLIENT_SECRET.trim())) {
return false;
}
}
return true;
}
/**
* Desc : 퍼블릭키 정보 설정 확인
* @Company : ©CODEF corp.
* @Author : notfound404@codef.io
* @Date : Jun 26, 2020 3:33:31 PM
* @return
*/
private boolean checkPublicKey() {
if(properties.getPublicKey() == null || "".equals(properties.getPublicKey().trim())) {
return false;
}
return true;
}
/**
* Desc : 추가인증 파라미터 설정 확인
* @Company : ©CODEF corp.
* @Author : notfound404@codef.io
* @Date : Jun 26, 2020 3:33:39 PM
* @param parameterMap
* @return
*/
@SuppressWarnings("unchecked")
private boolean checkTwoWayInfo(HashMap parameterMap) {
if(!parameterMap.containsKey("is2Way") || !(parameterMap.get("is2Way") instanceof Boolean) || !(boolean)parameterMap.get("is2Way")){
return false;
}
if(!parameterMap.containsKey("twoWayInfo")) {
return false;
}
HashMap twoWayInfoMap = (HashMap)parameterMap.get("twoWayInfo");
if(!twoWayInfoMap.containsKey("jobIndex") || !twoWayInfoMap.containsKey("threadIndex") || !twoWayInfoMap.containsKey("jti") || !twoWayInfoMap.containsKey("twoWayTimestamp")){
return false;
}
return true;
}
/**
* Desc : 추가인증 키워드 확인
* @Company : ©CODEF corp.
* @Author : notfound404@codef.io
* @Date : Jun 26, 2020 3:33:45 PM
* @param parameterMap
* @return
*/
private boolean checkTwoWayKeyword(HashMap parameterMap) {
if(parameterMap != null && (parameterMap.containsKey("is2Way") || parameterMap.containsKey("twoWayInfo"))) {
return false;
}
return true;
}
/**
* Desc : connectedId 발급을 위한 계정 등록
* @Company : ©CODEF corp.
* @Author : notfound404@codef.io
* @Date : Jun 26, 2020 3:34:02 PM
* @param serviceType
* @param parameterMap
* @return
* @throws UnsupportedEncodingException
* @throws JsonProcessingException
* @throws InterruptedException
*/
public String createAccount(EasyCodefServiceType serviceType, HashMap parameterMap) throws UnsupportedEncodingException, JsonProcessingException, InterruptedException {
return requestProduct(EasyCodefConstant.CREATE_ACCOUNT, serviceType, parameterMap);
}
/**
* Desc : 계정 정보 추가
* @Company : ©CODEF corp.
* @Author : notfound404@codef.io
* @Date : Jun 26, 2020 3:34:11 PM
* @param serviceType
* @param parameterMap
* @return
* @throws UnsupportedEncodingException
* @throws JsonProcessingException
* @throws InterruptedException
*/
public String addAccount(EasyCodefServiceType serviceType, HashMap parameterMap) throws UnsupportedEncodingException, JsonProcessingException, InterruptedException {
return requestProduct(EasyCodefConstant.ADD_ACCOUNT, serviceType, parameterMap);
}
/**
* Desc : 계정 정보 수정
* @Company : ©CODEF corp.
* @Author : notfound404@codef.io
* @Date : Jun 26, 2020 3:34:21 PM
* @param serviceType
* @param parameterMap
* @return
* @throws UnsupportedEncodingException
* @throws JsonProcessingException
* @throws InterruptedException
*/
public String updateAccount(EasyCodefServiceType serviceType, HashMap parameterMap) throws UnsupportedEncodingException, JsonProcessingException, InterruptedException {
return requestProduct(EasyCodefConstant.UPDATE_ACCOUNT, serviceType, parameterMap);
}
/**
* Desc : 계정 정보 삭제
* @Company : ©CODEF corp.
* @Author : notfound404@codef.io
* @Date : Jun 26, 2020 3:34:30 PM
* @param serviceType
* @param parameterMap
* @return
* @throws UnsupportedEncodingException
* @throws JsonProcessingException
* @throws InterruptedException
*/
public String deleteAccount(EasyCodefServiceType serviceType, HashMap parameterMap) throws UnsupportedEncodingException, JsonProcessingException, InterruptedException {
return requestProduct(EasyCodefConstant.DELETE_ACCOUNT, serviceType, parameterMap);
}
/**
* Desc : connectedId로 등록된 계정 목록 조회
* @Company : ©CODEF corp.
* @Author : notfound404@codef.io
* @Date : Jun 26, 2020 3:34:37 PM
* @param serviceType
* @param parameterMap
* @return
* @throws UnsupportedEncodingException
* @throws JsonProcessingException
* @throws InterruptedException
*/
public String getAccountList(EasyCodefServiceType serviceType, HashMap parameterMap) throws UnsupportedEncodingException, JsonProcessingException, InterruptedException {
return requestProduct(EasyCodefConstant.GET_ACCOUNT_LIST, serviceType, parameterMap);
}
/**
* Desc : 클라이언트 정보로 등록된 모든 connectedId 목록 조회
* @Company : ©CODEF corp.
* @Author : notfound404@codef.io
* @Date : Jun 26, 2020 3:34:44 PM
* @param serviceType
* @return
* @throws UnsupportedEncodingException
* @throws JsonProcessingException
* @throws InterruptedException
*/
public String getConnectedIdList(EasyCodefServiceType serviceType) throws UnsupportedEncodingException, JsonProcessingException, InterruptedException {
return requestProduct(EasyCodefConstant.GET_CID_LIST, serviceType, null);
}
/**
* Desc : 토큰 반환 요청 - 보유 중인 유효한 토큰이 있는 경우 반환, 없는 경우 신규 발급 후 반환
* @Company : ©CODEF corp.
* @Author : notfound404@codef.io
* @Date : Jun 26, 2020 3:35:03 PM
* @param serviceType
* @return
* @throws IOException
* @throws JsonMappingException
* @throws JsonParseException
*/
public String requestToken(EasyCodefServiceType serviceType) throws JsonParseException, JsonMappingException, IOException {
String clientId = null;
String clientSecret = null;
if(serviceType.getServiceType() == 0) {
clientId = properties.getClientId();
clientSecret = properties.getClientSecret();
} else if(serviceType.getServiceType() == 1) {
clientId = properties.getDemoClientId();
clientSecret = properties.getDemoClientSecret();
} else {
clientId = EasyCodefConstant.SANDBOX_CLIENT_ID;
clientSecret = EasyCodefConstant.SANDBOX_CLIENT_SECRET;
}
String accessToken = EasyCodefTokenMap.getToken(clientId); // 보유 중인 토큰이 있는 경우 반환
if(accessToken != null) {
HashMap tokenMap = EasyCodefUtil.getTokenMap(accessToken);
if(EasyCodefUtil.checkValidity((int)(tokenMap.get("exp")))) { // 토큰의 유효 기간 확인
return accessToken; // 정상 토큰인 경우 반환
}
}
HashMap tokenMap = EasyCodefConnector.publishToken(clientId, clientSecret); // 보유 중인 토큰이 없거나 신규 발급 조건에 해당하는 경우 발급 후 반환(만료일시를 지났거나 한시간 이내로 도래한 경우 신규 발급)
if(tokenMap != null) {
accessToken = (String)tokenMap.get("access_token");
EasyCodefTokenMap.setToken(clientId, accessToken); // 발급 토큰 저장
return accessToken;
} else {
return null;
}
}
/**
* Desc : 토큰 신규 발급 후 반환(코드에프 이용 중 추가 업무 사용을 하는 등 토큰 권한 변경이 필요하거나 신규 토큰이 필요한 경우시 사용)
* @Company : ©CODEF corp.
* @Author : notfound404@codef.io
* @Date : Sep 16, 2020 11:58:32 AM
* @param serviceType
* @return
* @throws JsonParseException
* @throws JsonMappingException
* @throws IOException
*/
public String requestNewToken(EasyCodefServiceType serviceType) throws JsonParseException, JsonMappingException, IOException {
String clientId = null;
String clientSecret = null;
if(serviceType.getServiceType() == 0) {
clientId = properties.getClientId();
clientSecret = properties.getClientSecret();
} else if(serviceType.getServiceType() == 1) {
clientId = properties.getDemoClientId();
clientSecret = properties.getDemoClientSecret();
} else {
clientId = EasyCodefConstant.SANDBOX_CLIENT_ID;
clientSecret = EasyCodefConstant.SANDBOX_CLIENT_SECRET;
}
String accessToken = null;
HashMap tokenMap = EasyCodefConnector.publishToken(clientId, clientSecret); // 토큰 신규 발급
if(tokenMap != null) {
accessToken = (String)tokenMap.get("access_token");
EasyCodefTokenMap.setToken(clientId, accessToken); // 발급 토큰 저장
return accessToken;
} else {
return null;
}
}
}