add apple tv app

This commit is contained in:
Trey t
2024-06-18 12:03:56 -05:00
parent addeca4ead
commit 7d2b6b3e6e
134 changed files with 869 additions and 37 deletions

View 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/"
}

View 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()
}
}