mobile-ios/CovidSafe/UploadHelper.swift

79 lines
2.7 KiB
Swift
Raw Normal View History

2020-05-08 07:49:14 +00:00
//
// UploadHelper.swift
// CovidSafe
//
// Copyright © 2020 Australian Government. All rights reserved.
//
import UIKit
import CoreData
import KeychainSwift
final class UploadHelper {
2021-02-02 00:04:43 +00:00
public static func uploadEncounterData(pin: String?, _ result: @escaping (UploadResult, String?) -> Void) {
2020-05-08 07:49:14 +00:00
let keychain = KeychainSwift()
2020-05-26 07:13:26 +00:00
guard let managedContext = EncounterDB.shared.persistentContainer?.viewContext else {
2021-02-02 00:04:43 +00:00
result(.Failed, "[001]")
2020-05-08 07:49:14 +00:00
return
}
let recordsFetchRequest: NSFetchRequest<Encounter> = Encounter.fetchRequestForRecords()
managedContext.perform {
guard let records = try? recordsFetchRequest.execute() else {
DLog("Error fetching records")
2021-02-02 00:04:43 +00:00
result(.Failed, "[002]")
2020-05-08 07:49:14 +00:00
return
}
let data = UploadFileData(records: records)
let encoder = JSONEncoder()
guard let json = try? encoder.encode(data) else {
DLog("Error serializing data")
2021-02-02 00:04:43 +00:00
result(.Failed, "[003]")
2020-05-08 07:49:14 +00:00
return
}
guard let jwt = keychain.get("JWT_TOKEN") else {
DLog("Error trying to upload when not logged in")
2021-02-02 00:04:43 +00:00
result(.SessionExpired, "Error retrieving token, please log in.")
2020-05-08 07:49:14 +00:00
return
}
2021-02-02 00:04:43 +00:00
InitiateUploadAPI.initiateUploadAPI(session: jwt, pin: pin) { (uploadResponse, error, message) in
2020-05-08 07:49:14 +00:00
guard error == nil else {
if (error == .ExpireSession) {
2021-02-02 00:04:43 +00:00
result(.SessionExpired, message)
2020-05-08 07:49:14 +00:00
return
}
2021-02-02 00:04:43 +00:00
if let message = message, message.contains("InvalidPin") && error == .ServerError {
result(.InvalidCode, message)
return
}
result(.Failed, message)
2020-05-08 07:49:14 +00:00
return
}
guard let response = uploadResponse else {
// if we fail to get a link back then the otp was potentially invalid
2021-02-02 00:04:43 +00:00
result(.Failed, message)
2020-05-08 07:49:14 +00:00
return
}
2021-02-02 00:04:43 +00:00
DataUploadS3.uploadJSONData(data: json, presignedUrl: response.UploadLink) { (isSuccessful, error, message) in
2020-05-08 07:49:14 +00:00
guard isSuccessful else {
DLog("Error uploading file - \(String(describing: error))")
2021-02-02 00:04:43 +00:00
result(.FailedUpload, message)
2020-05-08 07:49:14 +00:00
return
}
2021-02-02 00:04:43 +00:00
result(.Success, nil)
2020-05-08 07:49:14 +00:00
}
}
}
}
}