Skip to content

Commit

Permalink
🐛 fix(TerminologySystemService): Implement atomicity between job's te…
Browse files Browse the repository at this point in the history
…rminology update and terminology service update.
  • Loading branch information
Okanmercan99 committed Jul 11, 2023
1 parent 947c4e3 commit 83ac2fb
Showing 1 changed file with 54 additions and 58 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -45,46 +45,14 @@ class TerminologySystemService(terminologySystemRepository: ITerminologySystemRe
* @return Updated TerminologySystem
*/
def updateTerminologySystem(id: String, terminologySystem: TerminologySystem): Future[TerminologySystem] = {
// Update TerminologySystem
val result: Future[TerminologySystem] = terminologySystemRepository.updateTerminologySystem(id, terminologySystem)

// Get project ids from job cache
val projectIds: Seq[String] = mappingJobRepository.getCachedMappingsJobs.keys.toSeq

projectIds.foreach { projectId =>
// Get jobs of given project
val jobs: Future[Seq[FhirMappingJob]] = mappingJobRepository.getAllJobs(projectId)

jobs.map { jobs =>
jobs
.filter { job =>
job.terminologyServiceSettings.isDefined
}
.filter { job =>
job.terminologyServiceSettings.get.isInstanceOf[LocalFhirTerminologyServiceSettings]
}
.filter { job =>
checkEqualityOfIds(job, id) // Skip if id is not equal
}
.foreach { job =>
// Get terminology service of the job
val terminologyServiceSettings: LocalFhirTerminologyServiceSettings =
job.terminologyServiceSettings.get.asInstanceOf[LocalFhirTerminologyServiceSettings]

// Update terminology service object
val updatedTerminologyServiceSettings: LocalFhirTerminologyServiceSettings =
terminologyServiceSettings.copy(conceptMapFiles = terminologySystem.conceptMaps,
codeSystemFiles = terminologySystem.codeSystems)

// Update job object
val updatedJob = job.copy(terminologyServiceSettings = Some(updatedTerminologyServiceSettings))

// Update job repository
mappingJobRepository.putJob(projectId, job.id, updatedJob)
}
}
result.map{ terminologySystem =>
// update Jobs Terminology fields if it is successful
updateJobTerminology(id ,Some(terminologySystem))
terminologySystem
}

// Update TerminologySystem
terminologySystemRepository.updateTerminologySystem(id, terminologySystem)
}

/**
Expand All @@ -94,6 +62,37 @@ class TerminologySystemService(terminologySystemRepository: ITerminologySystemRe
*/
def deleteTerminologySystem(id: String): Future[Unit] = {

// Delete terminology system
val result: Future[Unit] = terminologySystemRepository.deleteTerminologySystem(id)

result.map{ terminologySystem =>
// update Jobs Terminology fields if it is successful
updateJobTerminology(id)
terminologySystem
}
}

/**
* Check whether job's id and terminologySystem id is equal
* @param job job object to be checked
* @param terminologySystemId id of terminogySystem
* @return Boolean indicating whether job's id and terminologySystem's id are equal
*/
private def checkEqualityOfIds(job: FhirMappingJob, terminologySystemId: String): Boolean = {
// Get terminology service of the job
val terminologyServiceSettings: LocalFhirTerminologyServiceSettings =
job.terminologyServiceSettings.get.asInstanceOf[LocalFhirTerminologyServiceSettings]

terminologyServiceSettings.folderPath.split('/').lastOption.get.equals(terminologySystemId)
}

/**
* Update Job's terminology fields with updated terminology system
* @param id id of terminologySystem
* @param terminologySystem updated terminology system
* @return
*/
private def updateJobTerminology(id: String, terminologySystem: Option[TerminologySystem] = Option.empty): Future[Unit] = {
// Get project ids from job cache
val projectIds: Seq[String] = mappingJobRepository.getCachedMappingsJobs.keys.toSeq

Expand All @@ -113,29 +112,26 @@ class TerminologySystemService(terminologySystemRepository: ITerminologySystemRe
checkEqualityOfIds(job, id) // Skip if id is not equal
}
.foreach { job =>
// Update job object with deleting terminology service settings
val updatedJob = job.copy(terminologyServiceSettings = None)

// Update job repository
// Create updated job object
val updatedJob = terminologySystem match {
// Update terminology service case
case Some(ts) => {
val terminologyServiceSettings: LocalFhirTerminologyServiceSettings =
job.terminologyServiceSettings.get.asInstanceOf[LocalFhirTerminologyServiceSettings]

val updatedTerminologyServiceSettings: LocalFhirTerminologyServiceSettings =
terminologyServiceSettings.copy(conceptMapFiles = ts.conceptMaps, codeSystemFiles = ts.codeSystems)

job.copy(terminologyServiceSettings = Some(updatedTerminologyServiceSettings))
}
// Delete terminology service case
case None => job.copy(terminologyServiceSettings = None)
}
// Update job in the repository
mappingJobRepository.putJob(projectId, job.id, updatedJob)
}
}
}
// Delete terminology system
terminologySystemRepository.deleteTerminologySystem(id)
}

/**
* Check whether job's id and terminologySystem id is equal
* @param job job object to be checked
* @param terminologySystemId id of terminogySystem
* @return Boolean indicating whether job's id and terminologySystem's id are equal
*/
private def checkEqualityOfIds(job: FhirMappingJob, terminologySystemId: String): Boolean = {
// Get terminology service of the job
val terminologyServiceSettings: LocalFhirTerminologyServiceSettings =
job.terminologyServiceSettings.get.asInstanceOf[LocalFhirTerminologyServiceSettings]

terminologyServiceSettings.folderPath.split('/').lastOption.get.equals(terminologySystemId)
Future.apply(None)
}
}

0 comments on commit 83ac2fb

Please sign in to comment.