add apple tv app
This commit is contained in:
109
iphone/Werkout_ios/Network/Fetchables.swift
Normal file
109
iphone/Werkout_ios/Network/Fetchables.swift
Normal file
@@ -0,0 +1,109 @@
|
||||
//
|
||||
// AllWorkoutFetchable.swift
|
||||
// Werkout_ios
|
||||
//
|
||||
// Created by Trey Tartt on 6/19/23.
|
||||
//
|
||||
|
||||
import Foundation
|
||||
|
||||
class AllWorkoutFetchable: Fetchable {
|
||||
typealias Response = [Workout]
|
||||
var endPoint: String = "/workout/all/"
|
||||
}
|
||||
|
||||
class WorkoutDetailFetchable: Fetchable {
|
||||
typealias Response = Workout
|
||||
var endPoint: String
|
||||
|
||||
init(workoutID: Int) {
|
||||
self.endPoint = "/workout/"+String(workoutID)+"/details/"
|
||||
}
|
||||
}
|
||||
|
||||
class AllMusclesFetchable: Fetchable {
|
||||
typealias Response = [Muscle]
|
||||
var endPoint: String = "/muscle/all/"
|
||||
}
|
||||
|
||||
class AllEquipmentFetchable: Fetchable {
|
||||
typealias Response = [Equipment]
|
||||
var endPoint: String = "/equipment/all/"
|
||||
}
|
||||
|
||||
class AllExerciseFetchable: Fetchable {
|
||||
typealias Response = [Exercise]
|
||||
var endPoint: String = "/exercise/all/"
|
||||
}
|
||||
|
||||
class CompletedWorkoutFetchable: Fetchable {
|
||||
typealias Response = [CompletedWorkout]
|
||||
var endPoint: String = "/workout/completed/"
|
||||
}
|
||||
|
||||
class PlannedWorkoutFetchable: Fetchable {
|
||||
typealias Response = [PlannedWorkout]
|
||||
var endPoint: String = "/workout/planned_workouts/"
|
||||
}
|
||||
|
||||
class CreateWorkoutFetchable: Postable {
|
||||
var postableData: [String : Any]?
|
||||
var successStatus = 201
|
||||
|
||||
typealias Response = Workout
|
||||
var endPoint: String = "/workout/create/"
|
||||
|
||||
init(postData: [String: Any]) {
|
||||
self.postableData = postData
|
||||
}
|
||||
}
|
||||
|
||||
class CompleteWorkoutFetchable: Postable {
|
||||
var postableData: [String : Any]?
|
||||
var successStatus = 201
|
||||
|
||||
typealias Response = CompletedWorkoutPOSTReturn
|
||||
var endPoint: String = "/workout/complete/"
|
||||
|
||||
init(postData: [String: Any]) {
|
||||
self.postableData = postData
|
||||
}
|
||||
}
|
||||
|
||||
class LoginFetchable: Postable {
|
||||
var postableData: [String : Any]?
|
||||
var successStatus = 200
|
||||
|
||||
typealias Response = RegisteredUser
|
||||
var endPoint: String = "/registered_user/login/"
|
||||
|
||||
var attachToken: Bool {
|
||||
return false
|
||||
}
|
||||
|
||||
init(postData: [String: Any]) {
|
||||
self.postableData = postData
|
||||
}
|
||||
}
|
||||
|
||||
class PlanWorkoutFetchable: Postable {
|
||||
var postableData: [String : Any]?
|
||||
var successStatus = 201
|
||||
|
||||
typealias Response = RegisteredUser
|
||||
var endPoint: String = "/workout/plan_workout/"
|
||||
|
||||
init(postData: [String: Any]) {
|
||||
self.postableData = postData
|
||||
}
|
||||
}
|
||||
|
||||
class AllNSFWVideosFetchable: Fetchable {
|
||||
typealias Response = [NSFWVideo]
|
||||
var endPoint: String = "/videos/nsfw_videos/"
|
||||
}
|
||||
|
||||
class RefreshUserInfoFetcable: Fetchable {
|
||||
typealias Response = RegisteredUser
|
||||
var endPoint: String = "/registered_user/refresh/"
|
||||
}
|
||||
138
iphone/Werkout_ios/Network/Network.swift
Normal file
138
iphone/Werkout_ios/Network/Network.swift
Normal file
@@ -0,0 +1,138 @@
|
||||
//
|
||||
// Network.swift
|
||||
// Werkout_ios
|
||||
//
|
||||
// Created by Trey Tartt on 6/19/23.
|
||||
//
|
||||
|
||||
import Foundation
|
||||
|
||||
enum FetchableError: Error {
|
||||
case apiError(Error)
|
||||
case noData
|
||||
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)
|
||||
}
|
||||
|
||||
protocol Postable: Fetchable {
|
||||
var postableData: [String: Any]? { get }
|
||||
var successStatus: Int { get }
|
||||
}
|
||||
|
||||
extension Fetchable {
|
||||
var baseURL: String {
|
||||
BaseURLs.currentBaseURL
|
||||
}
|
||||
|
||||
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: request, completionHandler: { (data, response, error) in
|
||||
if let error = error {
|
||||
completion(.failure(.apiError(error)))
|
||||
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()
|
||||
}
|
||||
}
|
||||
|
||||
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)
|
||||
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"
|
||||
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 != successStatus {
|
||||
var returnStr: String?
|
||||
if let data = data {
|
||||
returnStr = String(data: data, encoding: .utf8)
|
||||
}
|
||||
|
||||
completion(.failure(.statusError(httpRespone.statusCode, returnStr)))
|
||||
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()
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user