Skip to content

Commit 605dfb2

Browse files
authored
Merge pull request #5259 from woocommerce/issue/4960-plugins
[Mobile Payments] Use system plugins, not site plugins response, to drive onboarding (for shop manager's sake)
2 parents 86f4b6d + e651866 commit 605dfb2

File tree

18 files changed

+348
-199
lines changed

18 files changed

+348
-199
lines changed

Networking/Networking.xcodeproj/project.pbxproj

Lines changed: 25 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -69,11 +69,11 @@
6969
02E7FFCF25621C7900C53030 /* shipping-label-print.json in Resources */ = {isa = PBXBuildFile; fileRef = 02E7FFCE25621C7900C53030 /* shipping-label-print.json */; };
7070
02F096C22406691100C0C1D5 /* media-library.json in Resources */ = {isa = PBXBuildFile; fileRef = 02F096C12406691100C0C1D5 /* media-library.json */; };
7171
077F39C8269F2C7E00ABEADC /* SystemPlugin.swift in Sources */ = {isa = PBXBuildFile; fileRef = 077F39C7269F2C7E00ABEADC /* SystemPlugin.swift */; };
72-
077F39D426A58DE700ABEADC /* SystemPluginsMapper.swift in Sources */ = {isa = PBXBuildFile; fileRef = 077F39D326A58DE700ABEADC /* SystemPluginsMapper.swift */; };
73-
077F39D626A58E4500ABEADC /* SystemPluginsRemote.swift in Sources */ = {isa = PBXBuildFile; fileRef = 077F39D526A58E4500ABEADC /* SystemPluginsRemote.swift */; };
74-
077F39D826A58EB600ABEADC /* systemPlugins.json in Resources */ = {isa = PBXBuildFile; fileRef = 077F39D726A58EB600ABEADC /* systemPlugins.json */; };
75-
077F39DA26A58ED700ABEADC /* SystemPluginsRemoteTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 077F39D926A58ED700ABEADC /* SystemPluginsRemoteTests.swift */; };
76-
077F39E626A5D15800ABEADC /* SystemPluginsMapperTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 077F39DB26A58F4800ABEADC /* SystemPluginsMapperTests.swift */; };
72+
077F39D426A58DE700ABEADC /* SystemStatusMapper.swift in Sources */ = {isa = PBXBuildFile; fileRef = 077F39D326A58DE700ABEADC /* SystemStatusMapper.swift */; };
73+
077F39D626A58E4500ABEADC /* SystemStatusRemote.swift in Sources */ = {isa = PBXBuildFile; fileRef = 077F39D526A58E4500ABEADC /* SystemStatusRemote.swift */; };
74+
077F39D826A58EB600ABEADC /* systemStatus.json in Resources */ = {isa = PBXBuildFile; fileRef = 077F39D726A58EB600ABEADC /* systemStatus.json */; };
75+
077F39DA26A58ED700ABEADC /* SystemStatusRemoteTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 077F39D926A58ED700ABEADC /* SystemStatusRemoteTests.swift */; };
76+
077F39E626A5D15800ABEADC /* SystemStatusMapperTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 077F39DB26A58F4800ABEADC /* SystemStatusMapperTests.swift */; };
7777
21DB5B99C4107CF69C0A57EC /* Pods_NetworkingTests.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 69314EDE650855CAF927057E /* Pods_NetworkingTests.framework */; };
7878
24F98C522502E79800F49B68 /* FeatureFlagsRemote.swift in Sources */ = {isa = PBXBuildFile; fileRef = 24F98C512502E79800F49B68 /* FeatureFlagsRemote.swift */; };
7979
24F98C542502E8DD00F49B68 /* Bundle+Woo.swift in Sources */ = {isa = PBXBuildFile; fileRef = 24F98C532502E8DD00F49B68 /* Bundle+Woo.swift */; };
@@ -142,6 +142,7 @@
142142
31104E142630DDA700587C1E /* wcpay-account-wrong-json.json in Resources */ = {isa = PBXBuildFile; fileRef = 31104E132630DDA700587C1E /* wcpay-account-wrong-json.json */; };
143143
311976E02602BD4B006AC56C /* SitePluginsMapperTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 311976DF2602BD4B006AC56C /* SitePluginsMapperTests.swift */; };
144144
314703082670222500EF253A /* PaymentGatewayAccount.swift in Sources */ = {isa = PBXBuildFile; fileRef = 314703072670222500EF253A /* PaymentGatewayAccount.swift */; };
145+
3148977027232982007A86BD /* SystemStatus.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3148976F27232982007A86BD /* SystemStatus.swift */; };
145146
3158FE6026129ADD00E566B9 /* wcpay-account-none.json in Resources */ = {isa = PBXBuildFile; fileRef = 3158FE5F26129ADD00E566B9 /* wcpay-account-none.json */; };
146147
3158FE6426129B1300E566B9 /* wcpay-account-complete.json in Resources */ = {isa = PBXBuildFile; fileRef = 3158FE6326129B1300E566B9 /* wcpay-account-complete.json */; };
147148
3158FE6826129CE200E566B9 /* wcpay-account-rejected-fraud.json in Resources */ = {isa = PBXBuildFile; fileRef = 3158FE6726129CE200E566B9 /* wcpay-account-rejected-fraud.json */; };
@@ -633,11 +634,11 @@
633634
02E7FFCE25621C7900C53030 /* shipping-label-print.json */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.json; path = "shipping-label-print.json"; sourceTree = "<group>"; };
634635
02F096C12406691100C0C1D5 /* media-library.json */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.json; path = "media-library.json"; sourceTree = "<group>"; };
635636
077F39C7269F2C7E00ABEADC /* SystemPlugin.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SystemPlugin.swift; sourceTree = "<group>"; };
636-
077F39D326A58DE700ABEADC /* SystemPluginsMapper.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SystemPluginsMapper.swift; sourceTree = "<group>"; };
637-
077F39D526A58E4500ABEADC /* SystemPluginsRemote.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SystemPluginsRemote.swift; sourceTree = "<group>"; };
638-
077F39D726A58EB600ABEADC /* systemPlugins.json */ = {isa = PBXFileReference; lastKnownFileType = text.json; path = systemPlugins.json; sourceTree = "<group>"; };
639-
077F39D926A58ED700ABEADC /* SystemPluginsRemoteTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SystemPluginsRemoteTests.swift; sourceTree = "<group>"; };
640-
077F39DB26A58F4800ABEADC /* SystemPluginsMapperTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SystemPluginsMapperTests.swift; sourceTree = "<group>"; };
637+
077F39D326A58DE700ABEADC /* SystemStatusMapper.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SystemStatusMapper.swift; sourceTree = "<group>"; };
638+
077F39D526A58E4500ABEADC /* SystemStatusRemote.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SystemStatusRemote.swift; sourceTree = "<group>"; };
639+
077F39D726A58EB600ABEADC /* systemStatus.json */ = {isa = PBXFileReference; lastKnownFileType = text.json; path = systemStatus.json; sourceTree = "<group>"; };
640+
077F39D926A58ED700ABEADC /* SystemStatusRemoteTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SystemStatusRemoteTests.swift; sourceTree = "<group>"; };
641+
077F39DB26A58F4800ABEADC /* SystemStatusMapperTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SystemStatusMapperTests.swift; sourceTree = "<group>"; };
641642
24F98C512502E79800F49B68 /* FeatureFlagsRemote.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = FeatureFlagsRemote.swift; sourceTree = "<group>"; };
642643
24F98C532502E8DD00F49B68 /* Bundle+Woo.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "Bundle+Woo.swift"; sourceTree = "<group>"; };
643644
24F98C552502EA4800F49B68 /* FeatureFlag.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = FeatureFlag.swift; sourceTree = "<group>"; };
@@ -704,6 +705,7 @@
704705
31104E132630DDA700587C1E /* wcpay-account-wrong-json.json */ = {isa = PBXFileReference; lastKnownFileType = text.json; path = "wcpay-account-wrong-json.json"; sourceTree = "<group>"; };
705706
311976DF2602BD4B006AC56C /* SitePluginsMapperTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SitePluginsMapperTests.swift; sourceTree = "<group>"; };
706707
314703072670222500EF253A /* PaymentGatewayAccount.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = PaymentGatewayAccount.swift; sourceTree = "<group>"; };
708+
3148976F27232982007A86BD /* SystemStatus.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SystemStatus.swift; sourceTree = "<group>"; };
707709
3158FE5F26129ADD00E566B9 /* wcpay-account-none.json */ = {isa = PBXFileReference; lastKnownFileType = text.json; path = "wcpay-account-none.json"; sourceTree = "<group>"; };
708710
3158FE6326129B1300E566B9 /* wcpay-account-complete.json */ = {isa = PBXFileReference; lastKnownFileType = text.json; path = "wcpay-account-complete.json"; sourceTree = "<group>"; };
709711
3158FE6726129CE200E566B9 /* wcpay-account-rejected-fraud.json */ = {isa = PBXFileReference; lastKnownFileType = text.json; path = "wcpay-account-rejected-fraud.json"; sourceTree = "<group>"; };
@@ -1342,7 +1344,7 @@
13421344
02E7FFCA256218F600C53030 /* ShippingLabelRemoteTests.swift */,
13431345
D800DA0925EFEB9C001E13CE /* WCPayRemoteTests.swift */,
13441346
FE28F6EB268436C9004465C7 /* UserRemoteTests.swift */,
1345-
077F39D926A58ED700ABEADC /* SystemPluginsRemoteTests.swift */,
1347+
077F39D926A58ED700ABEADC /* SystemStatusRemoteTests.swift */,
13461348
);
13471349
path = Remote;
13481350
sourceTree = "<group>";
@@ -1467,7 +1469,7 @@
14671469
029BA4EF255D7282006171FD /* ShippingLabelRemote.swift */,
14681470
D8EDFE1D25EE87F1003D2213 /* WCPayRemote.swift */,
14691471
FE28F6E5268429B6004465C7 /* UserRemote.swift */,
1470-
077F39D526A58E4500ABEADC /* SystemPluginsRemote.swift */,
1472+
077F39D526A58E4500ABEADC /* SystemStatusRemote.swift */,
14711473
);
14721474
path = Remote;
14731475
sourceTree = "<group>";
@@ -1545,6 +1547,8 @@
15451547
74046E1C217A6989007DD7BF /* SiteSetting.swift */,
15461548
74159624224D4045003C21CF /* SiteSettingGroup.swift */,
15471549
CE50345F21B5799F007573C6 /* SitePlan.swift */,
1550+
077F39C7269F2C7E00ABEADC /* SystemPlugin.swift */,
1551+
3148976F27232982007A86BD /* SystemStatus.swift */,
15481552
450106842399A7CB00E24722 /* TaxClass.swift */,
15491553
3192F21F260D33BB0067FEF9 /* WCPayAccount.swift */,
15501554
3192F223260D34C40067FEF9 /* WCPayAccountStatusEnum.swift */,
@@ -1553,7 +1557,6 @@
15531557
31054705262E278100C5C02B /* WCPayPaymentIntent.swift */,
15541558
3105470B262E27F000C5C02B /* WCPayPaymentIntentStatusEnum.swift */,
15551559
FE28F6E126840DED004465C7 /* User.swift */,
1556-
077F39C7269F2C7E00ABEADC /* SystemPlugin.swift */,
15571560
);
15581561
path = Model;
15591562
sourceTree = "<group>";
@@ -1727,7 +1730,7 @@
17271730
3105472B262E303400C5C02B /* wcpay-payment-intent-unknown-status.json */,
17281731
31054733262E36AB00C5C02B /* wcpay-payment-intent-error.json */,
17291732
31B8D6B526583970008E3DB2 /* wcpay-account-implicitly-not-eligible.json */,
1730-
077F39D726A58EB600ABEADC /* systemPlugins.json */,
1733+
077F39D726A58EB600ABEADC /* systemStatus.json */,
17311734
);
17321735
path = Responses;
17331736
sourceTree = "<group>";
@@ -1801,7 +1804,7 @@
18011804
CC0786602677B2DA00BA9AC1 /* ShippingLabelPurchaseMapper.swift */,
18021805
CC0786C4267BAF0F00BA9AC1 /* ShippingLabelStatusMapper.swift */,
18031806
FE28F6E326842848004465C7 /* UserMapper.swift */,
1804-
077F39D326A58DE700ABEADC /* SystemPluginsMapper.swift */,
1807+
077F39D326A58DE700ABEADC /* SystemStatusMapper.swift */,
18051808
);
18061809
path = Mapper;
18071810
sourceTree = "<group>";
@@ -1866,7 +1869,7 @@
18661869
children = (
18671870
B505F6D220BEE3A500BB1B69 /* AccountMapperTests.swift */,
18681871
9387A6EF226E3F15001B53D7 /* AccountSettingsMapperTests.swift */,
1869-
077F39DB26A58F4800ABEADC /* SystemPluginsMapperTests.swift */,
1872+
077F39DB26A58F4800ABEADC /* SystemStatusMapperTests.swift */,
18701873
2685C0D9263B551300D9EE97 /* AddOnGroupMapperTests.swift */,
18711874
74AB0AC921948CE4008220CD /* CommentResultMapperTests.swift */,
18721875
45150A9F26837357006922EA /* CountryListMapperTests.swift */,
@@ -2108,7 +2111,7 @@
21082111
31054728262E2FEE00C5C02B /* wcpay-payment-intent-canceled.json in Resources */,
21092112
24F98C622502EFF600F49B68 /* feature-flags-load-all.json in Resources */,
21102113
B58D10C82114D21D00107ED4 /* generic_error.json in Resources */,
2111-
077F39D826A58EB600ABEADC /* systemPlugins.json in Resources */,
2114+
077F39D826A58EB600ABEADC /* systemStatus.json in Resources */,
21122115
CE50346721B5DCBE007573C6 /* site-plan.json in Resources */,
21132116
743E84F322172D0A00FAC9D7 /* shipment_tracking_empty.json in Resources */,
21142117
B505F6D520BEE4E700BB1B69 /* me.json in Resources */,
@@ -2453,7 +2456,7 @@
24532456
261CF1B8255AE62D0090D8D3 /* PaymentGatewayRemote.swift in Sources */,
24542457
CE0A0F1522396BF00075ED8D /* ProductAttribute.swift in Sources */,
24552458
026CF620237D69D6009563D4 /* ProductVariationsRemote.swift in Sources */,
2456-
077F39D626A58E4500ABEADC /* SystemPluginsRemote.swift in Sources */,
2459+
077F39D626A58E4500ABEADC /* SystemStatusRemote.swift in Sources */,
24572460
4599FC5E24A62AA70056157A /* ProductTagsRemote.swift in Sources */,
24582461
FE28F6E226840DED004465C7 /* User.swift in Sources */,
24592462
7426CA0F21AF2C90004E9FFC /* SiteAPI.swift in Sources */,
@@ -2478,6 +2481,7 @@
24782481
CE430676234BA7920073CBFF /* RefundListMapper.swift in Sources */,
24792482
45551F122523E7F1007EF104 /* UserAgent.swift in Sources */,
24802483
45CDAFAB2434CA9300F83C22 /* ProductCatalogVisibility.swift in Sources */,
2484+
3148977027232982007A86BD /* SystemStatus.swift in Sources */,
24812485
B557DA1820979D51005962F4 /* Credentials.swift in Sources */,
24822486
CE583A0E2109154500D73C1C /* OrderNoteMapper.swift in Sources */,
24832487
318E8FD526C31F9500F519D7 /* WCPayCustomer.swift in Sources */,
@@ -2543,7 +2547,7 @@
25432547
B557DA0B20975D7E005962F4 /* WooAPIVersion.swift in Sources */,
25442548
45150A9E26836A57006922EA /* CountryListMapper.swift in Sources */,
25452549
CE6BFEE82236D133005C79FB /* ProductDimensions.swift in Sources */,
2546-
077F39D426A58DE700ABEADC /* SystemPluginsMapper.swift in Sources */,
2550+
077F39D426A58DE700ABEADC /* SystemStatusMapper.swift in Sources */,
25472551
45152811257A81730076B03C /* ProductAttributeMapper.swift in Sources */,
25482552
B505F6D120BEE39600BB1B69 /* AccountRemote.swift in Sources */,
25492553
B567AF2B20A0FA4200AB6C62 /* OrderListMapper.swift in Sources */,
@@ -2602,7 +2606,7 @@
26022606
B5C6FCC820A32E4800A4F8E4 /* DateFormatterWooTests.swift in Sources */,
26032607
74C8F06A20EEBC8C00B6EDC9 /* OrderMapperTests.swift in Sources */,
26042608
45152835257A8F490076B03C /* ProductAttributeListMapperTests.swift in Sources */,
2605-
077F39DA26A58ED700ABEADC /* SystemPluginsRemoteTests.swift in Sources */,
2609+
077F39DA26A58ED700ABEADC /* SystemStatusRemoteTests.swift in Sources */,
26062610
31D27C952602B737002EDB1D /* SitePluginsRemoteTests.swift in Sources */,
26072611
74AB5B4D21AF354E00859C12 /* SiteAPIMapperTests.swift in Sources */,
26082612
93D8BC01226BC20600AD2EB3 /* AccountSettingsRemoteTests.swift in Sources */,
@@ -2635,7 +2639,7 @@
26352639
020C907F24C7D359001E2BEB /* ProductVariationMapperTests.swift in Sources */,
26362640
74ABA1D5213F26B300FFAD30 /* TopEarnerStatsMapperTests.swift in Sources */,
26372641
74AB5B5121AF426D00859C12 /* SiteAPIRemoteTests.swift in Sources */,
2638-
077F39E626A5D15800ABEADC /* SystemPluginsMapperTests.swift in Sources */,
2642+
077F39E626A5D15800ABEADC /* SystemStatusMapperTests.swift in Sources */,
26392643
4599FC6624A633A10056157A /* ProductTagsRemoteTests.swift in Sources */,
26402644
B567AF2F20A0FB8F00AB6C62 /* AuthenticatedRequestTests.swift in Sources */,
26412645
B5C6FCCD20A34B8300A4F8E4 /* OrderListMapperTests.swift in Sources */,

Networking/Networking/Mapper/SystemPluginsMapper.swift

Lines changed: 0 additions & 43 deletions
This file was deleted.
Lines changed: 45 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,45 @@
1+
import Foundation
2+
3+
/// Mapper: System Status
4+
///
5+
struct SystemStatusMapper: Mapper {
6+
7+
/// Site Identifier associated to the system plugins that will be parsed.
8+
/// We're injecting this field via `JSONDecoder.userInfo` because the remote endpoints don't return the SiteID in the system plugin endpoint.
9+
///
10+
let siteID: Int64
11+
12+
/// (Attempts) to convert a dictionary into [SystemPlugin].
13+
///
14+
func map(response: Data) throws -> [SystemPlugin] {
15+
let decoder = JSONDecoder()
16+
decoder.userInfo = [
17+
.siteID: siteID
18+
]
19+
20+
let systemStatus = try decoder.decode(SystemStatusEnvelope.self, from: response).systemStatus
21+
22+
/// For now, we're going to override the networkActivated Bool in each plugin to convey active or inactive -- in order to
23+
/// avoid a core data change to add a Bool for activated
24+
/// This will be undone in #5269
25+
let activePlugins = systemStatus.activePlugins.map {
26+
$0.overrideNetworkActivated(isNetworkActivated: true)
27+
}
28+
let inactivePlugins = systemStatus.inactivePlugins.map {
29+
$0.overrideNetworkActivated(isNetworkActivated: false)
30+
}
31+
32+
return activePlugins + inactivePlugins
33+
}
34+
}
35+
36+
/// System Status endpoint returns the requested account in the `data` key. This entity
37+
/// allows us to parse it with JSONDecoder.
38+
///
39+
private struct SystemStatusEnvelope: Decodable {
40+
let systemStatus: SystemStatus
41+
42+
private enum CodingKeys: String, CodingKey {
43+
case systemStatus = "data"
44+
}
45+
}

Networking/Networking/Model/SystemPlugin.swift

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -88,6 +88,22 @@ public struct SystemPlugin: Decodable, GeneratedFakeable, GeneratedCopiable {
8888
}
8989
}
9090

91+
extension SystemPlugin {
92+
func overrideNetworkActivated(isNetworkActivated: Bool) -> SystemPlugin {
93+
SystemPlugin(
94+
siteID: self.siteID,
95+
plugin: self.plugin,
96+
name: self.name,
97+
version: self.version,
98+
versionLatest: self.versionLatest,
99+
url: self.url,
100+
authorName: self.authorName,
101+
authorUrl: self.authorUrl,
102+
networkActivated: isNetworkActivated
103+
)
104+
}
105+
}
106+
91107
/// Defines all of the SystemPlugin CodingKeys.
92108
///
93109
private extension SystemPlugin {
Lines changed: 35 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,35 @@
1+
/// Represent a System Status.
2+
/// Note: We are only decoding the active and inactive plugins portions at the moment.
3+
///
4+
public struct SystemStatus: Decodable {
5+
let activePlugins: [SystemPlugin]
6+
let inactivePlugins: [SystemPlugin]
7+
8+
public init(
9+
activePlugins: [SystemPlugin],
10+
inactivePlugins: [SystemPlugin]
11+
) {
12+
self.activePlugins = activePlugins
13+
self.inactivePlugins = inactivePlugins
14+
}
15+
16+
/// The public initializer for System Status.
17+
///
18+
public init(from decoder: Decoder) throws {
19+
let container = try decoder.container(keyedBy: CodingKeys.self)
20+
let activePlugins = try container.decode([SystemPlugin].self, forKey: .activePlugins)
21+
let inactivePlugins = try container.decode([SystemPlugin].self, forKey: .inactivePlugins)
22+
23+
self.init(
24+
activePlugins: activePlugins,
25+
inactivePlugins: inactivePlugins
26+
)
27+
}
28+
}
29+
30+
private extension SystemStatus {
31+
enum CodingKeys: String, CodingKey {
32+
case activePlugins = "active_plugins"
33+
case inactivePlugins = "inactive_plugins"
34+
}
35+
}

0 commit comments

Comments
 (0)