Skip to content

Instantly share code, notes, and snippets.

@fakiho
Created February 27, 2021 22:28
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save fakiho/250e9057dc92c714826a36e6880575c0 to your computer and use it in GitHub Desktop.
Save fakiho/250e9057dc92c714826a36e6880575c0 to your computer and use it in GitHub Desktop.
//
// 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