// // ForayNetworkManager.swift // foray // // Created by Nicholas Tay on 20/3/2022. // import Foundation class ForayFetcher { var basicUsername: String? = nil var basicPassword: String? = nil // Reuse JSON decoder, allows for customisation of things like date decode if required var jsonDecoder: JSONDecoder = { let jd = JSONDecoder() // Defaults to year-month-date format jd.dateDecodingStrategy = .custom({ (decoder) -> Date in let container = try decoder.singleValueContainer() let dateStr = try container.decode(String.self) let dateFormat = DateFormatter() dateFormat.dateFormat = "yyyy-MM-dd" return dateFormat.date(from: dateStr)! }) return jd }() func fetch(url: String) async throws -> T { var request = URLRequest(url: URL(string: url)!) request.cachePolicy = .reloadRevalidatingCacheData // Needed otherwise default caching policy seems not to check properly // Basic auth if required if (self.basicUsername != nil && self.basicPassword != nil) { let authData = (self.basicUsername! + ":" + self.basicPassword!).data(using: .utf8)!.base64EncodedString() request.addValue("Basic \(authData)", forHTTPHeaderField: "Authorization") } let (data, _) = try await URLSession.shared.data(for: request) let items = try jsonDecoder.decode(T.self, from: data) return items } }