diff --git a/apple/OmnivoreKit/Sources/Models/DataModels/FeedItem.swift b/apple/OmnivoreKit/Sources/Models/DataModels/FeedItem.swift index b35a92d31..f4cae84a9 100644 --- a/apple/OmnivoreKit/Sources/Models/DataModels/FeedItem.swift +++ b/apple/OmnivoreKit/Sources/Models/DataModels/FeedItem.swift @@ -161,9 +161,9 @@ public extension FeedItemDep { linkedItem.isArchived = isArchived linkedItem.contentReader = contentReader - // for label in item.labels { - // TODO: append labels...and highlights? - // } +// for label in labels { +// // TODO: fix +// } return linkedItem } diff --git a/apple/OmnivoreKit/Sources/Services/InternalModels/InternalLinkedItem.swift b/apple/OmnivoreKit/Sources/Services/InternalModels/InternalLinkedItem.swift index df6a2adf2..7c986944e 100644 --- a/apple/OmnivoreKit/Sources/Services/InternalModels/InternalLinkedItem.swift +++ b/apple/OmnivoreKit/Sources/Services/InternalModels/InternalLinkedItem.swift @@ -20,10 +20,11 @@ struct InternalLinkedItem { let slug: String let isArchived: Bool let contentReader: String? - var labels: [FeedItemLabelDep] + var labels: [InternalLinkedItemLabel] func asManagedObject(inContext context: NSManagedObjectContext) -> LinkedItem { - let linkedItem = LinkedItem(entity: LinkedItem.entity(), insertInto: context) + let existingItem = LinkedItem.lookup(byID: id, inContext: context) + let linkedItem = existingItem ?? LinkedItem(entity: LinkedItem.entity(), insertInto: context) linkedItem.id = id linkedItem.title = title @@ -42,9 +43,9 @@ struct InternalLinkedItem { linkedItem.isArchived = isArchived linkedItem.contentReader = contentReader - // for label in item.labels { - // TODO: append labels - // } + for label in labels { + linkedItem.addToLabels(label.asManagedObject(inContext: context)) + } return linkedItem } diff --git a/apple/OmnivoreKit/Sources/Services/InternalModels/InternalLinkedItemLabel.swift b/apple/OmnivoreKit/Sources/Services/InternalModels/InternalLinkedItemLabel.swift new file mode 100644 index 000000000..511d5ee92 --- /dev/null +++ b/apple/OmnivoreKit/Sources/Services/InternalModels/InternalLinkedItemLabel.swift @@ -0,0 +1,58 @@ +import CoreData +import Foundation +import Models + +struct InternalLinkedItemLabel { + let id: String + let name: String + let color: String + let createdAt: Date? + let labelDescription: String? + + func persist(context: NSManagedObjectContext) -> NSManagedObjectID? { + var objectID: NSManagedObjectID? + + context.performAndWait { + let label = asManagedObject(inContext: context) + + do { + try context.save() + logger.debug("NewsletterEmail saved succesfully") + objectID = label.objectID + } catch { + context.rollback() + logger.debug("Failed to save NewsletterEmail: \(error.localizedDescription)") + } + } + + return objectID + } + + func asManagedObject(inContext context: NSManagedObjectContext) -> LinkedItemLabel { + let existingItem = LinkedItemLabel.lookup(byID: id, inContext: context) + let label = existingItem ?? LinkedItemLabel(entity: LinkedItemLabel.entity(), insertInto: context) + label.id = id + label.name = name + label.color = color + label.createdAt = createdAt + label.labelDescription = labelDescription + return label + } +} + +extension LinkedItemLabel { + static func lookup(byID labelID: String, inContext context: NSManagedObjectContext) -> LinkedItemLabel? { + let fetchRequest: NSFetchRequest = LinkedItemLabel.fetchRequest() + fetchRequest.predicate = NSPredicate( + format: "id == %@", labelID + ) + + var label: LinkedItemLabel? + + context.performAndWait { + label = (try? context.fetch(fetchRequest))?.first + } + + return label + } +}