Skip to content

Commit 9db935b

Browse files
authored
Shipping Labels: Persist origin addresses upon fetching from remote (#15932)
2 parents 1443830 + 367c36a commit 9db935b

File tree

21 files changed

+354
-41
lines changed

21 files changed

+354
-41
lines changed

Modules/Sources/Fakes/Networking.generated.swift

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2383,6 +2383,7 @@ extension Networking.WooShippingOriginAddress {
23832383
///
23842384
public static func fake() -> Networking.WooShippingOriginAddress {
23852385
.init(
2386+
siteID: .fake(),
23862387
id: .fake(),
23872388
company: .fake(),
23882389
address1: .fake(),

Modules/Sources/Networking/Mapper/WooShippingOriginAddressMapper.swift

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,17 @@
11
import Foundation
22

33
struct WooShippingOriginAddressUpdateMapper: Mapper {
4+
/// Site ID associated to the origin addresses that will be parsed.
5+
///
6+
/// We're injecting this field via `JSONDecoder.userInfo` because SiteID is not returned from the remote.
7+
///
8+
let siteID: Int64
9+
410
/// (Attempts) to convert a dictionary into a WooShippingOriginAddressUpdate.
511
///
612
func map(response: Data) throws -> WooShippingOriginAddressUpdate {
713
let decoder = JSONDecoder()
14+
decoder.userInfo = [.siteID: siteID]
815
if hasDataEnvelope(in: response) {
916
return try decoder.decode(WooShippingOriginAddressUpdateMapperEnvelope.self, from: response).data
1017
} else {

Modules/Sources/Networking/Mapper/WooShippingOriginAddressesMapper.swift

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,18 @@
11
import Foundation
22

33
struct WooShippingOriginAddressesMapper: Mapper {
4+
5+
/// Site ID associated to the origin addresses that will be parsed.
6+
///
7+
/// We're injecting this field via `JSONDecoder.userInfo` because SiteID is not returned from the remote.
8+
///
9+
let siteID: Int64
10+
411
/// (Attempts) to convert a dictionary into WooShippingOriginAddress array.
512
///
613
func map(response: Data) throws -> [WooShippingOriginAddress] {
714
let decoder = JSONDecoder()
15+
decoder.userInfo = [.siteID: siteID]
816
if hasDataEnvelope(in: response) {
917
return try decoder.decode(WooShippingOriginAddressesMapperEnvelope.self, from: response).data
1018
} else {

Modules/Sources/Networking/Model/Copiable/Models+Copiable.generated.swift

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3636,6 +3636,7 @@ extension Networking.WooShippingNormalizedAddress {
36363636

36373637
extension Networking.WooShippingOriginAddress {
36383638
public func copy(
3639+
siteID: CopiableProp<Int64> = .copy,
36393640
id: CopiableProp<String> = .copy,
36403641
company: CopiableProp<String> = .copy,
36413642
address1: CopiableProp<String> = .copy,
@@ -3651,6 +3652,7 @@ extension Networking.WooShippingOriginAddress {
36513652
defaultAddress: CopiableProp<Bool> = .copy,
36523653
isVerified: CopiableProp<Bool> = .copy
36533654
) -> Networking.WooShippingOriginAddress {
3655+
let siteID = siteID ?? self.siteID
36543656
let id = id ?? self.id
36553657
let company = company ?? self.company
36563658
let address1 = address1 ?? self.address1
@@ -3667,6 +3669,7 @@ extension Networking.WooShippingOriginAddress {
36673669
let isVerified = isVerified ?? self.isVerified
36683670

36693671
return Networking.WooShippingOriginAddress(
3672+
siteID: siteID,
36703673
id: id,
36713674
company: company,
36723675
address1: address1,

Modules/Sources/Networking/Model/ShippingLabel/Packages/WooShippingOriginAddress.swift

Lines changed: 14 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@ import Foundation
22
import Codegen
33

44
public struct WooShippingOriginAddress: Identifiable, Equatable, GeneratedFakeable, GeneratedCopiable {
5+
public let siteID: Int64
56
public let id: String
67
public let company: String
78
public let address1: String
@@ -17,7 +18,8 @@ public struct WooShippingOriginAddress: Identifiable, Equatable, GeneratedFakeab
1718
public let defaultAddress: Bool
1819
public let isVerified: Bool
1920

20-
public init(id: String,
21+
public init(siteID: Int64,
22+
id: String,
2123
company: String,
2224
address1: String,
2325
address2: String,
@@ -32,6 +34,7 @@ public struct WooShippingOriginAddress: Identifiable, Equatable, GeneratedFakeab
3234
defaultAddress:
3335
Bool,
3436
isVerified: Bool) {
37+
self.siteID = siteID
3538
self.id = id
3639
self.company = company
3740
self.address1 = address1
@@ -52,6 +55,9 @@ public struct WooShippingOriginAddress: Identifiable, Equatable, GeneratedFakeab
5255
// MARK: Decodable
5356
extension WooShippingOriginAddress: Codable {
5457
public init(from decoder: Decoder) throws {
58+
guard let siteID = decoder.userInfo[.siteID] as? Int64 else {
59+
throw DecodingError.missingSiteID
60+
}
5561
let container = try decoder.container(keyedBy: CodingKeys.self)
5662

5763
let id = try container.decode(String.self, forKey: CodingKeys.id)
@@ -70,7 +76,8 @@ extension WooShippingOriginAddress: Codable {
7076
let defaultAddress = try container.decodeIfPresent(Bool.self, forKey: CodingKeys.defaultAddress) ?? false
7177
let isVerified = try container.decodeIfPresent(Bool.self, forKey: CodingKeys.isVerified) ?? false
7278

73-
self.init(id: id,
79+
self.init(siteID: siteID,
80+
id: id,
7481
company: company,
7582
address1: address1,
7683
address2: address2,
@@ -120,4 +127,9 @@ extension WooShippingOriginAddress: Codable {
120127
case defaultAddress = "default_address"
121128
case isVerified = "is_verified"
122129
}
130+
131+
/// Decoding Errors
132+
enum DecodingError: Error {
133+
case missingSiteID
134+
}
123135
}

Modules/Sources/Networking/Remote/WooShippingRemote.swift

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -379,7 +379,7 @@ public final class WooShippingRemote: Remote, WooShippingRemoteProtocol {
379379
path: Path.originAddresses,
380380
parameters: nil,
381381
availableAsRESTRequest: true)
382-
let mapper = WooShippingOriginAddressesMapper()
382+
let mapper = WooShippingOriginAddressesMapper(siteID: siteID)
383383

384384
enqueue(request, mapper: mapper, completion: completion)
385385
}
@@ -431,7 +431,7 @@ public final class WooShippingRemote: Remote, WooShippingRemoteProtocol {
431431
path: Path.updateOrigin,
432432
parameters: parameters,
433433
availableAsRESTRequest: true)
434-
let mapper = WooShippingOriginAddressUpdateMapper()
434+
let mapper = WooShippingOriginAddressUpdateMapper(siteID: siteID)
435435
enqueue(request, mapper: mapper, completion: completion)
436436
} catch {
437437
completion(.failure(error))

Modules/Sources/Storage/Model/MIGRATIONS.md

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,8 @@ This file documents changes in the WCiOS Storage data model. Please explain any
88
- Added `WooShippingShipmentItem` entity.
99
- Added `shipment` relationship to `ShippingLabel` entity.
1010
- Added `shipments` relationship to `Order` entity.
11+
- @itsmeichigo 2025-07-22
12+
- Added `WooShippingOriginAddress` entity.
1113

1214
## Model 123 (Release 22.8.0.0)
1315
- @iamgabrielma 2025-06-30
Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
import Foundation
2+
import CoreData
3+
4+
@objc(WooShippingOriginAddress)
5+
public class WooShippingOriginAddress: NSManagedObject {
6+
7+
}
Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,26 @@
1+
import Foundation
2+
import CoreData
3+
4+
extension WooShippingOriginAddress {
5+
6+
@nonobjc public class func fetchRequest() -> NSFetchRequest<WooShippingOriginAddress> {
7+
return NSFetchRequest<WooShippingOriginAddress>(entityName: "WooShippingOriginAddress")
8+
}
9+
10+
@NSManaged public var siteID: Int64
11+
@NSManaged public var id: String
12+
@NSManaged public var company: String
13+
@NSManaged public var address1: String
14+
@NSManaged public var address2: String
15+
@NSManaged public var city: String
16+
@NSManaged public var state: String
17+
@NSManaged public var postcode: String
18+
@NSManaged public var country: String
19+
@NSManaged public var phone: String
20+
@NSManaged public var firstName: String
21+
@NSManaged public var lastName: String
22+
@NSManaged public var email: String
23+
@NSManaged public var defaultAddress: Bool
24+
@NSManaged public var isVerified: Bool
25+
26+
}

Modules/Sources/Storage/Resources/WooCommerce.xcdatamodeld/Model 124.xcdatamodel/contents

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1041,6 +1041,23 @@
10411041
<attribute name="rawType" attributeType="String" defaultValueString=""/>
10421042
<relationship name="packagesResponse" optional="YES" maxCount="1" deletionRule="Nullify" destinationEntity="WooShippingPackagesResponse" inverseName="customPackages" inverseEntity="WooShippingPackagesResponse"/>
10431043
</entity>
1044+
<entity name="WooShippingOriginAddress" representedClassName="WooShippingOriginAddress" syncable="YES">
1045+
<attribute name="address1" attributeType="String" defaultValueString=""/>
1046+
<attribute name="address2" attributeType="String" defaultValueString=""/>
1047+
<attribute name="city" attributeType="String" defaultValueString=""/>
1048+
<attribute name="company" attributeType="String" defaultValueString=""/>
1049+
<attribute name="country" attributeType="String" defaultValueString=""/>
1050+
<attribute name="defaultAddress" attributeType="Boolean" defaultValueString="NO" usesScalarValueType="YES"/>
1051+
<attribute name="email" attributeType="String" defaultValueString=""/>
1052+
<attribute name="firstName" attributeType="String" defaultValueString=""/>
1053+
<attribute name="id" attributeType="String" defaultValueString=""/>
1054+
<attribute name="isVerified" attributeType="Boolean" defaultValueString="NO" usesScalarValueType="YES"/>
1055+
<attribute name="lastName" attributeType="String" defaultValueString=""/>
1056+
<attribute name="phone" attributeType="String" defaultValueString=""/>
1057+
<attribute name="postcode" attributeType="String" defaultValueString=""/>
1058+
<attribute name="siteID" attributeType="Integer 64" defaultValueString="0" usesScalarValueType="YES"/>
1059+
<attribute name="state" attributeType="String" defaultValueString=""/>
1060+
</entity>
10441061
<entity name="WooShippingPackagesResponse" representedClassName="WooShippingPackagesResponse" syncable="YES">
10451062
<attribute name="siteID" optional="YES" attributeType="Integer 64" defaultValueString="0" usesScalarValueType="YES"/>
10461063
<relationship name="allPredefinedOptions" toMany="YES" deletionRule="Cascade" ordered="YES" destinationEntity="WooShippingCarrierPredefinedOptions" inverseName="packagesResponse" inverseEntity="WooShippingCarrierPredefinedOptions"/>

0 commit comments

Comments
 (0)