diff --git a/MailNotificationServiceExtension/NotificationService+Sentry.swift b/MailNotificationServiceExtension/NotificationService+Sentry.swift new file mode 100644 index 000000000..557621ed0 --- /dev/null +++ b/MailNotificationServiceExtension/NotificationService+Sentry.swift @@ -0,0 +1,38 @@ +/* + Infomaniak Mail - iOS App + Copyright (C) 2022 Infomaniak Network SA + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . + */ + +import Foundation +import Sentry + +extension NotificationService { + enum NotificationFailedType: String { + case expired + case messageNotFound + case mailboxNotFound + } + + func logNotificationFailed(userInfo: [AnyHashable: Any], type: NotificationFailedType) { + SentrySDK.capture(message: "Notification transformation failed") { scope in + scope.setContext(value: [ + "NotificationFailedType": type.rawValue, + "User infos": userInfo + ], + key: "Notification informations") + } + } +} diff --git a/MailNotificationServiceExtension/NotificationService.swift b/MailNotificationServiceExtension/NotificationService.swift index 644bf51c7..49fee0d3a 100644 --- a/MailNotificationServiceExtension/NotificationService.swift +++ b/MailNotificationServiceExtension/NotificationService.swift @@ -94,13 +94,15 @@ class NotificationService: UNNotificationServiceExtension { let mailbox = MailboxInfosManager.instance.getMailbox(id: mailboxId, userId: userId), let mailboxManager = AccountManager.instance.getMailboxManager(for: mailbox) else { // This should never happen, we received a notification for an unknown mailbox + logNotificationFailed(userInfo: userInfos, type: .mailboxNotFound) return contentHandler(bestAttemptContent) } // Prepare a notification in case we can't fetch the message in time / the message doesn't exist anymore prepareEmptyMessageNotification(in: mailbox) guard let messageUid = userInfos[NotificationsHelper.UserInfoKeys.messageUid] as? String, - let fetchedMessage = try await fetchMessage(uid: messageUid, in: mailboxManager) else { + let fetchedMessage = try? await fetchMessage(uid: messageUid, in: mailboxManager) else { + logNotificationFailed(userInfo: userInfos, type: .messageNotFound) return contentHandler(bestAttemptContent) } @@ -113,6 +115,7 @@ class NotificationService: UNNotificationServiceExtension { override func serviceExtensionTimeWillExpire() { if let contentHandler, let bestAttemptContent { + logNotificationFailed(userInfo: bestAttemptContent.userInfo, type: .expired) contentHandler(bestAttemptContent) } }