@@ -25,50 +25,65 @@ internal final class UID2Client {
25
25
26
26
func refreshIdentity( refreshToken: String , refreshResponseKey: String ) async throws -> RefreshAPIPackage {
27
27
28
- var components = URLComponents ( string: uid2APIURL)
29
- components? . path = " /v2/token/refresh "
30
-
31
- guard let urlPath = components? . url? . absoluteString,
32
- let url = URL ( string: urlPath) else {
33
- throw UID2Error . urlGeneration
34
- }
35
-
36
- var request = URLRequest ( url: url)
37
- request. httpMethod = " POST "
38
- request. addValue ( clientVersion, forHTTPHeaderField: " X-UID2-Client-Version " )
39
- request. addValue ( " application/x-www-form-urlencoded " , forHTTPHeaderField: " Content-Type " )
40
- request. httpBody = refreshToken. data ( using: . utf8)
41
-
42
- let dataResponse = try await session. loadData ( for: request)
43
- let data = dataResponse. 0
44
- let statusCode = dataResponse. 1
45
-
46
- let decoder = JSONDecoder ( )
47
- decoder. keyDecodingStrategy = . convertFromSnakeCase
48
-
49
- // Only Decrypt If HTTP Status is 200 (Success or Opt Out)
50
- if statusCode != 200 {
51
- do {
52
- let tokenResponse = try decoder. decode ( RefreshTokenResponse . self, from: data)
53
- throw UID2Error . refreshTokenServer ( status: tokenResponse. status, message: tokenResponse. message)
54
- } catch {
55
- throw UID2Error . refreshTokenServerDecoding ( httpStatus: statusCode, message: error. localizedDescription)
56
- }
57
- }
58
-
59
- // Decrypt Data Envelop
60
- // https://github.com/UnifiedID2/uid2docs/blob/main/api/v2/encryption-decryption.md
61
- guard let payloadData = DataEnvelope . decrypt ( refreshResponseKey, data, true ) else {
62
- throw UID2Error . decryptPayloadData
63
- }
64
-
65
- let tokenResponse = try decoder. decode ( RefreshTokenResponse . self, from: payloadData)
66
-
67
- guard let refreshAPIPackage = tokenResponse. toRefreshAPIPackage ( ) else {
68
- throw UID2Error . refreshResponseToRefreshAPIPackage
28
+ let request = Request . refresh ( token: refreshToken)
29
+ let ( data, statusCode) = try await execute ( request)
30
+
31
+ let decoder = JSONDecoder ( )
32
+ decoder. keyDecodingStrategy = . convertFromSnakeCase
33
+
34
+ // Only Decrypt If HTTP Status is 200 (Success or Opt Out)
35
+ if statusCode != 200 {
36
+ do {
37
+ let tokenResponse = try decoder. decode ( RefreshTokenResponse . self, from: data)
38
+ throw UID2Error . refreshTokenServer ( status: tokenResponse. status, message: tokenResponse. message)
39
+ } catch {
40
+ throw UID2Error . refreshTokenServerDecoding ( httpStatus: statusCode, message: error. localizedDescription)
69
41
}
70
-
71
- return refreshAPIPackage
72
42
}
73
43
44
+ // Decrypt Data Envelop
45
+ // https://github.com/UnifiedID2/uid2docs/blob/main/api/v2/encryption-decryption.md
46
+ guard let payloadData = DataEnvelope . decrypt ( refreshResponseKey, data, true ) else {
47
+ throw UID2Error . decryptPayloadData
48
+ }
49
+
50
+ let tokenResponse = try decoder. decode ( RefreshTokenResponse . self, from: payloadData)
51
+
52
+ guard let refreshAPIPackage = tokenResponse. toRefreshAPIPackage ( ) else {
53
+ throw UID2Error . refreshResponseToRefreshAPIPackage
54
+ }
55
+
56
+ return refreshAPIPackage
57
+ }
58
+
59
+ // MARK: - Request Execution
60
+
61
+ internal func urlRequest(
62
+ _ request: Request ,
63
+ baseURL: URL
64
+ ) -> URLRequest {
65
+ var urlComponents = URLComponents ( url: baseURL, resolvingAgainstBaseURL: true ) !
66
+ urlComponents. path = request. path
67
+ urlComponents. queryItems = request. queryItems. isEmpty ? nil : request. queryItems
68
+
69
+ var urlRequest = URLRequest ( url: urlComponents. url!)
70
+ urlRequest. httpMethod = request. method. rawValue
71
+ if request. method == . post {
72
+ urlRequest. httpBody = request. body
73
+ }
74
+
75
+ request. headers. forEach { field, value in
76
+ urlRequest. addValue ( value, forHTTPHeaderField: field)
77
+ }
78
+ urlRequest. addValue ( clientVersion, forHTTPHeaderField: " X-UID2-Client-Version " )
79
+ return urlRequest
80
+ }
81
+
82
+ private func execute( _ request: Request ) async throws -> ( Data , Int ) {
83
+ let urlRequest = urlRequest (
84
+ request,
85
+ baseURL: URL ( string: uid2APIURL) !
86
+ )
87
+ return try await session. loadData ( for: urlRequest)
88
+ }
74
89
}
0 commit comments