diff --git a/apple/OmnivoreKit/Sources/Models/FeedItem.swift b/apple/OmnivoreKit/Sources/Models/FeedItem.swift index c791b3f2c..806b66dc3 100644 --- a/apple/OmnivoreKit/Sources/Models/FeedItem.swift +++ b/apple/OmnivoreKit/Sources/Models/FeedItem.swift @@ -1,3 +1,4 @@ +import CoreData import Foundation public struct HomeFeedData { @@ -10,6 +11,29 @@ public struct HomeFeedData { } } +public class FeedItemManagedObject: NSManagedObject { + static let entityName = "FeedItemManagedObject" + + @NSManaged public var id: String + @NSManaged public var title: String + @NSManaged public var createdAt: Date + @NSManaged public var savedAt: Date + @NSManaged public var readingProgress: Double + @NSManaged public var readingProgressAnchor: Int + @NSManaged public var imageURLString: String? + @NSManaged public var onDeviceImageURLString: String? + @NSManaged public var documentDirectoryPath: String? + @NSManaged public var pageURLString: String + @NSManaged public var descriptionText: String? + @NSManaged public var publisherURLString: String? + @NSManaged public var author: String? + @NSManaged public var publishDate: Date? + @NSManaged public var slug: String + @NSManaged public var isArchived: Bool + @NSManaged public var contentReader: String? + @NSManaged public var labels: Set +} + public struct FeedItem: Identifiable, Hashable { public let id: String public let title: String @@ -21,7 +45,7 @@ public struct FeedItem: Identifiable, Hashable { public let onDeviceImageURLString: String? public let documentDirectoryPath: String? public let pageURLString: String - public let description: String? + public let descriptionText: String? public let publisherURLString: String? public let author: String? public let publishDate: Date? @@ -41,7 +65,7 @@ public struct FeedItem: Identifiable, Hashable { onDeviceImageURLString: String?, documentDirectoryPath: String?, pageURLString: String, - description: String?, + descriptionText: String?, publisherURLString: String?, author: String?, publishDate: Date?, @@ -60,7 +84,7 @@ public struct FeedItem: Identifiable, Hashable { self.onDeviceImageURLString = onDeviceImageURLString self.documentDirectoryPath = documentDirectoryPath self.pageURLString = pageURLString - self.description = description + self.descriptionText = descriptionText self.publisherURLString = publisherURLString self.author = author self.publishDate = publishDate @@ -70,6 +94,40 @@ public struct FeedItem: Identifiable, Hashable { self.labels = labels } + func toManagedObject(inContext context: NSManagedObjectContext) -> FeedItemManagedObject? { + guard let entityDescription = NSEntityDescription.entity(forEntityName: FeedItemManagedObject.entityName, in: context) else { + print("Failed to create \(FeedItemManagedObject.entityName)") + return nil + } + + let object = FeedItemManagedObject(entity: entityDescription, insertInto: context) + object.id = id + object.title = title + object.createdAt = createdAt + object.savedAt = savedAt + object.readingProgress = readingProgress + object.readingProgressAnchor = readingProgressAnchor + object.imageURLString = imageURLString + object.onDeviceImageURLString = onDeviceImageURLString + object.documentDirectoryPath = documentDirectoryPath + object.pageURLString = pageURLString + object.descriptionText = descriptionText + object.publisherURLString = publisherURLString + object.author = author + object.publishDate = publishDate + object.slug = slug + object.isArchived = isArchived + object.contentReader = contentReader + + for label in labels { + if let managedLabel = label.toManagedObject(inContext: context) { + object.labels.insert(managedLabel) + } + } + + return object + } + public static func fromJsonArticle(linkData: Data) -> FeedItem? { try? JSONDecoder().decode(JSONArticle.self, from: linkData).feedItem } @@ -126,7 +184,7 @@ struct JSONArticle: Decodable { onDeviceImageURLString: nil, documentDirectoryPath: nil, pageURLString: url, - description: title, + descriptionText: title, publisherURLString: nil, author: nil, publishDate: nil, diff --git a/apple/OmnivoreKit/Sources/Models/FeedItemLabel.swift b/apple/OmnivoreKit/Sources/Models/FeedItemLabel.swift index 14a157a02..04161da22 100644 --- a/apple/OmnivoreKit/Sources/Models/FeedItemLabel.swift +++ b/apple/OmnivoreKit/Sources/Models/FeedItemLabel.swift @@ -1,3 +1,4 @@ +import CoreData import Foundation public struct FeedItemLabel: Decodable, Hashable { @@ -5,19 +6,45 @@ public struct FeedItemLabel: Decodable, Hashable { public let name: String public let color: String public let createdAt: Date? - public let description: String? + public let labelDescription: String? public init( id: String, name: String, color: String, createdAt: Date?, - description: String? + labelDescription: String? ) { self.id = id self.name = name self.color = color self.createdAt = createdAt - self.description = description + self.labelDescription = labelDescription + } + + func toManagedObject(inContext context: NSManagedObjectContext) -> FeedItemLabelManagedObject? { + let entityName = FeedItemLabelManagedObject.entityName + guard let entityDescription = NSEntityDescription.entity(forEntityName: entityName, in: context) else { + print("Failed to create \(entityName)") + return nil + } + + let object = FeedItemLabelManagedObject(entity: entityDescription, insertInto: context) + object.id = id + object.name = name + object.color = color + object.createdAt = createdAt + object.labelDescription = labelDescription + return object } } + +public class FeedItemLabelManagedObject: NSManagedObject { + static let entityName = "FeedItemLabelManagedObject" + + @NSManaged public var id: String + @NSManaged public var name: String + @NSManaged public var color: String + @NSManaged public var createdAt: Date? + @NSManaged public var labelDescription: String? +} diff --git a/apple/OmnivoreKit/Sources/Services/DataService/Queries/LibraryItemsQuery.swift b/apple/OmnivoreKit/Sources/Services/DataService/Queries/LibraryItemsQuery.swift index 532ffe88f..f2aaa530d 100644 --- a/apple/OmnivoreKit/Sources/Services/DataService/Queries/LibraryItemsQuery.swift +++ b/apple/OmnivoreKit/Sources/Services/DataService/Queries/LibraryItemsQuery.swift @@ -137,7 +137,7 @@ let homeFeedItemSelection = Selection.Article { onDeviceImageURLString: nil, documentDirectoryPath: nil, pageURLString: try $0.url(), - description: try $0.description(), + descriptionText: try $0.description(), publisherURLString: try $0.originalArticleUrl(), author: try $0.author(), publishDate: try $0.publishedAt()?.value, diff --git a/apple/OmnivoreKit/Sources/Services/DataService/Selections/FeedItemLabelSelection.swift b/apple/OmnivoreKit/Sources/Services/DataService/Selections/FeedItemLabelSelection.swift index 998dc8dea..2b0abade0 100644 --- a/apple/OmnivoreKit/Sources/Services/DataService/Selections/FeedItemLabelSelection.swift +++ b/apple/OmnivoreKit/Sources/Services/DataService/Selections/FeedItemLabelSelection.swift @@ -7,6 +7,6 @@ let feedItemLabelSelection = Selection.Label { name: try $0.name(), color: try $0.color(), createdAt: try $0.createdAt()?.value, - description: try $0.description() + labelDescription: try $0.description() ) } diff --git a/apple/OmnivoreKit/Sources/Views/FeedItem/GridCard.swift b/apple/OmnivoreKit/Sources/Views/FeedItem/GridCard.swift index 692e430ad..3d75ed4b0 100644 --- a/apple/OmnivoreKit/Sources/Views/FeedItem/GridCard.swift +++ b/apple/OmnivoreKit/Sources/Views/FeedItem/GridCard.swift @@ -117,7 +117,7 @@ public struct GridCard: View { // Link description and image HStack(alignment: .top) { - Text(item.description ?? item.title) + Text(item.descriptionText ?? item.title) .font(.appSubheadline) .foregroundColor(.appGrayTextContrast) .lineLimit(nil)