aboutsummaryrefslogblamecommitdiff
path: root/foray/Fetchers/ForayFetcher.swift
blob: e4c6fd99f48ad1ccbdb46aacdc9d0d8202c83ba2 (plain) (tree)
1
2
3
4
5
6
7
8
9








                                         
                    


















                                                                                          


                                                                                                                                 
 



                                                                                                                      
         



                                                                      

     
//
//  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<T: Decodable>(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
    }
}