feat(export): mejora en el selector de destino y manejo de exportaciones

Se actualiza el componente ExportDropdown para incluir un selector de destino que permite elegir entre diferentes perfiles de exportación, incluyendo la opción de ZIP. Se mejora la lógica de descarga y se ajusta el componente SwordProfileSelect para manejar la selección de perfiles de exportación. Además, se realizan cambios en la página Dashboard para integrar el nuevo sistema de exportación.
This commit is contained in:
Alexis
2026-06-01 13:12:55 +02:00
parent aa2e7280dc
commit 02c65bb710
13 changed files with 309 additions and 120 deletions
+24 -4
View File
@@ -129,10 +129,30 @@ def get_optional_current_researcher(
db: Session = Depends(get_db),
) -> Researcher | None:
"""
Devuelve el investigador autenticado si hay Bearer válido.
Si no hay Bearer, devuelve None.
Si hay Bearer inválido, lanza 401 (no se acepta como anónimo).
Devuelve el investigador autenticado si hay Bearer válido y la sesión sigue activa.
Sin Bearer, token inválido/expirado o investigador no autenticado → None.
Las rutas públicas (p. ej. búsqueda) deben seguir funcionando aunque el navegador
conserve un JWT caducado en localStorage.
"""
if not creds or not creds.credentials:
return None
return get_current_researcher(request=request, creds=creds, db=db)
try:
payload = _decode_token(creds.credentials)
except HTTPException:
return None
if payload.get("typ") != "access":
return None
orcid_id = payload.get("sub")
if not isinstance(orcid_id, str) or not is_valid_orcid(orcid_id):
return None
researcher = db.query(Researcher).filter(Researcher.orcid_id == orcid_id).first()
if not researcher or not researcher.authenticated:
return None
request.state.researcher = researcher
return researcher