aboutsummaryrefslogtreecommitdiff
path: root/src/main/scala/xyz/driver/pdsuicommon/parsers/PaginationParser.scala
diff options
context:
space:
mode:
authorJakob Odersky <jakob@driver.xyz>2017-08-02 13:38:49 -0700
committerJakob Odersky <jakob@driver.xyz>2017-08-16 19:26:10 -0700
commit985ee69beed836b97f3476306736d3f15ce37e1c (patch)
tree73a5ecb25c3162d574febe5d39cbb1fafaace699 /src/main/scala/xyz/driver/pdsuicommon/parsers/PaginationParser.scala
parent322ea28ecf5ad5f65d3376f3e97e004d229d4736 (diff)
downloadrest-query-985ee69beed836b97f3476306736d3f15ce37e1c.tar.gz
rest-query-985ee69beed836b97f3476306736d3f15ce37e1c.tar.bz2
rest-query-985ee69beed836b97f3476306736d3f15ce37e1c.zip
Add parsers to common
Diffstat (limited to 'src/main/scala/xyz/driver/pdsuicommon/parsers/PaginationParser.scala')
-rw-r--r--src/main/scala/xyz/driver/pdsuicommon/parsers/PaginationParser.scala60
1 files changed, 60 insertions, 0 deletions
diff --git a/src/main/scala/xyz/driver/pdsuicommon/parsers/PaginationParser.scala b/src/main/scala/xyz/driver/pdsuicommon/parsers/PaginationParser.scala
new file mode 100644
index 0000000..a6a7fae
--- /dev/null
+++ b/src/main/scala/xyz/driver/pdsuicommon/parsers/PaginationParser.scala
@@ -0,0 +1,60 @@
+package xyz.driver.server.parsers
+
+import xyz.driver.pdsuicommon.db.Pagination
+import xyz.driver.server.parsers.errors.ParseQueryArgException
+import play.api.data.validation._
+import play.api.routing.sird.QueryString
+import xyz.driver.pdsuicommon.validation.AdditionalConstraints
+
+import scala.util.Try
+
+object PaginationParser {
+
+ private val oneQueryArgConstraint: Constraint[Seq[String]] = {
+ Constraint("query.oneArg") {
+ case Nil => Valid
+ case x +: Nil => Valid
+ case xs =>
+ Invalid(new ValidationError(Seq(s"must be one argument, but there are multiple: '${xs.mkString(", ")}'")))
+ }
+ }
+
+ private val pageSizeCheckConstraint: Constraint[Seq[String]] = {
+ Constraint("pagination.pageSize") { args =>
+ oneQueryArgConstraint(args) match {
+ case x: Invalid => x
+ case Valid => AdditionalConstraints.positivePrintedNumber(args.head)
+ }
+ }
+ }
+
+ private val pageNumberCheckConstraint: Constraint[Seq[String]] = {
+ Constraint("pagination.pageNumber") { args =>
+ oneQueryArgConstraint(args) match {
+ case x: Invalid => x
+ case Valid => AdditionalConstraints.positivePrintedNumber(args.head)
+ }
+ }
+ }
+
+ def parse(queryString: QueryString): Try[Pagination] = Try {
+ val rawPageSizes = queryString.getOrElse("pageSize", Seq(Pagination.Default.pageSize.toString))
+ val rawPageNumbers = queryString.getOrElse("pageNumber", Seq(Pagination.Default.pageNumber.toString))
+
+ val validation = Seq(
+ "pageSize" -> pageSizeCheckConstraint(rawPageSizes),
+ "pageNumber" -> pageNumberCheckConstraint(rawPageNumbers)
+ )
+
+ val validationErrors = validation.collect {
+ case (fieldName, e: Invalid) => (fieldName, e.errors.mkString("; "))
+ }
+
+ if (validationErrors.isEmpty) {
+ Pagination(Integer.parseInt(rawPageSizes.head), Integer.parseInt(rawPageNumbers.head))
+ } else {
+ throw new ParseQueryArgException(validationErrors: _*)
+ }
+ }
+
+}