diff --git a/.env b/.env index 23a96aa..9b6f2c9 100644 --- a/.env +++ b/.env @@ -24,12 +24,15 @@ IDENTIFIERFIELD=IDSTUDY # ImViewer4 # Si es 1, se usa imViewer4, si es 0 se usa el viewer viejo -imViewer4=0 +imViewer4=1 # Si usa ImViewer4, se debe agregar el dominio sin https:// # Ejemplo: imViewer4_host=informesmedicos.apross.gov.ar -# imViewer4_host=informesmedicos.apross.gov.ar +imViewer4_host=informesmedicos.apross.gov.ar # Si usa ImViewer4, se debe agregar el uid del cliente -# imViewer4_uid=aab2741a-6b94-4c72-ad29-bf0ca8e492f7 +imViewer4_uid=aab2741a-6b94-4c72-ad29-bf0ca8e492f7 +# Si usa ImViewer4, se debe agregar el gethash +# Ejemplo: imViewer4_gethash=https://informesmedicos.apross.gov.ar +imViewer4_gethash=https://informesmedicos.apross.gov.ar/viewer_api/gethash/ # Datos SMTP/Mailer #SMTP_USER=informes@ciem.com.ar diff --git a/lib/api_web/live/index_live.ex b/lib/api_web/live/index_live.ex index c0d173b..c4cf447 100644 --- a/lib/api_web/live/index_live.ex +++ b/lib/api_web/live/index_live.ex @@ -28,6 +28,7 @@ defmodule ApiWeb.IndexLive do |> assign(logo: Envar.get("LOGO")) |> assign(logo_sm: Envar.get("LOGO_SM")) |> assign(idstudyfield: idstudyfield) + |> assign(idstudy: nil) {:ok, socket} end @@ -175,36 +176,6 @@ defmodule ApiWeb.IndexLive do token end - - def generate_token_imv4(studyidentifier_type, studyidentifier, username) do - idstudy = if studyidentifier_type == "IDSTUDY" do - # El tipo es IDSTUDY - studyidentifier - else - # El tipo es ACCESSIONNUMBER - query = from s in "study", - where: s.accessionnumber == ^studyidentifier, - select: s.idstudy - - case Repo.one(query) do - nil -> {:error, "No se encontrĂ³ idstudy para el acccessionnumer: #{studyidentifier}"} - idstudy -> Logger.info("idstudy encontrado: #{idstudy}") - end - end - - json = %{ - idstudy: Integer.to_string(idstudy), - username: username, - vencimiento: DateTime.add(DateTime.utc_now(), 2 * 24 * 60 * 60, :second) - } - - json_string_64 = Jason.encode!(json) |> Base.encode64() - query_json = "select encrypt('#{json_string_64}'::bytea, '1nf0rm3', 'aes')::text" - token = Repo.query!(query_json).rows |> hd() |> hd() - token = String.replace_prefix(token, "\\x", "") - token - end - def open_viewer(idstudy, accessionnumber, patientid, assigns) do Envar.load(".env") Envar.require_env_file(".env") @@ -212,6 +183,7 @@ defmodule ApiWeb.IndexLive do viewer = Envar.get("imViewer4") viewer_host = Envar.get("imViewer4_host") viewer_uid = Envar.get("imViewer4_uid") + gethash = Envar.get("imViewer4_gethash") studyidentifier = if studyidentifier_ed == "IDSTUDY" do idstudy @@ -226,14 +198,51 @@ defmodule ApiWeb.IndexLive do }, limit: 1 - username = Repo.one(query) - + viewer_config = %{ + client_uuid: viewer_uid, + gethash: gethash, + imviewer4_domain: viewer_host + } case viewer do - "1" -> "https://#{viewer_host}/imviewer4/viewer/#{viewer_uid}/#{generate_token_imv4(studyidentifier_ed, studyidentifier, username)}" + "1" -> + case open_imviewer4(viewer_config, studyidentifier, 172800, assigns) do + {:ok, hash} -> + "https://#{viewer_host}/imviewer4/viewer/#{viewer_uid}/#{hash}" + + {:error, reason} -> + Logger.error("No se pudo obtener el hash para ImViewer4: #{inspect(reason)}") + end "0" -> "https://estudio.informemedico.com.ar/#/#{assigns.idsite}/#{generate_token(studyidentifier_ed, studyidentifier, patientid)}" end end + def open_imviewer4(v, access_study, expiration, assigns) do + url = v.gethash <> v.client_uuid + if access_study == assigns.idstudy do + case Req.post(url, json: %{"idstudy" => access_study, "expiration" => expiration}) do + {:ok, %Req.Response{status: 200, body: %{"hash" => hash}}} -> + {:ok, hash} + + {:ok, %Req.Response{status: status, body: body}} -> + {:error, {:unexpected_response, status, body}} + + {:error, reason} -> + {:error, {:request_failed, reason}} + end + else + case Req.post(url, json: %{"accessionnumber" => access_study, "expiration" => expiration}) do + {:ok, %Req.Response{status: 200, body: %{"hash" => hash}}} -> + {:ok, hash} + + {:ok, %Req.Response{status: status, body: body}} -> + {:error, {:unexpected_response, status, body}} + + {:error, reason} -> + {:error, {:request_failed, reason}} + end + end + end + def render(assigns) do ~H"""