aboutsummaryrefslogtreecommitdiff
path: root/src/main/scala/xyz/driver/pdsuicommon/error/ErrorsResponse.scala
diff options
context:
space:
mode:
Diffstat (limited to 'src/main/scala/xyz/driver/pdsuicommon/error/ErrorsResponse.scala')
-rw-r--r--src/main/scala/xyz/driver/pdsuicommon/error/ErrorsResponse.scala78
1 files changed, 24 insertions, 54 deletions
diff --git a/src/main/scala/xyz/driver/pdsuicommon/error/ErrorsResponse.scala b/src/main/scala/xyz/driver/pdsuicommon/error/ErrorsResponse.scala
index 3761cc5..ccb84c2 100644
--- a/src/main/scala/xyz/driver/pdsuicommon/error/ErrorsResponse.scala
+++ b/src/main/scala/xyz/driver/pdsuicommon/error/ErrorsResponse.scala
@@ -1,18 +1,13 @@
package xyz.driver.pdsuicommon.error
-import xyz.driver.pdsuicommon.json.Serialization.seqJsonFormat
-import ErrorCode.{ErrorCode, Unspecified}
+import spray.json._
import ErrorsResponse.ResponseError
-import xyz.driver.pdsuicommon.auth.{AnonymousRequestContext, RequestId}
-import xyz.driver.pdsuicommon.utils.Utils
-import play.api.libs.functional.syntax._
-import play.api.libs.json._
-import play.api.mvc.Results
-import xyz.driver.pdsuicommon.validation.JsonValidationErrors
+import xyz.driver.pdsuicommon.auth.RequestId
final case class ErrorsResponse(errors: Seq[ResponseError], requestId: RequestId)
object ErrorsResponse {
+ import DefaultJsonProtocol._
/**
* @param data Any data that can be associated with particular error.Ex.: error field name
@@ -21,63 +16,38 @@ object ErrorsResponse {
*
* @see https://driverinc.atlassian.net/wiki/display/RA/REST+API+Specification#RESTAPISpecification-HTTPStatuscodes
*/
- final case class ResponseError(data: Option[String], message: String, code: ErrorCode)
+ final case class ResponseError(data: Option[String], message: String, code: Int)
object ResponseError {
- implicit val responseErrorJsonFormat: Format[ResponseError] = (
- (JsPath \ "data").formatNullable[String] and
- (JsPath \ "message").format[String] and
- (JsPath \ "code").format[ErrorCode]
- )(ResponseError.apply, unlift(ResponseError.unapply))
+ implicit val responseErrorJsonFormat: RootJsonFormat[ResponseError] = jsonFormat3(ResponseError.apply)
}
- implicit val errorsResponseJsonFormat: Format[ErrorsResponse] = (
- (JsPath \ "errors").format[Seq[ResponseError]] and
- (JsPath \ "requestId").format[String]
- )((errs, req) => ErrorsResponse.apply(errs, RequestId(req)), res => (res.errors, res.requestId.value))
+ implicit val errorsResponseJsonFormat: RootJsonFormat[ErrorsResponse] = new RootJsonFormat[ErrorsResponse] {
+ override def write(obj: ErrorsResponse): JsValue = {
+ JsObject(
+ "errors" -> obj.errors.map(_.toJson).toJson,
+ "requestId" -> obj.requestId.value.toJson
+ )
+ }
- // deprecated, will be removed in REP-436
- def fromString(message: String, httpStatus: Results#Status)(
- implicit context: AnonymousRequestContext): ErrorsResponse = {
- new ErrorsResponse(
- errors = Seq(
- ResponseError(
- data = None,
- message = message,
- code = Unspecified
- )),
- requestId = context.requestId
- )
- }
+ override def read(json: JsValue) = json match {
+ case JsObject(fields) =>
+ val errors = fields
+ .get("errors")
+ .map(_.convertTo[Seq[ResponseError]])
+ .getOrElse(deserializationError(s"ErrorsResponse json object does not contain `errors` field: $json"))
- // scalastyle:off null
- def fromExceptionMessage(e: Throwable, httpStatus: Results#Status = Results.InternalServerError)(
- implicit context: AnonymousRequestContext): ErrorsResponse = {
- val message = if (e.getMessage == null || e.getMessage.isEmpty) {
- Utils.getClassSimpleName(e.getClass)
- } else {
- e.getMessage
- }
+ val requestId = fields
+ .get("requestId")
+ .map(id => RequestId(id.convertTo[String]))
+ .getOrElse(deserializationError(s"ErrorsResponse json object does not contain `requestId` field: $json"))
- fromString(message, httpStatus)
- }
- // scalastyle:on null
+ ErrorsResponse(errors, requestId)
- // deprecated, will be removed in REP-436
- def fromJsonValidationErrors(validationErrors: JsonValidationErrors)(
- implicit context: AnonymousRequestContext): ErrorsResponse = {
- val errors = validationErrors.map {
- case (path, xs) =>
- ResponseError(
- data = Some(path.toString()),
- message = xs.map(_.message).mkString("\n"),
- code = Unspecified
- )
+ case _ => deserializationError(s"Expected json as ErrorsResponse, but got $json")
}
-
- new ErrorsResponse(errors, context.requestId)
}
}