diff --git a/Packages/MagnumOpusCore/Sources/MailStore/DatabaseSetup.swift b/Packages/MagnumOpusCore/Sources/MailStore/DatabaseSetup.swift index de24086..29d5374 100644 --- a/Packages/MagnumOpusCore/Sources/MailStore/DatabaseSetup.swift +++ b/Packages/MagnumOpusCore/Sources/MailStore/DatabaseSetup.swift @@ -186,6 +186,15 @@ public enum DatabaseSetup { try db.create(index: "idx_deferral_deferUntil", on: "deferral", columns: ["deferUntil"]) } + migrator.registerMigration("v4_attachment") { db in + try db.alter(table: "attachment") { t in + t.add(column: "sectionPath", .text) + } + try db.alter(table: "message") { t in + t.add(column: "hasAttachments", .boolean).notNull().defaults(to: false) + } + } + return migrator } diff --git a/Packages/MagnumOpusCore/Sources/MailStore/Records/AttachmentRecord.swift b/Packages/MagnumOpusCore/Sources/MailStore/Records/AttachmentRecord.swift index 80a7ad7..495a283 100644 --- a/Packages/MagnumOpusCore/Sources/MailStore/Records/AttachmentRecord.swift +++ b/Packages/MagnumOpusCore/Sources/MailStore/Records/AttachmentRecord.swift @@ -10,10 +10,11 @@ public struct AttachmentRecord: Codable, FetchableRecord, PersistableRecord, Sen public var size: Int public var contentId: String? public var cachePath: String? + public var sectionPath: String? public init( id: String, messageId: String, filename: String?, mimeType: String, - size: Int, contentId: String?, cachePath: String? + size: Int, contentId: String?, cachePath: String?, sectionPath: String? = nil ) { self.id = id self.messageId = messageId @@ -22,5 +23,6 @@ public struct AttachmentRecord: Codable, FetchableRecord, PersistableRecord, Sen self.size = size self.contentId = contentId self.cachePath = cachePath + self.sectionPath = sectionPath } } diff --git a/Packages/MagnumOpusCore/Sources/MailStore/Records/MessageRecord.swift b/Packages/MagnumOpusCore/Sources/MailStore/Records/MessageRecord.swift index b30fefc..6dbf9c3 100644 --- a/Packages/MagnumOpusCore/Sources/MailStore/Records/MessageRecord.swift +++ b/Packages/MagnumOpusCore/Sources/MailStore/Records/MessageRecord.swift @@ -22,6 +22,7 @@ public struct MessageRecord: Codable, FetchableRecord, PersistableRecord, Sendab public var isRead: Bool public var isFlagged: Bool public var size: Int + public var hasAttachments: Bool public init( id: String, accountId: String, mailboxId: String, uid: Int, @@ -29,7 +30,7 @@ public struct MessageRecord: Codable, FetchableRecord, PersistableRecord, Sendab subject: String?, fromAddress: String?, fromName: String?, toAddresses: String?, ccAddresses: String?, date: String, snippet: String?, bodyText: String?, bodyHtml: String?, - isRead: Bool, isFlagged: Bool, size: Int + isRead: Bool, isFlagged: Bool, size: Int, hasAttachments: Bool = false ) { self.id = id self.accountId = accountId @@ -50,5 +51,6 @@ public struct MessageRecord: Codable, FetchableRecord, PersistableRecord, Sendab self.isRead = isRead self.isFlagged = isFlagged self.size = size + self.hasAttachments = hasAttachments } } diff --git a/Packages/MagnumOpusCore/Tests/MailStoreTests/MigrationTests.swift b/Packages/MagnumOpusCore/Tests/MailStoreTests/MigrationTests.swift index 86b46a6..a29b80c 100644 --- a/Packages/MagnumOpusCore/Tests/MailStoreTests/MigrationTests.swift +++ b/Packages/MagnumOpusCore/Tests/MailStoreTests/MigrationTests.swift @@ -358,6 +358,20 @@ struct MigrationTests { #expect(msg == nil) } + @Test("v4_attachment migration adds sectionPath to attachment and hasAttachments to message") + func v4AttachmentMigration() throws { + let db = try DatabaseSetup.openInMemoryDatabase() + try db.read { db in + let attachmentColumns = try db.columns(in: "attachment") + let attachmentColumnNames = attachmentColumns.map(\.name) + #expect(attachmentColumnNames.contains("sectionPath")) + + let messageColumns = try db.columns(in: "message") + let messageColumnNames = messageColumns.map(\.name) + #expect(messageColumnNames.contains("hasAttachments")) + } + } + @Test("messagesInThread filters by mailbox") func messagesInThreadByMailbox() throws { let store = try makeStore()