diff --git a/Mail/Helpers/PreviewHelper.swift b/Mail/Helpers/PreviewHelper.swift index 630247935..a54734819 100644 --- a/Mail/Helpers/PreviewHelper.swift +++ b/Mail/Helpers/PreviewHelper.swift @@ -24,7 +24,6 @@ import MailCore import RealmSwift import SwiftUI -#if DEBUG enum PreviewHelper { static let sampleMailboxManager = MailboxManager(mailbox: sampleMailbox, apiFetcher: MailApiFetcher()) @@ -65,7 +64,7 @@ enum PreviewHelper { cc: [], bcc: [], subject: "Test thread", - date: Date(), + date: SentryDebug.knownDebugDate, hasAttachments: true, hasSwissTransferAttachments: false, hasDrafts: false, @@ -78,7 +77,7 @@ enum PreviewHelper { msgId: "", subject: "Test message", priority: .normal, - date: Date(), + date: SentryDebug.knownDebugDate, size: 0, from: [sampleRecipient1], to: [sampleRecipient2], @@ -133,4 +132,3 @@ enum PreviewHelper { expirationDate: Date() )) } -#endif diff --git a/MailCore/Cache/MailboxManager.swift b/MailCore/Cache/MailboxManager.swift index 8fe3c7b1b..1abc7a268 100644 --- a/MailCore/Cache/MailboxManager.swift +++ b/MailCore/Cache/MailboxManager.swift @@ -74,7 +74,7 @@ public class MailboxManager: ObservableObject { let realmName = "\(mailbox.userId)-\(mailbox.mailboxId).realm" realmConfiguration = Realm.Configuration( fileURL: MailboxManager.constants.rootDocumentsURL.appendingPathComponent(realmName), - schemaVersion: 12, + schemaVersion: 13, deleteRealmIfMigrationNeeded: true, objectTypes: [ Folder.self, @@ -761,22 +761,25 @@ public class MailboxManager: ObservableObject { } private func handleMessagesUids(messageUids: MessagesUids, folder: Folder) async throws { - let alreadyWrongIds = folder.fresh(using: getRealm())?.threads - .where { $0.date == SentryDebug.knownDebugDate } + let startDate = Date(timeIntervalSinceNow: -5 * 60) + let ignoredIds = folder.fresh(using: getRealm())?.threads + .where { $0.date > startDate } .map { $0.uid } ?? [] await deleteMessages(uids: messageUids.deletedUids) var shouldIgnoreNextEvents = SentryDebug.captureWrongDate( step: "After delete", + startDate: startDate, folder: folder, - alreadyWrongIds: alreadyWrongIds, + alreadyWrongIds: ignoredIds, realm: getRealm() ) await updateMessages(updates: messageUids.updated, folder: folder) if !shouldIgnoreNextEvents { shouldIgnoreNextEvents = SentryDebug.captureWrongDate( step: "After updateMessages", + startDate: startDate, folder: folder, - alreadyWrongIds: alreadyWrongIds, + alreadyWrongIds: ignoredIds, realm: getRealm() ) } @@ -784,8 +787,9 @@ public class MailboxManager: ObservableObject { if !shouldIgnoreNextEvents { _ = SentryDebug.captureWrongDate( step: "After addMessages", + startDate: startDate, folder: folder, - alreadyWrongIds: alreadyWrongIds, + alreadyWrongIds: ignoredIds, realm: getRealm() ) } diff --git a/MailCore/Models/Message.swift b/MailCore/Models/Message.swift index 556078e5f..442146954 100644 --- a/MailCore/Models/Message.swift +++ b/MailCore/Models/Message.swift @@ -314,8 +314,7 @@ public final class Message: Object, Decodable, Identifiable { if let date = (try? values.decode(Date.self, forKey: .date)) { self.date = date } else { - // FIXME: Remove after thread date bug fix - date = SentryDebug.knownDebugDate + date = Date() SentrySDK .addBreadcrumb(SentryDebug.createBreadcrumb( level: .warning, diff --git a/MailCore/Utils/SentryDebug.swift b/MailCore/Utils/SentryDebug.swift index beee39c98..7e5b0eca4 100644 --- a/MailCore/Utils/SentryDebug.swift +++ b/MailCore/Utils/SentryDebug.swift @@ -20,8 +20,8 @@ import Foundation import RealmSwift import Sentry -enum SentryDebug { - static let knownDebugDate = Date(timeIntervalSince1970: 1_893_456_000) +public enum SentryDebug { + public static let knownDebugDate = Date(timeIntervalSince1970: 1_893_456_000) static func sendMissingMessagesSentry(sentUids: [String], receivedMessages: [Message], folder: Folder, newCursor: String?) { if receivedMessages.count != sentUids.count { let receivedUids = Set(receivedMessages.map { Constants.shortUid(from: $0.uid) }) @@ -96,13 +96,18 @@ enum SentryDebug { return crumb } - static func captureWrongDate(step: String, folder: Folder, alreadyWrongIds: [String], realm: Realm) -> Bool { + static func captureWrongDate(step: String, startDate: Date, folder: Folder, alreadyWrongIds: [String], realm: Realm) -> Bool { guard let freshFolder = folder.fresh(using: realm) else { return false } - let threads = freshFolder.threads.where { $0.date == knownDebugDate }.filter { !alreadyWrongIds.contains($0.uid) } + let threads = freshFolder.threads + .where { $0.date > startDate } + .filter { !alreadyWrongIds.contains($0.uid) } + .filter { + !$0.messages.map { $0.date }.contains($0.date) + } guard !threads.isEmpty else { return false } - SentrySDK.capture(message: "Threads with wrong date on step \(step)") { scope in + SentrySDK.capture(message: "No corresponding message date for thread on step \(step)") { scope in scope.setLevel(.error) scope.setContext(value: ["threads": Array(threads).map { [