From 9adb1cb5725c1a6d9967a5e75895408dac198af8 Mon Sep 17 00:00:00 2001 From: Aleksandr Date: Mon, 4 Dec 2017 13:55:02 +0700 Subject: Fixed RestTrialService singleAction method --- .../scala/xyz/driver/pdsuidomain/services/rest/RestTrialService.scala | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/scala/xyz/driver/pdsuidomain/services/rest/RestTrialService.scala b/src/main/scala/xyz/driver/pdsuidomain/services/rest/RestTrialService.scala index 4654c2e..6650d51 100644 --- a/src/main/scala/xyz/driver/pdsuidomain/services/rest/RestTrialService.scala +++ b/src/main/scala/xyz/driver/pdsuidomain/services/rest/RestTrialService.scala @@ -110,7 +110,7 @@ class RestTrialService(transport: ServiceTransport, baseUri: Uri)(implicit prote } val id = origTrial.id.id - val request = HttpRequest(HttpMethods.GET, endpointUri(baseUri, s"/v1/trial/$id/$action", query)) + val request = HttpRequest(HttpMethods.POST, endpointUri(baseUri, s"/v1/trial/$id/$action", query)) for { response <- transport.sendRequestGetResponse(requestContext)(request) reply <- apiResponse[Trial](response) -- cgit v1.2.3 From d863fdba13bb838978321ef2d4b94473458f970a Mon Sep 17 00:00:00 2001 From: Aleksandr Date: Mon, 4 Dec 2017 17:44:14 +0700 Subject: Implemented RestTrialIssueService; implemented read format for trial issue --- .../pdsuidomain/formats/json/trialissue.scala | 88 ++++++++++++++++-- .../services/rest/RestTrialIssueService.scala | 102 +++++++++++++++++++++ .../formats/json/TrialIssueFormatSuite.scala | 1 + 3 files changed, 183 insertions(+), 8 deletions(-) create mode 100644 src/main/scala/xyz/driver/pdsuidomain/services/rest/RestTrialIssueService.scala diff --git a/src/main/scala/xyz/driver/pdsuidomain/formats/json/trialissue.scala b/src/main/scala/xyz/driver/pdsuidomain/formats/json/trialissue.scala index f9bb0b6..dea5441 100644 --- a/src/main/scala/xyz/driver/pdsuidomain/formats/json/trialissue.scala +++ b/src/main/scala/xyz/driver/pdsuidomain/formats/json/trialissue.scala @@ -2,16 +2,26 @@ package xyz.driver.pdsuidomain.formats.json import java.time.LocalDateTime -import spray.json._ +import spray.json.{RootJsonReader, _} +import xyz.driver.core.{Id, auth} import xyz.driver.core.auth.User import xyz.driver.core.json._ import xyz.driver.pdsuicommon.domain.{LongId, StringId} import xyz.driver.pdsuidomain.entities._ object trialissue { + import DefaultJsonProtocol._ import common._ + private def deserializationErrorFieldMessage(field: String, json: JsValue)(implicit className: String) = { + deserializationError(s"$className json object do not contain '$field' field: $json") + } + + private def deserializationErrorEntityMessage(json: JsValue)(implicit className: String) = { + deserializationError(s"Expected Json Object as $className, but got $json") + } + def applyUpdateToTrialIssue(json: JsValue, orig: TrialIssue): TrialIssue = { json.asJsObject.getFields("text", "evidence", "archiveRequired", "meta") match { case Seq(text, evidence, archiveRequired, meta) => @@ -48,15 +58,77 @@ object trialissue { implicit val trialIssueWriter = new RootJsonWriter[TrialIssue] { override def write(obj: TrialIssue) = JsObject( - "id" -> obj.id.toJson, - "text" -> obj.text.toJson, - "lastUpdate" -> obj.lastUpdate.toJson, - "userId" -> obj.userId.toJson, - "isDraft" -> obj.isDraft.toJson, - "evidence" -> obj.evidence.toJson, + "id" -> obj.id.toJson, + "text" -> obj.text.toJson, + "lastUpdate" -> obj.lastUpdate.toJson, + "userId" -> obj.userId.toJson, + "isDraft" -> obj.isDraft.toJson, + "evidence" -> obj.evidence.toJson, "archiveRequired" -> obj.archiveRequired.toJson, - "meta" -> obj.meta.toJson + "meta" -> obj.meta.toJson ) } + implicit def trialIssueReader(trialId: StringId[Trial]): RootJsonReader[TrialIssue] = + new RootJsonReader[TrialIssue] { + implicit val className: String = "TrialIssue" + + override def read(json: JsValue): TrialIssue = json match { + case JsObject(fields) => + val id = fields + .get("id") + .map(_.convertTo[LongId[TrialIssue]]) + .getOrElse(deserializationErrorFieldMessage("id", json)) + + val text = fields + .get("text") + .map(_.convertTo[String]) + .getOrElse(deserializationErrorFieldMessage("text", json)) + + val lastUpdate = fields + .get("lastUpdate") + .map(_.convertTo[LocalDateTime]) + .getOrElse(deserializationErrorFieldMessage("lastUpdate", json)) + + val userId = fields + .get("userId") + .map(_.convertTo[Id[auth.User]]) + .getOrElse(deserializationErrorFieldMessage("userId", json)) + + val isDraft = fields + .get("isDraft") + .map(_.convertTo[Boolean]) + .getOrElse(deserializationErrorFieldMessage("isDraft", json)) + + val evidence = fields + .get("evidence") + .map(_.convertTo[String]) + .getOrElse(deserializationErrorFieldMessage("evidence", json)) + + val archiveRequired = fields + .get("archiveRequired") + .map(_.convertTo[Boolean]) + .getOrElse(deserializationErrorFieldMessage("archiveRequired", json)) + + val meta = fields + .get("meta") + .map(_.convertTo[String]) + .getOrElse(deserializationErrorFieldMessage("meta", json)) + + TrialIssue( + id = id, + userId = userId, + trialId = trialId, + lastUpdate = lastUpdate, + isDraft = isDraft, + text = text, + evidence = evidence, + archiveRequired = archiveRequired, + meta = meta + ) + + case _ => deserializationErrorEntityMessage(json) + } + } + } diff --git a/src/main/scala/xyz/driver/pdsuidomain/services/rest/RestTrialIssueService.scala b/src/main/scala/xyz/driver/pdsuidomain/services/rest/RestTrialIssueService.scala new file mode 100644 index 0000000..c9ac357 --- /dev/null +++ b/src/main/scala/xyz/driver/pdsuidomain/services/rest/RestTrialIssueService.scala @@ -0,0 +1,102 @@ +package xyz.driver.pdsuidomain.services.rest + +import akka.http.scaladsl.marshalling.Marshal +import akka.http.scaladsl.model._ +import akka.stream.Materializer +import spray.json.RootJsonReader +import xyz.driver.core.rest.{AuthorizedServiceRequestContext, ServiceTransport} +import xyz.driver.entities.users +import xyz.driver.pdsuicommon.db.{Pagination, SearchFilterExpr, Sorting} +import xyz.driver.pdsuicommon.domain.{LongId, StringId} +import xyz.driver.pdsuidomain.ListResponse +import xyz.driver.pdsuidomain.entities.{Trial, TrialIssue} +import xyz.driver.pdsuidomain.services.TrialIssueService + +import scala.concurrent.ExecutionContext + +class RestTrialIssueService(transport: ServiceTransport, baseUri: Uri) + (implicit + protected val materializer: Materializer, + protected val exec: ExecutionContext) + extends TrialIssueService with RestHelper{ + + import akka.http.scaladsl.marshallers.sprayjson.SprayJsonSupport._ + import xyz.driver.pdsuidomain.formats.json.listresponse._ + import xyz.driver.pdsuidomain.formats.json.trialissue._ + import xyz.driver.pdsuidomain.services.TrialIssueService._ + + override def create(draft: TrialIssue) + (implicit requestContext: AuthorizedServiceRequestContext[users.AuthUserInfo]) = { + val trialId = draft.trialId + + implicit val jsonReader: RootJsonReader[TrialIssue] = trialIssueReader(trialId) + + val request = HttpRequest(HttpMethods.POST, endpointUri(baseUri, s"/v1/trial/$trialId/issue")) + for { + response <- transport.sendRequestGetResponse(requestContext)(request) + reply <- apiResponse[TrialIssue](response) + } yield { + CreateReply.Created(reply) + } + } + + override def getListByTrialId(trialId: StringId[Trial], + filter: SearchFilterExpr, + sorting: Option[Sorting], + pagination: Option[Pagination]) + (implicit requestContext: AuthorizedServiceRequestContext[users.AuthUserInfo]) = { + implicit val jsonReader: RootJsonReader[TrialIssue] = trialIssueReader(trialId) + + val request = HttpRequest(HttpMethods.GET, endpointUri(baseUri, s"/v1/trial/$trialId/issue", + filterQuery(filter) ++ sortingQuery(sorting) ++ paginationQuery(pagination)) + ) + for { + response <- transport.sendRequestGetResponse(requestContext)(request) + reply <- apiResponse[ListResponse[TrialIssue]](response) + } yield { + GetListByTrialIdReply.EntityList(reply.items, reply.meta.itemsCount, reply.meta.lastUpdate) + } + } + + override def getById(trialId: StringId[Trial], id: LongId[TrialIssue]) + (implicit requestContext: AuthorizedServiceRequestContext[users.AuthUserInfo]) = { + implicit val jsonReader: RootJsonReader[TrialIssue] = trialIssueReader(trialId) + + val request = HttpRequest(HttpMethods.GET, endpointUri(baseUri, s"/v1/trial/$trialId/issue/$id")) + for { + response <- transport.sendRequestGetResponse(requestContext)(request) + reply <- apiResponse[TrialIssue](response) + } yield { + GetByIdReply.Entity(reply) + } + } + + override def update(orig: TrialIssue, draft: TrialIssue) + (implicit requestContext: AuthorizedServiceRequestContext[users.AuthUserInfo]) = { + val trialId = draft.trialId + val id = orig.id.id + + implicit val jsonReader: RootJsonReader[TrialIssue] = trialIssueReader(trialId) + + for { + entity <- Marshal(draft).to[RequestEntity] + request = HttpRequest(HttpMethods.PATCH, endpointUri(baseUri, s"/v1/trial/$trialId/issue/$id")).withEntity(entity) + response <- transport.sendRequestGetResponse(requestContext)(request) + reply <- apiResponse[TrialIssue](response) + } yield { + UpdateReply.Updated(reply) + } + } + + override def delete(trialId: StringId[Trial], id: LongId[TrialIssue]) + (implicit requestContext: AuthorizedServiceRequestContext[users.AuthUserInfo]) = { + val request = HttpRequest(HttpMethods.DELETE, endpointUri(baseUri, s"/v1/trial/$trialId/issue/$id")) + for { + response <- transport.sendRequestGetResponse(requestContext)(request) + _ <- apiResponse[HttpEntity](response) + } yield { + DeleteReply.Deleted + } + } + +} diff --git a/src/test/scala/xyz/driver/pdsuidomain/formats/json/TrialIssueFormatSuite.scala b/src/test/scala/xyz/driver/pdsuidomain/formats/json/TrialIssueFormatSuite.scala index a3b5931..a13e097 100644 --- a/src/test/scala/xyz/driver/pdsuidomain/formats/json/TrialIssueFormatSuite.scala +++ b/src/test/scala/xyz/driver/pdsuidomain/formats/json/TrialIssueFormatSuite.scala @@ -26,6 +26,7 @@ class TrialIssueFormatSuite extends FlatSpec with Matchers { writtenJson should be("""{"id":10,"userId":"userId-001","lastUpdate":"2017-08-10T18:00Z","isDraft":false, "text":"message text","evidence":"evidence","archiveRequired":false,"meta":"{}"}""".parseJson) + trialIssueReader(StringId("NCT000001")).read(writtenJson) shouldBe trialIssue val createTrialIssueJson = """{"text":"message text","evidence":"evidence","meta":"{}"}""".parseJson val expectedCreatedTrialIssue = trialIssue.copy(id = LongId(0), lastUpdate = LocalDateTime.MIN, isDraft = true) -- cgit v1.2.3 From 4d07f7cdb4df601398f982dd1df895304c554566 Mon Sep 17 00:00:00 2001 From: Aleksandr Date: Tue, 5 Dec 2017 11:33:49 +0700 Subject: Fixed RestTrialIssueService create method --- src/main/scala/xyz/driver/pdsuidomain/formats/json/trialissue.scala | 2 +- .../xyz/driver/pdsuidomain/services/rest/RestTrialIssueService.scala | 3 ++- 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/src/main/scala/xyz/driver/pdsuidomain/formats/json/trialissue.scala b/src/main/scala/xyz/driver/pdsuidomain/formats/json/trialissue.scala index dea5441..79882c2 100644 --- a/src/main/scala/xyz/driver/pdsuidomain/formats/json/trialissue.scala +++ b/src/main/scala/xyz/driver/pdsuidomain/formats/json/trialissue.scala @@ -69,7 +69,7 @@ object trialissue { ) } - implicit def trialIssueReader(trialId: StringId[Trial]): RootJsonReader[TrialIssue] = + def trialIssueReader(trialId: StringId[Trial]): RootJsonReader[TrialIssue] = new RootJsonReader[TrialIssue] { implicit val className: String = "TrialIssue" diff --git a/src/main/scala/xyz/driver/pdsuidomain/services/rest/RestTrialIssueService.scala b/src/main/scala/xyz/driver/pdsuidomain/services/rest/RestTrialIssueService.scala index c9ac357..b14d35b 100644 --- a/src/main/scala/xyz/driver/pdsuidomain/services/rest/RestTrialIssueService.scala +++ b/src/main/scala/xyz/driver/pdsuidomain/services/rest/RestTrialIssueService.scala @@ -31,8 +31,9 @@ class RestTrialIssueService(transport: ServiceTransport, baseUri: Uri) implicit val jsonReader: RootJsonReader[TrialIssue] = trialIssueReader(trialId) - val request = HttpRequest(HttpMethods.POST, endpointUri(baseUri, s"/v1/trial/$trialId/issue")) for { + entity <- Marshal(draft).to[RequestEntity] + request = HttpRequest(HttpMethods.POST, endpointUri(baseUri, s"/v1/trial/$trialId/issue")).withEntity(entity) response <- transport.sendRequestGetResponse(requestContext)(request) reply <- apiResponse[TrialIssue](response) } yield { -- cgit v1.2.3