forked from AcaMate/AcaMate_iOS
85 lines
2.8 KiB
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")))
|
|
}
|
|
}
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|