Alejandro Gomez Auad c5b0d1c480 Corregido el parametro type de ITI-67 para que sea un token FHIR real
Se saca el mapeo de etiquetas propias (IPS/MeOW/IT) a codigo LOINC:
'type' ahora se pasa tal cual al Bus como token FHIR (system|code),
consistente con la semantica estandar de busqueda por token en FHIR,
en vez de una convencion propia que solo este gateway entendia.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
2026-07-15 16:52:08 +00:00

76 lines
3.1 KiB
JavaScript

const createError = require('http-errors');
const config = require('../config');
const { getBusToken } = require('../utils/busAuth');
const { findPatient } = require('../services/patient');
const { findDocumentReferenceByPatient } = require('../services/documentReference');
const NATIONAL_ID_SYSTEM = 'https://federador.msal.gob.ar/patient-id';
/**
* Extracts the Federador national identifier from a Patient resource.
*/
function extractNationalIdentifier(patient) {
const identifiers = Array.isArray(patient.identifier) ? patient.identifier : [];
return identifiers.find(id => id.system === NATIONAL_ID_SYSTEM) || null;
}
/**
* ITI-67: Find Document References (MHD)
*
* GET /fhir/DocumentReference?subject=:localId
* GET /fhir/DocumentReference?patient.identifier=:localId
* GET /fhir/DocumentReference?subject=:localId&type=:type
*
* Flow:
* 1. Fetch the Patient from the Bus by local ID to obtain the national identifier.
* 2. Search DocumentReferences in the Bus by that national identifier
* (opcionalmente filtrando por tipo de documento).
* 3. Return the resulting Bundle.
*
* Required query parameter (one of):
* subject — local Patient ID in the Bus.
* patient.identifier — same semantics, alternate FHIR parameter name.
*
* Optional query parameter:
* type — token FHIR de DocumentReference.type (`system|code`, `|code` o `code`),
* ej: `http://loinc.org|60591-5` (IPS), `http://loinc.org|56445-0` (MeOW),
* `http://loinc.org|57133-1` (IT). Se pasa tal cual al Bus, sin traducir
* alias propios, para no apartarse de la semántica estándar de búsqueda
* por token de FHIR. Si se omite, devuelve documentos de cualquier tipo.
*/
async function listDocumentReference(req, res, next) {
try {
const localPatientIdentifier = req.query.subject ?? req.query['patient.identifier'];
if (!localPatientIdentifier) {
throw createError(400, 'Missing required query parameter: subject or patient.identifier');
}
const documentType = req.query.type;
const token = await getBusToken(
config.bus.url,
config.bus.jwtSecret,
config.bus.issuer,
[
config.bus.mpiScope,
config.bus.documentRegistryScope
].join(',')
);
// 1. Obtengo el identificador nacional del paciente en forma de referencia
const patientSearchset = await findPatient(token, { identifier: localPatientIdentifier });
if (!patientSearchset) {
throw createError(422, 'Could not resolve national identifier for the given patient');
}
const patientNationalId = patientSearchset.entry[0].fullUrl
// 2. Obtengo el listado de entradas del indice de atenciones asociadada al id de paciente
// (y, si se pidió, al tipo de documento).
const documentReferenceSearchset = await findDocumentReferenceByPatient(token, patientNationalId, documentType)
res.status(200).json(documentReferenceSearchset);
} catch (err) {
next(err);
}
}
module.exports = { listDocumentReference };