// // P2PLists.swift // Wallet // // Created by Saveliy Stavitsky on 10/7/21. // Copyright © 2021 AM. All rights reserved. // import RealmSwift class P2PCountry: Object, Decodable { @Persisted(primaryKey: true) var id: Int @Persisted(indexed: true) var name: String // @Persisted(originProperty: "country") var cities: LinkingObjects // @Persisted(originProperty: "country") var banks: LinkingObjects enum CodingKeys: String, CodingKey { case id case name } } class P2PCity: Object, Decodable { @Persisted(primaryKey: true) var id: Int @Persisted(indexed: true) var name: String @Persisted var country: P2PCountry? } class P2PBank: Object, Decodable { @Persisted(primaryKey: true) var id: Int @Persisted(indexed: true) var name: String @Persisted var country: P2PCountry? } enum P2PCurrencyType: String, PersistableEnum, Codable { case fiat = "FIAT" case crypto = "CRYPTO" case emoney = "EMONEY" } class P2PCurrency: Object, Decodable { @Persisted(primaryKey: true) var id: Int @Persisted(indexed: true) var name: String @Persisted var precision: Int @Persisted var descriptn: String? @Persisted(indexed: true) var type: P2PCurrencyType @Persisted var blockchains: List enum CodingKeys: String, CodingKey { case id case name case precision case descriptn = "description" case type case blockchains } override required init() { } required init(from decoder: Decoder) throws { super.init() let values = try decoder.container(keyedBy: CodingKeys.self) id = try values.decode(Int.self, forKey: .id) name = try values.decode(String.self, forKey: .name) precision = try values.decode(Int.self, forKey: .precision) descriptn = try? values.decode(String.self, forKey: .descriptn) type = try values.decode(P2PCurrencyType.self, forKey: .type) blockchains = List() blockchains.append(objectsIn: (try? values.decode([P2PBlockchain].self, forKey: .blockchains)) ?? []) } } class P2PBlockchain: Object, Decodable { @Persisted(primaryKey: true) var id: Int @Persisted(indexed: true) var name: String @Persisted var descriptn: String? @Persisted(originProperty: "blockchains") var currencies: LinkingObjects enum CodingKeys: String, CodingKey { case id case name case descriptn = "description" } } class P2PPaymentSystem: Object, Decodable { @Persisted(primaryKey: true) var id: Int @Persisted(indexed: true) var name: String @Persisted var currencies: List } struct P2PListsGraphQLRequest: Encodable { struct ResponseData: Decodable { let lastUpdate: LastUpdateResponse let countries: CountriesResponse? let cities: CitiesResponse? let banks: BanksResponse? let blockchains: BlockchainsResponse? let paymentSystems: PaymentSystemsResponse? let currencies: CurrenciesResponse? } struct LastUpdateResponse: Decodable { let lastUpdate: String } struct CountriesResponse: Decodable { let countries: [P2PCountry] } struct BanksResponse: Decodable { let banks: [P2PBank] } struct CitiesResponse: Decodable { let cities: [P2PCity] } struct BlockchainsResponse: Decodable { let blockchains: [P2PBlockchain] } struct PaymentSystemsResponse: Decodable { let paymentSystems: [P2PPaymentSystem] } struct CurrenciesResponse: Decodable { let currencies: [P2PCurrency] } struct Variables: Encodable { let lang: String } let variables: Variables let operationName = "p2pLists" static let queryShort: String = #""" query p2pLists { lastUpdate { lastUpdate errors } } """# static let queryFull = #""" query p2pLists( $lang: Lang ) { lastUpdate { lastUpdate errors } countries( lang: $lang ) { countries { id name } errors } cities( lang: $lang ) { cities{ id name country { id name } } errors } banks( lang: $lang ) { banks { id name country { id name } } errors } paymentSystems( lang: $lang ) { paymentSystems{ id name currencies { id name precision description type } } errors } currencies( lang: $lang ) { currencies { id name precision description type blockchains { id name description } } } } """# var query: String }