aboutsummaryrefslogtreecommitdiff
path: root/foray/ForayNetworkManager.swift
diff options
context:
space:
mode:
Diffstat (limited to 'foray/ForayNetworkManager.swift')
-rw-r--r--foray/ForayNetworkManager.swift50
1 files changed, 50 insertions, 0 deletions
diff --git a/foray/ForayNetworkManager.swift b/foray/ForayNetworkManager.swift
new file mode 100644
index 0000000..ab1e2b5
--- /dev/null
+++ b/foray/ForayNetworkManager.swift
@@ -0,0 +1,50 @@
+//
+// ForayNetworkManager.swift
+// foray
+//
+// Created by Nicholas Tay on 20/3/2022.
+//
+
+import Foundation
+
+class ForayNetworkManager {
+ static let shared = ForayNetworkManager()
+
+ 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 get<T: Decodable>(url: String,
+ onComplete: @escaping ([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 (basicUsername != nil && basicPassword != nil) {
+ let authData = (basicUsername! + ":" + basicPassword!).data(using: .utf8)!.base64EncodedString()
+ request.addValue("Basic \(authData)", forHTTPHeaderField: "Authorization")
+ }
+
+ URLSession.shared.dataTask(with: request, completionHandler: { data, response, error -> Void in
+ let items = try! self.jsonDecoder.decode([T].self, from: data!)
+
+ // Possibly passing back to UI, need to do it on the main thread (I think due to async?)
+ DispatchQueue.main.async { onComplete(items) }
+ }).resume()
+ }
+}