-
-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathgoff_api.swift
65 lines (56 loc) · 2.4 KB
/
goff_api.swift
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
import Foundation
import OpenFeature
import OFREP
class GoFeatureFlagAPI {
private let networkingService: NetworkingService
private let options: GoFeatureFlagProviderOptions
private let metadata: [String:String] = ["provider": "openfeature-swift"]
init(networkingService: NetworkingService, options: GoFeatureFlagProviderOptions) {
self.networkingService = networkingService
self.options = options
}
func postDataCollector(events: [FeatureEvent]?) async throws -> (DataCollectorResponse, HTTPURLResponse) {
guard let events = events else {
throw GoFeatureFlagError.noEventToSend
}
if events.isEmpty {
throw GoFeatureFlagError.noEventToSend
}
guard let url = URL(string: options.endpoint) else {
throw InvalidOptions.invalidEndpoint(message: "endpoint [" + options.endpoint + "] is not valid")
}
let dataCollectorURL = url.appendingPathComponent("v1/data/collector")
var request = URLRequest(url: dataCollectorURL)
request.httpMethod = "POST"
let requestBody = DataCollectorRequest(meta: metadata, events: events)
let encoder = JSONEncoder()
encoder.outputFormatting = .prettyPrinted
request.httpBody = try encoder.encode(requestBody)
request.setValue(
"application/json",
forHTTPHeaderField: "Content-Type"
)
if let apiKey = self.options.apiKey {
request.setValue("Bearer \(apiKey)", forHTTPHeaderField:"Authorization")
}
let (data, response) = try await networkingService.doRequest(for: request)
guard let httpResponse = response as? HTTPURLResponse else {
throw GoFeatureFlagError.httpResponseCastError
}
if httpResponse.statusCode == 401 {
throw GoFeatureFlagError.apiUnauthorizedError(response: httpResponse)
}
if httpResponse.statusCode == 403 {
throw GoFeatureFlagError.forbiddenError(response: httpResponse)
}
if httpResponse.statusCode >= 400 {
throw GoFeatureFlagError.unexpectedResponseError(response: httpResponse)
}
do {
let response = try JSONDecoder().decode(DataCollectorResponse.self, from: data)
return (response, httpResponse)
} catch {
throw GoFeatureFlagError.unmarshallError(error: error)
}
}
}