Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions build.gradle
Original file line number Diff line number Diff line change
Expand Up @@ -48,6 +48,7 @@ dependencies {
implementation 'org.springframework.boot:spring-boot-starter-data-redis'
/* API */
implementation 'org.springframework.boot:spring-boot-starter-webflux'
implementation group: 'com.googlecode.json-simple', name: 'json-simple', version: '1.1.1' // String JSON Parse
/* querydsl */
implementation "com.querydsl:querydsl-jpa:${queryDslVersion}"
implementation "com.querydsl:querydsl-apt:${queryDslVersion}"
Expand Down
4 changes: 3 additions & 1 deletion src/main/java/com/ssafy/tott/api/exception/APIErrorCode.java
Original file line number Diff line number Diff line change
Expand Up @@ -9,7 +9,9 @@
@Getter
public enum APIErrorCode implements ErrorCode {
ERROR_SERVER_BY_JSON_PROCESSING(500, "API_01", "내부 서버 오류 입니다."),
ERROR_SERVER_BY_OUTER_API_SERVER(500, "API_02", "API 서버 오류 입니다.");
ERROR_SERVER_BY_OUTER_API_SERVER(500, "API_02", "API 서버 오류 입니다."),
ERROR_SERVER_BY_API_KEY_IS_NOT_VALID(500, "API_03", "올바르지 않은 API 키 입니다."),
;

private int statusCode;
private String errorCode;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -18,4 +18,8 @@ public abstract class ShinhanBankAPIResponse implements APIResponse {
public boolean isFailed() {
return dataHeader.getSuccessCode().equals(ERROR_CODE);
}

protected void setDataHeader(ResponseDataHeader dataHeader) {
this.dataHeader = dataHeader;
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -16,4 +16,14 @@ public class ResponseDataHeader {

@JsonProperty("resultMessage")
private String resultMessage;

private ResponseDataHeader(String successCode) {
this.successCode = successCode;
this.resultCode = "";
this.resultMessage = "";
}

public static ResponseDataHeader from(String successCode) {
return new ResponseDataHeader(successCode);
}
}
Original file line number Diff line number Diff line change
@@ -1,33 +1,95 @@
package com.ssafy.tott.api.shinhan.service.searchname;

import com.ssafy.tott.account.domain.BankCode;
import com.ssafy.tott.api.core.FetchAPICore;
import com.ssafy.tott.api.core.dto.APIRequest;
import com.ssafy.tott.api.shinhan.dto.response.ShinhanBankAPIResponse;
import com.ssafy.tott.api.exception.APIErrorCode;
import com.ssafy.tott.api.exception.APIException;
import com.ssafy.tott.api.shinhan.dto.request.ShinhanBankAPIRequest;
import com.ssafy.tott.api.shinhan.dto.response.header.ResponseDataHeader;
import com.ssafy.tott.api.shinhan.factory.ShinhanBankWebClientFactory;
import com.ssafy.tott.api.shinhan.service.searchname.dto.request.ShinhanBankSearchNameRequest;
import com.ssafy.tott.api.shinhan.service.searchname.dto.request.ShinhanBankSearchNameRequestDataBody;
import com.ssafy.tott.api.shinhan.service.searchname.dto.response.ShinhanBankSearchNameResponse;
import com.ssafy.tott.api.shinhan.service.searchname.dto.response.body.ShinhanBankSearchNameResponseDataBody;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.json.simple.JSONObject;
import org.json.simple.parser.JSONParser;
import org.json.simple.parser.ParseException;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Component;
import org.springframework.web.reactive.function.client.WebClient;

import java.util.regex.Pattern;

@RequiredArgsConstructor
@Component
@Slf4j
public class ShinhanBankSearchNameFetchAPI implements FetchAPICore {
private final ShinhanBankWebClientFactory shinhanBankWebClientFactory;

@Value("${SHINHAN_BANK.API.URI.SEARCH_NAME}")
private String uri;

@Value("${SHINHAN_BANK.API.KEY}")
private String validateKey; // 실제 `API`가 존재시 삭제 필요

@Override
public ShinhanBankSearchNameResponse fetchAPI(APIRequest json) {
ShinhanBankSearchNameRequest shinhanBankSearchNameRequest = (ShinhanBankSearchNameRequest) json;
WebClient webClient = shinhanBankWebClientFactory.createWebClientWithURI(uri);
return webClient
.post()
.bodyValue(shinhanBankSearchNameRequest.getJson())
.retrieve()
.bodyToMono(ShinhanBankSearchNameResponse.class)
.block();
return dummyFetchAPI(json);
/* 원래라면 정상 동작하는 코드이지만 현재는 비활성화 되어서 주석 처리 */
// ShinhanBankSearchNameRequest shinhanBankSearchNameRequest = (ShinhanBankSearchNameRequest) json;
// WebClient webClient = shinhanBankWebClientFactory.createWebClientWithURI(uri);
// return webClient
// .post()
// .bodyValue(shinhanBankSearchNameRequest.getJson())
// .retrieve()
// .bodyToMono(ShinhanBankSearchNameResponse.class)
// .block();
}

private ShinhanBankSearchNameResponse dummyFetchAPI(APIRequest request) {
if (request instanceof ShinhanBankSearchNameRequest) {
ShinhanBankSearchNameRequest shinhanBankSearchNameRequest = (ShinhanBankSearchNameRequest) request;
ShinhanBankAPIRequest searchNameRequest = parseByJson(shinhanBankSearchNameRequest.getJson());
validateApiKey(searchNameRequest.getDataHeader().getApikey());
return sendResponse((ShinhanBankSearchNameRequestDataBody) searchNameRequest.getShinhanBankDataBody());
}
throw new APIException(APIErrorCode.ERROR_SERVER_BY_JSON_PROCESSING);
}

private ShinhanBankAPIRequest parseByJson(String json) {
try {
JSONParser parser = new JSONParser();
JSONObject object = (JSONObject) parser.parse(json);
JSONObject dataHeader = (JSONObject) object.get("dataHeader");
JSONObject dataBody = (JSONObject) object.get("dataBody");
String apiKey = (String) dataHeader.get("apikey");
String bankCode = (String) dataBody.get("입금은행코드");
String account = (String) dataBody.get("입금계좌번호");
return ShinhanBankAPIRequest.of(apiKey, ShinhanBankSearchNameRequestDataBody.of(bankCode, account));
} catch (ParseException e) {
throw new APIException(APIErrorCode.ERROR_SERVER_BY_JSON_PROCESSING);
}
}

private void validateApiKey(String apiKey) {
if (!apiKey.equals(validateKey)) {
throw new APIException(APIErrorCode.ERROR_SERVER_BY_API_KEY_IS_NOT_VALID);
}
}

private ShinhanBankSearchNameResponse sendResponse(ShinhanBankSearchNameRequestDataBody dataBody) {
if (validateDataBody(dataBody)) {
return ShinhanBankSearchNameResponse.of(ResponseDataHeader.from("1"),
ShinhanBankSearchNameResponseDataBody.of(dataBody.getBankCode(), dataBody.getAccount(), null));
}
return ShinhanBankSearchNameResponse.of(ResponseDataHeader.from("0"),
ShinhanBankSearchNameResponseDataBody.of(dataBody.getBankCode(), dataBody.getAccount(), "김신한"));
}

private boolean validateDataBody(ShinhanBankSearchNameRequestDataBody dataBody) {
return !dataBody.getBankCode().equals(BankCode.SHINHAN.getCode()) ||
!Pattern.matches("\\d{10,14}", dataBody.getAccount());
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@

import com.fasterxml.jackson.annotation.JsonProperty;
import com.ssafy.tott.api.shinhan.dto.response.ShinhanBankAPIResponse;
import com.ssafy.tott.api.shinhan.dto.response.header.ResponseDataHeader;
import com.ssafy.tott.api.shinhan.service.searchname.dto.response.body.ShinhanBankSearchNameResponseDataBody;
import lombok.AccessLevel;
import lombok.Getter;
Expand All @@ -13,6 +14,17 @@ public class ShinhanBankSearchNameResponse extends ShinhanBankAPIResponse {
@JsonProperty("dataBody")
private ShinhanBankSearchNameResponseDataBody shinhanBankSearchNameResponseDataBody;

private ShinhanBankSearchNameResponse(ResponseDataHeader dataHeader,
ShinhanBankSearchNameResponseDataBody dataBody) {
setDataHeader(dataHeader);
this.shinhanBankSearchNameResponseDataBody = dataBody;
}

public static ShinhanBankSearchNameResponse of(ResponseDataHeader dataHeader,
ShinhanBankSearchNameResponseDataBody dataBody) {
return new ShinhanBankSearchNameResponse(dataHeader, dataBody);
}

public String getOwnerName() {
return shinhanBankSearchNameResponseDataBody.getAccountOwnerName();
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -17,4 +17,14 @@ public class ShinhanBankSearchNameResponseDataBody extends ShinhanBankDataBody {

@JsonProperty("입금계좌성명")
private String accountOwnerName;

private ShinhanBankSearchNameResponseDataBody(String bankCode, String account, String accountOwnerName) {
this.bankCode = bankCode;
this.account = account;
this.accountOwnerName = accountOwnerName;
}

public static ShinhanBankSearchNameResponseDataBody of(String bankCode, String account, String accountOwnerName) {
return new ShinhanBankSearchNameResponseDataBody(bankCode, account, accountOwnerName);
}
}
Original file line number Diff line number Diff line change
@@ -1,15 +1,25 @@
package com.ssafy.tott.api.shinhan.service.transfer1;

import com.ssafy.tott.account.domain.BankCode;
import com.ssafy.tott.api.core.FetchAPICore;
import com.ssafy.tott.api.core.dto.APIRequest;
import com.ssafy.tott.api.shinhan.dto.response.ShinhanBankAPIResponse;
import com.ssafy.tott.api.exception.APIErrorCode;
import com.ssafy.tott.api.exception.APIException;
import com.ssafy.tott.api.shinhan.dto.request.ShinhanBankAPIRequest;
import com.ssafy.tott.api.shinhan.dto.response.header.ResponseDataHeader;
import com.ssafy.tott.api.shinhan.factory.ShinhanBankWebClientFactory;
import com.ssafy.tott.api.shinhan.service.transfer1.dto.request.ShinhanBankTransfer1Request;
import com.ssafy.tott.api.shinhan.service.transfer1.dto.request.ShinhanBankTransfer1RequestDataBody;
import com.ssafy.tott.api.shinhan.service.transfer1.dto.response.ShinhanBankTransfer1Response;
import com.ssafy.tott.api.shinhan.service.transfer1.dto.response.body.Transfer1ResponseShinhanBankDataBody;
import lombok.RequiredArgsConstructor;
import org.json.simple.JSONObject;
import org.json.simple.parser.JSONParser;
import org.json.simple.parser.ParseException;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Component;
import org.springframework.web.reactive.function.client.WebClient;

import java.util.regex.Pattern;

@RequiredArgsConstructor
@Component
Expand All @@ -20,15 +30,75 @@ public class ShinhanBankTransfer1FetchAPI implements FetchAPICore {
@Value("${SHINHAN_BANK.API.URI.1TRANSFER}")
private String uri;

@Value("${SHINHAN_BANK.API.KEY}")
private String validateKey; // 실제 `API`가 존재시 삭제 필요

@Override
public ShinhanBankTransfer1Response fetchAPI(APIRequest request) {
ShinhanBankTransfer1Request shinhanBankTransfer1Request = (ShinhanBankTransfer1Request) request;
WebClient webClient = shinhanBankWebClientFactory.createWebClientWithURI(uri);
return webClient
.post()
.bodyValue(shinhanBankTransfer1Request.getJson())
.retrieve()
.bodyToMono(ShinhanBankTransfer1Response.class)
.block();
return dummyFetchAPI(request);
// ShinhanBankTransfer1Request shinhanBankTransfer1Request = (ShinhanBankTransfer1Request) request;
// WebClient webClient = shinhanBankWebClientFactory.createWebClientWithURI(uri);
// return webClient
// .post()
// .bodyValue(shinhanBankTransfer1Request.getJson())
// .retrieve()
// .bodyToMono(ShinhanBankTransfer1Response.class)
// .block();
}

private ShinhanBankTransfer1Response dummyFetchAPI(APIRequest request) {
if (request instanceof ShinhanBankTransfer1Request) {
ShinhanBankTransfer1Request shinhanBankTransfer1Request = (ShinhanBankTransfer1Request) request;
ShinhanBankAPIRequest searchNameRequest = parseByJson(shinhanBankTransfer1Request.getJson());
validateApiKey(searchNameRequest.getDataHeader().getApikey());
return sendResponse((ShinhanBankTransfer1RequestDataBody) searchNameRequest.getShinhanBankDataBody());
}
throw new APIException(APIErrorCode.ERROR_SERVER_BY_JSON_PROCESSING);
}

private ShinhanBankAPIRequest parseByJson(String json) {
try {
JSONParser parser = new JSONParser();
JSONObject object = (JSONObject) parser.parse(json);
JSONObject dataHeader = (JSONObject) object.get("dataHeader");
JSONObject dataBody = (JSONObject) object.get("dataBody");
String apiKey = (String) dataHeader.get("apikey");
String bankCode = (String) dataBody.get("입금은행코드");
String account = (String) dataBody.get("입금계좌번호");
String memo = (String) dataBody.get("입금통장메모");
return ShinhanBankAPIRequest.of(apiKey,
ShinhanBankTransfer1RequestDataBody.of(getBankCode(bankCode), account, memo));
} catch (ParseException e) {
throw new APIException(APIErrorCode.ERROR_SERVER_BY_JSON_PROCESSING);
}
}

private BankCode getBankCode(String bankCode) {
for (BankCode code : BankCode.values()) {
if (code.getCode().equals(bankCode)) {
return code;
}
}
return null;
}

private void validateApiKey(String apiKey) {
if (!apiKey.equals(validateKey)) {
throw new APIException(APIErrorCode.ERROR_SERVER_BY_API_KEY_IS_NOT_VALID);
}
}

private ShinhanBankTransfer1Response sendResponse(ShinhanBankTransfer1RequestDataBody dataBody) {
if (validateDataBody(dataBody)) {
return ShinhanBankTransfer1Response.of(ResponseDataHeader.from("1"),
Transfer1ResponseShinhanBankDataBody.from(dataBody));
}
return ShinhanBankTransfer1Response.of(ResponseDataHeader.from("0"),
Transfer1ResponseShinhanBankDataBody.from(dataBody));
}

private boolean validateDataBody(ShinhanBankTransfer1RequestDataBody dataBody) {
return !dataBody.getBankCode().equals(BankCode.SHINHAN.getCode()) ||
!Pattern.matches("\\d{10,14}", dataBody.getAccount());
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@

import com.fasterxml.jackson.annotation.JsonProperty;
import com.ssafy.tott.api.shinhan.dto.response.ShinhanBankAPIResponse;
import com.ssafy.tott.api.shinhan.dto.response.header.ResponseDataHeader;
import com.ssafy.tott.api.shinhan.service.transfer1.dto.response.body.Transfer1ResponseShinhanBankDataBody;
import lombok.AccessLevel;
import lombok.NoArgsConstructor;
Expand All @@ -11,6 +12,17 @@ public class ShinhanBankTransfer1Response extends ShinhanBankAPIResponse {
@JsonProperty("dataBody")
private Transfer1ResponseShinhanBankDataBody transfer1ResponseShinhanBankDataBody;

private ShinhanBankTransfer1Response(ResponseDataHeader dataHeader,
Transfer1ResponseShinhanBankDataBody dataBody) {
setDataHeader(dataHeader);
this.transfer1ResponseShinhanBankDataBody = dataBody;
}

public static ShinhanBankTransfer1Response of(ResponseDataHeader dataHeader,
Transfer1ResponseShinhanBankDataBody dataBody) {
return new ShinhanBankTransfer1Response(dataHeader, dataBody);
}

public Transfer1ResponseShinhanBankDataBody getDataBody() {
return transfer1ResponseShinhanBankDataBody;
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@

import com.fasterxml.jackson.annotation.JsonProperty;
import com.ssafy.tott.api.shinhan.dto.ShinhanBankDataBody;
import com.ssafy.tott.api.shinhan.service.transfer1.dto.request.ShinhanBankTransfer1RequestDataBody;
import lombok.AccessLevel;
import lombok.Getter;
import lombok.NoArgsConstructor;
Expand All @@ -14,4 +15,13 @@ public class Transfer1ResponseShinhanBankDataBody extends ShinhanBankDataBody {

@JsonProperty("입금계좌번호")
private String account;

private Transfer1ResponseShinhanBankDataBody(String bankCode, String account) {
this.bankCode = bankCode;
this.account = account;
}

public static Transfer1ResponseShinhanBankDataBody from(ShinhanBankTransfer1RequestDataBody dataBody) {
return new Transfer1ResponseShinhanBankDataBody(dataBody.getBankCode(), dataBody.getAccount());
}
}