From b5842ef89f814d6bc9286a2a7de8278bb4411e94 Mon Sep 17 00:00:00 2001 From: Stewart Stewart Date: Tue, 9 May 2017 19:13:29 -0400 Subject: add method for normalize uuid constructed from path --- src/main/scala/xyz/driver/core/json.scala | 9 +++++++++ 1 file changed, 9 insertions(+) (limited to 'src') diff --git a/src/main/scala/xyz/driver/core/json.scala b/src/main/scala/xyz/driver/core/json.scala index 21bcad5..96e74c0 100644 --- a/src/main/scala/xyz/driver/core/json.scala +++ b/src/main/scala/xyz/driver/core/json.scala @@ -1,5 +1,7 @@ package xyz.driver.core +import java.util.UUID + import akka.http.scaladsl.model.Uri.Path import akka.http.scaladsl.server.PathMatcher.{Matched, Unmatched} import akka.http.scaladsl.server.{PathMatcher, _} @@ -22,6 +24,13 @@ object json { } } + def UuidInPath[T]: PathMatcher1[Id[T]] = new PathMatcher1[Id[T]] { + def apply(path: Path) = path match { + case Path.Segment(segment, tail) => Matched(tail, Tuple1(Id[T](UUID.fromString(segment).toString))) + case _ => Unmatched + } + } + implicit def idFormat[T] = new RootJsonFormat[Id[T]] { def write(id: Id[T]) = JsString(id.value) -- cgit v1.2.3 From df6202fa411b1294dd481c7d6c4062c3ecdbb437 Mon Sep 17 00:00:00 2001 From: Stewart Stewart Date: Wed, 10 May 2017 11:44:27 -0400 Subject: normalize uuid case on json deserialization --- src/main/scala/xyz/driver/core/json.scala | 23 +++++++++++++++++------ 1 file changed, 17 insertions(+), 6 deletions(-) (limited to 'src') diff --git a/src/main/scala/xyz/driver/core/json.scala b/src/main/scala/xyz/driver/core/json.scala index 96e74c0..67bf8e4 100644 --- a/src/main/scala/xyz/driver/core/json.scala +++ b/src/main/scala/xyz/driver/core/json.scala @@ -2,17 +2,18 @@ package xyz.driver.core import java.util.UUID +import scala.reflect.runtime.universe._ +import scala.util.Try + import akka.http.scaladsl.model.Uri.Path +import akka.http.scaladsl.server._ import akka.http.scaladsl.server.PathMatcher.{Matched, Unmatched} -import akka.http.scaladsl.server.{PathMatcher, _} import akka.http.scaladsl.unmarshalling.Unmarshaller -import spray.json.{DeserializationException, JsNumber, _} +import spray.json._ import xyz.driver.core.auth.AuthCredentials -import xyz.driver.core.time.Time import xyz.driver.core.date.{Date, Month} import xyz.driver.core.domain.{Email, PhoneNumber} - -import scala.reflect.runtime.universe._ +import xyz.driver.core.time.Time object json { import DefaultJsonProtocol._ @@ -31,7 +32,17 @@ object json { } } - implicit def idFormat[T] = new RootJsonFormat[Id[T]] { + implicit def uuidFormat[T] = new RootJsonFormat[Id[T]] { + def write(id: Id[T]) = JsString(id.value) + + def read(value: JsValue) = value match { + case JsString(id) if Try(UUID.fromString(id)).isSuccess => Id[T](id.toLowerCase) + case JsString(id) => throw DeserializationException("Expected Id as Uuid string") + case _ => throw DeserializationException("Id expects string") + } + } + + def idFormat[T] = new RootJsonFormat[Id[T]] { def write(id: Id[T]) = JsString(id.value) def read(value: JsValue) = value match { -- cgit v1.2.3 From 97e75b8d777c6661461493b28d91559fabf237ba Mon Sep 17 00:00:00 2001 From: Stewart Stewart Date: Wed, 10 May 2017 14:51:43 -0400 Subject: try to match uuid first in id PathMatcher --- src/main/scala/xyz/driver/core/json.scala | 11 +++-------- 1 file changed, 3 insertions(+), 8 deletions(-) (limited to 'src') diff --git a/src/main/scala/xyz/driver/core/json.scala b/src/main/scala/xyz/driver/core/json.scala index 67bf8e4..6f772f3 100644 --- a/src/main/scala/xyz/driver/core/json.scala +++ b/src/main/scala/xyz/driver/core/json.scala @@ -18,16 +18,11 @@ import xyz.driver.core.time.Time object json { import DefaultJsonProtocol._ - def IdInPath[T]: PathMatcher1[Id[T]] = new PathMatcher1[Id[T]] { - def apply(path: Path) = path match { - case Path.Segment(segment, tail) => Matched(tail, Tuple1(Id[T](segment))) - case _ => Unmatched - } - } + private def UuidInPath[T]: PathMatcher1[Id[T]] = PathMatchers.JavaUUID.map((id: UUID) => Id[T](id.toString)) - def UuidInPath[T]: PathMatcher1[Id[T]] = new PathMatcher1[Id[T]] { + def IdInPath[T]: PathMatcher1[Id[T]] = UuidInPath[T] | new PathMatcher1[Id[T]] { def apply(path: Path) = path match { - case Path.Segment(segment, tail) => Matched(tail, Tuple1(Id[T](UUID.fromString(segment).toString))) + case Path.Segment(segment, tail) => Matched(tail, Tuple1(Id[T](segment))) case _ => Unmatched } } -- cgit v1.2.3 From cc5144977ee247e0de5a119b4c86b3a16e1dd6e6 Mon Sep 17 00:00:00 2001 From: Stewart Stewart Date: Wed, 17 May 2017 23:13:07 -0400 Subject: make idFormat work with UUID --- src/main/scala/xyz/driver/core/json.scala | 15 +++------------ 1 file changed, 3 insertions(+), 12 deletions(-) (limited to 'src') diff --git a/src/main/scala/xyz/driver/core/json.scala b/src/main/scala/xyz/driver/core/json.scala index 6f772f3..b9d0745 100644 --- a/src/main/scala/xyz/driver/core/json.scala +++ b/src/main/scala/xyz/driver/core/json.scala @@ -18,7 +18,7 @@ import xyz.driver.core.time.Time object json { import DefaultJsonProtocol._ - private def UuidInPath[T]: PathMatcher1[Id[T]] = PathMatchers.JavaUUID.map((id: UUID) => Id[T](id.toString)) + private def UuidInPath[T]: PathMatcher1[Id[T]] = PathMatchers.JavaUUID.map((id: UUID) => Id[T](id.toString.toLowerCase)) def IdInPath[T]: PathMatcher1[Id[T]] = UuidInPath[T] | new PathMatcher1[Id[T]] { def apply(path: Path) = path match { @@ -27,25 +27,16 @@ object json { } } - implicit def uuidFormat[T] = new RootJsonFormat[Id[T]] { + implicit def idFormat[T] = new RootJsonFormat[Id[T]] { def write(id: Id[T]) = JsString(id.value) def read(value: JsValue) = value match { case JsString(id) if Try(UUID.fromString(id)).isSuccess => Id[T](id.toLowerCase) - case JsString(id) => throw DeserializationException("Expected Id as Uuid string") + case JsString(id) => Id[T](id) case _ => throw DeserializationException("Id expects string") } } - def idFormat[T] = new RootJsonFormat[Id[T]] { - def write(id: Id[T]) = JsString(id.value) - - def read(value: JsValue) = value match { - case JsString(id) => Id[T](id) - case _ => throw DeserializationException("Id expects string") - } - } - def NameInPath[T]: PathMatcher1[Name[T]] = new PathMatcher1[Name[T]] { def apply(path: Path) = path match { case Path.Segment(segment, tail) => Matched(tail, Tuple1(Name[T](segment))) -- cgit v1.2.3