From 65b448f262d2fa0e61046859f574c1b58b8b77eb Mon Sep 17 00:00:00 2001 From: Satindar Dhillon Date: Sat, 23 Apr 2022 09:48:53 -0700 Subject: [PATCH] fix update and delete label publishers --- .../Mutations/RemoveLabelPublisher.swift | 8 +++- .../DataService/Mutations/RemoveLink.swift | 4 +- .../UpdateArticleLabelsPublisher.swift | 25 +++++++++-- .../InternalLinkedItemLabel.swift | 45 +++++++++++++++++++ 4 files changed, 75 insertions(+), 7 deletions(-) diff --git a/apple/OmnivoreKit/Sources/Services/DataService/Mutations/RemoveLabelPublisher.swift b/apple/OmnivoreKit/Sources/Services/DataService/Mutations/RemoveLabelPublisher.swift index 49c258650..8aa9ab449 100644 --- a/apple/OmnivoreKit/Sources/Services/DataService/Mutations/RemoveLabelPublisher.swift +++ b/apple/OmnivoreKit/Sources/Services/DataService/Mutations/RemoveLabelPublisher.swift @@ -37,8 +37,12 @@ public extension DataService { switch payload.data { case .success: - // TODO: -labels update CoreData - promise(.success(true)) + if let label = LinkedItemLabel.lookup(byID: labelID, inContext: self.backgroundContext) { + label.remove(inContext: self.backgroundContext) + promise(.success(true)) + } else { + promise(.failure(.message(messageText: "Error removing label"))) + } case .error: promise(.failure(.message(messageText: "Error removing label"))) } diff --git a/apple/OmnivoreKit/Sources/Services/DataService/Mutations/RemoveLink.swift b/apple/OmnivoreKit/Sources/Services/DataService/Mutations/RemoveLink.swift index 511d43efe..48a7fdd22 100644 --- a/apple/OmnivoreKit/Sources/Services/DataService/Mutations/RemoveLink.swift +++ b/apple/OmnivoreKit/Sources/Services/DataService/Mutations/RemoveLink.swift @@ -50,11 +50,11 @@ public extension DataService { } switch payload.data { - case let .success(item): + case .success: if let linkedItem = LinkedItem.lookup(byID: itemID, inContext: self.backgroundContext) { linkedItem.remove(inContext: self.backgroundContext) } - promise(.success(item)) + promise(.success(itemID)) case .error(errorCode: _): promise(.failure(.message(messageText: "Error removing link"))) } diff --git a/apple/OmnivoreKit/Sources/Services/DataService/Mutations/UpdateArticleLabelsPublisher.swift b/apple/OmnivoreKit/Sources/Services/DataService/Mutations/UpdateArticleLabelsPublisher.swift index 336b7035a..5d0fc7916 100644 --- a/apple/OmnivoreKit/Sources/Services/DataService/Mutations/UpdateArticleLabelsPublisher.swift +++ b/apple/OmnivoreKit/Sources/Services/DataService/Mutations/UpdateArticleLabelsPublisher.swift @@ -45,9 +45,28 @@ public extension DataService { switch payload.data { case let .saved(labels): - // TODO: -labels update CoreData and fix dis - promise(.failure(.message(messageText: "failed to set labels"))) -// promise(.success(labels)) + guard let linkedItem = LinkedItem.lookup(byID: itemID, inContext: self.backgroundContext) else { + promise(.failure(.message(messageText: "failed to set labels"))) + return + } + + self.backgroundContext.perform { + if let existingLabels = linkedItem.labels { + linkedItem.removeFromLabels(existingLabels) + } + linkedItem.addToLabels(NSSet(array: labels)) + } + + do { + try self.backgroundContext.save() + logger.debug("Item labels updated") + let labelObjects = linkedItem.labels.asArray(of: LinkedItemLabel.self) + promise(.success(labelObjects.map(\.objectID))) + } catch { + self.backgroundContext.rollback() + logger.debug("Failed to update item labels: \(error.localizedDescription)") + promise(.failure(.message(messageText: "failed to set labels"))) + } case .error: promise(.failure(.message(messageText: "failed to set labels"))) } diff --git a/apple/OmnivoreKit/Sources/Services/InternalModels/InternalLinkedItemLabel.swift b/apple/OmnivoreKit/Sources/Services/InternalModels/InternalLinkedItemLabel.swift index cd243f606..79f154c28 100644 --- a/apple/OmnivoreKit/Sources/Services/InternalModels/InternalLinkedItemLabel.swift +++ b/apple/OmnivoreKit/Sources/Services/InternalModels/InternalLinkedItemLabel.swift @@ -55,6 +55,51 @@ extension LinkedItemLabel { return label } + + func update( + inContext context: NSManagedObjectContext, + newName: String? = nil, + newColor: String? = nil, + newLabelDescription: String? = nil + ) { + context.perform { + if let newName = newName { + self.name = newName + } + + if let newColor = newColor { + self.color = newColor + } + + if let newLabelDescription = newLabelDescription { + self.labelDescription = newLabelDescription + } + + guard context.hasChanges else { return } + + do { + try context.save() + logger.debug("LinkedItemLabel updated succesfully") + } catch { + context.rollback() + logger.debug("Failed to update LinkedItemLabel: \(error.localizedDescription)") + } + } + } + + func remove(inContext context: NSManagedObjectContext) { + context.perform { + context.delete(self) + + do { + try context.save() + logger.debug("LinkedItemLabel removed") + } catch { + context.rollback() + logger.debug("Failed to remove LinkedItemLabel: \(error.localizedDescription)") + } + } + } } extension Sequence where Element == InternalLinkedItemLabel {