COVIDSafe code from version 2.2 (#42)

This commit is contained in:
COVIDSafe Support 2021-02-02 11:04:43 +11:00 committed by GitHub
parent 9e6e4604ef
commit f14aa60482
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
67 changed files with 3645 additions and 464 deletions

View file

@ -0,0 +1,58 @@
//
// ChangePostcodeAPI.swift
// CovidSafe
//
// Copyright © 2020 Australian Government. All rights reserved.
//
import Foundation
import Alamofire
class ChangePostcodeAPI: CovidSafeAuthenticatedAPI {
static func changePostcode(newPostcode: String,
completion: @escaping (CovidSafeAPIError?) -> Void) {
guard let apiHost = PlistHelper.getvalueFromInfoPlist(withKey: "API_Host", plistName: "CovidSafe-config") else {
return
}
guard let headers = try? authenticatedHeaders() else {
completion(.TokenExpiredError)
return
}
let params = [
"postcode": newPostcode,
]
CovidNetworking.shared.session.request("\(apiHost)/device",
method: .post,
parameters: params,
encoding: JSONEncoding.default,
headers: headers,
interceptor: CovidRequestRetrier(retries:3)).validate().responseDecodable(of: DeviceResponse.self) { (response) in
switch response.result {
case .success:
completion(nil)
case .failure(_):
guard let statusCode = response.response?.statusCode else {
completion(.UnknownError)
return
}
if (statusCode >= 400 && statusCode < 500) {
completion(.RequestError)
return
}
completion(.ServerError)
}
}
}
}
struct DeviceResponse: Decodable {
let message: String?
enum CodingKeys: String, CodingKey {
case message
}
}

View file

@ -8,9 +8,9 @@
import Foundation
class DataUploadS3 {
static func uploadJSONData(data: Data, presignedUrl: String, completion: @escaping (Bool, Swift.Error?) -> Void) {
static func uploadJSONData(data: Data, presignedUrl: String, completion: @escaping (Bool, Swift.Error?, String?) -> Void) {
guard let url = URL(string: presignedUrl) else {
completion(false, nil)
completion(false, nil, "[102] S3")
return
}
var request = URLRequest(url: url)
@ -22,9 +22,9 @@ class DataUploadS3 {
).validate().response { (response) in
switch response.result {
case .success:
completion(true, nil)
completion(true, nil, nil)
case let .failure(error):
completion(false, error)
completion(false, error, "[\(response.response?.statusCode ?? 000))] S3")
}
}
uploadRequest.resume()

View file

@ -35,7 +35,7 @@ class InitiateUploadAPI {
}
}
static func initiateUploadAPI(session: String, pin: String?, completion: @escaping (UploadResponse?, APIError?) -> Void) {
static func initiateUploadAPI(session: String, pin: String?, completion: @escaping (UploadResponse?, APIError?, String?) -> Void) {
guard let apiHost = PlistHelper.getvalueFromInfoPlist(withKey: "API_Host", plistName: "CovidSafe-config") else {
return
}
@ -48,38 +48,30 @@ class InitiateUploadAPI {
}
guard pin != nil else {
completion(nil, .ServerError)
completion(nil, .ServerError, nil)
return
}
CovidNetworking.shared.session.request("\(apiHost)/initiateDataUpload", method: .get, headers: headers, interceptor: CovidRequestRetrier(retries: 3)).validate().responseData { (response) in
guard let respData = response.data else {
completion(nil, .ServerError)
completion(nil, .ServerError, "[100] API")
return
}
switch response.result {
case .success:
do {
let uploadResponse = try JSONDecoder().decode(UploadResponse.self, from: respData)
completion(uploadResponse, nil)
completion(uploadResponse, nil, nil)
} catch {
completion(nil, .ServerError)
completion(nil, .ServerError, "[101] API")
}
case .failure(_):
if (response.response?.statusCode == 403) {
do {
let uploadResponse = try JSONDecoder().decode(ErrorResponse.self, from: respData)
if uploadResponse.message == "InvalidPin" {
completion(nil, .ServerError)
return
}
} catch {
completion(nil, .ServerError)
return
}
completion(nil, .ExpireSession)
} else {
completion(nil, .ServerError)
do {
let uploadResponse = try JSONDecoder().decode(ErrorResponse.self, from: respData)
completion(nil, .ServerError, "[\(response.response?.statusCode ?? 000)] \(uploadResponse.message)")
} catch {
completion(nil, .ServerError, "[\(response.response?.statusCode ?? 000)] API")
}
}
}

View file

@ -12,7 +12,7 @@ class StatisticsAPI: CovidSafeAuthenticatedAPI {
static let keyCovidStatistics = "keyCovidStatistics"
static func getStatistics(completion: @escaping (StatisticsResponse?, CovidSafeAPIError?) -> Void) {
static func getStatistics(forState: StateTerritory = StateTerritory.AU, completion: @escaping (StatisticsResponse?, CovidSafeAPIError?) -> Void) {
guard let apiHost = PlistHelper.getvalueFromInfoPlist(withKey: "API_Host", plistName: "CovidSafe-config") else {
completion(nil, .RequestError)
return
@ -23,8 +23,11 @@ class StatisticsAPI: CovidSafeAuthenticatedAPI {
return
}
CovidNetworking.shared.session.request("\(apiHost)/statistics",
let parameters = ["state" : "\(forState.rawValue)"]
CovidNetworking.shared.session.request("\(apiHost)/v2/statistics",
method: .get,
parameters: parameters,
headers: headers
).validate().responseDecodable(of: StatisticsResponse.self) { (response) in
switch response.result {
@ -66,6 +69,7 @@ class StatisticsAPI: CovidSafeAuthenticatedAPI {
struct StatisticsResponse: Codable {
let updatedDate: String?
let responseVersion: String?
let national: StateTerritoryStatistics?
let act: StateTerritoryStatistics?
@ -88,6 +92,14 @@ struct StatisticsResponse: Codable {
case tas
case vic
case wa
case responseVersion = "version"
}
func version() -> Int {
guard let versionStr = responseVersion else {
return 0
}
return Int(versionStr) ?? 0
}
}
@ -97,12 +109,32 @@ struct StateTerritoryStatistics: Codable {
let newCases: Int?
let recoveredCases: Int?
let deaths: Int?
let newLocallyAcquired: Int?
let locallyAcquired: Int?
let newOverseasAcquired: Int?
let overseasAcquired: Int?
let historicalCases: [HistoricalCase]?
enum CodingKeys: String, CodingKey {
case totalCases = "total_cases"
case activeCases = "active_cases"
case newCases = "new_cases"
case recoveredCases = "recovered_cases"
case newLocallyAcquired = "new_locally_acquired"
case locallyAcquired = "locally_acquired"
case newOverseasAcquired = "new_overseas_acquired"
case overseasAcquired = "overseas_acquired"
case historicalCases = "historical_cases"
case deaths
}
}
struct HistoricalCase: Codable {
let date: String
let newCases: Int
enum CodingKeys: String, CodingKey {
case date
case newCases = "new_cases"
}
}