Quando criamos um repositório FHIR no IRIS, temos um endpoint para acessar informações, criar novos recursos, etc. Mas existem alguns recursos no FHIR que provavelmente não teremos em nosso repositório, por exemplo, o recurso Binary (esse recurso retorna um documento, como um PDF, por exemplo).
Criei um exemplo em que, quando um recurso Binary é solicitado, o endpoint FHIR retorna uma resposta como se ele existisse no repositório.
Antes de tudo, precisamos de um Namespace e de um endpoint FHIR. Depois disso, precisamos configurar uma produção de Interoperabilidade que será conectada ao endpoint FHIR. Essa produção deve ter estes itens:
- Business Operations:
- HS.Util.Trace.Operations (na verdade, isso é opcional, mas pode ser muito útil)
- HS.FHIRServer.Interop.Operation, com a propriedade TraceOperations definida como *FULL*
- Business Service:
- HS.FHIRServer.Interop.Service, com a propriedade TraceOperations definida como *FULL* e o Target Config Name definido como o nome do HS.FHIRServer.Interop.Operation
Isso é como a produção irá se parecer:

Após criar essa produção, precisamos conectá-la ao endpoint FHIR. Então, edite o endpoint FHIR e defina o parâmetro Service Config Name com o nome do Business Service:

Agora, se começarmos a enviar requisições para o repositório FHIR, veremos todos os rastreamentos no Message Viewer:

Agora podemos ter um Business Process para controlar o que fazer com caminhos específicos.
Neste exemplo, temos um Business Process que recebe todas as requisições (agora o Business Service está conectado a esse Business Process, em vez do Business Operation) e 2 novos Business Operations que executam outras ações que serão explicadas depois:

Vamos das uma olhada no Business Process FHIRRouter:

Se olharmos com atenção, veremos que, se o RequestPath contiver "Binary/", então faremos algo com essa requisição: gerar nossa resposta Binary personalizada. Caso contrário, enviaremos a requisição diretamente para o repositório FHIR.
Vamos dar uma olhada na sequência chamada "Generate Binary":

Antes de tudo, criamos uma nova instância de HS.FHIRServer.Interop.Response. E obtemos o ID do documento a partir do Request Path. Como? Toda vez que alguém quiser um recurso Binary, ele deve ser solicitado com o ID do documento no caminho da URL, algo como: ..../fhir/r4/Binary/XXXXX. Então extraímos o ID do documento do Request Path com esta expressão:
$Replace(request.Request.RequestPath,"Binary/","")
(Não é muito elegante, mas funciona).
Se tivermos um ID de documento, então fazemos uma chamada a um Business Operation chamado Find para localizar o nome do arquivo associado a esse ID de documento:

Na verdade, esse Business Operation Find sempre retorna o mesmo nome de arquivo:
É um exemplo do que podemos fazer.
Se tivermos um nome de arquivo, então chamamos outro Business Operation chamado File para obter o conteúdo desse arquivo, codificado em base64:

E, finalmente, podemos retornar 2 tipos de respostas:
- Se não tivermos o conteúdo do arquivo (porque não temos um ID de documento ou não encontramos o nome do arquivo ou conteúdo associado), retornamos uma resposta 404, com esta resposta personalizada:
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"
- Se tivermos o conteúdo do arquivo, então retornamos uma resposta 200 com esta resposta personalizada:
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"
O ponto-chave aqui é criar um HS.SDA3.QuickStream, que contém o objeto JSON. E adicionar esse QuickStream à resposta.
E agora, se testarmos nosso endpoint, ao solicitar um documento Binary, veremos a resposta:

E se solicitarmos um documento Binary que não existe (você pode testar passando nenhum ID de documento), veremos a resposta 404:

Em resumo, conectando nosso endpoint FHIR com a interoperabilidade, podemos fazer o que quisermos, aproveitando todas as capacidades do InterSystems IRIS.