Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
24 changes: 24 additions & 0 deletions Networking/Networking.xcodeproj/project.pbxproj
Original file line number Diff line number Diff line change
Expand Up @@ -697,6 +697,8 @@
DEC51AFB2769C66B009F3DF4 /* SystemStatusMapperTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = DEC51AFA2769C66B009F3DF4 /* SystemStatusMapperTests.swift */; };
DEC51B02276AFB35009F3DF4 /* SystemStatus+DropinMustUsePlugin.swift in Sources */ = {isa = PBXBuildFile; fileRef = DEC51B01276AFB34009F3DF4 /* SystemStatus+DropinMustUsePlugin.swift */; };
E12552C526385B05001CEE70 /* ShippingLabelAddressValidationSuccess.swift in Sources */ = {isa = PBXBuildFile; fileRef = E12552C426385B05001CEE70 /* ShippingLabelAddressValidationSuccess.swift */; };
E137619929151C7400FD098F /* error-wp-rest-forbidden.json in Resources */ = {isa = PBXBuildFile; fileRef = E137619829151C7400FD098F /* error-wp-rest-forbidden.json */; };
E137619B2915222100FD098F /* WordPressApiValidatorTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = E137619A2915222100FD098F /* WordPressApiValidatorTests.swift */; };
E13BAD5328F8625600217769 /* InAppPurchasesRemoteTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = E13BAD5228F8625600217769 /* InAppPurchasesRemoteTests.swift */; };
E16C59B528F8640B007D55BB /* InAppPurchaseOrderResultMapper.swift in Sources */ = {isa = PBXBuildFile; fileRef = E16C59B428F8640B007D55BB /* InAppPurchaseOrderResultMapper.swift */; };
E16C59B728F92782007D55BB /* iap-sample-receipt.json in Resources */ = {isa = PBXBuildFile; fileRef = E16C59B628F92782007D55BB /* iap-sample-receipt.json */; };
Expand All @@ -706,6 +708,10 @@
E18152C228F85E0A0011A0EC /* iap-products.json in Resources */ = {isa = PBXBuildFile; fileRef = E18152C128F85E0A0011A0EC /* iap-products.json */; };
E18152C428F85E5C0011A0EC /* InAppPurchasesProductsMapperTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = E18152C328F85E5C0011A0EC /* InAppPurchasesProductsMapperTests.swift */; };
E1A5C27228F93ED900081046 /* InAppPurchaseOrderResultMapperTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = E1A5C27128F93ED900081046 /* InAppPurchaseOrderResultMapperTests.swift */; };
E1BAB2C12913F99500C3982B /* Request.swift in Sources */ = {isa = PBXBuildFile; fileRef = E1BAB2C02913F99500C3982B /* Request.swift */; };
E1BAB2C32913FA6400C3982B /* ResponseDataValidator.swift in Sources */ = {isa = PBXBuildFile; fileRef = E1BAB2C22913FA6400C3982B /* ResponseDataValidator.swift */; };
E1BAB2C52913FB1800C3982B /* WordPressApiValidator.swift in Sources */ = {isa = PBXBuildFile; fileRef = E1BAB2C42913FB1800C3982B /* WordPressApiValidator.swift */; };
E1BAB2C72913FB5800C3982B /* WordPressApiError.swift in Sources */ = {isa = PBXBuildFile; fileRef = E1BAB2C62913FB5800C3982B /* WordPressApiError.swift */; };
EE8A86F1286C5226003E8AA4 /* media-update-product-id-in-wordpress-site.json in Resources */ = {isa = PBXBuildFile; fileRef = EE8A86F0286C5226003E8AA4 /* media-update-product-id-in-wordpress-site.json */; };
EECB7EE8286555180028C888 /* media-update-product-id.json in Resources */ = {isa = PBXBuildFile; fileRef = EECB7EE7286555180028C888 /* media-update-product-id.json */; };
FE28F6E226840DED004465C7 /* User.swift in Sources */ = {isa = PBXBuildFile; fileRef = FE28F6E126840DED004465C7 /* User.swift */; };
Expand Down Expand Up @@ -1435,6 +1441,8 @@
DEC51AFA2769C66B009F3DF4 /* SystemStatusMapperTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SystemStatusMapperTests.swift; sourceTree = "<group>"; };
DEC51B01276AFB34009F3DF4 /* SystemStatus+DropinMustUsePlugin.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "SystemStatus+DropinMustUsePlugin.swift"; sourceTree = "<group>"; };
E12552C426385B05001CEE70 /* ShippingLabelAddressValidationSuccess.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ShippingLabelAddressValidationSuccess.swift; sourceTree = "<group>"; };
E137619829151C7400FD098F /* error-wp-rest-forbidden.json */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.json; path = "error-wp-rest-forbidden.json"; sourceTree = "<group>"; };
E137619A2915222100FD098F /* WordPressApiValidatorTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = WordPressApiValidatorTests.swift; sourceTree = "<group>"; };
E13BAD5228F8625600217769 /* InAppPurchasesRemoteTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = InAppPurchasesRemoteTests.swift; sourceTree = "<group>"; };
E16C59B428F8640B007D55BB /* InAppPurchaseOrderResultMapper.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = InAppPurchaseOrderResultMapper.swift; sourceTree = "<group>"; };
E16C59B628F92782007D55BB /* iap-sample-receipt.json */ = {isa = PBXFileReference; lastKnownFileType = text.json; path = "iap-sample-receipt.json"; sourceTree = "<group>"; };
Expand All @@ -1444,6 +1452,10 @@
E18152C128F85E0A0011A0EC /* iap-products.json */ = {isa = PBXFileReference; lastKnownFileType = text.json; path = "iap-products.json"; sourceTree = "<group>"; };
E18152C328F85E5C0011A0EC /* InAppPurchasesProductsMapperTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = InAppPurchasesProductsMapperTests.swift; sourceTree = "<group>"; };
E1A5C27128F93ED900081046 /* InAppPurchaseOrderResultMapperTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = InAppPurchaseOrderResultMapperTests.swift; sourceTree = "<group>"; };
E1BAB2C02913F99500C3982B /* Request.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Request.swift; sourceTree = "<group>"; };
E1BAB2C22913FA6400C3982B /* ResponseDataValidator.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ResponseDataValidator.swift; sourceTree = "<group>"; };
E1BAB2C42913FB1800C3982B /* WordPressApiValidator.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = WordPressApiValidator.swift; sourceTree = "<group>"; };
E1BAB2C62913FB5800C3982B /* WordPressApiError.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = WordPressApiError.swift; sourceTree = "<group>"; };
EE8A86F0286C5226003E8AA4 /* media-update-product-id-in-wordpress-site.json */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.json; path = "media-update-product-id-in-wordpress-site.json"; sourceTree = "<group>"; };
EECB7EE7286555180028C888 /* media-update-product-id.json */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.json; path = "media-update-product-id.json"; sourceTree = "<group>"; };
F3F25DC15EC1D7C631169CB5 /* Pods_Networking.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_Networking.framework; sourceTree = BUILT_PRODUCTS_DIR; };
Expand Down Expand Up @@ -1734,6 +1746,8 @@
isa = PBXGroup;
children = (
B53EF5332180F646003E146F /* DotcomValidator.swift */,
E1BAB2C42913FB1800C3982B /* WordPressApiValidator.swift */,
E1BAB2C22913FA6400C3982B /* ResponseDataValidator.swift */,
);
path = Validators;
sourceTree = "<group>";
Expand Down Expand Up @@ -1850,6 +1864,7 @@
isa = PBXGroup;
children = (
B567AF2420A0CCA300AB6C62 /* AuthenticatedRequest.swift */,
E1BAB2C02913F99500C3982B /* Request.swift */,
B557DA0E20975E07005962F4 /* DotcomRequest.swift */,
B557D9FF209754FF005962F4 /* JetpackRequest.swift */,
DE34051228BDCA5100CF0D97 /* WordPressOrgRequest.swift */,
Expand Down Expand Up @@ -1952,6 +1967,7 @@
3105470B262E27F000C5C02B /* WCPayPaymentIntentStatusEnum.swift */,
0359EA0E27AAC6410048DE2D /* WCPayPaymentMethodDetails.swift */,
0359EA1027AAC6740048DE2D /* WCPayPaymentMethodType.swift */,
E1BAB2C62913FB5800C3982B /* WordPressApiError.swift */,
);
path = Model;
sourceTree = "<group>";
Expand Down Expand Up @@ -2205,6 +2221,7 @@
68F48B1228E3E5750045C15B /* wc-analytics-customers.json */,
688908AD28FF920C0081A07E /* customer-2.json */,
03EB99952907F03000F06A39 /* empty-data-array.json */,
E137619829151C7400FD098F /* error-wp-rest-forbidden.json */,
);
path = Responses;
sourceTree = "<group>";
Expand Down Expand Up @@ -2321,6 +2338,7 @@
isa = PBXGroup;
children = (
B57B1E6921C925280046E764 /* DotcomValidatorTests.swift */,
E137619A2915222100FD098F /* WordPressApiValidatorTests.swift */,
);
path = Validators;
sourceTree = "<group>";
Expand Down Expand Up @@ -2653,6 +2671,7 @@
B5A24179217F98F600595DEF /* notifications-load-all.json in Resources */,
314EDF2927C02CC100A56B6F /* stripe-account-complete-empty-descriptor.json in Resources */,
028CB71F2902589E00331C09 /* create-account-error-invalid-email.json in Resources */,
E137619929151C7400FD098F /* error-wp-rest-forbidden.json in Resources */,
31A451CE27863A2E00FE81AA /* stripe-account-wrong-json.json in Resources */,
028CB718290223CB00331C09 /* account-username-suggestions.json in Resources */,
0282DD91233A120A006A5FDB /* products-search-photo.json in Resources */,
Expand Down Expand Up @@ -3074,6 +3093,7 @@
743057B5218B6ACD00441A76 /* Queue.swift in Sources */,
DE2095BD27956D7900171F1C /* CouponReport.swift in Sources */,
74A1D26821189A7100931DFA /* SiteVisitStats.swift in Sources */,
E1BAB2C12913F99500C3982B /* Request.swift in Sources */,
02C254B0256378D000A04423 /* ShippingLabelRefundStatus.swift in Sources */,
4568E2242459D3230007E478 /* Post.swift in Sources */,
4513382427A951B300AE5E78 /* InboxNoteMapper.swift in Sources */,
Expand Down Expand Up @@ -3176,6 +3196,7 @@
DE34051728BDEB6D00CF0D97 /* JetpackConnectionRemote.swift in Sources */,
B505F6EC20BEFDC200BB1B69 /* Loader.swift in Sources */,
74D3BD142114FE6900A6E85E /* MIContainer.swift in Sources */,
E1BAB2C72913FB5800C3982B /* WordPressApiError.swift in Sources */,
314703082670222500EF253A /* PaymentGatewayAccount.swift in Sources */,
CCF48B282628A4EB0034EA83 /* ShippingLabelAccountSettingsMapper.swift in Sources */,
B5BB1D1220A255EC00112D92 /* OrderStatusEnum.swift in Sources */,
Expand All @@ -3192,6 +3213,7 @@
74C8F06820EEB7BD00B6EDC9 /* OrderNotesMapper.swift in Sources */,
24F98C582502EA8800F49B68 /* FeatureFlagMapper.swift in Sources */,
451A9832260B9D2D0059D135 /* ShippingLabelPackagesMapper.swift in Sources */,
E1BAB2C32913FA6400C3982B /* ResponseDataValidator.swift in Sources */,
4501068F2399B19500E24722 /* TaxClassRemote.swift in Sources */,
B53EF5342180F646003E146F /* DotcomValidator.swift in Sources */,
CCF434642906BD7200B4475A /* ProductIDMapper.swift in Sources */,
Expand Down Expand Up @@ -3222,6 +3244,7 @@
740211E321939C84002248DA /* CommentResultMapper.swift in Sources */,
CC9A24F42642CF37005DE56E /* ShippingLabelCreationEligibilityMapper.swift in Sources */,
45E3EEBB237009CF00A826AC /* ShippingLine.swift in Sources */,
E1BAB2C52913FB1800C3982B /* WordPressApiValidator.swift in Sources */,
CE6BFEEA2236E191005C79FB /* ProductType.swift in Sources */,
CE6D666C2379E19D007835A1 /* Array+Woo.swift in Sources */,
CCF48B1E26288FEC0034EA83 /* ShippingLabelPaymentMethod.swift in Sources */,
Expand Down Expand Up @@ -3347,6 +3370,7 @@
74C8F06E20EEC1E800B6EDC9 /* OrderNotesMapperTests.swift in Sources */,
45ED4F10239E8A54004F1BE3 /* TaxClassListMapperTest.swift in Sources */,
FE28F6EA26842E49004465C7 /* UserMapperTests.swift in Sources */,
E137619B2915222100FD098F /* WordPressApiValidatorTests.swift in Sources */,
020C907F24C7D359001E2BEB /* ProductVariationMapperTests.swift in Sources */,
74ABA1D5213F26B300FFAD30 /* TopEarnerStatsMapperTests.swift in Sources */,
74AB5B5121AF426D00859C12 /* SiteAPIRemoteTests.swift in Sources */,
Expand Down
61 changes: 61 additions & 0 deletions Networking/Networking/Model/WordPressApiError.swift
Original file line number Diff line number Diff line change
@@ -0,0 +1,61 @@
import Foundation

/// WordPress API Request Error
///
public enum WordPressApiError: Error, Decodable, Equatable {
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

We already have an enum for WordPress.com Request Errors (DotcomError), for me to understand, do these two enums have different purposes?

Copy link
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This is for the core API errors, which might come from WordPress.com (wpcom/v2, wp/v2) or directly from a self-hosted site (via WordPressOrgRequest). There might be some overlap, but error codes might not necessarily match.


/// Unknown: Represents an unmapped remote error.
///
case unknown(code: String, message: String)

/// Decodable Initializer.
///
public init(from decoder: Decoder) throws {
let container = try decoder.container(keyedBy: CodingKeys.self)
let code = try container.decode(String.self, forKey: .code)
let message = try container.decode(String.self, forKey: .message)

switch code {
default:
self = .unknown(code: code, message: message)
}
}


/// Constants for Possible Error Identifiers
///
private enum Constants {
}

/// Coding Keys
///
private enum CodingKeys: String, CodingKey {
case code
case message
}

/// Possible Error Messages
///
private enum ErrorMessages {
static let statsModuleDisabled = "This blog does not have the Stats module enabled"
static let noStatsPermission = "user cannot view stats"
static let resourceDoesNotExist = "Resource does not exist."
}
}


// MARK: - CustomStringConvertible Conformance
//
extension WordPressApiError: CustomStringConvertible {

public var description: String {
switch self {
case .unknown(let code, let message):
let messageFormat = NSLocalizedString(
"WordPress API Error: [%1$@] %2$@",
comment: "WordPress API (unmapped!) error. Parameters: %1$@ - code, %2$@ - message"
)
return String.localizedStringWithFormat(messageFormat, code, message)
}
}
}
25 changes: 14 additions & 11 deletions Networking/Networking/Remote/InAppPurchasesRemote.swift
Original file line number Diff line number Diff line change
Expand Up @@ -10,8 +10,7 @@ public class InAppPurchasesRemote: Remote {
/// - completion: Closure to be executed upon completion
///
public func loadProducts(completion: @escaping (Swift.Result<[String], Error>) -> Void) {
let dotComRequest = DotcomRequest(wordpressApiVersion: .wpcomMark2, method: .get, path: Constants.productsPath)
let request = augmentedRequestWithAppId(dotComRequest)
let request = DotcomRequest(wordpressApiVersion: .wpcomMark2, method: .get, path: Constants.productsPath, headers: headersWithAppId)
let mapper = InAppPurchasesProductMapper()
enqueue(request, mapper: mapper, completion: completion)
}
Expand Down Expand Up @@ -39,8 +38,13 @@ public class InAppPurchasesRemote: Remote {
Constants.appStoreCountryCodeKey: appStoreCountryCode,
Constants.receiptDataKey: receiptData.base64EncodedString()
]
let dotComRequest = DotcomRequest(wordpressApiVersion: .wpcomMark2, method: .post, path: Constants.ordersPath, parameters: parameters)
let request = augmentedRequestWithAppId(dotComRequest)
let request = DotcomRequest(
wordpressApiVersion: .wpcomMark2,
method: .post,
path: Constants.ordersPath,
parameters: parameters,
headers: headersWithAppId
)
let mapper = InAppPurchaseOrderResultMapper()
enqueue(request, mapper: mapper, completion: completion)
}
Expand Down Expand Up @@ -93,15 +97,14 @@ public extension InAppPurchasesRemote {
}

private extension InAppPurchasesRemote {
func augmentedRequestWithAppId(_ request: URLRequestConvertible) -> URLRequestConvertible {
guard let bundleIdentifier = Bundle.main.bundleIdentifier,
var augmented = try? request.asURLRequest() else {
return request
var headersWithAppId: [String: String]? {
guard let bundleIdentifier = Bundle.main.bundleIdentifier else {
return nil
}

augmented.setValue(bundleIdentifier, forHTTPHeaderField: "X-APP-ID")

return augmented
return [
"X-APP-ID": bundleIdentifier
]
}
}

Expand Down
Loading