-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathGraphQLAPIAdapter.swift
More file actions
146 lines (134 loc) · 5.5 KB
/
GraphQLAPIAdapter.swift
File metadata and controls
146 lines (134 loc) · 5.5 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
import Apollo
import ApolloAPI
import Foundation
public protocol GraphQLAPIAdapterProtocol: AnyObject {
/// Fetches a query from the server
/// Apollo cache is ignored.
///
/// - Parameters:
/// - query: The query to fetch.
/// - queue: A dispatch queue on which the result handler will be called. Should default to the main queue.
/// - context: [optional] A context that is being passed through the request chain. Should default to `nil`.
/// - resultHandler: A closure that is called when query results are available or when an error occurs.
/// - Returns: An object that can be used to cancel an in progress fetch.
func fetch<Query: GraphQLQuery>(
query: Query,
context: RequestHeaders?,
queue: DispatchQueue,
resultHandler: @escaping (Result<Query.Data, GraphQLAPIAdapterError>) -> Void
) -> Cancellable
/// Performs a mutation by sending it to the server.
///
/// - Parameters:
/// - mutation: The mutation to perform.
/// - context: [optional] A context that is being passed through the request chain. Should default to `nil`.
/// - queue: A dispatch queue on which the result handler will be called. Should default to the main queue.
/// - resultHandler: An optional closure that is called when mutation results are available or when an error occurs.
/// - Returns: An object that can be used to cancel an in progress mutation.
func perform<Mutation: GraphQLMutation>(
mutation: Mutation,
context: RequestHeaders?,
queue: DispatchQueue,
resultHandler: @escaping (Result<Mutation.Data, GraphQLAPIAdapterError>) -> Void
) -> Cancellable
}
public final class GraphQLAPIAdapter: GraphQLAPIAdapterProtocol {
private let apollo: ApolloClientProtocol
// swiftlint:disable function_default_parameter_at_end
public init<each Observer: GraphQLNetworkObserver>(
url: URL,
urlSessionConfiguration: URLSessionConfiguration = .default,
defaultHeaders: [String: String] = [:],
networkObservers: repeat each Observer
) {
// swiftlint:enable function_default_parameter_at_end
var observers: [any GraphQLNetworkObserver] = []
repeat observers.append(each networkObservers)
let provider = NetworkInterceptorProvider(
client: URLSessionClient(sessionConfiguration: urlSessionConfiguration),
defaultHeaders: defaultHeaders,
networkObservers: observers
)
let networkTransport = RequestChainNetworkTransport(
interceptorProvider: provider,
endpointURL: url
)
self.apollo = ApolloClient(
networkTransport: networkTransport,
store: ApolloStore()
)
}
public init(
url: URL,
urlSessionConfiguration: URLSessionConfiguration = .default,
defaultHeaders: [String: String] = [:],
networkObservers: [any GraphQLNetworkObserver] = []
) {
let provider = NetworkInterceptorProvider(
client: URLSessionClient(sessionConfiguration: urlSessionConfiguration),
defaultHeaders: defaultHeaders,
networkObservers: networkObservers
)
let networkTransport = RequestChainNetworkTransport(
interceptorProvider: provider,
endpointURL: url
)
self.apollo = ApolloClient(
networkTransport: networkTransport,
store: ApolloStore()
)
}
public func fetch<Query>(
query: Query,
context: RequestHeaders?,
queue: DispatchQueue,
resultHandler: @escaping (Result<Query.Data, GraphQLAPIAdapterError>) -> Void
) -> Cancellable where Query: GraphQLQuery {
apollo.fetch(
query: query,
cachePolicy: .fetchIgnoringCacheCompletely,
contextIdentifier: nil,
context: context,
queue: queue
) { result in
switch result {
case .success(let result):
if let errors = result.errors {
resultHandler(.failure(GraphQLAPIAdapterError(error: ApolloError(errors: errors))))
} else if let data = result.data {
resultHandler(.success(data))
} else {
assertionFailure("Did not receive no data nor errors")
}
case .failure(let error):
resultHandler(.failure(GraphQLAPIAdapterError(error: error)))
}
}
}
public func perform<Mutation>(
mutation: Mutation,
context: RequestHeaders?,
queue: DispatchQueue,
resultHandler: @escaping (Result<Mutation.Data, GraphQLAPIAdapterError>) -> Void
) -> Cancellable where Mutation: GraphQLMutation {
apollo.perform(
mutation: mutation,
publishResultToStore: false,
context: context,
queue: queue
) { result in
switch result {
case .success(let result):
if let errors = result.errors {
resultHandler(.failure(GraphQLAPIAdapterError(error: ApolloError(errors: errors))))
} else if let data = result.data {
resultHandler(.success(data))
} else {
assertionFailure("Did not receive no data nor errors")
}
case .failure(let error):
resultHandler(.failure(GraphQLAPIAdapterError(error: error)))
}
}
}
}