diff options
author | Aleksandr <ognelisar@gmail.com> | 2018-03-12 17:32:25 +0700 |
---|---|---|
committer | Aleksandr <ognelisar@gmail.com> | 2018-03-12 17:32:25 +0700 |
commit | 04a21e9a5ab46f885cb51626d274d570fefe4a29 (patch) | |
tree | 862c9b8702c4f9f9410b85d09107cc73d5355c5a | |
parent | 1ea8a5c1298edae003f5d4d8c4b9e8581d834b04 (diff) | |
parent | 96aa1fbf7608e3b9cd1ba06c57ab1f356409733d (diff) | |
download | driver-core-04a21e9a5ab46f885cb51626d274d570fefe4a29.tar.gz driver-core-04a21e9a5ab46f885cb51626d274d570fefe4a29.tar.bz2 driver-core-04a21e9a5ab46f885cb51626d274d570fefe4a29.zip |
Merge branch 'master' into TM-1431
-rw-r--r-- | src/main/scala/xyz/driver/core/date.scala | 16 | ||||
-rw-r--r-- | src/main/scala/xyz/driver/core/generators.scala | 4 | ||||
-rw-r--r-- | src/main/scala/xyz/driver/core/json.scala | 5 | ||||
-rw-r--r-- | src/main/scala/xyz/driver/core/rest/errors/serviceException.scala | 24 | ||||
-rw-r--r-- | src/main/scala/xyz/driver/core/rest/package.scala | 10 | ||||
-rw-r--r-- | src/test/scala/xyz/driver/core/rest/RestTest.scala | 23 |
6 files changed, 67 insertions, 15 deletions
diff --git a/src/main/scala/xyz/driver/core/date.scala b/src/main/scala/xyz/driver/core/date.scala index d6f64e4..fe35c91 100644 --- a/src/main/scala/xyz/driver/core/date.scala +++ b/src/main/scala/xyz/driver/core/date.scala @@ -5,6 +5,7 @@ import java.util.Calendar import scala.util.Try import scalaz.std.anyVal._ +import scalaz.Scalaz.stringInstance import scalaz.syntax.equal._ /** @@ -14,6 +15,21 @@ import scalaz.syntax.equal._ */ object date { + sealed trait DayOfWeek + object DayOfWeek { + case object Monday extends DayOfWeek + case object Tuesday extends DayOfWeek + case object Wednesday extends DayOfWeek + case object Thursday extends DayOfWeek + case object Friday extends DayOfWeek + case object Saturday extends DayOfWeek + case object Sunday extends DayOfWeek + + val All: Set[DayOfWeek] = Set(Monday, Tuesday, Wednesday, Thursday, Friday, Saturday, Sunday) + + def fromString(day: String): Option[DayOfWeek] = All.find(_.toString === day) + } + type Day = Int @@ Day.type object Day { diff --git a/src/main/scala/xyz/driver/core/generators.scala b/src/main/scala/xyz/driver/core/generators.scala index e842dd2..e3ff326 100644 --- a/src/main/scala/xyz/driver/core/generators.scala +++ b/src/main/scala/xyz/driver/core/generators.scala @@ -4,7 +4,7 @@ import java.math.MathContext import java.util.UUID import xyz.driver.core.time.{Time, TimeRange} -import xyz.driver.core.date.Date +import xyz.driver.core.date.{Date, DayOfWeek} import scala.reflect.ClassTag import scala.util.Random @@ -80,6 +80,8 @@ object generators { def nextDate(): Date = nextTime().toDate(java.util.TimeZone.getTimeZone("UTC")) + def nextDayOfWeek(): DayOfWeek = oneOf(DayOfWeek.All) + def nextBigDecimal(multiplier: Double = 1000000.00, precision: Int = 2): BigDecimal = BigDecimal(multiplier * nextDouble, new MathContext(precision)) diff --git a/src/main/scala/xyz/driver/core/json.scala b/src/main/scala/xyz/driver/core/json.scala index e338638..02a35fd 100644 --- a/src/main/scala/xyz/driver/core/json.scala +++ b/src/main/scala/xyz/driver/core/json.scala @@ -12,7 +12,7 @@ import akka.http.scaladsl.marshalling.{Marshaller, Marshalling} import akka.http.scaladsl.unmarshalling.Unmarshaller import spray.json._ import xyz.driver.core.auth.AuthCredentials -import xyz.driver.core.date.{Date, Month} +import xyz.driver.core.date.{Date, DayOfWeek, Month} import xyz.driver.core.domain.{Email, PhoneNumber} import xyz.driver.core.time.Time import eu.timepit.refined.refineV @@ -80,6 +80,9 @@ object json { } } + implicit val dayOfWeekFormat: JsonFormat[DayOfWeek] = + new EnumJsonFormat[DayOfWeek](DayOfWeek.All.map(w => w.toString -> w)(collection.breakOut): _*) + implicit val dateFormat = new RootJsonFormat[Date] { def write(date: Date) = JsString(date.toString) def read(value: JsValue): Date = value match { diff --git a/src/main/scala/xyz/driver/core/rest/errors/serviceException.scala b/src/main/scala/xyz/driver/core/rest/errors/serviceException.scala index d842c94..095936e 100644 --- a/src/main/scala/xyz/driver/core/rest/errors/serviceException.scala +++ b/src/main/scala/xyz/driver/core/rest/errors/serviceException.scala @@ -1,22 +1,20 @@ package xyz.driver.core.rest.errors -sealed abstract class ServiceException extends Exception { - def message: String -} +sealed abstract class ServiceException(val message: String) extends Exception(message) -final case class InvalidInputException(override val message: String = "Invalid input") extends ServiceException +final case class InvalidInputException(override val message: String = "Invalid input") extends ServiceException(message) final case class InvalidActionException(override val message: String = "This action is not allowed") - extends ServiceException + extends ServiceException(message) -final case class ResourceNotFoundException(override val message: String = "Resource not found") extends ServiceException +final case class ResourceNotFoundException(override val message: String = "Resource not found") + extends ServiceException(message) -final case class ExternalServiceException(serviceName: String, serviceMessage: String) extends ServiceException { - override def message = s"Error while calling '$serviceName': $serviceMessage" -} +final case class ExternalServiceException(serviceName: String, serviceMessage: String) + extends ServiceException(s"Error while calling '$serviceName': $serviceMessage") -final case class ExternalServiceTimeoutException(serviceName: String) extends ServiceException { - override def message = s"$serviceName took too long to respond" -} +final case class ExternalServiceTimeoutException(serviceName: String) + extends ServiceException(s"$serviceName took too long to respond") -final case class DatabaseException(override val message: String = "Database access error") extends ServiceException +final case class DatabaseException(override val message: String = "Database access error") + extends ServiceException(message) diff --git a/src/main/scala/xyz/driver/core/rest/package.scala b/src/main/scala/xyz/driver/core/rest/package.scala index 3b17167..07eb92e 100644 --- a/src/main/scala/xyz/driver/core/rest/package.scala +++ b/src/main/scala/xyz/driver/core/rest/package.scala @@ -227,6 +227,16 @@ object `package` { val paginated: Directive1[Pagination] = parameters(("pageSize".as[Int] ? 100, "pageNumber".as[Int] ? 1)).as(Pagination) + private def extractPagination(pageSizeOpt: Option[Int], pageNumberOpt: Option[Int]): Option[Pagination] = + (pageSizeOpt, pageNumberOpt) match { + case (Some(size), Some(number)) => Option(Pagination(size, number)) + case (None, None) => Option.empty[Pagination] + case (_, _) => throw new IllegalArgumentException("Pagination's parameters are incorrect") + } + + val optionalPagination: Directive1[Option[Pagination]] = + parameters(("pageSize".as[Int].?, "pageNumber".as[Int].?)).as(extractPagination) + def paginationQuery(pagination: Pagination) = Seq("pageNumber" -> pagination.pageNumber.toString, "pageSize" -> pagination.pageSize.toString) } diff --git a/src/test/scala/xyz/driver/core/rest/RestTest.scala b/src/test/scala/xyz/driver/core/rest/RestTest.scala index d36e04d..68fe419 100644 --- a/src/test/scala/xyz/driver/core/rest/RestTest.scala +++ b/src/test/scala/xyz/driver/core/rest/RestTest.scala @@ -47,4 +47,27 @@ class RestTest extends WordSpec with Matchers with ScalatestRouteTest with Direc } } } + + "optional paginated directive" should { + val route: Route = rest.optionalPagination { paginated => + complete(StatusCodes.OK -> paginated.map(p => s"${p.pageNumber},${p.pageSize}").getOrElse("no pagination")) + } + "accept a pagination" in { + Get("/?pageNumber=2&pageSize=42") ~> route ~> check { + assert(status == StatusCodes.OK) + assert(entityAs[String] == "2,42") + } + } + "without pagination" in { + Get("/") ~> route ~> check { + assert(status == StatusCodes.OK) + assert(entityAs[String] == "no pagination") + } + } + "reject an invalid pagination" in { + Get("/?pageNumber=1") ~> route ~> check { + assert(rejection.isInstanceOf[ValidationRejection]) + } + } + } } |