Skip to content

Commit 50b03fb

Browse files
authored
Merge pull request #369 from woocommerce/fix/312-currency-mark1
Currency Mark1: SiteSettings Networking
2 parents d53496a + e039d1d commit 50b03fb

File tree

8 files changed

+3106
-1
lines changed

8 files changed

+3106
-1
lines changed

Networking/Networking.xcodeproj/project.pbxproj

Lines changed: 29 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,10 @@
1111
6647C0161DAC6AB6570C53A7 /* Pods_Networking.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = F3F25DC15EC1D7C631169CB5 /* Pods_Networking.framework */; };
1212
74002D6A2118B26100A63C19 /* SiteVisitStatsMapperTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 74002D692118B26000A63C19 /* SiteVisitStatsMapperTests.swift */; };
1313
74002D6C2118B88200A63C19 /* SiteVisitStatsRemoteTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 74002D6B2118B88200A63C19 /* SiteVisitStatsRemoteTests.swift */; };
14+
74046E1B217A684D007DD7BF /* SiteSettingsRemote.swift in Sources */ = {isa = PBXBuildFile; fileRef = 74046E1A217A684D007DD7BF /* SiteSettingsRemote.swift */; };
15+
74046E1D217A6989007DD7BF /* SiteSetting.swift in Sources */ = {isa = PBXBuildFile; fileRef = 74046E1C217A6989007DD7BF /* SiteSetting.swift */; };
16+
74046E1F217A6B70007DD7BF /* SiteSettingsMapper.swift in Sources */ = {isa = PBXBuildFile; fileRef = 74046E1E217A6B70007DD7BF /* SiteSettingsMapper.swift */; };
17+
74046E21217A73D0007DD7BF /* settings-general.json in Resources */ = {isa = PBXBuildFile; fileRef = 74046E20217A73D0007DD7BF /* settings-general.json */; };
1418
7412A51121702E9700994370 /* order-stats-alt.json in Resources */ = {isa = PBXBuildFile; fileRef = 7412A51021702E9700994370 /* order-stats-alt.json */; };
1519
741B950120EBC8A700DD6E2D /* OrderCouponLine.swift in Sources */ = {isa = PBXBuildFile; fileRef = 741B950020EBC8A700DD6E2D /* OrderCouponLine.swift */; };
1620
743BF8BE21191B63008A9D87 /* site-visits.json in Resources */ = {isa = PBXBuildFile; fileRef = 743BF8BD21191B63008A9D87 /* site-visits.json */; };
@@ -35,6 +39,8 @@
3539
74A1D26B21189B8100931DFA /* SiteVisitStatsItem.swift in Sources */ = {isa = PBXBuildFile; fileRef = 74A1D26A21189B8100931DFA /* SiteVisitStatsItem.swift */; };
3640
74A1D26D21189DFF00931DFA /* SiteVisitStatsMapper.swift in Sources */ = {isa = PBXBuildFile; fileRef = 74A1D26C21189DFE00931DFA /* SiteVisitStatsMapper.swift */; };
3741
74A1D26F21189EA100931DFA /* SiteVisitStatsRemote.swift in Sources */ = {isa = PBXBuildFile; fileRef = 74A1D26E21189EA000931DFA /* SiteVisitStatsRemote.swift */; };
42+
74A7B4BC217A807400E85A8B /* SiteSettingsMapperTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 74A7B4BB217A807400E85A8B /* SiteSettingsMapperTests.swift */; };
43+
74A7B4BE217A841400E85A8B /* broken-settings-general.json in Resources */ = {isa = PBXBuildFile; fileRef = 74A7B4BD217A841400E85A8B /* broken-settings-general.json */; };
3844
74ABA1C5213F17AA00FFAD30 /* top-performers-day.json in Resources */ = {isa = PBXBuildFile; fileRef = 74ABA1C4213F17AA00FFAD30 /* top-performers-day.json */; };
3945
74ABA1C9213F19FE00FFAD30 /* top-performers-month.json in Resources */ = {isa = PBXBuildFile; fileRef = 74ABA1C6213F19FD00FFAD30 /* top-performers-month.json */; };
4046
74ABA1CA213F19FE00FFAD30 /* top-performers-year.json in Resources */ = {isa = PBXBuildFile; fileRef = 74ABA1C7213F19FE00FFAD30 /* top-performers-year.json */; };
@@ -55,6 +61,7 @@
5561
74CF5E8421402C04000CED0A /* TopEarnerStatsRemoteTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 74CF5E8321402C04000CED0A /* TopEarnerStatsRemoteTests.swift */; };
5662
74D3BD142114FE6900A6E85E /* MIContainer.swift in Sources */ = {isa = PBXBuildFile; fileRef = 74D3BD132114FE6900A6E85E /* MIContainer.swift */; };
5763
74D522B62113607F00042831 /* StatGranularity.swift in Sources */ = {isa = PBXBuildFile; fileRef = 74D522B52113607F00042831 /* StatGranularity.swift */; };
64+
74D5BECE217E0F98007B0348 /* SiteSettingsRemoteTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 74D5BECD217E0F98007B0348 /* SiteSettingsRemoteTests.swift */; };
5865
74E30951216E8DCE00ABCE4C /* site-visits-alt.json in Resources */ = {isa = PBXBuildFile; fileRef = 74E30950216E8DCE00ABCE4C /* site-visits-alt.json */; };
5966
B505F6CD20BEE37E00BB1B69 /* AccountMapper.swift in Sources */ = {isa = PBXBuildFile; fileRef = B505F6CC20BEE37E00BB1B69 /* AccountMapper.swift */; };
6067
B505F6CF20BEE38B00BB1B69 /* Account.swift in Sources */ = {isa = PBXBuildFile; fileRef = B505F6CE20BEE38B00BB1B69 /* Account.swift */; };
@@ -123,6 +130,10 @@
123130
69314EDE650855CAF927057E /* Pods_NetworkingTests.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_NetworkingTests.framework; sourceTree = BUILT_PRODUCTS_DIR; };
124131
74002D692118B26000A63C19 /* SiteVisitStatsMapperTests.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = SiteVisitStatsMapperTests.swift; sourceTree = "<group>"; };
125132
74002D6B2118B88200A63C19 /* SiteVisitStatsRemoteTests.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = SiteVisitStatsRemoteTests.swift; sourceTree = "<group>"; };
133+
74046E1A217A684D007DD7BF /* SiteSettingsRemote.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SiteSettingsRemote.swift; sourceTree = "<group>"; };
134+
74046E1C217A6989007DD7BF /* SiteSetting.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SiteSetting.swift; sourceTree = "<group>"; };
135+
74046E1E217A6B70007DD7BF /* SiteSettingsMapper.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SiteSettingsMapper.swift; sourceTree = "<group>"; };
136+
74046E20217A73D0007DD7BF /* settings-general.json */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.json; path = "settings-general.json"; sourceTree = "<group>"; };
126137
7412A51021702E9700994370 /* order-stats-alt.json */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.json; path = "order-stats-alt.json"; sourceTree = "<group>"; };
127138
741B950020EBC8A700DD6E2D /* OrderCouponLine.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = OrderCouponLine.swift; sourceTree = "<group>"; };
128139
743BF8BD21191B63008A9D87 /* site-visits.json */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.json; path = "site-visits.json"; sourceTree = "<group>"; };
@@ -147,6 +158,8 @@
147158
74A1D26A21189B8100931DFA /* SiteVisitStatsItem.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = SiteVisitStatsItem.swift; sourceTree = "<group>"; };
148159
74A1D26C21189DFE00931DFA /* SiteVisitStatsMapper.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = SiteVisitStatsMapper.swift; sourceTree = "<group>"; };
149160
74A1D26E21189EA000931DFA /* SiteVisitStatsRemote.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = SiteVisitStatsRemote.swift; sourceTree = "<group>"; };
161+
74A7B4BB217A807400E85A8B /* SiteSettingsMapperTests.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = SiteSettingsMapperTests.swift; sourceTree = "<group>"; };
162+
74A7B4BD217A841400E85A8B /* broken-settings-general.json */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.json; path = "broken-settings-general.json"; sourceTree = "<group>"; };
150163
74ABA1C4213F17AA00FFAD30 /* top-performers-day.json */ = {isa = PBXFileReference; lastKnownFileType = text.json; path = "top-performers-day.json"; sourceTree = "<group>"; };
151164
74ABA1C6213F19FD00FFAD30 /* top-performers-month.json */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.json; path = "top-performers-month.json"; sourceTree = "<group>"; };
152165
74ABA1C7213F19FE00FFAD30 /* top-performers-year.json */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.json; path = "top-performers-year.json"; sourceTree = "<group>"; };
@@ -167,6 +180,7 @@
167180
74CF5E8321402C04000CED0A /* TopEarnerStatsRemoteTests.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = TopEarnerStatsRemoteTests.swift; sourceTree = "<group>"; };
168181
74D3BD132114FE6900A6E85E /* MIContainer.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MIContainer.swift; sourceTree = "<group>"; };
169182
74D522B52113607F00042831 /* StatGranularity.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = StatGranularity.swift; sourceTree = "<group>"; };
183+
74D5BECD217E0F98007B0348 /* SiteSettingsRemoteTests.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = SiteSettingsRemoteTests.swift; sourceTree = "<group>"; };
170184
74E30950216E8DCE00ABCE4C /* site-visits-alt.json */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.json; path = "site-visits-alt.json"; sourceTree = "<group>"; };
171185
753D6504FF01F09F6A33B73E /* Pods-Networking.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Networking.debug.xcconfig"; path = "../Pods/Target Support Files/Pods-Networking/Pods-Networking.debug.xcconfig"; sourceTree = "<group>"; };
172186
B505F6CC20BEE37E00BB1B69 /* AccountMapper.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = AccountMapper.swift; sourceTree = "<group>"; };
@@ -304,6 +318,7 @@
304318
B505F6D620BEE58800BB1B69 /* AccountRemoteTests.swift */,
305319
B518662920A09C6F00037A38 /* OrdersRemoteTests.swift */,
306320
74AE244C2113704C00CA8C54 /* OrderStatsRemoteTests.swift */,
321+
74D5BECD217E0F98007B0348 /* SiteSettingsRemoteTests.swift */,
307322
74002D6B2118B88200A63C19 /* SiteVisitStatsRemoteTests.swift */,
308323
74CF5E8321402C04000CED0A /* TopEarnerStatsRemoteTests.swift */,
309324
);
@@ -387,6 +402,7 @@
387402
B505F6D020BEE39600BB1B69 /* AccountRemote.swift */,
388403
B557DA0120975500005962F4 /* OrdersRemote.swift */,
389404
748D4247210F89ED00CF7D1B /* OrderStatsRemote.swift */,
405+
74046E1A217A684D007DD7BF /* SiteSettingsRemote.swift */,
390406
74A1D26E21189EA000931DFA /* SiteVisitStatsRemote.swift */,
391407
74ABA1D0213F22CA00FFAD30 /* TopEarnersStatsRemote.swift */,
392408
);
@@ -426,6 +442,7 @@
426442
74C8F06320EEB44800B6EDC9 /* OrderNote.swift */,
427443
B5BB1D1120A255EC00112D92 /* OrderStatus.swift */,
428444
B56C1EB720EA76F500D749F9 /* Site.swift */,
445+
74046E1C217A6989007DD7BF /* SiteSetting.swift */,
429446
);
430447
path = Model;
431448
sourceTree = "<group>";
@@ -437,6 +454,7 @@
437454
74C8F06B20EEBD5D00B6EDC9 /* broken-order.json */,
438455
CE20179220E3EFA7005B4C18 /* broken-orders.json */,
439456
B5147875211B9227007562E5 /* broken-orders-mark-2.json */,
457+
74A7B4BD217A841400E85A8B /* broken-settings-general.json */,
440458
B58D10C72114D21C00107ED4 /* generic_error.json */,
441459
B505F6D420BEE4E600BB1B69 /* me.json */,
442460
B58D10C92114D22E00107ED4 /* new-order-note.json */,
@@ -449,6 +467,7 @@
449467
743FDB9A210FB36900AC737F /* order-stats-year.json */,
450468
B58D10C52114D1F100107ED4 /* order-stats.json */,
451469
7412A51021702E9700994370 /* order-stats-alt.json */,
470+
74046E20217A73D0007DD7BF /* settings-general.json */,
452471
B56C1EB920EA7D2C00D749F9 /* sites.json */,
453472
74A1D25F211898F000931DFA /* site-visits-day.json */,
454473
74A1D260211898F000931DFA /* site-visits-week.json */,
@@ -472,10 +491,11 @@
472491
B505F6CC20BEE37E00BB1B69 /* AccountMapper.swift */,
473492
B5C6FCD320A373BA00A4F8E4 /* OrderMapper.swift */,
474493
B567AF2A20A0FA4200AB6C62 /* OrderListMapper.swift */,
475-
B56C1EB520EA757B00D749F9 /* SiteListMapper.swift */,
476494
74C8F06720EEB7BC00B6EDC9 /* OrderNotesMapper.swift */,
477495
CE583A0D2109154500D73C1C /* OrderNoteMapper.swift */,
478496
748D424B210FA34400CF7D1B /* OrderStatsMapper.swift */,
497+
B56C1EB520EA757B00D749F9 /* SiteListMapper.swift */,
498+
74046E1E217A6B70007DD7BF /* SiteSettingsMapper.swift */,
479499
74A1D26C21189DFE00931DFA /* SiteVisitStatsMapper.swift */,
480500
74ABA1D2213F25AE00FFAD30 /* TopEarnerStatsMapper.swift */,
481501
);
@@ -515,6 +535,7 @@
515535
74C8F06920EEBC8C00B6EDC9 /* OrderMapperTests.swift */,
516536
74C8F06D20EEC1E700B6EDC9 /* OrderNotesMapperTests.swift */,
517537
743FDB9F210FB3E500AC737F /* OrderStatsMapperTests.swift */,
538+
74A7B4BB217A807400E85A8B /* SiteSettingsMapperTests.swift */,
518539
74002D692118B26000A63C19 /* SiteVisitStatsMapperTests.swift */,
519540
74ABA1D4213F26B300FFAD30 /* TopEarnerStatsMapperTests.swift */,
520541
);
@@ -645,11 +666,13 @@
645666
743BF8BE21191B63008A9D87 /* site-visits.json in Resources */,
646667
B505F6D520BEE4E700BB1B69 /* me.json in Resources */,
647668
B5C6FCD620A3768900A4F8E4 /* order.json in Resources */,
669+
74046E21217A73D0007DD7BF /* settings-general.json in Resources */,
648670
74A1D266211898F000931DFA /* site-visits-year.json in Resources */,
649671
743FDB9C210FB36900AC737F /* order-stats-month.json in Resources */,
650672
748D424E210FB1F500CF7D1B /* order-stats-day.json in Resources */,
651673
743FDB9E210FB36900AC737F /* order-stats-week.json in Resources */,
652674
74A1D264211898F000931DFA /* site-visits-week.json in Resources */,
675+
74A7B4BE217A841400E85A8B /* broken-settings-general.json in Resources */,
653676
743FDB9D210FB36900AC737F /* order-stats-year.json in Resources */,
654677
74ABA1CB213F19FE00FFAD30 /* top-performers-week.json in Resources */,
655678
B559EBAA20A0B5CD00836CD4 /* orders-load-all.json in Resources */,
@@ -749,6 +772,7 @@
749772
7452387221124B7700A973CD /* AnyEncodable.swift in Sources */,
750773
74ABA1CD213F1B6B00FFAD30 /* TopEarnerStats.swift in Sources */,
751774
B557DA0220975500005962F4 /* JetpackRequest.swift in Sources */,
775+
74046E1F217A6B70007DD7BF /* SiteSettingsMapper.swift in Sources */,
752776
B56C1EB820EA76F500D749F9 /* Site.swift in Sources */,
753777
B505F6CD20BEE37E00BB1B69 /* AccountMapper.swift in Sources */,
754778
B556FD69211CE2EC00B5DAE7 /* HTTPStatusCode.swift in Sources */,
@@ -767,13 +791,15 @@
767791
B518662420A099BF00037A38 /* AlamofireNetwork.swift in Sources */,
768792
B557DA1820979D51005962F4 /* Credentials.swift in Sources */,
769793
CE583A0E2109154500D73C1C /* OrderNoteMapper.swift in Sources */,
794+
74046E1B217A684D007DD7BF /* SiteSettingsRemote.swift in Sources */,
770795
B5C6FCCF20A3592900A4F8E4 /* OrderItem.swift in Sources */,
771796
748D424A210F92EA00CF7D1B /* OrderStatsItem.swift in Sources */,
772797
74A1D26B21189B8100931DFA /* SiteVisitStatsItem.swift in Sources */,
773798
B505F6EC20BEFDC200BB1B69 /* Loader.swift in Sources */,
774799
74D3BD142114FE6900A6E85E /* MIContainer.swift in Sources */,
775800
B5BB1D1220A255EC00112D92 /* OrderStatus.swift in Sources */,
776801
74C8F06820EEB7BD00B6EDC9 /* OrderNotesMapper.swift in Sources */,
802+
74046E1D217A6989007DD7BF /* SiteSetting.swift in Sources */,
777803
B5BB1D1020A237FB00112D92 /* Address.swift in Sources */,
778804
B557DA0420975500005962F4 /* OrdersRemote.swift in Sources */,
779805
B5C6FCD420A373BB00A4F8E4 /* OrderMapper.swift in Sources */,
@@ -790,6 +816,8 @@
790816
buildActionMask = 2147483647;
791817
files = (
792818
74CF5E8421402C04000CED0A /* TopEarnerStatsRemoteTests.swift in Sources */,
819+
74D5BECE217E0F98007B0348 /* SiteSettingsRemoteTests.swift in Sources */,
820+
74A7B4BC217A807400E85A8B /* SiteSettingsMapperTests.swift in Sources */,
793821
74AE244D2113704C00CA8C54 /* OrderStatsRemoteTests.swift in Sources */,
794822
B505F6D320BEE3A500BB1B69 /* AccountMapperTests.swift in Sources */,
795823
B5C6FCC820A32E4800A4F8E4 /* DateFormatterWooTests.swift in Sources */,
Lines changed: 39 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,39 @@
1+
import Foundation
2+
3+
4+
/// Mapper: SiteSettings
5+
///
6+
struct SiteSettingsMapper: Mapper {
7+
8+
/// Site Identifier associated to the settings that will be parsed.
9+
/// We're injecting this field via `JSONDecoder.userInfo` because the remote endpoints don't really return the SiteID in any of the
10+
/// settings endpoints.
11+
///
12+
let siteID: Int
13+
14+
15+
/// (Attempts) to convert a dictionary into [SiteSetting].
16+
///
17+
func map(response: Data) throws -> [SiteSetting] {
18+
let decoder = JSONDecoder()
19+
decoder.dateDecodingStrategy = .formatted(DateFormatter.Defaults.dateTimeFormatter)
20+
decoder.userInfo = [
21+
.siteID: siteID
22+
]
23+
24+
return try decoder.decode(SiteSettingsEnvelope.self, from: response).settings
25+
}
26+
}
27+
28+
29+
/// SiteSettingsEnvelope Disposable Entity:
30+
/// The settings endpoint returns the settings document within a `data` key. This entity
31+
/// allows us to do parse all the things with JSONDecoder.
32+
///
33+
private struct SiteSettingsEnvelope: Decodable {
34+
let settings: [SiteSetting]
35+
36+
private enum CodingKeys: String, CodingKey {
37+
case settings = "data"
38+
}
39+
}
Lines changed: 84 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,84 @@
1+
import Foundation
2+
3+
4+
/// Represents a specific setting entity for a specific site.
5+
///
6+
public struct SiteSetting: Decodable {
7+
public let siteID: Int
8+
public let settingID: String
9+
public let label: String
10+
public let settingDescription: String
11+
public let value: String
12+
13+
/// OrderNote struct initializer.
14+
///
15+
public init(siteID: Int, settingID: String, label: String, description: String, value: String) {
16+
self.siteID = siteID
17+
self.settingID = settingID
18+
self.label = label
19+
self.settingDescription = description
20+
self.value = value
21+
}
22+
23+
/// The public initializer for SiteSetting.
24+
///
25+
public init(from decoder: Decoder) throws {
26+
guard let siteID = decoder.userInfo[.siteID] as? Int else {
27+
throw SiteSettingError.missingSiteID
28+
}
29+
30+
let container = try decoder.container(keyedBy: CodingKeys.self)
31+
let settingID = try container.decode(String.self, forKey: .settingID)
32+
let label = try container.decodeIfPresent(String.self, forKey: .label) ?? ""
33+
let settingDescription = try container.decodeIfPresent(String.self, forKey: .settingDescription) ?? ""
34+
35+
// Note: `value` is a mixed type per the documentation — usually a String but could be an Array, Int, etc
36+
// For the specific settings we are interested in, it is a String type.
37+
// See: https://woocommerce.github.io/woocommerce-rest-api-docs/#setting-options for more details.
38+
var value = ""
39+
if let stringValue = try? container.decode(String.self, forKey: .value) {
40+
value = stringValue
41+
} else {
42+
DDLogWarn("⚠️ Could not successfully decode SiteSetting value for \(settingID)")
43+
}
44+
45+
self.init(siteID: siteID, settingID: settingID, label: label, description: settingDescription, value: value) // initialize the struct
46+
}
47+
}
48+
49+
50+
/// Defines all of the SiteSetting CodingKeys.
51+
///
52+
private extension SiteSetting {
53+
54+
enum CodingKeys: String, CodingKey {
55+
case settingID = "id"
56+
case label = "label"
57+
case settingDescription = "description"
58+
case value = "value"
59+
}
60+
}
61+
62+
63+
// MARK: - Comparable Conformance
64+
//
65+
extension SiteSetting: Comparable {
66+
public static func == (lhs: SiteSetting, rhs: SiteSetting) -> Bool {
67+
return lhs.settingID == rhs.settingID &&
68+
lhs.label == rhs.label &&
69+
lhs.settingDescription == rhs.settingDescription &&
70+
lhs.value == rhs.value
71+
}
72+
73+
public static func < (lhs: SiteSetting, rhs: SiteSetting) -> Bool {
74+
return lhs.settingID < rhs.settingID ||
75+
(lhs.settingID == rhs.settingID && lhs.label < rhs.label)
76+
}
77+
}
78+
79+
80+
// MARK: - Decoding Errors
81+
//
82+
enum SiteSettingError: Error {
83+
case missingSiteID
84+
}
Lines changed: 31 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,31 @@
1+
import Foundation
2+
import Alamofire
3+
4+
5+
/// SiteSettings: Remote Endpoints
6+
///
7+
public class SiteSettingsRemote: Remote {
8+
9+
/// Retrieves all of the general `SiteSetting`s for a given site.
10+
///
11+
/// - Parameters:
12+
/// - siteID: Site for which we'll fetch the general settings.
13+
/// - completion: Closure to be executed upon completion.
14+
///
15+
public func loadGeneralSettings(for siteID: Int, completion: @escaping ([SiteSetting]?, Error?) -> Void) {
16+
let path = Constants.generalSettingsPath
17+
let request = JetpackRequest(wooApiVersion: .mark2, method: .get, siteID: siteID, path: path, parameters: nil)
18+
let mapper = SiteSettingsMapper(siteID: siteID)
19+
20+
enqueue(request, mapper: mapper, completion: completion)
21+
}
22+
}
23+
24+
25+
// MARK: - Constants!
26+
//
27+
private extension SiteSettingsRemote {
28+
enum Constants {
29+
static let generalSettingsPath: String = "settings/general"
30+
}
31+
}

0 commit comments

Comments
 (0)