From 803c76244bd7a4772f727e5b47f84bcc9f5adcd4 Mon Sep 17 00:00:00 2001 From: Kseniya Tomskikh Date: Fri, 11 May 2018 11:46:13 -0700 Subject: TRIAL-371 Support sorting (#159) * TRIAL-371 Sorting for services * TRIAL-371 Fixed extract sorting parameters * TRIAL-371 Fixed varname * TRIAL-371 Review fixes --- src/main/scala/xyz/driver/core/rest/package.scala | 40 +++++++++++++++++++++++ 1 file changed, 40 insertions(+) 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) + } } -- cgit v1.2.3