From eb5e95e95714ce23705a0de0f4dd525a8efeafe2 Mon Sep 17 00:00:00 2001 From: Jakob Odersky Date: Thu, 3 Aug 2017 14:22:46 -0700 Subject: Remove play requirements from parsers --- .../pdsuicommon/parsers/DimensionsParser.scala | 14 ++--- .../pdsuicommon/parsers/ListRequestParser.scala | 20 -------- .../pdsuicommon/parsers/PaginationParser.scala | 60 ---------------------- .../parsers/ParseQueryArgException.scala | 2 +- .../pdsuicommon/parsers/SearchFilterParser.scala | 10 ++-- .../driver/pdsuicommon/parsers/SortingParser.scala | 12 ++--- 6 files changed, 17 insertions(+), 101 deletions(-) delete mode 100644 src/main/scala/xyz/driver/pdsuicommon/parsers/ListRequestParser.scala delete mode 100644 src/main/scala/xyz/driver/pdsuicommon/parsers/PaginationParser.scala (limited to 'src/main/scala/xyz') diff --git a/src/main/scala/xyz/driver/pdsuicommon/parsers/DimensionsParser.scala b/src/main/scala/xyz/driver/pdsuicommon/parsers/DimensionsParser.scala index 147102b..f23b1b0 100644 --- a/src/main/scala/xyz/driver/pdsuicommon/parsers/DimensionsParser.scala +++ b/src/main/scala/xyz/driver/pdsuicommon/parsers/DimensionsParser.scala @@ -1,8 +1,7 @@ -package xyz.driver.server.parsers +package xyz.driver.pdsuicommon.parsers -import play.api.libs.json._ -import play.api.routing.sird._ -import xyz.driver.pdsuicommon.utils.WritesUtils +//import play.api.libs.json._ +//import xyz.driver.pdsuicommon.utils.WritesUtils import scala.util.{Failure, Success, Try} @@ -12,14 +11,15 @@ class Dimensions(private val xs: Set[String] = Set.empty) { object DimensionsParser { + /* private class DimensionsWrapper[T](dimensions: Dimensions)(implicit orig: Writes[T]) extends Writes[T] { private val filteredWrites = WritesUtils.filterKeys[T](dimensions.contains) override def writes(o: T): JsValue = filteredWrites.writes(o) } + */ - def tryParse(queryString: QueryString): Try[Dimensions] = { - val rawDimensions = queryString.getOrElse("dimensions", Seq.empty) - rawDimensions match { + def tryParse(query: Seq[(String, String)]): Try[Dimensions] = { + query.collect{ case ("dimensions", value) => value } match { case Nil => Success(new Dimensions()) case x +: Nil => diff --git a/src/main/scala/xyz/driver/pdsuicommon/parsers/ListRequestParser.scala b/src/main/scala/xyz/driver/pdsuicommon/parsers/ListRequestParser.scala deleted file mode 100644 index 617a77e..0000000 --- a/src/main/scala/xyz/driver/pdsuicommon/parsers/ListRequestParser.scala +++ /dev/null @@ -1,20 +0,0 @@ -package xyz.driver.server.parsers - -import xyz.driver.pdsuicommon.db.{Pagination, SearchFilterExpr, Sorting} -import play.api.mvc._ - -import scala.util.Try - -final case class ListRequestParameters(filter: SearchFilterExpr, sorting: Sorting, pagination: Pagination) - -class ListRequestParser(validSortingFields: Set[String]) { - - def tryParse(request: Request[AnyContent]): Try[ListRequestParameters] = { - for { - queryFilters <- SearchFilterParser.parse(request.queryString) - sorting <- SortingParser.parse(validSortingFields, request.queryString) - pagination <- PaginationParser.parse(request.queryString) - } yield ListRequestParameters(queryFilters, sorting, pagination) - } - -} diff --git a/src/main/scala/xyz/driver/pdsuicommon/parsers/PaginationParser.scala b/src/main/scala/xyz/driver/pdsuicommon/parsers/PaginationParser.scala deleted file mode 100644 index a6a7fae..0000000 --- a/src/main/scala/xyz/driver/pdsuicommon/parsers/PaginationParser.scala +++ /dev/null @@ -1,60 +0,0 @@ -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: _*) - } - } - -} diff --git a/src/main/scala/xyz/driver/pdsuicommon/parsers/ParseQueryArgException.scala b/src/main/scala/xyz/driver/pdsuicommon/parsers/ParseQueryArgException.scala index c3ab020..64b3d2e 100644 --- a/src/main/scala/xyz/driver/pdsuicommon/parsers/ParseQueryArgException.scala +++ b/src/main/scala/xyz/driver/pdsuicommon/parsers/ParseQueryArgException.scala @@ -1,3 +1,3 @@ -package xyz.driver.server.parsers.errors +package xyz.driver.pdsuicommon.parsers class ParseQueryArgException(val errors: (String, String)*) extends Exception(errors.mkString(",")) diff --git a/src/main/scala/xyz/driver/pdsuicommon/parsers/SearchFilterParser.scala b/src/main/scala/xyz/driver/pdsuicommon/parsers/SearchFilterParser.scala index c6ea2e1..58b80ce 100644 --- a/src/main/scala/xyz/driver/pdsuicommon/parsers/SearchFilterParser.scala +++ b/src/main/scala/xyz/driver/pdsuicommon/parsers/SearchFilterParser.scala @@ -1,11 +1,9 @@ -package xyz.driver.server.parsers +package xyz.driver.pdsuicommon.parsers -import xyz.driver.server.parsers.errors.ParseQueryArgException import xyz.driver.pdsuicommon.utils.Implicits.{toCharOps, toStringOps} import fastparse.all._ import fastparse.core.Parsed import fastparse.parsers.Intrinsics.CharPred -import play.api.routing.sird._ import xyz.driver.pdsuicommon.db.{SearchFilterBinaryOperation, SearchFilterExpr, SearchFilterNAryOperation} import scala.util.Try @@ -110,11 +108,11 @@ object SearchFilterParser { private val atomParser: Parser[SearchFilterExpr.Atom] = P(binaryAtomParser | nAryAtomParser) - def parse(queryString: QueryString): Try[SearchFilterExpr] = Try { - queryString.getOrElse("filters", Seq.empty) match { + def parse(query: Seq[(String, String)]): Try[SearchFilterExpr] = Try { + query.toList.collect { case ("filters", value) => value } match { case Nil => SearchFilterExpr.Empty - case head +: Nil => + case head :: Nil => atomParser.parse(head) match { case Parsed.Success(x, _) => x case e: Parsed.Failure => throw new ParseQueryArgException("filters" -> formatFailure(1, e)) diff --git a/src/main/scala/xyz/driver/pdsuicommon/parsers/SortingParser.scala b/src/main/scala/xyz/driver/pdsuicommon/parsers/SortingParser.scala index c042211..375dee2 100644 --- a/src/main/scala/xyz/driver/pdsuicommon/parsers/SortingParser.scala +++ b/src/main/scala/xyz/driver/pdsuicommon/parsers/SortingParser.scala @@ -1,10 +1,8 @@ -package xyz.driver.server.parsers +package xyz.driver.pdsuicommon.parsers -import xyz.driver.server.parsers.errors.ParseQueryArgException import xyz.driver.pdsuicommon.db.{Sorting, SortingOrder} import fastparse.all._ import fastparse.core.Parsed -import play.api.routing.sird._ import scala.util.Try @@ -32,11 +30,11 @@ object SortingParser { } } - def parse(validDimensions: Set[String], queryString: QueryString): Try[Sorting] = Try { - queryString.getOrElse("sort", Seq.empty) match { + def parse(validDimensions: Set[String], query: Seq[(String, String)]): Try[Sorting] = Try { + query.toList.collect { case ("sort", value) => value } match { case Nil => Sorting.Sequential(Seq.empty) - case rawSorting +: Nil => + case rawSorting :: Nil => val parser = sequentialSortingParser(validDimensions.toSeq) parser.parse(rawSorting) match { case Parsed.Success(x, _) => x @@ -44,7 +42,7 @@ object SortingParser { throw new ParseQueryArgException("sort" -> formatFailure(e)) } - case xs => throw new ParseQueryArgException("sort" -> "multiple sections are not allowed") + case _ => throw new ParseQueryArgException("sort" -> "multiple sections are not allowed") } } -- cgit v1.2.3