63 lines
1.6 KiB
Swift
63 lines
1.6 KiB
Swift
import CoreData
|
|
|
|
final class MessageModel {
|
|
private let context: NSManagedObjectContext
|
|
|
|
init(context: NSManagedObjectContext) {
|
|
self.context = context
|
|
}
|
|
|
|
func upsert(_ newMessage: MergedRoom.Message) -> Message {
|
|
let attachmentDatabase = AttachmentModel(context: context)
|
|
let userDatabase = UserModel(context: context)
|
|
|
|
let user = userDatabase.upsert(newMessage.u)
|
|
let message = message(id: newMessage._id, in: context)
|
|
|
|
message.status = "received"
|
|
message.id = newMessage._id
|
|
message.msg = newMessage.msg
|
|
message.ts = newMessage.ts
|
|
message.t = newMessage.t
|
|
message.groupable = newMessage.groupable ?? true
|
|
message.editedAt = newMessage.editedAt
|
|
message.role = newMessage.role
|
|
message.comment = newMessage.comment
|
|
message.user = user
|
|
|
|
if let messageAttachments = newMessage.attachments {
|
|
for newAttachment in messageAttachments {
|
|
let attachment = attachmentDatabase.upsert(newAttachment)
|
|
|
|
attachment?.message = message
|
|
}
|
|
}
|
|
|
|
return message
|
|
}
|
|
|
|
func fetch(id: String) -> Message? {
|
|
let request = Message.fetchRequest()
|
|
request.predicate = NSPredicate(format: "id == %@", id)
|
|
|
|
return try? context.fetch(request).first
|
|
}
|
|
}
|
|
|
|
extension MessageModel {
|
|
private func message(id: String, in context: NSManagedObjectContext) -> Message {
|
|
let request = Message.fetchRequest()
|
|
request.predicate = NSPredicate(format: "id == %@", id)
|
|
|
|
guard let message = try? context.fetch(request).first else {
|
|
let message = Message(context: context)
|
|
message.id = id
|
|
message.ts = Date()
|
|
|
|
return message
|
|
}
|
|
|
|
return message
|
|
}
|
|
}
|