Files
ORCID2SWORD/backend/app/scheduler/sync_scheduler.py
T
Mireya Cueto Garrido 238742bda4 feat(backend): rendimiento ORCID y autosync configurable
Reutiliza cliente HTTP ORCID, reduce consultas DB al sincronizar works y añade SYNC_* en settings y scheduler (cron mensual o intervalo). Actualiza backend/.env, frontend/.env y .env.example para despliegue.
2026-05-20 12:25:20 +02:00

89 lines
2.6 KiB
Python

import requests
from apscheduler.schedulers.background import BackgroundScheduler
from app.db.session import SessionLocal
from app.db.repositories.researcher_repository import ResearcherRepository
from dotenv import load_dotenv
import os
import logging
from app.core.config import settings
# Cargar variables del .env
load_dotenv()
# ---------------------------------------------------------
# Variables de entorno
# ---------------------------------------------------------
API_KEY = os.getenv("API_KEY_VALUE")
BASE_URL = os.getenv("BASE_URL")
logger = logging.getLogger("app.scheduler.sync")
# ---------------------------------------------------------
# Función auxiliar: ejecutar sincronización mensual
# ---------------------------------------------------------
def run_monthly_sync():
db = SessionLocal()
researchers = ResearcherRepository.get_all(db)
for r in researchers:
try:
url = f"{BASE_URL}/researchers/{r.orcid_id}/sync"
response = requests.post(
url,
headers={"X-API-Key": API_KEY}
)
if response.status_code != 200:
print(f"[ERROR] Sync failed for {r.orcid_id}: {response.text}")
else:
print(f"[OK] Synced {r.orcid_id}")
except Exception as e:
print(f"[EXCEPTION] Error syncing {r.orcid_id}: {e}")
db.close()
# ---------------------------------------------------------
# Función auxiliar: iniciar el scheduler
# ---------------------------------------------------------
def start_scheduler():
if not settings.SYNC_SCHEDULER_ENABLED:
logger.info("Autosync scheduler disabled by SYNC_SCHEDULER_ENABLED=false")
return
scheduler = BackgroundScheduler()
if settings.SYNC_SCHEDULE_MODE == "interval_minutes":
scheduler.add_job(
run_monthly_sync,
"interval",
minutes=settings.SYNC_INTERVAL_MINUTES,
id="researchers-autosync",
replace_existing=True,
)
logger.info(
"Autosync scheduler started in interval mode: every %s minute(s)",
settings.SYNC_INTERVAL_MINUTES,
)
else:
scheduler.add_job(
run_monthly_sync,
"cron",
day=settings.SYNC_CRON_DAY,
hour=settings.SYNC_CRON_HOUR,
id="researchers-autosync",
replace_existing=True,
)
logger.info(
"Autosync scheduler started in monthly mode: day=%s hour=%s",
settings.SYNC_CRON_DAY,
settings.SYNC_CRON_HOUR,
)
scheduler.start()