// // APIController.swift // AcaMate // // Created by Sean Kim on 11/26/24. // import Foundation import Combine import Alamofire public func loadAPIData(url: String, path: String, method: HTTPMethod = .get, parameters: [String: Any], headers: HTTPHeaders = [:],//["Accept": "application/json"], decodingType: T.Type) -> Future { let encoding: ParameterEncoding = (method == .get) ? URLEncoding.default : JSONEncoding.default return Future { promise in printLog(parameters) AF.request("\(url)\(path)", method: method, parameters: parameters, encoding: encoding, headers: headers ) .validate(statusCode: 200 ..< 300) .responseString { response in printLog(response) } .responseDecodable(of: decodingType) { response in switch response.result { case .success(let value): promise(.success(value)) case .failure(let error): promise(.failure(error)) } } } } public func reloadAccessToken() -> Future { @UserDefault(key: "refresh", defaultValue: "refreshToken") var refresh return Future { promise in _ = loadAPIData(url: "\(API_URL)", path: "/api/v1/in/app/retryAccess", parameters: ["refresh": refresh], decodingType: APIResponse.self) .sink { completion in switch completion { case .failure(let error): promise(.failure(error)) printLog("\(error)") case .finished: printLog("엑세스 토큰 재발급 완료") break } } receiveValue: { response in guard let accToken = response as? APIResponse else { promise(.failure(ACA_ERROR("Unknown ERROR"))) return } switch accToken.status.code { case .success(let code): if code == "000" { if let tknData = accToken.data { promise(.success(tknData)) } } case .inputErr(let code): // 로그인 화면으로 전환하기 promise(.failure(ACA_ERROR("Refresh token ERROR(\(code), \(accToken.status.message)"))) default: // 그외에 서버에서 처리를 하다가 문제가 생겨서 발생하는 에러는 여기로 보낼거임 promise(.failure(ACA_ERROR("Unknown ERROR"))) } } } }