mirror of
https://github.com/TheAnachronism/docspell.git
synced 2025-06-22 02:18:26 +00:00
Add a recursive mail folder scan option to ScanMailboxTask
This commit is contained in:
@ -98,7 +98,7 @@ object ScanMailboxTask {
|
||||
if (acc.noneLeft(name)) acc.pure[F]
|
||||
else
|
||||
mailer
|
||||
.run(impl.handleFolder(theEmil.access, upload)(name))
|
||||
.run(impl.handleFolder(theEmil.access, upload)(name, ctx.args.scanRecursively))
|
||||
.map(_ ++ acc)
|
||||
|
||||
Stream
|
||||
@ -155,12 +155,15 @@ object ScanMailboxTask {
|
||||
MailOp(_ => f(ctx.logger))
|
||||
|
||||
def handleFolder[C](a: Access[F, C], upload: OUpload[F])(
|
||||
name: String
|
||||
name: String,
|
||||
scanRecursively: Boolean
|
||||
): MailOp[F, C, ScanResult] =
|
||||
for {
|
||||
_ <- Kleisli.liftF(ctx.logger.info(s"Processing folder $name"))
|
||||
folder <- requireFolder(a)(name)
|
||||
search <- searchMails(a)(folder)
|
||||
search <-
|
||||
if (scanRecursively) searchMailsRecursively(a)(folder)
|
||||
else searchMails(a)(folder)
|
||||
items = search.mails.map(MailHeaderItem(_))
|
||||
headers <- Kleisli.liftF(
|
||||
filterSubjects(items).flatMap(filterMessageIds)
|
||||
@ -175,6 +178,19 @@ object ScanMailboxTask {
|
||||
.map(_.toRight(new Exception(s"Folder '$name' not found")))
|
||||
.mapF(_.rethrow)
|
||||
|
||||
def searchMailsRecursively[C](
|
||||
a: Access[F, C]
|
||||
)(folder: MailFolder): MailOp[F, C, SearchResult[MailHeader]] =
|
||||
for {
|
||||
subFolders <- a.listFoldersRecursive(Some(folder))
|
||||
search <- subFolders.foldLeft(searchMails(a)(folder)) { (result, folder) =>
|
||||
for {
|
||||
res <- result
|
||||
search <- searchMails(a)(folder)
|
||||
} yield SearchResult(res.mails ++ search.mails, res.count + search.count)
|
||||
}
|
||||
} yield search
|
||||
|
||||
def searchMails[C](
|
||||
a: Access[F, C]
|
||||
)(folder: MailFolder): MailOp[F, C, SearchResult[MailHeader]] = {
|
||||
|
Reference in New Issue
Block a user