Skip to content

Commit

Permalink
Simplify connector builder
Browse files Browse the repository at this point in the history
  • Loading branch information
andrii-vysotskyi-cko committed Oct 15, 2024
1 parent 0e26da6 commit bf65cfe
Show file tree
Hide file tree
Showing 2 changed files with 37 additions and 74 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -10,50 +10,31 @@ import Foundation
/// Builds http connector suitable for communications with ProcessOut API.
final class ProcessOutHttpConnectorBuilder {

/// Connector configuration provider.
var configuration: HttpConnectorConfiguration?

/// Retry strategy to use for failing requests.
var retryStrategy: RetryStrategy? = .exponential(maximumRetries: 3, interval: 0.1, rate: 3)

/// Logger.
var logger: POLogger?

/// Device metadata provider.
var deviceMetadataProvider: DeviceMetadataProvider?

/// Session configuration.
lazy var sessionConfiguration: URLSessionConfiguration = {
let configuration = URLSessionConfiguration.default
configuration.urlCache = nil
configuration.requestCachePolicy = .reloadIgnoringLocalCacheData
configuration.waitsForConnectivity = true
configuration.timeoutIntervalForRequest = Constants.requestTimeout
return configuration
}()

func build() -> HttpConnector {
guard let configuration, let logger, let deviceMetadataProvider else {
fatalError("Unable to create connector without required parameters set.")
}
func build(
configuration: HttpConnectorConfiguration,
deviceMetadataProvider: DeviceMetadataProvider,
logger: POLogger
) -> HttpConnector {
let requestMapper = DefaultHttpConnectorRequestMapper(
configuration: configuration,
encoder: encoder,
deviceMetadataProvider: deviceMetadataProvider,
logger: logger
)
var connector: HttpConnector = UrlSessionHttpConnector(
sessionConfiguration: sessionConfiguration,
requestMapper: requestMapper,
decoder: decoder,
let connector = HttpConnectorErrorDecorator(
connector: HttpConnectorRetryDecorator(
connector: UrlSessionHttpConnector(
sessionConfiguration: sessionConfiguration,
requestMapper: requestMapper,
decoder: decoder,
logger: logger
),
retryStrategy: .exponential(maximumRetries: 3, interval: 0.1, rate: 3)
),
failureMapper: DefaultHttpConnectorFailureMapper(logger: logger),
logger: logger
)
if let retryStrategy {
connector = HttpConnectorRetryDecorator(connector: connector, retryStrategy: retryStrategy)
}
return HttpConnectorErrorDecorator(
connector: connector, failureMapper: DefaultHttpConnectorFailureMapper(logger: logger), logger: logger
)
return connector
}

// MARK: - Private Nested Types
Expand All @@ -64,53 +45,34 @@ final class ProcessOutHttpConnectorBuilder {

// MARK: - Private Properties

private lazy var dateFormatter: DateFormatter = {
private var sessionConfiguration: URLSessionConfiguration {
let configuration = URLSessionConfiguration.default
configuration.urlCache = nil
configuration.requestCachePolicy = .reloadIgnoringLocalCacheData
configuration.waitsForConnectivity = true
configuration.timeoutIntervalForRequest = Constants.requestTimeout
return configuration
}

private var dateFormatter: DateFormatter {
let dateFormatter = DateFormatter()
dateFormatter.locale = Locale(identifier: "en_US_POSIX")
dateFormatter.dateFormat = "yyyy-MM-dd'T'HH:mm:ss.SSS'Z'"
dateFormatter.timeZone = TimeZone(secondsFromGMT: 0)
return dateFormatter
}()
}

private lazy var decoder: JSONDecoder = {
private var decoder: JSONDecoder {
let decoder = JSONDecoder()
decoder.keyDecodingStrategy = .convertFromSnakeCase
decoder.dateDecodingStrategy = .formatted(dateFormatter)
return decoder
}()
}

private lazy var encoder: JSONEncoder = {
private var encoder: JSONEncoder {
let encoder = JSONEncoder()
encoder.keyEncodingStrategy = .convertToSnakeCase
encoder.dateEncodingStrategy = .formatted(dateFormatter)
return encoder
}()
}

extension ProcessOutHttpConnectorBuilder {

func with(configuration: HttpConnectorConfiguration) -> Self {
self.configuration = configuration
return self
}

func with(sessionConfiguration: URLSessionConfiguration) -> Self {
self.sessionConfiguration = sessionConfiguration
return self
}

func with(retryStrategy: RetryStrategy?) -> Self {
self.retryStrategy = retryStrategy
return self
}

func with(deviceMetadataProvider: DeviceMetadataProvider) -> Self {
self.deviceMetadataProvider = deviceMetadataProvider
return self
}

func with(logger: POLogger) -> Self {
self.logger = logger
return self
}
}
11 changes: 6 additions & 5 deletions Sources/ProcessOut/Sources/Api/ProcessOut.swift
Original file line number Diff line number Diff line change
Expand Up @@ -242,11 +242,12 @@ public final class ProcessOut: @unchecked Sendable {
deviceMetadataProvider: DeviceMetadataProvider,
logger: POLogger
) -> HttpConnector {
let connector = ProcessOutHttpConnectorBuilder()
.with(configuration: connectorConfiguration(with: configuration))
.with(logger: logger)
.with(deviceMetadataProvider: deviceMetadataProvider)
.build()
let connectorConfiguration = Self.connectorConfiguration(with: configuration)
let connector = ProcessOutHttpConnectorBuilder().build(
configuration: connectorConfiguration,
deviceMetadataProvider: deviceMetadataProvider,
logger: logger
)
return connector
}

Expand Down

0 comments on commit bf65cfe

Please sign in to comment.