Listless/Models/ItemEntity.swift (1888B)
1import CoreData
2import Foundation
3
4@objc(TaskItem)
5public 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}