import Foundation import GRDB import Martin enum MessageType: String, Codable, DatabaseValueConvertible { case chat case groupchat case error } enum AttachmentType: Int, Codable, DatabaseValueConvertible { case image case video case audio case file } struct Attachment: Codable & Equatable, DatabaseValueConvertible { let type: AttachmentType var localName: String? var thumbnailName: String? var remotePath: String? } enum MessageContentType: Codable & Equatable, DatabaseValueConvertible { case text case typing case invite case attachment(Attachment) } enum MessageStatus: Int, Codable, DatabaseValueConvertible { case pending case sent case error } struct Message: DBStorable, Equatable { static let databaseTableName = "messages" let id: String let type: MessageType let date: Date var contentType: MessageContentType var status: MessageStatus let from: String let to: String? let body: String? let subject: String? let thread: String? let oobUrl: String? } extension Message { func save() async throws { try await Database.shared.dbQueue.write { db in try self.insert(db) } } func setStatus(_ status: MessageStatus) async throws { try await Database.shared.dbQueue.write { db in var updatedMessage = self updatedMessage.status = status try updatedMessage.update(db, columns: ["status"]) } } }