AcaMate_iOS/AcaMate/5. Manager/APIManager.swift

85 lines
2.8 KiB
Swift

//
// APIController.swift
// AcaMate
//
// Created by Sean Kim on 11/26/24.
//
import Foundation
import Combine
import Alamofire
public func loadAPIData<T: Decodable>(url: String, path: String,
method: HTTPMethod = .get,
parameters: [String: Any],
headers: HTTPHeaders = [:],//["Accept": "application/json"],
decodingType: T.Type) -> Future<Any, Error> {
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<Any, Error> {
@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<Access>.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<Access> 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")))
}
}
}
}