From 7c3feb9b3bf7a1cc12e54c1d994649d03e70e14c Mon Sep 17 00:00:00 2001 From: Kseniya Tomskikh Date: Wed, 22 Nov 2017 16:26:10 +0700 Subject: Support service exceptions --- .../xyz/driver/pdsuicommon/error/DomainError.scala | 14 -------------- .../xyz/driver/pdsuicommon/http/Directives.scala | 17 ++++++++--------- .../driver/pdsuidomain/services/rest/RestHelper.scala | 19 ++++++------------- 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") }) } } -- cgit v1.2.3