aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorKseniya Tomskikh <ktomskih@datamonsters.co>2018-01-09 16:38:33 +0700
committerGitHub <noreply@github.com>2018-01-09 16:38:33 +0700
commit5bbb0bc66db5b49eb0e3f197be17798fb8093f2a (patch)
treee193a8a98a00eead3aac04ca52b2ba74473d7de0
parentd01a88b78638e4638216e0469c11a68a9e57effe (diff)
parent307488eaa7d725979688b26ffbbc57b938870bb7 (diff)
downloadrest-query-5bbb0bc66db5b49eb0e3f197be17798fb8093f2a.tar.gz
rest-query-5bbb0bc66db5b49eb0e3f197be17798fb8093f2a.tar.bz2
rest-query-5bbb0bc66db5b49eb0e3f197be17798fb8093f2a.zip
Merge pull request #68 from drivergroup/support-service-exceptionsv0.15.0
Support service exceptions
-rw-r--r--src/main/scala/xyz/driver/pdsuicommon/error/DomainError.scala14
-rw-r--r--src/main/scala/xyz/driver/pdsuicommon/http/Directives.scala17
-rw-r--r--src/main/scala/xyz/driver/pdsuidomain/services/rest/RestHelper.scala19
3 files changed, 14 insertions, 36 deletions
diff --git a/src/main/scala/xyz/driver/pdsuicommon/error/DomainError.scala b/src/main/scala/xyz/driver/pdsuicommon/error/DomainError.scala
index c761414..becb585 100644
--- a/src/main/scala/xyz/driver/pdsuicommon/error/DomainError.scala
+++ b/src/main/scala/xyz/driver/pdsuicommon/error/DomainError.scala
@@ -16,9 +16,6 @@ object DomainError {
// 404 error
trait NotFoundError extends DomainError
- // 401 error
- trait AuthenticationError extends DomainError
-
// 403 error
trait AuthorizationError extends DomainError
@@ -28,14 +25,3 @@ object DomainError {
Unsafe(Utils.getClassSimpleName(x.getClass))
}
}
-
-/** Subclasses of this exception correspond to subclasses of DomainError. They
- * are used in REST service implementations to fail futures rather than
- * returning successful futures, completed with corresponding DomainErrors. */
-// scalastyle:off null
-@SuppressWarnings(Array("org.wartremover.warts.Null"))
-class DomainException(message: String, cause: Throwable = null) extends RuntimeException(message, cause)
-class NotFoundException(message: String) extends DomainException(message) // 404
-class AuthenticationException(message: String) extends DomainException(message) // 401
-class AuthorizationException(message: String) extends DomainException(message) // 403
-// scalastyle:on null
diff --git a/src/main/scala/xyz/driver/pdsuicommon/http/Directives.scala b/src/main/scala/xyz/driver/pdsuicommon/http/Directives.scala
index 93eb62f..ecc30df 100644
--- a/src/main/scala/xyz/driver/pdsuicommon/http/Directives.scala
+++ b/src/main/scala/xyz/driver/pdsuicommon/http/Directives.scala
@@ -13,6 +13,7 @@ import xyz.driver.pdsuicommon.domain._
import akka.http.scaladsl.marshallers.sprayjson.SprayJsonSupport._
import xyz.driver.core.generators
import xyz.driver.core.rest.ContextHeaders
+import xyz.driver.core.rest.errors.{InvalidActionException, InvalidInputException, ResourceNotFoundException}
import scala.util.control._
import scala.util._
@@ -61,10 +62,9 @@ trait Directives {
PathMatchers.JavaUUID.map((id) => UuidId(id))
def failFast[A](reply: A): A = reply match {
- case err: NotFoundError => throw new NotFoundException(err.getMessage)
- case err: AuthenticationError => throw new AuthenticationException(err.getMessage)
- case err: AuthorizationError => throw new AuthorizationException(err.getMessage)
- case err: DomainError => throw new DomainException(err.getMessage)
+ case err: NotFoundError => throw ResourceNotFoundException(err.getMessage)
+ case err: AuthorizationError => throw InvalidActionException(err.getMessage)
+ case err: DomainError => throw InvalidInputException(err.getMessage)
case other => other
}
@@ -72,11 +72,10 @@ trait Directives {
def errorResponse(ex: Throwable) =
ErrorsResponse(Seq(ResponseError(None, ex.getMessage, 1)), req)
ExceptionHandler {
- case ex: AuthenticationException => complete(StatusCodes.Unauthorized -> errorResponse(ex))
- case ex: AuthorizationException => complete(StatusCodes.Forbidden -> errorResponse(ex))
- case ex: NotFoundException => complete(StatusCodes.NotFound -> errorResponse(ex))
- case ex: DomainException => complete(StatusCodes.BadRequest -> errorResponse(ex))
- case NonFatal(ex) => complete(StatusCodes.InternalServerError -> errorResponse(ex))
+ case ex: InvalidActionException => complete(StatusCodes.Forbidden -> errorResponse(ex))
+ case ex: ResourceNotFoundException => complete(StatusCodes.NotFound -> errorResponse(ex))
+ case ex: InvalidInputException => complete(StatusCodes.BadRequest -> errorResponse(ex))
+ case NonFatal(ex) => complete(StatusCodes.InternalServerError -> errorResponse(ex))
}
}
diff --git a/src/main/scala/xyz/driver/pdsuidomain/services/rest/RestHelper.scala b/src/main/scala/xyz/driver/pdsuidomain/services/rest/RestHelper.scala
index 527ae73..8ed2651 100644
--- a/src/main/scala/xyz/driver/pdsuidomain/services/rest/RestHelper.scala
+++ b/src/main/scala/xyz/driver/pdsuidomain/services/rest/RestHelper.scala
@@ -4,14 +4,8 @@ import scala.concurrent.{ExecutionContext, Future}
import akka.http.scaladsl.model.{HttpResponse, ResponseEntity, StatusCodes, Uri}
import akka.http.scaladsl.unmarshalling.{Unmarshal, Unmarshaller}
import akka.stream.Materializer
-import xyz.driver.pdsuicommon.db.{
- Pagination,
- SearchFilterBinaryOperation,
- SearchFilterExpr,
- SearchFilterNAryOperation,
- Sorting,
- SortingOrder
-}
+import xyz.driver.core.rest.errors.{InvalidActionException, InvalidInputException, ResourceNotFoundException}
+import xyz.driver.pdsuicommon.db.{Pagination, SearchFilterBinaryOperation, SearchFilterExpr, SearchFilterNAryOperation, Sorting, SortingOrder}
import xyz.driver.pdsuicommon.error._
trait RestHelper {
@@ -93,7 +87,7 @@ trait RestHelper {
.to[ErrorsResponse]
.transform(
response => response.errors.map(_.message).mkString(", "),
- ex => new DomainException("Response has invalid format", ex)
+ ex => InvalidInputException(s"Response has invalid format: ${ex.getMessage}")
)
}
@@ -102,11 +96,10 @@ trait RestHelper {
} else {
extractErrorMessage(response).flatMap { message =>
Future.failed(response.status match {
- case StatusCodes.Unauthorized => new AuthenticationException(message)
- case StatusCodes.Forbidden => new AuthorizationException(message)
- case StatusCodes.NotFound => new NotFoundException(message)
+ case StatusCodes.Forbidden => InvalidActionException(message)
+ case StatusCodes.NotFound => ResourceNotFoundException(message)
case other =>
- new DomainException(s"Unhandled domain error for HTTP status ${other.value}. $message")
+ InvalidInputException(s"Unhandled domain error for HTTP status ${other.value}. $message")
})
}
}