Add a recursive mail folder scan option to ScanMailboxTask

This commit is contained in:
moerfi
2022-01-07 22:18:47 +01:00
parent ec37cd5bb6
commit 39f2f8cc1b
6 changed files with 56 additions and 3 deletions

View File

@ -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]] = {