Files
raspberry/iOS/Wallet/Sources/Network/Service/NetowrkServiceGraphQL.swift
2022-05-27 20:21:01 +03:00

80 lines
2.9 KiB
Swift

import Foundation
import Apollo
extension Result {
var value: Success? { do { return try get() } catch { return nil } }
var error: Failure? { do { _ = try get();return nil } catch { return error as? Failure } }
}
extension Network.Service {
class GraphQL: Common.Service.Provider {
#warning("shared should be removed or init make private")
static let shared = GraphQL()
private var _client: ApolloClient!
private var _paycashClient: ApolloClient!
init() { }
}
}
extension Network.Service.GraphQL {
@discardableResult
func fetch<Query:GraphQLQuery>(query: Query, completion: @escaping (Result<Query.Data, Error>) -> Void ) -> Cancellable {
client.fetch(query: query, cachePolicy: .fetchIgnoringCacheCompletely) {
if let data = $0.value?.data {
completion(.success(data))
} else if let error = $0.error {
completion(.failure(error))
} else {
completion(.failure(NSError.error(L10n.Common.Alert.error)))
}
}
}
@discardableResult
func fetchV2<Query:GraphQLQuery>(query: Query, completion: @escaping (Result<Query.Data, Error>) -> Void ) -> Cancellable {
paycashClient.fetch(query: query, cachePolicy: .fetchIgnoringCacheCompletely) {
if let data = $0.value?.data {
completion(.success(data))
} else if let error = $0.error {
completion(.failure(error))
} else {
completion(.failure(NSError.error(L10n.Common.Alert.error)))
}
}
}
@discardableResult
func perform<Mutation:GraphQLMutation>(mutation: Mutation, completion: ((Result<Mutation.Data, Error>) -> Void)? = nil) -> Cancellable {
client.perform(mutation: mutation) {
guard let completion = completion else { return }
if let data = $0.value?.data {
completion(.success(data))
} else if let error = $0.error {
completion(.failure(error))
} else {
completion(.failure(NSError.error(L10n.Common.Alert.error)))
}
}
}
}
extension Network.Service.GraphQL {
fileprivate var client: ApolloClient {
if _client == nil {
_client = ApolloClient(url: URL(string: Network.servers.current.graphql)!)
}
return _client
}
fileprivate var paycashClient: ApolloClient {
if _paycashClient == nil {
_paycashClient = ApolloClient(url: URL(string: Network.servers.current.paycashQraphql)!)
}
return _paycashClient
}
}
//extension Network.Service.GraphQL: HTTPNetworkTransportPreflightDelegate {
// func networkTransport(_ networkTransport: HTTPNetworkTransport, shouldSend request: URLRequest) -> Bool { true }
// func networkTransport(_ networkTransport: HTTPNetworkTransport, willSend request: inout URLRequest) {}
//}
//