Files

97 lines
4.3 KiB
Swift

//
// P2PListsService.swift
// Wallet
//
// Created by Saveliy Stavitsky on 10/7/21.
// Copyright © 2021 AM. All rights reserved.
//
import Foundation
import Alamofire
import RealmSwift
import struct Resolver.Injected
class P2PListsService {
@Injected(name: .realmP2PLists) private var realm: Realm
@Injected var countries: Results<P2PCountry>
@Injected var cities: Results<P2PCity>
@Injected var banks: Results<P2PBank>
@Injected var blockchains: Results<P2PBlockchain>
@Injected var paymentSystems: Results<P2PPaymentSystem>
@Injected var currencies: Results<P2PCurrency>
func fetch(reload: Bool = false, completion: @escaping (String?) -> Void) {
let lang = Locale.preferredLanguages[0].lowercased().starts(with: "en") ? "EN" : "RU"
let lastUpdateSaved = Date(timeIntervalSince1970: UserDefaults.standard.double(forKey: "lastUpdate"))
let lastLang = UserDefaults.standard.string(forKey: "lastLang") ?? ""
if !reload && (lastLang != lang || countries.isEmpty
|| blockchains.isEmpty || cities.isEmpty
|| paymentSystems.isEmpty || banks.isEmpty || currencies.isEmpty) {
fetch(reload: true, completion: completion)
return
}
let variables = P2PListsGraphQLRequest.Variables(
lang: lang
)
let environment = ApplicationEnvironment.shared().current
AF.request(
environment.backend.urlPath,
method: .post,
parameters: P2PListsGraphQLRequest(variables: variables,
query: reload
? P2PListsGraphQLRequest.queryFull
: P2PListsGraphQLRequest.queryShort),
encoder: JSONParameterEncoder.default,
headers: HTTPHeaders(environment.headers)
)
// .responseString(completionHandler: {
// print($0)
// print($0)
// })
.responseDecodable(of: GraphQLResponse<P2PListsGraphQLRequest.ResponseData>.self) { [weak self] response in
switch response.result {
case let .success(value):
// if let error = value.data?.p2pAllNotUserOrders?.errors ?? value.errorsDescription {
if let error = value.errorsDescription {
completion(error)
} else {
let lastUpdate = value.data?.lastUpdate.lastUpdate.asISODate() ?? Date()
if reload {
let countries = value.data?.countries?.countries ?? []
let cities = value.data?.cities?.cities ?? []
let banks = value.data?.banks?.banks ?? []
// let blockchains = value.data?.blockchains?.blockchains ?? []
let paymentSystems = value.data?.paymentSystems?.paymentSystems ?? []
let currencies = value.data?.currencies?.currencies ?? []
try? self?.realm.write {
self?.realm.deleteAll()
self?.realm.add(countries, update: .modified)
self?.realm.add(cities, update: .modified)
self?.realm.add(banks, update: .modified)
// self?.realm.add(blockchains, update: .modified)
self?.realm.add(paymentSystems, update: .modified)
self?.realm.add(currencies, update: .modified)
}
UserDefaults.standard.setValue(lastUpdate.timeIntervalSince1970, forKey: "lastUpdate")
UserDefaults.standard.setValue(lang, forKey: "lastLang")
completion(nil)
} else {
if lastUpdateSaved.timeIntervalSince1970 != lastUpdate.timeIntervalSince1970 {
self?.fetch(reload: true, completion: completion)
}
}
}
case let .failure(error):
completion(error.localizedDescription)
}
}
}
}