From 081c4da903f8c78e4e13f9df900bcae220a97a3f Mon Sep 17 00:00:00 2001
From: Eike Kettner <eike.kettner@posteo.de>
Date: Thu, 13 Aug 2020 01:03:42 +0200
Subject: [PATCH] Add a route to trigger the convert-all-pdf task for a
 collective

---
 .../scala/docspell/backend/JobFactory.scala   | 21 +++++++++++++++++++
 .../scala/docspell/backend/ops/OUpload.scala  | 15 +++++++++++++
 .../restserver/routes/ItemRoutes.scala        |  7 +++++++
 3 files changed, 43 insertions(+)

diff --git a/modules/backend/src/main/scala/docspell/backend/JobFactory.scala b/modules/backend/src/main/scala/docspell/backend/JobFactory.scala
index 96399ffa..396352b4 100644
--- a/modules/backend/src/main/scala/docspell/backend/JobFactory.scala
+++ b/modules/backend/src/main/scala/docspell/backend/JobFactory.scala
@@ -8,6 +8,27 @@ import docspell.store.records.RJob
 
 object JobFactory {
 
+  def convertAllPdfs[F[_]: Sync](
+      collective: Option[Ident],
+      account: AccountId,
+      prio: Priority
+  ): F[RJob] =
+    for {
+      id  <- Ident.randomId[F]
+      now <- Timestamp.current[F]
+      job = RJob.newJob(
+        id,
+        ConvertAllPdfArgs.taskName,
+        account.collective,
+        ConvertAllPdfArgs(collective),
+        s"Convert all pdfs not yet converted",
+        now,
+        account.user,
+        prio,
+        None
+      )
+    } yield job
+
   def reprocessItem[F[_]: Sync](
       args: ReProcessItemArgs,
       account: AccountId,
diff --git a/modules/backend/src/main/scala/docspell/backend/ops/OUpload.scala b/modules/backend/src/main/scala/docspell/backend/ops/OUpload.scala
index a6fbce49..c6edbfb2 100644
--- a/modules/backend/src/main/scala/docspell/backend/ops/OUpload.scala
+++ b/modules/backend/src/main/scala/docspell/backend/ops/OUpload.scala
@@ -57,6 +57,11 @@ trait OUpload[F[_]] {
       notifyJoex: Boolean
   ): F[OUpload.UploadResult]
 
+  def convertAllPdf(
+      collective: Option[Ident],
+      account: AccountId,
+      notifyJoex: Boolean
+  ): F[OUpload.UploadResult]
 }
 
 object OUpload {
@@ -187,6 +192,16 @@ object OUpload {
           res <- OptionT.liftF(submitJobs(notifyJoex)(Vector(job)))
         } yield res).getOrElse(UploadResult.noItem)
 
+      def convertAllPdf(
+          collective: Option[Ident],
+          account: AccountId,
+          notifyJoex: Boolean
+      ): F[OUpload.UploadResult] =
+        for {
+          job <- JobFactory.convertAllPdfs(collective, account, Priority.Low)
+          res <- submitJobs(notifyJoex)(Vector(job))
+        } yield res
+
       private def submitJobs(
           notifyJoex: Boolean
       )(jobs: Vector[RJob]): F[OUpload.UploadResult] =
diff --git a/modules/restserver/src/main/scala/docspell/restserver/routes/ItemRoutes.scala b/modules/restserver/src/main/scala/docspell/restserver/routes/ItemRoutes.scala
index d932d407..49363696 100644
--- a/modules/restserver/src/main/scala/docspell/restserver/routes/ItemRoutes.scala
+++ b/modules/restserver/src/main/scala/docspell/restserver/routes/ItemRoutes.scala
@@ -31,6 +31,13 @@ object ItemRoutes {
     import dsl._
 
     HttpRoutes.of {
+      case POST -> Root / "convertallpdfs" =>
+        for {
+          res <-
+            backend.upload.convertAllPdf(user.account.collective.some, user.account, true)
+          resp <- Ok(Conversions.basicResult(res))
+        } yield resp
+
       case req @ POST -> Root / "search" =>
         for {
           mask <- req.as[ItemSearch]