Skip to content

Commit f416265

Browse files
committed
Save product/variation entities with relationships
1 parent b37d574 commit f416265

File tree

4 files changed

+63
-17
lines changed

4 files changed

+63
-17
lines changed

Modules/Sources/Storage/GRDB/Model/PersistedProduct.swift

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -67,7 +67,7 @@ extension PersistedProduct: FetchableRecord, PersistableRecord {
6767
static let stockQuantity = Column(CodingKeys.stockQuantity)
6868
static let stockStatusKey = Column(CodingKeys.stockStatusKey)
6969
}
70-
70+
7171
public static let images = hasMany(PersistedProductImage.self)
7272
public static let attributes = hasMany(PersistedProductAttribute.self)
7373
}

Modules/Sources/Storage/GRDB/Model/PersistedProductVariation.swift

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -55,7 +55,7 @@ extension PersistedProductVariation: FetchableRecord, PersistableRecord {
5555
static let stockQuantity = Column(CodingKeys.stockQuantity)
5656
static let stockStatusKey = Column(CodingKeys.stockStatusKey)
5757
}
58-
58+
5959
public static let attributes = hasMany(PersistedProductVariationAttribute.self)
6060
public static let image = hasOne(PersistedProductVariationImage.self)
6161
}

Modules/Sources/Yosemite/Model/Storage/PersistedProduct+Conversions.swift

Lines changed: 33 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@ import Storage
33

44
// MARK: - PersistedProduct Conversions
55
extension PersistedProduct {
6-
public init(from posProduct: POSProduct) {
6+
init(from posProduct: POSProduct) {
77
self.init(
88
id: posProduct.productID,
99
siteID: posProduct.siteID,
@@ -21,8 +21,8 @@ extension PersistedProduct {
2121
stockStatusKey: posProduct.stockStatusKey
2222
)
2323
}
24-
25-
public func toPOSProduct(images: [ProductImage] = [], attributes: [ProductAttribute] = []) -> POSProduct {
24+
25+
func toPOSProduct(images: [ProductImage] = [], attributes: [ProductAttribute] = []) -> POSProduct {
2626
return POSProduct(
2727
siteID: siteID,
2828
productID: id,
@@ -43,7 +43,7 @@ extension PersistedProduct {
4343
)
4444
}
4545

46-
public func toPOSProduct(db: GRDBDatabaseConnection) throws -> POSProduct {
46+
func toPOSProduct(db: GRDBDatabaseConnection) throws -> POSProduct {
4747
let images = try db.read { db in
4848
return try request(for: PersistedProduct.images).fetchAll(db)
4949
}
@@ -55,11 +55,34 @@ extension PersistedProduct {
5555
attributes: attributes.map { $0.toProductAttribute(siteID: siteID) }
5656
)
5757
}
58+
59+
}
60+
61+
// MARK: - POSProduct Storage Extensions
62+
extension POSProduct {
63+
public func save(to db: GRDBDatabaseConnection) throws {
64+
try db.write { db in
65+
let product = PersistedProduct(from: self)
66+
try product.insert(db)
67+
68+
// Save related images
69+
for image in self.images {
70+
let persistedImage = PersistedProductImage(from: image, productID: self.productID)
71+
try persistedImage.insert(db)
72+
}
73+
74+
// Save related attributes
75+
for attribute in self.attributes {
76+
var persistedAttribute = PersistedProductAttribute(from: attribute, productID: self.productID)
77+
try persistedAttribute.insert(db)
78+
}
79+
}
80+
}
5881
}
5982

6083
// MARK: - PersistedProductAttribute Conversions
6184
extension PersistedProductAttribute {
62-
public init(from productAttribute: ProductAttribute, productID: Int64) {
85+
init(from productAttribute: ProductAttribute, productID: Int64) {
6386
self.init(
6487
productID: productID,
6588
name: productAttribute.name,
@@ -69,8 +92,8 @@ extension PersistedProductAttribute {
6992
options: productAttribute.options
7093
)
7194
}
72-
73-
public func toProductAttribute(siteID: Int64) -> ProductAttribute {
95+
96+
func toProductAttribute(siteID: Int64) -> ProductAttribute {
7497
return ProductAttribute(
7598
siteID: siteID,
7699
attributeID: 0,
@@ -85,7 +108,7 @@ extension PersistedProductAttribute {
85108

86109
// MARK: - PersistedProductImage Conversions
87110
extension PersistedProductImage {
88-
public init(from productImage: ProductImage, productID: Int64) {
111+
init(from productImage: ProductImage, productID: Int64) {
89112
self.init(
90113
id: productImage.imageID,
91114
productID: productID,
@@ -96,8 +119,8 @@ extension PersistedProductImage {
96119
alt: productImage.alt
97120
)
98121
}
99-
100-
public func toProductImage() -> ProductImage {
122+
123+
func toProductImage() -> ProductImage {
101124
return ProductImage(
102125
imageID: id,
103126
dateCreated: dateCreated,

Modules/Sources/Yosemite/Model/Storage/PersistedProductVariation+Conversions.swift

Lines changed: 28 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@ import Storage
33

44
// MARK: - PersistedProductVariation Conversions
55
extension PersistedProductVariation {
6-
public init(from posProductVariation: POSProductVariation) {
6+
init(from posProductVariation: POSProductVariation) {
77
self.init(
88
id: posProductVariation.productVariationID,
99
siteID: posProductVariation.siteID,
@@ -19,7 +19,7 @@ extension PersistedProductVariation {
1919
)
2020
}
2121

22-
public func toPOSProductVariation(attributes: [ProductVariationAttribute] = [], image: ProductImage? = nil) -> POSProductVariation {
22+
func toPOSProductVariation(attributes: [ProductVariationAttribute] = [], image: ProductImage? = nil) -> POSProductVariation {
2323
return POSProductVariation(
2424
siteID: siteID,
2525
productID: productID,
@@ -37,7 +37,7 @@ extension PersistedProductVariation {
3737
)
3838
}
3939

40-
public func toPOSProductVariation(db: GRDBDatabaseConnection) throws -> POSProductVariation {
40+
func toPOSProductVariation(db: GRDBDatabaseConnection) throws -> POSProductVariation {
4141
let image = try db.read { db in
4242
return try request(for: PersistedProductVariation.image).fetchOne(db)
4343
}
@@ -49,19 +49,42 @@ extension PersistedProductVariation {
4949
image: image?.toProductImage()
5050
)
5151
}
52+
53+
}
54+
55+
// MARK: - POSProductVariation Storage Extensions
56+
extension POSProductVariation {
57+
public func save(to db: GRDBDatabaseConnection) throws {
58+
try db.write { db in
59+
let variation = PersistedProductVariation(from: self)
60+
try variation.insert(db)
61+
62+
// Save related image if present
63+
if let image = self.image {
64+
let persistedImage = PersistedProductVariationImage(from: image, productVariationID: self.productVariationID)
65+
try persistedImage.insert(db)
66+
}
67+
68+
// Save related attributes
69+
for attribute in self.attributes {
70+
var persistedAttribute = PersistedProductVariationAttribute(from: attribute, productVariationID: self.productVariationID)
71+
try persistedAttribute.insert(db)
72+
}
73+
}
74+
}
5275
}
5376

5477
// MARK: - PersistedProductVariationAttribute Conversions
5578
extension PersistedProductVariationAttribute {
56-
public init(from productVariationAttribute: ProductVariationAttribute, productVariationID: Int64) {
79+
init(from productVariationAttribute: ProductVariationAttribute, productVariationID: Int64) {
5780
self.init(
5881
productVariationID: productVariationID,
5982
name: productVariationAttribute.name,
6083
option: productVariationAttribute.option
6184
)
6285
}
6386

64-
public func toProductVariationAttribute() -> ProductVariationAttribute {
87+
func toProductVariationAttribute() -> ProductVariationAttribute {
6588
return ProductVariationAttribute(
6689
id: id ?? 0,
6790
name: name,

0 commit comments

Comments
 (0)