aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--build.sbt3
-rw-r--r--src/main/scala/xyz/driver/pdsuicommon/concurrent/BridgeUploadQueueRepositoryAdapter.scala140
-rw-r--r--src/main/scala/xyz/driver/pdsuicommon/db/DbCommand.scala15
-rw-r--r--src/main/scala/xyz/driver/pdsuicommon/db/DbCommandFactory.scala14
-rw-r--r--src/main/scala/xyz/driver/pdsuicommon/db/EntityExtractorDerivation.scala66
-rw-r--r--src/main/scala/xyz/driver/pdsuicommon/db/FakeDbIo.scala9
-rw-r--r--src/main/scala/xyz/driver/pdsuicommon/db/MySqlContext.scala90
-rw-r--r--src/main/scala/xyz/driver/pdsuicommon/db/MysqlQueryBuilder.scala88
-rw-r--r--src/main/scala/xyz/driver/pdsuicommon/db/PostgresContext.scala5
-rw-r--r--src/main/scala/xyz/driver/pdsuicommon/db/PostgresQueryBuilder.scala108
-rw-r--r--src/main/scala/xyz/driver/pdsuicommon/db/QueryBuilder.scala340
-rw-r--r--src/main/scala/xyz/driver/pdsuicommon/db/SlickQueryBuilder.scala2
-rw-r--r--src/main/scala/xyz/driver/pdsuicommon/db/repositories/BridgeUploadQueueRepository.scala21
-rw-r--r--src/main/scala/xyz/driver/pdsuicommon/db/repositories/Repository.scala1
-rw-r--r--src/main/scala/xyz/driver/pdsuicommon/error/ErrorCode.scala15
-rw-r--r--src/main/scala/xyz/driver/pdsuicommon/error/ErrorsResponse.scala78
-rw-r--r--src/main/scala/xyz/driver/pdsuicommon/http/Directives.scala11
-rw-r--r--src/main/scala/xyz/driver/pdsuicommon/json/JsResultOps.scala15
-rw-r--r--src/main/scala/xyz/driver/pdsuicommon/json/JsonValidationException.scala5
-rw-r--r--src/main/scala/xyz/driver/pdsuicommon/json/Serialization.scala46
-rw-r--r--src/main/scala/xyz/driver/pdsuicommon/serialization/PlayJsonSupport.scala34
-rw-r--r--src/main/scala/xyz/driver/pdsuicommon/utils/CustomSwaggerJsonFormats.scala62
-rw-r--r--src/main/scala/xyz/driver/pdsuicommon/utils/Implicits.scala8
-rw-r--r--src/main/scala/xyz/driver/pdsuicommon/utils/WriteableImplicits.scala17
-rw-r--r--src/main/scala/xyz/driver/pdsuicommon/utils/WritesUtils.scala21
-rw-r--r--src/main/scala/xyz/driver/pdsuicommon/validation/AdditionalConstraints.scala33
-rw-r--r--src/main/scala/xyz/driver/pdsuicommon/validation/package.scala8
-rw-r--r--src/main/scala/xyz/driver/pdsuidomain/fakes/entities/treatmentmatching.scala2
-rw-r--r--src/main/scala/xyz/driver/pdsuidomain/formats/json/ListResponse.scala56
-rw-r--r--src/main/scala/xyz/driver/pdsuidomain/formats/json/arm.scala (renamed from src/main/scala/xyz/driver/pdsuidomain/formats/json/sprayformats/arm.scala)2
-rw-r--r--src/main/scala/xyz/driver/pdsuidomain/formats/json/arm/ApiArm.scala35
-rw-r--r--src/main/scala/xyz/driver/pdsuidomain/formats/json/arm/ApiCreateArm.scala20
-rw-r--r--src/main/scala/xyz/driver/pdsuidomain/formats/json/arm/ApiPartialArm.scala14
-rw-r--r--src/main/scala/xyz/driver/pdsuidomain/formats/json/bridgeuploadqueue.scala (renamed from src/main/scala/xyz/driver/pdsuidomain/formats/json/sprayformats/bridgeuploadqueue.scala)2
-rw-r--r--src/main/scala/xyz/driver/pdsuidomain/formats/json/common.scala (renamed from src/main/scala/xyz/driver/pdsuidomain/formats/json/sprayformats/common.scala)2
-rw-r--r--src/main/scala/xyz/driver/pdsuidomain/formats/json/criterion.scala (renamed from src/main/scala/xyz/driver/pdsuidomain/formats/json/sprayformats/criterion.scala)2
-rw-r--r--src/main/scala/xyz/driver/pdsuidomain/formats/json/criterion/ApiCriterion.scala59
-rw-r--r--src/main/scala/xyz/driver/pdsuidomain/formats/json/criterion/ApiNewCriterion.scala46
-rw-r--r--src/main/scala/xyz/driver/pdsuidomain/formats/json/criterion/ApiUpdateCriterion.scala64
-rw-r--r--src/main/scala/xyz/driver/pdsuidomain/formats/json/document.scala (renamed from src/main/scala/xyz/driver/pdsuidomain/formats/json/sprayformats/document.scala)2
-rw-r--r--src/main/scala/xyz/driver/pdsuidomain/formats/json/document/ApiDocument.scala114
-rw-r--r--src/main/scala/xyz/driver/pdsuidomain/formats/json/document/ApiDocumentType.scala27
-rw-r--r--src/main/scala/xyz/driver/pdsuidomain/formats/json/document/ApiPartialDocument.scala130
-rw-r--r--src/main/scala/xyz/driver/pdsuidomain/formats/json/document/ApiProviderType.scala27
-rw-r--r--src/main/scala/xyz/driver/pdsuidomain/formats/json/documenthistory.scala (renamed from src/main/scala/xyz/driver/pdsuidomain/formats/json/sprayformats/documenthistory.scala)4
-rw-r--r--src/main/scala/xyz/driver/pdsuidomain/formats/json/documenthistory/ApiDocumentHistory.scala27
-rw-r--r--src/main/scala/xyz/driver/pdsuidomain/formats/json/documentissue.scala (renamed from src/main/scala/xyz/driver/pdsuidomain/formats/json/sprayformats/documentissue.scala)2
-rw-r--r--src/main/scala/xyz/driver/pdsuidomain/formats/json/documentissue/ApiDocumentIssue.scala40
-rw-r--r--src/main/scala/xyz/driver/pdsuidomain/formats/json/documentissue/ApiPartialDocumentIssue.scala42
-rw-r--r--src/main/scala/xyz/driver/pdsuidomain/formats/json/eligibility.scala (renamed from src/main/scala/xyz/driver/pdsuidomain/formats/json/sprayformats/eligibility.scala)10
-rw-r--r--src/main/scala/xyz/driver/pdsuidomain/formats/json/eligibilityarm.scala (renamed from src/main/scala/xyz/driver/pdsuidomain/formats/json/sprayformats/eligibilityarm.scala)2
-rw-r--r--src/main/scala/xyz/driver/pdsuidomain/formats/json/eligibilityarm/ApiCreateEligibilityArm.scala33
-rw-r--r--src/main/scala/xyz/driver/pdsuidomain/formats/json/eligibilityarm/ApiEligibilityArm.scala57
-rw-r--r--src/main/scala/xyz/driver/pdsuidomain/formats/json/eligibilityarm/ApiPartialEligibilityArm.scala23
-rw-r--r--src/main/scala/xyz/driver/pdsuidomain/formats/json/evidence/ApiPatientLabelEvidence.scala33
-rw-r--r--src/main/scala/xyz/driver/pdsuidomain/formats/json/export.scala (renamed from src/main/scala/xyz/driver/pdsuidomain/formats/json/sprayformats/export.scala)2
-rw-r--r--src/main/scala/xyz/driver/pdsuidomain/formats/json/extracteddata.scala (renamed from src/main/scala/xyz/driver/pdsuidomain/formats/json/sprayformats/extracteddata.scala)6
-rw-r--r--src/main/scala/xyz/driver/pdsuidomain/formats/json/extracteddata/ApiExtractedData.scala64
-rw-r--r--src/main/scala/xyz/driver/pdsuidomain/formats/json/extracteddata/ApiPartialExtractedData.scala80
-rw-r--r--src/main/scala/xyz/driver/pdsuidomain/formats/json/hypothesis.scala (renamed from src/main/scala/xyz/driver/pdsuidomain/formats/json/sprayformats/hypothesis.scala)2
-rw-r--r--src/main/scala/xyz/driver/pdsuidomain/formats/json/hypothesis/ApiHypothesis.scala35
-rw-r--r--src/main/scala/xyz/driver/pdsuidomain/formats/json/intervention.scala (renamed from src/main/scala/xyz/driver/pdsuidomain/formats/json/sprayformats/intervention.scala)2
-rw-r--r--src/main/scala/xyz/driver/pdsuidomain/formats/json/intervention/ApiIntervention.scala76
-rw-r--r--src/main/scala/xyz/driver/pdsuidomain/formats/json/intervention/ApiInterventionType.scala26
-rw-r--r--src/main/scala/xyz/driver/pdsuidomain/formats/json/intervention/ApiPartialIntervention.scala90
-rw-r--r--src/main/scala/xyz/driver/pdsuidomain/formats/json/label/ApiCriterionLabel.scala54
-rw-r--r--src/main/scala/xyz/driver/pdsuidomain/formats/json/label/ApiExtractedDataLabel.scala41
-rw-r--r--src/main/scala/xyz/driver/pdsuidomain/formats/json/listresponse.scala (renamed from src/main/scala/xyz/driver/pdsuidomain/formats/json/sprayformats/listresponse.scala)6
-rw-r--r--src/main/scala/xyz/driver/pdsuidomain/formats/json/message/ApiMessage.scala79
-rw-r--r--src/main/scala/xyz/driver/pdsuidomain/formats/json/message/ApiPartialMessage.scala82
-rw-r--r--src/main/scala/xyz/driver/pdsuidomain/formats/json/password/PasswordCreateRequest.scala9
-rw-r--r--src/main/scala/xyz/driver/pdsuidomain/formats/json/password/PasswordUpdateRequest.scala9
-rw-r--r--src/main/scala/xyz/driver/pdsuidomain/formats/json/patient.scala (renamed from src/main/scala/xyz/driver/pdsuidomain/formats/json/sprayformats/patient.scala)10
-rw-r--r--src/main/scala/xyz/driver/pdsuidomain/formats/json/patient/ApiPatient.scala86
-rw-r--r--src/main/scala/xyz/driver/pdsuidomain/formats/json/patient/PatientStatus.scala24
-rw-r--r--src/main/scala/xyz/driver/pdsuidomain/formats/json/patient/eligible/ApiPartialPatientEligibleTrial.scala18
-rw-r--r--src/main/scala/xyz/driver/pdsuidomain/formats/json/patient/eligible/ApiPatientEligibleTrial.scala51
-rw-r--r--src/main/scala/xyz/driver/pdsuidomain/formats/json/patient/hypothesis/ApiPartialPatientHypothesis.scala27
-rw-r--r--src/main/scala/xyz/driver/pdsuidomain/formats/json/patient/hypothesis/ApiPatientHypothesis.scala35
-rw-r--r--src/main/scala/xyz/driver/pdsuidomain/formats/json/patient/label/ApiPartialPatientLabel.scala43
-rw-r--r--src/main/scala/xyz/driver/pdsuidomain/formats/json/patient/label/ApiPatientLabel.scala55
-rw-r--r--src/main/scala/xyz/driver/pdsuidomain/formats/json/patient/label/ApiPatientLabelDefiningCriteria.scala29
-rw-r--r--src/main/scala/xyz/driver/pdsuidomain/formats/json/patient/trial/ApiPartialPatientCriterion.scala47
-rw-r--r--src/main/scala/xyz/driver/pdsuidomain/formats/json/patient/trial/ApiPartialPatientCriterionList.scala37
-rw-r--r--src/main/scala/xyz/driver/pdsuidomain/formats/json/patient/trial/ApiPatientCriterion.scala77
-rw-r--r--src/main/scala/xyz/driver/pdsuidomain/formats/json/patientcriterion.scala (renamed from src/main/scala/xyz/driver/pdsuidomain/formats/json/sprayformats/patientcriterion.scala)4
-rw-r--r--src/main/scala/xyz/driver/pdsuidomain/formats/json/patientdefiningcriteria.scala (renamed from src/main/scala/xyz/driver/pdsuidomain/formats/json/sprayformats/patientdefiningcriteria.scala)4
-rw-r--r--src/main/scala/xyz/driver/pdsuidomain/formats/json/patienteligibletrial.scala (renamed from src/main/scala/xyz/driver/pdsuidomain/formats/json/sprayformats/patienteligibletrial.scala)4
-rw-r--r--src/main/scala/xyz/driver/pdsuidomain/formats/json/patienthistory.scala (renamed from src/main/scala/xyz/driver/pdsuidomain/formats/json/sprayformats/patienthistory.scala)4
-rw-r--r--src/main/scala/xyz/driver/pdsuidomain/formats/json/patienthistory/ApiPatientHistory.scala28
-rw-r--r--src/main/scala/xyz/driver/pdsuidomain/formats/json/patienthypothesis.scala (renamed from src/main/scala/xyz/driver/pdsuidomain/formats/json/sprayformats/patienthypothesis.scala)2
-rw-r--r--src/main/scala/xyz/driver/pdsuidomain/formats/json/patientissue.scala (renamed from src/main/scala/xyz/driver/pdsuidomain/formats/json/sprayformats/patientissue.scala)2
-rw-r--r--src/main/scala/xyz/driver/pdsuidomain/formats/json/patientissue/ApiPartialPatientIssue.scala33
-rw-r--r--src/main/scala/xyz/driver/pdsuidomain/formats/json/patientissue/ApiPatientIssue.scala34
-rw-r--r--src/main/scala/xyz/driver/pdsuidomain/formats/json/patientlabel.scala (renamed from src/main/scala/xyz/driver/pdsuidomain/formats/json/sprayformats/patientlabel.scala)7
-rw-r--r--src/main/scala/xyz/driver/pdsuidomain/formats/json/queue/ApiQueueUploadItem.scala38
-rw-r--r--src/main/scala/xyz/driver/pdsuidomain/formats/json/record.scala (renamed from src/main/scala/xyz/driver/pdsuidomain/formats/json/sprayformats/record.scala)2
-rw-r--r--src/main/scala/xyz/driver/pdsuidomain/formats/json/record/ApiCreateRecord.scala33
-rw-r--r--src/main/scala/xyz/driver/pdsuidomain/formats/json/record/ApiRecord.scala110
-rw-r--r--src/main/scala/xyz/driver/pdsuidomain/formats/json/record/ApiUpdateRecord.scala52
-rw-r--r--src/main/scala/xyz/driver/pdsuidomain/formats/json/record/MedicalRecordStatus.scala34
-rw-r--r--src/main/scala/xyz/driver/pdsuidomain/formats/json/recordhistory.scala (renamed from src/main/scala/xyz/driver/pdsuidomain/formats/json/sprayformats/recordhistory.scala)4
-rw-r--r--src/main/scala/xyz/driver/pdsuidomain/formats/json/recordhistory/ApiRecordHistory.scala27
-rw-r--r--src/main/scala/xyz/driver/pdsuidomain/formats/json/recordissue.scala (renamed from src/main/scala/xyz/driver/pdsuidomain/formats/json/sprayformats/recordissue.scala)2
-rw-r--r--src/main/scala/xyz/driver/pdsuidomain/formats/json/recordissue/ApiPartialRecordIssue.scala42
-rw-r--r--src/main/scala/xyz/driver/pdsuidomain/formats/json/recordissue/ApiRecordIssue.scala40
-rw-r--r--src/main/scala/xyz/driver/pdsuidomain/formats/json/session/NewSessionRequest.scala12
-rw-r--r--src/main/scala/xyz/driver/pdsuidomain/formats/json/session/NewSessionResponse.scala11
-rw-r--r--src/main/scala/xyz/driver/pdsuidomain/formats/json/slotarm.scala (renamed from src/main/scala/xyz/driver/pdsuidomain/formats/json/sprayformats/slotarm.scala)2
-rw-r--r--src/main/scala/xyz/driver/pdsuidomain/formats/json/slotarm/ApiPartialSlotArm.scala14
-rw-r--r--src/main/scala/xyz/driver/pdsuidomain/formats/json/slotarm/ApiSlotArm.scala35
-rw-r--r--src/main/scala/xyz/driver/pdsuidomain/formats/json/slotarm/ApiSlotCreateArm.scala20
-rw-r--r--src/main/scala/xyz/driver/pdsuidomain/formats/json/studydesign.scala (renamed from src/main/scala/xyz/driver/pdsuidomain/formats/json/sprayformats/studydesign.scala)2
-rw-r--r--src/main/scala/xyz/driver/pdsuidomain/formats/json/studydesign/ApiStudyDesign.scala23
-rw-r--r--src/main/scala/xyz/driver/pdsuidomain/formats/json/trial.scala (renamed from src/main/scala/xyz/driver/pdsuidomain/formats/json/sprayformats/trial.scala)6
-rw-r--r--src/main/scala/xyz/driver/pdsuidomain/formats/json/trial/ApiPartialTrial.scala44
-rw-r--r--src/main/scala/xyz/driver/pdsuidomain/formats/json/trial/ApiTrial.scala96
-rw-r--r--src/main/scala/xyz/driver/pdsuidomain/formats/json/trial/TrialStatus.scala30
-rw-r--r--src/main/scala/xyz/driver/pdsuidomain/formats/json/trialhistory.scala (renamed from src/main/scala/xyz/driver/pdsuidomain/formats/json/sprayformats/trialhistory.scala)4
-rw-r--r--src/main/scala/xyz/driver/pdsuidomain/formats/json/trialhistory/ApiTrialHistory.scala26
-rw-r--r--src/main/scala/xyz/driver/pdsuidomain/formats/json/trialissue.scala (renamed from src/main/scala/xyz/driver/pdsuidomain/formats/json/sprayformats/trialissue.scala)2
-rw-r--r--src/main/scala/xyz/driver/pdsuidomain/formats/json/trialissue/ApiPartialTrialIssue.scala40
-rw-r--r--src/main/scala/xyz/driver/pdsuidomain/formats/json/trialissue/ApiTrialIssue.scala60
-rw-r--r--src/main/scala/xyz/driver/pdsuidomain/formats/json/user/ApiPartialUser.scala76
-rw-r--r--src/main/scala/xyz/driver/pdsuidomain/formats/json/user/ApiUser.scala39
-rw-r--r--src/main/scala/xyz/driver/pdsuidomain/formats/json/user/UserRole.scala37
-rw-r--r--src/main/scala/xyz/driver/pdsuidomain/formats/json/userhistory/ApiUserHistory.scala43
-rw-r--r--src/main/scala/xyz/driver/pdsuidomain/services/MessageService.scala88
-rw-r--r--src/main/scala/xyz/driver/pdsuidomain/services/UserHistoryService.scala30
-rw-r--r--src/main/scala/xyz/driver/pdsuidomain/services/rest/RestArmService.scala26
-rw-r--r--src/main/scala/xyz/driver/pdsuidomain/services/rest/RestCriterionService.scala28
-rw-r--r--src/main/scala/xyz/driver/pdsuidomain/services/rest/RestDocumentService.scala32
-rw-r--r--src/main/scala/xyz/driver/pdsuidomain/services/rest/RestDocumentTypeService.scala13
-rw-r--r--src/main/scala/xyz/driver/pdsuidomain/services/rest/RestEligibilityVerificationService.scala2
-rw-r--r--src/main/scala/xyz/driver/pdsuidomain/services/rest/RestExtractedDataService.scala28
-rw-r--r--src/main/scala/xyz/driver/pdsuidomain/services/rest/RestHelper.scala3
-rw-r--r--src/main/scala/xyz/driver/pdsuidomain/services/rest/RestHypothesisService.scala11
-rw-r--r--src/main/scala/xyz/driver/pdsuidomain/services/rest/RestInterventionService.scala27
-rw-r--r--src/main/scala/xyz/driver/pdsuidomain/services/rest/RestInterventionTypeService.scala13
-rw-r--r--src/main/scala/xyz/driver/pdsuidomain/services/rest/RestMedicalRecordService.scala33
-rw-r--r--src/main/scala/xyz/driver/pdsuidomain/services/rest/RestMessageService.scala87
-rw-r--r--src/main/scala/xyz/driver/pdsuidomain/services/rest/RestPatientService.scala20
-rw-r--r--src/main/scala/xyz/driver/pdsuidomain/services/rest/RestProviderTypeService.scala13
-rw-r--r--src/main/scala/xyz/driver/pdsuidomain/services/rest/RestStudyDesignService.scala13
-rw-r--r--src/main/scala/xyz/driver/pdsuidomain/services/rest/RestTrialService.scala28
-rw-r--r--src/test/scala/xyz/driver/pdsuicommon/BaseSuite.scala12
-rw-r--r--src/test/scala/xyz/driver/pdsuicommon/Mocks.scala51
-rw-r--r--src/test/scala/xyz/driver/pdsuicommon/concurrent/BridgeUploadQueueRepositoryAdapterSuite.scala285
-rw-r--r--src/test/scala/xyz/driver/pdsuicommon/db/QueryBuilderParametersSuite.scala310
-rw-r--r--src/test/scala/xyz/driver/pdsuidomain/formats/json/ArmFormatSuite.scala (renamed from src/test/scala/xyz/driver/pdsuidomain/formats/json/sprayformats/ArmFormatSuite.scala)4
-rw-r--r--src/test/scala/xyz/driver/pdsuidomain/formats/json/BridgeUploadQueueFormatSuite.scala (renamed from src/test/scala/xyz/driver/pdsuidomain/formats/json/sprayformats/BridgeUploadQueueFormat.scala)6
-rw-r--r--src/test/scala/xyz/driver/pdsuidomain/formats/json/CriterionFormatSuite.scala (renamed from src/test/scala/xyz/driver/pdsuidomain/formats/json/sprayformats/CriterionFormatSuite.scala)4
-rw-r--r--src/test/scala/xyz/driver/pdsuidomain/formats/json/DocumentFormatSuite.scala (renamed from src/test/scala/xyz/driver/pdsuidomain/formats/json/sprayformats/DocumentFormatSuite.scala)4
-rw-r--r--src/test/scala/xyz/driver/pdsuidomain/formats/json/DocumentHistoryFormatSuite.scala (renamed from src/test/scala/xyz/driver/pdsuidomain/formats/json/sprayformats/DocumentHistoryFormatSuite.scala)4
-rw-r--r--src/test/scala/xyz/driver/pdsuidomain/formats/json/DocumentIssueFormatSuite.scala (renamed from src/test/scala/xyz/driver/pdsuidomain/formats/json/sprayformats/DocumentIssueFormatSuite.scala)4
-rw-r--r--src/test/scala/xyz/driver/pdsuidomain/formats/json/EligibilityArmWithDiseasesFormatSuite.scala (renamed from src/test/scala/xyz/driver/pdsuidomain/formats/json/sprayformats/EligibilityArmWithDiseasesFormatSuite.scala)4
-rw-r--r--src/test/scala/xyz/driver/pdsuidomain/formats/json/ExportFormatSuite.scala (renamed from src/test/scala/xyz/driver/pdsuidomain/formats/json/sprayformats/ExportFormatSuite.scala)4
-rw-r--r--src/test/scala/xyz/driver/pdsuidomain/formats/json/ExtractedDataFormatSuite.scala (renamed from src/test/scala/xyz/driver/pdsuidomain/formats/json/sprayformats/ExtractedDataFormatSuite.scala)5
-rw-r--r--src/test/scala/xyz/driver/pdsuidomain/formats/json/HypothesisFormatSuite.scala (renamed from src/test/scala/xyz/driver/pdsuidomain/formats/json/sprayformats/HypothesisFormatSuite.scala)4
-rw-r--r--src/test/scala/xyz/driver/pdsuidomain/formats/json/InterventionFormatSuite.scala (renamed from src/test/scala/xyz/driver/pdsuidomain/formats/json/sprayformats/InterventionFormatSuite.scala)4
-rw-r--r--src/test/scala/xyz/driver/pdsuidomain/formats/json/ListResponseFormatSuite.scala (renamed from src/test/scala/xyz/driver/pdsuidomain/formats/json/sprayformats/ListResponseFormatSuite.scala)6
-rw-r--r--src/test/scala/xyz/driver/pdsuidomain/formats/json/MedicalRecordFormatSuite.scala (renamed from src/test/scala/xyz/driver/pdsuidomain/formats/json/sprayformats/MedicalRecordFormatSuite.scala)4
-rw-r--r--src/test/scala/xyz/driver/pdsuidomain/formats/json/MedicalRecordHistoryFormatSuite.scala (renamed from src/test/scala/xyz/driver/pdsuidomain/formats/json/sprayformats/MedicalRecordHistoryFormatSuite.scala)4
-rw-r--r--src/test/scala/xyz/driver/pdsuidomain/formats/json/MedicalRecordIssueFormatSuite.scala (renamed from src/test/scala/xyz/driver/pdsuidomain/formats/json/sprayformats/MedicalRecordIssueFormatSuite.scala)4
-rw-r--r--src/test/scala/xyz/driver/pdsuidomain/formats/json/PatientCriterionFormatSuite.scala (renamed from src/test/scala/xyz/driver/pdsuidomain/formats/json/sprayformats/PatientCriterionFormatSuite.scala)4
-rw-r--r--src/test/scala/xyz/driver/pdsuidomain/formats/json/PatientEligibleTrialFormatSuite.scala (renamed from src/test/scala/xyz/driver/pdsuidomain/formats/json/sprayformats/PatientEligibleTrialFormatSuite.scala)4
-rw-r--r--src/test/scala/xyz/driver/pdsuidomain/formats/json/PatientFormatSuite.scala (renamed from src/test/scala/xyz/driver/pdsuidomain/formats/json/sprayformats/PatientFormatSuite.scala)6
-rw-r--r--src/test/scala/xyz/driver/pdsuidomain/formats/json/PatientHistoryFormatSuite.scala (renamed from src/test/scala/xyz/driver/pdsuidomain/formats/json/sprayformats/PatientHistoryFormatSuite.scala)4
-rw-r--r--src/test/scala/xyz/driver/pdsuidomain/formats/json/PatientHypothesisFormatSuite.scala (renamed from src/test/scala/xyz/driver/pdsuidomain/formats/json/sprayformats/PatientHypothesisFormatSuite.scala)4
-rw-r--r--src/test/scala/xyz/driver/pdsuidomain/formats/json/PatientIssueFormatSuite.scala (renamed from src/test/scala/xyz/driver/pdsuidomain/formats/json/sprayformats/PatientIssueFormatSuite.scala)4
-rw-r--r--src/test/scala/xyz/driver/pdsuidomain/formats/json/PatientLabelFormatSuite.scala (renamed from src/test/scala/xyz/driver/pdsuidomain/formats/json/sprayformats/PatientLabelFormatSuite.scala)8
-rw-r--r--src/test/scala/xyz/driver/pdsuidomain/formats/json/SlotArmFormatSuite.scala (renamed from src/test/scala/xyz/driver/pdsuidomain/formats/json/sprayformats/SlotArmFormatSuite.scala)4
-rw-r--r--src/test/scala/xyz/driver/pdsuidomain/formats/json/StudyDesignFormatSuite.scala (renamed from src/test/scala/xyz/driver/pdsuidomain/formats/json/sprayformats/StudyDesignFormatSuite.scala)4
-rw-r--r--src/test/scala/xyz/driver/pdsuidomain/formats/json/TrialFormatSuite.scala (renamed from src/test/scala/xyz/driver/pdsuidomain/formats/json/sprayformats/TrialFormatSuite.scala)6
-rw-r--r--src/test/scala/xyz/driver/pdsuidomain/formats/json/TrialHistoryFormatSuite.scala (renamed from src/test/scala/xyz/driver/pdsuidomain/formats/json/sprayformats/TrialHistoryFormatSuite.scala)4
-rw-r--r--src/test/scala/xyz/driver/pdsuidomain/formats/json/TrialIssueFormatSuite.scala (renamed from src/test/scala/xyz/driver/pdsuidomain/formats/json/sprayformats/TrialIssueFormatSuite.scala)4
176 files changed, 354 insertions, 5382 deletions
diff --git a/build.sbt b/build.sbt
index 3f969e5..f726690 100644
--- a/build.sbt
+++ b/build.sbt
@@ -12,12 +12,9 @@ lazy val core = (project in file("."))
"com.github.pureconfig" %% "pureconfig" % "0.7.2",
"com.lihaoyi" %% "fastparse" % "0.3.7",
"com.typesafe.akka" %% "akka-http" % "10.0.10",
- "com.typesafe.play" %% "play" % "2.5.15",
"com.typesafe.scala-logging" %% "scala-logging" % "3.5.0",
"io.getquill" %% "quill-jdbc" % "1.2.1",
"io.github.cloudify" %% "spdf" % "1.4.0",
- "org.davidbild" %% "tristate-core" % "0.2.0",
- "org.davidbild" %% "tristate-play" % "0.2.0" exclude ("com.typesafe.play", "play-json"),
"xyz.driver" %% "core" % "1.5.1",
"xyz.driver" %% "domain-model" % "0.18.1",
"ch.qos.logback" % "logback-classic" % "1.1.7",
diff --git a/src/main/scala/xyz/driver/pdsuicommon/concurrent/BridgeUploadQueueRepositoryAdapter.scala b/src/main/scala/xyz/driver/pdsuicommon/concurrent/BridgeUploadQueueRepositoryAdapter.scala
deleted file mode 100644
index 3bf9192..0000000
--- a/src/main/scala/xyz/driver/pdsuicommon/concurrent/BridgeUploadQueueRepositoryAdapter.scala
+++ /dev/null
@@ -1,140 +0,0 @@
-package xyz.driver.pdsuicommon.concurrent
-
-import java.time.LocalDateTime
-import java.time.temporal.ChronoUnit
-
-import xyz.driver.pdsuicommon.concurrent.BridgeUploadQueue.Item
-import xyz.driver.pdsuicommon.concurrent.BridgeUploadQueueRepositoryAdapter.Strategy
-import xyz.driver.pdsuicommon.db._
-import xyz.driver.pdsuicommon.db.repositories.BridgeUploadQueueRepository
-import xyz.driver.pdsuicommon.logging._
-
-import scala.concurrent.duration.{Duration, FiniteDuration}
-import scala.concurrent.{ExecutionContext, Future}
-import scala.util.Try
-
-object BridgeUploadQueueRepositoryAdapter {
-
- /**
- * Defines how we work with queue, when an user attempts to remove/tryRetry an item.
- */
- sealed trait Strategy {
-
- def onComplete: Strategy.OnComplete
-
- def on(attempt: Int): Strategy.OnAttempt
-
- }
-
- object Strategy {
-
- /**
- * Works forever, but has a limit for intervals.
- */
- final case class LimitExponential(startInterval: FiniteDuration,
- intervalFactor: Double,
- maxInterval: FiniteDuration,
- onComplete: OnComplete)
- extends Strategy {
-
- override def on(attempt: Int): OnAttempt = {
- OnAttempt.Continue(intervalFor(attempt).min(maxInterval))
- }
-
- private def intervalFor(attempt: Int): Duration = {
- Try(startInterval * Math.pow(intervalFactor, attempt.toDouble))
- .getOrElse(maxInterval)
- }
- }
-
- /**
- * Used only in tests.
- */
- final case class Stop(onComplete: OnComplete = OnComplete.Delete) extends Strategy {
-
- override def on(attempt: Int) = OnAttempt.Complete
-
- }
-
- /**
- * Used only in tests.
- */
- final case class Constant(interval: FiniteDuration) extends Strategy {
-
- override val onComplete = OnComplete.Delete
-
- override def on(attempt: Int) = OnAttempt.Continue(interval)
-
- }
-
- sealed trait OnComplete
- object OnComplete {
- case object Delete extends OnComplete
- case object Mark extends OnComplete
-
- implicit def toPhiString(x: OnAttempt): PhiString = Unsafe(x.toString)
- }
-
- sealed trait OnAttempt
- object OnAttempt {
- case object Complete extends OnAttempt
- final case class Continue(interval: Duration) extends OnAttempt
-
- implicit def toPhiString(x: OnAttempt): PhiString = Unsafe(x.toString)
- }
- }
-}
-
-class BridgeUploadQueueRepositoryAdapter(strategy: Strategy, repository: BridgeUploadQueueRepository, dbIo: DbIo)(
- implicit executionContext: ExecutionContext)
- extends BridgeUploadQueue with PhiLogging {
-
- override def add(item: Item): Future[Item] = dbIo.runAsync(repository.add(item))
-
- override def get(kind: String): Future[Option[Item]] = dbIo.runAsync(repository.getOne(kind))
-
- override def complete(kind: String, tag: String): Future[Unit] = {
- import Strategy.OnComplete._
-
- strategy.onComplete match {
- case Delete => dbIo.runAsync(repository.delete(kind, tag))
- case Mark =>
- dbIo.runAsyncTx {
- repository.getById(kind, tag) match {
- case Some(x) => repository.update(x.copy(completed = true))
- case None => throw new RuntimeException(s"Can not find the task: kind=$kind, tag=$tag")
- }
- }
- }
- }
-
- /**
- * Tries to continue the task or complete it
- */
- override def tryRetry(item: Item): Future[Option[Item]] = {
- import Strategy.OnAttempt._
-
- logger.trace(phi"tryRetry($item)")
-
- val newAttempts = item.attempts + 1
- val action = strategy.on(newAttempts)
- logger.debug(phi"Action for ${Unsafe(newAttempts)}: $action")
-
- action match {
- case Continue(newInterval) =>
- val draftItem = item.copy(
- attempts = newAttempts,
- nextAttempt = LocalDateTime.now().plus(newInterval.toMillis, ChronoUnit.MILLIS)
- )
-
- logger.debug(draftItem)
- dbIo.runAsync {
- Some(repository.update(draftItem))
- }
-
- case Complete =>
- logger.warn(phi"All attempts are out for $item, complete the task")
- complete(item.kind, item.tag).map(_ => None)
- }
- }
-}
diff --git a/src/main/scala/xyz/driver/pdsuicommon/db/DbCommand.scala b/src/main/scala/xyz/driver/pdsuicommon/db/DbCommand.scala
deleted file mode 100644
index 0af104e..0000000
--- a/src/main/scala/xyz/driver/pdsuicommon/db/DbCommand.scala
+++ /dev/null
@@ -1,15 +0,0 @@
-package xyz.driver.pdsuicommon.db
-
-import scala.concurrent.Future
-
-trait DbCommand {
- def runSync(): Unit
- def runAsync(transactions: DbIo): Future[Unit]
-}
-
-object DbCommand {
- val Empty: DbCommand = new DbCommand {
- override def runSync(): Unit = {}
- override def runAsync(transactions: DbIo): Future[Unit] = Future.successful(())
- }
-}
diff --git a/src/main/scala/xyz/driver/pdsuicommon/db/DbCommandFactory.scala b/src/main/scala/xyz/driver/pdsuicommon/db/DbCommandFactory.scala
deleted file mode 100644
index 1e2fb74..0000000
--- a/src/main/scala/xyz/driver/pdsuicommon/db/DbCommandFactory.scala
+++ /dev/null
@@ -1,14 +0,0 @@
-package xyz.driver.pdsuicommon.db
-
-import scala.concurrent.{ExecutionContext, Future}
-
-trait DbCommandFactory[T] {
- def createCommand(orig: T)(implicit ec: ExecutionContext): Future[DbCommand]
-}
-
-object DbCommandFactory {
- def empty[T]: DbCommandFactory[T] = new DbCommandFactory[T] {
- override def createCommand(orig: T)(implicit ec: ExecutionContext): Future[DbCommand] =
- Future.successful(DbCommand.Empty)
- }
-}
diff --git a/src/main/scala/xyz/driver/pdsuicommon/db/EntityExtractorDerivation.scala b/src/main/scala/xyz/driver/pdsuicommon/db/EntityExtractorDerivation.scala
deleted file mode 100644
index 02ba322..0000000
--- a/src/main/scala/xyz/driver/pdsuicommon/db/EntityExtractorDerivation.scala
+++ /dev/null
@@ -1,66 +0,0 @@
-package xyz.driver.pdsuicommon.db
-
-import java.sql.ResultSet
-
-import io.getquill.NamingStrategy
-import io.getquill.dsl.EncodingDsl
-
-import scala.language.experimental.macros
-import scala.reflect.macros.blackbox
-
-trait EntityExtractorDerivation[Naming <: NamingStrategy] { this: EncodingDsl =>
-
- /*
- Simple Quill extractor derivation for [[T]]
- Only case classes available. Type parameters is not supported
- */
- def entityExtractor[T]: (ResultSet => T) = macro EntityExtractorDerivation.impl[T]
-}
-
-object EntityExtractorDerivation {
- def impl[T: c.WeakTypeTag](c: blackbox.Context): c.Tree = {
- import c.universe._
- val namingStrategy = c.prefix.actualType
- .baseType(c.weakTypeOf[EntityExtractorDerivation[NamingStrategy]].typeSymbol)
- .typeArgs
- .head
- .typeSymbol
- .companion
- val functionBody = {
- val tpe = weakTypeOf[T]
- val resultOpt = tpe.decls.collectFirst {
- // Find first constructor of T
- case cons: MethodSymbol if cons.isConstructor =>
- // Create param list for constructor
- val params = cons.paramLists.flatten.map { param =>
- val t = param.typeSignature
- val paramName = param.name.toString
- val col = q"$namingStrategy.column($paramName)"
- // Resolve implicit decoders (from SqlContext) and apply ResultSet for each
- val d = q"implicitly[${c.prefix}.Decoder[$t]]"
- // Minus 1 cause Quill JDBC decoders make plus one.
- // ¯\_(ツ)_/¯
- val i = q"row.findColumn($col) - 1"
- val decoderName = TermName(paramName + "Decoder")
- val valueName = TermName(paramName + "Value")
- (
- q"val $decoderName = $d",
- q"val $valueName = $decoderName($i, row)",
- valueName
- )
- }
- // Call constructor with param list
- q"""
- ..${params.map(_._1)}
- ..${params.map(_._2)}
- new $tpe(..${params.map(_._3)})
- """
- }
- resultOpt match {
- case Some(result) => result
- case None => c.abort(c.enclosingPosition, s"Can not derive extractor for $tpe. Constructor not found.")
- }
- }
- q"(row: java.sql.ResultSet) => $functionBody"
- }
-}
diff --git a/src/main/scala/xyz/driver/pdsuicommon/db/FakeDbIo.scala b/src/main/scala/xyz/driver/pdsuicommon/db/FakeDbIo.scala
deleted file mode 100644
index ac42a34..0000000
--- a/src/main/scala/xyz/driver/pdsuicommon/db/FakeDbIo.scala
+++ /dev/null
@@ -1,9 +0,0 @@
-package xyz.driver.pdsuicommon.db
-
-import scala.concurrent.Future
-
-object FakeDbIo extends DbIo {
- override def runAsync[T](f: => T): Future[T] = Future.successful(f)
- override def runAsyncTx[T](f: => T): Future[T] = Future.successful(f)
- override def runSyncTx[T](f: => T): Unit = f
-}
diff --git a/src/main/scala/xyz/driver/pdsuicommon/db/MySqlContext.scala b/src/main/scala/xyz/driver/pdsuicommon/db/MySqlContext.scala
deleted file mode 100644
index 9d2664d..0000000
--- a/src/main/scala/xyz/driver/pdsuicommon/db/MySqlContext.scala
+++ /dev/null
@@ -1,90 +0,0 @@
-package xyz.driver.pdsuicommon.db
-
-import java.io.Closeable
-import java.time._
-import java.util.concurrent.Executors
-import javax.sql.DataSource
-
-import com.typesafe.config.Config
-import io.getquill._
-import xyz.driver.pdsuicommon.concurrent.MdcExecutionContext
-import xyz.driver.pdsuicommon.db.MySqlContext.Settings
-import xyz.driver.pdsuicommon.error.IncorrectIdException
-import xyz.driver.pdsuicommon.logging._
-
-import scala.concurrent.ExecutionContext
-import scala.util.control.NonFatal
-import scala.util.{Failure, Success, Try}
-
-object MySqlContext extends PhiLogging {
-
- final case class DbCredentials(user: String,
- password: String,
- host: String,
- port: Int,
- dbName: String,
- dbCreateFlag: Boolean,
- dbContext: String,
- connectionParams: String,
- url: String)
-
- final case class Settings(credentials: DbCredentials, connection: Config, threadPoolSize: Int)
-
- def apply(settings: Settings): MySqlContext = {
- // Prevent leaking credentials to a log
- Try(JdbcContextConfig(settings.connection).dataSource) match {
- case Success(dataSource) => new MySqlContext(dataSource, settings)
- case Failure(NonFatal(e)) =>
- logger.error(phi"Can not load dataSource, error: ${Unsafe(e.getClass.getName)}")
- throw new IllegalArgumentException("Can not load dataSource from config. Check your database and config")
- }
- }
-}
-
-class MySqlContext(dataSource: DataSource with Closeable, settings: Settings)
- extends MysqlJdbcContext[MysqlEscape](dataSource) with TransactionalContext
- with EntityExtractorDerivation[Literal] {
-
- private val tpe = Executors.newFixedThreadPool(settings.threadPoolSize)
-
- implicit val executionContext: ExecutionContext = {
- val orig = ExecutionContext.fromExecutor(tpe)
- MdcExecutionContext.from(orig)
- }
-
- override def close(): Unit = {
- super.close()
- tpe.shutdownNow()
- }
-
- /**
- * Overrode, because Quill JDBC optionDecoder pass null inside decoders.
- * If custom decoder don't have special null handler, it will failed.
- *
- * @see https://github.com/getquill/quill/issues/535
- */
- implicit override def optionDecoder[T](implicit d: Decoder[T]): Decoder[Option[T]] =
- decoder(
- sqlType = d.sqlType,
- row =>
- index => {
- try {
- val res = d(index - 1, row)
- if (row.wasNull) {
- None
- } else {
- Some(res)
- }
- } catch {
- case _: NullPointerException => None
- case _: IncorrectIdException => None
- }
- }
- )
-
- final implicit class LocalDateTimeDbOps(val left: LocalDateTime) {
-
- // scalastyle:off
- def <=(right: LocalDateTime): Quoted[Boolean] = quote(infix"$left <= $right".as[Boolean])
- }
-}
diff --git a/src/main/scala/xyz/driver/pdsuicommon/db/MysqlQueryBuilder.scala b/src/main/scala/xyz/driver/pdsuicommon/db/MysqlQueryBuilder.scala
deleted file mode 100644
index e2936e3..0000000
--- a/src/main/scala/xyz/driver/pdsuicommon/db/MysqlQueryBuilder.scala
+++ /dev/null
@@ -1,88 +0,0 @@
-package xyz.driver.pdsuicommon.db
-
-import java.sql.ResultSet
-
-import xyz.driver.pdsuicommon.logging._
-import io.getquill.{MySQLDialect, MysqlEscape}
-
-import scala.collection.breakOut
-
-object MysqlQueryBuilder extends PhiLogging {
- import xyz.driver.pdsuicommon.db.QueryBuilder._
-
- def apply[T](tableName: String,
- lastUpdateFieldName: Option[String],
- nullableFields: Set[String],
- links: Set[TableLink],
- runner: Runner[T],
- countRunner: CountRunner): MysqlQueryBuilder[T] = {
- val parameters = MysqlQueryBuilderParameters(
- tableData = TableData(tableName, lastUpdateFieldName, nullableFields),
- links = links.map(x => x.foreignTableName -> x)(breakOut)
- )
- new MysqlQueryBuilder[T](parameters)(runner, countRunner)
- }
-
- def apply[T](tableName: String,
- lastUpdateFieldName: Option[String],
- nullableFields: Set[String],
- links: Set[TableLink],
- extractor: (ResultSet) => T)(implicit sqlContext: MySqlContext): MysqlQueryBuilder[T] = {
-
- val runner: Runner[T] = { parameters =>
- val (sql, binder) = parameters.toSql(namingStrategy = MysqlEscape)
- logger.trace(phi"Query for execute: ${Unsafe(sql)}")
- sqlContext.executeQuery[T](sql, binder, { resultSet =>
- extractor(resultSet)
- })
- }
-
- val countRunner: CountRunner = { parameters =>
- val (sql, binder) = parameters.toSql(countQuery = true, namingStrategy = MysqlEscape)
- logger.trace(phi"Query for execute: ${Unsafe(sql)}")
- sqlContext
- .executeQuery[CountResult](
- sql,
- binder, { resultSet =>
- val count = resultSet.getInt(1)
- val lastUpdate = if (parameters.tableData.lastUpdateFieldName.isDefined) {
- Option(sqlContext.localDateTimeDecoder.decoder(2, resultSet))
- } else None
-
- (count, lastUpdate)
- }
- )
- .head
- }
-
- apply[T](
- tableName = tableName,
- lastUpdateFieldName = lastUpdateFieldName,
- nullableFields = nullableFields,
- links = links,
- runner = runner,
- countRunner = countRunner
- )
- }
-}
-
-class MysqlQueryBuilder[T](parameters: MysqlQueryBuilderParameters)(implicit runner: QueryBuilder.Runner[T],
- countRunner: QueryBuilder.CountRunner)
- extends QueryBuilder[T, MySQLDialect, MysqlEscape](parameters) {
-
- def withFilter(newFilter: SearchFilterExpr): QueryBuilder[T, MySQLDialect, MysqlEscape] = {
- new MysqlQueryBuilder[T](parameters.copy(filter = newFilter))
- }
-
- def withSorting(newSorting: Sorting): QueryBuilder[T, MySQLDialect, MysqlEscape] = {
- new MysqlQueryBuilder[T](parameters.copy(sorting = newSorting))
- }
-
- def withPagination(newPagination: Pagination): QueryBuilder[T, MySQLDialect, MysqlEscape] = {
- new MysqlQueryBuilder[T](parameters.copy(pagination = Some(newPagination)))
- }
-
- def resetPagination: QueryBuilder[T, MySQLDialect, MysqlEscape] = {
- new MysqlQueryBuilder[T](parameters.copy(pagination = None))
- }
-}
diff --git a/src/main/scala/xyz/driver/pdsuicommon/db/PostgresContext.scala b/src/main/scala/xyz/driver/pdsuicommon/db/PostgresContext.scala
index 7bdfd1b..0098a64 100644
--- a/src/main/scala/xyz/driver/pdsuicommon/db/PostgresContext.scala
+++ b/src/main/scala/xyz/driver/pdsuicommon/db/PostgresContext.scala
@@ -1,7 +1,7 @@
package xyz.driver.pdsuicommon.db
import java.io.Closeable
-import java.time._
+import java.time.{LocalDateTime, ZoneOffset}
import java.util.UUID
import java.util.concurrent.Executors
import javax.sql.DataSource
@@ -35,8 +35,7 @@ object PostgresContext extends PhiLogging {
}
class PostgresContext(val dataSource: DataSource with Closeable, settings: Settings)
- extends PostgresJdbcContext[SnakeCase](dataSource) with TransactionalContext
- with EntityExtractorDerivation[SnakeCase] {
+ extends PostgresJdbcContext[SnakeCase](dataSource) with TransactionalContext {
private val tpe = Executors.newFixedThreadPool(settings.threadPoolSize)
diff --git a/src/main/scala/xyz/driver/pdsuicommon/db/PostgresQueryBuilder.scala b/src/main/scala/xyz/driver/pdsuicommon/db/PostgresQueryBuilder.scala
deleted file mode 100644
index 0ddf811..0000000
--- a/src/main/scala/xyz/driver/pdsuicommon/db/PostgresQueryBuilder.scala
+++ /dev/null
@@ -1,108 +0,0 @@
-package xyz.driver.pdsuicommon.db
-
-import java.sql.ResultSet
-
-import io.getquill.{PostgresDialect, PostgresEscape}
-import xyz.driver.pdsuicommon.db.PostgresQueryBuilder.SmartPostgresEscape
-
-import scala.collection.breakOut
-
-object PostgresQueryBuilder {
-
- import xyz.driver.pdsuicommon.db.QueryBuilder._
-
- trait SmartPostgresEscape extends PostgresEscape {
- override def column(s: String): String =
- if (s.startsWith("$")) s else super.column(s)
- override def default(s: String): String =
- s.split("\\.").map(ss => s""""$ss"""").mkString(".")
- }
-
- object SmartPostgresEscape extends SmartPostgresEscape
-
- type Escape = SmartPostgresEscape
- val Escape = SmartPostgresEscape
-
- def apply[T](tableName: String,
- lastUpdateFieldName: Option[String],
- nullableFields: Set[String],
- links: Set[TableLink],
- runner: Runner[T],
- countRunner: CountRunner): PostgresQueryBuilder[T] = {
- val parameters = PostgresQueryBuilderParameters(
- tableData = TableData(tableName, lastUpdateFieldName, nullableFields),
- links = links.map(x => x.foreignTableName -> x)(breakOut)
- )
- new PostgresQueryBuilder[T](parameters)(runner, countRunner)
- }
-
- def apply[T](tableName: String,
- lastUpdateFieldName: Option[String],
- nullableFields: Set[String],
- links: Set[TableLink],
- extractor: ResultSet => T)(implicit sqlContext: PostgresContext): PostgresQueryBuilder[T] = {
- apply(tableName, QueryBuilderParameters.AllFields, lastUpdateFieldName, nullableFields, links, extractor)
- }
-
- def apply[T](tableName: String,
- fields: Set[String],
- lastUpdateFieldName: Option[String],
- nullableFields: Set[String],
- links: Set[TableLink],
- extractor: ResultSet => T)(implicit sqlContext: PostgresContext): PostgresQueryBuilder[T] = {
-
- val runner: Runner[T] = { parameters =>
- val (sql, binder) = parameters.toSql(countQuery = false, fields = fields, namingStrategy = SmartPostgresEscape)
- sqlContext.executeQuery[T](sql, binder, { resultSet =>
- extractor(resultSet)
- })
- }
-
- val countRunner: CountRunner = { parameters =>
- val (sql, binder) = parameters.toSql(countQuery = true, namingStrategy = SmartPostgresEscape)
- sqlContext
- .executeQuery[CountResult](
- sql,
- binder, { resultSet =>
- val count = resultSet.getInt(1)
- val lastUpdate = if (parameters.tableData.lastUpdateFieldName.isDefined) {
- Option(resultSet.getTimestamp(2)).map(sqlContext.timestampToLocalDateTime)
- } else None
-
- (count, lastUpdate)
- }
- )
- .head
- }
-
- apply[T](
- tableName = tableName,
- lastUpdateFieldName = lastUpdateFieldName,
- nullableFields = nullableFields,
- links = links,
- runner = runner,
- countRunner = countRunner
- )
- }
-}
-
-class PostgresQueryBuilder[T](parameters: PostgresQueryBuilderParameters)(implicit runner: QueryBuilder.Runner[T],
- countRunner: QueryBuilder.CountRunner)
- extends QueryBuilder[T, PostgresDialect, PostgresQueryBuilder.Escape](parameters) {
-
- def withFilter(newFilter: SearchFilterExpr): QueryBuilder[T, PostgresDialect, SmartPostgresEscape] = {
- new PostgresQueryBuilder[T](parameters.copy(filter = newFilter))
- }
-
- def withSorting(newSorting: Sorting): QueryBuilder[T, PostgresDialect, SmartPostgresEscape] = {
- new PostgresQueryBuilder[T](parameters.copy(sorting = newSorting))
- }
-
- def withPagination(newPagination: Pagination): QueryBuilder[T, PostgresDialect, SmartPostgresEscape] = {
- new PostgresQueryBuilder[T](parameters.copy(pagination = Some(newPagination)))
- }
-
- def resetPagination: QueryBuilder[T, PostgresDialect, SmartPostgresEscape] = {
- new PostgresQueryBuilder[T](parameters.copy(pagination = None))
- }
-}
diff --git a/src/main/scala/xyz/driver/pdsuicommon/db/QueryBuilder.scala b/src/main/scala/xyz/driver/pdsuicommon/db/QueryBuilder.scala
deleted file mode 100644
index 0bf1ed6..0000000
--- a/src/main/scala/xyz/driver/pdsuicommon/db/QueryBuilder.scala
+++ /dev/null
@@ -1,340 +0,0 @@
-package xyz.driver.pdsuicommon.db
-
-import java.sql.PreparedStatement
-import java.time.LocalDateTime
-
-import io.getquill.NamingStrategy
-import io.getquill.context.sql.idiom.SqlIdiom
-import xyz.driver.pdsuicommon.db.Sorting.{Dimension, Sequential}
-import xyz.driver.pdsuicommon.db.SortingOrder.{Ascending, Descending}
-
-import scala.collection.mutable.ListBuffer
-
-object QueryBuilder {
-
- type Runner[T] = QueryBuilderParameters => Seq[T]
-
- type CountResult = (Int, Option[LocalDateTime])
-
- type CountRunner = QueryBuilderParameters => CountResult
-
- /**
- * Binder for PreparedStatement
- */
- type Binder = PreparedStatement => PreparedStatement
-
- final case class TableData(tableName: String,
- lastUpdateFieldName: Option[String] = None,
- nullableFields: Set[String] = Set.empty)
-
- val AllFields = Set("*")
-
-}
-
-final case class TableLink(keyColumnName: String, foreignTableName: String, foreignKeyColumnName: String)
-
-object QueryBuilderParameters {
- val AllFields = Set("*")
-}
-
-sealed trait QueryBuilderParameters {
-
- def tableData: QueryBuilder.TableData
- def links: Map[String, TableLink]
- def filter: SearchFilterExpr
- def sorting: Sorting
- def pagination: Option[Pagination]
-
- def findLink(tableName: String): TableLink = links.get(tableName) match {
- case None => throw new IllegalArgumentException(s"Cannot find a link for `$tableName`")
- case Some(link) => link
- }
-
- def toSql(countQuery: Boolean = false, namingStrategy: NamingStrategy): (String, QueryBuilder.Binder) = {
- toSql(countQuery, QueryBuilderParameters.AllFields, namingStrategy)
- }
-
- def toSql(countQuery: Boolean, fields: Set[String], namingStrategy: NamingStrategy): (String, QueryBuilder.Binder) = {
- val escapedTableName = namingStrategy.table(tableData.tableName)
- val fieldsSql: String = if (countQuery) {
- val suffix: String = tableData.lastUpdateFieldName match {
- case Some(lastUpdateField) => s", max($escapedTableName.${namingStrategy.column(lastUpdateField)})"
- case None => ""
- }
- "count(*)" + suffix
- } else {
- if (fields == QueryBuilderParameters.AllFields) {
- s"$escapedTableName.*"
- } else {
- fields
- .map { field =>
- s"$escapedTableName.${namingStrategy.column(field)}"
- }
- .mkString(", ")
- }
- }
- val (where, bindings) = filterToSql(escapedTableName, filter, namingStrategy)
- val orderBy = sortingToSql(escapedTableName, sorting, namingStrategy)
-
- val limitSql = limitToSql()
-
- val sql = new StringBuilder()
- sql.append("select ")
- sql.append(fieldsSql)
- sql.append("\nfrom ")
- sql.append(escapedTableName)
-
- val filtersTableLinks: Seq[TableLink] = {
- import SearchFilterExpr._
- def aux(expr: SearchFilterExpr): Seq[TableLink] = expr match {
- case Atom.TableName(tableName) => List(findLink(tableName))
- case Intersection(xs) => xs.flatMap(aux)
- case Union(xs) => xs.flatMap(aux)
- case _ => Nil
- }
- aux(filter)
- }
-
- val sortingTableLinks: Seq[TableLink] = Sorting.collect(sorting) {
- case Dimension(Some(foreignTableName), _, _) => findLink(foreignTableName)
- }
-
- // Combine links from sorting and filter without duplicates
- val foreignTableLinks = (filtersTableLinks ++ sortingTableLinks).distinct
-
- foreignTableLinks.foreach {
- case TableLink(keyColumnName, foreignTableName, foreignKeyColumnName) =>
- val escapedForeignTableName = namingStrategy.table(foreignTableName)
-
- sql.append("\ninner join ")
- sql.append(escapedForeignTableName)
- sql.append(" on ")
-
- sql.append(escapedTableName)
- sql.append('.')
- sql.append(namingStrategy.column(keyColumnName))
-
- sql.append(" = ")
-
- sql.append(escapedForeignTableName)
- sql.append('.')
- sql.append(namingStrategy.column(foreignKeyColumnName))
- }
-
- if (where.nonEmpty) {
- sql.append("\nwhere ")
- sql.append(where)
- }
-
- if (orderBy.nonEmpty && !countQuery) {
- sql.append("\norder by ")
- sql.append(orderBy)
- }
-
- if (limitSql.nonEmpty && !countQuery) {
- sql.append("\n")
- sql.append(limitSql)
- }
-
- (sql.toString, binder(bindings))
- }
-
- /**
- * Converts filter expression to SQL expression.
- *
- * @return Returns SQL string and list of values for binding in prepared statement.
- */
- protected def filterToSql(escapedTableName: String,
- filter: SearchFilterExpr,
- namingStrategy: NamingStrategy): (String, List[AnyRef]) = {
- import SearchFilterBinaryOperation._
- import SearchFilterExpr._
-
- def isNull(string: AnyRef) = Option(string).isEmpty || string.toString.toLowerCase == "null"
-
- def placeholder(field: String) = "?"
-
- def escapeDimension(dimension: SearchFilterExpr.Dimension) = {
- val tableName = dimension.tableName.fold(escapedTableName)(namingStrategy.table)
- s"$tableName.${namingStrategy.column(dimension.name)}"
- }
-
- def filterToSqlMultiple(operands: Seq[SearchFilterExpr]) = operands.collect {
- case x if !SearchFilterExpr.isEmpty(x) => filterToSql(escapedTableName, x, namingStrategy)
- }
-
- filter match {
- case x if isEmpty(x) =>
- ("", List.empty)
-
- case AllowAll =>
- ("1", List.empty)
-
- case DenyAll =>
- ("0", List.empty)
-
- case Atom.Binary(dimension, Eq, value) if isNull(value) =>
- (s"${escapeDimension(dimension)} is NULL", List.empty)
-
- case Atom.Binary(dimension, NotEq, value) if isNull(value) =>
- (s"${escapeDimension(dimension)} is not NULL", List.empty)
-
- case Atom.Binary(dimension, NotEq, value) if tableData.nullableFields.contains(dimension.name) =>
- // In MySQL NULL <> Any === NULL
- // So, to handle NotEq for nullable fields we need to use more complex SQL expression.
- // http://dev.mysql.com/doc/refman/5.7/en/working-with-null.html
- val escapedColumn = escapeDimension(dimension)
- val sql = s"($escapedColumn is null or $escapedColumn != ${placeholder(dimension.name)})"
- (sql, List(value))
-
- case Atom.Binary(dimension, op, value) =>
- val operator = op match {
- case Eq => "="
- case NotEq => "!="
- case Like => "like"
- case Gt => ">"
- case GtEq => ">="
- case Lt => "<"
- case LtEq => "<="
- }
- (s"${escapeDimension(dimension)} $operator ${placeholder(dimension.name)}", List(value))
-
- case Atom.NAry(dimension, op, values) =>
- val sqlOp = op match {
- case SearchFilterNAryOperation.In => "in"
- case SearchFilterNAryOperation.NotIn => "not in"
- }
-
- val bindings = ListBuffer[AnyRef]()
- val sqlPlaceholder = placeholder(dimension.name)
- val formattedValues = if (values.nonEmpty) {
- values
- .map { value =>
- bindings += value
- sqlPlaceholder
- }
- .mkString(", ")
- } else "NULL"
- (s"${escapeDimension(dimension)} $sqlOp ($formattedValues)", bindings.toList)
-
- case Intersection(operands) =>
- val (sql, bindings) = filterToSqlMultiple(operands).unzip
- (sql.mkString("(", " and ", ")"), bindings.flatten.toList)
-
- case Union(operands) =>
- val (sql, bindings) = filterToSqlMultiple(operands).unzip
- (sql.mkString("(", " or ", ")"), bindings.flatten.toList)
- }
- }
-
- protected def limitToSql(): String
-
- /**
- * @param escapedMainTableName Should be escaped
- */
- protected def sortingToSql(escapedMainTableName: String, sorting: Sorting, namingStrategy: NamingStrategy): String = {
- sorting match {
- case Dimension(optSortingTableName, field, order) =>
- val sortingTableName = optSortingTableName.map(namingStrategy.table).getOrElse(escapedMainTableName)
- val fullName = s"$sortingTableName.${namingStrategy.column(field)}"
-
- s"$fullName ${orderToSql(order)}"
-
- case Sequential(xs) =>
- xs.map(sortingToSql(escapedMainTableName, _, namingStrategy)).mkString(", ")
- }
- }
-
- protected def orderToSql(x: SortingOrder): String = x match {
- case Ascending => "asc"
- case Descending => "desc"
- }
-
- protected def binder(bindings: List[AnyRef])(bind: PreparedStatement): PreparedStatement = {
- bindings.zipWithIndex.foreach {
- case (binding, index) =>
- bind.setObject(index + 1, binding)
- }
-
- bind
- }
-
-}
-
-final case class PostgresQueryBuilderParameters(tableData: QueryBuilder.TableData,
- links: Map[String, TableLink] = Map.empty,
- filter: SearchFilterExpr = SearchFilterExpr.Empty,
- sorting: Sorting = Sorting.Empty,
- pagination: Option[Pagination] = None)
- extends QueryBuilderParameters {
-
- def limitToSql(): String = {
- pagination.map { pagination =>
- val startFrom = (pagination.pageNumber - 1) * pagination.pageSize
- s"limit ${pagination.pageSize} OFFSET $startFrom"
- } getOrElse ""
- }
-
-}
-
-/**
- * @param links Links to another tables grouped by foreignTableName
- */
-final case class MysqlQueryBuilderParameters(tableData: QueryBuilder.TableData,
- links: Map[String, TableLink] = Map.empty,
- filter: SearchFilterExpr = SearchFilterExpr.Empty,
- sorting: Sorting = Sorting.Empty,
- pagination: Option[Pagination] = None)
- extends QueryBuilderParameters {
-
- def limitToSql(): String =
- pagination
- .map { pagination =>
- val startFrom = (pagination.pageNumber - 1) * pagination.pageSize
- s"limit $startFrom, ${pagination.pageSize}"
- }
- .getOrElse("")
-
-}
-
-abstract class QueryBuilder[T, D <: SqlIdiom, N <: NamingStrategy](val parameters: QueryBuilderParameters)(
- implicit runner: QueryBuilder.Runner[T],
- countRunner: QueryBuilder.CountRunner) {
-
- def run: Seq[T] = runner(parameters)
-
- def runCount: QueryBuilder.CountResult = countRunner(parameters)
-
- /**
- * Runs the query and returns total found rows without considering of pagination.
- */
- def runWithCount: (Seq[T], Int, Option[LocalDateTime]) = {
- val (total, lastUpdate) = runCount
- (run, total, lastUpdate)
- }
-
- def withFilter(newFilter: SearchFilterExpr): QueryBuilder[T, D, N]
-
- def withFilter(filter: Option[SearchFilterExpr]): QueryBuilder[T, D, N] = {
- filter.fold(this)(withFilter)
- }
-
- def resetFilter: QueryBuilder[T, D, N] = withFilter(SearchFilterExpr.Empty)
-
- def withSorting(newSorting: Sorting): QueryBuilder[T, D, N]
-
- def withSorting(sorting: Option[Sorting]): QueryBuilder[T, D, N] = {
- sorting.fold(this)(withSorting)
- }
-
- def resetSorting: QueryBuilder[T, D, N] = withSorting(Sorting.Empty)
-
- def withPagination(newPagination: Pagination): QueryBuilder[T, D, N]
-
- def withPagination(pagination: Option[Pagination]): QueryBuilder[T, D, N] = {
- pagination.fold(this)(withPagination)
- }
-
- def resetPagination: QueryBuilder[T, D, N]
-
-}
diff --git a/src/main/scala/xyz/driver/pdsuicommon/db/SlickQueryBuilder.scala b/src/main/scala/xyz/driver/pdsuicommon/db/SlickQueryBuilder.scala
index 3011f6a..9962edf 100644
--- a/src/main/scala/xyz/driver/pdsuicommon/db/SlickQueryBuilder.scala
+++ b/src/main/scala/xyz/driver/pdsuicommon/db/SlickQueryBuilder.scala
@@ -83,7 +83,7 @@ sealed trait SlickQueryBuilderParameters {
}
def toSql(countQuery: Boolean = false)(implicit profile: JdbcProfile): SQLActionBuilder = {
- toSql(countQuery, QueryBuilderParameters.AllFields)
+ toSql(countQuery, SlickQueryBuilderParameters.AllFields)
}
def toSql(countQuery: Boolean, fields: Set[String])(implicit profile: JdbcProfile): SQLActionBuilder = {
diff --git a/src/main/scala/xyz/driver/pdsuicommon/db/repositories/BridgeUploadQueueRepository.scala b/src/main/scala/xyz/driver/pdsuicommon/db/repositories/BridgeUploadQueueRepository.scala
deleted file mode 100644
index 4c25afa..0000000
--- a/src/main/scala/xyz/driver/pdsuicommon/db/repositories/BridgeUploadQueueRepository.scala
+++ /dev/null
@@ -1,21 +0,0 @@
-package xyz.driver.pdsuicommon.db.repositories
-
-import xyz.driver.pdsuicommon.concurrent.BridgeUploadQueue
-import xyz.driver.pdsuicommon.db.MysqlQueryBuilder
-
-trait BridgeUploadQueueRepository extends Repository {
-
- type EntityT = BridgeUploadQueue.Item
-
- def add(draft: EntityT): EntityT
-
- def getById(kind: String, tag: String): Option[EntityT]
-
- def getOne(kind: String): Option[BridgeUploadQueue.Item]
-
- def update(entity: EntityT): EntityT
-
- def delete(kind: String, tag: String): Unit
-
- def buildQuery: MysqlQueryBuilder[EntityT]
-}
diff --git a/src/main/scala/xyz/driver/pdsuicommon/db/repositories/Repository.scala b/src/main/scala/xyz/driver/pdsuicommon/db/repositories/Repository.scala
index d671e80..e62238e 100644
--- a/src/main/scala/xyz/driver/pdsuicommon/db/repositories/Repository.scala
+++ b/src/main/scala/xyz/driver/pdsuicommon/db/repositories/Repository.scala
@@ -1,4 +1,3 @@
package xyz.driver.pdsuicommon.db.repositories
-// For further usage and migration to Postgres and slick
trait Repository extends RepositoryLogging
diff --git a/src/main/scala/xyz/driver/pdsuicommon/error/ErrorCode.scala b/src/main/scala/xyz/driver/pdsuicommon/error/ErrorCode.scala
index 5574c01..748e76a 100644
--- a/src/main/scala/xyz/driver/pdsuicommon/error/ErrorCode.scala
+++ b/src/main/scala/xyz/driver/pdsuicommon/error/ErrorCode.scala
@@ -1,7 +1,6 @@
package xyz.driver.pdsuicommon.error
-import play.api.libs.functional.syntax._
-import play.api.libs.json.{Format, Reads, Writes}
+import xyz.driver.core.json.EnumJsonFormat
@SuppressWarnings(Array("org.wartremover.warts.Enumeration"))
object ErrorCode extends Enumeration {
@@ -9,9 +8,13 @@ object ErrorCode extends Enumeration {
type ErrorCode = Value
val Unspecified = Value(1)
- private val fromJsonReads: Reads[ErrorCode] = Reads.of[Int].map(ErrorCode.apply)
- private val toJsonWrites: Writes[ErrorCode] = Writes.of[Int].contramap(_.id)
-
- implicit val jsonFormat: Format[ErrorCode] = Format(fromJsonReads, toJsonWrites)
+ implicit val jsonFormat = new EnumJsonFormat[ErrorCode](
+ "200" -> ErrorCode.Value(200),
+ "400" -> ErrorCode.Value(400),
+ "401" -> ErrorCode.Value(401),
+ "403" -> ErrorCode.Value(403),
+ "404" -> ErrorCode.Value(404),
+ "500" -> ErrorCode.Value(500)
+ )
}
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)
}
}
diff --git a/src/main/scala/xyz/driver/pdsuicommon/http/Directives.scala b/src/main/scala/xyz/driver/pdsuicommon/http/Directives.scala
index d7d3df5..4f5cd8a 100644
--- a/src/main/scala/xyz/driver/pdsuicommon/http/Directives.scala
+++ b/src/main/scala/xyz/driver/pdsuicommon/http/Directives.scala
@@ -13,9 +13,8 @@ import xyz.driver.pdsuicommon.error.ErrorsResponse.ResponseError
import xyz.driver.pdsuicommon.parsers._
import xyz.driver.pdsuicommon.db.{Pagination, SearchFilterExpr, Sorting}
import xyz.driver.pdsuicommon.domain._
-import xyz.driver.pdsuicommon.serialization.PlayJsonSupport._
+import akka.http.scaladsl.marshallers.sprayjson.SprayJsonSupport._
import xyz.driver.core.rest.auth.AuthProvider
-
import scala.util.control._
import scala.util._
@@ -72,7 +71,7 @@ trait Directives {
def domainExceptionHandler(req: RequestId): ExceptionHandler = {
def errorResponse(ex: Throwable) =
- ErrorsResponse(Seq(ResponseError(None, ex.getMessage, ErrorCode.Unspecified)), req)
+ 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))
@@ -84,9 +83,9 @@ trait Directives {
def domainRejectionHandler(req: RequestId): RejectionHandler = {
def wrapContent(message: String) = {
- import play.api.libs.json._
- val err = ErrorsResponse(Seq(ResponseError(None, message, ErrorCode.Unspecified)), req)
- val text = Json.stringify(implicitly[Writes[ErrorsResponse]].writes(err))
+ import ErrorsResponse._
+ val err: ErrorsResponse = ErrorsResponse(Seq(ResponseError(None, message, 1)), req)
+ val text = errorsResponseJsonFormat.write(err).toString()
HttpEntity(ContentTypes.`application/json`, text)
}
DriverApp.rejectionHandler.mapRejectionResponse {
diff --git a/src/main/scala/xyz/driver/pdsuicommon/json/JsResultOps.scala b/src/main/scala/xyz/driver/pdsuicommon/json/JsResultOps.scala
deleted file mode 100644
index 4ff4034..0000000
--- a/src/main/scala/xyz/driver/pdsuicommon/json/JsResultOps.scala
+++ /dev/null
@@ -1,15 +0,0 @@
-package xyz.driver.pdsuicommon.json
-
-import play.api.libs.json.JsResult
-
-import scala.util.{Failure, Success, Try}
-
-final class JsResultOps[T](val self: JsResult[T]) extends AnyVal {
-
- def toTry: Try[T] = {
- self.fold[Try[T]](
- errors => Failure(new JsonValidationException(errors)),
- Success(_)
- )
- }
-}
diff --git a/src/main/scala/xyz/driver/pdsuicommon/json/JsonValidationException.scala b/src/main/scala/xyz/driver/pdsuicommon/json/JsonValidationException.scala
deleted file mode 100644
index 21750b4..0000000
--- a/src/main/scala/xyz/driver/pdsuicommon/json/JsonValidationException.scala
+++ /dev/null
@@ -1,5 +0,0 @@
-package xyz.driver.pdsuicommon.json
-
-import xyz.driver.pdsuicommon.validation.JsonValidationErrors
-
-class JsonValidationException(val errors: JsonValidationErrors) extends Exception
diff --git a/src/main/scala/xyz/driver/pdsuicommon/json/Serialization.scala b/src/main/scala/xyz/driver/pdsuicommon/json/Serialization.scala
deleted file mode 100644
index 8231ddb..0000000
--- a/src/main/scala/xyz/driver/pdsuicommon/json/Serialization.scala
+++ /dev/null
@@ -1,46 +0,0 @@
-package xyz.driver.pdsuicommon.json
-
-import java.net.URI
-
-import play.api.libs.functional.syntax._
-import play.api.libs.json._
-import xyz.driver.pdsuicommon.domain._
-import xyz.driver.pdsuidomain.entities.CaseId
-
-object Serialization {
-
- // @TODO Test and check all items in an array
- private def seqJsonReads[T](implicit argFormat: Reads[T]): Reads[Seq[T]] = Reads {
- case JsArray(xs) =>
- JsSuccess(xs.map { x =>
- argFormat.reads(x).get
- })
- case x => JsError(s"Expected JsArray, but got $x")
- }
-
- private def seqJsonWrites[T](implicit argFormat: Writes[T]): Writes[Seq[T]] = Writes { xs =>
- JsArray(xs.map(argFormat.writes))
- }
-
- implicit def seqJsonFormat[T](implicit f: Format[T]): Format[Seq[T]] = Format(seqJsonReads[T], seqJsonWrites[T])
-
- private val uriJsonReads: Reads[URI] = Reads.StringReads.map(URI.create)
- private val uriJsonWrites: Writes[URI] = Writes(uri => JsString(uri.toString))
- implicit val uriJsonFormat: Format[URI] = Format(uriJsonReads, uriJsonWrites)
-
- private def uuidIdJsonReads[T]: Reads[UuidId[T]] = Reads.uuidReads.map(x => UuidId[T](x))
- private def uuidIdJsonWrites[T]: Writes[UuidId[T]] = Writes.UuidWrites.contramap(_.id)
- implicit def uuidIdJsonFormat[T]: Format[UuidId[T]] = Format(uuidIdJsonReads, uuidIdJsonWrites)
-
- private def longIdJsonReads[T]: Reads[LongId[T]] = Reads.LongReads.map(x => LongId[T](x))
- private def longIdJsonWrites[T]: Writes[LongId[T]] = Writes.LongWrites.contramap(_.id)
- implicit def longIdJsonFormat[T]: Format[LongId[T]] = Format(longIdJsonReads, longIdJsonWrites)
-
- private val emailJsonReads: Reads[Email] = Reads.email.map(Email.apply)
- private val emailJsonWrites: Writes[Email] = Writes(email => JsString(email.value))
- implicit val emailJsonFormat: Format[Email] = Format(emailJsonReads, emailJsonWrites)
-
- private val caseIdJsonReads: Reads[CaseId] = Reads.StringReads.map(CaseId(_))
- private val caseIdJsonWrites: Writes[CaseId] = Writes(caseId => JsString(caseId.id))
- implicit val caseIdJsonFormat: Format[CaseId] = Format(caseIdJsonReads, caseIdJsonWrites)
-}
diff --git a/src/main/scala/xyz/driver/pdsuicommon/serialization/PlayJsonSupport.scala b/src/main/scala/xyz/driver/pdsuicommon/serialization/PlayJsonSupport.scala
deleted file mode 100644
index 5158dab..0000000
--- a/src/main/scala/xyz/driver/pdsuicommon/serialization/PlayJsonSupport.scala
+++ /dev/null
@@ -1,34 +0,0 @@
-package xyz.driver.pdsuicommon.serialization
-
-import akka.http.scaladsl.server.{RejectionError, ValidationRejection}
-import akka.http.scaladsl.unmarshalling.Unmarshaller
-import play.api.libs.json.{Reads, Writes}
-import play.api.libs.json.Json
-import akka.http.scaladsl.marshalling.ToEntityMarshaller
-import akka.http.scaladsl.unmarshalling.FromEntityUnmarshaller
-import akka.http.scaladsl.model.MediaTypes.`application/json`
-
-trait PlayJsonSupport {
- import akka.http.scaladsl.marshalling.Marshaller
-
- implicit def playJsonUnmarshaller[A: Reads]: FromEntityUnmarshaller[A] = {
- val reads = implicitly[Reads[A]]
- Unmarshaller.stringUnmarshaller
- .forContentTypes(`application/json`)
- .map(Json.parse)
- .map(reads.reads)
- .map(_.recoverTotal { error =>
- throw RejectionError(ValidationRejection(s"Error reading JSON response as ${reads}."))
- })
- }
-
- implicit def playJsonMarshaller[A: Writes]: ToEntityMarshaller[A] = {
- Marshaller
- .stringMarshaller(`application/json`)
- .compose(Json.prettyPrint)
- .compose(implicitly[Writes[A]].writes)
- }
-
-}
-
-object PlayJsonSupport extends PlayJsonSupport
diff --git a/src/main/scala/xyz/driver/pdsuicommon/utils/CustomSwaggerJsonFormats.scala b/src/main/scala/xyz/driver/pdsuicommon/utils/CustomSwaggerJsonFormats.scala
index 34c7495..a79071e 100644
--- a/src/main/scala/xyz/driver/pdsuicommon/utils/CustomSwaggerJsonFormats.scala
+++ b/src/main/scala/xyz/driver/pdsuicommon/utils/CustomSwaggerJsonFormats.scala
@@ -6,16 +6,16 @@ import io.swagger.models.properties.Property
import spray.json.JsValue
import xyz.driver.pdsuicommon.domain.{LongId, StringId, UuidId}
import xyz.driver.pdsuidomain.entities._
-import xyz.driver.pdsuidomain.formats.json.sprayformats.listresponse._
+import xyz.driver.pdsuidomain.formats.json.listresponse._
import xyz.driver.core.swagger.CustomSwaggerJsonConverter._
import xyz.driver.entities.patient.CancerType
import xyz.driver.pdsuicommon.concurrent.BridgeUploadQueue
import xyz.driver.pdsuidomain.entities.export.patient.ExportPatientWithLabels
import xyz.driver.pdsuidomain.entities.export.trial.ExportTrialWithLabels
import xyz.driver.pdsuidomain.fakes.entities.common
-import xyz.driver.pdsuidomain.formats.json.sprayformats.bridgeuploadqueue._
-import xyz.driver.pdsuidomain.formats.json.sprayformats.record._
-import xyz.driver.pdsuidomain.formats.json.sprayformats.document._
+import xyz.driver.pdsuidomain.formats.json.bridgeuploadqueue._
+import xyz.driver.pdsuidomain.formats.json.record._
+import xyz.driver.pdsuidomain.formats.json.document._
import xyz.driver.pdsuidomain.services.CriterionService.RichCriterion
import xyz.driver.pdsuidomain.services.ExtractedDataService.RichExtractedData
import xyz.driver.pdsuidomain.services.PatientCriterionService.{DraftPatientCriterion, RichPatientCriterion}
@@ -83,17 +83,17 @@ object CustomSwaggerJsonFormats {
object trialcuration {
import xyz.driver.pdsuidomain.fakes.entities.trialcuration._
import xyz.driver.pdsuidomain.fakes.entities.export
- import xyz.driver.pdsuidomain.formats.json.sprayformats.export._
- import xyz.driver.pdsuidomain.formats.json.sprayformats.arm._
- import xyz.driver.pdsuidomain.formats.json.sprayformats.slotarm._
- import xyz.driver.pdsuidomain.formats.json.sprayformats.eligibilityarm._
- import xyz.driver.pdsuidomain.formats.json.sprayformats.criterion._
- import xyz.driver.pdsuidomain.formats.json.sprayformats.intervention._
- import xyz.driver.pdsuidomain.formats.json.sprayformats.hypothesis._
- import xyz.driver.pdsuidomain.formats.json.sprayformats.studydesign._
- import xyz.driver.pdsuidomain.formats.json.sprayformats.trial._
- import xyz.driver.pdsuidomain.formats.json.sprayformats.trialhistory._
- import xyz.driver.pdsuidomain.formats.json.sprayformats.trialissue._
+ import xyz.driver.pdsuidomain.formats.json.export._
+ import xyz.driver.pdsuidomain.formats.json.arm._
+ import xyz.driver.pdsuidomain.formats.json.slotarm._
+ import xyz.driver.pdsuidomain.formats.json.eligibilityarm._
+ import xyz.driver.pdsuidomain.formats.json.criterion._
+ import xyz.driver.pdsuidomain.formats.json.intervention._
+ import xyz.driver.pdsuidomain.formats.json.hypothesis._
+ import xyz.driver.pdsuidomain.formats.json.studydesign._
+ import xyz.driver.pdsuidomain.formats.json.trial._
+ import xyz.driver.pdsuidomain.formats.json.trialhistory._
+ import xyz.driver.pdsuidomain.formats.json.trialissue._
val customTrialCurationProperties = immutable.Map[Class[_], Property](
classOf[Trial.Status] -> stringProperty(),
@@ -102,7 +102,7 @@ object CustomSwaggerJsonFormats {
) ++ customCommonProperties
val customTrialCurationObjectsExamples = immutable.Map[Class[_], JsValue](
- classOf[Trial] -> trialWriter.write(nextTrial()),
+ classOf[Trial] -> trialFormat.write(nextTrial()),
classOf[Arm] -> armFormat.write(nextArm()),
classOf[TrialHistory] -> trialHistoryFormat.write(nextTrialHistory()),
classOf[TrialIssue] -> trialIssueWriter.write(nextTrialIssue()),
@@ -134,12 +134,12 @@ object CustomSwaggerJsonFormats {
object recordprocessing {
import xyz.driver.pdsuidomain.fakes.entities.recordprocessing._
import xyz.driver.pdsuidomain.fakes.entities.export
- import xyz.driver.pdsuidomain.formats.json.sprayformats.export._
- import xyz.driver.pdsuidomain.formats.json.sprayformats.documentissue._
- import xyz.driver.pdsuidomain.formats.json.sprayformats.documenthistory._
- import xyz.driver.pdsuidomain.formats.json.sprayformats.recordissue._
- import xyz.driver.pdsuidomain.formats.json.sprayformats.recordhistory._
- import xyz.driver.pdsuidomain.formats.json.sprayformats.extracteddata._
+ import xyz.driver.pdsuidomain.formats.json.export._
+ import xyz.driver.pdsuidomain.formats.json.documentissue._
+ import xyz.driver.pdsuidomain.formats.json.documenthistory._
+ import xyz.driver.pdsuidomain.formats.json.recordissue._
+ import xyz.driver.pdsuidomain.formats.json.recordhistory._
+ import xyz.driver.pdsuidomain.formats.json.extracteddata._
val customRecordProcessingProperties = immutable.Map[Class[_], Property](
classOf[MedicalRecord.Status] -> stringProperty(),
@@ -176,14 +176,14 @@ object CustomSwaggerJsonFormats {
object treatmentmatching {
import xyz.driver.pdsuidomain.fakes.entities.treatmentmatching._
- import xyz.driver.pdsuidomain.formats.json.sprayformats.patient._
- import xyz.driver.pdsuidomain.formats.json.sprayformats.patientcriterion._
- import xyz.driver.pdsuidomain.formats.json.sprayformats.patientdefiningcriteria._
- import xyz.driver.pdsuidomain.formats.json.sprayformats.patienteligibletrial._
- import xyz.driver.pdsuidomain.formats.json.sprayformats.patientlabel._
- import xyz.driver.pdsuidomain.formats.json.sprayformats.patienthypothesis._
- import xyz.driver.pdsuidomain.formats.json.sprayformats.patienthistory._
- import xyz.driver.pdsuidomain.formats.json.sprayformats.patientissue._
+ import xyz.driver.pdsuidomain.formats.json.patient._
+ import xyz.driver.pdsuidomain.formats.json.patientcriterion._
+ import xyz.driver.pdsuidomain.formats.json.patientdefiningcriteria._
+ import xyz.driver.pdsuidomain.formats.json.patienteligibletrial._
+ import xyz.driver.pdsuidomain.formats.json.patientlabel._
+ import xyz.driver.pdsuidomain.formats.json.patienthypothesis._
+ import xyz.driver.pdsuidomain.formats.json.patienthistory._
+ import xyz.driver.pdsuidomain.formats.json.patientissue._
val customTreatmentMatchingProperties = immutable.Map[Class[_], Property](
classOf[Patient.Status] -> stringProperty(),
@@ -192,7 +192,7 @@ object CustomSwaggerJsonFormats {
) ++ customCommonProperties
val customTreatmentMatchingObjectsExamples = immutable.Map[Class[_], JsValue](
- classOf[Patient] -> patientWriter.write(nextPatient()),
+ classOf[Patient] -> patientFormat.write(nextPatient()),
classOf[RichPatientLabel] -> richPatientLabelWriter.write(nextRichPatientLabel()),
classOf[PatientLabel] -> patientLabelDefiningCriteriaWriter.write(nextPatientLabel()),
classOf[RichPatientCriterion] -> patientCriterionWriter.write(nextRichPatientCriterion()),
diff --git a/src/main/scala/xyz/driver/pdsuicommon/utils/Implicits.scala b/src/main/scala/xyz/driver/pdsuicommon/utils/Implicits.scala
index 9411beb..0b18093 100644
--- a/src/main/scala/xyz/driver/pdsuicommon/utils/Implicits.scala
+++ b/src/main/scala/xyz/driver/pdsuicommon/utils/Implicits.scala
@@ -1,8 +1,5 @@
package xyz.driver.pdsuicommon.utils
-import play.api.libs.json.JsResult
-import xyz.driver.pdsuicommon.json.JsResultOps
-
import scala.collection.generic.CanBuildFrom
object Implicits {
@@ -23,7 +20,6 @@ object Implicits {
implicit def toMapOps[K, V](x: Map[K, V]): MapOps[K, V] = new MapOps(x)
- implicit def toCharOps(self: Char): CharOps = new CharOps(self)
- implicit def toStringOps(self: String): StringOps = new StringOps(self)
- implicit def toJsResultOps[T](self: JsResult[T]): JsResultOps[T] = new JsResultOps(self)
+ implicit def toCharOps(self: Char): CharOps = new CharOps(self)
+ implicit def toStringOps(self: String): StringOps = new StringOps(self)
}
diff --git a/src/main/scala/xyz/driver/pdsuicommon/utils/WriteableImplicits.scala b/src/main/scala/xyz/driver/pdsuicommon/utils/WriteableImplicits.scala
deleted file mode 100644
index 6c04dfa..0000000
--- a/src/main/scala/xyz/driver/pdsuicommon/utils/WriteableImplicits.scala
+++ /dev/null
@@ -1,17 +0,0 @@
-package xyz.driver.pdsuicommon.utils
-
-import play.api.http.{ContentTypes, Writeable}
-import play.api.libs.json.{Json, Writes}
-
-// @TODO this should be an object with a method, that gets HTTP-headers and returns suitable Writeable
-trait WriteableImplicits {
-
- // Write JSON by default at now
- implicit def defaultWriteable[T](implicit inner: Writes[T]) = Writeable[T](
- { x: T =>
- Writeable.writeableOf_JsValue.transform(Json.toJson(x))
- },
- Option(ContentTypes.JSON)
- )
-
-}
diff --git a/src/main/scala/xyz/driver/pdsuicommon/utils/WritesUtils.scala b/src/main/scala/xyz/driver/pdsuicommon/utils/WritesUtils.scala
deleted file mode 100644
index 3476a1e..0000000
--- a/src/main/scala/xyz/driver/pdsuicommon/utils/WritesUtils.scala
+++ /dev/null
@@ -1,21 +0,0 @@
-package xyz.driver.pdsuicommon.utils
-
-import play.api.libs.json._
-
-object WritesUtils {
-
- def filterKeys[T](p: String => Boolean)(implicit w: Writes[T]): Writes[T] = {
- filter {
- case (key, _) => p(key)
- }
- }
-
- def filter[T](p: (String, JsValue) => Boolean)(implicit w: Writes[T]): Writes[T] = {
- w.transform { input: JsValue =>
- input match {
- case JsObject(map) => JsObject(map.filter(Function.tupled(p)))
- case x => x
- }
- }
- }
-}
diff --git a/src/main/scala/xyz/driver/pdsuicommon/validation/AdditionalConstraints.scala b/src/main/scala/xyz/driver/pdsuicommon/validation/AdditionalConstraints.scala
deleted file mode 100644
index cb1082f..0000000
--- a/src/main/scala/xyz/driver/pdsuicommon/validation/AdditionalConstraints.scala
+++ /dev/null
@@ -1,33 +0,0 @@
-package xyz.driver.pdsuicommon.validation
-
-import org.davidbild.tristate.Tristate
-import play.api.data.validation._
-
-object AdditionalConstraints {
-
- val nonNegativePrintedNumber: Constraint[String] = {
- Constraints.pattern("^\\d+$".r, "printedInt.nonNegative", "must be a non-negative number")
- }
-
- val positivePrintedNumber: Constraint[String] = {
- Constraints.pattern("^[1-9]\\d*$".r, "printedInt.positive", "must be a positive number")
- }
-
- val optionNonEmptyConstraint: Constraint[Option[Any]] = {
- Constraint("option.nonEmpty") {
- case Some(x) => Valid
- case None => Invalid("is empty")
- }
- }
-
- val tristateSpecifiedConstraint: Constraint[Tristate[Any]] = {
- Constraint("tristate.specified") {
- case Tristate.Unspecified => Invalid("unspecified")
- case _ => Valid
- }
- }
-
- val uuid: Constraint[String] = {
- Constraints.pattern("""[\da-z]{8}-[\da-z]{4}-[\da-z]{4}-[\da-z]{4}-[\da-z]{12}""".r, "uuid", "invalid uuid")
- }
-}
diff --git a/src/main/scala/xyz/driver/pdsuicommon/validation/package.scala b/src/main/scala/xyz/driver/pdsuicommon/validation/package.scala
deleted file mode 100644
index 9a31a93..0000000
--- a/src/main/scala/xyz/driver/pdsuicommon/validation/package.scala
+++ /dev/null
@@ -1,8 +0,0 @@
-package xyz.driver.pdsuicommon
-
-import play.api.data.validation.{ValidationError => PlayValidationError}
-import play.api.libs.json.JsPath
-
-package object validation {
- type JsonValidationErrors = Seq[(JsPath, Seq[PlayValidationError])]
-}
diff --git a/src/main/scala/xyz/driver/pdsuidomain/fakes/entities/treatmentmatching.scala b/src/main/scala/xyz/driver/pdsuidomain/fakes/entities/treatmentmatching.scala
index 36ef3d9..94c41ff 100644
--- a/src/main/scala/xyz/driver/pdsuidomain/fakes/entities/treatmentmatching.scala
+++ b/src/main/scala/xyz/driver/pdsuidomain/fakes/entities/treatmentmatching.scala
@@ -17,7 +17,7 @@ object treatmentmatching {
final case class DraftPatientCriterionList(list: List[DraftPatientCriterion])
object DraftPatientCriterionList {
import spray.json._
- import xyz.driver.pdsuidomain.formats.json.sprayformats.patientcriterion._
+ import xyz.driver.pdsuidomain.formats.json.patientcriterion._
implicit val draftPatientCriterionListFormat: RootJsonFormat[DraftPatientCriterionList] =
new RootJsonFormat[DraftPatientCriterionList] {
diff --git a/src/main/scala/xyz/driver/pdsuidomain/formats/json/ListResponse.scala b/src/main/scala/xyz/driver/pdsuidomain/formats/json/ListResponse.scala
deleted file mode 100644
index 3fbeac8..0000000
--- a/src/main/scala/xyz/driver/pdsuidomain/formats/json/ListResponse.scala
+++ /dev/null
@@ -1,56 +0,0 @@
-package xyz.driver.pdsuidomain.formats.json
-
-import java.time.LocalDateTime
-
-import xyz.driver.pdsuicommon.db.Pagination
-import xyz.driver.pdsuicommon.json.Serialization.seqJsonFormat
-import play.api.libs.functional.syntax._
-import play.api.libs.json._
-
-final case class ListResponse[+T](items: Seq[T], meta: ListResponse.Meta)
-
-object ListResponse {
-
- final case class Meta(itemsCount: Int, pageNumber: Int, pageSize: Int, lastUpdate: Option[LocalDateTime])
-
- object Meta {
- def apply(itemsCount: Int, pagination: Pagination, lastUpdate: Option[LocalDateTime]): Meta = {
- Meta(itemsCount, pagination.pageNumber, pagination.pageSize, lastUpdate)
- }
- }
-
- private val listResponseMetaJsonReads: Reads[Meta] = {
- ((JsPath \ "itemsCount").read[Int] and
- (JsPath \ "pageNumber").read[Int] and
- (JsPath \ "pageSize").read[Int] and
- (JsPath \ "lastUpdate").readNullable[LocalDateTime]).apply {
- (itemsCount: Int, pageNumber: Int, pageSize: Int, lastUpdate: Option[LocalDateTime]) =>
- Meta(itemsCount, pageNumber, pageSize, lastUpdate)
- }
- }
-
- implicit val listResponseMetaJsonWrites: Writes[Meta] = (
- (JsPath \ "itemsCount").write[Int] and
- (JsPath \ "pageNumber").write[Int] and
- (JsPath \ "pageSize").write[Int] and
- (JsPath \ "lastUpdate").write[Option[LocalDateTime]]
- )(unlift(Meta.unapply))
-
- implicit val listResponseMetaJsonFormat: Format[Meta] = Format(
- listResponseMetaJsonReads,
- listResponseMetaJsonWrites
- )
-
- implicit def listResponseJsonWrites[T](implicit f: Writes[T]): Writes[ListResponse[T]] =
- (
- (JsPath \ "items").write[Seq[T]] and
- (JsPath \ "meta").write[Meta]
- )(unlift(ListResponse.unapply[T]))
-
- implicit def listResponseJsonFormat[T](implicit f: Format[T]): Format[ListResponse[T]] =
- (
- (JsPath \ "items").format(seqJsonFormat[T]) and
- (JsPath \ "meta").format[Meta]
- )(ListResponse.apply[T], unlift(ListResponse.unapply[T]))
-
-}
diff --git a/src/main/scala/xyz/driver/pdsuidomain/formats/json/sprayformats/arm.scala b/src/main/scala/xyz/driver/pdsuidomain/formats/json/arm.scala
index e182b4b..0b54309 100644
--- a/src/main/scala/xyz/driver/pdsuidomain/formats/json/sprayformats/arm.scala
+++ b/src/main/scala/xyz/driver/pdsuidomain/formats/json/arm.scala
@@ -1,4 +1,4 @@
-package xyz.driver.pdsuidomain.formats.json.sprayformats
+package xyz.driver.pdsuidomain.formats.json
import spray.json._
import xyz.driver.pdsuicommon.domain.{LongId, StringId}
diff --git a/src/main/scala/xyz/driver/pdsuidomain/formats/json/arm/ApiArm.scala b/src/main/scala/xyz/driver/pdsuidomain/formats/json/arm/ApiArm.scala
deleted file mode 100644
index 32e2b54..0000000
--- a/src/main/scala/xyz/driver/pdsuidomain/formats/json/arm/ApiArm.scala
+++ /dev/null
@@ -1,35 +0,0 @@
-package xyz.driver.pdsuidomain.formats.json.arm
-
-import xyz.driver.pdsuicommon.domain.{LongId, StringId}
-import xyz.driver.pdsuidomain.entities.Arm
-import play.api.libs.functional.syntax._
-import play.api.libs.json._
-
-final case class ApiArm(id: Long, name: String, originalName: String, trialId: String) {
-
- def toDomain: Arm = Arm(
- id = LongId(this.id),
- name = this.name,
- originalName = this.originalName,
- trialId = StringId(this.trialId),
- deleted = None // if we have an ApiArm object, the Arm itself has not been deleted
- )
-
-}
-
-object ApiArm {
-
- implicit val format: Format[ApiArm] = (
- (JsPath \ "id").format[Long] and
- (JsPath \ "name").format[String] and
- (JsPath \ "originalName").format[String] and
- (JsPath \ "trialId").format[String]
- )(ApiArm.apply, unlift(ApiArm.unapply))
-
- def fromDomain(arm: Arm): ApiArm = ApiArm(
- id = arm.id.id,
- name = arm.name,
- originalName = arm.originalName,
- trialId = arm.trialId.id
- )
-}
diff --git a/src/main/scala/xyz/driver/pdsuidomain/formats/json/arm/ApiCreateArm.scala b/src/main/scala/xyz/driver/pdsuidomain/formats/json/arm/ApiCreateArm.scala
deleted file mode 100644
index 5168e94..0000000
--- a/src/main/scala/xyz/driver/pdsuidomain/formats/json/arm/ApiCreateArm.scala
+++ /dev/null
@@ -1,20 +0,0 @@
-package xyz.driver.pdsuidomain.formats.json.arm
-
-import xyz.driver.pdsuicommon.domain.{LongId, StringId}
-import xyz.driver.pdsuidomain.entities.Arm
-import play.api.libs.json.{Format, Json}
-
-final case class ApiCreateArm(name: String, trialId: String) {
-
- def toDomain = Arm(
- id = LongId(0),
- name = name,
- trialId = StringId(trialId),
- originalName = name
- )
-}
-
-object ApiCreateArm {
-
- implicit val format: Format[ApiCreateArm] = Json.format[ApiCreateArm]
-}
diff --git a/src/main/scala/xyz/driver/pdsuidomain/formats/json/arm/ApiPartialArm.scala b/src/main/scala/xyz/driver/pdsuidomain/formats/json/arm/ApiPartialArm.scala
deleted file mode 100644
index f85d7ff..0000000
--- a/src/main/scala/xyz/driver/pdsuidomain/formats/json/arm/ApiPartialArm.scala
+++ /dev/null
@@ -1,14 +0,0 @@
-package xyz.driver.pdsuidomain.formats.json.arm
-
-import xyz.driver.pdsuidomain.entities.Arm
-import play.api.libs.json.{Format, Json}
-
-final case class ApiPartialArm(name: String) {
-
- def applyTo(arm: Arm): Arm = arm.copy(name = name)
-}
-
-object ApiPartialArm {
-
- implicit val format: Format[ApiPartialArm] = Json.format
-}
diff --git a/src/main/scala/xyz/driver/pdsuidomain/formats/json/sprayformats/bridgeuploadqueue.scala b/src/main/scala/xyz/driver/pdsuidomain/formats/json/bridgeuploadqueue.scala
index 77fb4d2..6725a15 100644
--- a/src/main/scala/xyz/driver/pdsuidomain/formats/json/sprayformats/bridgeuploadqueue.scala
+++ b/src/main/scala/xyz/driver/pdsuidomain/formats/json/bridgeuploadqueue.scala
@@ -1,4 +1,4 @@
-package xyz.driver.pdsuidomain.formats.json.sprayformats
+package xyz.driver.pdsuidomain.formats.json
import java.time.LocalDateTime
diff --git a/src/main/scala/xyz/driver/pdsuidomain/formats/json/sprayformats/common.scala b/src/main/scala/xyz/driver/pdsuidomain/formats/json/common.scala
index 61e0e7f..26adb9c 100644
--- a/src/main/scala/xyz/driver/pdsuidomain/formats/json/sprayformats/common.scala
+++ b/src/main/scala/xyz/driver/pdsuidomain/formats/json/common.scala
@@ -1,4 +1,4 @@
-package xyz.driver.pdsuidomain.formats.json.sprayformats
+package xyz.driver.pdsuidomain.formats.json
import java.time.{LocalDate, LocalDateTime, ZoneId, ZonedDateTime}
diff --git a/src/main/scala/xyz/driver/pdsuidomain/formats/json/sprayformats/criterion.scala b/src/main/scala/xyz/driver/pdsuidomain/formats/json/criterion.scala
index acf952d..d7acfd4 100644
--- a/src/main/scala/xyz/driver/pdsuidomain/formats/json/sprayformats/criterion.scala
+++ b/src/main/scala/xyz/driver/pdsuidomain/formats/json/criterion.scala
@@ -1,4 +1,4 @@
-package xyz.driver.pdsuidomain.formats.json.sprayformats
+package xyz.driver.pdsuidomain.formats.json
import spray.json._
import xyz.driver.entities.labels.{Label, LabelCategory}
diff --git a/src/main/scala/xyz/driver/pdsuidomain/formats/json/criterion/ApiCriterion.scala b/src/main/scala/xyz/driver/pdsuidomain/formats/json/criterion/ApiCriterion.scala
deleted file mode 100644
index 239adb1..0000000
--- a/src/main/scala/xyz/driver/pdsuidomain/formats/json/criterion/ApiCriterion.scala
+++ /dev/null
@@ -1,59 +0,0 @@
-package xyz.driver.pdsuidomain.formats.json.criterion
-
-import xyz.driver.pdsuicommon.json.Serialization.seqJsonFormat
-import play.api.libs.functional.syntax._
-import play.api.libs.json._
-import xyz.driver.pdsuicommon.domain.{LongId, StringId}
-import xyz.driver.pdsuidomain.entities.{EligibilityArm, Criterion, Trial}
-import xyz.driver.pdsuidomain.formats.json.label.ApiCriterionLabel
-import xyz.driver.pdsuidomain.services.CriterionService.RichCriterion
-
-final case class ApiCriterion(id: Long,
- meta: Option[String],
- arms: Seq[Long],
- text: Option[String],
- isCompound: Boolean,
- labels: Seq[ApiCriterionLabel],
- trialId: String,
- inclusion: Option[Boolean]) {
-
- def toDomain = RichCriterion(
- criterion = Criterion(
- id = LongId[Criterion](id),
- trialId = StringId[Trial](trialId),
- text,
- isCompound,
- meta.getOrElse(""),
- inclusion
- ),
- armIds = arms.map(LongId[EligibilityArm]),
- labels = labels.map(_.toDomain(LongId[Criterion](id)))
- )
-}
-
-object ApiCriterion {
-
- implicit val format: Format[ApiCriterion] = (
- (JsPath \ "id").format[Long] and
- (JsPath \ "meta").formatNullable(Format(Reads { x =>
- JsSuccess(Json.stringify(x))
- }, Writes[String](Json.parse))) and
- (JsPath \ "arms").format(seqJsonFormat[Long]) and
- (JsPath \ "text").formatNullable[String] and
- (JsPath \ "isCompound").format[Boolean] and
- (JsPath \ "labels").format(seqJsonFormat[ApiCriterionLabel]) and
- (JsPath \ "trialId").format[String] and
- (JsPath \ "inclusion").formatNullable[Boolean]
- )(ApiCriterion.apply, unlift(ApiCriterion.unapply))
-
- def fromDomain(richCriterion: RichCriterion) = ApiCriterion(
- id = richCriterion.criterion.id.id,
- meta = Option(richCriterion.criterion.meta),
- arms = richCriterion.armIds.map(_.id),
- text = richCriterion.criterion.text,
- isCompound = richCriterion.criterion.isCompound,
- labels = richCriterion.labels.map(ApiCriterionLabel.fromDomain),
- trialId = richCriterion.criterion.trialId.id,
- inclusion = richCriterion.criterion.inclusion
- )
-}
diff --git a/src/main/scala/xyz/driver/pdsuidomain/formats/json/criterion/ApiNewCriterion.scala b/src/main/scala/xyz/driver/pdsuidomain/formats/json/criterion/ApiNewCriterion.scala
deleted file mode 100644
index 4b85f83..0000000
--- a/src/main/scala/xyz/driver/pdsuidomain/formats/json/criterion/ApiNewCriterion.scala
+++ /dev/null
@@ -1,46 +0,0 @@
-package xyz.driver.pdsuidomain.formats.json.criterion
-
-import xyz.driver.pdsuicommon.domain.{LongId, StringId}
-import xyz.driver.pdsuicommon.json.Serialization.seqJsonFormat
-import xyz.driver.pdsuidomain.entities._
-import play.api.libs.functional.syntax._
-import play.api.libs.json._
-import xyz.driver.pdsuidomain.formats.json.label.ApiCriterionLabel
-import xyz.driver.pdsuidomain.services.CriterionService.RichCriterion
-
-final case class ApiNewCriterion(meta: Option[String],
- arms: Option[Seq[Long]],
- text: Option[String],
- isCompound: Option[Boolean],
- labels: Seq[ApiCriterionLabel],
- trialId: String,
- inclusion: Option[Boolean]) {
-
- def toDomain = RichCriterion(
- criterion = Criterion(
- id = LongId(0L),
- meta = meta.getOrElse(""),
- trialId = StringId(trialId),
- isCompound = isCompound.getOrElse(false),
- text = text,
- inclusion = inclusion
- ),
- armIds = arms.getOrElse(Seq.empty).map(LongId[EligibilityArm]),
- labels = labels.map(_.toDomain(LongId(Long.MaxValue))) // A developer should specify right criterionId himself
- )
-}
-
-object ApiNewCriterion {
-
- implicit val format: Format[ApiNewCriterion] = (
- (JsPath \ "meta").formatNullable(Format(Reads { x =>
- JsSuccess(Json.stringify(x))
- }, Writes[String](Json.parse))) and
- (JsPath \ "arms").formatNullable(seqJsonFormat[Long]) and
- (JsPath \ "text").formatNullable[String] and
- (JsPath \ "isCompound").formatNullable[Boolean] and
- (JsPath \ "labels").format(seqJsonFormat[ApiCriterionLabel]) and
- (JsPath \ "trialId").format[String] and
- (JsPath \ "inclusion").formatNullable[Boolean]
- )(ApiNewCriterion.apply, unlift(ApiNewCriterion.unapply))
-}
diff --git a/src/main/scala/xyz/driver/pdsuidomain/formats/json/criterion/ApiUpdateCriterion.scala b/src/main/scala/xyz/driver/pdsuidomain/formats/json/criterion/ApiUpdateCriterion.scala
deleted file mode 100644
index a700309..0000000
--- a/src/main/scala/xyz/driver/pdsuidomain/formats/json/criterion/ApiUpdateCriterion.scala
+++ /dev/null
@@ -1,64 +0,0 @@
-package xyz.driver.pdsuidomain.formats.json.criterion
-
-import xyz.driver.pdsuicommon.domain.LongId
-import xyz.driver.pdsuicommon.json.Serialization.seqJsonFormat
-import xyz.driver.pdsuidomain.entities.{EligibilityArm, Criterion}
-import org.davidbild.tristate._
-import org.davidbild.tristate.contrib.play.ToJsPathOpsFromJsPath
-import play.api.libs.functional.syntax._
-import play.api.libs.json._
-import xyz.driver.pdsuidomain.formats.json.label.ApiCriterionLabel
-import xyz.driver.pdsuidomain.services.CriterionService.RichCriterion
-
-final case class ApiUpdateCriterion(meta: Tristate[String],
- arms: Tristate[Seq[Long]],
- text: Option[String],
- isCompound: Option[Boolean],
- inclusion: Tristate[Boolean],
- labels: Tristate[Seq[ApiCriterionLabel]]) {
-
- def applyTo(orig: RichCriterion): RichCriterion = RichCriterion(
- criterion = applyTo(orig.criterion),
- armIds = arms.cata(_.map(LongId[EligibilityArm]), Seq.empty, orig.armIds),
- labels = labels.cata(_.map(_.toDomain(orig.criterion.id)), Seq.empty, orig.labels)
- )
-
- private def applyTo(orig: Criterion): Criterion = Criterion(
- id = orig.id,
- meta = meta.cata(identity, "{}", orig.meta),
- text = text.orElse(orig.text),
- isCompound = isCompound.getOrElse(orig.isCompound),
- trialId = orig.trialId,
- inclusion = inclusion.cata(x => Some(x), None, orig.inclusion)
- )
-}
-
-object ApiUpdateCriterion {
-
- private val reads: Reads[ApiUpdateCriterion] = (
- (JsPath \ "meta")
- .readTristate(Reads { x =>
- JsSuccess(Json.stringify(x))
- })
- .map {
- case Tristate.Present("{}") => Tristate.Absent
- case x => x
- } and
- (JsPath \ "arms").readTristate(seqJsonFormat[Long]) and
- (JsPath \ "text").readNullable[String] and
- (JsPath \ "isCompound").readNullable[Boolean] and
- (JsPath \ "inclusion").readTristate[Boolean] and
- (JsPath \ "labels").readTristate(seqJsonFormat[ApiCriterionLabel])
- )(ApiUpdateCriterion.apply _)
-
- private val writes: Writes[ApiUpdateCriterion] = (
- (JsPath \ "meta").writeTristate(Writes[String](Json.parse)) and
- (JsPath \ "arms").writeTristate(seqJsonFormat[Long]) and
- (JsPath \ "text").writeNullable[String] and
- (JsPath \ "isCompound").writeNullable[Boolean] and
- (JsPath \ "inclusion").writeTristate[Boolean] and
- (JsPath \ "labels").writeTristate(seqJsonFormat[ApiCriterionLabel])
- )(unlift(ApiUpdateCriterion.unapply))
-
- implicit val format: Format[ApiUpdateCriterion] = Format(reads, writes)
-}
diff --git a/src/main/scala/xyz/driver/pdsuidomain/formats/json/sprayformats/document.scala b/src/main/scala/xyz/driver/pdsuidomain/formats/json/document.scala
index c584b96..aaca391 100644
--- a/src/main/scala/xyz/driver/pdsuidomain/formats/json/sprayformats/document.scala
+++ b/src/main/scala/xyz/driver/pdsuidomain/formats/json/document.scala
@@ -1,4 +1,4 @@
-package xyz.driver.pdsuidomain.formats.json.sprayformats
+package xyz.driver.pdsuidomain.formats.json
import java.time.{LocalDate, LocalDateTime}
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
deleted file mode 100644
index 250e650..0000000
--- a/src/main/scala/xyz/driver/pdsuidomain/formats/json/document/ApiDocument.scala
+++ /dev/null
@@ -1,114 +0,0 @@
-package xyz.driver.pdsuidomain.formats.json.document
-
-import java.time.{LocalDate, ZoneId, ZonedDateTime}
-import xyz.driver.pdsuicommon.domain.{LongId, StringId, TextJson}
-
-import xyz.driver.pdsuidomain.entities._
-import play.api.data.validation.ValidationError
-import play.api.libs.functional.syntax._
-import play.api.libs.json._
-import xyz.driver.pdsuicommon.json.JsonSerializer
-
-final case class ApiDocument(id: Long,
- recordId: Long,
- physician: Option[String],
- lastUpdate: ZonedDateTime,
- typeId: Option[Long],
- startDate: Option[LocalDate],
- endDate: Option[LocalDate],
- provider: Option[String],
- providerTypeId: Option[Long],
- requiredType: Option[String],
- institutionName: Option[String],
- status: Option[String],
- previousStatus: Option[String],
- assignee: Option[String],
- previousAssignee: Option[String],
- lastActiveUser: Option[String],
- meta: Option[String],
- labelVersion: Int) {
-
- 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),
- institutionName = this.institutionName,
- meta = this.meta.map(x => TextJson(JsonSerializer.deserialize[Document.Meta](x))),
- startDate = this.startDate,
- endDate = this.endDate,
- lastUpdate = this.lastUpdate.toLocalDateTime(),
- labelVersion = this.labelVersion
- )
-
-}
-
-object ApiDocument {
-
- private val statusFormat = Format(
- Reads.StringReads.filter(ValidationError("unknown status")) { x =>
- Document.Status.fromString(x).isDefined
- },
- Writes.StringWrites
- )
-
- implicit val format: Format[ApiDocument] = (
- (JsPath \ "id").format[Long] and
- (JsPath \ "recordId").format[Long] and
- (JsPath \ "physician").formatNullable[String] and
- (JsPath \ "lastUpdate").format[ZonedDateTime] and
- (JsPath \ "typeId").formatNullable[Long] and
- (JsPath \ "startDate").formatNullable[LocalDate] and
- (JsPath \ "endDate").formatNullable[LocalDate] and
- (JsPath \ "provider").formatNullable[String] and
- (JsPath \ "providerTypeId").formatNullable[Long] and
- (JsPath \ "requiredType").formatNullable[String] and
- (JsPath \ "institutionName").formatNullable[String] and
- (JsPath \ "status").formatNullable(statusFormat) and
- (JsPath \ "previousStatus").formatNullable(statusFormat) and
- (JsPath \ "assignee").formatNullable[String] and
- (JsPath \ "previousAssignee").formatNullable[String] and
- (JsPath \ "lastActiveUser").formatNullable[String] and
- (JsPath \ "meta").formatNullable(Format(Reads { x =>
- JsSuccess(Json.stringify(x))
- }, Writes[String](Json.parse))) and
- (JsPath \ "labelVersion").format[Int]
- )(ApiDocument.apply, unlift(ApiDocument.unapply))
-
- def fromDomain(document: Document): ApiDocument = {
- ApiDocument(
- id = document.id.id,
- recordId = document.recordId.id,
- physician = document.physician,
- lastUpdate = ZonedDateTime.of(document.lastUpdate, ZoneId.of("Z")),
- typeId = document.typeId.map(_.id),
- startDate = document.startDate,
- endDate = document.endDate,
- provider = document.providerName,
- providerTypeId = document.providerTypeId.map(_.id),
- requiredType = document.requiredType.map(Document.RequiredType.requiredTypeToString),
- institutionName = document.institutionName,
- status = Option(Document.Status.statusToString(document.status)),
- previousStatus = document.previousStatus.map(Document.Status.statusToString),
- assignee = document.assignee.map(_.id),
- previousAssignee = document.previousAssignee.map(_.id),
- lastActiveUser = document.lastActiveUserId.map(_.id),
- meta = document.meta.map(meta => JsonSerializer.serialize(meta.content)),
- labelVersion = document.labelVersion
- )
- }
-}
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
deleted file mode 100644
index 22bea6b..0000000
--- a/src/main/scala/xyz/driver/pdsuidomain/formats/json/document/ApiDocumentType.scala
+++ /dev/null
@@ -1,27 +0,0 @@
-package xyz.driver.pdsuidomain.formats.json.document
-
-import play.api.libs.functional.syntax._
-import play.api.libs.json.{Format, JsPath}
-import xyz.driver.pdsuidomain.entities.DocumentType
-
-final case class ApiDocumentType(id: Long, name: String) {
-
- def toDomain: DocumentType =
- DocumentType
- .fromString(name)
- .getOrElse(throw new IllegalArgumentException(s"Unknown document type name $name"))
-
-}
-
-object ApiDocumentType {
-
- implicit val format: Format[ApiDocumentType] = (
- (JsPath \ "id").format[Long] and
- (JsPath \ "name").format[String]
- )(ApiDocumentType.apply, unlift(ApiDocumentType.unapply))
-
- def fromDomain(documentType: DocumentType) = ApiDocumentType(
- id = documentType.id.id,
- name = documentType.name
- )
-}
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 34bebab..8b13789 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
@@ -1,131 +1 @@
-package xyz.driver.pdsuidomain.formats.json.document
-import java.time.{LocalDate, LocalDateTime}
-
-import org.davidbild.tristate.Tristate
-import org.davidbild.tristate.contrib.play.ToJsPathOpsFromJsPath
-import play.api.data.validation._
-import play.api.libs.functional.syntax._
-import play.api.libs.json._
-import xyz.driver.pdsuicommon.domain.{LongId, StringId, TextJson}
-import xyz.driver.pdsuicommon.json.{JsonSerializer, JsonValidationException}
-import xyz.driver.pdsuicommon.validation.{AdditionalConstraints, JsonValidationErrors}
-import xyz.driver.pdsuidomain.entities.Document.Meta
-import xyz.driver.pdsuidomain.entities._
-
-import scala.collection.breakOut
-import scala.util.Try
-
-final case class ApiPartialDocument(recordId: Option[Long],
- physician: Option[String],
- typeId: Tristate[Long],
- startDate: Tristate[LocalDate],
- endDate: Tristate[LocalDate],
- provider: Tristate[String],
- providerTypeId: Tristate[Long],
- institutionName: Tristate[String],
- status: Option[String],
- assignee: Tristate[String],
- meta: Tristate[String]) {
-
- import xyz.driver.pdsuicommon.domain.User
-
- def applyTo(orig: Document): Document = Document(
- id = orig.id,
- 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,
- lastActiveUserId = orig.lastActiveUserId,
- recordId = recordId.map(LongId[MedicalRecord]).getOrElse(orig.recordId),
- physician = physician.orElse(orig.physician),
- typeId = typeId.map(LongId[DocumentType]).cata(Some(_), None, orig.typeId),
- providerName = provider.cata(Some(_), None, orig.providerName),
- providerTypeId = providerTypeId.map(LongId[ProviderType]).cata(Some(_), None, orig.providerTypeId),
- requiredType = orig.requiredType,
- institutionName = institutionName.cata(Some(_), None, orig.institutionName),
- meta = meta.cata(x => Some(TextJson(JsonSerializer.deserialize[Meta](x))), None, orig.meta),
- startDate = startDate.cata(Some(_), None, orig.startDate),
- endDate = endDate.cata(Some(_), None, orig.endDate),
- lastUpdate = LocalDateTime.MIN, // Should update internally in a business logic module,
- labelVersion = orig.labelVersion
- )
-
- def toDomain: Try[Document] = Try {
- val validation = Map(JsPath \ "recordId" -> AdditionalConstraints.optionNonEmptyConstraint(recordId))
-
- val validationErrors: JsonValidationErrors = validation.collect({
- case (fieldName, e: Invalid) => (fieldName, e.errors)
- })(breakOut)
-
- if (validationErrors.isEmpty) {
- Document(
- id = LongId(0),
- recordId = recordId.map(LongId[MedicalRecord]).get,
- status = Document.Status.New,
- physician = physician,
- typeId = typeId.map(LongId[DocumentType]).toOption,
- startDate = startDate.toOption,
- endDate = endDate.toOption,
- providerName = provider.toOption,
- providerTypeId = providerTypeId.map(LongId[ProviderType]).toOption,
- requiredType = None,
- institutionName = institutionName.toOption,
- meta = meta.map(x => TextJson(JsonSerializer.deserialize[Meta](x))).toOption,
- previousStatus = None,
- assignee = None,
- previousAssignee = None,
- lastActiveUserId = None,
- lastUpdate = LocalDateTime.MIN,
- labelVersion = 1
- )
- } else {
- throw new JsonValidationException(validationErrors)
- }
- }
-}
-
-object ApiPartialDocument {
-
- private val reads: Reads[ApiPartialDocument] = (
- (JsPath \ "recordId").readNullable[Long] and
- (JsPath \ "physician").readNullable[String] and
- (JsPath \ "typeId").readTristate[Long] and
- (JsPath \ "startDate").readTristate[LocalDate] and
- (JsPath \ "endDate").readTristate[LocalDate] and
- (JsPath \ "provider").readTristate[String] and
- (JsPath \ "providerTypeId").readTristate[Long] and
- (JsPath \ "institutionName").readTristate[String] 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 _)
-
- private val writes: Writes[ApiPartialDocument] = (
- (JsPath \ "recordId").writeNullable[Long] and
- (JsPath \ "physician").writeNullable[String] and
- (JsPath \ "typeId").writeTristate[Long] and
- (JsPath \ "startDate").writeTristate[LocalDate] and
- (JsPath \ "endDate").writeTristate[LocalDate] and
- (JsPath \ "provider").writeTristate[String] and
- (JsPath \ "providerTypeId").writeTristate[Long] and
- (JsPath \ "institutionName").writeTristate[String] and
- (JsPath \ "status").writeNullable[String] and
- (JsPath \ "assignee").writeTristate[String] and
- (JsPath \ "meta").writeTristate(Writes[String](Json.parse))
- )(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
deleted file mode 100644
index 9c0c216..0000000
--- a/src/main/scala/xyz/driver/pdsuidomain/formats/json/document/ApiProviderType.scala
+++ /dev/null
@@ -1,27 +0,0 @@
-package xyz.driver.pdsuidomain.formats.json.document
-
-import play.api.libs.functional.syntax._
-import play.api.libs.json.{Format, JsPath}
-import xyz.driver.pdsuidomain.entities.ProviderType
-
-final case class ApiProviderType(id: Long, name: String) {
-
- def toDomain: ProviderType =
- ProviderType
- .fromString(name)
- .getOrElse(throw new IllegalArgumentException(s"Unknown provider type name $name"))
-
-}
-
-object ApiProviderType {
-
- implicit val format: Format[ApiProviderType] = (
- (JsPath \ "id").format[Long] and
- (JsPath \ "name").format[String]
- )(ApiProviderType.apply, unlift(ApiProviderType.unapply))
-
- def fromDomain(providerType: ProviderType) = ApiProviderType(
- id = providerType.id.id,
- name = providerType.name
- )
-}
diff --git a/src/main/scala/xyz/driver/pdsuidomain/formats/json/sprayformats/documenthistory.scala b/src/main/scala/xyz/driver/pdsuidomain/formats/json/documenthistory.scala
index 419c252..a0eb3f5 100644
--- a/src/main/scala/xyz/driver/pdsuidomain/formats/json/sprayformats/documenthistory.scala
+++ b/src/main/scala/xyz/driver/pdsuidomain/formats/json/documenthistory.scala
@@ -1,4 +1,4 @@
-package xyz.driver.pdsuidomain.formats.json.sprayformats
+package xyz.driver.pdsuidomain.formats.json
import spray.json._
import xyz.driver.core.json.EnumJsonFormat
@@ -6,8 +6,8 @@ import xyz.driver.pdsuidomain.entities._
object documenthistory {
import DefaultJsonProtocol._
- import common._
import DocumentHistory._
+ import common._
implicit val documentStateFormat = new EnumJsonFormat[State](
"Extract" -> State.Extract,
diff --git a/src/main/scala/xyz/driver/pdsuidomain/formats/json/documenthistory/ApiDocumentHistory.scala b/src/main/scala/xyz/driver/pdsuidomain/formats/json/documenthistory/ApiDocumentHistory.scala
deleted file mode 100644
index 5aae774..0000000
--- a/src/main/scala/xyz/driver/pdsuidomain/formats/json/documenthistory/ApiDocumentHistory.scala
+++ /dev/null
@@ -1,27 +0,0 @@
-package xyz.driver.pdsuidomain.formats.json.documenthistory
-
-import java.time.{ZoneId, ZonedDateTime}
-
-import play.api.libs.json.{Format, Json}
-import xyz.driver.pdsuidomain.entities.DocumentHistory
-
-final case class ApiDocumentHistory(id: Long,
- executor: String,
- documentId: Long,
- state: String,
- action: String,
- created: ZonedDateTime)
-
-object ApiDocumentHistory {
- implicit val format: Format[ApiDocumentHistory] =
- Json.format[ApiDocumentHistory]
-
- def fromDomain(x: DocumentHistory) = ApiDocumentHistory(
- id = x.id.id,
- executor = x.executor.id,
- documentId = x.documentId.id,
- state = DocumentHistory.State.stateToString(x.state),
- action = DocumentHistory.Action.actionToString(x.action),
- created = ZonedDateTime.of(x.created, ZoneId.of("Z"))
- )
-}
diff --git a/src/main/scala/xyz/driver/pdsuidomain/formats/json/sprayformats/documentissue.scala b/src/main/scala/xyz/driver/pdsuidomain/formats/json/documentissue.scala
index a658cfa..082fa83 100644
--- a/src/main/scala/xyz/driver/pdsuidomain/formats/json/sprayformats/documentissue.scala
+++ b/src/main/scala/xyz/driver/pdsuidomain/formats/json/documentissue.scala
@@ -1,4 +1,4 @@
-package xyz.driver.pdsuidomain.formats.json.sprayformats
+package xyz.driver.pdsuidomain.formats.json
import java.time.LocalDateTime
diff --git a/src/main/scala/xyz/driver/pdsuidomain/formats/json/documentissue/ApiDocumentIssue.scala b/src/main/scala/xyz/driver/pdsuidomain/formats/json/documentissue/ApiDocumentIssue.scala
deleted file mode 100644
index f157bb2..0000000
--- a/src/main/scala/xyz/driver/pdsuidomain/formats/json/documentissue/ApiDocumentIssue.scala
+++ /dev/null
@@ -1,40 +0,0 @@
-package xyz.driver.pdsuidomain.formats.json.documentissue
-
-import java.time.{ZoneId, ZonedDateTime}
-
-import play.api.libs.functional.syntax._
-import play.api.libs.json._
-import xyz.driver.pdsuidomain.entities.DocumentIssue
-
-final case class ApiDocumentIssue(id: Long,
- startPage: Option[Double],
- endPage: Option[Double],
- text: String,
- lastUpdate: ZonedDateTime,
- userId: String,
- isDraft: Boolean,
- archiveRequired: Boolean)
-
-object ApiDocumentIssue {
- implicit val format: Format[ApiDocumentIssue] = (
- (JsPath \ "id").format[Long] and
- (JsPath \ "startPage").formatNullable[Double] and
- (JsPath \ "endPage").formatNullable[Double] and
- (JsPath \ "text").format[String] and
- (JsPath \ "lastUpdate").format[ZonedDateTime] and
- (JsPath \ "userId").format[String] and
- (JsPath \ "isDraft").format[Boolean] and
- (JsPath \ "archiveRequired").format[Boolean]
- )(ApiDocumentIssue.apply, unlift(ApiDocumentIssue.unapply))
-
- def fromDomain(x: DocumentIssue) = ApiDocumentIssue(
- id = x.id.id,
- startPage = x.startPage,
- endPage = x.endPage,
- text = x.text,
- lastUpdate = ZonedDateTime.of(x.lastUpdate, ZoneId.of("Z")),
- userId = x.userId.id,
- isDraft = x.isDraft,
- archiveRequired = x.archiveRequired
- )
-}
diff --git a/src/main/scala/xyz/driver/pdsuidomain/formats/json/documentissue/ApiPartialDocumentIssue.scala b/src/main/scala/xyz/driver/pdsuidomain/formats/json/documentissue/ApiPartialDocumentIssue.scala
deleted file mode 100644
index c29b703..0000000
--- a/src/main/scala/xyz/driver/pdsuidomain/formats/json/documentissue/ApiPartialDocumentIssue.scala
+++ /dev/null
@@ -1,42 +0,0 @@
-package xyz.driver.pdsuidomain.formats.json.documentissue
-
-import java.time.LocalDateTime
-
-import play.api.libs.functional.syntax._
-import play.api.libs.json._
-import xyz.driver.pdsuicommon.domain.{LongId, StringId, User}
-import xyz.driver.pdsuidomain.entities.{Document, DocumentIssue}
-
-final case class ApiPartialDocumentIssue(startPage: Option[Double],
- endPage: Option[Double],
- text: String,
- archiveRequired: Boolean) {
- def applyTo(x: DocumentIssue): DocumentIssue = x.copy(
- startPage = startPage,
- endPage = endPage,
- text = text,
- archiveRequired = archiveRequired
- )
-
- def toDomain(userId: StringId[User], documentId: LongId[Document]) =
- DocumentIssue(
- id = LongId(0),
- userId = userId,
- documentId = documentId,
- startPage = startPage,
- endPage = endPage,
- lastUpdate = LocalDateTime.MIN,
- isDraft = true,
- text = text,
- archiveRequired = false
- )
-}
-
-object ApiPartialDocumentIssue {
- implicit val format: Format[ApiPartialDocumentIssue] = (
- (JsPath \ "startPage").formatNullable[Double] and
- (JsPath \ "endPage").formatNullable[Double] and
- (JsPath \ "text").format[String] and
- (JsPath \ "archiveRequired").format[Boolean]
- )(ApiPartialDocumentIssue.apply, unlift(ApiPartialDocumentIssue.unapply))
-}
diff --git a/src/main/scala/xyz/driver/pdsuidomain/formats/json/sprayformats/eligibility.scala b/src/main/scala/xyz/driver/pdsuidomain/formats/json/eligibility.scala
index 3c2465f..571cbde 100644
--- a/src/main/scala/xyz/driver/pdsuidomain/formats/json/sprayformats/eligibility.scala
+++ b/src/main/scala/xyz/driver/pdsuidomain/formats/json/eligibility.scala
@@ -1,5 +1,6 @@
-package xyz.driver.pdsuidomain.formats.json.sprayformats
+package xyz.driver.pdsuidomain.formats.json
+import spray.json.DefaultJsonProtocol._
import spray.json._
import DefaultJsonProtocol._
import xyz.driver.core.Id
@@ -8,13 +9,14 @@ import xyz.driver.entities.labels.LabelValue
import xyz.driver.pdsuidomain.entities.eligibility._
object eligibility {
+ import export._
import xyz.driver.formats.json.assay._
import xyz.driver.formats.json.common._
import xyz.driver.formats.json.labels._
import xyz.driver.formats.json.process._
- import xyz.driver.pdsuidomain.formats.json.sprayformats.document._
- import xyz.driver.pdsuidomain.formats.json.sprayformats.record._
- import xyz.driver.pdsuidomain.formats.json.sprayformats.export._
+ import xyz.driver.pdsuidomain.formats.json.document._
+ import xyz.driver.pdsuidomain.formats.json.record._
+ import xyz.driver.pdsuidomain.formats.json.export._
implicit val molecularDocumentFormat: RootJsonFormat[MolecularEvidenceDocument] = jsonFormat7(
MolecularEvidenceDocument)
diff --git a/src/main/scala/xyz/driver/pdsuidomain/formats/json/sprayformats/eligibilityarm.scala b/src/main/scala/xyz/driver/pdsuidomain/formats/json/eligibilityarm.scala
index 039e088..f31e6bd 100644
--- a/src/main/scala/xyz/driver/pdsuidomain/formats/json/sprayformats/eligibilityarm.scala
+++ b/src/main/scala/xyz/driver/pdsuidomain/formats/json/eligibilityarm.scala
@@ -1,4 +1,4 @@
-package xyz.driver.pdsuidomain.formats.json.sprayformats
+package xyz.driver.pdsuidomain.formats.json
import spray.json._
import xyz.driver.entities.patient.CancerType
diff --git a/src/main/scala/xyz/driver/pdsuidomain/formats/json/eligibilityarm/ApiCreateEligibilityArm.scala b/src/main/scala/xyz/driver/pdsuidomain/formats/json/eligibilityarm/ApiCreateEligibilityArm.scala
deleted file mode 100644
index 087fed5..0000000
--- a/src/main/scala/xyz/driver/pdsuidomain/formats/json/eligibilityarm/ApiCreateEligibilityArm.scala
+++ /dev/null
@@ -1,33 +0,0 @@
-package xyz.driver.pdsuidomain.formats.json.eligibilityarm
-
-import play.api.libs.json.{Format, Json}
-import xyz.driver.entities.patient.CancerType
-import xyz.driver.pdsuicommon.domain.{LongId, StringId}
-import xyz.driver.pdsuidomain.entities.{EligibilityArm, EligibilityArmDisease, EligibilityArmWithDiseases}
-
-final case class ApiCreateEligibilityArm(name: String, trialId: String, diseases: Seq[String]) {
-
- def toDomain: EligibilityArmWithDiseases = {
- val eligibilityArm = EligibilityArm(
- id = LongId(0),
- name = name,
- trialId = StringId(trialId),
- originalName = name
- )
-
- EligibilityArmWithDiseases(
- eligibilityArm,
- diseases.map { disease =>
- val condition = CancerType
- .fromString(disease)
- .getOrElse(throw new NoSuchElementException(s"unknown condition $disease"))
- EligibilityArmDisease(eligibilityArm.id, condition)
- }
- )
- }
-}
-
-object ApiCreateEligibilityArm {
-
- implicit val format: Format[ApiCreateEligibilityArm] = Json.format[ApiCreateEligibilityArm]
-}
diff --git a/src/main/scala/xyz/driver/pdsuidomain/formats/json/eligibilityarm/ApiEligibilityArm.scala b/src/main/scala/xyz/driver/pdsuidomain/formats/json/eligibilityarm/ApiEligibilityArm.scala
deleted file mode 100644
index 71423e8..0000000
--- a/src/main/scala/xyz/driver/pdsuidomain/formats/json/eligibilityarm/ApiEligibilityArm.scala
+++ /dev/null
@@ -1,57 +0,0 @@
-package xyz.driver.pdsuidomain.formats.json.eligibilityarm
-
-import play.api.libs.functional.syntax._
-import play.api.libs.json._
-import xyz.driver.entities.patient.CancerType
-import xyz.driver.pdsuicommon.domain.{LongId, StringId}
-import xyz.driver.pdsuidomain.entities.{EligibilityArm, EligibilityArmDisease, EligibilityArmWithDiseases}
-
-final case class ApiEligibilityArm(id: Long,
- name: String,
- originalName: String,
- trialId: String,
- diseases: Seq[String]) {
-
- def toDomain: EligibilityArmWithDiseases = {
- val eligibilityArm = EligibilityArm(
- id = LongId(this.id),
- name = this.name,
- originalName = this.originalName,
- trialId = StringId(this.trialId),
- deleted = None // if we have an ApiEligibilityArm object, the EligibilityArm itself has not been deleted
- )
-
- EligibilityArmWithDiseases(
- eligibilityArm,
- this.diseases.map { disease =>
- val condition = CancerType
- .fromString(disease)
- .getOrElse(throw new NoSuchElementException(s"unknown condition $disease"))
- EligibilityArmDisease(eligibilityArm.id, condition)
- }
- )
- }
-}
-
-object ApiEligibilityArm {
-
- implicit val format: Format[ApiEligibilityArm] = (
- (JsPath \ "id").format[Long] and
- (JsPath \ "name").format[String] and
- (JsPath \ "originalName").format[String] and
- (JsPath \ "trialId").format[String] and
- (JsPath \ "diseases").format[Seq[String]]
- )(ApiEligibilityArm.apply, unlift(ApiEligibilityArm.unapply))
-
- def fromDomain(eligibilityArmWithDiseases: EligibilityArmWithDiseases): ApiEligibilityArm = {
- import eligibilityArmWithDiseases.{eligibilityArm, eligibilityArmDiseases}
-
- ApiEligibilityArm(
- id = eligibilityArm.id.id,
- name = eligibilityArm.name,
- originalName = eligibilityArm.originalName,
- trialId = eligibilityArm.trialId.id,
- diseases = eligibilityArmDiseases.map(_.disease.toString)
- )
- }
-}
diff --git a/src/main/scala/xyz/driver/pdsuidomain/formats/json/eligibilityarm/ApiPartialEligibilityArm.scala b/src/main/scala/xyz/driver/pdsuidomain/formats/json/eligibilityarm/ApiPartialEligibilityArm.scala
deleted file mode 100644
index aca22ef..0000000
--- a/src/main/scala/xyz/driver/pdsuidomain/formats/json/eligibilityarm/ApiPartialEligibilityArm.scala
+++ /dev/null
@@ -1,23 +0,0 @@
-package xyz.driver.pdsuidomain.formats.json.eligibilityarm
-
-import play.api.libs.json.{Format, Json}
-import xyz.driver.entities.patient.CancerType
-import xyz.driver.pdsuidomain.entities.{EligibilityArmDisease, EligibilityArmWithDiseases}
-
-final case class ApiPartialEligibilityArm(name: String, diseases: Seq[String]) {
-
- def applyTo(armWithDisease: EligibilityArmWithDiseases): EligibilityArmWithDiseases = {
- val arm = armWithDisease.eligibilityArm.copy(name = name)
- val armDiseases = diseases.map { disease =>
- EligibilityArmDisease(
- armWithDisease.eligibilityArm.id,
- CancerType.fromString(disease).getOrElse(throw new NoSuchElementException(s"unknown condition $disease")))
- }
- EligibilityArmWithDiseases(arm, armDiseases)
- }
-}
-
-object ApiPartialEligibilityArm {
-
- implicit val format: Format[ApiPartialEligibilityArm] = Json.format
-}
diff --git a/src/main/scala/xyz/driver/pdsuidomain/formats/json/evidence/ApiPatientLabelEvidence.scala b/src/main/scala/xyz/driver/pdsuidomain/formats/json/evidence/ApiPatientLabelEvidence.scala
deleted file mode 100644
index c7a6de9..0000000
--- a/src/main/scala/xyz/driver/pdsuidomain/formats/json/evidence/ApiPatientLabelEvidence.scala
+++ /dev/null
@@ -1,33 +0,0 @@
-package xyz.driver.pdsuidomain.formats.json.evidence
-
-import java.time.LocalDate
-
-import play.api.libs.json._
-import xyz.driver.pdsuidomain.entities.PatientLabelEvidenceView
-
-final case class ApiPatientLabelEvidence(id: Long,
- value: String,
- evidenceText: String,
- documentId: Option[Long],
- evidenceId: Option[Long],
- reportId: Option[String],
- documentType: String,
- date: LocalDate,
- providerType: String)
-
-object ApiPatientLabelEvidence {
-
- implicit val format: Format[ApiPatientLabelEvidence] = Json.format
-
- def fromDomain(x: PatientLabelEvidenceView) = ApiPatientLabelEvidence(
- id = x.id.id,
- value = x.value.toString,
- evidenceText = x.evidenceText,
- documentId = x.documentId.map(_.id),
- evidenceId = x.evidenceId.map(_.id),
- reportId = x.reportId.map(_.toString),
- documentType = x.documentType.name,
- date = x.date.get,
- providerType = x.providerType.name
- )
-}
diff --git a/src/main/scala/xyz/driver/pdsuidomain/formats/json/sprayformats/export.scala b/src/main/scala/xyz/driver/pdsuidomain/formats/json/export.scala
index 9579288..d70ce6f 100644
--- a/src/main/scala/xyz/driver/pdsuidomain/formats/json/sprayformats/export.scala
+++ b/src/main/scala/xyz/driver/pdsuidomain/formats/json/export.scala
@@ -1,4 +1,4 @@
-package xyz.driver.pdsuidomain.formats.json.sprayformats
+package xyz.driver.pdsuidomain.formats.json
import spray.json._
import xyz.driver.entities.labels.Label
diff --git a/src/main/scala/xyz/driver/pdsuidomain/formats/json/sprayformats/extracteddata.scala b/src/main/scala/xyz/driver/pdsuidomain/formats/json/extracteddata.scala
index 436fbe9..c9ac55b 100644
--- a/src/main/scala/xyz/driver/pdsuidomain/formats/json/sprayformats/extracteddata.scala
+++ b/src/main/scala/xyz/driver/pdsuidomain/formats/json/extracteddata.scala
@@ -1,16 +1,16 @@
-package xyz.driver.pdsuidomain.formats.json.sprayformats
+package xyz.driver.pdsuidomain.formats.json
import spray.json._
import xyz.driver.entities.labels.{Label, LabelCategory, LabelValue}
+import xyz.driver.formats.json.labels._
import xyz.driver.pdsuicommon.domain.{LongId, TextJson}
import xyz.driver.pdsuidomain.entities._
import xyz.driver.pdsuidomain.services.ExtractedDataService.RichExtractedData
-import xyz.driver.formats.json.labels._
object extracteddata {
import DefaultJsonProtocol._
- import common._
import ExtractedData._
+ import common._
implicit val metaKeywordFormat: RootJsonFormat[Meta.Keyword] = jsonFormat4(Meta.Keyword)
implicit val metaTextLayerPositionFormat: RootJsonFormat[Meta.TextLayerPosition] = jsonFormat3(
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
deleted file mode 100644
index 4182c8d..0000000
--- a/src/main/scala/xyz/driver/pdsuidomain/formats/json/extracteddata/ApiExtractedData.scala
+++ /dev/null
@@ -1,64 +0,0 @@
-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._
-import play.api.libs.functional.syntax._
-import xyz.driver.pdsuicommon.json.JsonSerializer
-import xyz.driver.pdsuidomain.services.ExtractedDataService.RichExtractedData
-
-// The specification: https://driverinc.atlassian.net/wiki/pages/viewpage.action?pageId=33423387
-// Note, that there is "Extracted data object or Temporary extracted data object" in specification
-// ApiExtractedData represents both types
-final case class ApiExtractedData(id: Long,
- documentId: Long,
- keywordId: Option[Long],
- evidence: Option[String],
- meta: Option[String],
- // An empty list and no-existent list are different cases
- 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 {
-
- implicit val format: Format[ApiExtractedData] = (
- (JsPath \ "id").format[Long] and
- (JsPath \ "documentId").format[Long] and
- (JsPath \ "keywordId").formatNullable[Long] and
- (JsPath \ "evidence").formatNullable[String] and
- (JsPath \ "meta").formatNullable[String] and
- (JsPath \ "labels").formatNullable[List[ApiExtractedDataLabel]](
- Format(
- Reads
- .of[List[ApiExtractedDataLabel]]
- .filter(ValidationError("empty labels"))({
- case x if x.nonEmpty => true
- case _ => false
- }),
- Writes.of[List[ApiExtractedDataLabel]]
- ))
- )(ApiExtractedData.apply, unlift(ApiExtractedData.unapply))
-
- def fromDomain(extractedDataWithLabels: RichExtractedData) = ApiExtractedData(
- id = extractedDataWithLabels.extractedData.id.id,
- documentId = extractedDataWithLabels.extractedData.documentId.id,
- keywordId = extractedDataWithLabels.extractedData.keywordId.map(_.id),
- evidence = extractedDataWithLabels.extractedData.evidenceText,
- meta = extractedDataWithLabels.extractedData.meta.map(x => JsonSerializer.serialize(x.content)),
- labels = Option(extractedDataWithLabels.labels.map(ApiExtractedDataLabel.fromDomain))
- )
-}
diff --git a/src/main/scala/xyz/driver/pdsuidomain/formats/json/extracteddata/ApiPartialExtractedData.scala b/src/main/scala/xyz/driver/pdsuidomain/formats/json/extracteddata/ApiPartialExtractedData.scala
deleted file mode 100644
index cfd55fd..0000000
--- a/src/main/scala/xyz/driver/pdsuidomain/formats/json/extracteddata/ApiPartialExtractedData.scala
+++ /dev/null
@@ -1,80 +0,0 @@
-package xyz.driver.pdsuidomain.formats.json.extracteddata
-
-import xyz.driver.pdsuicommon.domain.{LongId, TextJson}
-import xyz.driver.pdsuidomain.entities.ExtractedData.Meta
-import xyz.driver.pdsuidomain.entities._
-import org.davidbild.tristate.Tristate
-import org.davidbild.tristate.contrib.play.ToJsPathOpsFromJsPath
-import play.api.data.validation._
-import play.api.libs.functional.syntax._
-import play.api.libs.json._
-import xyz.driver.pdsuicommon.json.{JsonSerializer, JsonValidationException}
-import xyz.driver.pdsuicommon.validation.{AdditionalConstraints, JsonValidationErrors}
-import xyz.driver.pdsuidomain.formats.json.label.ApiExtractedDataLabel
-import xyz.driver.pdsuidomain.services.ExtractedDataService.RichExtractedData
-
-import scala.collection._
-
-final case class ApiPartialExtractedData(documentId: Option[Long],
- keywordId: Option[Long],
- evidence: Tristate[String],
- meta: Tristate[String],
- labels: Tristate[List[ApiExtractedDataLabel]]) {
-
- def applyTo(orig: RichExtractedData): RichExtractedData = RichExtractedData(
- extractedData = applyTo(orig.extractedData),
- labels = labels.cata(_.map(_.toDomain(orig.extractedData.id)), List.empty, orig.labels)
- )
-
- private def applyTo(orig: ExtractedData): ExtractedData = ExtractedData(
- id = orig.id,
- documentId = orig.documentId,
- keywordId = keywordId.map(LongId[Keyword]).orElse(orig.keywordId),
- evidenceText = evidence.cata(Some(_), None, orig.evidenceText),
- meta = meta.map(x => TextJson(JsonSerializer.deserialize[Meta](x))).cata(Some(_), None, orig.meta)
- )
-
- def toDomain: RichExtractedData = {
- val validation = Map(
- JsPath \ "documentId" -> AdditionalConstraints.optionNonEmptyConstraint(documentId)
- )
-
- val validationErrors: JsonValidationErrors = validation.collect({
- case (fieldName, e: Invalid) => (fieldName, e.errors)
- })(breakOut)
-
- if (validationErrors.isEmpty) {
- val extractedData = ExtractedData(
- documentId = documentId.map(LongId[Document]).get,
- keywordId = keywordId.map(LongId[Keyword]),
- evidenceText = evidence.toOption,
- meta = meta.map(x => TextJson(JsonSerializer.deserialize[Meta](x))).toOption
- )
- val labelList = labels.map(_.map(_.toDomain()))
- RichExtractedData(extractedData, labelList.getOrElse(List.empty))
- } else {
- throw new JsonValidationException(validationErrors)
- }
- }
-}
-
-object ApiPartialExtractedData {
-
- private val reads: Reads[ApiPartialExtractedData] = (
- (JsPath \ "documentId").readNullable[Long] and
- (JsPath \ "keywordId").readNullable[Long] and
- (JsPath \ "evidence").readTristate[String] and
- (JsPath \ "meta").readTristate[String] and
- (JsPath \ "labels").readTristate[List[ApiExtractedDataLabel]]
- )(ApiPartialExtractedData.apply _)
-
- private val writes: Writes[ApiPartialExtractedData] = (
- (JsPath \ "documentId").writeNullable[Long] and
- (JsPath \ "keywordId").writeNullable[Long] and
- (JsPath \ "evidence").writeTristate[String] and
- (JsPath \ "meta").writeTristate[String] and
- (JsPath \ "labels").writeTristate[List[ApiExtractedDataLabel]]
- )(unlift(ApiPartialExtractedData.unapply))
-
- implicit val format: Format[ApiPartialExtractedData] = Format(reads, writes)
-}
diff --git a/src/main/scala/xyz/driver/pdsuidomain/formats/json/sprayformats/hypothesis.scala b/src/main/scala/xyz/driver/pdsuidomain/formats/json/hypothesis.scala
index c05ff23..c5f6141 100644
--- a/src/main/scala/xyz/driver/pdsuidomain/formats/json/sprayformats/hypothesis.scala
+++ b/src/main/scala/xyz/driver/pdsuidomain/formats/json/hypothesis.scala
@@ -1,4 +1,4 @@
-package xyz.driver.pdsuidomain.formats.json.sprayformats
+package xyz.driver.pdsuidomain.formats.json
import spray.json._
import xyz.driver.pdsuidomain.entities._
diff --git a/src/main/scala/xyz/driver/pdsuidomain/formats/json/hypothesis/ApiHypothesis.scala b/src/main/scala/xyz/driver/pdsuidomain/formats/json/hypothesis/ApiHypothesis.scala
deleted file mode 100644
index bf18a60..0000000
--- a/src/main/scala/xyz/driver/pdsuidomain/formats/json/hypothesis/ApiHypothesis.scala
+++ /dev/null
@@ -1,35 +0,0 @@
-package xyz.driver.pdsuidomain.formats.json.hypothesis
-
-import java.util.UUID
-
-import play.api.libs.functional.syntax._
-import play.api.libs.json.{Format, JsPath}
-import xyz.driver.pdsuicommon.domain.UuidId
-import xyz.driver.pdsuidomain.entities.Hypothesis
-
-final case class ApiHypothesis(id: UUID, name: String, treatmentType: String, description: String) {
-
- def toDomain = Hypothesis(
- id = UuidId[Hypothesis](id),
- name = name,
- treatmentType = treatmentType,
- description = description
- )
-}
-
-object ApiHypothesis {
-
- implicit val format: Format[ApiHypothesis] = (
- (JsPath \ "id").format[UUID] and
- (JsPath \ "name").format[String] and
- (JsPath \ "treatmentType").format[String] and
- (JsPath \ "description").format[String]
- )(ApiHypothesis.apply, unlift(ApiHypothesis.unapply))
-
- def fromDomain(hypothesis: Hypothesis) = ApiHypothesis(
- id = hypothesis.id.id,
- name = hypothesis.name,
- treatmentType = hypothesis.treatmentType,
- description = hypothesis.description
- )
-}
diff --git a/src/main/scala/xyz/driver/pdsuidomain/formats/json/sprayformats/intervention.scala b/src/main/scala/xyz/driver/pdsuidomain/formats/json/intervention.scala
index fccdda4..14edd5d 100644
--- a/src/main/scala/xyz/driver/pdsuidomain/formats/json/sprayformats/intervention.scala
+++ b/src/main/scala/xyz/driver/pdsuidomain/formats/json/intervention.scala
@@ -1,4 +1,4 @@
-package xyz.driver.pdsuidomain.formats.json.sprayformats
+package xyz.driver.pdsuidomain.formats.json
import spray.json._
import xyz.driver.pdsuicommon.domain.{LongId, StringId}
diff --git a/src/main/scala/xyz/driver/pdsuidomain/formats/json/intervention/ApiIntervention.scala b/src/main/scala/xyz/driver/pdsuidomain/formats/json/intervention/ApiIntervention.scala
deleted file mode 100644
index 072ed25..0000000
--- a/src/main/scala/xyz/driver/pdsuidomain/formats/json/intervention/ApiIntervention.scala
+++ /dev/null
@@ -1,76 +0,0 @@
-package xyz.driver.pdsuidomain.formats.json.intervention
-
-import xyz.driver.pdsuicommon.domain.{LongId, StringId}
-import xyz.driver.pdsuidomain.entities.{Intervention, InterventionArm, InterventionWithArms}
-import play.api.libs.functional.syntax._
-import play.api.libs.json.{Format, JsPath}
-
-final case class ApiIntervention(id: Long,
- name: String,
- typeId: Option[Long],
- dosage: String,
- isActive: Boolean,
- arms: List[Long],
- trialId: String,
- deliveryMethod: Option[String],
- originalName: String,
- originalDosage: String,
- originalType: Option[String]) {
-
- def toDomain = {
- val intervention = Intervention(
- id = LongId(this.id),
- trialId = StringId(this.trialId),
- name = this.name,
- originalName = this.originalName,
- typeId = this.typeId.map(id => LongId(id)),
- originalType = this.originalType.map(id => id.toString),
- dosage = this.dosage,
- originalDosage = this.originalDosage,
- isActive = this.isActive,
- deliveryMethod = this.deliveryMethod
- )
-
- InterventionWithArms(intervention, this.arms.map { armId =>
- InterventionArm(LongId(armId), intervention.id)
- })
-
- }
-
-}
-
-object ApiIntervention {
-
- implicit val format: Format[ApiIntervention] = (
- (JsPath \ "id").format[Long] and
- (JsPath \ "name").format[String] and
- (JsPath \ "typeId").formatNullable[Long] and
- (JsPath \ "dosage").format[String] and
- (JsPath \ "isActive").format[Boolean] and
- (JsPath \ "arms").format[List[Long]] and
- (JsPath \ "trialId").format[String] and
- (JsPath \ "deliveryMethod").formatNullable[String] and
- (JsPath \ "originalName").format[String] and
- (JsPath \ "originalDosage").format[String] and
- (JsPath \ "originalType").formatNullable[String]
- )(ApiIntervention.apply, unlift(ApiIntervention.unapply))
-
- def fromDomain(interventionWithArms: InterventionWithArms): ApiIntervention = {
- import interventionWithArms.intervention
- import interventionWithArms.arms
-
- ApiIntervention(
- id = intervention.id.id,
- name = intervention.name,
- typeId = intervention.typeId.map(_.id),
- dosage = intervention.dosage,
- isActive = intervention.isActive,
- arms = arms.map(_.armId.id),
- trialId = intervention.trialId.id,
- deliveryMethod = intervention.deliveryMethod,
- originalName = intervention.originalName,
- originalDosage = intervention.originalDosage,
- originalType = intervention.originalType
- )
- }
-}
diff --git a/src/main/scala/xyz/driver/pdsuidomain/formats/json/intervention/ApiInterventionType.scala b/src/main/scala/xyz/driver/pdsuidomain/formats/json/intervention/ApiInterventionType.scala
deleted file mode 100644
index 3db8bfa..0000000
--- a/src/main/scala/xyz/driver/pdsuidomain/formats/json/intervention/ApiInterventionType.scala
+++ /dev/null
@@ -1,26 +0,0 @@
-package xyz.driver.pdsuidomain.formats.json.intervention
-
-import play.api.libs.functional.syntax._
-import play.api.libs.json.{Format, JsPath}
-import xyz.driver.pdsuidomain.entities.InterventionType
-import xyz.driver.pdsuidomain.entities.InterventionType.DeliveryMethod
-
-final case class ApiInterventionType(id: Long, name: String, deliveryMethods: List[String]) {
-
- def toDomain = InterventionType.typeFromString(name)
-}
-
-object ApiInterventionType {
-
- implicit val format: Format[ApiInterventionType] = (
- (JsPath \ "id").format[Long] and
- (JsPath \ "name").format[String] and
- (JsPath \ "deliveryMethods").format[List[String]]
- )(ApiInterventionType.apply, unlift(ApiInterventionType.unapply))
-
- def fromDomain(interventionType: InterventionType) = ApiInterventionType(
- id = interventionType.id.id,
- name = interventionType.name,
- deliveryMethods = interventionType.deliveryMethods.map(DeliveryMethod.methodToString).toList
- )
-}
diff --git a/src/main/scala/xyz/driver/pdsuidomain/formats/json/intervention/ApiPartialIntervention.scala b/src/main/scala/xyz/driver/pdsuidomain/formats/json/intervention/ApiPartialIntervention.scala
deleted file mode 100644
index 28a8555..0000000
--- a/src/main/scala/xyz/driver/pdsuidomain/formats/json/intervention/ApiPartialIntervention.scala
+++ /dev/null
@@ -1,90 +0,0 @@
-package xyz.driver.pdsuidomain.formats.json.intervention
-
-import play.api.data.validation.Invalid
-import xyz.driver.pdsuicommon.domain.{LongId, StringId}
-import xyz.driver.pdsuidomain.entities.{Intervention, InterventionArm, InterventionWithArms, Trial}
-import play.api.libs.functional.syntax._
-import play.api.libs.json._
-import xyz.driver.pdsuicommon.json.JsonValidationException
-import xyz.driver.pdsuicommon.validation.{AdditionalConstraints, JsonValidationErrors}
-
-import scala.collection.breakOut
-import scala.util.Try
-
-final case class ApiPartialIntervention(name: Option[String],
- trialId: Option[String],
- typeId: Option[Long],
- dosage: Option[String],
- isActive: Option[Boolean],
- deliveryMethod: Option[String],
- arms: Option[List[Long]]) {
-
- def applyTo(orig: InterventionWithArms): InterventionWithArms = {
- val origIntervention = orig.intervention
- val draftArmList = arms.map(_.map(x => InterventionArm(armId = LongId(x), interventionId = orig.intervention.id)))
- orig.copy(
- intervention = origIntervention.copy(
- name = name.getOrElse(origIntervention.name),
- typeId = typeId.map(LongId(_)).orElse(origIntervention.typeId),
- dosage = dosage.getOrElse(origIntervention.dosage),
- isActive = isActive.getOrElse(origIntervention.isActive),
- deliveryMethod = deliveryMethod.orElse(origIntervention.deliveryMethod)
- ),
- arms = draftArmList.getOrElse(orig.arms)
- )
- }
-
- def toDomain: Try[InterventionWithArms] = Try {
- val validation = Map(JsPath \ "trialId" -> AdditionalConstraints.optionNonEmptyConstraint(trialId))
-
- val validationErrors: JsonValidationErrors = validation.collect({
- case (fieldName, e: Invalid) => (fieldName, e.errors)
- })(breakOut)
-
- if (validationErrors.isEmpty) {
- InterventionWithArms(
- intervention = Intervention(
- id = LongId(0),
- trialId = trialId.map(StringId[Trial]).get,
- name = name.getOrElse(""),
- originalName = name.getOrElse(""),
- typeId = typeId.map(LongId(_)),
- originalType = Option(""),
- dosage = dosage.getOrElse(""),
- originalDosage = dosage.getOrElse(""),
- isActive = isActive.getOrElse(false),
- deliveryMethod = deliveryMethod
- ),
- arms =
- arms.map(_.map(x => InterventionArm(armId = LongId(x), interventionId = LongId(0)))).getOrElse(List.empty)
- )
- } else {
- throw new JsonValidationException(validationErrors)
- }
- }
-}
-
-object ApiPartialIntervention {
-
- private val reads: Reads[ApiPartialIntervention] = (
- (JsPath \ "name").readNullable[String] and
- (JsPath \ "trialId").readNullable[String] and
- (JsPath \ "typeId").readNullable[Long] and
- (JsPath \ "dosage").readNullable[String] and
- (JsPath \ "isActive").readNullable[Boolean] and
- (JsPath \ "deliveryMethod").readNullable[String] and
- (JsPath \ "arms").readNullable[List[Long]]
- )(ApiPartialIntervention.apply _)
-
- private val writes: Writes[ApiPartialIntervention] = (
- (JsPath \ "name").writeNullable[String] and
- (JsPath \ "trialId").writeNullable[String] and
- (JsPath \ "typeId").writeNullable[Long] and
- (JsPath \ "dosage").writeNullable[String] and
- (JsPath \ "isActive").writeNullable[Boolean] and
- (JsPath \ "deliveryMethod").writeNullable[String] and
- (JsPath \ "arms").writeNullable[List[Long]]
- )(unlift(ApiPartialIntervention.unapply))
-
- implicit val format: Format[ApiPartialIntervention] = Format(reads, writes)
-}
diff --git a/src/main/scala/xyz/driver/pdsuidomain/formats/json/label/ApiCriterionLabel.scala b/src/main/scala/xyz/driver/pdsuidomain/formats/json/label/ApiCriterionLabel.scala
deleted file mode 100644
index edb0603..0000000
--- a/src/main/scala/xyz/driver/pdsuidomain/formats/json/label/ApiCriterionLabel.scala
+++ /dev/null
@@ -1,54 +0,0 @@
-package xyz.driver.pdsuidomain.formats.json.label
-
-import xyz.driver.pdsuicommon.domain.LongId
-import xyz.driver.pdsuidomain.entities.{Criterion, CriterionLabel}
-import play.api.data.validation.ValidationError
-import play.api.libs.functional.syntax._
-import play.api.libs.json._
-import xyz.driver.entities.labels.{Label, LabelCategory, LabelValue}
-
-/**
- * @param value Yes|No
- */
-final case class ApiCriterionLabel(labelId: Option[Long],
- categoryId: Option[Long],
- value: Option[String],
- isDefining: Boolean) {
-
- def toDomain(criterionId: LongId[Criterion]) = CriterionLabel(
- id = LongId(0L),
- labelId = labelId.map(LongId[Label]),
- criterionId = criterionId,
- categoryId = categoryId.map(LongId[LabelCategory]),
- value = value.map {
- case "Yes" => true
- case "No" => false
- },
- isDefining = isDefining
- )
-}
-
-object ApiCriterionLabel {
-
- def fromDomain(x: CriterionLabel) = ApiCriterionLabel(
- labelId = x.labelId.map(_.id),
- categoryId = x.categoryId.map(_.id),
- value = x.value.map { x =>
- LabelValue.fromBoolean(x).toString
- },
- isDefining = x.isDefining
- )
-
- implicit val format: Format[ApiCriterionLabel] = (
- (JsPath \ "labelId").formatNullable[Long] and
- (JsPath \ "categoryId").formatNullable[Long] and
- (JsPath \ "value").formatNullable[String](
- Format(Reads
- .of[String]
- .filter(ValidationError("unknown value"))({ x =>
- x == "Yes" || x == "No"
- }),
- Writes.of[String])) and
- (JsPath \ "isDefining").format[Boolean]
- )(ApiCriterionLabel.apply, unlift(ApiCriterionLabel.unapply))
-}
diff --git a/src/main/scala/xyz/driver/pdsuidomain/formats/json/label/ApiExtractedDataLabel.scala b/src/main/scala/xyz/driver/pdsuidomain/formats/json/label/ApiExtractedDataLabel.scala
deleted file mode 100644
index 1497679..0000000
--- a/src/main/scala/xyz/driver/pdsuidomain/formats/json/label/ApiExtractedDataLabel.scala
+++ /dev/null
@@ -1,41 +0,0 @@
-package xyz.driver.pdsuidomain.formats.json.label
-
-import xyz.driver.pdsuicommon.domain.LongId
-import xyz.driver.pdsuidomain.entities.{ExtractedData, ExtractedDataLabel}
-import play.api.data.validation.ValidationError
-import play.api.libs.functional.syntax._
-import play.api.libs.json._
-import xyz.driver.entities.labels.{Label, LabelCategory, LabelValue}
-
-final case class ApiExtractedDataLabel(id: Option[Long], categoryId: Option[Long], value: Option[String]) {
-
- def toDomain(dataId: LongId[ExtractedData] = LongId(0)) = ExtractedDataLabel(
- id = LongId(0),
- dataId = dataId,
- labelId = id.map(LongId[Label]),
- categoryId = categoryId.map(LongId[LabelCategory]),
- value = value.flatMap(LabelValue.fromString)
- )
-}
-
-object ApiExtractedDataLabel {
-
- implicit val format: Format[ApiExtractedDataLabel] = (
- (JsPath \ "id").formatNullable[Long] and
- (JsPath \ "categoryId").formatNullable[Long] and
- (JsPath \ "value").formatNullable[String](
- Format(Reads
- .of[String]
- .filter(ValidationError("unknown value"))({
- case x if LabelValue.fromString(x).isDefined => true
- case _ => false
- }),
- Writes.of[String]))
- )(ApiExtractedDataLabel.apply, unlift(ApiExtractedDataLabel.unapply))
-
- def fromDomain(dataLabel: ExtractedDataLabel) = ApiExtractedDataLabel(
- id = dataLabel.labelId.map(_.id),
- categoryId = dataLabel.categoryId.map(_.id),
- value = dataLabel.value.map(_.toString)
- )
-}
diff --git a/src/main/scala/xyz/driver/pdsuidomain/formats/json/sprayformats/listresponse.scala b/src/main/scala/xyz/driver/pdsuidomain/formats/json/listresponse.scala
index 20644dc..1e359d6 100644
--- a/src/main/scala/xyz/driver/pdsuidomain/formats/json/sprayformats/listresponse.scala
+++ b/src/main/scala/xyz/driver/pdsuidomain/formats/json/listresponse.scala
@@ -1,9 +1,9 @@
-package xyz.driver.pdsuidomain.formats.json.sprayformats
+package xyz.driver.pdsuidomain.formats.json
-import spray.json._
import spray.json.DefaultJsonProtocol._
+import spray.json._
import xyz.driver.pdsuidomain.ListResponse
-import xyz.driver.pdsuidomain.formats.json.sprayformats.common._
+import xyz.driver.pdsuidomain.formats.json.common._
object listresponse {
private val itemsField = "items"
diff --git a/src/main/scala/xyz/driver/pdsuidomain/formats/json/message/ApiMessage.scala b/src/main/scala/xyz/driver/pdsuidomain/formats/json/message/ApiMessage.scala
deleted file mode 100644
index 425eeac..0000000
--- a/src/main/scala/xyz/driver/pdsuidomain/formats/json/message/ApiMessage.scala
+++ /dev/null
@@ -1,79 +0,0 @@
-package xyz.driver.pdsuidomain.formats.json.message
-
-import java.time.{ZoneId, ZonedDateTime}
-
-import play.api.libs.functional.syntax._
-import play.api.libs.json.{Format, JsPath}
-import xyz.driver.pdsuicommon.domain.{LongId, StringId, UuidId}
-import xyz.driver.pdsuidomain.entities.Message
-
-final case class ApiMessage(id: Long,
- text: String,
- lastUpdate: ZonedDateTime,
- userId: String,
- isDraft: Boolean,
- recordId: Option[Long],
- documentId: Option[Long],
- patientId: Option[String],
- trialId: Option[String],
- startPage: Option[Double],
- endPage: Option[Double],
- evidence: Option[String],
- archiveRequired: Option[Boolean],
- meta: Option[String]) {
-
- def toDomain = Message(
- id = LongId(this.id),
- text = this.text,
- lastUpdate = this.lastUpdate.toLocalDateTime(),
- userId = StringId(this.userId),
- isDraft = this.isDraft,
- recordId = this.recordId.map(id => LongId(id)),
- documentId = this.documentId.map(id => LongId(id)),
- patientId = this.patientId.map(id => UuidId(id)),
- trialId = this.trialId.map(id => StringId(id)),
- startPage = this.startPage,
- endPage = this.endPage,
- evidence = this.evidence,
- archiveRequired = this.archiveRequired,
- meta = this.meta
- )
-
-}
-
-object ApiMessage {
-
- def fromDomain(domain: Message) = ApiMessage(
- id = domain.id.id,
- text = domain.text,
- lastUpdate = ZonedDateTime.of(domain.lastUpdate, ZoneId.of("Z")),
- userId = domain.userId.id,
- isDraft = domain.isDraft,
- recordId = domain.recordId.map(_.id),
- documentId = domain.documentId.map(_.id),
- patientId = domain.patientId.map(_.toString),
- trialId = domain.trialId.map(_.toString),
- startPage = domain.startPage,
- endPage = domain.endPage,
- evidence = domain.evidence,
- archiveRequired = domain.archiveRequired,
- meta = domain.meta
- )
-
- implicit val format: Format[ApiMessage] = (
- (JsPath \ "id").format[Long] and
- (JsPath \ "text").format[String] and
- (JsPath \ "lastUpdate").format[ZonedDateTime] and
- (JsPath \ "userId").format[String] and
- (JsPath \ "isDraft").format[Boolean] and
- (JsPath \ "recordId").formatNullable[Long] and
- (JsPath \ "documentId").formatNullable[Long] and
- (JsPath \ "patientId").formatNullable[String] and
- (JsPath \ "trialId").formatNullable[String] and
- (JsPath \ "startPage").formatNullable[Double] and
- (JsPath \ "endPage").formatNullable[Double] and
- (JsPath \ "evidence").formatNullable[String] and
- (JsPath \ "archiveRequired").formatNullable[Boolean] and
- (JsPath \ "meta").formatNullable[String]
- )(ApiMessage.apply, unlift(ApiMessage.unapply))
-}
diff --git a/src/main/scala/xyz/driver/pdsuidomain/formats/json/message/ApiPartialMessage.scala b/src/main/scala/xyz/driver/pdsuidomain/formats/json/message/ApiPartialMessage.scala
deleted file mode 100644
index a2656f2..0000000
--- a/src/main/scala/xyz/driver/pdsuidomain/formats/json/message/ApiPartialMessage.scala
+++ /dev/null
@@ -1,82 +0,0 @@
-package xyz.driver.pdsuidomain.formats.json.message
-
-import java.time.LocalDateTime
-
-import xyz.driver.pdsuicommon.domain._
-import play.api.libs.functional.syntax._
-import play.api.libs.json.{Format, JsPath}
-import xyz.driver.pdsuidomain.entities.Message
-
-final case class ApiPartialMessage(text: Option[String],
- recordId: Option[Long],
- documentId: Option[Long],
- patientId: Option[String],
- trialId: Option[String],
- startPage: Option[Double],
- endPage: Option[Double],
- evidence: Option[String],
- archiveRequired: Option[Boolean],
- meta: Option[String]) {
-
- def toDomain(userId: StringId[User]) = Message(
- id = LongId(0),
- text = text.getOrElse(""),
- userId = userId,
- isDraft = true,
- recordId = recordId.map(LongId(_)),
- documentId = documentId.map(LongId(_)),
- patientId = patientId.map(UuidId(_)),
- trialId = trialId.map(StringId(_)),
- startPage = startPage,
- endPage = endPage,
- evidence = evidence,
- archiveRequired = archiveRequired,
- meta = meta,
- lastUpdate = LocalDateTime.MIN
- )
-
- def applyTo(orig: Message): Message = {
- orig.copy(
- text = text.getOrElse(""),
- recordId = recordId.map(LongId(_)),
- documentId = documentId.map(LongId(_)),
- patientId = patientId.map(UuidId(_)),
- trialId = trialId.map(StringId(_)),
- startPage = startPage,
- endPage = endPage,
- evidence = evidence,
- archiveRequired = archiveRequired,
- meta = meta,
- lastUpdate = LocalDateTime.MIN
- )
- }
-}
-
-object ApiPartialMessage {
-
- implicit val format: Format[ApiPartialMessage] = (
- (JsPath \ "text").formatNullable[String] and
- (JsPath \ "recordId").formatNullable[Long] and
- (JsPath \ "documentId").formatNullable[Long] and
- (JsPath \ "patientId").formatNullable[String] and
- (JsPath \ "trialId").formatNullable[String] and
- (JsPath \ "startPage").formatNullable[Double] and
- (JsPath \ "endPage").formatNullable[Double] and
- (JsPath \ "evidence").formatNullable[String] and
- (JsPath \ "archiveRequired").formatNullable[Boolean] and
- (JsPath \ "meta").formatNullable[String]
- )(ApiPartialMessage.apply, unlift(ApiPartialMessage.unapply))
-
- def fromDomain(domain: Message) = ApiPartialMessage(
- text = Some(domain.text),
- recordId = domain.recordId.map(_.id),
- documentId = domain.documentId.map(_.id),
- patientId = domain.patientId.map(_.toString),
- trialId = domain.trialId.map(_.toString),
- startPage = domain.startPage,
- endPage = domain.endPage,
- evidence = domain.evidence,
- archiveRequired = domain.archiveRequired,
- meta = domain.meta
- )
-}
diff --git a/src/main/scala/xyz/driver/pdsuidomain/formats/json/password/PasswordCreateRequest.scala b/src/main/scala/xyz/driver/pdsuidomain/formats/json/password/PasswordCreateRequest.scala
deleted file mode 100644
index 5c12415..0000000
--- a/src/main/scala/xyz/driver/pdsuidomain/formats/json/password/PasswordCreateRequest.scala
+++ /dev/null
@@ -1,9 +0,0 @@
-package xyz.driver.pdsuidomain.formats.json.password
-
-import play.api.libs.json.{Format, Json}
-
-final case class PasswordCreateRequest(password: String, key: String)
-
-object PasswordCreateRequest {
- implicit val format: Format[PasswordCreateRequest] = Json.format[PasswordCreateRequest]
-}
diff --git a/src/main/scala/xyz/driver/pdsuidomain/formats/json/password/PasswordUpdateRequest.scala b/src/main/scala/xyz/driver/pdsuidomain/formats/json/password/PasswordUpdateRequest.scala
deleted file mode 100644
index 07851ea..0000000
--- a/src/main/scala/xyz/driver/pdsuidomain/formats/json/password/PasswordUpdateRequest.scala
+++ /dev/null
@@ -1,9 +0,0 @@
-package xyz.driver.pdsuidomain.formats.json.password
-
-import play.api.libs.json.{Format, Json}
-
-final case class PasswordUpdateRequest(password: String, oldPassword: String)
-
-object PasswordUpdateRequest {
- implicit val format: Format[PasswordUpdateRequest] = Json.format[PasswordUpdateRequest]
-}
diff --git a/src/main/scala/xyz/driver/pdsuidomain/formats/json/sprayformats/patient.scala b/src/main/scala/xyz/driver/pdsuidomain/formats/json/patient.scala
index 2b0dfe5..75eb016 100644
--- a/src/main/scala/xyz/driver/pdsuidomain/formats/json/sprayformats/patient.scala
+++ b/src/main/scala/xyz/driver/pdsuidomain/formats/json/patient.scala
@@ -1,15 +1,15 @@
-package xyz.driver.pdsuidomain.formats.json.sprayformats
+package xyz.driver.pdsuidomain.formats.json
import spray.json._
import xyz.driver.core.json.EnumJsonFormat
-import xyz.driver.pdsuidomain.entities._
import xyz.driver.formats.json.common._
import xyz.driver.formats.json.patient._
+import xyz.driver.pdsuidomain.entities._
object patient {
import DefaultJsonProtocol._
- import common._
import Patient._
+ import common._
implicit val patientStatusFormat = new EnumJsonFormat[Status](
"New" -> Status.New,
@@ -28,7 +28,7 @@ object patient {
}
}
- implicit val patientWriter: RootJsonWriter[Patient] = new RootJsonWriter[Patient] {
+ implicit val patientFormat: RootJsonFormat[Patient] = new RootJsonFormat[Patient] {
override def write(patient: Patient): JsValue =
JsObject(
"id" -> patient.id.toJson,
@@ -43,6 +43,8 @@ object patient {
"disease" -> patient.disease.toJson,
"orderId" -> patient.orderId.toJson
)
+
+ override def read(json: JsValue): Patient = jsonReader[Patient].read(json)
}
}
diff --git a/src/main/scala/xyz/driver/pdsuidomain/formats/json/patient/ApiPatient.scala b/src/main/scala/xyz/driver/pdsuidomain/formats/json/patient/ApiPatient.scala
deleted file mode 100644
index 585d4ed..0000000
--- a/src/main/scala/xyz/driver/pdsuidomain/formats/json/patient/ApiPatient.scala
+++ /dev/null
@@ -1,86 +0,0 @@
-package xyz.driver.pdsuidomain.formats.json.patient
-
-import java.time.{LocalDate, ZoneId, ZonedDateTime}
-import java.util.UUID
-
-import xyz.driver.pdsuicommon.domain.{StringId, UuidId}
-import xyz.driver.pdsuidomain.entities.{Patient, PatientOrderId}
-import play.api.libs.functional.syntax._
-import play.api.libs.json.{Format, JsPath}
-import xyz.driver.entities.common.FullName
-import xyz.driver.entities.patient
-
-final case class ApiPatient(id: String,
- status: String,
- name: String,
- dob: LocalDate,
- assignee: Option[String],
- previousStatus: Option[String],
- previousAssignee: Option[String],
- lastActiveUser: Option[String],
- lastUpdate: ZonedDateTime,
- disease: String,
- orderId: UUID) {
-
- private def extractStatus(status: String): Patient.Status =
- PatientStatus.statusFromString
- .applyOrElse(status, (s: String) => throw new NoSuchElementException(s"Unknown status $s"))
-
- private def parseName(name: String): FullName[Patient] =
- name.split(" ") match {
- case Array() => throw new NoSuchElementException(s"Patient's name cannot be empty")
- case Array(first) => FullName.fromStrings[Patient](first, "", "")
- case Array(first, last) => FullName.fromStrings[Patient](first, "", last)
- case Array(first, middle, last) => FullName.fromStrings[Patient](first, middle, last)
- case _ => throw new NoSuchElementException(s"Patient's name is ambiguous")
- }
-
- def toDomain = Patient(
- id = UuidId(this.id),
- status = extractStatus(this.status),
- name = parseName(this.name),
- dob = this.dob,
- assignee = this.assignee.map(StringId(_)),
- previousStatus = this.previousStatus.map(extractStatus),
- previousAssignee = this.previousAssignee.map(StringId(_)),
- lastActiveUserId = this.lastActiveUser.map(StringId(_)),
- isUpdateRequired = false,
- disease = patient.CancerType
- .fromString(this.disease)
- .getOrElse(throw new IllegalArgumentException(s"Unknown cancer type ${this.disease}")),
- orderId = PatientOrderId(this.orderId),
- lastUpdate = this.lastUpdate.toLocalDateTime
- )
-
-}
-
-object ApiPatient {
-
- implicit val format: Format[ApiPatient] = (
- (JsPath \ "id").format[String] and
- (JsPath \ "status").format[String] and
- (JsPath \ "name").format[String] and
- (JsPath \ "dob").format[LocalDate] and
- (JsPath \ "assignee").formatNullable[String] and
- (JsPath \ "previousStatus").formatNullable[String] and
- (JsPath \ "previousAssignee").formatNullable[String] and
- (JsPath \ "lastActiveUser").formatNullable[String] and
- (JsPath \ "lastUpdate").format[ZonedDateTime] and
- (JsPath \ "disease").format[String] and
- (JsPath \ "orderId").format[UUID]
- )(ApiPatient.apply, unlift(ApiPatient.unapply))
-
- def fromDomain(patient: Patient) = ApiPatient(
- id = patient.id.toString,
- status = PatientStatus.statusToString(patient.status),
- name = patient.name.toString(),
- dob = patient.dob,
- assignee = patient.assignee.map(_.id),
- previousStatus = patient.previousStatus.map(PatientStatus.statusToString),
- previousAssignee = patient.previousAssignee.map(_.id),
- lastActiveUser = patient.lastActiveUserId.map(_.id),
- lastUpdate = ZonedDateTime.of(patient.lastUpdate, ZoneId.of("Z")),
- disease = patient.disease.toString,
- orderId = patient.orderId.id
- )
-}
diff --git a/src/main/scala/xyz/driver/pdsuidomain/formats/json/patient/PatientStatus.scala b/src/main/scala/xyz/driver/pdsuidomain/formats/json/patient/PatientStatus.scala
deleted file mode 100644
index a23a1de..0000000
--- a/src/main/scala/xyz/driver/pdsuidomain/formats/json/patient/PatientStatus.scala
+++ /dev/null
@@ -1,24 +0,0 @@
-package xyz.driver.pdsuidomain.formats.json.patient
-
-import xyz.driver.pdsuidomain.entities.Patient.Status
-
-object PatientStatus {
-
- val statusFromString: PartialFunction[String, Status] = {
- case "New" => Status.New
- case "Verified" => Status.Verified
- case "Reviewed" => Status.Reviewed
- case "Curated" => Status.Curated
- case "Flagged" => Status.Flagged
- case "Done" => Status.Done
- }
-
- def statusToString(x: Status): String = x match {
- case Status.New => "New"
- case Status.Verified => "Verified"
- case Status.Reviewed => "Reviewed"
- case Status.Curated => "Curated"
- case Status.Flagged => "Flagged"
- case Status.Done => "Done"
- }
-}
diff --git a/src/main/scala/xyz/driver/pdsuidomain/formats/json/patient/eligible/ApiPartialPatientEligibleTrial.scala b/src/main/scala/xyz/driver/pdsuidomain/formats/json/patient/eligible/ApiPartialPatientEligibleTrial.scala
deleted file mode 100644
index 03ff275..0000000
--- a/src/main/scala/xyz/driver/pdsuidomain/formats/json/patient/eligible/ApiPartialPatientEligibleTrial.scala
+++ /dev/null
@@ -1,18 +0,0 @@
-package xyz.driver.pdsuidomain.formats.json.patient.eligible
-
-import xyz.driver.pdsuidomain.entities.PatientTrialArmGroupView
-import play.api.libs.json.{Format, Json}
-
-final case class ApiPartialPatientEligibleTrial(isVerified: Option[Boolean]) {
-
- def applyTo(orig: PatientTrialArmGroupView): PatientTrialArmGroupView = {
- orig.copy(
- isVerified = isVerified.getOrElse(orig.isVerified)
- )
- }
-}
-
-object ApiPartialPatientEligibleTrial {
-
- implicit val format: Format[ApiPartialPatientEligibleTrial] = Json.format
-}
diff --git a/src/main/scala/xyz/driver/pdsuidomain/formats/json/patient/eligible/ApiPatientEligibleTrial.scala b/src/main/scala/xyz/driver/pdsuidomain/formats/json/patient/eligible/ApiPatientEligibleTrial.scala
deleted file mode 100644
index 55c8149..0000000
--- a/src/main/scala/xyz/driver/pdsuidomain/formats/json/patient/eligible/ApiPatientEligibleTrial.scala
+++ /dev/null
@@ -1,51 +0,0 @@
-package xyz.driver.pdsuidomain.formats.json.patient.eligible
-
-import java.util.UUID
-
-import play.api.data.validation.ValidationError
-import play.api.libs.functional.syntax._
-import play.api.libs.json._
-import xyz.driver.entities.labels.LabelValue
-import xyz.driver.pdsuidomain.services.PatientEligibleTrialService.RichPatientEligibleTrial
-
-final case class ApiPatientEligibleTrial(id: Long,
- patientId: String,
- trialId: String,
- trialTitle: String,
- arms: List[String],
- hypothesisId: UUID,
- verifiedEligibilityStatus: Option[String],
- isVerified: Boolean)
-
-object ApiPatientEligibleTrial {
-
- implicit val apiEligibleTrialJsonFormat: Format[ApiPatientEligibleTrial] = (
- (JsPath \ "id").format[Long] and
- (JsPath \ "patientId").format[String] and
- (JsPath \ "trialId").format[String] and
- (JsPath \ "trialTitle").format[String] and
- (JsPath \ "arms").format[List[String]] and
- (JsPath \ "hypothesisId").format[UUID] and
- (JsPath \ "verifiedEligibilityStatus").formatNullable[String](Format(
- Reads
- .of[String]
- .filter(ValidationError("unknown eligibility status"))({
- case x if LabelValue.fromString(x).isDefined => true
- case _ => false
- }),
- Writes.of[String]
- )) and
- (JsPath \ "isVerified").format[Boolean]
- )(ApiPatientEligibleTrial.apply, unlift(ApiPatientEligibleTrial.unapply))
-
- def fromDomain(eligibleTrialWithTrial: RichPatientEligibleTrial) = ApiPatientEligibleTrial(
- id = eligibleTrialWithTrial.group.id.id,
- patientId = eligibleTrialWithTrial.group.patientId.toString,
- trialId = eligibleTrialWithTrial.group.trialId.id,
- trialTitle = eligibleTrialWithTrial.trial.title,
- arms = eligibleTrialWithTrial.arms.map(_.armName),
- hypothesisId = eligibleTrialWithTrial.group.hypothesisId.id,
- eligibleTrialWithTrial.group.verifiedEligibilityStatus.map(_.toString),
- eligibleTrialWithTrial.group.isVerified
- )
-}
diff --git a/src/main/scala/xyz/driver/pdsuidomain/formats/json/patient/hypothesis/ApiPartialPatientHypothesis.scala b/src/main/scala/xyz/driver/pdsuidomain/formats/json/patient/hypothesis/ApiPartialPatientHypothesis.scala
deleted file mode 100644
index 0858ce1..0000000
--- a/src/main/scala/xyz/driver/pdsuidomain/formats/json/patient/hypothesis/ApiPartialPatientHypothesis.scala
+++ /dev/null
@@ -1,27 +0,0 @@
-package xyz.driver.pdsuidomain.formats.json.patient.hypothesis
-
-import xyz.driver.pdsuidomain.entities.PatientHypothesis
-import org.davidbild.tristate.Tristate
-import org.davidbild.tristate.contrib.play.ToJsPathOpsFromJsPath
-import play.api.libs.functional.syntax._
-import play.api.libs.json._
-
-final case class ApiPartialPatientHypothesis(rationale: Tristate[String]) {
-
- def applyTo(orig: PatientHypothesis): PatientHypothesis = {
- orig.copy(
- rationale = rationale.cata(Some(_), None, orig.rationale)
- )
- }
-}
-
-object ApiPartialPatientHypothesis {
-
- implicit val reads: Reads[ApiPartialPatientHypothesis] =
- (__ \ "rationale").readTristate[String].map(x => ApiPartialPatientHypothesis(x))
-
- implicit val writes: Writes[ApiPartialPatientHypothesis] =
- (__ \ "rationale").writeTristate[String].contramap(_.rationale)
-
- implicit val format: Format[ApiPartialPatientHypothesis] = Format(reads, writes)
-}
diff --git a/src/main/scala/xyz/driver/pdsuidomain/formats/json/patient/hypothesis/ApiPatientHypothesis.scala b/src/main/scala/xyz/driver/pdsuidomain/formats/json/patient/hypothesis/ApiPatientHypothesis.scala
deleted file mode 100644
index 584ff72..0000000
--- a/src/main/scala/xyz/driver/pdsuidomain/formats/json/patient/hypothesis/ApiPatientHypothesis.scala
+++ /dev/null
@@ -1,35 +0,0 @@
-package xyz.driver.pdsuidomain.formats.json.patient.hypothesis
-
-import java.util.UUID
-
-import xyz.driver.pdsuidomain.entities.PatientHypothesis
-import play.api.libs.functional.syntax._
-import play.api.libs.json._
-
-final case class ApiPatientHypothesis(id: UUID,
- patientId: String,
- hypothesisId: UUID,
- matchedTrials: Long,
- rationale: Option[String],
- isRationaleRequired: Boolean)
-
-object ApiPatientHypothesis {
-
- implicit val apiPatientHypothesisJsonFormat: Format[ApiPatientHypothesis] = (
- (JsPath \ "id").format[UUID] and
- (JsPath \ "patientId").format[String] and
- (JsPath \ "hypothesisId").format[UUID] and
- (JsPath \ "matchedTrials").format[Long] and
- (JsPath \ "rationale").formatNullable[String] and
- (JsPath \ "isRationaleRequired").format[Boolean]
- )(ApiPatientHypothesis.apply, unlift(ApiPatientHypothesis.unapply))
-
- def fromDomain(patientHypothesis: PatientHypothesis, isRationaleRequired: Boolean) = ApiPatientHypothesis(
- id = patientHypothesis.id.id,
- patientId = patientHypothesis.patientId.toString,
- hypothesisId = patientHypothesis.hypothesisId.id,
- matchedTrials = patientHypothesis.matchedTrials,
- rationale = patientHypothesis.rationale,
- isRationaleRequired = isRationaleRequired
- )
-}
diff --git a/src/main/scala/xyz/driver/pdsuidomain/formats/json/patient/label/ApiPartialPatientLabel.scala b/src/main/scala/xyz/driver/pdsuidomain/formats/json/patient/label/ApiPartialPatientLabel.scala
deleted file mode 100644
index d92872c..0000000
--- a/src/main/scala/xyz/driver/pdsuidomain/formats/json/patient/label/ApiPartialPatientLabel.scala
+++ /dev/null
@@ -1,43 +0,0 @@
-package xyz.driver.pdsuidomain.formats.json.patient.label
-
-import xyz.driver.pdsuidomain.entities.PatientLabel
-import org.davidbild.tristate.Tristate
-import org.davidbild.tristate.contrib.play.ToJsPathOpsFromJsPath
-import play.api.data.validation.ValidationError
-import play.api.libs.functional.syntax._
-import play.api.libs.json._
-import xyz.driver.entities.labels.LabelValue
-
-final case class ApiPartialPatientLabel(primaryValue: Option[String], verifiedPrimaryValue: Tristate[String]) {
-
- def applyTo(orig: PatientLabel): PatientLabel = {
- orig.copy(
- primaryValue = primaryValue.flatMap(LabelValue.fromString).orElse(orig.primaryValue),
- verifiedPrimaryValue = verifiedPrimaryValue.cata(x => LabelValue.fromString(x), None, orig.verifiedPrimaryValue)
- )
- }
-}
-
-object ApiPartialPatientLabel {
-
- implicit val format: Format[ApiPartialPatientLabel] = (
- (JsPath \ "primaryValue").formatNullable[String](
- Format(Reads
- .of[String]
- .filter(ValidationError("unknown primary value"))({
- case x if LabelValue.fromString(x).isDefined => true
- case _ => false
- }),
- Writes.of[String])) and
- (JsPath \ "verifiedPrimaryValue").formatTristate[String](
- Format(
- Reads
- .of[String]
- .filter(ValidationError("unknown verified primary value"))({
- case x if LabelValue.fromString(x).isDefined => true
- case _ => false
- }),
- Writes.of[String]
- ))
- )(ApiPartialPatientLabel.apply, unlift(ApiPartialPatientLabel.unapply))
-}
diff --git a/src/main/scala/xyz/driver/pdsuidomain/formats/json/patient/label/ApiPatientLabel.scala b/src/main/scala/xyz/driver/pdsuidomain/formats/json/patient/label/ApiPatientLabel.scala
deleted file mode 100644
index cc8532d..0000000
--- a/src/main/scala/xyz/driver/pdsuidomain/formats/json/patient/label/ApiPatientLabel.scala
+++ /dev/null
@@ -1,55 +0,0 @@
-package xyz.driver.pdsuidomain.formats.json.patient.label
-
-import xyz.driver.pdsuidomain.entities.PatientLabel
-import play.api.data.validation.ValidationError
-import play.api.libs.functional.syntax._
-import play.api.libs.json._
-import xyz.driver.entities.labels.LabelValue
-
-final case class ApiPatientLabel(id: Long,
- labelId: Long,
- primaryValue: Option[String],
- verifiedPrimaryValue: Option[String],
- score: Int,
- isImplicitMatch: Boolean,
- isVisible: Boolean,
- isVerified: Boolean)
-
-object ApiPatientLabel {
-
- implicit val apiPatientLabelJsonFormat: Format[ApiPatientLabel] = (
- (JsPath \ "id").format[Long] and
- (JsPath \ "labelId").format[Long] and
- (JsPath \ "primaryValue").formatNullable[String](
- Format(Reads
- .of[String]
- .filter(ValidationError("unknown value"))({
- case x if LabelValue.fromString(x).isDefined => true
- case _ => false
- }),
- Writes.of[String])) and
- (JsPath \ "verifiedPrimaryValue").formatNullable[String](
- Format(Reads
- .of[String]
- .filter(ValidationError("unknown value"))({
- case x if LabelValue.fromString(x).isDefined => true
- case _ => false
- }),
- Writes.of[String])) and
- (JsPath \ "score").format[Int] and
- (JsPath \ "isImplicitMatch").format[Boolean] and
- (JsPath \ "isVisible").format[Boolean] and
- (JsPath \ "isVerified").format[Boolean]
- )(ApiPatientLabel.apply, unlift(ApiPatientLabel.unapply))
-
- def fromDomain(patientLabel: PatientLabel, isVerified: Boolean): ApiPatientLabel = ApiPatientLabel(
- id = patientLabel.id.id,
- labelId = patientLabel.labelId.id,
- primaryValue = patientLabel.primaryValue.map(_.toString),
- verifiedPrimaryValue = patientLabel.verifiedPrimaryValue.map(_.toString),
- score = patientLabel.score,
- isImplicitMatch = patientLabel.isImplicitMatch,
- isVisible = patientLabel.isVisible,
- isVerified = isVerified
- )
-}
diff --git a/src/main/scala/xyz/driver/pdsuidomain/formats/json/patient/label/ApiPatientLabelDefiningCriteria.scala b/src/main/scala/xyz/driver/pdsuidomain/formats/json/patient/label/ApiPatientLabelDefiningCriteria.scala
deleted file mode 100644
index 16b9cc9..0000000
--- a/src/main/scala/xyz/driver/pdsuidomain/formats/json/patient/label/ApiPatientLabelDefiningCriteria.scala
+++ /dev/null
@@ -1,29 +0,0 @@
-package xyz.driver.pdsuidomain.formats.json.patient.label
-
-import play.api.data.validation.ValidationError
-import play.api.libs.functional.syntax._
-import play.api.libs.json._
-import xyz.driver.entities.labels.LabelValue
-import xyz.driver.pdsuidomain.entities.PatientLabel
-
-final case class ApiPatientLabelDefiningCriteria(labelId: Long, value: Option[String])
-
-object ApiPatientLabelDefiningCriteria {
-
- implicit val format: Format[ApiPatientLabelDefiningCriteria] = (
- (JsPath \ "labelId").format[Long] and
- (JsPath \ "value").formatNullable[String](
- Format(Reads
- .of[String]
- .filter(ValidationError("unknown value"))({
- case x if LabelValue.fromString(x).isDefined => true
- case _ => false
- }),
- Writes.of[String]))
- )(ApiPatientLabelDefiningCriteria.apply, unlift(ApiPatientLabelDefiningCriteria.unapply))
-
- def fromDomain(x: PatientLabel) = ApiPatientLabelDefiningCriteria(
- labelId = x.labelId.id,
- value = x.verifiedPrimaryValue.map(_.toString)
- )
-}
diff --git a/src/main/scala/xyz/driver/pdsuidomain/formats/json/patient/trial/ApiPartialPatientCriterion.scala b/src/main/scala/xyz/driver/pdsuidomain/formats/json/patient/trial/ApiPartialPatientCriterion.scala
deleted file mode 100644
index 09538b8..0000000
--- a/src/main/scala/xyz/driver/pdsuidomain/formats/json/patient/trial/ApiPartialPatientCriterion.scala
+++ /dev/null
@@ -1,47 +0,0 @@
-package xyz.driver.pdsuidomain.formats.json.patient.trial
-
-import xyz.driver.pdsuidomain.entities.PatientCriterion
-import org.davidbild.tristate.Tristate
-import org.davidbild.tristate.contrib.play.ToJsPathOpsFromJsPath
-import play.api.data.validation.ValidationError
-import play.api.libs.functional.syntax._
-import play.api.libs.json.{Format, JsPath, Reads, Writes}
-import xyz.driver.entities.labels.LabelValue
-
-final case class ApiPartialPatientCriterion(eligibilityStatus: Option[String],
- verifiedEligibilityStatus: Tristate[String]) {
-
- def applyTo(orig: PatientCriterion): PatientCriterion = {
- orig.copy(
- eligibilityStatus = eligibilityStatus.flatMap(LabelValue.fromString).orElse(orig.eligibilityStatus),
- verifiedEligibilityStatus =
- verifiedEligibilityStatus.cata(x => LabelValue.fromString(x), None, orig.verifiedEligibilityStatus)
- )
- }
-}
-
-object ApiPartialPatientCriterion {
-
- implicit val format: Format[ApiPartialPatientCriterion] = (
- (JsPath \ "eligibilityStatus").formatNullable[String](
- Format(
- Reads
- .of[String]
- .filter(ValidationError("unknown eligibility status"))({
- case x if LabelValue.fromString(x).isDefined => true
- case _ => false
- }),
- Writes.of[String]
- )) and
- (JsPath \ "verifiedEligibilityStatus").formatTristate[String](
- Format(
- Reads
- .of[String]
- .filter(ValidationError("unknown verified eligibility status"))({
- case x if LabelValue.fromString(x).isDefined => true
- case _ => false
- }),
- Writes.of[String]
- ))
- )(ApiPartialPatientCriterion.apply, unlift(ApiPartialPatientCriterion.unapply))
-}
diff --git a/src/main/scala/xyz/driver/pdsuidomain/formats/json/patient/trial/ApiPartialPatientCriterionList.scala b/src/main/scala/xyz/driver/pdsuidomain/formats/json/patient/trial/ApiPartialPatientCriterionList.scala
deleted file mode 100644
index b7616a1..0000000
--- a/src/main/scala/xyz/driver/pdsuidomain/formats/json/patient/trial/ApiPartialPatientCriterionList.scala
+++ /dev/null
@@ -1,37 +0,0 @@
-package xyz.driver.pdsuidomain.formats.json.patient.trial
-
-import xyz.driver.pdsuicommon.domain.LongId
-import xyz.driver.pdsuidomain.entities.PatientCriterion
-import play.api.data.validation.ValidationError
-import play.api.libs.functional.syntax._
-import play.api.libs.json.{Format, JsPath, Reads, Writes}
-import xyz.driver.entities.labels.LabelValue
-import xyz.driver.pdsuidomain.services.PatientCriterionService.DraftPatientCriterion
-
-final case class ApiPartialPatientCriterionList(id: Long,
- eligibilityStatus: Option[String],
- isVerified: Option[Boolean]) {
-
- def toDomain: DraftPatientCriterion = DraftPatientCriterion(
- id = LongId[PatientCriterion](id),
- eligibilityStatus = eligibilityStatus.flatMap(LabelValue.fromString),
- isVerified = isVerified
- )
-}
-
-object ApiPartialPatientCriterionList {
-
- implicit val format: Format[ApiPartialPatientCriterionList] = (
- (JsPath \ "id").format[Long] and
- (JsPath \ "eligibilityStatus").formatNullable[String](Format(
- Reads
- .of[String]
- .filter(ValidationError("unknown eligibility status"))({
- case x if LabelValue.fromString(x).isDefined => true
- case _ => false
- }),
- Writes.of[String]
- )) and
- (JsPath \ "isVerified").formatNullable[Boolean]
- )(ApiPartialPatientCriterionList.apply, unlift(ApiPartialPatientCriterionList.unapply))
-}
diff --git a/src/main/scala/xyz/driver/pdsuidomain/formats/json/patient/trial/ApiPatientCriterion.scala b/src/main/scala/xyz/driver/pdsuidomain/formats/json/patient/trial/ApiPatientCriterion.scala
index 5e44413..8b13789 100644
--- a/src/main/scala/xyz/driver/pdsuidomain/formats/json/patient/trial/ApiPatientCriterion.scala
+++ b/src/main/scala/xyz/driver/pdsuidomain/formats/json/patient/trial/ApiPatientCriterion.scala
@@ -1,78 +1 @@
-package xyz.driver.pdsuidomain.formats.json.patient.trial
-import java.time.{ZoneId, ZonedDateTime}
-
-import xyz.driver.pdsuicommon.domain.LongId
-import xyz.driver.pdsuidomain.entities.{PatientCriterion, PatientCriterionArm}
-import play.api.data.validation.ValidationError
-import play.api.libs.functional.syntax._
-import play.api.libs.json.{Format, JsPath, Reads, Writes}
-import xyz.driver.entities.labels.{Label, LabelValue}
-
-final case class ApiPatientCriterion(id: Long,
- labelId: Long,
- nctId: String,
- criterionId: Long,
- criterionText: String,
- criterionValue: Option[String],
- criterionIsDefining: Boolean,
- criterionIsCompound: Boolean,
- arms: List[String],
- eligibilityStatus: Option[String],
- verifiedEligibilityStatus: Option[String],
- isVerified: Boolean,
- isVisible: Boolean,
- lastUpdate: ZonedDateTime,
- inclusion: Option[Boolean])
-
-object ApiPatientCriterion {
-
- implicit val format: Format[ApiPatientCriterion] = (
- (JsPath \ "id").format[Long] and
- (JsPath \ "labelId").format[Long] and
- (JsPath \ "nctId").format[String] and
- (JsPath \ "criterionId").format[Long] and
- (JsPath \ "criterionText").format[String] and
- (JsPath \ "criterionValue").formatNullable[String](Format(Reads.of[String].filter(ValidationError("unknown value"))({ x =>
- x == "Yes" || x == "No"
- }), Writes.of[String])) and
- (JsPath \ "criterionIsDefining").format[Boolean] and
- (JsPath \ "criterionIsCompound").format[Boolean] and
- (JsPath \ "arms").format[List[String]] and
- (JsPath \ "eligibilityStatus").formatNullable[String](Format(Reads.of[String].filter(ValidationError("unknown status"))({
- case x if LabelValue.fromString(x).isDefined => true
- case _ => false
- }), Writes.of[String])) and
- (JsPath \ "verifiedEligibilityStatus").formatNullable[String](Format(
- Reads.of[String].filter(ValidationError("unknown status"))({
- case x if LabelValue.fromString(x).isDefined => true
- case _ => false
- }), Writes.of[String])) and
- (JsPath \ "isVerified").format[Boolean] and
- (JsPath \ "isVisible").format[Boolean] and
- (JsPath \ "lastUpdate").format[ZonedDateTime] and
- (JsPath \ "inclusion").formatNullable[Boolean]
- ) (ApiPatientCriterion.apply, unlift(ApiPatientCriterion.unapply))
-
- def fromDomain(patientCriterion: PatientCriterion,
- labelId: LongId[Label],
- arms: List[PatientCriterionArm]) = ApiPatientCriterion(
- id = patientCriterion.id.id,
- labelId = labelId.id,
- nctId = patientCriterion.nctId.id,
- criterionId = patientCriterion.criterionId.id,
- criterionText = patientCriterion.criterionText,
- criterionValue = patientCriterion.criterionValue.map { x =>
- LabelValue.fromBoolean(x).toString
- },
- criterionIsDefining = patientCriterion.criterionIsDefining,
- criterionIsCompound = patientCriterion.criterionValue.isEmpty,
- arms = arms.map(_.armName),
- eligibilityStatus = patientCriterion.eligibilityStatus.map(_.toString),
- verifiedEligibilityStatus = patientCriterion.verifiedEligibilityStatus.map(_.toString),
- isVerified = patientCriterion.isVerified,
- isVisible = patientCriterion.isVisible,
- lastUpdate = ZonedDateTime.of(patientCriterion.lastUpdate, ZoneId.of("Z")),
- inclusion = patientCriterion.inclusion
- )
-}
diff --git a/src/main/scala/xyz/driver/pdsuidomain/formats/json/sprayformats/patientcriterion.scala b/src/main/scala/xyz/driver/pdsuidomain/formats/json/patientcriterion.scala
index 2cad78c..fbefd33 100644
--- a/src/main/scala/xyz/driver/pdsuidomain/formats/json/sprayformats/patientcriterion.scala
+++ b/src/main/scala/xyz/driver/pdsuidomain/formats/json/patientcriterion.scala
@@ -1,10 +1,10 @@
-package xyz.driver.pdsuidomain.formats.json.sprayformats
+package xyz.driver.pdsuidomain.formats.json
import spray.json._
import xyz.driver.entities.labels.LabelValue
+import xyz.driver.formats.json.labels._
import xyz.driver.pdsuidomain.entities._
import xyz.driver.pdsuidomain.services.PatientCriterionService.{DraftPatientCriterion, RichPatientCriterion}
-import xyz.driver.formats.json.labels._
object patientcriterion {
import DefaultJsonProtocol._
diff --git a/src/main/scala/xyz/driver/pdsuidomain/formats/json/sprayformats/patientdefiningcriteria.scala b/src/main/scala/xyz/driver/pdsuidomain/formats/json/patientdefiningcriteria.scala
index 746c7b4..0b4fbae 100644
--- a/src/main/scala/xyz/driver/pdsuidomain/formats/json/sprayformats/patientdefiningcriteria.scala
+++ b/src/main/scala/xyz/driver/pdsuidomain/formats/json/patientdefiningcriteria.scala
@@ -1,8 +1,8 @@
-package xyz.driver.pdsuidomain.formats.json.sprayformats
+package xyz.driver.pdsuidomain.formats.json
import spray.json._
-import xyz.driver.pdsuidomain.entities.PatientLabel
import xyz.driver.formats.json.labels._
+import xyz.driver.pdsuidomain.entities.PatientLabel
object patientdefiningcriteria {
import DefaultJsonProtocol._
diff --git a/src/main/scala/xyz/driver/pdsuidomain/formats/json/sprayformats/patienteligibletrial.scala b/src/main/scala/xyz/driver/pdsuidomain/formats/json/patienteligibletrial.scala
index 342d3a8..4c006f9 100644
--- a/src/main/scala/xyz/driver/pdsuidomain/formats/json/sprayformats/patienteligibletrial.scala
+++ b/src/main/scala/xyz/driver/pdsuidomain/formats/json/patienteligibletrial.scala
@@ -1,9 +1,9 @@
-package xyz.driver.pdsuidomain.formats.json.sprayformats
+package xyz.driver.pdsuidomain.formats.json
import spray.json._
+import xyz.driver.formats.json.labels._
import xyz.driver.pdsuidomain.entities._
import xyz.driver.pdsuidomain.services.PatientEligibleTrialService.RichPatientEligibleTrial
-import xyz.driver.formats.json.labels._
object patienteligibletrial {
import DefaultJsonProtocol._
diff --git a/src/main/scala/xyz/driver/pdsuidomain/formats/json/sprayformats/patienthistory.scala b/src/main/scala/xyz/driver/pdsuidomain/formats/json/patienthistory.scala
index da7a664..bd20b27 100644
--- a/src/main/scala/xyz/driver/pdsuidomain/formats/json/sprayformats/patienthistory.scala
+++ b/src/main/scala/xyz/driver/pdsuidomain/formats/json/patienthistory.scala
@@ -1,4 +1,4 @@
-package xyz.driver.pdsuidomain.formats.json.sprayformats
+package xyz.driver.pdsuidomain.formats.json
import spray.json._
import xyz.driver.core.json.EnumJsonFormat
@@ -6,8 +6,8 @@ import xyz.driver.pdsuidomain.entities._
object patienthistory {
import DefaultJsonProtocol._
- import common._
import PatientHistory._
+ import common._
implicit val patientStateFormat = new EnumJsonFormat[State](
"Verify" -> State.Verify,
diff --git a/src/main/scala/xyz/driver/pdsuidomain/formats/json/patienthistory/ApiPatientHistory.scala b/src/main/scala/xyz/driver/pdsuidomain/formats/json/patienthistory/ApiPatientHistory.scala
deleted file mode 100644
index cdcd510..0000000
--- a/src/main/scala/xyz/driver/pdsuidomain/formats/json/patienthistory/ApiPatientHistory.scala
+++ /dev/null
@@ -1,28 +0,0 @@
-package xyz.driver.pdsuidomain.formats.json.patienthistory
-
-import java.time.{ZoneId, ZonedDateTime}
-import java.util.UUID
-
-import play.api.libs.json.{Format, Json}
-import xyz.driver.pdsuidomain.entities.PatientHistory
-
-final case class ApiPatientHistory(id: Long,
- executor: String,
- patientId: UUID,
- state: String,
- action: String,
- created: ZonedDateTime)
-
-object ApiPatientHistory {
- implicit val format: Format[ApiPatientHistory] =
- Json.format[ApiPatientHistory]
-
- def fromDomain(x: PatientHistory) = ApiPatientHistory(
- id = x.id.id,
- executor = x.executor.id,
- patientId = x.patientId.id,
- state = PatientHistory.State.stateToString(x.state),
- action = PatientHistory.Action.actionToString(x.action),
- created = ZonedDateTime.of(x.created, ZoneId.of("Z"))
- )
-}
diff --git a/src/main/scala/xyz/driver/pdsuidomain/formats/json/sprayformats/patienthypothesis.scala b/src/main/scala/xyz/driver/pdsuidomain/formats/json/patienthypothesis.scala
index b8c0058..a36bac2 100644
--- a/src/main/scala/xyz/driver/pdsuidomain/formats/json/sprayformats/patienthypothesis.scala
+++ b/src/main/scala/xyz/driver/pdsuidomain/formats/json/patienthypothesis.scala
@@ -1,4 +1,4 @@
-package xyz.driver.pdsuidomain.formats.json.sprayformats
+package xyz.driver.pdsuidomain.formats.json
import spray.json._
import xyz.driver.pdsuidomain.entities._
diff --git a/src/main/scala/xyz/driver/pdsuidomain/formats/json/sprayformats/patientissue.scala b/src/main/scala/xyz/driver/pdsuidomain/formats/json/patientissue.scala
index d325a53..5a2955f 100644
--- a/src/main/scala/xyz/driver/pdsuidomain/formats/json/sprayformats/patientissue.scala
+++ b/src/main/scala/xyz/driver/pdsuidomain/formats/json/patientissue.scala
@@ -1,4 +1,4 @@
-package xyz.driver.pdsuidomain.formats.json.sprayformats
+package xyz.driver.pdsuidomain.formats.json
import java.time.LocalDateTime
diff --git a/src/main/scala/xyz/driver/pdsuidomain/formats/json/patientissue/ApiPartialPatientIssue.scala b/src/main/scala/xyz/driver/pdsuidomain/formats/json/patientissue/ApiPartialPatientIssue.scala
deleted file mode 100644
index eadd1f8..0000000
--- a/src/main/scala/xyz/driver/pdsuidomain/formats/json/patientissue/ApiPartialPatientIssue.scala
+++ /dev/null
@@ -1,33 +0,0 @@
-package xyz.driver.pdsuidomain.formats.json.patientissue
-
-import java.time.LocalDateTime
-
-import play.api.libs.functional.syntax._
-import play.api.libs.json._
-import xyz.driver.pdsuicommon.domain._
-import xyz.driver.pdsuidomain.entities.{Patient, PatientIssue}
-
-final case class ApiPartialPatientIssue(text: String, archiveRequired: Boolean) {
- def applyTo(x: PatientIssue): PatientIssue = x.copy(
- text = text,
- archiveRequired = archiveRequired
- )
-
- def toDomain(userId: StringId[User], patientId: UuidId[Patient]) =
- PatientIssue(
- id = LongId(0),
- userId = userId,
- patientId = patientId,
- lastUpdate = LocalDateTime.MIN,
- isDraft = true,
- text = text,
- archiveRequired = false
- )
-}
-
-object ApiPartialPatientIssue {
- implicit val format: Format[ApiPartialPatientIssue] = (
- (JsPath \ "text").format[String] and
- (JsPath \ "archiveRequired").format[Boolean]
- )(ApiPartialPatientIssue.apply, unlift(ApiPartialPatientIssue.unapply))
-}
diff --git a/src/main/scala/xyz/driver/pdsuidomain/formats/json/patientissue/ApiPatientIssue.scala b/src/main/scala/xyz/driver/pdsuidomain/formats/json/patientissue/ApiPatientIssue.scala
deleted file mode 100644
index d1a216c..0000000
--- a/src/main/scala/xyz/driver/pdsuidomain/formats/json/patientissue/ApiPatientIssue.scala
+++ /dev/null
@@ -1,34 +0,0 @@
-package xyz.driver.pdsuidomain.formats.json.patientissue
-
-import java.time.{ZoneId, ZonedDateTime}
-
-import play.api.libs.functional.syntax._
-import play.api.libs.json._
-import xyz.driver.pdsuidomain.entities.PatientIssue
-
-final case class ApiPatientIssue(id: Long,
- text: String,
- lastUpdate: ZonedDateTime,
- userId: String,
- isDraft: Boolean,
- archiveRequired: Boolean)
-
-object ApiPatientIssue {
- implicit val format: Format[ApiPatientIssue] = (
- (JsPath \ "id").format[Long] and
- (JsPath \ "text").format[String] and
- (JsPath \ "lastUpdate").format[ZonedDateTime] and
- (JsPath \ "userId").format[String] and
- (JsPath \ "isDraft").format[Boolean] and
- (JsPath \ "archiveRequired").format[Boolean]
- )(ApiPatientIssue.apply, unlift(ApiPatientIssue.unapply))
-
- def fromDomain(x: PatientIssue) = ApiPatientIssue(
- id = x.id.id,
- text = x.text,
- lastUpdate = ZonedDateTime.of(x.lastUpdate, ZoneId.of("Z")),
- userId = x.userId.id,
- isDraft = x.isDraft,
- archiveRequired = x.archiveRequired
- )
-}
diff --git a/src/main/scala/xyz/driver/pdsuidomain/formats/json/sprayformats/patientlabel.scala b/src/main/scala/xyz/driver/pdsuidomain/formats/json/patientlabel.scala
index 57dca1e..15fec45 100644
--- a/src/main/scala/xyz/driver/pdsuidomain/formats/json/sprayformats/patientlabel.scala
+++ b/src/main/scala/xyz/driver/pdsuidomain/formats/json/patientlabel.scala
@@ -1,12 +1,13 @@
-package xyz.driver.pdsuidomain.formats.json.sprayformats
+package xyz.driver.pdsuidomain.formats.json
import spray.json._
import xyz.driver.entities.labels.LabelValue
+import xyz.driver.formats.json.labels._
import xyz.driver.pdsuidomain.entities._
import xyz.driver.pdsuidomain.services.PatientLabelService.RichPatientLabel
import xyz.driver.formats.json.labels._
-import xyz.driver.pdsuidomain.formats.json.sprayformats.record._
-import xyz.driver.pdsuidomain.formats.json.sprayformats.document._
+import xyz.driver.pdsuidomain.formats.json.record._
+import xyz.driver.pdsuidomain.formats.json.document._
object patientlabel {
import DefaultJsonProtocol._
diff --git a/src/main/scala/xyz/driver/pdsuidomain/formats/json/queue/ApiQueueUploadItem.scala b/src/main/scala/xyz/driver/pdsuidomain/formats/json/queue/ApiQueueUploadItem.scala
deleted file mode 100644
index cd76670..0000000
--- a/src/main/scala/xyz/driver/pdsuidomain/formats/json/queue/ApiQueueUploadItem.scala
+++ /dev/null
@@ -1,38 +0,0 @@
-package xyz.driver.pdsuidomain.formats.json.queue
-
-import java.time.LocalDateTime
-
-import xyz.driver.pdsuicommon.concurrent.BridgeUploadQueue
-import play.api.libs.json.{Format, Json}
-
-final case class ApiQueueUploadItem(kind: String,
- tag: String,
- created: LocalDateTime,
- attempts: Int,
- nextAttempt: LocalDateTime,
- completed: Boolean) {
- def toDomain = BridgeUploadQueue.Item(
- kind = kind,
- tag = tag,
- created = created,
- attempts = attempts,
- nextAttempt = nextAttempt,
- completed = true,
- dependencyKind = None,
- dependencyTag = None
- )
-}
-
-object ApiQueueUploadItem {
-
- def fromDomain(domain: BridgeUploadQueue.Item) = ApiQueueUploadItem(
- kind = domain.kind,
- tag = domain.tag,
- created = domain.created,
- attempts = domain.attempts,
- nextAttempt = domain.nextAttempt,
- completed = domain.completed
- )
-
- implicit val format: Format[ApiQueueUploadItem] = Json.format[ApiQueueUploadItem]
-}
diff --git a/src/main/scala/xyz/driver/pdsuidomain/formats/json/sprayformats/record.scala b/src/main/scala/xyz/driver/pdsuidomain/formats/json/record.scala
index 60ae437..b6ed103 100644
--- a/src/main/scala/xyz/driver/pdsuidomain/formats/json/sprayformats/record.scala
+++ b/src/main/scala/xyz/driver/pdsuidomain/formats/json/record.scala
@@ -1,4 +1,4 @@
-package xyz.driver.pdsuidomain.formats.json.sprayformats
+package xyz.driver.pdsuidomain.formats.json
import java.time.LocalDateTime
import java.util.UUID
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
deleted file mode 100644
index fd14f7c..0000000
--- a/src/main/scala/xyz/driver/pdsuidomain/formats/json/record/ApiCreateRecord.scala
+++ /dev/null
@@ -1,33 +0,0 @@
-package xyz.driver.pdsuidomain.formats.json.record
-
-import java.time.LocalDateTime
-import java.util.UUID
-
-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) {
-
- def toDomain = MedicalRecord(
- id = LongId(0),
- status = MedicalRecord.Status.New,
- previousStatus = None,
- assignee = None,
- previousAssignee = None,
- lastActiveUserId = None,
- patientId = UuidId(patientId),
- requestId = RecordRequestId(requestId),
- disease = disease,
- caseId = None,
- physician = None,
- meta = None,
- lastUpdate = LocalDateTime.now(),
- totalPages = 0
- )
-}
-
-object ApiCreateRecord {
-
- implicit val format: Format[ApiCreateRecord] = Json.format[ApiCreateRecord]
-}
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
deleted file mode 100644
index 00441a1..0000000
--- a/src/main/scala/xyz/driver/pdsuidomain/formats/json/record/ApiRecord.scala
+++ /dev/null
@@ -1,110 +0,0 @@
-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}
-
-object ApiRecord {
-
- private val emptyMeta: String =
- "[]"
-
- private val statusFormat = Format(
- Reads.StringReads.filter(ValidationError("unknown status")) {
- case x if MedicalRecordStatus.statusFromString.isDefinedAt(x) => true
- case _ => false
- },
- Writes.StringWrites
- )
-
- implicit val format: Format[ApiRecord] = (
- (JsPath \ "id").format[Long] and
- (JsPath \ "patientId").format[String] and
- (JsPath \ "caseId").formatNullable[String] and
- (JsPath \ "disease").format[String] and
- (JsPath \ "physician").formatNullable[String] and
- (JsPath \ "lastUpdate").format[ZonedDateTime] and
- (JsPath \ "status").format(statusFormat) and
- (JsPath \ "previousStatus").formatNullable(statusFormat) and
- (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))) and
- (JsPath \ "totalPages").format[Int]
- )(ApiRecord.apply, unlift(ApiRecord.unapply))
-
- def fromDomain(record: MedicalRecord) = ApiRecord(
- id = record.id.id,
- patientId = record.patientId.toString,
- caseId = record.caseId.map(_.id),
- disease = record.disease,
- physician = record.physician,
- lastUpdate = ZonedDateTime.of(record.lastUpdate, ZoneId.of("Z")),
- status = MedicalRecordStatus.statusToString(record.status),
- previousStatus = record.previousStatus.map(MedicalRecordStatus.statusToString),
- 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(emptyMeta),
- totalPages = record.totalPages
- )
-}
-
-final case class ApiRecord(id: Long,
- patientId: String,
- caseId: Option[String],
- disease: String,
- physician: Option[String],
- lastUpdate: ZonedDateTime,
- status: String,
- previousStatus: Option[String],
- assignee: Option[String],
- previousAssignee: Option[String],
- lastActiveUser: Option[String],
- requestId: UUID,
- meta: String,
- totalPages: Int) {
-
- 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 = {
- if (this.meta == ApiRecord.emptyMeta) {
- None
- } else {
- Some(TextJson(JsonSerializer.deserialize[List[MedicalRecord.Meta]](this.meta)))
- }
- },
- lastUpdate = this.lastUpdate.toLocalDateTime,
- totalPages = 0
- )
-}
diff --git a/src/main/scala/xyz/driver/pdsuidomain/formats/json/record/ApiUpdateRecord.scala b/src/main/scala/xyz/driver/pdsuidomain/formats/json/record/ApiUpdateRecord.scala
deleted file mode 100644
index 05d5a60..0000000
--- a/src/main/scala/xyz/driver/pdsuidomain/formats/json/record/ApiUpdateRecord.scala
+++ /dev/null
@@ -1,52 +0,0 @@
-package xyz.driver.pdsuidomain.formats.json.record
-
-import org.davidbild.tristate.Tristate
-import org.davidbild.tristate.contrib.play.ToJsPathOpsFromJsPath
-import play.api.data.validation.ValidationError
-import play.api.libs.functional.syntax._
-import play.api.libs.json._
-import xyz.driver.pdsuicommon.domain.{StringId, TextJson, User}
-import xyz.driver.pdsuicommon.json.JsonSerializer
-import xyz.driver.pdsuidomain.entities.MedicalRecord.Meta
-import xyz.driver.pdsuidomain.entities._
-
-final case class ApiUpdateRecord(status: Option[String], assignee: Tristate[String], meta: Tristate[String]) {
-
- def applyTo(orig: MedicalRecord): MedicalRecord = {
- orig.copy(
- status = status.map(MedicalRecordStatus.statusFromString).getOrElse(orig.status),
- assignee = assignee.map(StringId[User]).cata(Some(_), None, orig.assignee),
- meta = meta.cata(x => Some(TextJson(JsonSerializer.deserialize[List[Meta]](x))), None, orig.meta)
- )
- }
-}
-
-object ApiUpdateRecord {
-
- private val reads: Reads[ApiUpdateRecord] = (
- (JsPath \ "status").readNullable[String](
- Reads
- .of[String]
- .filter(ValidationError("unknown status"))({
- case x if MedicalRecordStatus.statusFromString.isDefinedAt(x) => true
- case _ => false
- })) and
- (JsPath \ "assignee").readTristate[String] and
- (JsPath \ "meta")
- .readTristate(Reads { x =>
- JsSuccess(Json.stringify(x))
- })
- .map {
- case Tristate.Present("[]") => Tristate.Absent
- case x => x
- }
- )(ApiUpdateRecord.apply _)
-
- private val writes: Writes[ApiUpdateRecord] = (
- (JsPath \ "status").writeNullable[String] and
- (JsPath \ "assignee").writeTristate[String] and
- (JsPath \ "meta").writeTristate(Writes[String](Json.parse))
- )(unlift(ApiUpdateRecord.unapply))
-
- implicit val format: Format[ApiUpdateRecord] = Format(reads, writes)
-}
diff --git a/src/main/scala/xyz/driver/pdsuidomain/formats/json/record/MedicalRecordStatus.scala b/src/main/scala/xyz/driver/pdsuidomain/formats/json/record/MedicalRecordStatus.scala
deleted file mode 100644
index a77b76b..0000000
--- a/src/main/scala/xyz/driver/pdsuidomain/formats/json/record/MedicalRecordStatus.scala
+++ /dev/null
@@ -1,34 +0,0 @@
-package xyz.driver.pdsuidomain.formats.json.record
-
-import xyz.driver.pdsuidomain.entities.MedicalRecord.Status
-
-object MedicalRecordStatus {
-
- val statusFromString: PartialFunction[String, Status] = {
- case "Unprocessed" => Status.Unprocessed
- case "PreCleaning" => Status.PreCleaning
- case "New" => Status.New
- case "Cleaned" => Status.Cleaned
- case "PreOrganized" => Status.PreOrganized
- case "PreOrganizing" => Status.PreOrganizing
- case "Reviewed" => Status.Reviewed
- case "Organized" => Status.Organized
- case "Done" => Status.Done
- case "Flagged" => Status.Flagged
- case "Archived" => Status.Archived
- }
-
- def statusToString(x: Status): String = x match {
- case Status.Unprocessed => "Unprocessed"
- case Status.PreCleaning => "PreCleaning"
- case Status.New => "New"
- case Status.Cleaned => "Cleaned"
- case Status.PreOrganized => "PreOrganized"
- case Status.PreOrganizing => "PreOrganizing"
- case Status.Reviewed => "Reviewed"
- case Status.Organized => "Organized"
- case Status.Done => "Done"
- case Status.Flagged => "Flagged"
- case Status.Archived => "Archived"
- }
-}
diff --git a/src/main/scala/xyz/driver/pdsuidomain/formats/json/sprayformats/recordhistory.scala b/src/main/scala/xyz/driver/pdsuidomain/formats/json/recordhistory.scala
index bd14d43..00071e1 100644
--- a/src/main/scala/xyz/driver/pdsuidomain/formats/json/sprayformats/recordhistory.scala
+++ b/src/main/scala/xyz/driver/pdsuidomain/formats/json/recordhistory.scala
@@ -1,4 +1,4 @@
-package xyz.driver.pdsuidomain.formats.json.sprayformats
+package xyz.driver.pdsuidomain.formats.json
import spray.json._
import xyz.driver.core.json.EnumJsonFormat
@@ -6,8 +6,8 @@ import xyz.driver.pdsuidomain.entities._
object recordhistory {
import DefaultJsonProtocol._
- import common._
import MedicalRecordHistory._
+ import common._
implicit val recordStateFormat = new EnumJsonFormat[State](
"Clean" -> State.Clean,
diff --git a/src/main/scala/xyz/driver/pdsuidomain/formats/json/recordhistory/ApiRecordHistory.scala b/src/main/scala/xyz/driver/pdsuidomain/formats/json/recordhistory/ApiRecordHistory.scala
deleted file mode 100644
index c55a78f..0000000
--- a/src/main/scala/xyz/driver/pdsuidomain/formats/json/recordhistory/ApiRecordHistory.scala
+++ /dev/null
@@ -1,27 +0,0 @@
-package xyz.driver.pdsuidomain.formats.json.recordhistory
-
-import java.time.{ZoneId, ZonedDateTime}
-
-import play.api.libs.json.{Format, Json}
-import xyz.driver.pdsuidomain.entities.MedicalRecordHistory
-
-final case class ApiRecordHistory(id: Long,
- executor: String,
- recordId: Long,
- state: String,
- action: String,
- created: ZonedDateTime)
-
-object ApiRecordHistory {
- implicit val format: Format[ApiRecordHistory] =
- Json.format[ApiRecordHistory]
-
- def fromDomain(x: MedicalRecordHistory) = ApiRecordHistory(
- id = x.id.id,
- executor = x.executor.id,
- recordId = x.recordId.id,
- state = MedicalRecordHistory.State.stateToString(x.state),
- action = MedicalRecordHistory.Action.actionToString(x.action),
- created = ZonedDateTime.of(x.created, ZoneId.of("Z"))
- )
-}
diff --git a/src/main/scala/xyz/driver/pdsuidomain/formats/json/sprayformats/recordissue.scala b/src/main/scala/xyz/driver/pdsuidomain/formats/json/recordissue.scala
index 4ac5f6d..29b12f6 100644
--- a/src/main/scala/xyz/driver/pdsuidomain/formats/json/sprayformats/recordissue.scala
+++ b/src/main/scala/xyz/driver/pdsuidomain/formats/json/recordissue.scala
@@ -1,4 +1,4 @@
-package xyz.driver.pdsuidomain.formats.json.sprayformats
+package xyz.driver.pdsuidomain.formats.json
import java.time.LocalDateTime
diff --git a/src/main/scala/xyz/driver/pdsuidomain/formats/json/recordissue/ApiPartialRecordIssue.scala b/src/main/scala/xyz/driver/pdsuidomain/formats/json/recordissue/ApiPartialRecordIssue.scala
deleted file mode 100644
index 890ad69..0000000
--- a/src/main/scala/xyz/driver/pdsuidomain/formats/json/recordissue/ApiPartialRecordIssue.scala
+++ /dev/null
@@ -1,42 +0,0 @@
-package xyz.driver.pdsuidomain.formats.json.recordissue
-
-import java.time.LocalDateTime
-
-import play.api.libs.functional.syntax._
-import play.api.libs.json._
-import xyz.driver.pdsuicommon.domain.{LongId, StringId, User}
-import xyz.driver.pdsuidomain.entities.{MedicalRecord, MedicalRecordIssue}
-
-final case class ApiPartialRecordIssue(startPage: Option[Double],
- endPage: Option[Double],
- text: String,
- archiveRequired: Boolean) {
- def applyTo(x: MedicalRecordIssue): MedicalRecordIssue = x.copy(
- startPage = startPage,
- endPage = endPage,
- text = text,
- archiveRequired = archiveRequired
- )
-
- def toDomain(userId: StringId[User], recordId: LongId[MedicalRecord]) =
- MedicalRecordIssue(
- id = LongId(0),
- userId = userId,
- recordId = recordId,
- startPage = startPage,
- endPage = endPage,
- lastUpdate = LocalDateTime.MIN,
- isDraft = true,
- text = text,
- archiveRequired = false
- )
-}
-
-object ApiPartialRecordIssue {
- implicit val format: Format[ApiPartialRecordIssue] = (
- (JsPath \ "startPage").formatNullable[Double] and
- (JsPath \ "endPage").formatNullable[Double] and
- (JsPath \ "text").format[String] and
- (JsPath \ "archiveRequired").format[Boolean]
- )(ApiPartialRecordIssue.apply, unlift(ApiPartialRecordIssue.unapply))
-}
diff --git a/src/main/scala/xyz/driver/pdsuidomain/formats/json/recordissue/ApiRecordIssue.scala b/src/main/scala/xyz/driver/pdsuidomain/formats/json/recordissue/ApiRecordIssue.scala
deleted file mode 100644
index 45bc469..0000000
--- a/src/main/scala/xyz/driver/pdsuidomain/formats/json/recordissue/ApiRecordIssue.scala
+++ /dev/null
@@ -1,40 +0,0 @@
-package xyz.driver.pdsuidomain.formats.json.recordissue
-
-import java.time.{ZoneId, ZonedDateTime}
-
-import play.api.libs.functional.syntax._
-import play.api.libs.json._
-import xyz.driver.pdsuidomain.entities.MedicalRecordIssue
-
-final case class ApiRecordIssue(id: Long,
- startPage: Option[Double],
- endPage: Option[Double],
- text: String,
- lastUpdate: ZonedDateTime,
- userId: String,
- isDraft: Boolean,
- archiveRequired: Boolean)
-
-object ApiRecordIssue {
- implicit val format: Format[ApiRecordIssue] = (
- (JsPath \ "id").format[Long] and
- (JsPath \ "startPage").formatNullable[Double] and
- (JsPath \ "endPage").formatNullable[Double] and
- (JsPath \ "text").format[String] and
- (JsPath \ "lastUpdate").format[ZonedDateTime] and
- (JsPath \ "userId").format[String] and
- (JsPath \ "isDraft").format[Boolean] and
- (JsPath \ "archiveRequired").format[Boolean]
- )(ApiRecordIssue.apply, unlift(ApiRecordIssue.unapply))
-
- def fromDomain(x: MedicalRecordIssue) = ApiRecordIssue(
- id = x.id.id,
- startPage = x.startPage,
- endPage = x.endPage,
- text = x.text,
- lastUpdate = ZonedDateTime.of(x.lastUpdate, ZoneId.of("Z")),
- userId = x.userId.id,
- isDraft = x.isDraft,
- archiveRequired = x.archiveRequired
- )
-}
diff --git a/src/main/scala/xyz/driver/pdsuidomain/formats/json/session/NewSessionRequest.scala b/src/main/scala/xyz/driver/pdsuidomain/formats/json/session/NewSessionRequest.scala
deleted file mode 100644
index fbe9689..0000000
--- a/src/main/scala/xyz/driver/pdsuidomain/formats/json/session/NewSessionRequest.scala
+++ /dev/null
@@ -1,12 +0,0 @@
-package xyz.driver.pdsuidomain.formats.json.session
-
-import xyz.driver.pdsuicommon.domain.Email
-import play.api.libs.json._
-import xyz.driver.pdsuicommon.json.Serialization._
-
-final case class NewSessionRequest(email: Email, password: String)
-
-object NewSessionRequest {
-
- implicit val format: Format[NewSessionRequest] = Json.format[NewSessionRequest]
-}
diff --git a/src/main/scala/xyz/driver/pdsuidomain/formats/json/session/NewSessionResponse.scala b/src/main/scala/xyz/driver/pdsuidomain/formats/json/session/NewSessionResponse.scala
deleted file mode 100644
index 55e05b1..0000000
--- a/src/main/scala/xyz/driver/pdsuidomain/formats/json/session/NewSessionResponse.scala
+++ /dev/null
@@ -1,11 +0,0 @@
-package xyz.driver.pdsuidomain.formats.json.session
-
-import play.api.libs.json.Json
-import xyz.driver.pdsuidomain.formats.json.user.ApiUser
-
-final case class NewSessionResponse(token: String, user: ApiUser)
-
-object NewSessionResponse {
-
- implicit val format = Json.format[NewSessionResponse]
-}
diff --git a/src/main/scala/xyz/driver/pdsuidomain/formats/json/sprayformats/slotarm.scala b/src/main/scala/xyz/driver/pdsuidomain/formats/json/slotarm.scala
index 1d74916..7867cd6 100644
--- a/src/main/scala/xyz/driver/pdsuidomain/formats/json/sprayformats/slotarm.scala
+++ b/src/main/scala/xyz/driver/pdsuidomain/formats/json/slotarm.scala
@@ -1,4 +1,4 @@
-package xyz.driver.pdsuidomain.formats.json.sprayformats
+package xyz.driver.pdsuidomain.formats.json
import spray.json._
import xyz.driver.pdsuicommon.domain.{LongId, StringId}
diff --git a/src/main/scala/xyz/driver/pdsuidomain/formats/json/slotarm/ApiPartialSlotArm.scala b/src/main/scala/xyz/driver/pdsuidomain/formats/json/slotarm/ApiPartialSlotArm.scala
deleted file mode 100644
index 2f8e93f..0000000
--- a/src/main/scala/xyz/driver/pdsuidomain/formats/json/slotarm/ApiPartialSlotArm.scala
+++ /dev/null
@@ -1,14 +0,0 @@
-package xyz.driver.pdsuidomain.formats.json.slotarm
-
-import xyz.driver.pdsuidomain.entities.SlotArm
-import play.api.libs.json.{Format, Json}
-
-final case class ApiPartialSlotArm(name: String) {
-
- def applyTo(arm: SlotArm): SlotArm = arm.copy(name = name)
-}
-
-object ApiPartialSlotArm {
-
- implicit val format: Format[ApiPartialSlotArm] = Json.format
-}
diff --git a/src/main/scala/xyz/driver/pdsuidomain/formats/json/slotarm/ApiSlotArm.scala b/src/main/scala/xyz/driver/pdsuidomain/formats/json/slotarm/ApiSlotArm.scala
deleted file mode 100644
index 375c1a2..0000000
--- a/src/main/scala/xyz/driver/pdsuidomain/formats/json/slotarm/ApiSlotArm.scala
+++ /dev/null
@@ -1,35 +0,0 @@
-package xyz.driver.pdsuidomain.formats.json.slotarm
-
-import xyz.driver.pdsuicommon.domain.{LongId, StringId}
-import xyz.driver.pdsuidomain.entities.SlotArm
-import play.api.libs.functional.syntax._
-import play.api.libs.json._
-
-final case class ApiSlotArm(id: Long, name: String, originalName: String, trialId: String) {
-
- def toDomain: SlotArm = SlotArm(
- id = LongId(this.id),
- name = this.name,
- originalName = this.originalName,
- trialId = StringId(this.trialId),
- deleted = None // if we have an ApiSlotArm object, the SlotArm itself has not been deleted
- )
-
-}
-
-object ApiSlotArm {
-
- implicit val format: Format[ApiSlotArm] = (
- (JsPath \ "id").format[Long] and
- (JsPath \ "name").format[String] and
- (JsPath \ "originalName").format[String] and
- (JsPath \ "trialId").format[String]
- )(ApiSlotArm.apply, unlift(ApiSlotArm.unapply))
-
- def fromDomain(arm: SlotArm): ApiSlotArm = ApiSlotArm(
- id = arm.id.id,
- name = arm.name,
- originalName = arm.originalName,
- trialId = arm.trialId.id
- )
-}
diff --git a/src/main/scala/xyz/driver/pdsuidomain/formats/json/slotarm/ApiSlotCreateArm.scala b/src/main/scala/xyz/driver/pdsuidomain/formats/json/slotarm/ApiSlotCreateArm.scala
deleted file mode 100644
index 3e52c13..0000000
--- a/src/main/scala/xyz/driver/pdsuidomain/formats/json/slotarm/ApiSlotCreateArm.scala
+++ /dev/null
@@ -1,20 +0,0 @@
-package xyz.driver.pdsuidomain.formats.json.slotarm
-
-import xyz.driver.pdsuicommon.domain.{LongId, StringId}
-import xyz.driver.pdsuidomain.entities.SlotArm
-import play.api.libs.json.{Format, Json}
-
-final case class ApiCreateSlotArm(name: String, trialId: String) {
-
- def toDomain = SlotArm(
- id = LongId(0),
- name = name,
- trialId = StringId(trialId),
- originalName = name
- )
-}
-
-object ApiCreateSlotArm {
-
- implicit val format: Format[ApiCreateSlotArm] = Json.format[ApiCreateSlotArm]
-}
diff --git a/src/main/scala/xyz/driver/pdsuidomain/formats/json/sprayformats/studydesign.scala b/src/main/scala/xyz/driver/pdsuidomain/formats/json/studydesign.scala
index 3002b38..60c7e70 100644
--- a/src/main/scala/xyz/driver/pdsuidomain/formats/json/sprayformats/studydesign.scala
+++ b/src/main/scala/xyz/driver/pdsuidomain/formats/json/studydesign.scala
@@ -1,4 +1,4 @@
-package xyz.driver.pdsuidomain.formats.json.sprayformats
+package xyz.driver.pdsuidomain.formats.json
import spray.json._
import xyz.driver.pdsuidomain.entities._
diff --git a/src/main/scala/xyz/driver/pdsuidomain/formats/json/studydesign/ApiStudyDesign.scala b/src/main/scala/xyz/driver/pdsuidomain/formats/json/studydesign/ApiStudyDesign.scala
deleted file mode 100644
index 12d40df..0000000
--- a/src/main/scala/xyz/driver/pdsuidomain/formats/json/studydesign/ApiStudyDesign.scala
+++ /dev/null
@@ -1,23 +0,0 @@
-package xyz.driver.pdsuidomain.formats.json.studydesign
-
-import xyz.driver.pdsuidomain.entities.StudyDesign
-import play.api.libs.functional.syntax._
-import play.api.libs.json.{Format, JsPath}
-
-final case class ApiStudyDesign(id: Long, name: String) {
-
- def toDomain: Option[StudyDesign] = StudyDesign.fromString(name)
-}
-
-object ApiStudyDesign {
-
- implicit val format: Format[ApiStudyDesign] = (
- (JsPath \ "id").format[Long] and
- (JsPath \ "name").format[String]
- )(ApiStudyDesign.apply, unlift(ApiStudyDesign.unapply))
-
- def fromDomain(studyDesign: StudyDesign) = ApiStudyDesign(
- id = studyDesign.id.id,
- name = studyDesign.name
- )
-}
diff --git a/src/main/scala/xyz/driver/pdsuidomain/formats/json/sprayformats/trial.scala b/src/main/scala/xyz/driver/pdsuidomain/formats/json/trial.scala
index b25ed1d..6cc2560 100644
--- a/src/main/scala/xyz/driver/pdsuidomain/formats/json/sprayformats/trial.scala
+++ b/src/main/scala/xyz/driver/pdsuidomain/formats/json/trial.scala
@@ -1,4 +1,4 @@
-package xyz.driver.pdsuidomain.formats.json.sprayformats
+package xyz.driver.pdsuidomain.formats.json
import java.time.{ZoneId, ZonedDateTime}
@@ -24,7 +24,7 @@ object trial {
"Archived" -> Status.Archived
)
- implicit val trialWriter: RootJsonWriter[Trial] = new RootJsonWriter[Trial] {
+ implicit val trialFormat: RootJsonFormat[Trial] = new RootJsonFormat[Trial] {
override def write(obj: Trial) =
JsObject(
"id" -> obj.id.toJson,
@@ -46,6 +46,8 @@ object trial {
"title" -> obj.title.toJson,
"originalTitle" -> obj.originalTitle.toJson
)
+
+ override def read(json: JsValue): Trial = jsonReader[Trial].read(json)
}
def applyUpdateToTrial(json: JsValue, orig: Trial): Trial = json match {
diff --git a/src/main/scala/xyz/driver/pdsuidomain/formats/json/trial/ApiPartialTrial.scala b/src/main/scala/xyz/driver/pdsuidomain/formats/json/trial/ApiPartialTrial.scala
deleted file mode 100644
index f89f181..0000000
--- a/src/main/scala/xyz/driver/pdsuidomain/formats/json/trial/ApiPartialTrial.scala
+++ /dev/null
@@ -1,44 +0,0 @@
-package xyz.driver.pdsuidomain.formats.json.trial
-
-import java.util.UUID
-
-import xyz.driver.pdsuicommon.domain.{LongId, UuidId}
-import xyz.driver.pdsuidomain.entities.Trial
-import org.davidbild.tristate.Tristate
-import org.davidbild.tristate.contrib.play.ToJsPathOpsFromJsPath
-import play.api.libs.functional.syntax._
-import play.api.libs.json._
-
-final case class ApiPartialTrial(hypothesisId: Tristate[UUID],
- studyDesignId: Tristate[Long],
- overview: Tristate[String],
- title: Tristate[String]) {
-
- def applyTo(orig: Trial): Trial = {
- orig.copy(
- hypothesisId = hypothesisId.map(UuidId(_)).cata(Some(_), None, orig.hypothesisId),
- studyDesignId = studyDesignId.map(LongId(_)).cata(Some(_), None, orig.studyDesignId),
- overview = overview.cata(Some(_), None, orig.overview),
- title = title.cata(Some(_).getOrElse(""), "", orig.title)
- )
- }
-}
-
-object ApiPartialTrial {
-
- private val reads: Reads[ApiPartialTrial] = (
- (JsPath \ "hypothesisId").readTristate[UUID] and
- (JsPath \ "studyDesignId").readTristate[Long] and
- (JsPath \ "overview").readTristate[String] and
- (JsPath \ "title").readTristate[String]
- )(ApiPartialTrial.apply _)
-
- private val writes: Writes[ApiPartialTrial] = (
- (JsPath \ "hypothesisId").writeTristate[UUID] and
- (JsPath \ "studyDesignId").writeTristate[Long] and
- (JsPath \ "overview").writeTristate[String] and
- (JsPath \ "title").writeTristate[String]
- )(unlift(ApiPartialTrial.unapply))
-
- implicit val format: Format[ApiPartialTrial] = Format(reads, writes)
-}
diff --git a/src/main/scala/xyz/driver/pdsuidomain/formats/json/trial/ApiTrial.scala b/src/main/scala/xyz/driver/pdsuidomain/formats/json/trial/ApiTrial.scala
deleted file mode 100644
index 133a2c8..0000000
--- a/src/main/scala/xyz/driver/pdsuidomain/formats/json/trial/ApiTrial.scala
+++ /dev/null
@@ -1,96 +0,0 @@
-package xyz.driver.pdsuidomain.formats.json.trial
-
-import java.time.{ZoneId, ZonedDateTime}
-import java.util.UUID
-
-import play.api.libs.functional.syntax._
-import play.api.libs.json._
-import xyz.driver.pdsuicommon.domain.{LongId, StringId, UuidId}
-import xyz.driver.pdsuidomain.entities.Trial
-
-final case class ApiTrial(id: String,
- externalId: UUID,
- lastUpdate: ZonedDateTime,
- status: String,
- assignee: Option[String],
- previousStatus: Option[String],
- previousAssignee: Option[String],
- lastActiveUser: Option[String],
- phase: String,
- hypothesisId: Option[UUID],
- studyDesignId: Option[Long],
- originalStudyDesign: Option[String],
- isPartner: Boolean,
- overview: Option[String],
- overviewTemplate: String,
- isUpdated: Boolean,
- title: String,
- originalTitle: String) {
-
- def toDomain = Trial(
- id = StringId(this.id),
- externalId = UuidId(this.externalId),
- status = TrialStatus.statusFromString(this.status),
- assignee = this.assignee.map(id => StringId(id)),
- previousStatus = this.previousStatus.map(s => TrialStatus.statusFromString(s)),
- previousAssignee = this.previousAssignee.map(id => StringId(id)),
- lastActiveUserId = this.lastActiveUser.map(id => StringId(id)),
- lastUpdate = this.lastUpdate.toLocalDateTime,
- phase = this.phase,
- hypothesisId = this.hypothesisId.map(id => UuidId(id)),
- studyDesignId = this.studyDesignId.map(id => LongId(id)),
- originalStudyDesign = this.originalStudyDesign,
- isPartner = this.isPartner,
- overview = this.overview,
- overviewTemplate = this.overviewTemplate,
- isUpdated = this.isUpdated,
- title = this.title,
- originalTitle = this.originalTitle
- )
-
-}
-
-object ApiTrial {
-
- implicit val format: Format[ApiTrial] = (
- (JsPath \ "id").format[String] and
- (JsPath \ "externalid").format[UUID] and
- (JsPath \ "lastUpdate").format[ZonedDateTime] and
- (JsPath \ "status").format[String] and
- (JsPath \ "assignee").formatNullable[String] and
- (JsPath \ "previousStatus").formatNullable[String] and
- (JsPath \ "previousAssignee").formatNullable[String] and
- (JsPath \ "lastActiveUser").formatNullable[String] and
- (JsPath \ "phase").format[String] and
- (JsPath \ "hypothesisId").formatNullable[UUID] and
- (JsPath \ "studyDesignId").formatNullable[Long] and
- (JsPath \ "originalStudyDesignId").formatNullable[String] and
- (JsPath \ "isPartner").format[Boolean] and
- (JsPath \ "overview").formatNullable[String] and
- (JsPath \ "overviewTemplate").format[String] and
- (JsPath \ "isUpdated").format[Boolean] and
- (JsPath \ "title").format[String] and
- (JsPath \ "originalTitle").format[String]
- )(ApiTrial.apply, unlift(ApiTrial.unapply))
-
- def fromDomain(trial: Trial): ApiTrial = ApiTrial(
- id = trial.id.id,
- externalId = trial.externalId.id,
- status = TrialStatus.statusToString(trial.status),
- assignee = trial.assignee.map(_.id),
- previousStatus = trial.previousStatus.map(TrialStatus.statusToString),
- previousAssignee = trial.previousAssignee.map(_.id),
- lastActiveUser = trial.lastActiveUserId.map(_.id),
- lastUpdate = ZonedDateTime.of(trial.lastUpdate, ZoneId.of("Z")),
- phase = trial.phase,
- hypothesisId = trial.hypothesisId.map(_.id),
- studyDesignId = trial.studyDesignId.map(_.id),
- originalStudyDesign = trial.originalStudyDesign,
- isPartner = trial.isPartner,
- overview = trial.overview,
- overviewTemplate = trial.overviewTemplate,
- isUpdated = trial.isUpdated,
- title = trial.title,
- originalTitle = trial.originalTitle
- )
-}
diff --git a/src/main/scala/xyz/driver/pdsuidomain/formats/json/trial/TrialStatus.scala b/src/main/scala/xyz/driver/pdsuidomain/formats/json/trial/TrialStatus.scala
deleted file mode 100644
index a5b557b..0000000
--- a/src/main/scala/xyz/driver/pdsuidomain/formats/json/trial/TrialStatus.scala
+++ /dev/null
@@ -1,30 +0,0 @@
-package xyz.driver.pdsuidomain.formats.json.trial
-
-import xyz.driver.pdsuidomain.entities.Trial.Status
-
-object TrialStatus {
-
- val statusFromString: PartialFunction[String, Status] = {
- case "New" => Status.New
- case "ReviewSummary" => Status.ReviewSummary
- case "Summarized" => Status.Summarized
- case "PendingUpdate" => Status.PendingUpdate
- case "Update" => Status.Update
- case "ReviewCriteria" => Status.ReviewCriteria
- case "Done" => Status.Done
- case "Flagged" => Status.Flagged
- case "Archived" => Status.Archived
- }
-
- def statusToString(x: Status): String = x match {
- case Status.New => "New"
- case Status.ReviewSummary => "ReviewSummary"
- case Status.Summarized => "Summarized"
- case Status.PendingUpdate => "PendingUpdate"
- case Status.Update => "Update"
- case Status.ReviewCriteria => "ReviewCriteria"
- case Status.Done => "Done"
- case Status.Flagged => "Flagged"
- case Status.Archived => "Archived"
- }
-}
diff --git a/src/main/scala/xyz/driver/pdsuidomain/formats/json/sprayformats/trialhistory.scala b/src/main/scala/xyz/driver/pdsuidomain/formats/json/trialhistory.scala
index 844c5f5..6185d5a 100644
--- a/src/main/scala/xyz/driver/pdsuidomain/formats/json/sprayformats/trialhistory.scala
+++ b/src/main/scala/xyz/driver/pdsuidomain/formats/json/trialhistory.scala
@@ -1,4 +1,4 @@
-package xyz.driver.pdsuidomain.formats.json.sprayformats
+package xyz.driver.pdsuidomain.formats.json
import spray.json._
import xyz.driver.core.json.EnumJsonFormat
@@ -6,8 +6,8 @@ import xyz.driver.pdsuidomain.entities._
object trialhistory {
import DefaultJsonProtocol._
- import common._
import TrialHistory._
+ import common._
implicit val trialStateFormat = new EnumJsonFormat[State](
"Summarize" -> State.Summarize,
diff --git a/src/main/scala/xyz/driver/pdsuidomain/formats/json/trialhistory/ApiTrialHistory.scala b/src/main/scala/xyz/driver/pdsuidomain/formats/json/trialhistory/ApiTrialHistory.scala
deleted file mode 100644
index 38faeb8..0000000
--- a/src/main/scala/xyz/driver/pdsuidomain/formats/json/trialhistory/ApiTrialHistory.scala
+++ /dev/null
@@ -1,26 +0,0 @@
-package xyz.driver.pdsuidomain.formats.json.trialhistory
-
-import java.time.{ZoneId, ZonedDateTime}
-
-import play.api.libs.json.{Format, Json}
-import xyz.driver.pdsuidomain.entities.TrialHistory
-
-final case class ApiTrialHistory(id: Long,
- executor: String,
- trialId: String,
- state: String,
- action: String,
- created: ZonedDateTime)
-
-object ApiTrialHistory {
- implicit val format: Format[ApiTrialHistory] = Json.format[ApiTrialHistory]
-
- def fromDomain(x: TrialHistory) = ApiTrialHistory(
- id = x.id.id,
- executor = x.executor.id,
- trialId = x.trialId.id,
- state = TrialHistory.State.stateToString(x.state),
- action = TrialHistory.Action.actionToString(x.action),
- created = ZonedDateTime.of(x.created, ZoneId.of("Z"))
- )
-}
diff --git a/src/main/scala/xyz/driver/pdsuidomain/formats/json/sprayformats/trialissue.scala b/src/main/scala/xyz/driver/pdsuidomain/formats/json/trialissue.scala
index d1ca191..b2a3023 100644
--- a/src/main/scala/xyz/driver/pdsuidomain/formats/json/sprayformats/trialissue.scala
+++ b/src/main/scala/xyz/driver/pdsuidomain/formats/json/trialissue.scala
@@ -1,4 +1,4 @@
-package xyz.driver.pdsuidomain.formats.json.sprayformats
+package xyz.driver.pdsuidomain.formats.json
import java.time.LocalDateTime
diff --git a/src/main/scala/xyz/driver/pdsuidomain/formats/json/trialissue/ApiPartialTrialIssue.scala b/src/main/scala/xyz/driver/pdsuidomain/formats/json/trialissue/ApiPartialTrialIssue.scala
deleted file mode 100644
index fc31371..0000000
--- a/src/main/scala/xyz/driver/pdsuidomain/formats/json/trialissue/ApiPartialTrialIssue.scala
+++ /dev/null
@@ -1,40 +0,0 @@
-package xyz.driver.pdsuidomain.formats.json.trialissue
-
-import java.time.LocalDateTime
-
-import play.api.libs.functional.syntax._
-import play.api.libs.json._
-import xyz.driver.pdsuicommon.domain.{LongId, StringId, User}
-import xyz.driver.pdsuidomain.entities.{Trial, TrialIssue}
-
-final case class ApiPartialTrialIssue(text: String, evidence: String, archiveRequired: Boolean, meta: String) {
- def applyTo(x: TrialIssue): TrialIssue = x.copy(
- text = text,
- evidence = evidence,
- archiveRequired = archiveRequired,
- meta = meta
- )
-
- def toDomain(userId: StringId[User], trialId: StringId[Trial]) = TrialIssue(
- id = LongId(0),
- userId = userId,
- trialId = trialId,
- lastUpdate = LocalDateTime.MIN,
- isDraft = true,
- text = text,
- evidence = evidence,
- archiveRequired = false,
- meta = meta
- )
-}
-
-object ApiPartialTrialIssue {
- implicit val format: Format[ApiPartialTrialIssue] = (
- (JsPath \ "text").format[String] and
- (JsPath \ "evidence").format[String] and
- (JsPath \ "archiveRequired").format[Boolean] and
- (JsPath \ "meta").format[String](Format(Reads { x =>
- JsSuccess(Json.stringify(x))
- }, Writes[String](Json.parse)))
- )(ApiPartialTrialIssue.apply, unlift(ApiPartialTrialIssue.unapply))
-}
diff --git a/src/main/scala/xyz/driver/pdsuidomain/formats/json/trialissue/ApiTrialIssue.scala b/src/main/scala/xyz/driver/pdsuidomain/formats/json/trialissue/ApiTrialIssue.scala
deleted file mode 100644
index c9475c6..0000000
--- a/src/main/scala/xyz/driver/pdsuidomain/formats/json/trialissue/ApiTrialIssue.scala
+++ /dev/null
@@ -1,60 +0,0 @@
-package xyz.driver.pdsuidomain.formats.json.trialissue
-
-import java.time.{ZoneId, ZonedDateTime}
-
-import play.api.libs.functional.syntax._
-import play.api.libs.json._
-import xyz.driver.pdsuicommon.domain._
-import xyz.driver.pdsuidomain.entities.TrialIssue
-
-final case class ApiTrialIssue(id: Long,
- trialId: String,
- text: String,
- lastUpdate: ZonedDateTime,
- userId: String,
- isDraft: Boolean,
- evidence: String,
- archiveRequired: Boolean,
- meta: String) {
-
- def toDomain = TrialIssue(
- id = LongId(this.id),
- trialId = StringId(this.trialId),
- text = this.text,
- userId = StringId(this.userId),
- lastUpdate = this.lastUpdate.toLocalDateTime,
- isDraft = this.isDraft,
- evidence = this.evidence,
- archiveRequired = this.archiveRequired,
- meta = this.meta
- )
-
-}
-
-object ApiTrialIssue {
- implicit val format: Format[ApiTrialIssue] = (
- (JsPath \ "id").format[Long] and
- (JsPath \ "trialId").format[String] and
- (JsPath \ "text").format[String] and
- (JsPath \ "lastUpdate").format[ZonedDateTime] and
- (JsPath \ "userId").format[String] and
- (JsPath \ "isDraft").format[Boolean] and
- (JsPath \ "evidence").format[String] and
- (JsPath \ "archiveRequired").format[Boolean] and
- (JsPath \ "meta").format[String](Format(Reads { x =>
- JsSuccess(Json.stringify(x))
- }, Writes[String](Json.parse)))
- )(ApiTrialIssue.apply, unlift(ApiTrialIssue.unapply))
-
- def fromDomain(x: TrialIssue) = ApiTrialIssue(
- id = x.id.id,
- trialId = x.trialId.id,
- text = x.text,
- lastUpdate = ZonedDateTime.of(x.lastUpdate, ZoneId.of("Z")),
- userId = x.userId.id,
- isDraft = x.isDraft,
- evidence = x.evidence,
- archiveRequired = x.archiveRequired,
- meta = x.meta
- )
-}
diff --git a/src/main/scala/xyz/driver/pdsuidomain/formats/json/user/ApiPartialUser.scala b/src/main/scala/xyz/driver/pdsuidomain/formats/json/user/ApiPartialUser.scala
deleted file mode 100644
index cf20d32..0000000
--- a/src/main/scala/xyz/driver/pdsuidomain/formats/json/user/ApiPartialUser.scala
+++ /dev/null
@@ -1,76 +0,0 @@
-package xyz.driver.pdsuidomain.formats.json.user
-
-import java.util.UUID
-
-import xyz.driver.pdsuicommon.domain._
-import play.api.data.validation._
-import play.api.libs.functional.syntax._
-import play.api.libs.json._
-
-import scala.collection._
-import scala.util.Try
-import xyz.driver.pdsuicommon.json.JsonValidationException
-import xyz.driver.pdsuicommon.json.Serialization.seqJsonFormat
-import xyz.driver.pdsuicommon.validation.{AdditionalConstraints, JsonValidationErrors}
-
-final case class ApiPartialUser(email: Option[String], name: Option[String], roles: Option[Seq[String]]) {
-
- def applyTo(orig: User): Try[User] = Try {
- val validation = Map(
- JsPath \ "name" -> AdditionalConstraints.optionNonEmptyConstraint(name)
- )
-
- val validationErrors: JsonValidationErrors = validation.collect({
- case (fieldName, e: Invalid) => (fieldName, e.errors)
- })(breakOut)
-
- if (validationErrors.isEmpty) {
- orig.copy(name = name.get)
- } else {
- throw new JsonValidationException(validationErrors)
- }
- }
-
- def toDomain(id: StringId[User] = StringId(UUID.randomUUID().toString)): Try[User] = Try {
- val validation = Map(
- JsPath \ "email" -> AdditionalConstraints.optionNonEmptyConstraint(email),
- JsPath \ "name" -> AdditionalConstraints.optionNonEmptyConstraint(name),
- JsPath \ "roles" -> AdditionalConstraints.optionNonEmptyConstraint(roles)
- )
-
- val validationErrors: JsonValidationErrors = validation.collect({
- case (fieldName, e: Invalid) => (fieldName, e.errors)
- })(breakOut)
-
- if (validationErrors.isEmpty) {
- val userEmail = email.map(x => Email(x.toLowerCase)).get
- User(
- id = id,
- email = userEmail,
- name = name.get,
- roles = roles.toSeq.flatMap(_.map(UserRole.roleFromString)).toSet,
- latestActivity = None,
- deleted = None
- )
- } else {
- throw new JsonValidationException(validationErrors)
- }
- }
-}
-
-object ApiPartialUser {
-
- implicit val format: Format[ApiPartialUser] = (
- (JsPath \ "email").formatNullable[String](Format(Reads.email, Writes.StringWrites)) and
- (JsPath \ "name").formatNullable[String](
- Format(
- Reads.filterNot[String](ValidationError("Username is too long (max length is 255 chars)", 255))(
- _.length > 255),
- Writes.StringWrites
- )) and
- (JsPath \ "roles").formatNullable[Seq[String]](
- Format(seqJsonFormat[String].filter(ValidationError("unknown roles"))(
- _.forall(UserRole.roleFromString.isDefinedAt)),
- Writes.of[Seq[String]]))
- )(ApiPartialUser.apply, unlift(ApiPartialUser.unapply))
-}
diff --git a/src/main/scala/xyz/driver/pdsuidomain/formats/json/user/ApiUser.scala b/src/main/scala/xyz/driver/pdsuidomain/formats/json/user/ApiUser.scala
deleted file mode 100644
index c21edd1..0000000
--- a/src/main/scala/xyz/driver/pdsuidomain/formats/json/user/ApiUser.scala
+++ /dev/null
@@ -1,39 +0,0 @@
-package xyz.driver.pdsuidomain.formats.json.user
-
-import java.time.{ZoneId, ZonedDateTime}
-
-import xyz.driver.pdsuicommon.domain.User
-import xyz.driver.pdsuicommon.json.Serialization.seqJsonFormat
-import play.api.data.validation.ValidationError
-import play.api.libs.functional.syntax._
-import play.api.libs.json._
-
-import scala.collection.Seq
-
-final case class ApiUser(id: String,
- email: String,
- name: String,
- roles: Seq[String],
- latestActivity: Option[ZonedDateTime])
-
-object ApiUser {
-
- implicit val format: Format[ApiUser] = (
- (JsPath \ "id").format[String] and
- (JsPath \ "email").format[String](Reads.email) and
- (JsPath \ "name").format[String] and
- (JsPath \ "roles").format(
- Format(
- seqJsonFormat[String].filter(ValidationError("unknown role"))(_.forall(UserRole.roleFromString.isDefinedAt)),
- Writes.of[Seq[String]])) and
- (JsPath \ "latestActivity").formatNullable[ZonedDateTime]
- )(ApiUser.apply, unlift(ApiUser.unapply))
-
- def fromDomain(user: User) = ApiUser(
- user.id.id,
- user.email.value,
- user.name,
- user.roles.map(UserRole.roleToString).toSeq,
- user.latestActivity.map(ZonedDateTime.of(_, ZoneId.of("Z")))
- )
-}
diff --git a/src/main/scala/xyz/driver/pdsuidomain/formats/json/user/UserRole.scala b/src/main/scala/xyz/driver/pdsuidomain/formats/json/user/UserRole.scala
deleted file mode 100644
index 412a969..0000000
--- a/src/main/scala/xyz/driver/pdsuidomain/formats/json/user/UserRole.scala
+++ /dev/null
@@ -1,37 +0,0 @@
-package xyz.driver.pdsuidomain.formats.json.user
-
-import xyz.driver.pdsuicommon.domain.User.Role
-
-object UserRole {
-
- val roleFromString: PartialFunction[String, Role] = {
- case "Cleaner" => Role.RecordCleaner
- case "Organizer" => Role.RecordOrganizer
- case "Extractor" => Role.DocumentExtractor
- case "RecordAdmin" => Role.RecordAdmin
- case "TrialSummarizer" => Role.TrialSummarizer
- case "CriteriaCurator" => Role.CriteriaCurator
- case "TrialAdmin" => Role.TrialAdmin
- case "EligibilityVerifier" => Role.EligibilityVerifier
- case "TreatmentMatchingAdmin" => Role.TreatmentMatchingAdmin
- case "RoutesCurator" => Role.RoutesCurator
- case "SystemUser" => Role.SystemUser
- case "ResearchOncologist" => Role.ResearchOncologist
- // No Mixed at this time
- }
-
- def roleToString(x: Role): String = x match {
- case Role.RecordCleaner => "Cleaner"
- case Role.RecordOrganizer => "Organizer"
- case Role.DocumentExtractor => "Extractor"
- case Role.RecordAdmin => "RecordAdmin"
- case Role.TrialSummarizer => "TrialSummarizer"
- case Role.CriteriaCurator => "CriteriaCurator"
- case Role.TrialAdmin => "TrialAdmin"
- case Role.EligibilityVerifier => "EligibilityVerifier"
- case Role.TreatmentMatchingAdmin => "TreatmentMatchingAdmin"
- case Role.RoutesCurator => "RoutesCurator"
- case Role.SystemUser => "SystemUser"
- case Role.ResearchOncologist => "ResearchOncologist"
- }
-}
diff --git a/src/main/scala/xyz/driver/pdsuidomain/formats/json/userhistory/ApiUserHistory.scala b/src/main/scala/xyz/driver/pdsuidomain/formats/json/userhistory/ApiUserHistory.scala
deleted file mode 100644
index 127337f..0000000
--- a/src/main/scala/xyz/driver/pdsuidomain/formats/json/userhistory/ApiUserHistory.scala
+++ /dev/null
@@ -1,43 +0,0 @@
-package xyz.driver.pdsuidomain.formats.json.userhistory
-
-import java.time.{ZoneId, ZonedDateTime}
-
-import play.api.libs.functional.syntax._
-import play.api.libs.json.{Format, JsPath}
-import xyz.driver.pdsuidomain.entities.UserHistory
-
-final case class ApiUserHistory(id: Long,
- executor: String,
- recordId: Option[Long],
- documentId: Option[Long],
- trialId: Option[String],
- patientId: Option[String],
- state: String,
- action: String,
- created: ZonedDateTime)
-
-object ApiUserHistory {
- implicit val format: Format[ApiUserHistory] = (
- (JsPath \ "id").format[Long] and
- (JsPath \ "executor").format[String] and
- (JsPath \ "recordId").formatNullable[Long] and
- (JsPath \ "documentId").formatNullable[Long] and
- (JsPath \ "trialId").formatNullable[String] and
- (JsPath \ "patientId").formatNullable[String] and
- (JsPath \ "state").format[String] and
- (JsPath \ "action").format[String] and
- (JsPath \ "created").format[ZonedDateTime]
- )(ApiUserHistory.apply, unlift(ApiUserHistory.unapply))
-
- def fromDomain(x: UserHistory) = ApiUserHistory(
- id = x.id.id,
- executor = x.executor.id,
- recordId = x.recordId.map(_.id),
- documentId = x.documentId.map(_.id),
- trialId = x.trialId.map(_.id),
- patientId = x.patientId.map(_.id.toString),
- state = UserHistory.State.stateToString(x.state),
- action = UserHistory.Action.actionToString(x.action),
- created = ZonedDateTime.of(x.created, ZoneId.of("Z"))
- )
-}
diff --git a/src/main/scala/xyz/driver/pdsuidomain/services/MessageService.scala b/src/main/scala/xyz/driver/pdsuidomain/services/MessageService.scala
deleted file mode 100644
index 6718f26..0000000
--- a/src/main/scala/xyz/driver/pdsuidomain/services/MessageService.scala
+++ /dev/null
@@ -1,88 +0,0 @@
-package xyz.driver.pdsuidomain.services
-
-import java.time.LocalDateTime
-
-import xyz.driver.pdsuicommon.auth.AuthenticatedRequestContext
-import xyz.driver.pdsuicommon.db.{Pagination, SearchFilterExpr, Sorting}
-import xyz.driver.pdsuicommon.domain.LongId
-import xyz.driver.pdsuicommon.error.DomainError
-import xyz.driver.pdsuidomain.entities.Message
-
-import scala.concurrent.Future
-
-object MessageService {
-
- trait DefaultNotFoundError {
- def userMessage: String = "Message not found"
- }
-
- trait DefaultAccessDeniedError {
- def userMessage: String = "Access denied"
- }
-
- sealed trait CreateReply
- object CreateReply {
- type Error = CreateReply with DomainError
- final case class Created(x: Message) extends CreateReply
- case object AuthorizationError
- extends CreateReply with DomainError.AuthorizationError with DefaultAccessDeniedError
- final case class CommonError(userMessage: String) extends CreateReply with DomainError
- }
-
- sealed trait GetByIdReply
- object GetByIdReply {
- type Error = GetByIdReply with DomainError
- final case class Entity(x: Message) extends GetByIdReply
- case object NotFoundError extends GetByIdReply with DomainError.NotFoundError with DefaultNotFoundError
- final case class CommonError(userMessage: String) extends GetByIdReply with DomainError
- case object AuthorizationError
- extends GetByIdReply with DomainError.AuthorizationError with DefaultAccessDeniedError
- }
-
- sealed trait GetListReply
- object GetListReply {
- type Error = GetListReply with DomainError
- final case class EntityList(xs: Seq[Message], totalFound: Int, lastUpdate: Option[LocalDateTime])
- extends GetListReply
- case object AuthorizationError
- extends GetListReply with DomainError.AuthorizationError with DefaultAccessDeniedError
- }
-
- sealed trait UpdateReply
- object UpdateReply {
- type Error = UpdateReply with DomainError
- final case class Updated(updated: Message) extends UpdateReply
- case object AuthorizationError
- extends UpdateReply with DomainError.AuthorizationError with DefaultAccessDeniedError
- final case class CommonError(userMessage: String) extends UpdateReply with DomainError
- }
-
- sealed trait DeleteReply
- object DeleteReply {
- type Error = DeleteReply with DomainError
- case object Deleted extends DeleteReply
- case object AuthorizationError
- extends DeleteReply with DomainError.AuthorizationError with DefaultAccessDeniedError
- case object NotFoundError extends DeleteReply with DomainError.NotFoundError with DefaultNotFoundError
- final case class CommonError(userMessage: String) extends DeleteReply with DomainError
- }
-}
-
-trait MessageService {
-
- import MessageService._
-
- def create(draftMessage: Message)(implicit requestContext: AuthenticatedRequestContext): Future[CreateReply]
-
- def getById(messageId: LongId[Message])(implicit requestContext: AuthenticatedRequestContext): Future[GetByIdReply]
-
- def getAll(filter: SearchFilterExpr = SearchFilterExpr.Empty,
- sorting: Option[Sorting] = None,
- pagination: Option[Pagination] = None)(
- implicit requestContext: AuthenticatedRequestContext): Future[GetListReply]
-
- def update(origMessage: Message, draftMessage: Message)(
- implicit requestContext: AuthenticatedRequestContext): Future[UpdateReply]
-
- def delete(messageId: LongId[Message])(implicit requestContext: AuthenticatedRequestContext): Future[DeleteReply]
-}
diff --git a/src/main/scala/xyz/driver/pdsuidomain/services/UserHistoryService.scala b/src/main/scala/xyz/driver/pdsuidomain/services/UserHistoryService.scala
deleted file mode 100644
index a29e041..0000000
--- a/src/main/scala/xyz/driver/pdsuidomain/services/UserHistoryService.scala
+++ /dev/null
@@ -1,30 +0,0 @@
-package xyz.driver.pdsuidomain.services
-
-import xyz.driver.pdsuicommon.auth.AuthenticatedRequestContext
-import xyz.driver.pdsuicommon.db.{Pagination, SearchFilterExpr, Sorting}
-import xyz.driver.pdsuicommon.error.DomainError
-import xyz.driver.pdsuidomain.entities.UserHistory
-
-import scala.concurrent.Future
-
-object UserHistoryService {
-
- sealed trait GetListReply
- object GetListReply {
- final case class EntityList(xs: Seq[UserHistory], totalFound: Int) extends GetListReply
-
- case object AuthorizationError extends GetListReply with DomainError.AuthorizationError {
- def userMessage: String = "Access denied"
- }
- }
-}
-
-trait UserHistoryService {
-
- import UserHistoryService._
-
- def getAll(filter: SearchFilterExpr = SearchFilterExpr.Empty,
- sorting: Option[Sorting] = None,
- pagination: Option[Pagination] = None)(
- implicit requestContext: AuthenticatedRequestContext): Future[GetListReply]
-}
diff --git a/src/main/scala/xyz/driver/pdsuidomain/services/rest/RestArmService.scala b/src/main/scala/xyz/driver/pdsuidomain/services/rest/RestArmService.scala
index 2b4e858..e5eb18f 100644
--- a/src/main/scala/xyz/driver/pdsuidomain/services/rest/RestArmService.scala
+++ b/src/main/scala/xyz/driver/pdsuidomain/services/rest/RestArmService.scala
@@ -1,7 +1,6 @@
package xyz.driver.pdsuidomain.services.rest
import scala.concurrent.{ExecutionContext, Future}
-
import akka.http.scaladsl.marshalling.Marshal
import akka.http.scaladsl.model._
import akka.stream.Materializer
@@ -9,16 +8,17 @@ import xyz.driver.core.rest.{Pagination => _, _}
import xyz.driver.pdsuicommon.auth._
import xyz.driver.pdsuicommon.db._
import xyz.driver.pdsuicommon.domain._
+import xyz.driver.pdsuidomain.ListResponse
import xyz.driver.pdsuidomain.entities._
-import xyz.driver.pdsuidomain.formats.json.ListResponse
-import xyz.driver.pdsuidomain.formats.json.arm.ApiArm
import xyz.driver.pdsuidomain.services.ArmService
class RestArmService(transport: ServiceTransport, baseUri: Uri)(implicit protected val materializer: Materializer,
protected val exec: ExecutionContext)
extends ArmService with RestHelper {
- import xyz.driver.pdsuicommon.serialization.PlayJsonSupport._
+ import akka.http.scaladsl.marshallers.sprayjson.SprayJsonSupport._
+ import xyz.driver.pdsuidomain.formats.json.listresponse._
+ import xyz.driver.pdsuidomain.formats.json.arm._
import xyz.driver.pdsuidomain.services.ArmService._
def getAll(filter: SearchFilterExpr = SearchFilterExpr.Empty,
@@ -30,9 +30,9 @@ class RestArmService(transport: ServiceTransport, baseUri: Uri)(implicit protect
endpointUri(baseUri, "/v1/arm", filterQuery(filter) ++ sortingQuery(sorting) ++ paginationQuery(pagination)))
for {
response <- transport.sendRequestGetResponse(requestContext)(request)
- reply <- apiResponse[ListResponse[ApiArm]](response)
+ reply <- apiResponse[ListResponse[Arm]](response)
} yield {
- GetListReply.EntityList(reply.items.map(_.toDomain), reply.meta.itemsCount)
+ GetListReply.EntityList(reply.items, reply.meta.itemsCount)
}
}
@@ -40,20 +40,20 @@ class RestArmService(transport: ServiceTransport, baseUri: Uri)(implicit protect
val request = HttpRequest(HttpMethods.GET, endpointUri(baseUri, s"/v1/arm/$armId"))
for {
response <- transport.sendRequestGetResponse(requestContext)(request)
- reply <- apiResponse[ApiArm](response)
+ reply <- apiResponse[Arm](response)
} yield {
- GetByIdReply.Entity(reply.toDomain)
+ GetByIdReply.Entity(reply)
}
}
def create(draftArm: Arm)(implicit requestContext: AuthenticatedRequestContext): Future[CreateReply] = {
for {
- entity <- Marshal(ApiArm.fromDomain(draftArm)).to[RequestEntity]
+ entity <- Marshal(draftArm).to[RequestEntity]
request = HttpRequest(HttpMethods.POST, endpointUri(baseUri, "/v1/arm")).withEntity(entity)
response <- transport.sendRequestGetResponse(requestContext)(request)
- reply <- apiResponse[ApiArm](response)
+ reply <- apiResponse[Arm](response)
} yield {
- CreateReply.Created(reply.toDomain)
+ CreateReply.Created(reply)
}
}
@@ -62,9 +62,9 @@ class RestArmService(transport: ServiceTransport, baseUri: Uri)(implicit protect
val request = HttpRequest(HttpMethods.PATCH, endpointUri(baseUri, s"/v1/arm/$id"))
for {
response <- transport.sendRequestGetResponse(requestContext)(request)
- reply <- apiResponse[ApiArm](response)
+ reply <- apiResponse[Arm](response)
} yield {
- UpdateReply.Updated(reply.toDomain)
+ UpdateReply.Updated(reply)
}
}
diff --git a/src/main/scala/xyz/driver/pdsuidomain/services/rest/RestCriterionService.scala b/src/main/scala/xyz/driver/pdsuidomain/services/rest/RestCriterionService.scala
index f0f4de8..6e2da61 100644
--- a/src/main/scala/xyz/driver/pdsuidomain/services/rest/RestCriterionService.scala
+++ b/src/main/scala/xyz/driver/pdsuidomain/services/rest/RestCriterionService.scala
@@ -1,7 +1,6 @@
package xyz.driver.pdsuidomain.services.rest
import scala.concurrent.{ExecutionContext, Future}
-
import akka.http.scaladsl.marshalling.Marshal
import akka.http.scaladsl.model._
import akka.stream.Materializer
@@ -9,8 +8,8 @@ import xyz.driver.core.rest.{Pagination => _, _}
import xyz.driver.pdsuicommon.auth._
import xyz.driver.pdsuicommon.db._
import xyz.driver.pdsuicommon.domain._
+import xyz.driver.pdsuidomain.ListResponse
import xyz.driver.pdsuidomain.entities._
-import xyz.driver.pdsuidomain.formats.json.ListResponse
import xyz.driver.pdsuidomain.services.CriterionService
class RestCriterionService(transport: ServiceTransport, baseUri: Uri)(
@@ -18,19 +17,20 @@ class RestCriterionService(transport: ServiceTransport, baseUri: Uri)(
protected val exec: ExecutionContext)
extends CriterionService with RestHelper {
- import xyz.driver.pdsuicommon.serialization.PlayJsonSupport._
- import xyz.driver.pdsuidomain.formats.json.criterion.ApiCriterion
+ import akka.http.scaladsl.marshallers.sprayjson.SprayJsonSupport._
+ import xyz.driver.pdsuidomain.formats.json.listresponse._
+ import xyz.driver.pdsuidomain.formats.json.criterion._
import xyz.driver.pdsuidomain.services.CriterionService._
def create(draftRichCriterion: RichCriterion)(
implicit requestContext: AuthenticatedRequestContext): Future[CreateReply] = {
for {
- entity <- Marshal(ApiCriterion.fromDomain(draftRichCriterion)).to[RequestEntity]
+ entity <- Marshal(draftRichCriterion).to[RequestEntity]
request = HttpRequest(HttpMethods.POST, endpointUri(baseUri, "/v1/criterion")).withEntity(entity)
response <- transport.sendRequestGetResponse(requestContext)(request)
- reply <- apiResponse[ApiCriterion](response)
+ reply <- apiResponse[RichCriterion](response)
} yield {
- CreateReply.Created(reply.toDomain)
+ CreateReply.Created(reply)
}
}
@@ -38,9 +38,9 @@ class RestCriterionService(transport: ServiceTransport, baseUri: Uri)(
val request = HttpRequest(HttpMethods.GET, endpointUri(baseUri, s"/v1/criterion/$id"))
for {
response <- transport.sendRequestGetResponse(requestContext)(request)
- reply <- apiResponse[ApiCriterion](response)
+ reply <- apiResponse[RichCriterion](response)
} yield {
- GetByIdReply.Entity(reply.toDomain)
+ GetByIdReply.Entity(reply)
}
}
@@ -54,9 +54,9 @@ class RestCriterionService(transport: ServiceTransport, baseUri: Uri)(
filterQuery(filter) ++ sortingQuery(sorting) ++ paginationQuery(pagination)))
for {
response <- transport.sendRequestGetResponse(requestContext)(request)
- reply <- apiResponse[ListResponse[ApiCriterion]](response)
+ reply <- apiResponse[ListResponse[RichCriterion]](response)
} yield {
- GetListReply.EntityList(reply.items.map(_.toDomain), reply.meta.itemsCount, reply.meta.lastUpdate)
+ GetListReply.EntityList(reply.items, reply.meta.itemsCount, reply.meta.lastUpdate)
}
}
@@ -64,12 +64,12 @@ class RestCriterionService(transport: ServiceTransport, baseUri: Uri)(
implicit requestContext: AuthenticatedRequestContext): Future[UpdateReply] = {
val id = origRichCriterion.criterion.id
for {
- entity <- Marshal(ApiCriterion.fromDomain(draftRichCriterion)).to[RequestEntity]
+ entity <- Marshal(draftRichCriterion).to[RequestEntity]
request = HttpRequest(HttpMethods.PATCH, endpointUri(baseUri, s"/v1/criterion/$id")).withEntity(entity)
response <- transport.sendRequestGetResponse(requestContext)(request)
- reply <- apiResponse[ApiCriterion](response)
+ reply <- apiResponse[RichCriterion](response)
} yield {
- UpdateReply.Updated(reply.toDomain)
+ UpdateReply.Updated(reply)
}
}
diff --git a/src/main/scala/xyz/driver/pdsuidomain/services/rest/RestDocumentService.scala b/src/main/scala/xyz/driver/pdsuidomain/services/rest/RestDocumentService.scala
index 68fdde1..dcd7721 100644
--- a/src/main/scala/xyz/driver/pdsuidomain/services/rest/RestDocumentService.scala
+++ b/src/main/scala/xyz/driver/pdsuidomain/services/rest/RestDocumentService.scala
@@ -1,7 +1,6 @@
package xyz.driver.pdsuidomain.services.rest
import scala.concurrent.{ExecutionContext, Future}
-
import akka.http.scaladsl.marshalling.Marshal
import akka.http.scaladsl.model._
import akka.stream.Materializer
@@ -9,25 +8,26 @@ import xyz.driver.core.rest.{Pagination => _, _}
import xyz.driver.pdsuicommon.auth._
import xyz.driver.pdsuicommon.db._
import xyz.driver.pdsuicommon.domain._
+import xyz.driver.pdsuidomain.ListResponse
import xyz.driver.pdsuidomain.entities._
-import xyz.driver.pdsuidomain.formats.json.ListResponse
-import xyz.driver.pdsuidomain.formats.json.document.ApiDocument
import xyz.driver.pdsuidomain.services.DocumentService
class RestDocumentService(transport: ServiceTransport, baseUri: Uri)(implicit protected val materializer: Materializer,
protected val exec: ExecutionContext)
extends DocumentService with RestHelper {
- import xyz.driver.pdsuicommon.serialization.PlayJsonSupport._
+ import akka.http.scaladsl.marshallers.sprayjson.SprayJsonSupport._
+ import xyz.driver.pdsuidomain.formats.json.listresponse._
+ import xyz.driver.pdsuidomain.formats.json.document._
import xyz.driver.pdsuidomain.services.DocumentService._
def getById(id: LongId[Document])(implicit requestContext: AuthenticatedRequestContext): Future[GetByIdReply] = {
val request = HttpRequest(HttpMethods.GET, endpointUri(baseUri, s"/v1/document/$id"))
for {
response <- transport.sendRequestGetResponse(requestContext)(request)
- reply <- apiResponse[ApiDocument](response)
+ reply <- apiResponse[Document](response)
} yield {
- GetByIdReply.Entity(reply.toDomain)
+ GetByIdReply.Entity(reply)
}
}
@@ -42,32 +42,32 @@ class RestDocumentService(transport: ServiceTransport, baseUri: Uri)(implicit pr
filterQuery(filter) ++ sortingQuery(sorting) ++ paginationQuery(pagination)))
for {
response <- transport.sendRequestGetResponse(requestContext)(request)
- reply <- apiResponse[ListResponse[ApiDocument]](response)
+ reply <- apiResponse[ListResponse[Document]](response)
} yield {
- GetListReply.EntityList(reply.items.map(_.toDomain), reply.meta.itemsCount, reply.meta.lastUpdate)
+ GetListReply.EntityList(reply.items, reply.meta.itemsCount, reply.meta.lastUpdate)
}
}
def create(draftDocument: Document)(implicit requestContext: AuthenticatedRequestContext): Future[CreateReply] = {
for {
- entity <- Marshal(ApiDocument.fromDomain(draftDocument)).to[RequestEntity]
+ entity <- Marshal(draftDocument).to[RequestEntity]
request = HttpRequest(HttpMethods.POST, endpointUri(baseUri, "/v1/document")).withEntity(entity)
response <- transport.sendRequestGetResponse(requestContext)(request)
- reply <- apiResponse[ApiDocument](response)
+ reply <- apiResponse[Document](response)
} yield {
- CreateReply.Created(reply.toDomain)
+ CreateReply.Created(reply)
}
}
def update(orig: Document, draft: Document)(
implicit requestContext: AuthenticatedRequestContext): Future[UpdateReply] = {
for {
- entity <- Marshal(ApiDocument.fromDomain(draft)).to[RequestEntity]
+ entity <- Marshal(draft).to[RequestEntity]
request = HttpRequest(HttpMethods.PATCH, endpointUri(baseUri, s"/v1/document/${orig.id}")).withEntity(entity)
response <- transport.sendRequestGetResponse(requestContext)(request)
- reply <- apiResponse[ApiDocument](response)
+ reply <- apiResponse[Document](response)
} yield {
- UpdateReply.Updated(reply.toDomain)
+ UpdateReply.Updated(reply)
}
}
@@ -87,9 +87,9 @@ class RestDocumentService(transport: ServiceTransport, baseUri: Uri)(implicit pr
val request = HttpRequest(HttpMethods.POST, endpointUri(baseUri, s"/v1/document/$id/$action"))
for {
response <- transport.sendRequestGetResponse(requestContext)(request)
- reply <- apiResponse[ApiDocument](response)
+ reply <- apiResponse[Document](response)
} yield {
- UpdateReply.Updated(reply.toDomain)
+ UpdateReply.Updated(reply)
}
}
diff --git a/src/main/scala/xyz/driver/pdsuidomain/services/rest/RestDocumentTypeService.scala b/src/main/scala/xyz/driver/pdsuidomain/services/rest/RestDocumentTypeService.scala
index caa0042..6ddc022 100644
--- a/src/main/scala/xyz/driver/pdsuidomain/services/rest/RestDocumentTypeService.scala
+++ b/src/main/scala/xyz/driver/pdsuidomain/services/rest/RestDocumentTypeService.scala
@@ -1,22 +1,23 @@
package xyz.driver.pdsuidomain.services.rest
import scala.concurrent.{ExecutionContext, Future}
-
import akka.http.scaladsl.model._
import akka.stream.Materializer
import xyz.driver.core.rest.{Pagination => _, _}
import xyz.driver.pdsuicommon.auth._
import xyz.driver.pdsuicommon.db._
-import xyz.driver.pdsuidomain.formats.json.ListResponse
+import xyz.driver.pdsuidomain.ListResponse
+import xyz.driver.pdsuidomain.entities.DocumentType
import xyz.driver.pdsuidomain.services.DocumentTypeService
-import xyz.driver.pdsuidomain.formats.json.document.ApiDocumentType
class RestDocumentTypeService(transport: ServiceTransport, baseUri: Uri)(
implicit protected val materializer: Materializer,
protected val exec: ExecutionContext)
extends DocumentTypeService with RestHelper {
- import xyz.driver.pdsuicommon.serialization.PlayJsonSupport._
+ import akka.http.scaladsl.marshallers.sprayjson.SprayJsonSupport._
+ import xyz.driver.pdsuidomain.formats.json.listresponse._
+ import xyz.driver.pdsuidomain.formats.json.document.documentTypeFormat
import xyz.driver.pdsuidomain.services.DocumentTypeService._
def getAll(sorting: Option[Sorting] = None)(
@@ -24,9 +25,9 @@ class RestDocumentTypeService(transport: ServiceTransport, baseUri: Uri)(
val request = HttpRequest(HttpMethods.GET, endpointUri(baseUri, "/v1/document-type", sortingQuery(sorting)))
for {
response <- transport.sendRequestGetResponse(requestContext)(request)
- reply <- apiResponse[ListResponse[ApiDocumentType]](response)
+ reply <- apiResponse[ListResponse[DocumentType]](response)
} yield {
- GetListReply.EntityList(reply.items.map(_.toDomain), reply.meta.itemsCount)
+ GetListReply.EntityList(reply.items, reply.meta.itemsCount)
}
}
}
diff --git a/src/main/scala/xyz/driver/pdsuidomain/services/rest/RestEligibilityVerificationService.scala b/src/main/scala/xyz/driver/pdsuidomain/services/rest/RestEligibilityVerificationService.scala
index 93ee2ab..e057c55 100644
--- a/src/main/scala/xyz/driver/pdsuidomain/services/rest/RestEligibilityVerificationService.scala
+++ b/src/main/scala/xyz/driver/pdsuidomain/services/rest/RestEligibilityVerificationService.scala
@@ -24,7 +24,7 @@ class RestEligibilityVerificationService(transport: ServiceTransport, baseUri: U
import DefaultJsonProtocol._
import akka.http.scaladsl.marshallers.sprayjson.SprayJsonSupport._
- import xyz.driver.pdsuidomain.formats.json.sprayformats.eligibility._
+ import xyz.driver.pdsuidomain.formats.json.eligibility._
override def getMatchedPatients()(
implicit ctx: AuthorizedServiceRequestContext[AuthUserInfo]): ListT[Future, eligibility.MatchedPatient] = {
diff --git a/src/main/scala/xyz/driver/pdsuidomain/services/rest/RestExtractedDataService.scala b/src/main/scala/xyz/driver/pdsuidomain/services/rest/RestExtractedDataService.scala
index a65e1f4..8c07968 100644
--- a/src/main/scala/xyz/driver/pdsuidomain/services/rest/RestExtractedDataService.scala
+++ b/src/main/scala/xyz/driver/pdsuidomain/services/rest/RestExtractedDataService.scala
@@ -10,27 +10,27 @@ import xyz.driver.pdsuicommon.db._
import xyz.driver.pdsuicommon.domain._
import xyz.driver.pdsuidomain.entities._
import xyz.driver.pdsuidomain.entities.export.patient.ExportPatientWithLabels
-import xyz.driver.pdsuidomain.formats.json.ListResponse
-import xyz.driver.pdsuidomain.formats.json.extracteddata.ApiExtractedData
import xyz.driver.pdsuidomain.services.ExtractedDataService
import akka.http.scaladsl.marshallers.sprayjson.SprayJsonSupport._
-import xyz.driver.pdsuidomain.formats.json.sprayformats.export._
+import xyz.driver.pdsuidomain.ListResponse
+import xyz.driver.pdsuidomain.formats.json.export._
class RestExtractedDataService(transport: ServiceTransport, baseUri: Uri)(
implicit protected val materializer: Materializer,
protected val exec: ExecutionContext)
extends ExtractedDataService with RestHelper {
- import xyz.driver.pdsuicommon.serialization.PlayJsonSupport._
+ import xyz.driver.pdsuidomain.formats.json.listresponse._
+ import xyz.driver.pdsuidomain.formats.json.extracteddata._
import xyz.driver.pdsuidomain.services.ExtractedDataService._
def getById(id: LongId[ExtractedData])(implicit requestContext: AuthenticatedRequestContext): Future[GetByIdReply] = {
val request = HttpRequest(HttpMethods.GET, endpointUri(baseUri, s"/v1/extracted-data/$id"))
for {
response <- transport.sendRequestGetResponse(requestContext)(request)
- reply <- apiResponse[ApiExtractedData](response)
+ reply <- apiResponse[RichExtractedData](response)
} yield {
- GetByIdReply.Entity(reply.toDomain)
+ GetByIdReply.Entity(reply)
}
}
@@ -44,33 +44,33 @@ class RestExtractedDataService(transport: ServiceTransport, baseUri: Uri)(
filterQuery(filter) ++ sortingQuery(sorting) ++ paginationQuery(pagination)))
for {
response <- transport.sendRequestGetResponse(requestContext)(request)
- reply <- apiResponse[ListResponse[ApiExtractedData]](response)
+ reply <- apiResponse[ListResponse[RichExtractedData]](response)
} yield {
- GetListReply.EntityList(reply.items.map(_.toDomain), reply.meta.itemsCount)
+ GetListReply.EntityList(reply.items, reply.meta.itemsCount)
}
}
def create(draftRichExtractedData: RichExtractedData)(
implicit requestContext: AuthenticatedRequestContext): Future[CreateReply] = {
for {
- entity <- Marshal(ApiExtractedData.fromDomain(draftRichExtractedData)).to[RequestEntity]
+ entity <- Marshal(draftRichExtractedData).to[RequestEntity]
request = HttpRequest(HttpMethods.POST, endpointUri(baseUri, "/v1/extracted-data")).withEntity(entity)
response <- transport.sendRequestGetResponse(requestContext)(request)
- reply <- apiResponse[ApiExtractedData](response)
+ reply <- apiResponse[RichExtractedData](response)
} yield {
- CreateReply.Created(reply.toDomain)
+ CreateReply.Created(reply)
}
}
def update(origRichExtractedData: RichExtractedData, draftRichExtractedData: RichExtractedData)(
implicit requestContext: AuthenticatedRequestContext): Future[UpdateReply] = {
val id = origRichExtractedData.extractedData.id
for {
- entity <- Marshal(ApiExtractedData.fromDomain(draftRichExtractedData)).to[RequestEntity]
+ entity <- Marshal(draftRichExtractedData).to[RequestEntity]
request = HttpRequest(HttpMethods.PATCH, endpointUri(baseUri, s"/v1/extracted-data/$id")).withEntity(entity)
response <- transport.sendRequestGetResponse(requestContext)(request)
- reply <- apiResponse[ApiExtractedData](response)
+ reply <- apiResponse[RichExtractedData](response)
} yield {
- UpdateReply.Updated(reply.toDomain)
+ UpdateReply.Updated(reply)
}
}
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 7275e3c..8e75c76 100644
--- a/src/main/scala/xyz/driver/pdsuidomain/services/rest/RestHelper.scala
+++ b/src/main/scala/xyz/driver/pdsuidomain/services/rest/RestHelper.scala
@@ -17,6 +17,8 @@ import xyz.driver.pdsuicommon.db.{
import xyz.driver.pdsuicommon.error._
trait RestHelper {
+ import akka.http.scaladsl.marshallers.sprayjson.SprayJsonSupport._
+ import ErrorsResponse._
implicit protected val materializer: Materializer
implicit protected val exec: ExecutionContext
@@ -89,7 +91,6 @@ trait RestHelper {
implicit unmarshaller: Unmarshaller[ResponseEntity, ApiReply]): Future[ApiReply] = {
def extractErrorMessage(response: HttpResponse): Future[String] = {
- import xyz.driver.pdsuicommon.serialization.PlayJsonSupport._
Unmarshal(response.entity)
.to[ErrorsResponse]
.transform(
diff --git a/src/main/scala/xyz/driver/pdsuidomain/services/rest/RestHypothesisService.scala b/src/main/scala/xyz/driver/pdsuidomain/services/rest/RestHypothesisService.scala
index 9cef4c8..73abb0e 100644
--- a/src/main/scala/xyz/driver/pdsuidomain/services/rest/RestHypothesisService.scala
+++ b/src/main/scala/xyz/driver/pdsuidomain/services/rest/RestHypothesisService.scala
@@ -1,18 +1,16 @@
package xyz.driver.pdsuidomain.services.rest
-import scala.concurrent.{ExecutionContext, Future}
-import akka.http.scaladsl.marshallers.sprayjson.SprayJsonSupport._
import akka.http.scaladsl.marshalling.Marshal
+
+import scala.concurrent.{ExecutionContext, Future}
import akka.http.scaladsl.model._
import akka.stream.Materializer
import xyz.driver.core.rest._
import xyz.driver.pdsuicommon.auth._
import xyz.driver.pdsuicommon.db._
import xyz.driver.pdsuicommon.domain.UuidId
-import xyz.driver.pdsuidomain.entities.Hypothesis
import xyz.driver.pdsuidomain.ListResponse
-import xyz.driver.pdsuidomain.formats.json.sprayformats.listresponse._
-import xyz.driver.pdsuidomain.formats.json.sprayformats.hypothesis._
+import xyz.driver.pdsuidomain.entities.Hypothesis
import xyz.driver.pdsuidomain.services.HypothesisService
class RestHypothesisService(transport: ServiceTransport, baseUri: Uri)(
@@ -20,6 +18,9 @@ class RestHypothesisService(transport: ServiceTransport, baseUri: Uri)(
protected val exec: ExecutionContext)
extends HypothesisService with RestHelper {
+ import akka.http.scaladsl.marshallers.sprayjson.SprayJsonSupport._
+ import xyz.driver.pdsuidomain.formats.json.listresponse._
+ import xyz.driver.pdsuidomain.formats.json.hypothesis._
import xyz.driver.pdsuidomain.services.HypothesisService._
def getAll(sorting: Option[Sorting] = None)(
diff --git a/src/main/scala/xyz/driver/pdsuidomain/services/rest/RestInterventionService.scala b/src/main/scala/xyz/driver/pdsuidomain/services/rest/RestInterventionService.scala
index 025a48a..93036be 100644
--- a/src/main/scala/xyz/driver/pdsuidomain/services/rest/RestInterventionService.scala
+++ b/src/main/scala/xyz/driver/pdsuidomain/services/rest/RestInterventionService.scala
@@ -8,9 +8,8 @@ import xyz.driver.core.rest.{Pagination => _, _}
import xyz.driver.pdsuicommon.auth._
import xyz.driver.pdsuicommon.db._
import xyz.driver.pdsuicommon.domain._
+import xyz.driver.pdsuidomain.ListResponse
import xyz.driver.pdsuidomain.entities._
-import xyz.driver.pdsuidomain.formats.json.ListResponse
-import xyz.driver.pdsuidomain.formats.json.intervention.ApiIntervention
import xyz.driver.pdsuidomain.services.InterventionService
class RestInterventionService(transport: ServiceTransport, baseUri: Uri)(
@@ -18,7 +17,9 @@ class RestInterventionService(transport: ServiceTransport, baseUri: Uri)(
protected val exec: ExecutionContext)
extends InterventionService with RestHelper {
- import xyz.driver.pdsuicommon.serialization.PlayJsonSupport._
+ import akka.http.scaladsl.marshallers.sprayjson.SprayJsonSupport._
+ import xyz.driver.pdsuidomain.formats.json.listresponse._
+ import xyz.driver.pdsuidomain.formats.json.intervention._
import xyz.driver.pdsuidomain.services.InterventionService._
def getAll(filter: SearchFilterExpr = SearchFilterExpr.Empty,
@@ -31,9 +32,9 @@ class RestInterventionService(transport: ServiceTransport, baseUri: Uri)(
filterQuery(filter) ++ sortingQuery(sorting) ++ paginationQuery(pagination)))
for {
response <- transport.sendRequestGetResponse(requestContext)(request)
- reply <- apiResponse[ListResponse[ApiIntervention]](response)
+ reply <- apiResponse[ListResponse[InterventionWithArms]](response)
} yield {
- GetListReply.EntityList(reply.items.map(_.toDomain), reply.meta.itemsCount)
+ GetListReply.EntityList(reply.items, reply.meta.itemsCount)
}
}
@@ -41,9 +42,9 @@ class RestInterventionService(transport: ServiceTransport, baseUri: Uri)(
val request = HttpRequest(HttpMethods.GET, endpointUri(baseUri, s"/v1/intervention/$id"))
for {
response <- transport.sendRequestGetResponse(requestContext)(request)
- reply <- apiResponse[ApiIntervention](response)
+ reply <- apiResponse[InterventionWithArms](response)
} yield {
- GetByIdReply.Entity(reply.toDomain)
+ GetByIdReply.Entity(reply)
}
}
@@ -51,24 +52,24 @@ class RestInterventionService(transport: ServiceTransport, baseUri: Uri)(
implicit requestContext: AuthenticatedRequestContext): Future[UpdateReply] = {
val id = origIntervention.intervention.id
for {
- entity <- Marshal(ApiIntervention.fromDomain(draftIntervention)).to[RequestEntity]
+ entity <- Marshal(draftIntervention).to[RequestEntity]
request = HttpRequest(HttpMethods.PATCH, endpointUri(baseUri, s"/v1/intervention/$id")).withEntity(entity)
response <- transport.sendRequestGetResponse(requestContext)(request)
- reply <- apiResponse[ApiIntervention](response)
+ reply <- apiResponse[InterventionWithArms](response)
} yield {
- UpdateReply.Updated(reply.toDomain)
+ UpdateReply.Updated(reply)
}
}
def create(draftIntervention: InterventionWithArms)(
implicit requestContext: AuthenticatedRequestContext): Future[CreateReply] = {
for {
- entity <- Marshal(ApiIntervention.fromDomain(draftIntervention)).to[RequestEntity]
+ entity <- Marshal(draftIntervention).to[RequestEntity]
request = HttpRequest(HttpMethods.POST, endpointUri(baseUri, "/v1/intervention")).withEntity(entity)
response <- transport.sendRequestGetResponse(requestContext)(request)
- reply <- apiResponse[ApiIntervention](response)
+ reply <- apiResponse[InterventionWithArms](response)
} yield {
- CreateReply.Created(reply.toDomain)
+ CreateReply.Created(reply)
}
}
diff --git a/src/main/scala/xyz/driver/pdsuidomain/services/rest/RestInterventionTypeService.scala b/src/main/scala/xyz/driver/pdsuidomain/services/rest/RestInterventionTypeService.scala
index ce7ac10..004d6c4 100644
--- a/src/main/scala/xyz/driver/pdsuidomain/services/rest/RestInterventionTypeService.scala
+++ b/src/main/scala/xyz/driver/pdsuidomain/services/rest/RestInterventionTypeService.scala
@@ -1,13 +1,13 @@
package xyz.driver.pdsuidomain.services.rest
import scala.concurrent.{ExecutionContext, Future}
-
import akka.http.scaladsl.model._
import akka.stream.Materializer
import xyz.driver.core.rest._
import xyz.driver.pdsuicommon.auth._
import xyz.driver.pdsuicommon.db._
-import xyz.driver.pdsuidomain.formats.json.intervention.ApiInterventionType
+import xyz.driver.pdsuidomain.ListResponse
+import xyz.driver.pdsuidomain.entities.InterventionType
import xyz.driver.pdsuidomain.services.InterventionTypeService
class RestInterventionTypeService(transport: ServiceTransport, baseUri: Uri)(
@@ -15,8 +15,9 @@ class RestInterventionTypeService(transport: ServiceTransport, baseUri: Uri)(
protected val exec: ExecutionContext)
extends InterventionTypeService with RestHelper {
- import xyz.driver.pdsuicommon.serialization.PlayJsonSupport._
- import xyz.driver.pdsuidomain.formats.json.ListResponse
+ import akka.http.scaladsl.marshallers.sprayjson.SprayJsonSupport._
+ import xyz.driver.pdsuidomain.formats.json.listresponse._
+ import xyz.driver.pdsuidomain.formats.json.intervention.interventionTypeFormat
import xyz.driver.pdsuidomain.services.InterventionTypeService._
def getAll(sorting: Option[Sorting] = None)(
@@ -24,10 +25,10 @@ class RestInterventionTypeService(transport: ServiceTransport, baseUri: Uri)(
val request = HttpRequest(HttpMethods.GET, endpointUri(baseUri, "/v1/intervention-type", sortingQuery(sorting)))
for {
response <- transport.sendRequestGetResponse(requestContext)(request)
- reply <- apiResponse[ListResponse[ApiInterventionType]](response)
+ reply <- apiResponse[ListResponse[InterventionType]](response)
} yield {
{
- val domain = reply.items.flatMap(_.toDomain)
+ val domain = reply.items
GetListReply.EntityList(domain.toList, reply.meta.itemsCount)
}
}
diff --git a/src/main/scala/xyz/driver/pdsuidomain/services/rest/RestMedicalRecordService.scala b/src/main/scala/xyz/driver/pdsuidomain/services/rest/RestMedicalRecordService.scala
index f2b0f2d..0627521 100644
--- a/src/main/scala/xyz/driver/pdsuidomain/services/rest/RestMedicalRecordService.scala
+++ b/src/main/scala/xyz/driver/pdsuidomain/services/rest/RestMedicalRecordService.scala
@@ -3,8 +3,8 @@ package xyz.driver.pdsuidomain.services.rest
import akka.NotUsed
import akka.stream.scaladsl.Source
import akka.util.ByteString
-import scala.concurrent.{ExecutionContext, Future}
+import scala.concurrent.{ExecutionContext, Future}
import akka.http.scaladsl.marshalling.Marshal
import akka.http.scaladsl.model._
import akka.stream.Materializer
@@ -12,9 +12,8 @@ import xyz.driver.core.rest.{Pagination => _, _}
import xyz.driver.pdsuicommon.auth._
import xyz.driver.pdsuicommon.db._
import xyz.driver.pdsuicommon.domain._
+import xyz.driver.pdsuidomain.ListResponse
import xyz.driver.pdsuidomain.entities._
-import xyz.driver.pdsuidomain.formats.json.ListResponse
-import xyz.driver.pdsuidomain.formats.json.record.ApiRecord
import xyz.driver.pdsuidomain.services.MedicalRecordService
class RestMedicalRecordService(transport: ServiceTransport, baseUri: Uri)(
@@ -22,7 +21,9 @@ class RestMedicalRecordService(transport: ServiceTransport, baseUri: Uri)(
protected val exec: ExecutionContext)
extends MedicalRecordService with RestHelper {
- import xyz.driver.pdsuicommon.serialization.PlayJsonSupport._
+ import akka.http.scaladsl.marshallers.sprayjson.SprayJsonSupport._
+ import xyz.driver.pdsuidomain.formats.json.listresponse._
+ import xyz.driver.pdsuidomain.formats.json.record._
import xyz.driver.pdsuidomain.services.MedicalRecordService._
def getById(recordId: LongId[MedicalRecord])(
@@ -30,9 +31,9 @@ class RestMedicalRecordService(transport: ServiceTransport, baseUri: Uri)(
val request = HttpRequest(HttpMethods.GET, endpointUri(baseUri, s"/v1/record/$recordId"))
for {
response <- transport.sendRequestGetResponse(requestContext)(request)
- reply <- apiResponse[ApiRecord](response)
+ reply <- apiResponse[MedicalRecord](response)
} yield {
- GetByIdReply.Entity(reply.toDomain)
+ GetByIdReply.Entity(reply)
}
}
@@ -59,20 +60,20 @@ class RestMedicalRecordService(transport: ServiceTransport, baseUri: Uri)(
endpointUri(baseUri, "/v1/record", filterQuery(filter) ++ sortingQuery(sorting) ++ paginationQuery(pagination)))
for {
response <- transport.sendRequestGetResponse(requestContext)(request)
- reply <- apiResponse[ListResponse[ApiRecord]](response)
+ reply <- apiResponse[ListResponse[MedicalRecord]](response)
} yield {
- GetListReply.EntityList(reply.items.map(_.toDomain), reply.meta.itemsCount, reply.meta.lastUpdate)
+ GetListReply.EntityList(reply.items, reply.meta.itemsCount, reply.meta.lastUpdate)
}
}
def create(draftRecord: MedicalRecord)(implicit requestContext: AnonymousRequestContext): Future[CreateReply] = {
for {
- entity <- Marshal(ApiRecord.fromDomain(draftRecord)).to[RequestEntity]
+ entity <- Marshal(draftRecord).to[RequestEntity]
request = HttpRequest(HttpMethods.POST, endpointUri(baseUri, "/v1/record")).withEntity(entity)
response <- transport.sendRequestGetResponse(requestContext)(request)
- reply <- apiResponse[ApiRecord](response)
+ reply <- apiResponse[MedicalRecord](response)
} yield {
- CreateReply.Created(reply.toDomain)
+ CreateReply.Created(reply)
}
}
@@ -80,12 +81,12 @@ class RestMedicalRecordService(transport: ServiceTransport, baseUri: Uri)(
implicit requestContext: AuthenticatedRequestContext): Future[UpdateReply] = {
val id = origRecord.id.toString
for {
- entity <- Marshal(ApiRecord.fromDomain(draftRecord)).to[RequestEntity]
+ entity <- Marshal(draftRecord).to[RequestEntity]
request = HttpRequest(HttpMethods.PATCH, endpointUri(baseUri, s"/v1/record/$id")).withEntity(entity)
response <- transport.sendRequestGetResponse(requestContext)(request)
- reply <- apiResponse[ApiRecord](response)
+ reply <- apiResponse[MedicalRecord](response)
} yield {
- UpdateReply.Updated(reply.toDomain)
+ UpdateReply.Updated(reply)
}
}
@@ -95,9 +96,9 @@ class RestMedicalRecordService(transport: ServiceTransport, baseUri: Uri)(
val request = HttpRequest(HttpMethods.POST, endpointUri(baseUri, s"/v1/record/$id/$action"))
for {
response <- transport.sendRequestGetResponse(requestContext)(request)
- reply <- apiResponse[ApiRecord](response)
+ reply <- apiResponse[MedicalRecord](response)
} yield {
- UpdateReply.Updated(reply.toDomain)
+ UpdateReply.Updated(reply)
}
}
diff --git a/src/main/scala/xyz/driver/pdsuidomain/services/rest/RestMessageService.scala b/src/main/scala/xyz/driver/pdsuidomain/services/rest/RestMessageService.scala
deleted file mode 100644
index e133825..0000000
--- a/src/main/scala/xyz/driver/pdsuidomain/services/rest/RestMessageService.scala
+++ /dev/null
@@ -1,87 +0,0 @@
-package xyz.driver.pdsuidomain.services.rest
-
-import scala.concurrent.{ExecutionContext, Future}
-
-import akka.http.scaladsl.marshalling.Marshal
-import akka.http.scaladsl.model._
-import akka.stream.Materializer
-import xyz.driver.core.rest.{Pagination => _, _}
-import xyz.driver.pdsuicommon.auth._
-import xyz.driver.pdsuicommon.db._
-import xyz.driver.pdsuicommon.domain._
-import xyz.driver.pdsuidomain.entities._
-import xyz.driver.pdsuidomain.formats.json.ListResponse
-import xyz.driver.pdsuidomain.formats.json.message.ApiMessage
-import xyz.driver.pdsuidomain.services.MessageService
-
-class RestMessageService(transport: ServiceTransport, baseUri: Uri)(implicit protected val materializer: Materializer,
- protected val exec: ExecutionContext)
- extends MessageService with RestHelper {
-
- import xyz.driver.pdsuicommon.serialization.PlayJsonSupport._
- import xyz.driver.pdsuidomain.services.MessageService._
-
- def create(draftMessage: Message)(implicit requestContext: AuthenticatedRequestContext): Future[CreateReply] = {
- for {
- entity <- Marshal(ApiMessage.fromDomain(draftMessage)).to[RequestEntity]
- request = HttpRequest(HttpMethods.POST, endpointUri(baseUri, "/v1/message")).withEntity(entity)
- response <- transport.sendRequestGetResponse(requestContext)(request)
- reply <- apiResponse[ApiMessage](response)
- } yield {
- CreateReply.Created(reply.toDomain)
- }
- }
-
- def getById(messageId: LongId[Message])(implicit requestContext: AuthenticatedRequestContext): Future[GetByIdReply] = {
- import xyz.driver.pdsuicommon.db.SearchFilterBinaryOperation._
- import xyz.driver.pdsuicommon.db.SearchFilterExpr._
- val filter = Atom.Binary("id", Eq, messageId)
- getAll(filter).map({
- case GetListReply.EntityList(messages, _, _) if messages.isEmpty =>
- GetByIdReply.NotFoundError
- case GetListReply.EntityList(messages, _, _) =>
- GetByIdReply.Entity(messages.head)
- case GetListReply.AuthorizationError =>
- GetByIdReply.AuthorizationError
- })
- }
-
- def getAll(filter: SearchFilterExpr = SearchFilterExpr.Empty,
- sorting: Option[Sorting] = None,
- pagination: Option[Pagination] = None)(
- implicit requestContext: AuthenticatedRequestContext): Future[GetListReply] = {
- val request = HttpRequest(
- HttpMethods.GET,
- endpointUri(baseUri, "/v1/message", filterQuery(filter) ++ sortingQuery(sorting) ++ paginationQuery(pagination)))
- for {
- response <- transport.sendRequestGetResponse(requestContext)(request)
- reply <- apiResponse[ListResponse[ApiMessage]](response)
- } yield {
- GetListReply.EntityList(reply.items.map(_.toDomain), reply.meta.itemsCount, reply.meta.lastUpdate)
- }
- }
-
- def update(origMessage: Message, draftMessage: Message)(
- implicit requestContext: AuthenticatedRequestContext): Future[UpdateReply] = {
- for {
- entity <- Marshal(ApiMessage.fromDomain(draftMessage)).to[RequestEntity]
- id = origMessage.id.id
- request = HttpRequest(HttpMethods.PATCH, endpointUri(baseUri, s"/v1/message/$id")).withEntity(entity)
- response <- transport.sendRequestGetResponse(requestContext)(request)
- reply <- apiResponse[ApiMessage](response)
- } yield {
- UpdateReply.Updated(reply.toDomain)
- }
- }
-
- def delete(messageId: LongId[Message])(implicit requestContext: AuthenticatedRequestContext): Future[DeleteReply] = {
- val request = HttpRequest(HttpMethods.DELETE, endpointUri(baseUri, s"/v1/message/${messageId.id}"))
- for {
- response <- transport.sendRequestGetResponse(requestContext)(request)
- _ <- apiResponse[HttpEntity](response)
- } yield {
- DeleteReply.Deleted
- }
- }
-
-}
diff --git a/src/main/scala/xyz/driver/pdsuidomain/services/rest/RestPatientService.scala b/src/main/scala/xyz/driver/pdsuidomain/services/rest/RestPatientService.scala
index b9cbec8..af3c782 100644
--- a/src/main/scala/xyz/driver/pdsuidomain/services/rest/RestPatientService.scala
+++ b/src/main/scala/xyz/driver/pdsuidomain/services/rest/RestPatientService.scala
@@ -8,25 +8,27 @@ import xyz.driver.core.rest.{Pagination => _, _}
import xyz.driver.pdsuicommon.auth._
import xyz.driver.pdsuicommon.db._
import xyz.driver.pdsuicommon.domain._
+import xyz.driver.pdsuidomain.ListResponse
import xyz.driver.pdsuidomain.entities._
-import xyz.driver.pdsuidomain.formats.json.ListResponse
-import xyz.driver.pdsuidomain.formats.json.patient.ApiPatient
import xyz.driver.pdsuidomain.services.PatientService
class RestPatientService(transport: ServiceTransport, baseUri: Uri)(implicit protected val materializer: Materializer,
protected val exec: ExecutionContext)
extends PatientService with RestHelper {
- import xyz.driver.pdsuicommon.serialization.PlayJsonSupport._
+ import akka.http.scaladsl.marshallers.sprayjson.SprayJsonSupport._
+ import xyz.driver.pdsuidomain.formats.json.listresponse._
+ import xyz.driver.pdsuidomain.formats.json.patient._
+
import xyz.driver.pdsuidomain.services.PatientService._
def getById(id: UuidId[Patient])(implicit requestContext: AuthenticatedRequestContext): Future[GetByIdReply] = {
val request = HttpRequest(HttpMethods.GET, endpointUri(baseUri, s"/v1/patient/$id"))
for {
response <- transport.sendRequestGetResponse(requestContext)(request)
- reply <- apiResponse[ApiPatient](response)
+ reply <- apiResponse[Patient](response)
} yield {
- GetByIdReply.Entity(reply.toDomain)
+ GetByIdReply.Entity(reply)
}
}
@@ -39,9 +41,9 @@ class RestPatientService(transport: ServiceTransport, baseUri: Uri)(implicit pro
endpointUri(baseUri, "/v1/patient", filterQuery(filter) ++ sortingQuery(sorting) ++ paginationQuery(pagination)))
for {
response <- transport.sendRequestGetResponse(requestContext)(request)
- reply <- apiResponse[ListResponse[ApiPatient]](response)
+ reply <- apiResponse[ListResponse[Patient]](response)
} yield {
- GetListReply.EntityList(reply.items.map(_.toDomain), reply.meta.itemsCount, reply.meta.lastUpdate)
+ GetListReply.EntityList(reply.items, reply.meta.itemsCount, reply.meta.lastUpdate)
}
}
@@ -51,9 +53,9 @@ class RestPatientService(transport: ServiceTransport, baseUri: Uri)(implicit pro
val request = HttpRequest(HttpMethods.POST, endpointUri(baseUri, s"/v1/patient/$id/$action"))
for {
response <- transport.sendRequestGetResponse(requestContext)(request)
- reply <- apiResponse[ApiPatient](response)
+ reply <- apiResponse[Patient](response)
} yield {
- UpdateReply.Updated(reply.toDomain)
+ UpdateReply.Updated(reply)
}
}
diff --git a/src/main/scala/xyz/driver/pdsuidomain/services/rest/RestProviderTypeService.scala b/src/main/scala/xyz/driver/pdsuidomain/services/rest/RestProviderTypeService.scala
index f82ec40..f038c95 100644
--- a/src/main/scala/xyz/driver/pdsuidomain/services/rest/RestProviderTypeService.scala
+++ b/src/main/scala/xyz/driver/pdsuidomain/services/rest/RestProviderTypeService.scala
@@ -1,22 +1,23 @@
package xyz.driver.pdsuidomain.services.rest
import scala.concurrent.{ExecutionContext, Future}
-
import akka.http.scaladsl.model._
import akka.stream.Materializer
import xyz.driver.core.rest.{Pagination => _, _}
import xyz.driver.pdsuicommon.auth._
import xyz.driver.pdsuicommon.db._
-import xyz.driver.pdsuidomain.formats.json.ListResponse
+import xyz.driver.pdsuidomain.ListResponse
+import xyz.driver.pdsuidomain.entities.ProviderType
import xyz.driver.pdsuidomain.services.ProviderTypeService
-import xyz.driver.pdsuidomain.formats.json.document.ApiProviderType
class RestProviderTypeService(transport: ServiceTransport, baseUri: Uri)(
implicit protected val materializer: Materializer,
protected val exec: ExecutionContext)
extends ProviderTypeService with RestHelper {
- import xyz.driver.pdsuicommon.serialization.PlayJsonSupport._
+ import akka.http.scaladsl.marshallers.sprayjson.SprayJsonSupport._
+ import xyz.driver.pdsuidomain.formats.json.listresponse._
+ import xyz.driver.pdsuidomain.formats.json.record.providerTypeFormat
import xyz.driver.pdsuidomain.services.ProviderTypeService._
def getAll(sorting: Option[Sorting] = None)(
@@ -24,9 +25,9 @@ class RestProviderTypeService(transport: ServiceTransport, baseUri: Uri)(
val request = HttpRequest(HttpMethods.GET, endpointUri(baseUri, "/v1/provider-type", sortingQuery(sorting)))
for {
response <- transport.sendRequestGetResponse(requestContext)(request)
- reply <- apiResponse[ListResponse[ApiProviderType]](response)
+ reply <- apiResponse[ListResponse[ProviderType]](response)
} yield {
- GetListReply.EntityList(reply.items.map(_.toDomain), reply.meta.itemsCount)
+ GetListReply.EntityList(reply.items, reply.meta.itemsCount)
}
}
diff --git a/src/main/scala/xyz/driver/pdsuidomain/services/rest/RestStudyDesignService.scala b/src/main/scala/xyz/driver/pdsuidomain/services/rest/RestStudyDesignService.scala
index b1684eb..d3f0eb7 100644
--- a/src/main/scala/xyz/driver/pdsuidomain/services/rest/RestStudyDesignService.scala
+++ b/src/main/scala/xyz/driver/pdsuidomain/services/rest/RestStudyDesignService.scala
@@ -1,14 +1,13 @@
package xyz.driver.pdsuidomain.services.rest
import scala.concurrent.{ExecutionContext, Future}
-
import akka.http.scaladsl.model._
import akka.stream.Materializer
import xyz.driver.core.rest._
import xyz.driver.pdsuicommon.auth._
import xyz.driver.pdsuicommon.db._
-import xyz.driver.pdsuidomain.formats.json.ListResponse
-import xyz.driver.pdsuidomain.formats.json.studydesign.ApiStudyDesign
+import xyz.driver.pdsuidomain.ListResponse
+import xyz.driver.pdsuidomain.entities.StudyDesign
import xyz.driver.pdsuidomain.services.StudyDesignService
class RestStudyDesignService(transport: ServiceTransport, baseUri: Uri)(
@@ -16,7 +15,9 @@ class RestStudyDesignService(transport: ServiceTransport, baseUri: Uri)(
protected val exec: ExecutionContext)
extends StudyDesignService with RestHelper {
- import xyz.driver.pdsuicommon.serialization.PlayJsonSupport._
+ import akka.http.scaladsl.marshallers.sprayjson.SprayJsonSupport._
+ import xyz.driver.pdsuidomain.formats.json.listresponse._
+ import xyz.driver.pdsuidomain.formats.json.studydesign._
import xyz.driver.pdsuidomain.services.StudyDesignService._
def getAll(sorting: Option[Sorting] = None)(
@@ -24,9 +25,9 @@ class RestStudyDesignService(transport: ServiceTransport, baseUri: Uri)(
val request = HttpRequest(HttpMethods.GET, endpointUri(baseUri, "/v1/study-design", sortingQuery(sorting)))
for {
response <- transport.sendRequestGetResponse(requestContext)(request)
- reply <- apiResponse[ListResponse[ApiStudyDesign]](response)
+ reply <- apiResponse[ListResponse[StudyDesign]](response)
} yield {
- GetListReply.EntityList(reply.items.flatMap(_.toDomain), reply.meta.itemsCount)
+ GetListReply.EntityList(reply.items, reply.meta.itemsCount)
}
}
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 ea719e1..04b45fb 100644
--- a/src/main/scala/xyz/driver/pdsuidomain/services/rest/RestTrialService.scala
+++ b/src/main/scala/xyz/driver/pdsuidomain/services/rest/RestTrialService.scala
@@ -13,28 +13,28 @@ import xyz.driver.pdsuicommon.db._
import xyz.driver.pdsuicommon.domain._
import xyz.driver.pdsuidomain.entities._
import xyz.driver.pdsuidomain.entities.export.trial.ExportTrialWithLabels
-import xyz.driver.pdsuidomain.formats.json.ListResponse
-import xyz.driver.pdsuidomain.formats.json.trial.ApiTrial
import xyz.driver.pdsuidomain.services.TrialService
import spray.json.DefaultJsonProtocol._
-import akka.http.scaladsl.marshallers.sprayjson.SprayJsonSupport._
import xyz.driver.entities.patient.CancerType
-import xyz.driver.pdsuidomain.formats.json.sprayformats.export._
+import xyz.driver.pdsuidomain.ListResponse
+import xyz.driver.pdsuidomain.formats.json.export._
class RestTrialService(transport: ServiceTransport, baseUri: Uri)(implicit protected val materializer: Materializer,
protected val exec: ExecutionContext)
extends TrialService with RestHelper {
- import xyz.driver.pdsuicommon.serialization.PlayJsonSupport._
+ import akka.http.scaladsl.marshallers.sprayjson.SprayJsonSupport._
+ import xyz.driver.pdsuidomain.formats.json.listresponse._
+ import xyz.driver.pdsuidomain.formats.json.trial._
import xyz.driver.pdsuidomain.services.TrialService._
def getById(id: StringId[Trial])(implicit requestContext: AuthenticatedRequestContext): Future[GetByIdReply] = {
val request = HttpRequest(HttpMethods.GET, endpointUri(baseUri, s"/v1/trial/$id"))
for {
response <- transport.sendRequestGetResponse(requestContext)(request)
- reply <- apiResponse[ApiTrial](response)
+ reply <- apiResponse[Trial](response)
} yield {
- GetByIdReply.Entity(reply.toDomain)
+ GetByIdReply.Entity(reply)
}
}
@@ -80,9 +80,9 @@ class RestTrialService(transport: ServiceTransport, baseUri: Uri)(implicit prote
endpointUri(baseUri, "/v1/trial", filterQuery(filter) ++ sortingQuery(sorting) ++ paginationQuery(pagination)))
for {
response <- transport.sendRequestGetResponse(requestContext)(request)
- reply <- apiResponse[ListResponse[ApiTrial]](response)
+ reply <- apiResponse[ListResponse[Trial]](response)
} yield {
- GetListReply.EntityList(reply.items.map(_.toDomain), reply.meta.itemsCount, reply.meta.lastUpdate)
+ GetListReply.EntityList(reply.items, reply.meta.itemsCount, reply.meta.lastUpdate)
}
}
@@ -90,12 +90,12 @@ class RestTrialService(transport: ServiceTransport, baseUri: Uri)(implicit prote
implicit requestContext: AuthenticatedRequestContext): Future[UpdateReply] = {
val id = origTrial.id.id
for {
- entity <- Marshal(ApiTrial.fromDomain(draftTrial)).to[RequestEntity]
+ entity <- Marshal(draftTrial).to[RequestEntity]
request = HttpRequest(HttpMethods.PATCH, endpointUri(baseUri, s"/v1/trial/$id")).withEntity(entity)
response <- transport.sendRequestGetResponse(requestContext)(request)
- reply <- apiResponse[ApiTrial](response)
+ reply <- apiResponse[Trial](response)
} yield {
- UpdateReply.Updated(reply.toDomain)
+ UpdateReply.Updated(reply)
}
}
@@ -105,9 +105,9 @@ class RestTrialService(transport: ServiceTransport, baseUri: Uri)(implicit prote
val request = HttpRequest(HttpMethods.GET, endpointUri(baseUri, s"/v1/trial/$id/$action"))
for {
response <- transport.sendRequestGetResponse(requestContext)(request)
- reply <- apiResponse[ApiTrial](response)
+ reply <- apiResponse[Trial](response)
} yield {
- UpdateReply.Updated(reply.toDomain)
+ UpdateReply.Updated(reply)
}
}
diff --git a/src/test/scala/xyz/driver/pdsuicommon/BaseSuite.scala b/src/test/scala/xyz/driver/pdsuicommon/BaseSuite.scala
index 7c9d8c4..29e7610 100644
--- a/src/test/scala/xyz/driver/pdsuicommon/BaseSuite.scala
+++ b/src/test/scala/xyz/driver/pdsuicommon/BaseSuite.scala
@@ -5,15 +5,12 @@ import java.time.{LocalDateTime, ZoneId}
import org.scalatest.FreeSpecLike
import org.scalatest.concurrent.ScalaFutures
import org.scalatest.time.{Millis, Span}
-import xyz.driver.pdsuicommon.db._
import xyz.driver.pdsuicommon.domain._
-import xyz.driver.pdsuicommon.error.UnexpectedFilterException
import xyz.driver.pdsuicommon.utils.DiffUtils
trait BaseSuite extends FreeSpecLike with DiffUtils with ScalaFutures {
implicit val defaultPatience = PatienceConfig(timeout = Span(1000, Millis), interval = Span(20, Millis))
- implicit val sqlContext = new MockMySqlContext()
def sampleUser(role: User.Role, email: String = "test@example.com", password: String = "123") = User(
id = StringId("2001"),
@@ -23,13 +20,4 @@ trait BaseSuite extends FreeSpecLike with DiffUtils with ScalaFutures {
latestActivity = Some(LocalDateTime.now(ZoneId.of("Z"))),
deleted = None
)
-
- def createMockQueryBuilder[T](isExpectedFilter: SearchFilterExpr => Boolean): MysqlQueryBuilder[T] = {
- MockQueryBuilder[T] {
- case (filter, _, _) if isExpectedFilter(filter) => Seq.empty
- case (filter, _, _) => throw new UnexpectedFilterException(s"Filter is unexpected: $filter")
- } {
- case _ => (0, Option.empty[LocalDateTime])
- }
- }
}
diff --git a/src/test/scala/xyz/driver/pdsuicommon/Mocks.scala b/src/test/scala/xyz/driver/pdsuicommon/Mocks.scala
index 51d39e5..699020c 100644
--- a/src/test/scala/xyz/driver/pdsuicommon/Mocks.scala
+++ b/src/test/scala/xyz/driver/pdsuicommon/Mocks.scala
@@ -6,7 +6,7 @@ import java.sql.Connection
import java.util.logging.Logger
import javax.sql.DataSource
-import com.typesafe.config.ConfigFactory
+import xyz.driver.pdsuicommon.db.SlickQueryBuilder.TableData
import xyz.driver.pdsuicommon.db._
import xyz.driver.pdsuicommon.http.HttpFetcher
@@ -27,32 +27,7 @@ class MockDataSource extends DataSource with Closeable {
override def isWrapperFor(iface: Class[_]): Boolean = throw new NotImplementedError("MockDataSource.isWrapperFor")
}
-object MockMySqlContext {
-
- val Settings = MySqlContext.Settings(
- credentials = MySqlContext.DbCredentials(
- user = "test",
- password = "test",
- host = "localhost",
- port = 3248,
- dbName = "test",
- dbCreateFlag = false,
- dbContext = "test",
- connectionParams = "",
- url = ""
- ),
- connection = ConfigFactory.empty(),
- threadPoolSize = 10
- )
-}
-
-class MockMySqlContext() extends MySqlContext(new MockDataSource, MockMySqlContext.Settings) {
- override protected def withConnection[T](f: Connection => T): Nothing = {
- throw new NotImplementedError("MockSqlContext.withConnection")
- }
-}
-
-class MockFactory()(implicit val sqlContext: MySqlContext) {
+class MockFactory()(implicit val sqlContext: PostgresContext) {
val MockHttpFetcher: HttpFetcher = { (url: URL) =>
Future.successful(Array.empty[Byte])
}
@@ -61,28 +36,26 @@ class MockFactory()(implicit val sqlContext: MySqlContext) {
object MockQueryBuilder {
type MockRunnerIn = (SearchFilterExpr, Sorting, Option[Pagination])
- type MockRunnerOut[T] = Seq[T]
- type MockCountRunnerOut = QueryBuilder.CountResult
+ type MockRunnerOut[T] = Future[Seq[T]]
+ type MockCountRunnerOut = SlickQueryBuilder.CountResult
def apply[T](matcher: PartialFunction[MockRunnerIn, MockRunnerOut[T]])(
countMatcher: PartialFunction[MockRunnerIn, MockCountRunnerOut])(
- implicit context: MySqlContext): MysqlQueryBuilder[T] = {
+ implicit context: PostgresContext): SlickQueryBuilder[T] = {
- val runner: QueryBuilder.Runner[T] = { parameters =>
+ val runner: SlickQueryBuilder.Runner[T] = { parameters =>
matcher((parameters.filter, parameters.sorting, parameters.pagination))
}
- val countRunner: QueryBuilder.CountRunner = { parameters =>
+ val countRunner: SlickQueryBuilder.CountRunner = { parameters =>
countMatcher((parameters.filter, parameters.sorting, parameters.pagination))
}
- MysqlQueryBuilder[T](
- tableName = "",
- lastUpdateFieldName = Option.empty[String],
- nullableFields = Set.empty[String],
- links = Set.empty[TableLink],
- runner = runner,
- countRunner = countRunner
+ val parameters = SlickPostgresQueryBuilderParameters(
+ databaseName = "test",
+ tableData = TableData("", None, Set.empty[String]),
+ links = Map.empty
)
+ new SlickPostgresQueryBuilder(parameters)(runner, countRunner)
}
}
diff --git a/src/test/scala/xyz/driver/pdsuicommon/concurrent/BridgeUploadQueueRepositoryAdapterSuite.scala b/src/test/scala/xyz/driver/pdsuicommon/concurrent/BridgeUploadQueueRepositoryAdapterSuite.scala
deleted file mode 100644
index 8b38316..0000000
--- a/src/test/scala/xyz/driver/pdsuicommon/concurrent/BridgeUploadQueueRepositoryAdapterSuite.scala
+++ /dev/null
@@ -1,285 +0,0 @@
-package xyz.driver.pdsuicommon.concurrent
-
-import java.util.concurrent.ThreadLocalRandom
-
-import xyz.driver.pdsuicommon.BaseSuite
-import xyz.driver.pdsuicommon.concurrent.BridgeUploadQueueRepositoryAdapter.Strategy
-import xyz.driver.pdsuicommon.concurrent.BridgeUploadQueueRepositoryAdapter.Strategy.{OnAttempt, OnComplete}
-import xyz.driver.pdsuicommon.db.{FakeDbIo, MysqlQueryBuilder}
-import xyz.driver.pdsuicommon.db.repositories.BridgeUploadQueueRepository
-
-import scala.concurrent.Future
-import scala.concurrent.duration.DurationInt
-
-class BridgeUploadQueueRepositoryAdapterSuite extends BaseSuite {
-
- // IDEA have some issue here with imports
- private implicit val executionContext = scala.concurrent.ExecutionContext.global
-
- "Strategy" - {
- "LimitExponential" - {
- "on" - {
- val strategy = Strategy.LimitExponential(
- startInterval = 10.seconds,
- intervalFactor = 1.4,
- maxInterval = 50.seconds,
- onComplete = OnComplete.Delete
- )
-
- "a new interval should be greater than the previous one if the limit not reached" in {
- val previous = strategy.on(1)
- val current = strategy.on(2)
-
- (previous, current) match {
- case (OnAttempt.Continue(a), OnAttempt.Continue(b)) => assert(a < b)
- case x => fail(s"Unexpected result: $x")
- }
- }
-
- "should limit intervals" in {
- assert(strategy.on(20) == OnAttempt.Continue(strategy.maxInterval))
- }
-
- "should not fail, if there is many attempts" in {
- assert(strategy.on(1000) == OnAttempt.Continue(strategy.maxInterval))
- }
- }
- }
- }
-
- "complete" - {
- "onComplete == mark" - {
- "should update the item" in {
- var done = false
- val item = defaultItem
-
- val repository = new BridgeUploadQueueRepository {
- override def add(draft: EntityT): EntityT = draft
- override def getOne(kind: String): Option[EntityT] = fail("getOne should not be used!")
- override def buildQuery: MysqlQueryBuilder[EntityT] = fail("buildQuery should not be used!")
-
- override def delete(kind: String, tag: String): Unit = throw new IllegalStateException("Impossible call")
-
- override def update(entity: EntityT): EntityT = {
- assert(entity.kind == item.kind, "repository.delete, kind")
- assert(entity.tag == item.tag, "repository.delete, tag")
- done = true
- entity
- }
-
- override def getById(kind: String, tag: String): Option[EntityT] = Some(item)
- }
-
- val adapter = new BridgeUploadQueueRepositoryAdapter(
- strategy = Strategy.Stop(OnComplete.Mark),
- repository = repository,
- dbIo = FakeDbIo
- )
-
- assert(adapter.complete(item.kind, item.tag).isReadyWithin(100.millis))
- assert(done)
- }
- }
-
- "onComplete == delete" - {
- "should delete the item" in {
- var done = false
- val item = defaultItem
-
- val repository = new BridgeUploadQueueRepository {
- override def add(draft: EntityT): EntityT = draft
- override def getOne(kind: String): Option[EntityT] = fail("getOne should not be used!")
- override def buildQuery: MysqlQueryBuilder[EntityT] = fail("buildQuery should not be used!")
- override def getById(kind: String, tag: String): Option[EntityT] = fail("getById should not be used!")
-
- override def delete(kind: String, tag: String): Unit = {
- assert(kind == item.kind, "repository.delete, kind")
- assert(tag == item.tag, "repository.delete, tag")
- done = true
- }
- override def update(entity: EntityT): EntityT = throw new IllegalStateException("Impossible call")
- }
-
- val adapter = new BridgeUploadQueueRepositoryAdapter(
- strategy = Strategy.Stop(OnComplete.Delete),
- repository = repository,
- dbIo = FakeDbIo
- )
-
- assert(adapter.complete(item.kind, item.tag).isReadyWithin(100.millis))
- assert(done)
- }
- }
- }
-
- "tryRetry" - {
-
- "when all attempts are not out" - {
-
- val defaultStrategy = Strategy.Constant(10.seconds)
-
- "should return an updated item" in {
- val repository = new BridgeUploadQueueRepository {
- override def add(draft: EntityT): EntityT = draft
- override def getOne(kind: String): Option[EntityT] = fail("getOne should not be used!")
- override def buildQuery: MysqlQueryBuilder[EntityT] = fail("buildQuery should not be used!")
- override def getById(kind: String, tag: String): Option[EntityT] = fail("getById should not be used!")
-
- override def update(draft: EntityT): EntityT = draft
- override def delete(kind: String, tag: String): Unit = throw new IllegalAccessError(s"kind=$kind, tag=$tag")
- }
-
- val adapter = new BridgeUploadQueueRepositoryAdapter(
- strategy = defaultStrategy,
- repository = repository,
- dbIo = FakeDbIo
- )
-
- val item = defaultItem
- val r = adapter.tryRetry(item).futureValue
- assert(r.isDefined)
- assert(!r.contains(item))
- }
-
- "should update an item with increased attempts" in {
- val item = defaultItem
-
- val repository = new BridgeUploadQueueRepository {
- override def add(draft: EntityT): EntityT = draft
- override def getOne(kind: String): Option[EntityT] = fail("getOne should not be used!")
- override def buildQuery: MysqlQueryBuilder[EntityT] = fail("buildQuery should not be used!")
- override def getById(kind: String, tag: String): Option[EntityT] = fail("getById should not be used!")
-
- override def update(draft: EntityT): EntityT = {
- assert(draft.attempts === (item.attempts + 1), "repository.add")
- draft
- }
- override def delete(kind: String, tag: String): Unit = throw new IllegalAccessError(s"kind=$kind, tag=$tag")
- }
-
- val adapter = new BridgeUploadQueueRepositoryAdapter(
- strategy = defaultStrategy,
- repository = repository,
- dbIo = FakeDbIo
- )
-
- assert(adapter.tryRetry(item).isReadyWithin(100.millis))
- }
-
- "should remove an old item" in {
- val item = defaultItem
-
- val repository = new BridgeUploadQueueRepository {
- override def add(draft: EntityT): EntityT = draft
- override def getOne(kind: String): Option[EntityT] = fail("getOne should not be used!")
- override def buildQuery: MysqlQueryBuilder[EntityT] = fail("buildQuery should not be used!")
- override def getById(kind: String, tag: String): Option[EntityT] = fail("getById should not be used!")
- override def update(draft: EntityT): EntityT = draft
- override def delete(kind: String, tag: String): Unit = {
- assert(kind == item.kind, "repository.delete, kind")
- assert(tag == item.tag, "repository.delete, kind")
- }
- }
-
- val adapter = new BridgeUploadQueueRepositoryAdapter(
- strategy = defaultStrategy,
- repository = repository,
- dbIo = FakeDbIo
- )
-
- assert(adapter.tryRetry(item).isReadyWithin(100.millis))
- }
-
- "should update time of the next attempt" in {
- val item = defaultItem
-
- val repository = new BridgeUploadQueueRepository {
- override def add(draft: EntityT): EntityT = draft
- override def getOne(kind: String): Option[EntityT] = fail("getOne should not be used!")
- override def buildQuery: MysqlQueryBuilder[EntityT] = fail("buildQuery should not be used!")
- override def getById(kind: String, tag: String): Option[EntityT] = fail("getById should not be used!")
-
- override def update(draft: EntityT): EntityT = {
- assert(draft.nextAttempt.isAfter(item.nextAttempt), "repository.add")
- draft
- }
- override def delete(kind: String, tag: String): Unit = throw new IllegalAccessError(s"kind=$kind, tag=$tag")
- }
-
- val adapter = new BridgeUploadQueueRepositoryAdapter(
- strategy = defaultStrategy,
- repository = repository,
- dbIo = FakeDbIo
- )
-
- assert(adapter.tryRetry(item).isReadyWithin(100.millis))
- }
-
- }
-
- "when all attempts are out" - {
-
- val defaultStrategy = Strategy.Stop()
-
- "should not return an item" in {
- val repository = new BridgeUploadQueueRepository {
- override def add(draft: EntityT): EntityT = draft
- override def getOne(kind: String): Option[EntityT] = fail("getOne should not be used!")
- override def buildQuery: MysqlQueryBuilder[EntityT] = fail("buildQuery should not be used!")
- override def getById(kind: String, tag: String): Option[EntityT] = fail("getById should not be used!")
- override def update(entity: EntityT): EntityT = fail("update should not be used!")
-
- override def delete(kind: String, tag: String): Unit = {}
- }
-
- val adapter = new BridgeUploadQueueRepositoryAdapter(
- strategy = defaultStrategy,
- repository = repository,
- dbIo = FakeDbIo
- )
-
- val r = adapter.tryRetry(defaultItem).futureValue
- assert(r.isEmpty)
- }
-
- "should complete the item" in {
- var taskWasCompleted = false
- val item = defaultItem
-
- val repository = new BridgeUploadQueueRepository {
- override def add(draft: EntityT): EntityT = draft
- override def getOne(kind: String): Option[EntityT] = fail("getOne should not be used!")
- override def buildQuery: MysqlQueryBuilder[EntityT] = fail("buildQuery should not be used!")
- override def getById(kind: String, tag: String): Option[EntityT] = fail("getById should not be used!")
- override def update(entity: EntityT): EntityT = fail("update should not be used!")
-
- override def delete(kind: String, tag: String): Unit = {}
- }
-
- val adapter = new BridgeUploadQueueRepositoryAdapter(
- strategy = defaultStrategy,
- repository = repository,
- dbIo = FakeDbIo
- ) {
- override def complete(kind: String, tag: String): Future[Unit] = Future {
- assert(kind == item.kind, "adapter.complete, kind")
- assert(tag == item.tag, "adapter.complete, tag")
- taskWasCompleted = true
- }
- }
-
- val r = adapter.tryRetry(item).futureValue
- assert(r.isEmpty)
- assert(taskWasCompleted)
- }
-
- }
-
- }
-
- private def defaultItem = BridgeUploadQueue.Item(
- "test",
- ThreadLocalRandom.current().nextInt().toString
- )
-
-}
diff --git a/src/test/scala/xyz/driver/pdsuicommon/db/QueryBuilderParametersSuite.scala b/src/test/scala/xyz/driver/pdsuicommon/db/QueryBuilderParametersSuite.scala
deleted file mode 100644
index 2c23b92..0000000
--- a/src/test/scala/xyz/driver/pdsuicommon/db/QueryBuilderParametersSuite.scala
+++ /dev/null
@@ -1,310 +0,0 @@
-package xyz.driver.pdsuicommon.db
-
-import java.time.LocalDateTime
-
-import io.getquill.MysqlEscape
-import org.scalatest.FreeSpecLike
-import xyz.driver.pdsuicommon.db.QueryBuilder.TableData
-import xyz.driver.pdsuicommon.domain._
-
-class QueryBuilderParametersSuite extends FreeSpecLike {
-
- import SearchFilterBinaryOperation._
- import SearchFilterExpr.{Dimension => _, _}
- import SearchFilterNAryOperation._
- import Sorting._
- import SortingOrder._
-
- val tableName = "Entity"
-
- case class Entity(id: LongId[Entity],
- name: String,
- email: Email,
- optionUser: Option[StringId[User]],
- date: LocalDateTime,
- optionDate: Option[LocalDateTime],
- kindId: Long)
-
- def queryBuilderParameters = MysqlQueryBuilderParameters(
- tableData = TableData(
- tableName = tableName,
- nullableFields = Set("optionUser", "optionDate")
- ),
- links = Map(
- "Kind" -> TableLink("kindId", "Kind", "id"),
- "User" -> TableLink("optionUser", "User", "id")
- )
- )
-
- val queryBasis =
- s"""select `$tableName`.*
- |from `$tableName`""".stripMargin.trim
-
- "toSql" - {
- "should generate correct SQL query" - {
- "with default parameters" in {
- val (sql, _) = queryBuilderParameters.toSql(namingStrategy = MysqlEscape)
- assert(sql == queryBasis)
- }
-
- "with filtering: " - {
- "single atom filter" in {
- val (sql, _) =
- queryBuilderParameters.copy(filter = Atom.Binary("name", Eq, "x")).toSql(namingStrategy = MysqlEscape)
- assert(
- sql ==
- s"""$queryBasis
- |where `$tableName`.`name` = ?""".stripMargin)
- }
-
- "single atom filter for optional field with NotEq operation" in {
- val (sql, _) = queryBuilderParameters
- .copy(filter = Atom.Binary("optionUser", NotEq, "x"))
- .toSql(namingStrategy = MysqlEscape)
- assert(
- sql ==
- s"""$queryBasis
- |where (`$tableName`.`optionUser` is null or `$tableName`.`optionUser` != ?)""".stripMargin)
- }
-
- "single atom filter for field with IN operation" in {
- val (sql, _) = queryBuilderParameters
- .copy(filter = Atom.NAry("date", In, Seq("x", "x", "x")))
- .toSql(namingStrategy = MysqlEscape)
- assert(
- sql ==
- s"""$queryBasis
- |where `$tableName`.`date` in (?, ?, ?)""".stripMargin)
- }
-
- "multiple intersected filters" in {
- val (sql, _) = queryBuilderParameters
- .copy(
- filter = Intersection(
- Seq(
- Atom.Binary("name", Gt, "x"),
- Atom.Binary("optionDate", GtEq, "x")
- )))
- .toSql(namingStrategy = MysqlEscape)
- assert(
- sql ==
- s"""$queryBasis
- |where (`$tableName`.`name` > ? and `$tableName`.`optionDate` >= ?)""".stripMargin)
- }
-
- "multiple intersected nested filters" in {
- val (sql, _) = queryBuilderParameters
- .copy(
- filter = Intersection(
- Seq(
- Atom.Binary("name", Gt, "x"),
- Atom.Binary("optionDate", GtEq, "x"),
- Intersection(Seq(
- Atom.Binary("optionUser", Eq, "x"),
- Atom.Binary("date", LtEq, "x")
- ))
- )))
- .toSql(namingStrategy = MysqlEscape)
- assert(
- sql ==
- s"$queryBasis\nwhere (`$tableName`.`name` > ? and `$tableName`.`optionDate` >= ?" +
- s" and (`$tableName`.`optionUser` = ? and `$tableName`.`date` <= ?))")
- }
-
- "multiple unionized filters" in {
- val (sql, _) = queryBuilderParameters
- .copy(
- filter = Union(
- Seq(
- Atom.Binary("name", Gt, "x"),
- Atom.Binary("optionDate", GtEq, "x")
- )))
- .toSql(namingStrategy = MysqlEscape)
- assert(
- sql ==
- s"""$queryBasis
- |where (`$tableName`.`name` > ? or `$tableName`.`optionDate` >= ?)""".stripMargin.trim)
- }
-
- "multiple unionized nested filters" in {
- val (sql, _) = queryBuilderParameters
- .copy(
- filter = Union(
- Seq(
- Atom.Binary("name", Gt, "x"),
- Atom.Binary("optionDate", GtEq, "x"),
- Union(Seq(
- Atom.Binary("optionUser", Eq, "x"),
- Atom.Binary("date", LtEq, "x")
- ))
- )))
- .toSql(namingStrategy = MysqlEscape)
- assert(
- sql ==
- s"""$queryBasis
- |where (`$tableName`.`name` > ? or `$tableName`.`optionDate` >= ? or (`$tableName`.`optionUser` = ? or `$tableName`.`date` <= ?))""".stripMargin)
- }
-
- "multiple unionized and intersected nested filters" in {
- val (sql, _) = queryBuilderParameters
- .copy(filter = Union(Seq(
- Intersection(Seq(
- Atom.Binary("name", Gt, "x"),
- Atom.Binary("optionDate", GtEq, "x")
- )),
- Intersection(Seq(
- Atom.Binary("optionUser", Eq, "x"),
- Atom.Binary("date", LtEq, "x")
- ))
- )))
- .toSql(namingStrategy = MysqlEscape)
-
- assert(
- sql ==
- s"$queryBasis\nwhere ((`$tableName`.`name` > ? and `$tableName`.`optionDate` >= ?) " +
- s"or (`$tableName`.`optionUser` = ? and `$tableName`.`date` <= ?))")
- }
-
- "single field from foreign table" in {
- val (sql, _) = queryBuilderParameters
- .copy(filter = Atom.Binary(SearchFilterExpr.Dimension(Some("Kind"), "name"), Eq, "x"))
- .toSql(namingStrategy = MysqlEscape)
- val pattern =
- s"""select `$tableName`.*
- |from `$tableName`
- |inner join `Kind` on `Entity`.`kindId` = `Kind`.`id`
- |where `Kind`.`name` = ?""".stripMargin
- assert(sql == pattern)
- }
- }
-
- "with sorting:" - {
- "single field sorting" in {
- val (sql, _) = queryBuilderParameters
- .copy(sorting = Dimension(None, "name", Ascending))
- .toSql(namingStrategy = MysqlEscape)
-
- assert(
- sql ==
- s"""$queryBasis
- |order by `$tableName`.`name` asc""".stripMargin)
- }
-
- "single foreign sorting field" in {
- val (sql, _) = queryBuilderParameters
- .copy(sorting = Dimension(Some("Kind"), "name", Ascending))
- .toSql(namingStrategy = MysqlEscape)
-
- assert(
- sql ==
- s"""select `$tableName`.*
- |from `$tableName`
- |inner join `Kind` on `Entity`.`kindId` = `Kind`.`id`
- |order by `Kind`.`name` asc""".stripMargin)
- }
-
- "multiple fields sorting" in {
- val (sql, _) = queryBuilderParameters
- .copy(
- sorting = Sequential(
- Seq(
- Dimension(None, "name", Ascending),
- Dimension(None, "date", Descending)
- )))
- .toSql(namingStrategy = MysqlEscape)
- assert(
- sql ==
- s"""$queryBasis
- |order by `$tableName`.`name` asc, `$tableName`.`date` desc""".stripMargin)
- }
-
- "multiple foreign sorting field" in {
- val (sql, _) = queryBuilderParameters
- .copy(
- sorting = Sequential(
- Seq(
- Dimension(Some("Kind"), "name", Ascending),
- Dimension(Some("User"), "name", Descending)
- )))
- .toSql(namingStrategy = MysqlEscape)
-
- assert(
- sql ==
- s"""select `$tableName`.*
- |from `$tableName`
- |inner join `Kind` on `$tableName`.`kindId` = `Kind`.`id`
- |inner join `User` on `$tableName`.`optionUser` = `User`.`id`
- |order by `Kind`.`name` asc, `User`.`name` desc""".stripMargin)
- }
-
- "multiple field sorting (including foreign tables)" in {
- val (sql, _) = queryBuilderParameters
- .copy(
- sorting = Sequential(
- Seq(
- Dimension(Some("Kind"), "name", Ascending),
- Dimension(None, "date", Descending)
- )))
- .toSql(namingStrategy = MysqlEscape)
-
- assert(
- sql ==
- s"""select `$tableName`.*
- |from `$tableName`
- |inner join `Kind` on `$tableName`.`kindId` = `Kind`.`id`
- |order by `Kind`.`name` asc, `$tableName`.`date` desc""".stripMargin)
- }
- }
-
- "with pagination" in {
- val (sql, _) =
- queryBuilderParameters.copy(pagination = Some(Pagination(5, 3))).toSql(namingStrategy = MysqlEscape)
- assert(
- sql ==
- s"""$queryBasis
- |limit 10, 5""".stripMargin)
- }
-
- "combined" in {
- val filter = Union(
- Seq(
- Intersection(
- Seq(
- Atom.Binary("name", Gt, "x"),
- Atom.Binary("optionDate", GtEq, "x")
- )),
- Intersection(
- Seq(
- Atom.Binary("optionUser", Eq, "x"),
- Atom.Binary("date", LtEq, "x")
- ))
- ))
- val sorting = Sequential(
- Seq(
- Dimension(Some("Kind"), "name", Ascending),
- Dimension(None, "name", Ascending),
- Dimension(None, "date", Descending)
- ))
-
- val (sql, _) = queryBuilderParameters
- .copy(
- filter = filter,
- sorting = sorting,
- pagination = Some(Pagination(5, 3))
- )
- .toSql(namingStrategy = MysqlEscape)
-
- assert(
- sql ==
- s"""select `$tableName`.*
- |from `$tableName`
- |inner join `Kind` on `$tableName`.`kindId` = `Kind`.`id`
- |where ((`$tableName`.`name` > ? and `$tableName`.`optionDate` >= ?) or (`$tableName`.`optionUser` = ? and `$tableName`.`date` <= ?))
- |order by `Kind`.`name` asc, `$tableName`.`name` asc, `$tableName`.`date` desc
- |limit 10, 5""".stripMargin)
- }
-
- }
- }
-
-}
diff --git a/src/test/scala/xyz/driver/pdsuidomain/formats/json/sprayformats/ArmFormatSuite.scala b/src/test/scala/xyz/driver/pdsuidomain/formats/json/ArmFormatSuite.scala
index 35b0fad..3cab4a1 100644
--- a/src/test/scala/xyz/driver/pdsuidomain/formats/json/sprayformats/ArmFormatSuite.scala
+++ b/src/test/scala/xyz/driver/pdsuidomain/formats/json/ArmFormatSuite.scala
@@ -1,4 +1,4 @@
-package xyz.driver.pdsuidomain.formats.json.sprayformats
+package xyz.driver.pdsuidomain.formats.json
import spray.json._
import org.scalatest.{FlatSpec, Matchers}
@@ -6,7 +6,7 @@ import xyz.driver.pdsuicommon.domain.{LongId, StringId}
import xyz.driver.pdsuidomain.entities.Arm
class ArmFormatSuite extends FlatSpec with Matchers {
- import arm._
+ import xyz.driver.pdsuidomain.formats.json.arm._
"Json format for Arm" should "read and write correct JSON" in {
val arm = Arm(
diff --git a/src/test/scala/xyz/driver/pdsuidomain/formats/json/sprayformats/BridgeUploadQueueFormat.scala b/src/test/scala/xyz/driver/pdsuidomain/formats/json/BridgeUploadQueueFormatSuite.scala
index 854f51f..9aaecae 100644
--- a/src/test/scala/xyz/driver/pdsuidomain/formats/json/sprayformats/BridgeUploadQueueFormat.scala
+++ b/src/test/scala/xyz/driver/pdsuidomain/formats/json/BridgeUploadQueueFormatSuite.scala
@@ -1,4 +1,4 @@
-package xyz.driver.pdsuidomain.formats.json.sprayformats
+package xyz.driver.pdsuidomain.formats.json
import java.time.LocalDateTime
@@ -6,8 +6,8 @@ import spray.json._
import org.scalatest.{FlatSpec, Matchers}
import xyz.driver.pdsuicommon.concurrent.BridgeUploadQueue
-class BridgeUploadQueueFormat extends FlatSpec with Matchers {
- import bridgeuploadqueue._
+class BridgeUploadQueueFormatSuite extends FlatSpec with Matchers {
+ import xyz.driver.pdsuidomain.formats.json.bridgeuploadqueue._
"Json format for BridgeUploadQueue.Item" should "read and write correct JSON" in {
val item = BridgeUploadQueue.Item(
diff --git a/src/test/scala/xyz/driver/pdsuidomain/formats/json/sprayformats/CriterionFormatSuite.scala b/src/test/scala/xyz/driver/pdsuidomain/formats/json/CriterionFormatSuite.scala
index 51665d2..a227afa 100644
--- a/src/test/scala/xyz/driver/pdsuidomain/formats/json/sprayformats/CriterionFormatSuite.scala
+++ b/src/test/scala/xyz/driver/pdsuidomain/formats/json/CriterionFormatSuite.scala
@@ -1,4 +1,4 @@
-package xyz.driver.pdsuidomain.formats.json.sprayformats
+package xyz.driver.pdsuidomain.formats.json
import spray.json._
import org.scalatest.{FlatSpec, Matchers}
@@ -7,7 +7,7 @@ import xyz.driver.pdsuidomain.entities.{EligibilityArm, Criterion, CriterionLabe
import xyz.driver.pdsuidomain.services.CriterionService.RichCriterion
class CriterionFormatSuite extends FlatSpec with Matchers {
- import criterion._
+ import xyz.driver.pdsuidomain.formats.json.criterion._
"Json format for Criterion" should "read and write correct JSON" in {
val criterion = Criterion(
diff --git a/src/test/scala/xyz/driver/pdsuidomain/formats/json/sprayformats/DocumentFormatSuite.scala b/src/test/scala/xyz/driver/pdsuidomain/formats/json/DocumentFormatSuite.scala
index 111da6e..5e33805 100644
--- a/src/test/scala/xyz/driver/pdsuidomain/formats/json/sprayformats/DocumentFormatSuite.scala
+++ b/src/test/scala/xyz/driver/pdsuidomain/formats/json/DocumentFormatSuite.scala
@@ -1,4 +1,4 @@
-package xyz.driver.pdsuidomain.formats.json.sprayformats
+package xyz.driver.pdsuidomain.formats.json
import java.time.{LocalDate, LocalDateTime}
@@ -8,7 +8,7 @@ import xyz.driver.pdsuicommon.domain.{LongId, TextJson}
import xyz.driver.pdsuidomain.entities.Document
class DocumentFormatSuite extends FlatSpec with Matchers {
- import document._
+ import xyz.driver.pdsuidomain.formats.json.document._
"Json format for Document" should "read and write correct JSON" in {
val orig = Document(
diff --git a/src/test/scala/xyz/driver/pdsuidomain/formats/json/sprayformats/DocumentHistoryFormatSuite.scala b/src/test/scala/xyz/driver/pdsuidomain/formats/json/DocumentHistoryFormatSuite.scala
index 5975919..e4a0733 100644
--- a/src/test/scala/xyz/driver/pdsuidomain/formats/json/sprayformats/DocumentHistoryFormatSuite.scala
+++ b/src/test/scala/xyz/driver/pdsuidomain/formats/json/DocumentHistoryFormatSuite.scala
@@ -1,4 +1,4 @@
-package xyz.driver.pdsuidomain.formats.json.sprayformats
+package xyz.driver.pdsuidomain.formats.json
import java.time.LocalDateTime
@@ -8,7 +8,7 @@ import xyz.driver.pdsuicommon.domain.{LongId, StringId}
import xyz.driver.pdsuidomain.entities.DocumentHistory
class DocumentHistoryFormatSuite extends FlatSpec with Matchers {
- import documenthistory._
+ import xyz.driver.pdsuidomain.formats.json.documenthistory._
"Json format for DocumentHistory" should "read and write correct JSON" in {
val documentHistory = DocumentHistory(
diff --git a/src/test/scala/xyz/driver/pdsuidomain/formats/json/sprayformats/DocumentIssueFormatSuite.scala b/src/test/scala/xyz/driver/pdsuidomain/formats/json/DocumentIssueFormatSuite.scala
index 54cfe90..7f34725 100644
--- a/src/test/scala/xyz/driver/pdsuidomain/formats/json/sprayformats/DocumentIssueFormatSuite.scala
+++ b/src/test/scala/xyz/driver/pdsuidomain/formats/json/DocumentIssueFormatSuite.scala
@@ -1,4 +1,4 @@
-package xyz.driver.pdsuidomain.formats.json.sprayformats
+package xyz.driver.pdsuidomain.formats.json
import java.time.LocalDateTime
@@ -8,7 +8,7 @@ import xyz.driver.pdsuicommon.domain.{LongId, StringId}
import xyz.driver.pdsuidomain.entities.DocumentIssue
class DocumentIssueFormatSuite extends FlatSpec with Matchers {
- import documentissue._
+ import xyz.driver.pdsuidomain.formats.json.documentissue._
"Json format for DocumentIssue" should "read and write correct JSON" in {
val documentIssue = DocumentIssue(
diff --git a/src/test/scala/xyz/driver/pdsuidomain/formats/json/sprayformats/EligibilityArmWithDiseasesFormatSuite.scala b/src/test/scala/xyz/driver/pdsuidomain/formats/json/EligibilityArmWithDiseasesFormatSuite.scala
index 22adc98..054f2f6 100644
--- a/src/test/scala/xyz/driver/pdsuidomain/formats/json/sprayformats/EligibilityArmWithDiseasesFormatSuite.scala
+++ b/src/test/scala/xyz/driver/pdsuidomain/formats/json/EligibilityArmWithDiseasesFormatSuite.scala
@@ -1,4 +1,4 @@
-package xyz.driver.pdsuidomain.formats.json.sprayformats
+package xyz.driver.pdsuidomain.formats.json
import spray.json._
import org.scalatest.{FlatSpec, Matchers}
@@ -7,7 +7,7 @@ import xyz.driver.pdsuicommon.domain.{LongId, StringId}
import xyz.driver.pdsuidomain.entities.{EligibilityArm, EligibilityArmDisease, EligibilityArmWithDiseases}
class EligibilityArmWithDiseasesFormatSuite extends FlatSpec with Matchers {
- import eligibilityarm._
+ import xyz.driver.pdsuidomain.formats.json.eligibilityarm._
"Json format for EligibilityArmWithDiseases" should "read and write correct JSON" in {
val name = "arm name"
diff --git a/src/test/scala/xyz/driver/pdsuidomain/formats/json/sprayformats/ExportFormatSuite.scala b/src/test/scala/xyz/driver/pdsuidomain/formats/json/ExportFormatSuite.scala
index 767f832..c976243 100644
--- a/src/test/scala/xyz/driver/pdsuidomain/formats/json/sprayformats/ExportFormatSuite.scala
+++ b/src/test/scala/xyz/driver/pdsuidomain/formats/json/ExportFormatSuite.scala
@@ -1,4 +1,4 @@
-package xyz.driver.pdsuidomain.formats.json.sprayformats
+package xyz.driver.pdsuidomain.formats.json
import java.time.{LocalDate, LocalDateTime}
import java.util.UUID
@@ -10,7 +10,7 @@ import xyz.driver.pdsuicommon.domain.{LongId, StringId, UuidId}
import xyz.driver.pdsuidomain.entities.{DocumentType, ProviderType, RecordRequestId}
class ExportFormatSuite extends FlatSpec with Matchers {
- import export._
+ import xyz.driver.pdsuidomain.formats.json.export._
"Json format for ExportPatientWithLabels" should "read and write correct JSON" in {
import xyz.driver.pdsuidomain.entities.export.patient._
diff --git a/src/test/scala/xyz/driver/pdsuidomain/formats/json/sprayformats/ExtractedDataFormatSuite.scala b/src/test/scala/xyz/driver/pdsuidomain/formats/json/ExtractedDataFormatSuite.scala
index d87b6c7..d1d8d44 100644
--- a/src/test/scala/xyz/driver/pdsuidomain/formats/json/sprayformats/ExtractedDataFormatSuite.scala
+++ b/src/test/scala/xyz/driver/pdsuidomain/formats/json/ExtractedDataFormatSuite.scala
@@ -1,4 +1,4 @@
-package xyz.driver.pdsuidomain.formats.json.sprayformats
+package xyz.driver.pdsuidomain.formats.json
import spray.json._
import org.scalatest.{FlatSpec, Matchers}
@@ -9,8 +9,7 @@ import xyz.driver.pdsuidomain.entities.{ExtractedData, ExtractedDataLabel}
import xyz.driver.pdsuidomain.services.ExtractedDataService.RichExtractedData
class ExtractedDataFormatSuite extends FlatSpec with Matchers {
-
- import extracteddata._
+ import xyz.driver.pdsuidomain.formats.json.extracteddata._
"Json format for ExtractedData" should "read and write correct JSON" in {
val extractedData = ExtractedData(
diff --git a/src/test/scala/xyz/driver/pdsuidomain/formats/json/sprayformats/HypothesisFormatSuite.scala b/src/test/scala/xyz/driver/pdsuidomain/formats/json/HypothesisFormatSuite.scala
index 76d90f5..6d51873 100644
--- a/src/test/scala/xyz/driver/pdsuidomain/formats/json/sprayformats/HypothesisFormatSuite.scala
+++ b/src/test/scala/xyz/driver/pdsuidomain/formats/json/HypothesisFormatSuite.scala
@@ -1,4 +1,4 @@
-package xyz.driver.pdsuidomain.formats.json.sprayformats
+package xyz.driver.pdsuidomain.formats.json
import spray.json._
import org.scalatest.{FlatSpec, Matchers}
@@ -6,7 +6,7 @@ import xyz.driver.pdsuicommon.domain.UuidId
import xyz.driver.pdsuidomain.entities.Hypothesis
class HypothesisFormatSuite extends FlatSpec with Matchers {
- import hypothesis._
+ import xyz.driver.pdsuidomain.formats.json.hypothesis._
"Json format for Hypothesis" should "read and write correct JSON" in {
val hypothesis = Hypothesis(
diff --git a/src/test/scala/xyz/driver/pdsuidomain/formats/json/sprayformats/InterventionFormatSuite.scala b/src/test/scala/xyz/driver/pdsuidomain/formats/json/InterventionFormatSuite.scala
index edce9c1..015c7b5 100644
--- a/src/test/scala/xyz/driver/pdsuidomain/formats/json/sprayformats/InterventionFormatSuite.scala
+++ b/src/test/scala/xyz/driver/pdsuidomain/formats/json/InterventionFormatSuite.scala
@@ -1,4 +1,4 @@
-package xyz.driver.pdsuidomain.formats.json.sprayformats
+package xyz.driver.pdsuidomain.formats.json
import spray.json._
import org.scalatest.{FlatSpec, Matchers}
@@ -6,7 +6,7 @@ import xyz.driver.pdsuicommon.domain.{LongId, StringId}
import xyz.driver.pdsuidomain.entities.{Intervention, InterventionArm, InterventionType, InterventionWithArms}
class InterventionFormatSuite extends FlatSpec with Matchers {
- import intervention._
+ import xyz.driver.pdsuidomain.formats.json.intervention._
"Json format for Intervention" should "read and write correct JSON" in {
val intervention = Intervention(
diff --git a/src/test/scala/xyz/driver/pdsuidomain/formats/json/sprayformats/ListResponseFormatSuite.scala b/src/test/scala/xyz/driver/pdsuidomain/formats/json/ListResponseFormatSuite.scala
index d6752d6..c561412 100644
--- a/src/test/scala/xyz/driver/pdsuidomain/formats/json/sprayformats/ListResponseFormatSuite.scala
+++ b/src/test/scala/xyz/driver/pdsuidomain/formats/json/ListResponseFormatSuite.scala
@@ -1,4 +1,4 @@
-package xyz.driver.pdsuidomain.formats.json.sprayformats
+package xyz.driver.pdsuidomain.formats.json
import java.time.LocalDateTime
import java.util.UUID
@@ -9,8 +9,8 @@ import xyz.driver.pdsuicommon.domain.{LongId, UuidId}
import xyz.driver.pdsuidomain.ListResponse
import xyz.driver.pdsuidomain.entities.MedicalRecord.Status
import xyz.driver.pdsuidomain.entities._
-import xyz.driver.pdsuidomain.formats.json.sprayformats.record.recordFormat
-import xyz.driver.pdsuidomain.formats.json.sprayformats.listresponse._
+import xyz.driver.pdsuidomain.formats.json.record.recordFormat
+import xyz.driver.pdsuidomain.formats.json.listresponse._
class ListResponseFormatSuite extends FlatSpec with Matchers {
diff --git a/src/test/scala/xyz/driver/pdsuidomain/formats/json/sprayformats/MedicalRecordFormatSuite.scala b/src/test/scala/xyz/driver/pdsuidomain/formats/json/MedicalRecordFormatSuite.scala
index 363e352..b4e37a2 100644
--- a/src/test/scala/xyz/driver/pdsuidomain/formats/json/sprayformats/MedicalRecordFormatSuite.scala
+++ b/src/test/scala/xyz/driver/pdsuidomain/formats/json/MedicalRecordFormatSuite.scala
@@ -1,4 +1,4 @@
-package xyz.driver.pdsuidomain.formats.json.sprayformats
+package xyz.driver.pdsuidomain.formats.json
import java.time.LocalDateTime
import java.util.UUID
@@ -9,7 +9,7 @@ import xyz.driver.pdsuicommon.domain.{LongId, TextJson, UuidId}
import xyz.driver.pdsuidomain.entities.{MedicalRecord, RecordRequestId}
class MedicalRecordFormatSuite extends FlatSpec with Matchers {
- import record._
+ import xyz.driver.pdsuidomain.formats.json.record._
import MedicalRecord._
"Json format for MedicalRecord.Meta" should "read and write correct JSON" in {
diff --git a/src/test/scala/xyz/driver/pdsuidomain/formats/json/sprayformats/MedicalRecordHistoryFormatSuite.scala b/src/test/scala/xyz/driver/pdsuidomain/formats/json/MedicalRecordHistoryFormatSuite.scala
index a8634d9..ca4058e 100644
--- a/src/test/scala/xyz/driver/pdsuidomain/formats/json/sprayformats/MedicalRecordHistoryFormatSuite.scala
+++ b/src/test/scala/xyz/driver/pdsuidomain/formats/json/MedicalRecordHistoryFormatSuite.scala
@@ -1,4 +1,4 @@
-package xyz.driver.pdsuidomain.formats.json.sprayformats
+package xyz.driver.pdsuidomain.formats.json
import java.time.LocalDateTime
@@ -8,7 +8,7 @@ import xyz.driver.pdsuicommon.domain.{LongId, StringId}
import xyz.driver.pdsuidomain.entities.MedicalRecordHistory
class MedicalRecordHistoryFormatSuite extends FlatSpec with Matchers {
- import recordhistory._
+ import xyz.driver.pdsuidomain.formats.json.recordhistory._
"Json format for MedicalRecordHistory" should "read and write correct JSON" in {
val recordHistory = MedicalRecordHistory(
diff --git a/src/test/scala/xyz/driver/pdsuidomain/formats/json/sprayformats/MedicalRecordIssueFormatSuite.scala b/src/test/scala/xyz/driver/pdsuidomain/formats/json/MedicalRecordIssueFormatSuite.scala
index 5fa740b..c7c82a4 100644
--- a/src/test/scala/xyz/driver/pdsuidomain/formats/json/sprayformats/MedicalRecordIssueFormatSuite.scala
+++ b/src/test/scala/xyz/driver/pdsuidomain/formats/json/MedicalRecordIssueFormatSuite.scala
@@ -1,4 +1,4 @@
-package xyz.driver.pdsuidomain.formats.json.sprayformats
+package xyz.driver.pdsuidomain.formats.json
import java.time.LocalDateTime
@@ -8,7 +8,7 @@ import xyz.driver.pdsuicommon.domain.{LongId, StringId}
import xyz.driver.pdsuidomain.entities.MedicalRecordIssue
class MedicalRecordIssueFormatSuite extends FlatSpec with Matchers {
- import recordissue._
+ import xyz.driver.pdsuidomain.formats.json.recordissue._
"Json format for MedicalRecordIssue" should "read and write correct JSON" in {
val recordIssue = MedicalRecordIssue(
diff --git a/src/test/scala/xyz/driver/pdsuidomain/formats/json/sprayformats/PatientCriterionFormatSuite.scala b/src/test/scala/xyz/driver/pdsuidomain/formats/json/PatientCriterionFormatSuite.scala
index 27e27c2..93284d9 100644
--- a/src/test/scala/xyz/driver/pdsuidomain/formats/json/sprayformats/PatientCriterionFormatSuite.scala
+++ b/src/test/scala/xyz/driver/pdsuidomain/formats/json/PatientCriterionFormatSuite.scala
@@ -1,4 +1,4 @@
-package xyz.driver.pdsuidomain.formats.json.sprayformats
+package xyz.driver.pdsuidomain.formats.json
import java.time.LocalDateTime
@@ -10,7 +10,7 @@ import xyz.driver.pdsuidomain.entities.{PatientCriterion, PatientCriterionArm}
import xyz.driver.pdsuidomain.services.PatientCriterionService.{DraftPatientCriterion, RichPatientCriterion}
class PatientCriterionFormatSuite extends FlatSpec with Matchers {
- import patientcriterion._
+ import xyz.driver.pdsuidomain.formats.json.patientcriterion._
"Json format for PatientCriterion" should "read and write correct JSON" in {
val orig = PatientCriterion(
diff --git a/src/test/scala/xyz/driver/pdsuidomain/formats/json/sprayformats/PatientEligibleTrialFormatSuite.scala b/src/test/scala/xyz/driver/pdsuidomain/formats/json/PatientEligibleTrialFormatSuite.scala
index b8f6f8e..b5fbf3f 100644
--- a/src/test/scala/xyz/driver/pdsuidomain/formats/json/sprayformats/PatientEligibleTrialFormatSuite.scala
+++ b/src/test/scala/xyz/driver/pdsuidomain/formats/json/PatientEligibleTrialFormatSuite.scala
@@ -1,4 +1,4 @@
-package xyz.driver.pdsuidomain.formats.json.sprayformats
+package xyz.driver.pdsuidomain.formats.json
import java.time.LocalDateTime
@@ -10,7 +10,7 @@ import xyz.driver.pdsuidomain.entities.{PatientCriterionArm, PatientTrialArmGrou
import xyz.driver.pdsuidomain.services.PatientEligibleTrialService.RichPatientEligibleTrial
class PatientEligibleTrialFormatSuite extends FlatSpec with Matchers {
- import patienteligibletrial._
+ import xyz.driver.pdsuidomain.formats.json.patienteligibletrial._
"Json format for PatientEligibleTrial" should "read and write correct JSON" in {
val trial = Trial(
diff --git a/src/test/scala/xyz/driver/pdsuidomain/formats/json/sprayformats/PatientFormatSuite.scala b/src/test/scala/xyz/driver/pdsuidomain/formats/json/PatientFormatSuite.scala
index 128cad1..c296f84 100644
--- a/src/test/scala/xyz/driver/pdsuidomain/formats/json/sprayformats/PatientFormatSuite.scala
+++ b/src/test/scala/xyz/driver/pdsuidomain/formats/json/PatientFormatSuite.scala
@@ -1,4 +1,4 @@
-package xyz.driver.pdsuidomain.formats.json.sprayformats
+package xyz.driver.pdsuidomain.formats.json
import java.time.{LocalDate, LocalDateTime}
@@ -10,7 +10,7 @@ import xyz.driver.pdsuicommon.domain.UuidId
import xyz.driver.pdsuidomain.entities.{Patient, PatientOrderId}
class PatientFormatSuite extends FlatSpec with Matchers {
- import patient._
+ import xyz.driver.pdsuidomain.formats.json.patient._
"Json format for Patient" should "read and write correct JSON" in {
val orig = Patient(
@@ -27,7 +27,7 @@ class PatientFormatSuite extends FlatSpec with Matchers {
orderId = PatientOrderId("7b54a75d-4197-4b27-9045-b9b6cb131be9"),
lastUpdate = LocalDateTime.parse("2017-08-10T18:00:00")
)
- val writtenJson = patientWriter.write(orig)
+ val writtenJson = patientFormat.write(orig)
writtenJson should be(
"""{"id":"748b5884-3528-4cb9-904b-7a8151d6e343","dob":"1980-06-30",
diff --git a/src/test/scala/xyz/driver/pdsuidomain/formats/json/sprayformats/PatientHistoryFormatSuite.scala b/src/test/scala/xyz/driver/pdsuidomain/formats/json/PatientHistoryFormatSuite.scala
index c6a5a9f..e46cf50 100644
--- a/src/test/scala/xyz/driver/pdsuidomain/formats/json/sprayformats/PatientHistoryFormatSuite.scala
+++ b/src/test/scala/xyz/driver/pdsuidomain/formats/json/PatientHistoryFormatSuite.scala
@@ -1,4 +1,4 @@
-package xyz.driver.pdsuidomain.formats.json.sprayformats
+package xyz.driver.pdsuidomain.formats.json
import java.time.LocalDateTime
@@ -8,7 +8,7 @@ import xyz.driver.pdsuicommon.domain.{LongId, StringId, UuidId}
import xyz.driver.pdsuidomain.entities.PatientHistory
class PatientHistoryFormatSuite extends FlatSpec with Matchers {
- import patienthistory._
+ import xyz.driver.pdsuidomain.formats.json.patienthistory._
"Json format for PatientHistory" should "read and write correct JSON" in {
val patientHistory = PatientHistory(
diff --git a/src/test/scala/xyz/driver/pdsuidomain/formats/json/sprayformats/PatientHypothesisFormatSuite.scala b/src/test/scala/xyz/driver/pdsuidomain/formats/json/PatientHypothesisFormatSuite.scala
index 71cbbad..270a04d 100644
--- a/src/test/scala/xyz/driver/pdsuidomain/formats/json/sprayformats/PatientHypothesisFormatSuite.scala
+++ b/src/test/scala/xyz/driver/pdsuidomain/formats/json/PatientHypothesisFormatSuite.scala
@@ -1,4 +1,4 @@
-package xyz.driver.pdsuidomain.formats.json.sprayformats
+package xyz.driver.pdsuidomain.formats.json
import spray.json._
import org.scalatest.{FlatSpec, Matchers}
@@ -7,7 +7,7 @@ import xyz.driver.pdsuidomain.entities.PatientHypothesis
import xyz.driver.pdsuidomain.services.PatientHypothesisService.RichPatientHypothesis
class PatientHypothesisFormatSuite extends FlatSpec with Matchers {
- import patienthypothesis._
+ import xyz.driver.pdsuidomain.formats.json.patienthypothesis._
"Json format for RichPatientHypothesis" should "read and write correct JSON" in {
val orig = PatientHypothesis(
diff --git a/src/test/scala/xyz/driver/pdsuidomain/formats/json/sprayformats/PatientIssueFormatSuite.scala b/src/test/scala/xyz/driver/pdsuidomain/formats/json/PatientIssueFormatSuite.scala
index 2776dcc..0d56918 100644
--- a/src/test/scala/xyz/driver/pdsuidomain/formats/json/sprayformats/PatientIssueFormatSuite.scala
+++ b/src/test/scala/xyz/driver/pdsuidomain/formats/json/PatientIssueFormatSuite.scala
@@ -1,4 +1,4 @@
-package xyz.driver.pdsuidomain.formats.json.sprayformats
+package xyz.driver.pdsuidomain.formats.json
import java.time.LocalDateTime
@@ -8,7 +8,7 @@ import xyz.driver.pdsuicommon.domain.{LongId, StringId, UuidId}
import xyz.driver.pdsuidomain.entities.PatientIssue
class PatientIssueFormatSuite extends FlatSpec with Matchers {
- import patientissue._
+ import xyz.driver.pdsuidomain.formats.json.patientissue._
"Json format for PatientIssue" should "read and write correct JSON" in {
val patientIssue = PatientIssue(
diff --git a/src/test/scala/xyz/driver/pdsuidomain/formats/json/sprayformats/PatientLabelFormatSuite.scala b/src/test/scala/xyz/driver/pdsuidomain/formats/json/PatientLabelFormatSuite.scala
index 2122777..95dfa68 100644
--- a/src/test/scala/xyz/driver/pdsuidomain/formats/json/sprayformats/PatientLabelFormatSuite.scala
+++ b/src/test/scala/xyz/driver/pdsuidomain/formats/json/PatientLabelFormatSuite.scala
@@ -1,4 +1,4 @@
-package xyz.driver.pdsuidomain.formats.json.sprayformats
+package xyz.driver.pdsuidomain.formats.json
import java.time.LocalDate
@@ -12,7 +12,7 @@ import xyz.driver.pdsuidomain.services.PatientLabelService.RichPatientLabel
class PatientLabelFormatSuite extends FlatSpec with Matchers {
"Json format for RichPatientLabel" should "read and write correct JSON" in {
- import patientlabel._
+ import xyz.driver.pdsuidomain.formats.json.patientlabel._
val orig = PatientLabel(
id = LongId(1),
patientId = UuidId("748b5884-3528-4cb9-904b-7a8151d6e343"),
@@ -36,7 +36,7 @@ class PatientLabelFormatSuite extends FlatSpec with Matchers {
}
"Json format for PatientLabelEvidence" should "read and write correct JSON" in {
- import patientlabel._
+ import xyz.driver.pdsuidomain.formats.json.patientlabel._
val orig = PatientLabelEvidenceView(
id = LongId(1),
value = LabelValue.Maybe,
@@ -60,7 +60,7 @@ class PatientLabelFormatSuite extends FlatSpec with Matchers {
}
"Json format for PatientLabelDefiningCriteria" should "read and write correct JSON" in {
- import patientdefiningcriteria._
+ import xyz.driver.pdsuidomain.formats.json.patientdefiningcriteria._
val orig = PatientLabel(
id = LongId(1),
patientId = UuidId("748b5884-3528-4cb9-904b-7a8151d6e343"),
diff --git a/src/test/scala/xyz/driver/pdsuidomain/formats/json/sprayformats/SlotArmFormatSuite.scala b/src/test/scala/xyz/driver/pdsuidomain/formats/json/SlotArmFormatSuite.scala
index 7dd085c..95853f6 100644
--- a/src/test/scala/xyz/driver/pdsuidomain/formats/json/sprayformats/SlotArmFormatSuite.scala
+++ b/src/test/scala/xyz/driver/pdsuidomain/formats/json/SlotArmFormatSuite.scala
@@ -1,4 +1,4 @@
-package xyz.driver.pdsuidomain.formats.json.sprayformats
+package xyz.driver.pdsuidomain.formats.json
import spray.json._
import org.scalatest.{FlatSpec, Matchers}
@@ -6,7 +6,7 @@ import xyz.driver.pdsuicommon.domain.{LongId, StringId}
import xyz.driver.pdsuidomain.entities.SlotArm
class SlotArmFormatSuite extends FlatSpec with Matchers {
- import slotarm._
+ import xyz.driver.pdsuidomain.formats.json.slotarm._
"Json format for SlotArm" should "read and write correct JSON" in {
val arm = SlotArm(
diff --git a/src/test/scala/xyz/driver/pdsuidomain/formats/json/sprayformats/StudyDesignFormatSuite.scala b/src/test/scala/xyz/driver/pdsuidomain/formats/json/StudyDesignFormatSuite.scala
index e847445..f3a4c83 100644
--- a/src/test/scala/xyz/driver/pdsuidomain/formats/json/sprayformats/StudyDesignFormatSuite.scala
+++ b/src/test/scala/xyz/driver/pdsuidomain/formats/json/StudyDesignFormatSuite.scala
@@ -1,11 +1,11 @@
-package xyz.driver.pdsuidomain.formats.json.sprayformats
+package xyz.driver.pdsuidomain.formats.json
import spray.json._
import org.scalatest.{FlatSpec, Matchers}
import xyz.driver.pdsuidomain.entities.StudyDesign
class StudyDesignFormatSuite extends FlatSpec with Matchers {
- import studydesign._
+ import xyz.driver.pdsuidomain.formats.json.studydesign._
"Json format for StudyDesign" should "read and write correct JSON" in {
val studyDesign = StudyDesign.Randomized
diff --git a/src/test/scala/xyz/driver/pdsuidomain/formats/json/sprayformats/TrialFormatSuite.scala b/src/test/scala/xyz/driver/pdsuidomain/formats/json/TrialFormatSuite.scala
index c9dc85f..b832733 100644
--- a/src/test/scala/xyz/driver/pdsuidomain/formats/json/sprayformats/TrialFormatSuite.scala
+++ b/src/test/scala/xyz/driver/pdsuidomain/formats/json/TrialFormatSuite.scala
@@ -1,4 +1,4 @@
-package xyz.driver.pdsuidomain.formats.json.sprayformats
+package xyz.driver.pdsuidomain.formats.json
import java.time.LocalDateTime
@@ -8,7 +8,7 @@ import xyz.driver.pdsuicommon.domain.{LongId, StringId, UuidId}
import xyz.driver.pdsuidomain.entities.Trial
class TrialFormatSuite extends FlatSpec with Matchers {
- import trial._
+ import xyz.driver.pdsuidomain.formats.json.trial._
"Json format for Trial" should "read and write correct JSON" in {
val orig = Trial(
@@ -31,7 +31,7 @@ class TrialFormatSuite extends FlatSpec with Matchers {
title = "trial title",
originalTitle = "orig trial title"
)
- val writtenJson = trialWriter.write(orig)
+ val writtenJson = trialFormat.write(orig)
writtenJson should be(
"""{"isPartner":false,"assignee":null,"lastUpdate":"2017-08-10T18:16:19Z","previousStatus":null,
diff --git a/src/test/scala/xyz/driver/pdsuidomain/formats/json/sprayformats/TrialHistoryFormatSuite.scala b/src/test/scala/xyz/driver/pdsuidomain/formats/json/TrialHistoryFormatSuite.scala
index d5ad2ec..aa0b404 100644
--- a/src/test/scala/xyz/driver/pdsuidomain/formats/json/sprayformats/TrialHistoryFormatSuite.scala
+++ b/src/test/scala/xyz/driver/pdsuidomain/formats/json/TrialHistoryFormatSuite.scala
@@ -1,4 +1,4 @@
-package xyz.driver.pdsuidomain.formats.json.sprayformats
+package xyz.driver.pdsuidomain.formats.json
import java.time.LocalDateTime
@@ -8,7 +8,7 @@ import xyz.driver.pdsuicommon.domain.{LongId, StringId}
import xyz.driver.pdsuidomain.entities.TrialHistory
class TrialHistoryFormatSuite extends FlatSpec with Matchers {
- import trialhistory._
+ import xyz.driver.pdsuidomain.formats.json.trialhistory._
"Json format for TrialHistory" should "read and write correct JSON" in {
val trialHistory = TrialHistory(
diff --git a/src/test/scala/xyz/driver/pdsuidomain/formats/json/sprayformats/TrialIssueFormatSuite.scala b/src/test/scala/xyz/driver/pdsuidomain/formats/json/TrialIssueFormatSuite.scala
index 4a9ea4f..5c6aa8d 100644
--- a/src/test/scala/xyz/driver/pdsuidomain/formats/json/sprayformats/TrialIssueFormatSuite.scala
+++ b/src/test/scala/xyz/driver/pdsuidomain/formats/json/TrialIssueFormatSuite.scala
@@ -1,4 +1,4 @@
-package xyz.driver.pdsuidomain.formats.json.sprayformats
+package xyz.driver.pdsuidomain.formats.json
import java.time.LocalDateTime
@@ -8,7 +8,7 @@ import xyz.driver.pdsuicommon.domain.{LongId, StringId}
import xyz.driver.pdsuidomain.entities.TrialIssue
class TrialIssueFormatSuite extends FlatSpec with Matchers {
- import trialissue._
+ import xyz.driver.pdsuidomain.formats.json.trialissue._
"Json format for TrialIssue" should "read and write correct JSON" in {
val trialIssue = TrialIssue(