aboutsummaryrefslogtreecommitdiff
path: root/src/main/scala/xyz/driver/pdsuidomain/formats/json
diff options
context:
space:
mode:
Diffstat (limited to 'src/main/scala/xyz/driver/pdsuidomain/formats/json')
-rw-r--r--src/main/scala/xyz/driver/pdsuidomain/formats/json/document/ApiDocument.scala42
-rw-r--r--src/main/scala/xyz/driver/pdsuidomain/formats/json/document/ApiDocumentType.scala10
-rw-r--r--src/main/scala/xyz/driver/pdsuidomain/formats/json/document/ApiPartialDocument.scala28
-rw-r--r--src/main/scala/xyz/driver/pdsuidomain/formats/json/document/ApiProviderType.scala10
-rw-r--r--src/main/scala/xyz/driver/pdsuidomain/formats/json/export/ApiExportPatientLabel.scala10
-rw-r--r--src/main/scala/xyz/driver/pdsuidomain/formats/json/export/ApiExportPatientLabelEvidence.scala14
-rw-r--r--src/main/scala/xyz/driver/pdsuidomain/formats/json/export/ApiExportPatientLabelEvidenceDocument.scala15
-rw-r--r--src/main/scala/xyz/driver/pdsuidomain/formats/json/export/ApiExportPatientWithLabels.scala11
-rw-r--r--src/main/scala/xyz/driver/pdsuidomain/formats/json/extracteddata/ApiExtractedData.scala17
-rw-r--r--src/main/scala/xyz/driver/pdsuidomain/formats/json/record/ApiCreateRecord.scala3
-rw-r--r--src/main/scala/xyz/driver/pdsuidomain/formats/json/record/ApiRecord.scala37
11 files changed, 168 insertions, 29 deletions
diff --git a/src/main/scala/xyz/driver/pdsuidomain/formats/json/document/ApiDocument.scala b/src/main/scala/xyz/driver/pdsuidomain/formats/json/document/ApiDocument.scala
index c01e65c..1869ff3 100644
--- a/src/main/scala/xyz/driver/pdsuidomain/formats/json/document/ApiDocument.scala
+++ b/src/main/scala/xyz/driver/pdsuidomain/formats/json/document/ApiDocument.scala
@@ -1,6 +1,8 @@
package xyz.driver.pdsuidomain.formats.json.document
import java.time.{LocalDate, ZoneId, ZonedDateTime}
+import xyz.driver.pdsuicommon.domain.{LongId, StringId, TextJson}
+import xyz.driver.pdsuicommon.json.JsonSerializer
import xyz.driver.pdsuidomain.entities._
import play.api.data.validation.ValidationError
@@ -11,7 +13,7 @@ import xyz.driver.pdsuicommon.json.JsonSerializer
final case class ApiDocument(id: Long,
recordId: Long,
physician: Option[String],
- lastUpdate: Option[ZonedDateTime],
+ lastUpdate: ZonedDateTime,
typeId: Option[Long],
startDate: Option[LocalDate],
endDate: Option[LocalDate],
@@ -23,14 +25,40 @@ final case class ApiDocument(id: Long,
assignee: Option[String],
previousAssignee: Option[String],
lastActiveUser: Option[String],
- meta: Option[String])
+ meta: Option[String]) {
+
+ private def extractStatus(status: String): Document.Status =
+ Document.Status.fromString(status).getOrElse(throw new NoSuchElementException(s"Status $status unknown"))
+
+ private def extractRequiredType(tpe: String): Document.RequiredType =
+ Document.RequiredType.fromString(tpe).getOrElse(throw new NoSuchElementException(s"RequitedType $tpe unknown"))
+
+ def toDomain = Document(
+ id = LongId(this.id),
+ status = extractStatus(this.status.getOrElse("")),
+ previousStatus = previousStatus.map(extractStatus),
+ assignee = this.assignee.map(StringId(_)),
+ previousAssignee = this.previousAssignee.map(StringId(_)),
+ lastActiveUserId = this.lastActiveUser.map(StringId(_)),
+ recordId = LongId(this.recordId),
+ physician = this.physician,
+ typeId = this.typeId.map(LongId(_)),
+ providerName = this.provider,
+ providerTypeId = this.providerTypeId.map(LongId(_)),
+ requiredType = this.requiredType.map(extractRequiredType),
+ meta = this.meta.map(x => TextJson(JsonSerializer.deserialize[Document.Meta](x))),
+ startDate = this.startDate,
+ endDate = this.endDate,
+ lastUpdate = this.lastUpdate.toLocalDateTime()
+ )
+
+}
object ApiDocument {
private val statusFormat = Format(
- Reads.StringReads.filter(ValidationError("unknown status")) {
- case x if Document.Status.fromString.isDefinedAt(x) => true
- case _ => false
+ Reads.StringReads.filter(ValidationError("unknown status")) { x =>
+ Document.Status.fromString(x).isDefined
},
Writes.StringWrites
)
@@ -39,7 +67,7 @@ object ApiDocument {
(JsPath \ "id").format[Long] and
(JsPath \ "recordId").format[Long] and
(JsPath \ "physician").formatNullable[String] and
- (JsPath \ "lastUpdate").formatNullable[ZonedDateTime] and
+ (JsPath \ "lastUpdate").format[ZonedDateTime] and
(JsPath \ "typeId").formatNullable[Long] and
(JsPath \ "startDate").formatNullable[LocalDate] and
(JsPath \ "endDate").formatNullable[LocalDate] and
@@ -61,7 +89,7 @@ object ApiDocument {
id = document.id.id,
recordId = document.recordId.id,
physician = document.physician,
- lastUpdate = Option(document.lastUpdate).map(ZonedDateTime.of(_, ZoneId.of("Z"))),
+ lastUpdate = ZonedDateTime.of(document.lastUpdate, ZoneId.of("Z")),
typeId = document.typeId.map(_.id),
startDate = document.startDate,
endDate = document.endDate,
diff --git a/src/main/scala/xyz/driver/pdsuidomain/formats/json/document/ApiDocumentType.scala b/src/main/scala/xyz/driver/pdsuidomain/formats/json/document/ApiDocumentType.scala
index 8b11b91..8b4974f 100644
--- a/src/main/scala/xyz/driver/pdsuidomain/formats/json/document/ApiDocumentType.scala
+++ b/src/main/scala/xyz/driver/pdsuidomain/formats/json/document/ApiDocumentType.scala
@@ -2,9 +2,17 @@ package xyz.driver.pdsuidomain.formats.json.document
import play.api.libs.functional.syntax._
import play.api.libs.json.{Format, JsPath}
+import xyz.driver.pdsuicommon.domain.LongId
import xyz.driver.pdsuidomain.entities.DocumentType
-final case class ApiDocumentType(id: Long, name: String)
+final case class ApiDocumentType(id: Long, name: String) {
+
+ def toDomain = DocumentType(
+ id = LongId(this.id),
+ name = this.name
+ )
+
+}
object ApiDocumentType {
diff --git a/src/main/scala/xyz/driver/pdsuidomain/formats/json/document/ApiPartialDocument.scala b/src/main/scala/xyz/driver/pdsuidomain/formats/json/document/ApiPartialDocument.scala
index e9485e7..eae0c62 100644
--- a/src/main/scala/xyz/driver/pdsuidomain/formats/json/document/ApiPartialDocument.scala
+++ b/src/main/scala/xyz/driver/pdsuidomain/formats/json/document/ApiPartialDocument.scala
@@ -31,7 +31,7 @@ final case class ApiPartialDocument(recordId: Option[Long],
def applyTo(orig: Document): Document = Document(
id = orig.id,
- status = status.map(Document.Status.fromString).getOrElse(orig.status),
+ status = status.flatMap(Document.Status.fromString).getOrElse(orig.status),
previousStatus = orig.previousStatus,
assignee = assignee.map(StringId[User]).cata(Some(_), None, orig.assignee),
previousAssignee = orig.previousAssignee,
@@ -90,16 +90,22 @@ object ApiPartialDocument {
(JsPath \ "endDate").readTristate[LocalDate] and
(JsPath \ "provider").readTristate[String] and
(JsPath \ "providerTypeId").readTristate[Long] and
- (JsPath \ "status").readNullable[String](Reads.of[String].filter(ValidationError("unknown status"))({
- case x if Document.Status.fromString.isDefinedAt(x) => true
- case _ => false
- })) and
+ (JsPath \ "status").readNullable[String](
+ Reads
+ .of[String]
+ .filter(ValidationError("unknown status"))(
+ Document.Status.fromString(_).isDefined
+ )) and
(JsPath \ "assignee").readTristate[String] and
- (JsPath \ "meta").readTristate(Reads { x => JsSuccess(Json.stringify(x)) }).map {
- case Tristate.Present("{}") => Tristate.Absent
- case x => x
- }
- ) (ApiPartialDocument.apply _)
+ (JsPath \ "meta")
+ .readTristate(Reads { x =>
+ JsSuccess(Json.stringify(x))
+ })
+ .map {
+ case Tristate.Present("{}") => Tristate.Absent
+ case x => x
+ }
+ )(ApiPartialDocument.apply _)
private val writes: Writes[ApiPartialDocument] = (
(JsPath \ "recordId").writeNullable[Long] and
@@ -112,7 +118,7 @@ object ApiPartialDocument {
(JsPath \ "status").writeNullable[String] and
(JsPath \ "assignee").writeTristate[String] and
(JsPath \ "meta").writeTristate(Writes[String](Json.parse))
- ) (unlift(ApiPartialDocument.unapply))
+ )(unlift(ApiPartialDocument.unapply))
implicit val format: Format[ApiPartialDocument] = Format(reads, writes)
}
diff --git a/src/main/scala/xyz/driver/pdsuidomain/formats/json/document/ApiProviderType.scala b/src/main/scala/xyz/driver/pdsuidomain/formats/json/document/ApiProviderType.scala
index eb0ac46..c0eddad 100644
--- a/src/main/scala/xyz/driver/pdsuidomain/formats/json/document/ApiProviderType.scala
+++ b/src/main/scala/xyz/driver/pdsuidomain/formats/json/document/ApiProviderType.scala
@@ -2,9 +2,17 @@ package xyz.driver.pdsuidomain.formats.json.document
import play.api.libs.functional.syntax._
import play.api.libs.json.{Format, JsPath}
+import xyz.driver.pdsuicommon.domain.LongId
import xyz.driver.pdsuidomain.entities.ProviderType
-final case class ApiProviderType(id: Long, name: String)
+final case class ApiProviderType(id: Long, name: String) {
+
+ def toDomain = ProviderType(
+ id = LongId(this.id),
+ name = this.name
+ )
+
+}
object ApiProviderType {
diff --git a/src/main/scala/xyz/driver/pdsuidomain/formats/json/export/ApiExportPatientLabel.scala b/src/main/scala/xyz/driver/pdsuidomain/formats/json/export/ApiExportPatientLabel.scala
index 1d5a171..0ef1c68 100644
--- a/src/main/scala/xyz/driver/pdsuidomain/formats/json/export/ApiExportPatientLabel.scala
+++ b/src/main/scala/xyz/driver/pdsuidomain/formats/json/export/ApiExportPatientLabel.scala
@@ -2,9 +2,17 @@ package xyz.driver.pdsuidomain.formats.json.export
import play.api.libs.functional.syntax._
import play.api.libs.json.{Format, JsPath}
+import xyz.driver.pdsuicommon.domain.LongId
import xyz.driver.pdsuidomain.entities.export.patient.ExportPatientLabel
-final case class ApiExportPatientLabel(id: String, evidences: List[ApiExportPatientLabelEvidence])
+final case class ApiExportPatientLabel(id: String, evidences: List[ApiExportPatientLabelEvidence]) {
+
+ def toDomain = ExportPatientLabel(
+ id = LongId(this.id.toLong),
+ evidences = this.evidences.map(_.toDomain)
+ )
+
+}
object ApiExportPatientLabel {
diff --git a/src/main/scala/xyz/driver/pdsuidomain/formats/json/export/ApiExportPatientLabelEvidence.scala b/src/main/scala/xyz/driver/pdsuidomain/formats/json/export/ApiExportPatientLabelEvidence.scala
index 9ce281e..d141762 100644
--- a/src/main/scala/xyz/driver/pdsuidomain/formats/json/export/ApiExportPatientLabelEvidence.scala
+++ b/src/main/scala/xyz/driver/pdsuidomain/formats/json/export/ApiExportPatientLabelEvidence.scala
@@ -2,13 +2,23 @@ package xyz.driver.pdsuidomain.formats.json.export
import play.api.libs.functional.syntax._
import play.api.libs.json._
-import xyz.driver.pdsuicommon.domain.FuzzyValue
+import xyz.driver.pdsuicommon.domain.{FuzzyValue, LongId}
import xyz.driver.pdsuidomain.entities.export.patient.ExportPatientLabelEvidence
final case class ApiExportPatientLabelEvidence(evidenceId: String,
labelValue: String,
evidenceText: String,
- document: ApiExportPatientLabelEvidenceDocument)
+ document: ApiExportPatientLabelEvidenceDocument) {
+
+ def toDomain = ExportPatientLabelEvidence(
+ id = LongId(this.evidenceId.toLong),
+ value = FuzzyValue.fromString
+ .applyOrElse(this.labelValue, (s: String) => throw new NoSuchElementException(s"Unknown fuzzy value $s")),
+ evidenceText = this.evidenceText,
+ document = this.document.toDomain
+ )
+
+}
object ApiExportPatientLabelEvidence {
diff --git a/src/main/scala/xyz/driver/pdsuidomain/formats/json/export/ApiExportPatientLabelEvidenceDocument.scala b/src/main/scala/xyz/driver/pdsuidomain/formats/json/export/ApiExportPatientLabelEvidenceDocument.scala
index 99bb2cf..6999301 100644
--- a/src/main/scala/xyz/driver/pdsuidomain/formats/json/export/ApiExportPatientLabelEvidenceDocument.scala
+++ b/src/main/scala/xyz/driver/pdsuidomain/formats/json/export/ApiExportPatientLabelEvidenceDocument.scala
@@ -1,16 +1,29 @@
package xyz.driver.pdsuidomain.formats.json.export
import java.time.LocalDate
+import java.util.UUID
import play.api.libs.functional.syntax._
import play.api.libs.json.{Format, JsPath}
+import xyz.driver.pdsuicommon.domain.LongId
+import xyz.driver.pdsuidomain.entities.RecordRequestId
import xyz.driver.pdsuidomain.entities.export.patient.ExportPatientLabelEvidenceDocument
final case class ApiExportPatientLabelEvidenceDocument(documentId: String,
requestId: String,
documentType: String,
providerType: String,
- date: LocalDate)
+ date: LocalDate) {
+
+ def toDomain = ExportPatientLabelEvidenceDocument(
+ documentId = LongId(this.documentId.toLong),
+ requestId = RecordRequestId(UUID.fromString(this.requestId)),
+ documentType = this.documentType,
+ providerType = this.providerType,
+ date = this.date
+ )
+
+}
object ApiExportPatientLabelEvidenceDocument {
diff --git a/src/main/scala/xyz/driver/pdsuidomain/formats/json/export/ApiExportPatientWithLabels.scala b/src/main/scala/xyz/driver/pdsuidomain/formats/json/export/ApiExportPatientWithLabels.scala
index 8ce970b..fc9bab7 100644
--- a/src/main/scala/xyz/driver/pdsuidomain/formats/json/export/ApiExportPatientWithLabels.scala
+++ b/src/main/scala/xyz/driver/pdsuidomain/formats/json/export/ApiExportPatientWithLabels.scala
@@ -2,9 +2,18 @@ package xyz.driver.pdsuidomain.formats.json.export
import play.api.libs.functional.syntax._
import play.api.libs.json.{Format, JsPath}
+import xyz.driver.pdsuicommon.domain.UuidId
import xyz.driver.pdsuidomain.entities.export.patient.ExportPatientWithLabels
-final case class ApiExportPatientWithLabels(patientId: String, labelVersion: Long, labels: List[ApiExportPatientLabel])
+final case class ApiExportPatientWithLabels(patientId: String, labelVersion: Long, labels: List[ApiExportPatientLabel]) {
+
+ def toDomain = ExportPatientWithLabels(
+ patientId = UuidId(this.patientId),
+ labelVersion = this.labelVersion,
+ labels = this.labels.map(_.toDomain)
+ )
+
+}
object ApiExportPatientWithLabels {
diff --git a/src/main/scala/xyz/driver/pdsuidomain/formats/json/extracteddata/ApiExtractedData.scala b/src/main/scala/xyz/driver/pdsuidomain/formats/json/extracteddata/ApiExtractedData.scala
index ec4185f..4182c8d 100644
--- a/src/main/scala/xyz/driver/pdsuidomain/formats/json/extracteddata/ApiExtractedData.scala
+++ b/src/main/scala/xyz/driver/pdsuidomain/formats/json/extracteddata/ApiExtractedData.scala
@@ -1,5 +1,7 @@
package xyz.driver.pdsuidomain.formats.json.extracteddata
+import xyz.driver.pdsuicommon.domain.{LongId, TextJson}
+import xyz.driver.pdsuidomain.entities.ExtractedData
import xyz.driver.pdsuidomain.formats.json.label.ApiExtractedDataLabel
import play.api.libs.json._
import play.api.data.validation._
@@ -16,7 +18,20 @@ final case class ApiExtractedData(id: Long,
evidence: Option[String],
meta: Option[String],
// An empty list and no-existent list are different cases
- labels: Option[List[ApiExtractedDataLabel]])
+ labels: Option[List[ApiExtractedDataLabel]]) {
+
+ def toDomain = RichExtractedData(
+ extractedData = ExtractedData(
+ id = LongId(this.id),
+ documentId = LongId(this.documentId),
+ keywordId = this.keywordId.map(LongId(_)),
+ evidenceText = this.evidence,
+ meta = this.meta.map(x => TextJson(JsonSerializer.deserialize[ExtractedData.Meta](x)))
+ ),
+ labels = labels.getOrElse(List.empty).map(_.toDomain())
+ )
+
+}
object ApiExtractedData {
diff --git a/src/main/scala/xyz/driver/pdsuidomain/formats/json/record/ApiCreateRecord.scala b/src/main/scala/xyz/driver/pdsuidomain/formats/json/record/ApiCreateRecord.scala
index e96bc81..2e5943e 100644
--- a/src/main/scala/xyz/driver/pdsuidomain/formats/json/record/ApiCreateRecord.scala
+++ b/src/main/scala/xyz/driver/pdsuidomain/formats/json/record/ApiCreateRecord.scala
@@ -7,7 +7,7 @@ import xyz.driver.pdsuicommon.domain._
import xyz.driver.pdsuidomain.entities._
import play.api.libs.json._
-final case class ApiCreateRecord(disease: String, patientId: String, requestId: UUID, filename: String) {
+final case class ApiCreateRecord(disease: String, patientId: String, requestId: UUID) {
def toDomain = MedicalRecord(
id = LongId(0),
@@ -21,7 +21,6 @@ final case class ApiCreateRecord(disease: String, patientId: String, requestId:
disease = disease,
caseId = None,
physician = None,
- sourceName = filename,
meta = None,
predictedMeta = None,
predictedDocuments = None,
diff --git a/src/main/scala/xyz/driver/pdsuidomain/formats/json/record/ApiRecord.scala b/src/main/scala/xyz/driver/pdsuidomain/formats/json/record/ApiRecord.scala
index 0e0b4d9..b255892 100644
--- a/src/main/scala/xyz/driver/pdsuidomain/formats/json/record/ApiRecord.scala
+++ b/src/main/scala/xyz/driver/pdsuidomain/formats/json/record/ApiRecord.scala
@@ -1,12 +1,17 @@
package xyz.driver.pdsuidomain.formats.json.record
import java.time.{ZoneId, ZonedDateTime}
+import java.util.UUID
+import xyz.driver.pdsuidomain.entities.CaseId
import xyz.driver.pdsuidomain.entities.MedicalRecord
+import xyz.driver.pdsuidomain.entities.MedicalRecord.Status
+import xyz.driver.pdsuidomain.entities.RecordRequestId
import play.api.data.validation.ValidationError
import play.api.libs.functional.syntax._
import play.api.libs.json._
import xyz.driver.pdsuicommon.json.JsonSerializer
+import xyz.driver.pdsuicommon.domain.{LongId, StringId, TextJson, UuidId}
final case class ApiRecord(id: Long,
patientId: String,
@@ -19,7 +24,35 @@ final case class ApiRecord(id: Long,
assignee: Option[String],
previousAssignee: Option[String],
lastActiveUser: Option[String],
- meta: String)
+ requestId: UUID,
+ meta: String) {
+
+ private def extractStatus(status: String): Status =
+ Status
+ .fromString(status)
+ .getOrElse(
+ throw new NoSuchElementException(s"Status $status not found")
+ )
+
+ def toDomain = MedicalRecord(
+ id = LongId(this.id),
+ status = extractStatus(this.status),
+ previousStatus = this.previousStatus.map(extractStatus),
+ assignee = this.assignee.map(StringId(_)),
+ previousAssignee = this.previousAssignee.map(StringId(_)),
+ lastActiveUserId = this.lastActiveUser.map(StringId(_)),
+ patientId = UuidId(patientId),
+ requestId = RecordRequestId(this.requestId),
+ disease = this.disease,
+ caseId = caseId.map(CaseId(_)),
+ physician = this.physician,
+ meta = Some(TextJson(JsonSerializer.deserialize[List[MedicalRecord.Meta]](this.meta))),
+ predictedMeta = None,
+ predictedDocuments = None,
+ lastUpdate = this.lastUpdate.toLocalDateTime()
+ )
+
+}
object ApiRecord {
@@ -43,6 +76,7 @@ object ApiRecord {
(JsPath \ "assignee").formatNullable[String] and
(JsPath \ "previousAssignee").formatNullable[String] and
(JsPath \ "lastActiveUser").formatNullable[String] and
+ (JsPath \ "requestId").format[UUID] and
(JsPath \ "meta").format(Format(Reads { x =>
JsSuccess(Json.stringify(x))
}, Writes[String](Json.parse)))
@@ -60,6 +94,7 @@ object ApiRecord {
assignee = record.assignee.map(_.id),
previousAssignee = record.previousAssignee.map(_.id),
lastActiveUser = record.lastActiveUserId.map(_.id),
+ requestId = record.requestId.id,
meta = record.meta.map(x => JsonSerializer.serialize(x.content)).getOrElse("[]")
)
}