api-v2/lib/api_web/controllers/study_controller.ex
2025-04-16 10:03:13 -03:00

97 lines
3.3 KiB
Elixir

defmodule ApiWeb.StudyController do
use ApiWeb, :controller
alias Api.Study
alias Api.Repo
require Logger
# Manejar solicitudes GET con hash no encriptado
def index(conn, %{"fromportal" => "true"}) do
conn
|> send_resp(404, "Estudio no encontrado.")
end
# Acción para manejar solicitudes GET con un hash encriptado
def index(conn, params) do
hash = params["hash"]
Logger.info("Hash ----> #{inspect(hash)}")
results = if String.length(hash) > 50 do
case Base.decode64(hash) do
{:ok, decoded_hash} ->
query = """
SELECT convert_from(decrypt(concat('#{decoded_hash}')::bytea, '1nf0rm3', 'aes'), 'UTF8')::text
"""
decrypted_data = Repo.query!(query).rows |> hd() |> hd()
Logger.info("decrypted ---> #{inspect(decrypted_data)}")
case Jason.decode(decrypted_data) do
{:ok, json} ->
# Convertir las claves del JSON a átomos
json_with_atoms = Enum.into(json, %{}, fn {k, v} -> {String.to_atom(k), v} end)
# Verificar si la fecha actual es antes de la fecha de vencimiento
case DateTime.from_iso8601(json_with_atoms[:vencimiento]) do
{:ok, vencimiento, _} ->
if DateTime.compare(DateTime.utc_now(), vencimiento) == :lt do
get_study(json_with_atoms)
else
%{error: "El enlace ha expirado"}
end
{:error, _} ->
%{error: "Formato de fecha inválido"}
end
{:error, _} ->
%{error: "Datos desencriptados inválidos"}
end
:error ->
%{error: "Error al decodear Base64"}
end
else
query = """
SELECT convert_from(decrypt(concat('\\x', '#{hash}')::bytea, 'gea', 'aes'), 'UTF8')::integer;
"""
decrypted_data = Repo.query!(query).rows |> hd() |> hd()
Logger.info("decrypted hash viejo ---> #{inspect(decrypted_data)}")
study = Study.open_study(decrypted_data)
Logger.info("#{inspect(study)}")
study
end
json(conn, results)
end
# Función privada para obtener el estudio usando el número de acceso
defp get_study(json_study) do
# Determinar si usar idstudy o accessionnumber
Envar.load(".env")
Envar.require_env_file(".env")
Logger.info("get study -------> #{inspect(Envar.get("IDENTIFIERFIELD"))}")
value_to_use = if Envar.get("IDENTIFIERFIELD") == "ACCESSIONNUMBER" do
Logger.debug("Usando clave :accession con valor #{inspect(json_study[:accessionnumber])}")
json_study[:accessionnumber]
else
Logger.debug("Usando clave :idstudy con valor #{inspect(json_study[:idstudy])}")
json_study[:idstudy]
end
# key_to_use =
# cond do
# json_study[:idstudy] -> :idstudy
# json_study[:accessionnumber] -> :accessionnumber
# true ->
# Logger.error("No se encontró idstudy ni accessionnumber en el JSON: #{inspect(json_study)}")
# raise ArgumentError, "Faltan parámetros: idstudy o accessionnumber"
# end
# Paso 5: Obtener el estudio usando el valor correspondiente
array_study = Study.open_study(value_to_use)
Logger.info("#{inspect(array_study)}")
array_study
end
end