aboutsummaryrefslogtreecommitdiff
path: root/src/main/scala/xyz/driver/core/rest/package.scala
diff options
context:
space:
mode:
Diffstat (limited to 'src/main/scala/xyz/driver/core/rest/package.scala')
-rw-r--r--src/main/scala/xyz/driver/core/rest/package.scala23
1 files changed, 19 insertions, 4 deletions
diff --git a/src/main/scala/xyz/driver/core/rest/package.scala b/src/main/scala/xyz/driver/core/rest/package.scala
index f85c39a..4858fa7 100644
--- a/src/main/scala/xyz/driver/core/rest/package.scala
+++ b/src/main/scala/xyz/driver/core/rest/package.scala
@@ -3,21 +3,21 @@ package xyz.driver.core.rest
import java.net.InetAddress
import akka.http.scaladsl.marshalling.{ToEntityMarshaller, ToResponseMarshallable}
-import akka.http.scaladsl.model.headers._
import akka.http.scaladsl.model._
+import akka.http.scaladsl.model.headers._
import akka.http.scaladsl.server.Directives._
import akka.http.scaladsl.server._
import akka.http.scaladsl.unmarshalling.Unmarshal
import akka.stream.Materializer
import akka.stream.scaladsl.Flow
import akka.util.ByteString
+import scalaz.Scalaz.{intInstance, stringInstance}
+import scalaz.syntax.equal._
+import scalaz.{Functor, OptionT}
import xyz.driver.tracing.TracingDirectives
import scala.concurrent.Future
import scala.util.Try
-import scalaz.{Functor, OptionT}
-import scalaz.Scalaz.{intInstance, stringInstance}
-import scalaz.syntax.equal._
trait Service
@@ -253,6 +253,21 @@ object `package` {
def paginationQuery(pagination: Pagination) =
Seq("pageNumber" -> pagination.pageNumber.toString, "pageSize" -> pagination.pageSize.toString)
+ def completeWithPagination[T](handler: Option[Pagination] => Future[ListResponse[T]])(
+ implicit marshaller: ToEntityMarshaller[Seq[T]]): Route = {
+ optionalPagination { pagination =>
+ onSuccess(handler(pagination)) {
+ case ListResponse(resultPart, ListResponse.Meta(count, _, pageSize)) =>
+ val pageCount = (count / pageSize) + (if (count % pageSize == 0) 0 else 1)
+ val headers = List(
+ RawHeader(ContextHeaders.ResourceCount, count.toString),
+ RawHeader(ContextHeaders.PageCount, pageCount.toString))
+
+ respondWithHeaders(headers)(complete(ToResponseMarshallable(resultPart)))
+ }
+ }
+ }
+
private def extractSorting(sortingString: Option[String]): Sorting = {
val sortingFields = sortingString.fold(Seq.empty[SortingField])(
_.split(",")