From 24caba14578f4efd25397c1070c65e5c0b5684a5 Mon Sep 17 00:00:00 2001 From: Eike Kettner Date: Sun, 24 May 2020 11:12:30 +0200 Subject: [PATCH] Refactor UploadRoutes to remove duplicate code --- .../scala/docspell/backend/ops/OUpload.scala | 13 +++ .../restserver/routes/UploadRoutes.scala | 79 ++++++++----------- 2 files changed, 46 insertions(+), 46 deletions(-) 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 59b73144..0a74c9e5 100644 --- a/modules/backend/src/main/scala/docspell/backend/ops/OUpload.scala +++ b/modules/backend/src/main/scala/docspell/backend/ops/OUpload.scala @@ -29,6 +29,19 @@ trait OUpload[F[_]] { notifyJoex: Boolean, itemId: Option[Ident] ): F[OUpload.UploadResult] + + final def submitEither( + data: OUpload.UploadData[F], + accOrSrc: Either[Ident, AccountId], + notifyJoex: Boolean, + itemId: Option[Ident] + ): F[OUpload.UploadResult] = + accOrSrc match { + case Right(acc) => + submit(data, acc, notifyJoex, itemId) + case Left(srcId) => + submit(data, srcId, notifyJoex, itemId) + } } object OUpload { diff --git a/modules/restserver/src/main/scala/docspell/restserver/routes/UploadRoutes.scala b/modules/restserver/src/main/scala/docspell/restserver/routes/UploadRoutes.scala index afec48a4..db62a32c 100644 --- a/modules/restserver/src/main/scala/docspell/restserver/routes/UploadRoutes.scala +++ b/modules/restserver/src/main/scala/docspell/restserver/routes/UploadRoutes.scala @@ -2,13 +2,13 @@ package docspell.restserver.routes import cats.effect._ import cats.implicits._ +import docspell.common._ import docspell.backend.BackendApp import docspell.backend.auth.AuthToken -import docspell.common.{Ident, Priority} import docspell.restserver.Config import docspell.restserver.conv.Conversions._ import docspell.restserver.http4s.ResponseGenerator -import org.http4s.HttpRoutes +import org.http4s._ import org.http4s.circe.CirceEntityEncoder._ import org.http4s.EntityDecoder._ import org.http4s.dsl.Http4sDsl @@ -26,32 +26,14 @@ object UploadRoutes { val dsl = new Http4sDsl[F] with ResponseGenerator[F] {} import dsl._ + val submitting = submitFiles[F](backend, cfg, Right(user.account)) _ + HttpRoutes.of { case req @ POST -> Root / "item" => - for { - multipart <- req.as[Multipart[F]] - updata <- readMultipart( - multipart, - logger, - Priority.High, - cfg.backend.files.validMimeTypes - ) - result <- backend.upload.submit(updata, user.account, true, None) - res <- Ok(basicResult(result)) - } yield res + submitting(req, None, Priority.High, dsl) case req @ POST -> Root / "item" / Ident(itemId) => - for { - multipart <- req.as[Multipart[F]] - updata <- readMultipart( - multipart, - logger, - Priority.High, - cfg.backend.files.validMimeTypes - ) - result <- backend.upload.submit(updata, user.account, true, Some(itemId)) - res <- Ok(basicResult(result)) - } yield res + submitting(req, Some(itemId), Priority.High, dsl) } } @@ -61,30 +43,35 @@ object UploadRoutes { HttpRoutes.of { case req @ POST -> Root / "item" / Ident(id) => - for { - multipart <- req.as[Multipart[F]] - updata <- readMultipart( - multipart, - logger, - Priority.Low, - cfg.backend.files.validMimeTypes - ) - result <- backend.upload.submit(updata, id, true, None) - res <- Ok(basicResult(result)) - } yield res + submitFiles(backend, cfg, Left(id))(req, None, Priority.Low, dsl) case req @ POST -> Root / "item" / Ident(itemId) / Ident(id) => - for { - multipart <- req.as[Multipart[F]] - updata <- readMultipart( - multipart, - logger, - Priority.Low, - cfg.backend.files.validMimeTypes - ) - result <- backend.upload.submit(updata, id, true, Some(itemId)) - res <- Ok(basicResult(result)) - } yield res + submitFiles(backend, cfg, Left(id))(req, Some(itemId), Priority.Low, dsl) } } + + private def submitFiles[F[_]: Effect]( + backend: BackendApp[F], + cfg: Config, + accOrSrc: Either[Ident, AccountId] + )( + req: Request[F], + itemId: Option[Ident], + prio: Priority, + dsl: Http4sDsl[F] + ): F[Response[F]] = { + import dsl._ + + for { + multipart <- req.as[Multipart[F]] + updata <- readMultipart( + multipart, + logger, + prio, + cfg.backend.files.validMimeTypes + ) + result <- backend.upload.submitEither(updata, accOrSrc, true, itemId) + res <- Ok(basicResult(result)) + } yield res + } }