From e4cc5edf966cf729964cb0eb6078a174ccbcfc43 Mon Sep 17 00:00:00 2001
From: Oliver Wiese <oliver.wiese@fu-berlin.de>
Date: Thu, 8 Apr 2021 22:20:14 +0200
Subject: [PATCH] add update mail states (is read, flags) and move mails

---
 enzevalos_iphone/SwiftUI/Read/ReadModel.swift |  7 +++++++
 .../persistentData/FolderRecord.swift         | 14 ++++++++++++++
 .../persistentData/MailRecord.swift           |  7 +++++++
 .../PersistentDataProvider.swift              | 19 +++++++++++++++----
 4 files changed, 43 insertions(+), 4 deletions(-)

diff --git a/enzevalos_iphone/SwiftUI/Read/ReadModel.swift b/enzevalos_iphone/SwiftUI/Read/ReadModel.swift
index 53460c2f..8b78a307 100644
--- a/enzevalos_iphone/SwiftUI/Read/ReadModel.swift
+++ b/enzevalos_iphone/SwiftUI/Read/ReadModel.swift
@@ -45,6 +45,7 @@ class ReadModel <M: DisplayMail>: ObservableObject {
     
     init(mail: M) {
         self.mail = mail
+        mail.markAsRead(isRead: true)
     }
     
     func newUserAction(action: UserAction) -> PreMailData? {
@@ -54,6 +55,9 @@ class ReadModel <M: DisplayMail>: ObservableObject {
             // TODO
             return nil
         case .Delete:
+            if let mail = mail as? MailRecord {
+                PersistentDataProvider.dataProvider.deleteMail(mail: mail)
+            }
             dismissView = true
             return nil
         case .Move:
@@ -66,6 +70,9 @@ class ReadModel <M: DisplayMail>: ObservableObject {
         case .Forward:
             return PreMailData(body: mail.preparePreviousMailBody(), subject: ResponseType.Reply.addPrefix(subject: mail.subject), to: [], cc: [], bcc: [])
         case .Archive:
+            if let mail = mail as? MailRecord {
+                PersistentDataProvider.dataProvider.archiveMail(mail: mail)
+            }
             dismissView = true
             return nil
         case .Unread:
diff --git a/enzevalos_iphone/persistentData/FolderRecord.swift b/enzevalos_iphone/persistentData/FolderRecord.swift
index f89e98a3..37d35878 100644
--- a/enzevalos_iphone/persistentData/FolderRecord.swift
+++ b/enzevalos_iphone/persistentData/FolderRecord.swift
@@ -16,6 +16,20 @@ extension FolderRecord {
         request.sortDescriptors = [NSSortDescriptor(key: "flags", ascending: false), NSSortDescriptor(key: "path", ascending: true)]
         return request
     }
+    
+    static var onlySpecialFolderFetchRequest: NSFetchRequest<FolderRecord> {
+        let request: NSFetchRequest<FolderRecord> = NSFetchRequest<FolderRecord>(entityName: FolderRecord.entityName)
+        request.predicate = NSPredicate(format: " flags > 0")
+        request.sortDescriptors = [NSSortDescriptor(key: "flags", ascending: false), NSSortDescriptor(key: "path", ascending: true)]
+        return request
+    }
+    
+    static var onlyUserDefinedFolderFetchRequest: NSFetchRequest<FolderRecord> {
+        let request: NSFetchRequest<FolderRecord> = NSFetchRequest<FolderRecord>(entityName: FolderRecord.entityName)
+        request.predicate = NSPredicate(format: " flags == 0")
+        request.sortDescriptors = [NSSortDescriptor(key: "path", ascending: true)]
+        return request
+    }
 }
 
 extension FolderRecord {
diff --git a/enzevalos_iphone/persistentData/MailRecord.swift b/enzevalos_iphone/persistentData/MailRecord.swift
index 46f67548..7abc53e8 100644
--- a/enzevalos_iphone/persistentData/MailRecord.swift
+++ b/enzevalos_iphone/persistentData/MailRecord.swift
@@ -142,6 +142,13 @@ extension MailRecord: DisplayMail {
             var mcoflag = MCOMessageFlag.init(rawValue: Int(flag))
             mcoflag = mcoflag.update(with: .seen) ?? mcoflag
             self.flag = Int16(mcoflag.rawValue)
+            
+            if let moc = self.managedObjectContext {
+                try? PersistentDataProvider.dataProvider.save(taskContext: moc)
+            }
+            if let folder = self.inFolder?.path {
+                MailHandler.init().setFlag(UInt64(self.uID), flags: mcoflag, folder: folder)
+            }
         }
     }
     
diff --git a/enzevalos_iphone/persistentData/PersistentDataProvider.swift b/enzevalos_iphone/persistentData/PersistentDataProvider.swift
index da2877a7..9cfdc3ce 100644
--- a/enzevalos_iphone/persistentData/PersistentDataProvider.swift
+++ b/enzevalos_iphone/persistentData/PersistentDataProvider.swift
@@ -477,11 +477,22 @@ class PersistentDataProvider {
     }
     
     func deleteMail(mail: MailRecord) {
-        let taskContext = newTaskContext()
-        taskContext.perform {
-            taskContext.delete(mail)
-            try? self.save(taskContext: taskContext)
+        guard let folder = mail.inFolder?.path else {
+            let taskContext = newTaskContext()
+            taskContext.perform {
+                taskContext.delete(mail)
+                try? self.save(taskContext: taskContext)
+            }
+            return
+        }
+        moveMails(with: [UInt64(mail.uID)], from: folder, to: UserManager.backendTrashFolderPath)
+    }
+    
+    func archiveMail(mail: MailRecord) {
+        guard let folder = mail.inFolder?.path else {
+            return
         }
+        moveMails(with: [UInt64(mail.uID)], from: folder, to: UserManager.backendArchiveFolderPath)
     }
     
     func moveMails(with uids: [UInt64], from: String, to: String) {
-- 
GitLab