listless

A simple list app for Apple platforms
Log | Files | Refs | README | LICENSE

ItemEntity.swift (1888B)


      1 import CoreData
      2 import Foundation
      3 
      4 @objc(TaskItem)
      5 public class ItemEntity: NSManagedObject, Identifiable {
      6     private static let invalidatedID = UUID(uuidString: "00000000-0000-0000-0000-000000000000")!
      7 
      8     private enum Keys {
      9         private static func key<Value>(_ keyPath: KeyPath<ItemEntity, Value>) -> String {
     10             NSExpression(forKeyPath: keyPath).keyPath
     11         }
     12 
     13         static let id = "id"
     14         static let title = key(\ItemEntity.title)
     15         static let createdAt = key(\ItemEntity.createdAt)
     16         static let updatedAt = key(\ItemEntity.updatedAt)
     17         static let sortOrder = key(\ItemEntity.sortOrder)
     18         static let completedOrder = key(\ItemEntity.completedOrder)
     19     }
     20 
     21     public var id: UUID {
     22         (primitiveValue(forKey: Keys.id) as? UUID) ?? Self.invalidatedID
     23     }
     24 
     25     @NSManaged public var title: String
     26     @NSManaged public var createdAt: Date
     27     @NSManaged public var updatedAt: Date
     28     @NSManaged public var sortOrder: Int64
     29     @NSManaged public var completedOrder: Int64
     30 
     31     public var isCompleted: Bool { completedOrder > 0 }
     32 
     33     @nonobjc public class func fetchRequest() -> NSFetchRequest<ItemEntity> {
     34         return NSFetchRequest<ItemEntity>(entityName: "TaskItem")
     35     }
     36 
     37     public override func awakeFromInsert() {
     38         super.awakeFromInsert()
     39         setPrimitiveValue(UUID(), forKey: Keys.id)
     40         setPrimitiveValue(Date(), forKey: Keys.createdAt)
     41         setPrimitiveValue(Date(), forKey: Keys.updatedAt)
     42         setPrimitiveValue("", forKey: Keys.title)
     43         setPrimitiveValue(0, forKey: Keys.sortOrder)
     44         setPrimitiveValue(0, forKey: Keys.completedOrder)
     45     }
     46 
     47     public override func willSave() {
     48         super.willSave()
     49         if !isDeleted && changedValues().keys.contains(where: { $0 != Keys.updatedAt }) {
     50             setPrimitiveValue(Date(), forKey: Keys.updatedAt)
     51         }
     52     }
     53 }