diff options
author | Jakob Odersky <jakob@driver.xyz> | 2017-08-02 13:38:49 -0700 |
---|---|---|
committer | Jakob Odersky <jakob@driver.xyz> | 2017-08-16 19:26:10 -0700 |
commit | 985ee69beed836b97f3476306736d3f15ce37e1c (patch) | |
tree | 73a5ecb25c3162d574febe5d39cbb1fafaace699 /src/main/scala/xyz/driver/pdsuicommon/parsers/PaginationParser.scala | |
parent | 322ea28ecf5ad5f65d3376f3e97e004d229d4736 (diff) | |
download | rest-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.scala | 60 |
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: _*) + } + } + +} |