From 55dfee4187431bb5acb0b898ffb60111a47d9705 Mon Sep 17 00:00:00 2001 From: Kseniya Tomskikh Date: Tue, 6 Mar 2018 14:28:54 +0700 Subject: Created directive for optional pagination --- src/main/scala/xyz/driver/core/rest/package.scala | 10 ++++++++++ 1 file changed, 10 insertions(+) (limited to 'src/main/scala/xyz/driver') diff --git a/src/main/scala/xyz/driver/core/rest/package.scala b/src/main/scala/xyz/driver/core/rest/package.scala index 19752a1..fb5f4ec 100644 --- a/src/main/scala/xyz/driver/core/rest/package.scala +++ b/src/main/scala/xyz/driver/core/rest/package.scala @@ -219,6 +219,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 optionalPaginated: 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) } -- cgit v1.2.3 From a4dd609bbef58f631f5ceaa1f034deb0ecf12db1 Mon Sep 17 00:00:00 2001 From: Zach Smith Date: Tue, 6 Mar 2018 15:00:16 -0800 Subject: Add DayOfWeek type --- src/main/scala/xyz/driver/core/date.scala | 16 ++++++++++++++++ src/main/scala/xyz/driver/core/generators.scala | 4 +++- src/main/scala/xyz/driver/core/json.scala | 5 ++++- 3 files changed, 23 insertions(+), 2 deletions(-) (limited to 'src/main/scala/xyz/driver') 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 { -- cgit v1.2.3 From cfea2749380d367f4a525c90792b66241df42273 Mon Sep 17 00:00:00 2001 From: Kseniya Tomskikh Date: Wed, 7 Mar 2018 11:28:08 +0700 Subject: Review fix --- src/main/scala/xyz/driver/core/rest/package.scala | 2 +- src/test/scala/xyz/driver/core/rest/RestTest.scala | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) (limited to 'src/main/scala/xyz/driver') diff --git a/src/main/scala/xyz/driver/core/rest/package.scala b/src/main/scala/xyz/driver/core/rest/package.scala index fb5f4ec..e3c0c40 100644 --- a/src/main/scala/xyz/driver/core/rest/package.scala +++ b/src/main/scala/xyz/driver/core/rest/package.scala @@ -226,7 +226,7 @@ object `package` { case (_, _) => throw new IllegalArgumentException("Pagination's parameters are incorrect") } - val optionalPaginated: Directive1[Option[Pagination]] = + val optionalPagination: Directive1[Option[Pagination]] = parameters(("pageSize".as[Int].?, "pageNumber".as[Int].?)).as(extractPagination) def paginationQuery(pagination: Pagination) = diff --git a/src/test/scala/xyz/driver/core/rest/RestTest.scala b/src/test/scala/xyz/driver/core/rest/RestTest.scala index 80e4fd5..68fe419 100644 --- a/src/test/scala/xyz/driver/core/rest/RestTest.scala +++ b/src/test/scala/xyz/driver/core/rest/RestTest.scala @@ -49,7 +49,7 @@ class RestTest extends WordSpec with Matchers with ScalatestRouteTest with Direc } "optional paginated directive" should { - val route: Route = rest.optionalPaginated { paginated => + val route: Route = rest.optionalPagination { paginated => complete(StatusCodes.OK -> paginated.map(p => s"${p.pageNumber},${p.pageSize}").getOrElse("no pagination")) } "accept a pagination" in { -- cgit v1.2.3 From 5844800b369b5c58b557310ac0a0a36c2c3ff5a4 Mon Sep 17 00:00:00 2001 From: Zach Smith Date: Fri, 9 Mar 2018 10:59:28 -0800 Subject: Fix ServiceException classes to set Exception message for stack traces --- .../driver/core/rest/errors/serviceException.scala | 24 ++++++++++------------ 1 file changed, 11 insertions(+), 13 deletions(-) (limited to 'src/main/scala/xyz/driver') 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) -- cgit v1.2.3