This commit is contained in:
Trey t
2023-06-20 20:49:32 -05:00
parent 55f0926a08
commit 695459ac06
15 changed files with 287 additions and 111 deletions

View File

@@ -35,3 +35,14 @@ class AllExerciseFetchable: Fetchable {
typealias Response = [ExerciseExercise]
var endPoint: String = "exercise/all/"
}
class CreateWorkoutFetchable: Postable {
var postableData: [String : Any]?
typealias Response = Workout
var endPoint: String = "workout/create/"
init(postData: [String: Any]) {
self.postableData = postData
}
}

View File

@@ -12,6 +12,8 @@ enum FetchableError: Error {
case noData
case decodeError(Error)
case endOfFileError
case noPostData
case statusError(Int)
}
protocol Fetchable {
@@ -19,10 +21,13 @@ protocol Fetchable {
var baseURL: String { get }
var endPoint: String { get }
func fetch(completion: @escaping (Result<Response, FetchableError>) -> Void)
}
protocol Postable: Fetchable {
var postableData: [String: Any]? { get }
}
extension Fetchable {
var baseURL: String {
"http://127.0.0.1:8000/"
@@ -54,3 +59,53 @@ extension Fetchable {
task.resume()
}
}
extension Postable {
func fetch(completion: @escaping (Result<Response, FetchableError>) -> Void) {
guard let postableData = postableData else {
completion(.failure(.noPostData))
return
}
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")
request.addValue("application/json", forHTTPHeaderField: "Content-Type")
request.httpMethod = "POST"
request.httpBody = postData
let task = URLSession.shared.dataTask(with: request, completionHandler: { data, response, error in
if let error = error {
completion(.failure(.apiError(error)))
return
}
if let httpRespone = response as? HTTPURLResponse {
if httpRespone.statusCode != 201 {
completion(.failure(.statusError(httpRespone.statusCode)))
return
}
}
guard let data = data else {
completion(.failure(.noData))
return
}
do {
let model = try JSONDecoder().decode(Response.self, from: data)
completion(.success(model))
return
} catch {
completion(.failure(.decodeError(error)))
return
}
})
task.resume()
}
}