Skip to content

Instantly share code, notes, and snippets.

@roshane
Last active March 19, 2020 09:07
Show Gist options
  • Save roshane/5132ccd1ec130e55d9be9e2e2256b99a to your computer and use it in GitHub Desktop.
Save roshane/5132ccd1ec130e55d9be9e2e2256b99a to your computer and use it in GitHub Desktop.
custom akka-http directive for pagination
//request response model
case class PageRequest(page: Int, size: Int)
case class PageResponse[T](page: Int, size: Int, totalPages: Int, data: Seq[T])
//sample routes
private val routes = path("echo") {
get {
complete("hello world")
}
} ~
path("customers") {
get {
complete(PageResponse[Customer](1, 10, 1, Util.randomCustomers()))
}
} ~
path("request") {
pagedRequest { pageRequest =>
parameter('name.?) { name =>
get {
complete(
s"""
|page = ${pageRequest.page}
|size = ${pageRequest.size}
|name = $name
""".stripMargin)
}
}
}
}
//page directive
def pagedRequest: Directive1[PageRequest] = {
val pageAndSize = parameters(("page".as[Int].?, "size".as[Int].?))
pageAndSize.tmap {
case (Some(p), Some(s)) => PageRequest(p, s)
case _ => PageRequest(1, 100)
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment