-- HSRB SISTEMAS — Orthanc webhook: notifica o PHP quando um exame chega via C-STORE. -- Documentação Orthanc Lua: https://orthanc.uclouvain.be/book/users/lua.html -- -- Estratégia: coleta AccessionNumber / StudyInstanceUID / OrthancStudyID via -- RestApiGet (chamada in-process, sem rede) e manda tudo no payload. -- Assim o PHP não precisa fazer callback ao Orthanc — elimina problema de DNS. local function GetConfig() local c = ParseJson(DumpJson(GetOrthancConfiguration())) local baseUrl = os.getenv("BASE_URL") local finalUrl = "" if baseUrl ~= nil and baseUrl ~= "" then baseUrl = string.gsub(baseUrl, "/$", "") finalUrl = baseUrl .. '/index.php?module=pacs&action=orthanc_webhook' else finalUrl = c['WebhookUrl'] or 'http://app/index.php?module=pacs&action=orthanc_webhook' end return { url = finalUrl, secret = c['WebhookSecret'] or '', } end function OnStoredInstance(instanceId, tags, metadata, origin) if origin ~= nil and origin['RequestOrigin'] == 'Lua' then return end local cfg = GetConfig() -- Valores iniciais dos tags DICOM recebidos pelo callback local accessionNumber = tags['AccessionNumber'] or '' local studyInstanceUID = tags['StudyInstanceUID'] or '' local sopInstanceUID = tags['SOPInstanceUID'] or instanceId local orthancStudyId = '' -- RestApiGet é in-process (sem rede) — busca ParentStudy da instância local ok1, instanceData = pcall(function() return ParseJson(RestApiGet('/instances/' .. instanceId)) end) if ok1 and type(instanceData) == 'table' then orthancStudyId = instanceData['ParentStudy'] or '' end -- Se AccessionNumber não veio nos tags, busca no estudo pai if (accessionNumber == '' or studyInstanceUID == '') and orthancStudyId ~= '' then local ok2, studyData = pcall(function() return ParseJson(RestApiGet('/studies/' .. orthancStudyId)) end) if ok2 and type(studyData) == 'table' then local mt = studyData['MainDicomTags'] or {} if accessionNumber == '' then accessionNumber = mt['AccessionNumber'] or '' end if studyInstanceUID == '' then studyInstanceUID = mt['StudyInstanceUID'] or '' end end end -- Payload completo — PHP não precisa chamar o Orthanc de volta local payload = DumpJson({ ID = instanceId, AccessionNumber = accessionNumber, StudyInstanceUID = studyInstanceUID, OrthancStudyID = orthancStudyId, SOPInstanceUID = sopInstanceUID, }) local headers = { ['Content-Type'] = 'application/json', ['X-Orthanc-Secret'] = cfg.secret, } local ok, answer = pcall(HttpPost, cfg.url, payload, headers) if not ok then PrintRecursive('hsrb_webhook: connection error for instance ' .. instanceId .. ': ' .. tostring(answer)) elseif answer == nil or answer == '' then PrintRecursive('hsrb_webhook: empty response for instance ' .. instanceId) else PrintRecursive('hsrb_webhook: response for instance ' .. instanceId .. ': ' .. tostring(answer)) end end