from fastapi import APIRouter, HTTPException, Depends from fastapi.responses import JSONResponse from typing import Dict, Any, List, Optional from api.api_v2.modules.authentication.services import get_current_user from api.api_v2.modules.tasks.services import register_task from .schemas import PartidaRequestSchema, PartidaListSchema from .tasks import process_partida_request router = APIRouter() @router.post("/services/partida/", response_model=Dict[str, Any]) async def obtener_partida(partida_request: PartidaRequestSchema): """ Endpoint para obtener la información de una partida específica. """ acuse_dict = partida_request.model_dump() # Ejecuta la tarea de Celery de forma asíncrona task = process_partida_request.delay(acuse_dict) # Registrar la tarea en el servicio de seguimiento await register_task( task_id=task.id, message=f"Procesando partida {acuse_dict.get('partida', {}).get('numero', 'N/A')} para pedimento {acuse_dict.get('pedimento', {}).get('pedimento_app', 'N/A')}", status="submitted", pedimento_id=acuse_dict.get('pedimento', {}).get('id'), organizacion_id=acuse_dict.get('pedimento', {}).get('organizacion'), servicio=4 # 4 corresponde a "Pedimento Partidas" ) # Puedes devolver el ID de la tarea para consultar el estado después return {"task_id": task.id, "status": "submitted"} @router.post("/services/all/partidas/", response_model=Dict[str, Any]) async def obtener_partidas(partidas_request: PartidaListSchema): """ Endpoint para iniciar la descarga masiva de partidas. """ task_ids = [] partida_request_dict = partidas_request.model_dump() # Para cada partida en la lista, dispara una tarea Celery for partida in partida_request_dict.get('partidas', []): # Crea un nuevo diccionario de datos para cada tarea partida_dict = { "partida": partida, "pedimento": partida_request_dict.get('pedimento'), "credencial": partida_request_dict.get('credencial') } task = process_partida_request.delay(partida_dict) task_ids.append(task.id) # Registrar cada tarea en el servicio de seguimiento await register_task( task_id=task.id, message=f"Procesando partida masiva {partida.get('numero', 'N/A')} para pedimento {partida_request_dict.get('pedimento', {}).get('pedimento_app', 'N/A')}", status="submitted", pedimento_id=partida_request_dict.get('pedimento', {}).get('id'), organizacion_id=partida_request_dict.get('pedimento', {}).get('organizacion'), servicio=4 # 4 corresponde a "Pedimento Partidas" ) return {"task_ids": task_ids, "status": "submitted", "total": len(task_ids)}