From 5264f13ef8d000ab07dbfbb4aaf6dfd47b82328e Mon Sep 17 00:00:00 2001 From: Nathan Mattes Date: Thu, 6 Jun 2024 15:43:27 +0200 Subject: [PATCH] Remove poll-option-related persistence (IOS-182) --- .../CoreData 9.xcdatamodel/contents | 14 +- .../Entity/Mastodon/MastodonUser.swift | 1 - .../CoreDataStack/Entity/Mastodon/Poll.swift | 18 +- .../Entity/Mastodon/PollOption.swift | 210 ------------------ .../CoreDataStack/PollOption+Property.swift | 28 --- .../Persistence/Persistence+Poll.swift | 69 ------ .../Persistence/Persistence+PollOption.swift | 78 ------- 7 files changed, 2 insertions(+), 416 deletions(-) delete mode 100644 MastodonSDK/Sources/CoreDataStack/Entity/Mastodon/PollOption.swift delete mode 100644 MastodonSDK/Sources/MastodonCore/Extension/CoreDataStack/PollOption+Property.swift delete mode 100644 MastodonSDK/Sources/MastodonCore/Persistence/Persistence+PollOption.swift diff --git a/MastodonSDK/Sources/CoreDataStack/CoreData.xcdatamodeld/CoreData 9.xcdatamodel/contents b/MastodonSDK/Sources/CoreDataStack/CoreData.xcdatamodeld/CoreData 9.xcdatamodel/contents index 9e64f9623..1c83fcaee 100644 --- a/MastodonSDK/Sources/CoreDataStack/CoreData.xcdatamodeld/CoreData 9.xcdatamodel/contents +++ b/MastodonSDK/Sources/CoreDataStack/CoreData.xcdatamodeld/CoreData 9.xcdatamodel/contents @@ -1,5 +1,5 @@ - + @@ -123,7 +123,6 @@ - @@ -137,20 +136,9 @@ - - - - - - - - - - - diff --git a/MastodonSDK/Sources/CoreDataStack/Entity/Mastodon/MastodonUser.swift b/MastodonSDK/Sources/CoreDataStack/Entity/Mastodon/MastodonUser.swift index 5fa4a21e1..1593236f8 100644 --- a/MastodonSDK/Sources/CoreDataStack/Entity/Mastodon/MastodonUser.swift +++ b/MastodonSDK/Sources/CoreDataStack/Entity/Mastodon/MastodonUser.swift @@ -72,7 +72,6 @@ final public class MastodonUser: NSManagedObject { @NSManaged public private(set) var reblogged: Set @NSManaged public private(set) var muted: Set @NSManaged public private(set) var bookmarked: Set - @NSManaged public private(set) var votePollOptions: Set @NSManaged public private(set) var votePolls: Set // relationships @NSManaged public private(set) var following: Set diff --git a/MastodonSDK/Sources/CoreDataStack/Entity/Mastodon/Poll.swift b/MastodonSDK/Sources/CoreDataStack/Entity/Mastodon/Poll.swift index e76855aa9..81f71437c 100644 --- a/MastodonSDK/Sources/CoreDataStack/Entity/Mastodon/Poll.swift +++ b/MastodonSDK/Sources/CoreDataStack/Entity/Mastodon/Poll.swift @@ -39,10 +39,7 @@ public final class PollLegacy: NSManagedObject { // one-to-one relationship @NSManaged public private(set) var status: Status? - - // one-to-many relationship - @NSManaged public private(set) var options: Set - + // many-to-many relationship @NSManaged public private(set) var votedBy: Set? } @@ -316,17 +313,4 @@ extension PollLegacy: AutoUpdatableObject { } } } - - public func attach(options: [PollOptionLegacy]) { - for option in options { - guard !self.options.contains(option) else { continue } - self.mutableSetValue(forKey: #keyPath(PollLegacy.options)).add(option) - } - } -} - -public extension Set { - func sortedByIndex() -> [PollOptionLegacy] { - sorted(by: { lhs, rhs in lhs.index < rhs.index }) - } } diff --git a/MastodonSDK/Sources/CoreDataStack/Entity/Mastodon/PollOption.swift b/MastodonSDK/Sources/CoreDataStack/Entity/Mastodon/PollOption.swift deleted file mode 100644 index b61b4784c..000000000 --- a/MastodonSDK/Sources/CoreDataStack/Entity/Mastodon/PollOption.swift +++ /dev/null @@ -1,210 +0,0 @@ -// -// PollOption.swift -// CoreDataStack -// -// Created by MainasuK Cirno on 2021-3-2. -// - -import Foundation -import CoreData - -public final class PollOptionLegacy: NSManagedObject { - - // sourcery: autoGenerateProperty - @NSManaged public private(set) var index: Int64 - - // sourcery: autoUpdatableObject, autoGenerateProperty - @NSManaged public private(set) var title: String - // sourcery: autoUpdatableObject, autoGenerateProperty - @NSManaged public private(set) var votesCount: Int64 - - // sourcery: autoGenerateProperty - @NSManaged public private(set) var createdAt: Date - // sourcery: autoUpdatableObject, autoGenerateProperty - @NSManaged public private(set) var updatedAt: Date - - // sourcery: autoUpdatableObject - @NSManaged public private(set) var isSelected: Bool - - // many-to-one relationship - // sourcery: autoUpdatableObject, autoGenerateProperty - @NSManaged public private(set) var poll: PollLegacy? - - // many-to-many relationship - @NSManaged public private(set) var votedBy: Set? -} - - -extension PollOptionLegacy { - - @discardableResult - public static func insert( - into context: NSManagedObjectContext, - property: Property - ) -> PollOptionLegacy { - let object: PollOptionLegacy = context.insertObject() - - object.configure(property: property) - - return object - } - -} - -extension PollOptionLegacy: Managed { - public static var defaultSortDescriptors: [NSSortDescriptor] { - return [NSSortDescriptor(keyPath: \PollOptionLegacy.createdAt, ascending: false)] - } -} - -//extension PollOption { -// -// public override func awakeFromInsert() { -// super.awakeFromInsert() -// setPrimitiveValue(Date(), forKey: #keyPath(PollOption.createdAt)) -// } -// -// @discardableResult -// public static func insert( -// into context: NSManagedObjectContext, -// property: Property, -// votedBy: MastodonUser? -// ) -> PollOption { -// let option: PollOption = context.insertObject() -// -// option.index = property.index -// option.title = property.title -// option.votesCount = property.votesCount -// option.updatedAt = property.networkDate -// -// if let votedBy = votedBy { -// option.mutableSetValue(forKey: #keyPath(PollOption.votedBy)).add(votedBy) -// } -// -// return option -// } -// -// public func update(votesCount: Int?) { -// if self.votesCount?.intValue != votesCount { -// self.votesCount = votesCount.flatMap { NSNumber(value: $0) } -// } -// } -// -// public func didUpdate(at networkDate: Date) { -// self.updatedAt = networkDate -// } -// -//} - -//extension PollOption { -// public struct Property { -// public let index: NSNumber -// public let title: String -// public let votesCount: NSNumber? -// -// public let networkDate: Date -// -// public init(index: Int, title: String, votesCount: Int?, networkDate: Date) { -// self.index = NSNumber(value: index) -// self.title = title -// self.votesCount = votesCount.flatMap { NSNumber(value: $0) } -// self.networkDate = networkDate -// } -// } -//} -// - -// MARK: - AutoGenerateProperty -extension PollOptionLegacy: AutoGenerateProperty { - // sourcery:inline:PollOption.AutoGenerateProperty - - // Generated using Sourcery - // DO NOT EDIT - public struct Property { - public let index: Int64 - public let title: String - public let votesCount: Int64 - public let createdAt: Date - public let updatedAt: Date - public let poll: PollLegacy? - - public init( - index: Int64, - title: String, - votesCount: Int64, - createdAt: Date, - updatedAt: Date, - poll: PollLegacy? - ) { - self.index = index - self.title = title - self.votesCount = votesCount - self.createdAt = createdAt - self.updatedAt = updatedAt - self.poll = poll - } - } - - public func configure(property: Property) { - self.index = property.index - self.title = property.title - self.votesCount = property.votesCount - self.createdAt = property.createdAt - self.updatedAt = property.updatedAt - self.poll = property.poll - } - - public func update(property: Property) { - update(title: property.title) - update(votesCount: property.votesCount) - update(updatedAt: property.updatedAt) - update(poll: property.poll) - } - // sourcery:end -} - -// MARK: - AutoUpdatableObject -extension PollOptionLegacy: AutoUpdatableObject { - // sourcery:inline:PollOption.AutoUpdatableObject - - // Generated using Sourcery - // DO NOT EDIT - public func update(title: String) { - if self.title != title { - self.title = title - } - } - public func update(votesCount: Int64) { - if self.votesCount != votesCount { - self.votesCount = votesCount - } - } - public func update(updatedAt: Date) { - if self.updatedAt != updatedAt { - self.updatedAt = updatedAt - } - } - public func update(isSelected: Bool) { - if self.isSelected != isSelected { - self.isSelected = isSelected - } - } - public func update(poll: PollLegacy?) { - if self.poll != poll { - self.poll = poll - } - } - // sourcery:end - - public func update(voted: Bool, by: MastodonUser) { - if voted { - if !(self.votedBy ?? Set()).contains(by) { - self.mutableSetValue(forKey: #keyPath(PollOptionLegacy.votedBy)).add(by) - } - } else { - if (self.votedBy ?? Set()).contains(by) { - self.mutableSetValue(forKey: #keyPath(PollOptionLegacy.votedBy)).remove(by) - } - } - } -} diff --git a/MastodonSDK/Sources/MastodonCore/Extension/CoreDataStack/PollOption+Property.swift b/MastodonSDK/Sources/MastodonCore/Extension/CoreDataStack/PollOption+Property.swift deleted file mode 100644 index 592a056db..000000000 --- a/MastodonSDK/Sources/MastodonCore/Extension/CoreDataStack/PollOption+Property.swift +++ /dev/null @@ -1,28 +0,0 @@ -// -// MastodonPollOption+Property.swift -// -// -// Created by MainasuK on 2021-12-9. -// - -import Foundation -import MastodonSDK -import CoreDataStack - -extension PollOptionLegacy.Property { - public init( - poll: PollLegacy, - index: Int, - entity: Mastodon.Entity.Poll.Option, - networkDate: Date - ) { - self.init( - index: Int64(index), - title: entity.title, - votesCount: Int64(entity.votesCount ?? 0), - createdAt: networkDate, - updatedAt: networkDate, - poll: poll - ) - } -} diff --git a/MastodonSDK/Sources/MastodonCore/Persistence/Persistence+Poll.swift b/MastodonSDK/Sources/MastodonCore/Persistence/Persistence+Poll.swift index 704869bf1..c2db42a25 100644 --- a/MastodonSDK/Sources/MastodonCore/Persistence/Persistence+Poll.swift +++ b/MastodonSDK/Sources/MastodonCore/Persistence/Persistence+Poll.swift @@ -124,81 +124,12 @@ extension Persistence.Poll { poll: PollLegacy, context: PersistContext ) { - let optionEntities = context.entity.options - let options = poll.options.sorted(by: { $0.index < $1.index }) - for (option, entity) in zip(options, optionEntities) { - Persistence.PollOption.merge( - option: option, - context: Persistence.PollOption.PersistContext( - index: Int(option.index), - poll: poll, - entity: entity, - me: context.me, - networkDate: context.networkDate - ) - ) - } // end for in - if let me = context.me { if let voted = context.entity.voted { poll.update(voted: voted, by: me) } - - let ownVotes = context.entity.ownVotes ?? [] - for option in options { - let index = Int(option.index) - let isVote = ownVotes.contains(index) - option.update(voted: isVote, by: me) - } - } - - // update options - if needsPollOptionsUpdate(context: context, poll: poll) { - // options differ, update them - for option in poll.options { - option.update(poll: nil) - managedObjectContext.delete(option) - } - var attachableOptions = [PollOptionLegacy]() - for (index, option) in context.entity.options.enumerated() { - attachableOptions.append( - Persistence.PollOption.create( - in: managedObjectContext, - context: Persistence.PollOption.PersistContext( - index: index, - poll: poll, - entity: option, - me: context.me, - networkDate: context.networkDate - ) - ) - ) - } - poll.attach(options: attachableOptions) } poll.update(updatedAt: context.networkDate) } - - private static func needsPollOptionsUpdate(context: PersistContext, poll: PollLegacy) -> Bool { - let entityPollOptions = context.entity.options.map { (title: $0.title, votes: $0.votesCount) } - let pollOptions = poll.options.sortedByIndex().map { (title: $0.title, votes: Int($0.votesCount)) } - - guard entityPollOptions.count == pollOptions.count else { - // poll definitely needs to be updated due to differences in count of options - return true - } - - for (entityPollOption, pollOption) in zip(entityPollOptions, pollOptions) { - guard entityPollOption.title == pollOption.title else { - // update poll because at least one title differs - return true - } - guard entityPollOption.votes == pollOption.votes else { - // update poll because at least one vote count differs - return true - } - } - return false - } } diff --git a/MastodonSDK/Sources/MastodonCore/Persistence/Persistence+PollOption.swift b/MastodonSDK/Sources/MastodonCore/Persistence/Persistence+PollOption.swift deleted file mode 100644 index d5c137b3a..000000000 --- a/MastodonSDK/Sources/MastodonCore/Persistence/Persistence+PollOption.swift +++ /dev/null @@ -1,78 +0,0 @@ -// -// Persistence+MastodonPollOption.swift -// -// -// Created by MainasuK on 2021-12-9. -// - -import CoreData -import CoreDataStack -import Foundation -import MastodonSDK - -extension Persistence.PollOption { - - public struct PersistContext { - public let index: Int - public let poll: PollLegacy - public let entity: Mastodon.Entity.Poll.Option - public let me: MastodonUser? - public let networkDate: Date - - public init( - index: Int, - poll: PollLegacy, - entity: Mastodon.Entity.Poll.Option, - me: MastodonUser?, - networkDate: Date - ) { - self.index = index - self.poll = poll - self.entity = entity - self.me = me - self.networkDate = networkDate - } - } -} - -extension Persistence.PollOption { - - @discardableResult - public static func create( - in managedObjectContext: NSManagedObjectContext, - context: PersistContext - ) -> PollOptionLegacy { - let property = PollOptionLegacy.Property( - poll: context.poll, - index: context.index, - entity: context.entity, - networkDate: context.networkDate - ) - let option = PollOptionLegacy.insert(into: managedObjectContext, property: property) - update(option: option, context: context) - return option - } - - public static func merge( - option: PollOptionLegacy, - context: PersistContext - ) { - guard context.networkDate > option.updatedAt else { return } - let property = PollOptionLegacy.Property( - poll: context.poll, - index: context.index, - entity: context.entity, - networkDate: context.networkDate - ) - option.update(property: property) - update(option: option, context: context) - } - - private static func update( - option: PollOptionLegacy, - context: PersistContext - ) { - // Do nothing - } // end func update - -}