diff --git a/api/src/main/scala/com/lbs/api/http/package.scala b/api/src/main/scala/com/lbs/api/http/package.scala index 2971660..21fad25 100644 --- a/api/src/main/scala/com/lbs/api/http/package.scala +++ b/api/src/main/scala/com/lbs/api/http/package.scala @@ -3,7 +3,7 @@ package com.lbs.api import com.lbs.api.exception.{ApiException, GenericException, InvalidLoginOrPasswordException, ServiceIsAlreadyBookedException} import com.lbs.api.json.JsonSerializer.extensions._ -import com.lbs.api.json.model.{LuxmedBaseError, LuxmedErrors, LuxmedError, SerializableJsonObject} +import com.lbs.api.json.model._ import com.lbs.common.Logger import scalaj.http.{HttpRequest, HttpResponse} @@ -56,24 +56,23 @@ package object http extends Logger { } private def luxmedErrorToApiException[T <: LuxmedBaseError](ler: HttpResponse[T]): ApiException = { - val genericException = ler.body match { - case e: LuxmedErrors => - new GenericException(ler.code, ler.statusLine, e.errors.values.mkString("; ")) - case e: LuxmedError => - new GenericException(ler.code, ler.statusLine, e.message) - } - - val errorMessage = genericException.message.toLowerCase + val message = ler.body.message + val errorMessage = message.toLowerCase if (errorMessage.contains("invalid login or password")) new InvalidLoginOrPasswordException else if (errorMessage.contains("already booked this service")) new ServiceIsAlreadyBookedException - else genericException + else + new GenericException(ler.code, ler.statusLine, message) } private def extractLuxmedError(httpResponse: Try[HttpResponse[String]]) = { - httpResponse.flatMap(response => Try(response.asEntity[LuxmedErrors]).map(luxmedErrorToApiException). - orElse(Try(response.asEntity[LuxmedError]).map(luxmedErrorToApiException))).toOption + httpResponse.flatMap { response => + Try(response.asEntity[LuxmedErrorsMap]) + .orElse(Try(response.asEntity[LuxmedErrorsList])) + .orElse(Try(response.asEntity[LuxmedError])) + .map(e => luxmedErrorToApiException(e.asInstanceOf[HttpResponse[LuxmedBaseError]])) + }.toOption } private def hidePasswords(httpRequest: HttpRequest) = { diff --git a/api/src/main/scala/com/lbs/api/json/model/LuxmedBaseError.scala b/api/src/main/scala/com/lbs/api/json/model/LuxmedBaseError.scala index 04faefa..f7c02b7 100644 --- a/api/src/main/scala/com/lbs/api/json/model/LuxmedBaseError.scala +++ b/api/src/main/scala/com/lbs/api/json/model/LuxmedBaseError.scala @@ -1,4 +1,6 @@ package com.lbs.api.json.model -trait LuxmedBaseError +trait LuxmedBaseError { + def message: String +} diff --git a/api/src/main/scala/com/lbs/api/json/model/LuxmedErrors.scala b/api/src/main/scala/com/lbs/api/json/model/LuxmedErrors.scala deleted file mode 100644 index 8818664..0000000 --- a/api/src/main/scala/com/lbs/api/json/model/LuxmedErrors.scala +++ /dev/null @@ -1,4 +0,0 @@ - -package com.lbs.api.json.model - -case class LuxmedErrors(errors: Map[String, List[String]]) extends SerializableJsonObject with LuxmedBaseError \ No newline at end of file diff --git a/api/src/main/scala/com/lbs/api/json/model/LuxmedErrorsList.scala b/api/src/main/scala/com/lbs/api/json/model/LuxmedErrorsList.scala new file mode 100644 index 0000000..3c1b6cc --- /dev/null +++ b/api/src/main/scala/com/lbs/api/json/model/LuxmedErrorsList.scala @@ -0,0 +1,8 @@ + +package com.lbs.api.json.model + +case class LuxmedErrorsList(errors: List[LuxmedErrorsListElement]) extends SerializableJsonObject with LuxmedBaseError { + override def message: String = errors.map(_.message).mkString("; ") +} + +case class LuxmedErrorsListElement(errorCode: Int, message: String, additionalData: Map[String, String]) extends SerializableJsonObject \ No newline at end of file diff --git a/api/src/main/scala/com/lbs/api/json/model/LuxmedErrorsMap.scala b/api/src/main/scala/com/lbs/api/json/model/LuxmedErrorsMap.scala new file mode 100644 index 0000000..9cd779a --- /dev/null +++ b/api/src/main/scala/com/lbs/api/json/model/LuxmedErrorsMap.scala @@ -0,0 +1,6 @@ + +package com.lbs.api.json.model + +case class LuxmedErrorsMap(errors: Map[String, List[String]]) extends SerializableJsonObject with LuxmedBaseError { + override def message: String = errors.values.mkString("; ") +} \ No newline at end of file diff --git a/api/src/test/scala/com/lbs/api/json/model/LuxmedErrorsListSpec.scala b/api/src/test/scala/com/lbs/api/json/model/LuxmedErrorsListSpec.scala new file mode 100644 index 0000000..7451eab --- /dev/null +++ b/api/src/test/scala/com/lbs/api/json/model/LuxmedErrorsListSpec.scala @@ -0,0 +1,18 @@ +package com.lbs.api.json.model + +import com.lbs.api.json.JsonSerializer.extensions._ +import org.scalatest.{FunSuiteLike, Matchers} + +class LuxmedErrorsListSpec extends FunSuiteLike with Matchers with CommonSpec { + + test("deserialization") { + val json = + """ + |{"Errors":[{"ErrorCode":16000006,"Message":"You have already booked this service","AdditionalData":{}}]} + """.stripMargin + + val response = json.as[LuxmedErrorsList] + + response should be(LuxmedErrorsList(List(LuxmedErrorsListElement(16000006, "You have already booked this service", Map.empty)))) + } +} diff --git a/api/src/test/scala/com/lbs/api/json/model/LuxmedErrorsSpec.scala b/api/src/test/scala/com/lbs/api/json/model/LuxmedErrorsMapSpec.scala similarity index 55% rename from api/src/test/scala/com/lbs/api/json/model/LuxmedErrorsSpec.scala rename to api/src/test/scala/com/lbs/api/json/model/LuxmedErrorsMapSpec.scala index ea335ec..0e64323 100644 --- a/api/src/test/scala/com/lbs/api/json/model/LuxmedErrorsSpec.scala +++ b/api/src/test/scala/com/lbs/api/json/model/LuxmedErrorsMapSpec.scala @@ -1,17 +1,17 @@ package com.lbs.api.json.model -import org.scalatest.{FunSuiteLike, Matchers} import com.lbs.api.json.JsonSerializer.extensions._ +import org.scalatest.{FunSuiteLike, Matchers} -class LuxmedErrorsSpec extends FunSuiteLike with Matchers with CommonSpec { +class LuxmedErrorsMapSpec extends FunSuiteLike with Matchers with CommonSpec { test("deserialization") { val json = """ |{"Errors":{"ToDate.Date":["'To Date. Date' must be greater than or equal to '06/04/2018 00:00:00'."]}} """.stripMargin - val response = json.as[LuxmedErrors] + val response = json.as[LuxmedErrorsMap] - response should be(LuxmedErrors(Map("toDate.Date" -> List("'To Date. Date' must be greater than or equal to '06/04/2018 00:00:00'.")))) + response should be(LuxmedErrorsMap(Map("toDate.Date" -> List("'To Date. Date' must be greater than or equal to '06/04/2018 00:00:00'.")))) } }