diff --git a/modules/restserver/src/main/resources/reference.conf b/modules/restserver/src/main/resources/reference.conf index 25a172d3..4b174649 100644 --- a/modules/restserver/src/main/resources/reference.conf +++ b/modules/restserver/src/main/resources/reference.conf @@ -17,6 +17,13 @@ docspell.server { port = 7880 } + # This is a hard limit to restrict the size of a batch that is + # returned when searching for items. The user can set this limit + # within the client config, but it is restricted by the server to + # the number defined here. An admin might choose a lower number + # depending on the available resources. + max-item-page-size = 500 + # Authentication. auth { diff --git a/modules/restserver/src/main/scala/docspell/restserver/Config.scala b/modules/restserver/src/main/scala/docspell/restserver/Config.scala index db66c98b..f971cc63 100644 --- a/modules/restserver/src/main/scala/docspell/restserver/Config.scala +++ b/modules/restserver/src/main/scala/docspell/restserver/Config.scala @@ -12,7 +12,8 @@ case class Config( bind: Config.Bind, backend: BackendConfig, auth: Login.Config, - integrationEndpoint: Config.IntegrationEndpoint + integrationEndpoint: Config.IntegrationEndpoint, + maxItemPageSize: Int ) object Config { diff --git a/modules/restserver/src/main/scala/docspell/restserver/RestServer.scala b/modules/restserver/src/main/scala/docspell/restserver/RestServer.scala index 3785d5d4..e0495298 100644 --- a/modules/restserver/src/main/scala/docspell/restserver/RestServer.scala +++ b/modules/restserver/src/main/scala/docspell/restserver/RestServer.scala @@ -69,7 +69,7 @@ object RestServer { "user" -> UserRoutes(restApp.backend, token), "collective" -> CollectiveRoutes(restApp.backend, token), "queue" -> JobQueueRoutes(restApp.backend, token), - "item" -> ItemRoutes(restApp.backend, token), + "item" -> ItemRoutes(cfg, restApp.backend, token), "attachment" -> AttachmentRoutes(restApp.backend, token), "upload" -> UploadRoutes.secured(restApp.backend, cfg, token), "checkfile" -> CheckFileRoutes.secured(restApp.backend, token), 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 23c5e51f..7704c849 100644 --- a/modules/restserver/src/main/scala/docspell/restserver/routes/ItemRoutes.scala +++ b/modules/restserver/src/main/scala/docspell/restserver/routes/ItemRoutes.scala @@ -13,12 +13,17 @@ import org.http4s.circe.CirceEntityDecoder._ import docspell.restapi.model._ import docspell.common.syntax.all._ import docspell.restserver.conv.Conversions +import docspell.restserver.Config import org.log4s._ object ItemRoutes { private[this] val logger = getLogger - def apply[F[_]: Effect](backend: BackendApp[F], user: AuthToken): HttpRoutes[F] = { + def apply[F[_]: Effect]( + cfg: Config, + backend: BackendApp[F], + user: AuthToken + ): HttpRoutes[F] = { val dsl = new Http4sDsl[F] {} import dsl._ @@ -31,7 +36,7 @@ object ItemRoutes { _ <- logger.ftrace(s"Running query: $query") items <- backend.item.findItems( query, - Batch(mask.offset, mask.limit).restrictLimitTo(500) + Batch(mask.offset, mask.limit).restrictLimitTo(cfg.maxItemPageSize) ) resp <- Ok(Conversions.mkItemList(items)) } yield resp @@ -44,7 +49,7 @@ object ItemRoutes { _ <- logger.ftrace(s"Running query: $query") items <- backend.item.findItemsWithTags( query, - Batch(mask.offset, mask.limit).restrictLimitTo(500) + Batch(mask.offset, mask.limit).restrictLimitTo(cfg.maxItemPageSize) ) resp <- Ok(Conversions.mkItemListWithTags(items)) } yield resp diff --git a/nix/module-server.nix b/nix/module-server.nix index f166a5fe..551bfe79 100644 --- a/nix/module-server.nix +++ b/nix/module-server.nix @@ -13,6 +13,7 @@ let app-name = "Docspell"; app-id = "rest1"; base-url = "http://localhost:7880"; + max-item-page-size = 500; bind = { address = "localhost"; port = 7880; @@ -100,6 +101,18 @@ in { ''; }; + max-item-page-size = mkOption { + type = types.int; + default = defaults.max-item-page-size; + description = '' + This is a hard limit to restrict the size of a batch that is + returned when searching for items. The user can set this limit + within the client config, but it is restricted by the server to + the number defined here. An admin might choose a lower number + depending on the available resources. + ''; + }; + bind = mkOption { type = types.submodule({ options = {