This commit is contained in:
Trey t
2023-06-25 10:59:20 -05:00
parent 01915752b6
commit 24ee992f93
14 changed files with 448 additions and 727 deletions

View File

@@ -13,12 +13,13 @@ enum FetchableError: Error {
case decodeError(Error)
case endOfFileError
case noPostData
case noToken
case statusError(Int, String?)
}
protocol Fetchable {
associatedtype Response: Codable
var attachToken: Bool { get }
var baseURL: String { get }
var endPoint: String { get }
func fetch(completion: @escaping (Result<Response, FetchableError>) -> Void)
@@ -26,6 +27,7 @@ protocol Fetchable {
protocol Postable: Fetchable {
var postableData: [String: Any]? { get }
var successStatus: Int { get }
}
extension Fetchable {
@@ -33,10 +35,24 @@ extension Fetchable {
"http://127.0.0.1:8000/"
}
var attachToken: Bool {
return true
}
func fetch(completion: @escaping (Result<Response, FetchableError>) -> Void) {
let url = URL(string: baseURL+endPoint)!
var request = URLRequest(url: url,timeoutInterval: Double.infinity)
if attachToken {
guard let token = UserStore.shared.token else {
completion(.failure(.noPostData))
return
}
request.addValue(token, forHTTPHeaderField: "Authorization")
}
request.addValue("application/json", forHTTPHeaderField: "Content-Type")
let task = URLSession.shared.dataTask(with: url, completionHandler: { (data, response, error) in
let task = URLSession.shared.dataTask(with: request, completionHandler: { (data, response, error) in
if let error = error {
completion(.failure(.apiError(error)))
return
@@ -62,17 +78,23 @@ extension Fetchable {
extension Postable {
func fetch(completion: @escaping (Result<Response, FetchableError>) -> Void) {
guard let postableData = postableData else {
completion(.failure(.noPostData))
guard let postableData = postableData else {
completion(.failure(.noPostData))
return
}
let url = URL(string: baseURL+endPoint)!
let url = URL(string: baseURL+endPoint)!
let postData = try! JSONSerialization.data(withJSONObject:postableData)
var request = URLRequest(url: url,timeoutInterval: Double.infinity)
request.addValue("Token fd59cbf6f5db98726e896cdb6b095ecb9c43a592", forHTTPHeaderField: "Authorization")
if attachToken {
guard let token = UserStore.shared.token else {
completion(.failure(.noPostData))
return
}
request.addValue(token, forHTTPHeaderField: "Authorization")
}
request.addValue("application/json", forHTTPHeaderField: "Content-Type")
request.httpMethod = "POST"
@@ -85,7 +107,7 @@ extension Postable {
}
if let httpRespone = response as? HTTPURLResponse {
if httpRespone.statusCode != 201 {
if httpRespone.statusCode != successStatus {
var returnStr: String?
if let data = data {
returnStr = String(data: data, encoding: .utf8)