Created
February 27, 2021 22:28
-
-
Save fakiho/250e9057dc92c714826a36e6880575c0 to your computer and use it in GitHub Desktop.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
// | |
// DefaultVPNRepository.swift | |
// Secure VPN | |
// | |
// Created by Ali Fakih on 5/20/20. | |
// Copyright © 2020 beApp. All rights reserved. | |
// | |
import Foundation | |
import AFNetworks | |
import Firebase | |
import FirebaseFirestore | |
final class DefaultVPNRepository { | |
private(set) var vpnManager: VPNRepository! | |
private let dataTransferService: DataTransferService | |
init(vpnManager: VPNRepository, dataTransfer: DataTransferService) { | |
self.vpnManager = vpnManager | |
self.dataTransferService = dataTransfer | |
} | |
} | |
extension DefaultVPNRepository: DVPNRepository { | |
func connect(configuration: VPNAccount) { | |
vpnManager.saveAndConnect(configuration) | |
} | |
func getStatus(completion: @escaping (NetworkVPNStatus) -> ()) { | |
switch vpnManager.status { | |
case .invalid: | |
completion(NetworkVPNStatus.invalid) | |
case .disconnected: | |
completion(NetworkVPNStatus.disconnected) | |
case .connecting: | |
completion(NetworkVPNStatus.connecting) | |
case .connected: | |
completion(NetworkVPNStatus.connected) | |
case .reasserting: | |
completion(NetworkVPNStatus.reasserting) | |
case .disconnecting: | |
completion(NetworkVPNStatus.disconnecting) | |
@unknown default: | |
break | |
} | |
} | |
func disconnect() { | |
vpnManager.disconnect() | |
} | |
func loadVPNConfig(completion: @escaping () -> Void) { | |
self.vpnManager.loadPreferences(completion: completion) | |
} | |
func getServers(completion: @escaping (Result<[Server], Error>) -> Void) -> Cancellable? { | |
#if WEBAPI | |
return getFromWeb(completion: completion) | |
#else | |
return getListFromFB(completion: completion) | |
#endif | |
} | |
private func getFromWeb(completion: @escaping (Result<[Server], Error>) -> Void) -> Cancellable? { | |
let endpoint = APIEndpoints.getServers() | |
let networkTask = dataTransferService.request(with: endpoint) { response in | |
switch response { | |
case .success(let servers): | |
completion(.success(servers)) | |
break | |
case .failure(let error): | |
print(endpoint.path) | |
let url = "\(endpoint.path)" | |
guard let data = try? Data(contentsOf: URL(string: url)!) else { completion(.failure(error)); return } | |
let decoder = JSONDecoder() | |
guard let servers = try? decoder.decode([Server].self, from: data) else { completion(.failure(error)); return} | |
completion(.success(servers)) | |
break | |
} | |
} | |
return RepositoryTask(networkTask: networkTask, operation: nil) | |
} | |
private func getListFromFB(completion: @escaping (Result<[Server], Error>) -> Void) -> Cancellable? { | |
let operation = OperationQueue() | |
operation.addOperation { | |
// let ref = Database.database().reference() | |
let db = Firestore.firestore() | |
let decoder = JSONDecoder() | |
var servers: [Server] = [] | |
db.collection("iOS").getDocuments { (querySnapshot, error) in | |
if let err = error { | |
print("Error getting documents: \(err)") | |
} else { | |
for document in querySnapshot!.documents { | |
print("\(document.documentID) => \(document.data())") | |
guard let data = try? JSONSerialization.data(withJSONObject: document.data(), options: .prettyPrinted) else { return } | |
guard let server = try? decoder.decode(Server.self, from: data) else { return } | |
servers.append(server) | |
} | |
print(servers) | |
completion(.success(servers)) | |
} | |
} | |
} | |
return RepositoryTask(networkTask: nil, operation: operation) | |
} | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment