Skip to content

Commit

Permalink
Add basic expandValueSet method
Browse files Browse the repository at this point in the history
  • Loading branch information
pbehrend committed Apr 25, 2024
1 parent 4e03197 commit b0ec72d
Show file tree
Hide file tree
Showing 4 changed files with 60 additions and 0 deletions.
35 changes: 35 additions & 0 deletions src/main/kotlin/de/itcr/termite/api/ValueSetController.kt
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,7 @@ import ca.uhn.fhir.context.FhirContext
import ca.uhn.fhir.parser.DataFormatException
import ca.uhn.fhir.parser.IParser
import de.itcr.termite.database.TerminologyStorage
import de.itcr.termite.exception.ValueSetException
import de.itcr.termite.util.generateOperationOutcomeString
import de.itcr.termite.util.generateParametersString
import de.itcr.termite.util.parseParameters
Expand Down Expand Up @@ -241,4 +242,38 @@ class ValueSetController(
}
}

@GetMapping(path = ["\$expand"], params = ["url"])
@ResponseBody
fun expand(@RequestParam url: String, @RequestParam(required = false) valueSetVersion: String?): ResponseEntity<String>{
logger.info("Expanding value set [url = $url, version = $valueSetVersion]")
try {
val vs = database.expandValueSet(url, valueSetVersion)
logger.debug("Found value set for URL $url and value set version $valueSetVersion")
return ResponseEntity.ok().contentType(MediaType.APPLICATION_JSON).body(jsonParser.encodeResourceToString(vs))
}
catch (e: ValueSetException) {
val message = "Value set with URL $url and version $valueSetVersion not found"
logger.warn(message)
logger.debug(e.stackTraceToString())
val opOutcome = generateOperationOutcomeString(
OperationOutcome.IssueSeverity.ERROR,
OperationOutcome.IssueType.NOTFOUND,
e.message,
jsonParser
)
return ResponseEntity.ok()
.contentType(MediaType.APPLICATION_JSON)
.body(opOutcome)
}
catch(e: Exception){
val message = "Search for ValueSet instances [url = $url, version = $valueSetVersion] failed"
logger.warn(message)
logger.debug(e.stackTraceToString())
throw ResponseStatusException(
HttpStatus.INTERNAL_SERVER_ERROR,
message
)
}
}

}
Original file line number Diff line number Diff line change
Expand Up @@ -52,4 +52,6 @@ interface TerminologyStorage {

fun validateCodeCS(code: String, display: String?, url: String): Boolean

fun expandValueSet(url: String, version: String?): ValueSet

}
Original file line number Diff line number Diff line change
Expand Up @@ -50,4 +50,8 @@ class TerminologyStore constructor(dbPath: Path): KeyValueStore(dbPath, listOf("
TODO("Not yet implemented")
}

override fun expandValueSet(url: String, version: String?): ValueSet {
TODO("Not yet implemented")
}

}
Original file line number Diff line number Diff line change
Expand Up @@ -344,6 +344,25 @@ class TerminologyDatabase constructor(url: String): Database(url), TerminologySt
return rs.next()
}

override fun expandValueSet(url: String, version: String?): ValueSet{
val query = "SELECT VS_ID FROM ValueSets WHERE URL = ?${if(version != null) "AND VERSION = ?" else ""}"
val value = mutableListOf(url)
if(version != null) value.add(version)
val rs: ResultSet = super.executeQuery(query, value)
try{
if(rs.next()) {
val vsId = rs.getString(1)
return buildValueSet(vsId, false)
}
else {
throw ValueSetException("No ValueSet found with URL $url and version $version")
}
} catch (e: Exception){
val message = "Failed to search for ValueSet instances with URL $url and version $version"
throw Exception(message, e)
}
}

}

data class System(val url: String)
Expand Down

0 comments on commit b0ec72d

Please sign in to comment.