Add a route to get the item preview

This is the first available preview of an attachment wrt position. If
all attachments have a preview image, the preview of the first
attachment is returned.
This commit is contained in:
Eike Kettner
2020-11-08 14:22:33 +01:00
parent 8cc89fd3b7
commit 757ad31165
5 changed files with 123 additions and 0 deletions

View File

@ -1,5 +1,6 @@
package docspell.restserver.http4s
import cats.data.NonEmptyList
import fs2.text.utf8Encode
import fs2.{Pure, Stream}
@ -27,4 +28,12 @@ object Responses {
def unauthorized[F[_]]: Response[F] =
pureUnauthorized.copy(body = pureUnauthorized.body.covary[F])
def noCache[F[_]](r: Response[F]): Response[F] =
r.withHeaders(
`Cache-Control`(
NonEmptyList.of(CacheDirective.`no-cache`(), CacheDirective.`private`())
)
)
}

View File

@ -13,11 +13,14 @@ import docspell.common.{Ident, ItemState}
import docspell.restapi.model._
import docspell.restserver.Config
import docspell.restserver.conv.Conversions
import docspell.restserver.http4s.BinaryUtil
import docspell.restserver.http4s.Responses
import org.http4s.HttpRoutes
import org.http4s.circe.CirceEntityDecoder._
import org.http4s.circe.CirceEntityEncoder._
import org.http4s.dsl.Http4sDsl
import org.http4s.headers._
import org.log4s._
object ItemRoutes {
@ -315,6 +318,29 @@ object ItemRoutes {
resp <- Ok(Conversions.basicResult(res, "Attachment moved."))
} yield resp
case req @ GET -> Root / Ident(id) / "preview" =>
for {
preview <- backend.itemSearch.findItemPreview(id, user.account.collective)
inm = req.headers.get(`If-None-Match`).flatMap(_.tags)
matches = BinaryUtil.matchETag(preview.map(_.meta), inm)
resp <-
preview
.map { data =>
if (matches) BinaryUtil.withResponseHeaders(dsl, NotModified())(data)
else BinaryUtil.makeByteResp(dsl)(data).map(Responses.noCache)
}
.getOrElse(NotFound(BasicResult(false, "Not found")))
} yield resp
case HEAD -> Root / Ident(id) / "preview" =>
for {
preview <- backend.itemSearch.findItemPreview(id, user.account.collective)
resp <-
preview
.map(data => BinaryUtil.withResponseHeaders(dsl, Ok())(data))
.getOrElse(NotFound(BasicResult(false, "Not found")))
} yield resp
case req @ POST -> Root / Ident(id) / "reprocess" =>
for {
data <- req.as[IdList]