Gethash para ImViewer4, configurable en .env
This commit is contained in:
		
							
								
								
									
										9
									
								
								.env
									
									
									
									
									
								
							
							
						
						
									
										9
									
								
								.env
									
									
									
									
									
								
							| @ -24,12 +24,15 @@ IDENTIFIERFIELD=IDSTUDY | |||||||
|  |  | ||||||
| # ImViewer4 | # ImViewer4 | ||||||
| # Si es 1, se usa imViewer4, si es 0 se usa el viewer viejo | # 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:// | # Si usa ImViewer4, se debe agregar el dominio sin https:// | ||||||
| # Ejemplo: imViewer4_host=informesmedicos.apross.gov.ar | # 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 | # 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 | # Datos SMTP/Mailer | ||||||
| #SMTP_USER=informes@ciem.com.ar | #SMTP_USER=informes@ciem.com.ar | ||||||
|  | |||||||
| @ -28,6 +28,7 @@ defmodule ApiWeb.IndexLive do | |||||||
|       |> assign(logo: Envar.get("LOGO")) |       |> assign(logo: Envar.get("LOGO")) | ||||||
|       |> assign(logo_sm: Envar.get("LOGO_SM")) |       |> assign(logo_sm: Envar.get("LOGO_SM")) | ||||||
|       |> assign(idstudyfield: idstudyfield) |       |> assign(idstudyfield: idstudyfield) | ||||||
|  |       |> assign(idstudy: nil) | ||||||
|     {:ok, socket} |     {:ok, socket} | ||||||
|   end |   end | ||||||
|  |  | ||||||
| @ -175,36 +176,6 @@ defmodule ApiWeb.IndexLive do | |||||||
|     token |     token | ||||||
|   end |   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 |   def open_viewer(idstudy, accessionnumber, patientid, assigns) do | ||||||
|     Envar.load(".env") |     Envar.load(".env") | ||||||
|     Envar.require_env_file(".env") |     Envar.require_env_file(".env") | ||||||
| @ -212,6 +183,7 @@ defmodule ApiWeb.IndexLive do | |||||||
|     viewer = Envar.get("imViewer4") |     viewer = Envar.get("imViewer4") | ||||||
|     viewer_host = Envar.get("imViewer4_host") |     viewer_host = Envar.get("imViewer4_host") | ||||||
|     viewer_uid = Envar.get("imViewer4_uid") |     viewer_uid = Envar.get("imViewer4_uid") | ||||||
|  |     gethash = Envar.get("imViewer4_gethash") | ||||||
|  |  | ||||||
|     studyidentifier = if studyidentifier_ed == "IDSTUDY" do |     studyidentifier = if studyidentifier_ed == "IDSTUDY" do | ||||||
|       idstudy |       idstudy | ||||||
| @ -226,14 +198,51 @@ defmodule ApiWeb.IndexLive do | |||||||
|         }, |         }, | ||||||
|         limit: 1 |         limit: 1 | ||||||
|  |  | ||||||
|     username = Repo.one(query) |     viewer_config = %{ | ||||||
|  |         client_uuid: viewer_uid, | ||||||
|  |         gethash: gethash, | ||||||
|  |         imviewer4_domain: viewer_host | ||||||
|  |     } | ||||||
|     case viewer do |     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)}" |       "0" -> "https://estudio.informemedico.com.ar/#/#{assigns.idsite}/#{generate_token(studyidentifier_ed, studyidentifier, patientid)}" | ||||||
|     end |     end | ||||||
|   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 |   def render(assigns) do | ||||||
|     ~H""" |     ~H""" | ||||||
|     <body class="m-0 p-0 bg-[rgb(228, 228, 228)]"> |     <body class="m-0 p-0 bg-[rgb(228, 228, 228)]"> | ||||||
|  | |||||||
		Reference in New Issue
	
	Block a user