diff --git a/src/apis/kis/call.rs b/src/apis/kis/call.rs index 385fd2f..929716b 100644 --- a/src/apis/kis/call.rs +++ b/src/apis/kis/call.rs @@ -3,12 +3,9 @@ use crate::core::dotenv; const KIS_BASE_URL: &str = "https://openapi.koreainvestment.com:9443"; -pub fn call(api: &KisApi, endpoint: &str, params: &[(&str, &str)]) -> Result { +pub fn call(_api: &KisApi, endpoint: &str, params: &[(&str, &str)]) -> Result { let env = dotenv::read_env(&crate::core::paths::env_file()); - let token = api - .token() - .or_else(|| env.get("KIS_ACCESS_TOKEN").map(String::as_str)) - .ok_or("로그인이 필요합니다. `openstock api login`을 먼저 실행하세요.")?; + let token = crate::apis::kis::login::access_token_or_login()?; let appkey = env .get("KIS_APPKEY") .ok_or("KIS_APPKEY가 설정 파일에 없습니다.")?; @@ -29,7 +26,7 @@ pub fn call(api: &KisApi, endpoint: &str, params: &[(&str, &str)]) -> Result Result { Ok(access_token) } +pub(crate) fn access_token_or_login() -> Result { + let env_path = crate::core::paths::env_file(); + let env = dotenv::read_env(&env_path); + if let Some(access_token) = valid_access_token(&env) { + return Ok(access_token.to_string()); + } + + let appkey = env + .get("KIS_APPKEY") + .ok_or("KIS_APPKEY가 설정 파일에 없습니다.")? + .to_string(); + let appsecret = env + .get("KIS_APPSECRET") + .ok_or("KIS_APPSECRET가 설정 파일에 없습니다.")? + .to_string(); + + login(&KisLoginArguments::new(appkey, appsecret, true)) +} + fn validate_credentials(args: &KisLoginArguments) -> Result<(), String> { if args.appkey.trim().is_empty() { return Err("[KIS] KIS_APPKEY가 비어 있습니다".to_string()); @@ -126,7 +145,7 @@ fn validate_credentials(args: &KisLoginArguments) -> Result<(), String> { Ok(()) } -fn valid_access_token(env: &HashMap) -> Option<&str> { +pub(crate) fn valid_access_token(env: &HashMap) -> Option<&str> { let access_token = env.get("KIS_ACCESS_TOKEN")?; if access_token.trim().is_empty() { return None; diff --git a/src/apis/kis/main.rs b/src/apis/kis/main.rs index 836f665..18bd29d 100644 --- a/src/apis/kis/main.rs +++ b/src/apis/kis/main.rs @@ -27,9 +27,6 @@ impl KisApi { } } - pub(crate) fn token(&self) -> Option<&str> { - self.token.as_deref() - } } impl TraderApi for KisApi { diff --git a/src/apis/kis/order_common.rs b/src/apis/kis/order_common.rs index 916cfc3..d523a40 100644 --- a/src/apis/kis/order_common.rs +++ b/src/apis/kis/order_common.rs @@ -70,12 +70,9 @@ pub(crate) fn order_cash( .to_string()) } -fn post_order(api: &KisApi, tr_id: &str, body: &serde_json::Value) -> Result { +fn post_order(_api: &KisApi, tr_id: &str, body: &serde_json::Value) -> Result { let env = dotenv::read_env(&crate::core::paths::env_file()); - let token = api - .token() - .or_else(|| env.get("KIS_ACCESS_TOKEN").map(String::as_str)) - .ok_or("로그인이 필요합니다. `openstock api login`을 먼저 실행하세요.")?; + let token = crate::apis::kis::login::access_token_or_login()?; let appkey = env .get("KIS_APPKEY") .ok_or("KIS_APPKEY가 설정 파일에 없습니다.")?; @@ -87,7 +84,7 @@ fn post_order(api: &KisApi, tr_id: &str, body: &serde_json::Value) -> Result