Skip to content

Commit

Permalink
Smaller refactoring
Browse files Browse the repository at this point in the history
  • Loading branch information
fabriziodemaria committed Apr 11, 2024
1 parent a41f6f3 commit 94eb067
Show file tree
Hide file tree
Showing 22 changed files with 72 additions and 87 deletions.
6 changes: 2 additions & 4 deletions Sources/Common/Http/HttpClient.swift
Original file line number Diff line number Diff line change
Expand Up @@ -34,14 +34,12 @@ public enum HttpClientError: Error {
}

extension HTTPURLResponse {
public func mapStatusToError(error: HttpError?, flag: String = "unknown") -> Error {
public func mapStatusToError(error: HttpError?) -> Error {
let defaultError = ConfidenceError.internalError(
message: "General error: \(error?.message ?? "Unknown error")")

switch self.status {
case .notFound:
return ConfidenceError.badRequest(message: flag) // TODO
case .badRequest:
case .notFound, .badRequest:
return ConfidenceError.badRequest(message: error?.message ?? "")
default:
return defaultError
Expand Down
1 change: 0 additions & 1 deletion Sources/Common/Http/NetworkClient.swift
Original file line number Diff line number Diff line change
Expand Up @@ -130,7 +130,6 @@ extension NetworkClient {
let decoder = JSONDecoder()
decoder.dateDecodingStrategy = .iso8601
if response.response.status == .ok {
// TODO: Inspect and log errors
response.decodedData = try decoder.decode(T.self, from: responseData)
} else {
do {
Expand Down
11 changes: 11 additions & 0 deletions Sources/Common/Sdk.swift
Original file line number Diff line number Diff line change
@@ -0,0 +1,11 @@
import Foundation

public struct Sdk: Codable {
public init(id: String?, version: String?) {
self.id = id ?? "SDK_ID_SWIFT_PROVIDER"
self.version = version ?? "unknown"
}

var id: String
var version: String
}
7 changes: 5 additions & 2 deletions Sources/Confidence/Confidence.swift
Original file line number Diff line number Diff line change
Expand Up @@ -28,11 +28,13 @@ public class Confidence: ConfidenceEventSender {
self.parent = parent
}

// TODO: Implement actual event uploading to the backend
public func send(definition: String, payload: ConfidenceStruct) {
print("Sending: \"\(definition)\".\nMessage: \(payload)\nContext: \(context)")
Task {
try? await client.send(definition: definition, payload: payload)
// TODO: This will be called inside the EventSenderEngine once implemented
try? await client.upload(batch: [
ConfidenceClientEvent(definition: definition, payload: payload)
])
}
}

Expand Down Expand Up @@ -105,6 +107,7 @@ extension Confidence {
client: RemoteConfidenceClient(
options: ConfidenceClientOptions(
credentials: ConfidenceClientCredentials.clientSecret(secret: clientSecret),
timeout: timeout,
region: region),
metadata: ConfidenceMetadata(
name: "SDK_ID_SWIFT_CONFIDENCE",
Expand Down
7 changes: 6 additions & 1 deletion Sources/Confidence/ConfidenceClient/ConfidenceClient.swift
Original file line number Diff line number Diff line change
@@ -1,5 +1,10 @@
import Foundation

public protocol ConfidenceClient {
func send(definition: String, payload: ConfidenceStruct) async throws
func upload(batch: [ConfidenceClientEvent]) async throws
}

public struct ConfidenceClientEvent {
var definition: String
var payload: ConfidenceStruct
}
21 changes: 5 additions & 16 deletions Sources/Confidence/ConfidenceClient/RemoteConfidenceClient.swift
Original file line number Diff line number Diff line change
Expand Up @@ -26,16 +26,16 @@ public class RemoteConfidenceClient: ConfidenceClient {
self.metadata = metadata
}

public func send(definition: String, payload: ConfidenceStruct) async throws {
public func upload(batch: [ConfidenceClientEvent]) async throws {
let timeString = Date.backport.nowISOString
let request = PublishEventRequest(
events: [
events: batch.map { event in
Event(
eventDefinition: "eventDefinitions/\(definition)",
payload: payload,
eventDefinition: "eventDefinitions/\(event.definition)",
payload: event.payload,
eventTime: timeString
)
],
},
clientSecret: options.credentials.getSecret(),
sendTime: timeString,
sdk: Sdk(id: metadata.name, version: metadata.version)
Expand Down Expand Up @@ -99,14 +99,3 @@ struct EventError: Decodable {
case unknown
}
}


struct Sdk: Encodable {
init(id: String?, version: String?) {
self.id = id ?? "SDK_ID_SWIFT_PROVIDER"
self.version = version ?? "unknown"
}

var id: String
var version: String
}
6 changes: 3 additions & 3 deletions Sources/Confidence/ConfidenceMetadata.swift
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
import Foundation

public struct ConfidenceMetadata {
public var name: String? = "SDK_ID_SWIFT_PROVIDER"
public var version: String?
struct ConfidenceMetadata {
public var name: String
public var version: String
}
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
import Foundation
import Confidence
import Common
import Confidence
import OpenFeature
import os

Expand Down
2 changes: 1 addition & 1 deletion Sources/ConfidenceProvider/Cache/DefaultStorage.swift
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
import Foundation
import Confidence
import Common
import Confidence

public class DefaultStorage: Storage {
private let storageQueue = DispatchQueue(label: "com.confidence.storage")
Expand Down
Original file line number Diff line number Diff line change
@@ -1,8 +1,8 @@
import Foundation
import Combine
import Common
import Confidence
import OpenFeature
import Common
import os

public class InMemoryProviderCache: ProviderCache {
Expand Down
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
import Foundation
import Common
import Confidence
import OpenFeature
import Common

public class LocalStorageResolver: Resolver {
private var cache: ProviderCache
Expand Down
Original file line number Diff line number Diff line change
@@ -1,17 +1,16 @@
import Foundation
import Common
import Confidence
import OpenFeature
import Common

public class RemoteConfidenceClient: ConfidenceResolveClient {
public class RemoteConfidenceResolveClient: ConfidenceResolveClient {
private let targetingKey = "targeting_key"
private let flagApplier: FlagApplier
private var options: ConfidenceClientOptions
private let metadata: ConfidenceMetadata

private var httpClient: HttpClient
private var applyOnResolve: Bool
private var baseUrl: String

init(
options: ConfidenceClientOptions,
Expand All @@ -24,15 +23,9 @@ public class RemoteConfidenceClient: ConfidenceResolveClient {
self.flagApplier = flagApplier
self.applyOnResolve = applyOnResolve
self.metadata = metadata
switch options.region {
case .global:
self.baseUrl = "https://resolver.confidence.dev/v1/flags"
case .europe:
self.baseUrl = "https://resolver.eu.confidence.dev/v1/flags"
case .usa:
self.baseUrl = "https://resolver.us.confidence.dev/v1/flags"
}
self.httpClient = NetworkClient(session: session, baseUrl: baseUrl)
self.httpClient = NetworkClient(
session: session,
baseUrl: BaseUrlMapper.from(region: options.region))
}

// MARK: Resolver
Expand Down Expand Up @@ -172,16 +165,6 @@ struct ApplyFlagsRequest: Codable {
struct ApplyFlagsResponse: Codable {
}

struct Sdk: Codable {
init(id: String?, version: String?) {
self.id = id ?? "SDK_ID_SWIFT_PROVIDER"
self.version = version ?? "unknown"
}

var id: String
var version: String
}

private func displayName(resolvedFlag: ResolvedFlag) throws -> String {
let flagNameComponents = resolvedFlag.flag.components(separatedBy: "/")
if flagNameComponents.count <= 1 || flagNameComponents[0] != "flags" {
Expand Down
32 changes: 7 additions & 25 deletions Sources/ConfidenceProvider/ConfidenceFeatureProvider.swift
Original file line number Diff line number Diff line change
@@ -1,8 +1,8 @@
import Foundation
import Confidence
import OpenFeature
import Combine
import Common
import Confidence
import OpenFeature
import os

/// The implementation of the Confidence Feature Provider. This implementation allows to pre-cache evaluations.
Expand All @@ -28,7 +28,7 @@ public class ConfidenceFeatureProvider: FeatureProvider {
/// Should not be called externally, use `ConfidenceFeatureProvider.Builder`or init with `Confidence` instead.
init(
metadata: ProviderMetadata,
client: RemoteConfidenceClient,
client: RemoteConfidenceResolveClient,
cache: ProviderCache,
storage: Storage,
overrides: [String: LocalOverride] = [:],
Expand Down Expand Up @@ -58,21 +58,12 @@ public class ConfidenceFeatureProvider: FeatureProvider {
self.cache = InMemoryProviderCache.from(storage: DefaultStorage.resolverFlagsCache())
self.storage = DefaultStorage.resolverFlagsCache()
self.resolver = LocalStorageResolver(cache: cache)
let baseUrl: String
switch options.region {
case .global:
baseUrl = "https://resolver.confidence.dev/v1/flags"
case .europe:
baseUrl = "https://resolver.eu.confidence.dev/v1/flags"
case .usa:
baseUrl = "https://resolver.us.confidence.dev/v1/flags"
}
self.flagApplier = FlagApplierWithRetries(
httpClient: NetworkClient(baseUrl: baseUrl),
httpClient: NetworkClient(baseUrl: BaseUrlMapper.from(region: options.region)),
storage: DefaultStorage.applierFlagsCache(),
options: options,
metadata: metadata)
self.client = RemoteConfidenceClient(
self.client = RemoteConfidenceResolveClient(
options: options,
applyOnResolve: false,
flagApplier: flagApplier,
Expand Down Expand Up @@ -618,27 +609,18 @@ extension ConfidenceFeatureProvider {

/// Creates the `ConfidenceFeatureProvider` according to the settings specified in the builder.
public func build() -> ConfidenceFeatureProvider {
let baseUrl: String
switch options.region {
case .global:
baseUrl = "https://resolver.confidence.dev/v1/flags"
case .europe:
baseUrl = "https://resolver.eu.confidence.dev/v1/flags"
case .usa:
baseUrl = "https://resolver.us.confidence.dev/v1/flags"
}
let flagApplier =
flagApplier
?? FlagApplierWithRetries(
httpClient: NetworkClient(baseUrl: baseUrl),
httpClient: NetworkClient(baseUrl: BaseUrlMapper.from(region: options.region)),
storage: DefaultStorage.applierFlagsCache(),
options: options,
metadata: metadata
)

let cache = cache ?? InMemoryProviderCache.from(storage: storage)

let client = RemoteConfidenceClient(
let client = RemoteConfidenceResolveClient(
options: options,
session: self.session,
applyOnResolve: false,
Expand Down
15 changes: 15 additions & 0 deletions Sources/ConfidenceProvider/Utils/File.swift
Original file line number Diff line number Diff line change
@@ -0,0 +1,15 @@
import Foundation
import Confidence

public enum BaseUrlMapper {
static func from(region: ConfidenceRegion) -> String {
switch region {
case .global:
"https://resolver.confidence.dev/v1/flags"
case .europe:
"https://resolver.eu.confidence.dev/v1/flags"
case .usa:
"https://resolver.us.confidence.dev/v1/flags"
}
}
}
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
import Foundation
import Common
import Confidence
import OpenFeature
import Common

extension HTTPURLResponse {
func mapStatusToError(error: HttpError?, flag: String = "unknown") -> Error {
Expand Down
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
import Foundation
import Common
import Confidence
import OpenFeature
import Common

@testable import ConfidenceProvider

Expand Down
2 changes: 1 addition & 1 deletion Tests/ConfidenceProviderTests/Helpers/ClientMock.swift
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
import Foundation
import Confidence
import Common
import Confidence
import OpenFeature

@testable import ConfidenceProvider
Expand Down
2 changes: 1 addition & 1 deletion Tests/ConfidenceProviderTests/Helpers/HttpClientMock.swift
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
import Foundation
import Confidence
import Common
import Confidence
import XCTest

final class HttpClientMock: HttpClient {
Expand Down
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
import Foundation
import Confidence
import Common
import Confidence
import OpenFeature

@testable import ConfidenceProvider
Expand Down
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
import Foundation
import Common
import Confidence
import OpenFeature
import Common
import XCTest

@testable import ConfidenceProvider
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,7 @@ import XCTest

@testable import ConfidenceProvider

class RemoteConfidenceClientTest: XCTestCase {
class RemoteResolveConfidenceClientTest: XCTestCase {
var flags: [String: MockedConfidenceClientURLProtocol.TestFlag] = [:]
let resolvedFlag1 = MockedConfidenceClientURLProtocol.ResolvedTestFlag(
variant: "control", value: .structure(["size": .integer(3)]))
Expand All @@ -26,7 +26,7 @@ class RemoteConfidenceClientTest: XCTestCase {
let session = MockedConfidenceClientURLProtocol.mockedSession(flags: flags)
let flagApplier = FlagApplierMock()

let client = RemoteConfidenceClient(
let client = RemoteConfidenceResolveClient(
options: .init(credentials: .clientSecret(secret: "test")),
session: session,
applyOnResolve: true,
Expand Down
2 changes: 1 addition & 1 deletion Tests/ConfidenceTests/Helpers/ConfidenceClientMock.swift
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,7 @@ import Foundation
@testable import Confidence

class ConfidenceClientMock: ConfidenceClient {
func send(definition: String, payload: ConfidenceStruct) async throws {
func upload(batch: [ConfidenceClientEvent]) async throws {
// NO-OP
}
}

0 comments on commit 94eb067

Please sign in to comment.