defmodule ApiWeb.IndexLive do use ApiWeb, :live_view use Phoenix.Component import Ecto.Query alias Api.Repo require Logger def mount(_params, _session, socket) do Envar.load(".env") Envar.require_env_file(".env") client = Envar.get("FROM") idstudyfield = if Envar.get("IDENTIFIERFIELD") == "IDSTUDY" do true else false end socket = socket |> assign(:page_title, "Entrega Digital - #{client}") |> assign(:form, %{}) |> assign(:login_result, nil) |> assign(logged_in: false) |> assign(list: true) |> assign(base_url: Envar.get("CHECK_ORIGIN")) |> assign(idsite: Envar.get("IDSITE")) |> assign(logo: Envar.get("LOGO")) |> assign(logo_sm: Envar.get("LOGO_SM")) |> assign(idstudyfield: idstudyfield) {:ok, socket} end def handle_event("logged", %{"patientid" => patientid, "acceso_ed" => acceso_ed}, socket) do Logger.info("Ingreso con access: #{acceso_ed} y patientid: #{patientid}") # Realiza la primera consulta para buscar el estudio específico study_found = buscar_estudio(patientid, acceso_ed) # Si se encuentra el estudio, listar todos los estudios del paciente query = if study_found != [] do listar_estudios_paciente(patientid) else [] end Logger.info("lista ----> #{inspect(query)}") {patientname, idstudy} = case query do [%{patientname: name, idstudy: id} | _] -> {String.replace(name, "^", " "), id} _ -> {nil, nil} end socket = case study_found do [] -> socket |> assign(logged_in: query != []) |> assign(dni: patientid) |> assign(idstudy: idstudy) |> assign(studies: query) |> assign(patientname: patientname) |> assign(list: false) _ -> socket |> assign(logged_in: query != []) |> assign(dni: patientid) |> assign(idstudy: idstudy) |> assign(studies: query) |> assign(patientname: patientname) |> assign(list: true) end {:noreply, socket} end # Función para buscar el estudio específico def buscar_estudio(patientid, acceso_ed) do Envar.load(".env") Envar.require_env_file(".env") if Envar.get("acceso_ed") == "IDSTUDY" do idstudy = String.to_integer(acceso_ed) query = from s in "study", join: p in "patient", on: p.idpatient == s.idpatient, where: p.patientid == ^patientid and s.idstudy == ^idstudy, select: %{ idstudy: s.idstudy, patientname: p.patientname } Repo.all(query) else query = from s in "study", join: p in "patient", on: p.idpatient == s.idpatient, where: p.patientid == ^patientid and s.accessionnumber == ^acceso_ed, select: %{ idstudy: s.idstudy, patientname: p.patientname } Repo.all(query) end end # Función para listar todos los estudios del paciente def listar_estudios_paciente(patientid) do query = from s in "study", join: p in "patient", on: p.idpatient == s.idpatient, left_join: sr in "studyreport", on: sr.idstudy == s.idstudy, where: p.patientid == ^patientid, select: %{ idstudy: s.idstudy, idpatient: p.idpatient, iddocument: fragment("substring(encrypt(?::text::bytea, '1nf0rm3', 'aes')::text from 3)", sr.idstudyreport), date: s.studydate, dni: p.patientid, modality: s.modality, accession: s.accessionnumber, patientname: p.patientname, status: sr.idstatus, studydescription: s.studydescription }, order_by: [desc: s.studydate] Repo.all(query) end def generate_token(idstudy, patientid) do Envar.load(".env") Envar.require_env_file(".env") # Paso 1: Armar json con fecha de vencimiento (puse 2 días) json = if Envar.get("IDENTIFIERFIELD") == "IDSTUDY" do %{ idstudy: Integer.to_string(idstudy), patientid: patientid, vencimiento: DateTime.add(DateTime.utc_now(), 2 * 24 * 60 * 60, :second) } else %{ accessionnumber: idstudy, patientid: patientid, vencimiento: DateTime.add(DateTime.utc_now(), 2 * 24 * 60 * 60, :second) } end # Paso 2: Convertir json a string json_string = Jason.encode!(json) # Paso 3: Encriptar con query query = "select encrypt('#{json_string}'::bytea, '1nf0rm3', 'aes')::text" token = Repo.query!(query).rows |> hd() |> hd() # Paso 4: Encodear para poder armar la url token = Base.encode64(token) token end def render(assigns) do ~H"""
<%= if @logged_in == false do %>Estudios |
---|
Fecha: <%= study.date %> DNI: <%= @dni %> Accession N°: <%= study.accession %> Id Study: <%= study.idstudy %> Descripción: <%= study.studydescription %> |
Esta información llega a Ud.
gracias a Entrega Digital
un producto de