aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAleksandr <ognelisar@gmail.com>2018-03-12 17:32:25 +0700
committerAleksandr <ognelisar@gmail.com>2018-03-12 17:32:25 +0700
commit04a21e9a5ab46f885cb51626d274d570fefe4a29 (patch)
tree862c9b8702c4f9f9410b85d09107cc73d5355c5a
parent1ea8a5c1298edae003f5d4d8c4b9e8581d834b04 (diff)
parent96aa1fbf7608e3b9cd1ba06c57ab1f356409733d (diff)
downloaddriver-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.scala16
-rw-r--r--src/main/scala/xyz/driver/core/generators.scala4
-rw-r--r--src/main/scala/xyz/driver/core/json.scala5
-rw-r--r--src/main/scala/xyz/driver/core/rest/errors/serviceException.scala24
-rw-r--r--src/main/scala/xyz/driver/core/rest/package.scala10
-rw-r--r--src/test/scala/xyz/driver/core/rest/RestTest.scala23
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])
+ }
+ }
+ }
}