diff options
author | Kseniya Tomskikh <ktomskih@datamonsters.co> | 2018-05-11 11:46:13 -0700 |
---|---|---|
committer | GitHub <noreply@github.com> | 2018-05-11 11:46:13 -0700 |
commit | 803c76244bd7a4772f727e5b47f84bcc9f5adcd4 (patch) | |
tree | a2887d636a62d601b7aad1ad6865c19554ca0e72 | |
parent | b844c843f3b4433b37ddd2d7e8c10a183c47ca08 (diff) | |
download | driver-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.scala | 40 |
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) + } } |