// // 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" // OK to throw as I believe it just errors out the decode; it isn't what we expected schema wise return dateFormat.date(from: dateStr)! }) return jd }() func fetch(url: URL) async throws -> T { var request = URLRequest(url: url) request.cachePolicy = .reloadRevalidatingCacheData // Needed otherwise default caching policy seems not to check properly // Basic auth if required if let basicUsername = basicUsername, let basicPassword = basicPassword, let authData = (basicUsername + ":" + basicPassword).data(using: .utf8) { request.addValue("Basic \(authData.base64EncodedString())", forHTTPHeaderField: "Authorization") } let (data, _) = try await URLSession.shared.data(for: request) let items = try jsonDecoder.decode(T.self, from: data) return items } }