package com.apptentive.profile.routes import java.util.UUID import java.util.UUID.fromString import akka.http.scaladsl.server.Directive1 import akka.http.scaladsl.server.Directives._ import com.apptentive.profile.routes.Paging._ import scala.util._ trait Pagination { def extractPaging: Directive1[Paging] = { parameterMap.flatMap { params => // extraction val size = Try(params.get("page_size").map(_.toInt).get) val startsAfter = Try(params.get("starts_after").map(fromString)) (size, startsAfter) match { case (Failure(_), _) | (_, Failure(_)) | (Success(s), _) if !ValidPageSizes.contains(s) => reject case (_, _) => provide(Paging(startsAfter.getOrElse(None), size.getOrElse(DefaultPageSize))) } } } } object Paging { val DefaultPageSize: Int = 100 val ValidPageSizes: Range = 1 to 4000 } case class Paging(startsAfter: Option[UUID] = None, size: Int = DefaultPageSize)