aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorKseniya Tomskikh <ktomskih@datamonsters.co>2018-05-11 11:46:13 -0700
committerGitHub <noreply@github.com>2018-05-11 11:46:13 -0700
commit803c76244bd7a4772f727e5b47f84bcc9f5adcd4 (patch)
treea2887d636a62d601b7aad1ad6865c19554ca0e72
parentb844c843f3b4433b37ddd2d7e8c10a183c47ca08 (diff)
downloaddriver-core-803c76244bd7a4772f727e5b47f84bcc9f5adcd4.tar.gz
driver-core-803c76244bd7a4772f727e5b47f84bcc9f5adcd4.tar.bz2
driver-core-803c76244bd7a4772f727e5b47f84bcc9f5adcd4.zip
TRIAL-371 Support sorting (#159)v1.9.2
* TRIAL-371 Sorting for services * TRIAL-371 Fixed extract sorting parameters * TRIAL-371 Fixed varname * TRIAL-371 Review fixes
-rw-r--r--src/main/scala/xyz/driver/core/rest/package.scala40
1 files changed, 40 insertions, 0 deletions
diff --git a/src/main/scala/xyz/driver/core/rest/package.scala b/src/main/scala/xyz/driver/core/rest/package.scala
index d8f004e..f85c39a 100644
--- a/src/main/scala/xyz/driver/core/rest/package.scala
+++ b/src/main/scala/xyz/driver/core/rest/package.scala
@@ -33,6 +33,15 @@ trait ServiceTransport {
implicit mat: Materializer): Future[Unmarshal[ResponseEntity]]
}
+sealed trait SortingOrder
+object SortingOrder {
+ case object Asc extends SortingOrder
+ case object Desc extends SortingOrder
+}
+
+final case class SortingField(name: String, sortingOrder: SortingOrder)
+final case class Sorting(sortingFields: Seq[SortingField])
+
final case class Pagination(pageSize: Int, pageNumber: Int) {
require(pageSize > 0, "Page size must be greater than zero")
require(pageNumber > 0, "Page number must be greater than zero")
@@ -243,4 +252,35 @@ object `package` {
def paginationQuery(pagination: Pagination) =
Seq("pageNumber" -> pagination.pageNumber.toString, "pageSize" -> pagination.pageSize.toString)
+
+ private def extractSorting(sortingString: Option[String]): Sorting = {
+ val sortingFields = sortingString.fold(Seq.empty[SortingField])(
+ _.split(",")
+ .filter(_.length > 0)
+ .map { sortingParam =>
+ if (sortingParam.startsWith("-")) {
+ SortingField(sortingParam.substring(1), SortingOrder.Desc)
+ } else {
+ val fieldName = if (sortingParam.startsWith("+")) sortingParam.substring(1) else sortingParam
+ SortingField(fieldName, SortingOrder.Asc)
+ }
+ }
+ .toSeq)
+
+ Sorting(sortingFields)
+ }
+
+ val sorting: Directive1[Sorting] = parameter("sort".as[String].?).as(extractSorting)
+
+ def sortingQuery(sorting: Sorting): Seq[(String, String)] = {
+ val sortingString = sorting.sortingFields
+ .map { sortingField =>
+ sortingField.sortingOrder match {
+ case SortingOrder.Asc => sortingField.name
+ case SortingOrder.Desc => s"-${sortingField.name}"
+ }
+ }
+ .mkString(",")
+ Seq("sort" -> sortingString)
+ }
}