common/app/controllers/Paging.scala (26 lines of code) (raw):

package controllers import play.api.mvc.RequestHeader trait Paging extends implicits.Numbers { /* * Key/value of paging param name to default value */ private val pagingParams: Map[String, Int] = Map( "offset" -> 0, "page" -> 1, "page-size" -> 5, ) /** Pull out 'paging' query string params */ protected def extractPaging(request: RequestHeader): Map[String, Int] = { val paging = pagingParams.map { case (name, default) => try { (name, request.getQueryString(name).map(_.toInt).getOrElse(default)) } catch { case _: NumberFormatException => (name, default) } } // also compute actual offset, i.e. offset plus current page position val actualOffset = paging("offset") + (paging("page-size") * (paging("page") - 1)) paging + ("actual-offset" -> actualOffset) } protected def inferPage(request: RequestHeader): Int = request .getQueryString("page") .filter(_.isInt) .map(_.toInt) .getOrElse(1) }