EAtria pushRecord: fallback to /v1/bridge dispatcher on auth-scoped 403
This commit is contained in:
parent
bf3345b2ce
commit
0c0dbf78b4
|
|
@ -693,7 +693,74 @@ class EAtriaBridgeConnector implements AbdmConnectorInterface
|
||||||
$body[$optional] = (string) $data[$optional];
|
$body[$optional] = (string) $data[$optional];
|
||||||
}
|
}
|
||||||
|
|
||||||
return $this->post('/v3/records/push', $body);
|
$result = $this->post('/v3/records/push', $body);
|
||||||
|
|
||||||
|
$httpCode = (int) ($result['http_code'] ?? 0);
|
||||||
|
$authErrorText = strtolower(trim((string) ($result['message'] ?? $result['error_text'] ?? $result['error'] ?? '')));
|
||||||
|
$isAuthFailure = in_array($httpCode, [401, 403], true)
|
||||||
|
&& ($authErrorText === ''
|
||||||
|
|| str_contains($authErrorText, 'unauthorized')
|
||||||
|
|| str_contains($authErrorText, 'invalid authorization token')
|
||||||
|
|| str_contains($authErrorText, 'invalid token'));
|
||||||
|
|
||||||
|
// Some hospital keys are scoped to /v1/bridge dispatcher paths.
|
||||||
|
// Fallback to event dispatch when direct /v3/records/push returns auth failure.
|
||||||
|
if (! $isAuthFailure) {
|
||||||
|
return $result;
|
||||||
|
}
|
||||||
|
|
||||||
|
$dispatchPayload = [
|
||||||
|
'event_type' => 'abdm.fhir.share.requested',
|
||||||
|
'payload' => [
|
||||||
|
'hi_type' => $hiType,
|
||||||
|
'record_type' => $recordType,
|
||||||
|
'fhir_bundle' => $body['fhir_bundle'] ?? (object) [],
|
||||||
|
'bundle' => $body['fhir_bundle'] ?? (object) [],
|
||||||
|
'care_context_reference' => $careContextReference,
|
||||||
|
'care_context_display' => $careContextDisplay,
|
||||||
|
'queue_id' => $queueId,
|
||||||
|
'abha_id' => $abhaId,
|
||||||
|
'abha_address' => $abhaAddress,
|
||||||
|
'patient_id' => (string) ($data['patient_id'] ?? ''),
|
||||||
|
'patient_name' => $patientName,
|
||||||
|
'visit_date' => (string) ($data['visit_date'] ?? date('Y-m-d')),
|
||||||
|
'hfr_id' => $this->hfrId,
|
||||||
|
'hospital_id' => $this->bridgeHospitalId,
|
||||||
|
],
|
||||||
|
];
|
||||||
|
|
||||||
|
$dispatch = $this->post('/v1/bridge', $dispatchPayload);
|
||||||
|
$dispatchOk = (int) ($dispatch['ok'] ?? 0) === 1;
|
||||||
|
$dispatchNode = is_array($dispatch['dispatch'] ?? null) ? $dispatch['dispatch'] : [];
|
||||||
|
$dispatchHttp = (int) ($dispatchNode['http_code'] ?? $dispatch['http_code'] ?? 0);
|
||||||
|
$dispatchResponse = is_array($dispatchNode['response'] ?? null) ? $dispatchNode['response'] : [];
|
||||||
|
$dispatchErr = trim((string) (
|
||||||
|
$dispatchResponse['message']
|
||||||
|
?? $dispatchResponse['error_text']
|
||||||
|
?? $dispatchResponse['error']
|
||||||
|
?? $dispatch['message']
|
||||||
|
?? $dispatch['error_text']
|
||||||
|
?? $dispatch['error']
|
||||||
|
?? ''
|
||||||
|
));
|
||||||
|
|
||||||
|
if (! $dispatchOk) {
|
||||||
|
return array_merge($result, [
|
||||||
|
'fallback' => 'v1_bridge_dispatch_failed',
|
||||||
|
'fallback_http_code' => $dispatchHttp,
|
||||||
|
'fallback_error' => $dispatchErr !== '' ? $dispatchErr : 'Bridge dispatcher failed',
|
||||||
|
]);
|
||||||
|
}
|
||||||
|
|
||||||
|
return [
|
||||||
|
'ok' => (int) ($dispatchResponse['ok'] ?? 1),
|
||||||
|
'http_code' => $dispatchHttp > 0 ? $dispatchHttp : 200,
|
||||||
|
'id' => (int) ($dispatchResponse['id'] ?? $dispatchResponse['record_id'] ?? 0),
|
||||||
|
'queue_id' => (string) ($dispatchResponse['queue_id'] ?? $dispatchResponse['request_id'] ?? $dispatch['request_id'] ?? $queueId),
|
||||||
|
'message' => (string) ($dispatchResponse['message'] ?? 'Record dispatched via v1 bridge'),
|
||||||
|
'dispatch' => $dispatch,
|
||||||
|
'fallback' => 'v1_bridge_dispatch',
|
||||||
|
];
|
||||||
}
|
}
|
||||||
|
|
||||||
// -------------------------------------------------------------------------
|
// -------------------------------------------------------------------------
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue
Block a user