Skip to content

Commit

Permalink
MOB-920 Adding DeviceId Header To Requests (#109)
Browse files Browse the repository at this point in the history
* MOB-920 Adding DeviceId Header To Requests

	- Created deviceId header that consists of prefix and vendor identifier
	-  Added it to the network request
  • Loading branch information
Peter-John-paystack authored Mar 5, 2024
1 parent 5b6ee3d commit fd0ada2
Show file tree
Hide file tree
Showing 23 changed files with 151 additions and 137 deletions.
4 changes: 2 additions & 2 deletions Sources/PaystackSDK/Core/Models/CardType.swift
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,7 @@ public enum CardType: String, Decodable {
case visa
case visaDebit = "visa DEBIT"
case mastercardDebit = "mastercard DEBIT"

public init(from decoder: Decoder) throws {
let container = try decoder.singleValueContainer()
let string = try container.decode(String.self)
Expand All @@ -15,7 +15,7 @@ public enum CardType: String, Decodable {
debugDescription: "Could not find value for \(trimmedString) in CardType",
underlyingError: nil))
}

self = value
}
}
2 changes: 1 addition & 1 deletion Sources/PaystackSDK/Core/Models/Custom/IntegerObject.swift
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,7 @@ import Foundation
/// Service sometimes returns a string for an integer field
public struct IntegerObject: Decodable {
public var value: Int

public init(from decoder: Decoder) throws {
let container = try decoder.singleValueContainer()
do {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -6,9 +6,9 @@ public struct OptionalStringObject: Decodable {
enum CodingKeys: String, CodingKey {
case value
}

public var value: String?

public init(from decoder: Decoder) throws {
let container = try decoder.singleValueContainer()
self.value = try? container.decode(String.self)
Expand Down
2 changes: 1 addition & 1 deletion Sources/PaystackSDK/Core/Models/CustomField.swift
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,7 @@ public struct CustomField: Codable {
public var displayName: String
public var variableName: String
public var value: String

public init(displayName: String,
variableName: String,
value: String) {
Expand Down
8 changes: 4 additions & 4 deletions Sources/PaystackSDK/Core/Models/Metadata.swift
Original file line number Diff line number Diff line change
Expand Up @@ -2,22 +2,22 @@ import Foundation

public struct Metadata: Codable {
public var customFields: [CustomField]?

public init(customFields: [CustomField]?) {
self.customFields = customFields
}

public init(from decoder: Decoder) throws {
let container = try decoder.singleValueContainer()
let string = try? container.decode(String.self)
guard let data = string?.data(using: .utf8), data.count > 0 else {
return
}

let metadata = try JSONDecoder.decoder.decode(InnerMetadata.self, from: data)
self.customFields = metadata.customFields
}

public func encode(to encoder: Encoder) throws {
var container = encoder.singleValueContainer()
let data = try JSONEncoder.encoder.encode(InnerMetadata(customFields: customFields))
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -7,8 +7,6 @@

import Foundation



public struct ModelErrorResponse: Codable {

public var status: Bool
Expand All @@ -19,5 +17,4 @@ public struct ModelErrorResponse: Codable {
self.message = message
}


}
6 changes: 3 additions & 3 deletions Sources/PaystackSDK/Core/Paystack.swift
Original file line number Diff line number Diff line change
@@ -1,11 +1,11 @@
import Foundation

public class Paystack {

public let config: PaystackConfig

init(config: PaystackConfig) {
self.config = config
}

}
6 changes: 3 additions & 3 deletions Sources/PaystackSDK/Core/Service/Extensions/Publisher.swift
Original file line number Diff line number Diff line change
Expand Up @@ -3,18 +3,18 @@ import Combine

@available(iOS 13.0, *)
public extension Service {

func publisher() -> AnyPublisher<T, Error> {
return Future { promise in
async {
if let result = $0 {
promise(.success(result))
}

promise(.failure($1 ?? PaystackError.technical))
}
}
.eraseToAnyPublisher()
}

}
8 changes: 4 additions & 4 deletions Sources/PaystackSDK/Core/Service/Extensions/Sync.swift
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
import Foundation

public extension Service {

func sync() throws -> T {
let semaphore = DispatchSemaphore(value: 0)
var result: T?
Expand All @@ -11,13 +11,13 @@ public extension Service {
error = $1
semaphore.signal()
}

semaphore.wait()
if let result = result {
return result
}

throw error ?? PaystackError.technical
}

}
8 changes: 4 additions & 4 deletions Sources/PaystackSDK/Core/Service/PaystackService.swift
Original file line number Diff line number Diff line change
Expand Up @@ -6,17 +6,17 @@ public protocol PaystackService: URLRequestBuilderHelper {
}

public extension PaystackService {

var endpoint: String {
return "https://api.paystack.co/\(parentPath)"
}

var bearerToken: String {
return config.apiKey
}

var paystackUserAgentVersion: String {
return config.version
}

}
4 changes: 2 additions & 2 deletions Sources/PaystackSDK/Core/Service/ServiceExecutor.swift
Original file line number Diff line number Diff line change
Expand Up @@ -5,9 +5,9 @@ protocol ServiceExecutor {
}

extension URLSession: ServiceExecutor {

func execute(request: URLRequest, completion: @escaping (Data?, URLResponse?, Error?) -> Void) {
dataTask(with: request, completionHandler: completion).resume()
}

}
10 changes: 5 additions & 5 deletions Sources/PaystackSDK/Core/Service/ServiceExecutorProvider.swift
Original file line number Diff line number Diff line change
@@ -1,19 +1,19 @@
import Foundation

class ServiceExecutorProvider {

static var executor: ServiceExecutor = URLSession.shared

static func execute(request: URLRequest, completion: @escaping (Data?, URLResponse?, Error?) -> Void) {
self.executor.execute(request: request, completion: completion)
}

static func set(executor: ServiceExecutor) {
self.executor = executor
}

static func reset() {
self.executor = URLSession.shared
}

}
Original file line number Diff line number Diff line change
Expand Up @@ -11,21 +11,22 @@ import IOKit
// MARK: - Logging
extension URLRequestBuilder {
private static let operatingSystem: String = {
#if os(iOS)
#if targetEnvironment(macCatalyst)
return "macOS - Catalyst"
#else
return "iOS"
#endif
#else
#if os(iOS)
#if targetEnvironment(macCatalyst)
return "macOS - Catalyst"
#else
return "iOS"
#endif
#else
return "macOS"
#endif
#endif
}()

func addLoggingHeaders() -> Self {
return addPlatformHeader()
.addSDKVersionHeader()
.addPlatformVersionHeader()
.addDeviceIdentifier()
.addDeviceModelHeader()
}

Expand All @@ -40,7 +41,7 @@ extension URLRequestBuilder {
let data = try? Data(contentsOf: versionUrl),
let plist = try? PropertyListSerialization.propertyList(
from: data, format: nil) as? [String: String],
let versionNumber = plist["Version"] else {
let versionNumber = plist["Version"] else {
return self
}

Expand All @@ -53,6 +54,10 @@ extension URLRequestBuilder {
return addHeader("x-platform-version", "\(Self.operatingSystem) \(osVersionString)")
}

func addDeviceIdentifier() -> Self {
addHeader("x-device-identifier", "sdk_ios_" + getDeviceID())
}

private func addDeviceModelHeader() -> Self {
guard let modelName = getDeviceModel() else {
return self
Expand All @@ -61,14 +66,22 @@ extension URLRequestBuilder {
}

private func getDeviceModel() -> String? {
#if canImport(UIKit)
#if canImport(UIKit)
return UIDevice.modelName
#elseif canImport(IOKit)
#elseif canImport(IOKit)
return getModelIdentifier()
#endif
#endif
}

private func getDeviceID() -> String {
#if canImport(UIKit)
return UIDevice.deviceID
#elseif canImport(IOKit)
return getModelIdentifier() ?? ""
#endif
}

#if canImport(IOKit)
#if canImport(IOKit)
func getModelIdentifier() -> String? {
let service = IOServiceGetMatchingService(kIOMasterPortDefault,
IOServiceMatching("IOPlatformExpertDevice"))
Expand All @@ -81,7 +94,7 @@ extension URLRequestBuilder {
IOObjectRelease(service)
return modelIdentifier
}
#endif
#endif
}

#if canImport(UIKit)
Expand All @@ -96,5 +109,9 @@ private extension UIDevice {
}
return identifier
}()

static let deviceID: String = {
UIDevice.current.identifierForVendor?.uuidString ?? ""
}()
}
#endif
Original file line number Diff line number Diff line change
Expand Up @@ -6,15 +6,14 @@ struct PaystackUserAgent: Encodable {
}

extension URLRequestBuilder {

func addPaystackUserAgent(_ version: String) -> Self {
let agent = PaystackUserAgent(bindingsVersion: version)
guard let data = try? JSONEncoder.encoder.encode(agent),
let agentString = String(data: data, encoding: .utf8) else {
return self
}

return addHeader("X-Paystack-User-Agent", agentString)
}

}
Loading

0 comments on commit fd0ada2

Please sign in to comment.