Artículo
· 4 hr atrás Lectura de 4 min

Creando respuestas FHIR con una producción de interoperabilidad en IRIS

Cuando creamos un repositorio FHIR en IRIS, tenemos un endpoint para acceder a la información, crear nuevos recursos, etc. Pero hay algunos recursos en FHIR que probablemente no tengamos en nuestro repositorio, por ejemplo, un recurso Binary (este recurso devuelve un documento, como un PDF, por ejemplo).

He creado un ejemplo en el que cuando se solicita un recurso Binary, el endpoint de FHIR devuelve una respuesta, como si existiera en el repositorio.

En primer lugar, necesitamos un Namespace y un endpoint FHIR. Después, necesitamos configurar una producción de interoperabilidad que se conectará al endpoint de FHIR. Esta producción debe tener estos elementos:

  • Business Operations:
    • HS.Util.Trace.Operations (de hecho, esto es opcional, pero puede ser muy útil)
    • HS.FHIRServer.Interop.Operation, con la propiedad TraceOperations establecida a *FULL*
  • Business Service:
    • HS.FHIRServer.Interop.Service, con la propiedad TraceOperations establecida a *FULL* y la propiedad Target Config Name con el valor del nombre de la operación HS.FHIRServer.Interop.Operation

Así es como se ve la producción:

Después de crear esta producción, necesitamos conectarla con el endpoint de FHIR. Por lo tanto, editamos el endpoint de FHIR y configuramos el parámetro Service Config Name con el nombre del Business Service:

Ahora, si comenzamos a enviar solicitudes al repositorio FHIR, veremos todas las trazas en el Visor de mensajes:

Ahora podemos tener un Business Process para controlar qué hacer con rutas específicas.

En este ejemplo tenemos un Business Process que recibe cada solicitud (ahora el Business Service está conectado a este Business Process, en lugar de la Business Operation) y 2 nuevas Business Operation que realizan otras acciones que se explicarán más adelante:

Veamos el Business Process llamado FHIRRouter:

Si echamos un vistazo, veremos que, si la propiedad RequestPath contiene "Binary/", entonces haremos algo con esta solicitud: generar nuestra respuesta Binary personalizada. De lo contrario, enviaremos la solicitud al repositorio FHIR directamente.

Veamos la secuencia llamada "Generate Binary":

En primer lugar, creamos una nueva instancia de HS.FHIRServer.Interop.Response. Y obtenemos el ID del documento de la propiedad RequestPath. ¿Cómo? Cada vez que alguien quiere un recurso Binary, debe solicitarlo con el ID del documento en la ruta URL, algo así: ..../fhir/r4/Binary/XXXXX. Por lo tanto, extraemos el ID del documento de la ruta con esta expresión:

$Replace(request.Request.RequestPath,"Binary/","")

(No es muy elegante, pero funciona).

Si tenemos un ID de documento, entonces realizamos una llamada a una Business Operation llamada Find para encontrar el nombre de archivo asociado a ese ID de documento:

De hecho, esta Business Operation Find siempre devuelve el mismo nombre de archivo:

Es un ejemplo de lo que podemos hacer.

Si tenemos un nombre de archivo, entonces, llamamos a otra Business Operation llamada File para obtener el contenido de este archivo, codificado en base64:

Y finalmente, podemos devolver 2 tipos de respuestas:

  • Si no tenemos el contenido del archivo (porque no tenemos un ID de documento o no encontramos su nombre de archivo o contenido asociado), devolvemos una respuesta 404, con este contenido personalizado:
 set json = {
    "resourceType": "OperationOutcome",
    "issue": [
        {
            "severity": "error",
            "code": "not-found",
            "diagnostics": "<HSFHIRErr>ResourceNotFound",
            "details": {
                "text": "No resource with type 'Binary'"
            }
        }
    ]
 }
 set json.issue.%Get(0).details.text = json.issue.%Get(0).details.text_" and id '"_context.docId_"'"
 set qs = ##class(HS.SDA3.QuickStream).%New()
 do qs.Write(json.%ToJSON())
 set response.QuickStreamId = qs.%Id()
 set response.ContentType = "application/fhir+json"
 set response.CharSet = "UTF-8"
  • Si tenemos contenido de archivo, entonces devolvemos una respuesta 200 con este contenido personalizado
 set json = {
  "resourceType": "Binary",
  "id": "",
  "contentType": "application/pdf",
  "securityContext": {
    "reference": "DocumentReference/"
  },
  "data": ""
 }
 set json.id = context.docId
 set json.securityContext.reference = json.securityContext.reference_json.id
 set json.data = context.content.Read(context.content.Size)
 
 set qs = ##class(HS.SDA3.QuickStream).%New()
 do qs.Write(json.%ToJSON())
 set response.QuickStreamId = qs.%Id()
 set response.ContentType = "application/fhir+json"
 set response.CharSet = "UTF-8"

La clave aquí es crear un HS.SDA3.QuickStream, que contenga el objeto JSON. Y añadir este QuickStream a la respuesta.

Y ahora, si probamos nuestro endpoint, si solicitamos un documento Binary, veremos la respuesta:

Y si solicitamos un documento Binary que no existe (puedes probarlo sin pasar ningún ID de documento), veremos la respuesta 404:

En resumen, conectando nuestro endpoint FHIR con interoperabilidad podemos hacer lo que queramos, con todas las capacidades de InterSystems IRIS.

Comentarios (0)0
Inicie sesión o regístrese para continuar