diff --git a/services/training/app/api/training.py b/services/training/app/api/training.py index 52715bc8..09423ed3 100644 --- a/services/training/app/api/training.py +++ b/services/training/app/api/training.py @@ -83,13 +83,11 @@ async def start_training_job( except Exception as e: logger.warning("Failed to publish job started event", error=str(e)) - # Start training in background background_tasks.add_task( - training_service.execute_training_job, - db, # Pass the database session - job.job_id, - job.tenant_id, - request # Pass the request object + training_service.execute_training_job_simple, + new_job_id, + tenant_id_str, + request ) logger.info("Training job created", diff --git a/services/training/app/services/training_service.py b/services/training/app/services/training_service.py index 9c3faa39..d4bfb041 100644 --- a/services/training/app/services/training_service.py +++ b/services/training/app/services/training_service.py @@ -31,6 +31,36 @@ class TrainingService: def __init__(self): self.ml_trainer = BakeryMLTrainer() + + async def execute_training_job_simple(self, job_id: str, tenant_id_str: str, request: TrainingJobRequest): + """Simple wrapper that creates its own database session""" + try: + # Import database_manager locally to avoid circular imports + from app.core.database import database_manager + + logger.info(f"Starting background training job {job_id} for tenant {tenant_id_str}") + + # Create new session for background task + async with database_manager.async_session_local() as session: + await self.execute_training_job(session, job_id, tenant_id_str, request) + await session.commit() + + except Exception as e: + logger.error(f"Background training job {job_id} failed: {str(e)}") + + # Try to update job status to failed + try: + from app.core.database import database_manager + async with database_manager.async_session_local() as error_session: + await self._update_job_status( + error_session, job_id, "failed", 0, + f"Training failed: {str(e)}", error_message=str(e) + ) + await error_session.commit() + except Exception as update_error: + logger.error(f"Failed to update job status: {str(update_error)}") + + raise async def create_training_job(self, db: AsyncSession, @@ -425,7 +455,7 @@ class TrainingService: params["limit"] = limit response = await client.get( - f"{settings.DATA_SERVICE_URL}/api/v1/tenants/{tenant_id}/sales/", + f"{settings.DATA_SERVICE_URL}/api/v1/tenants/{tenant_id}/sales", params=params, headers=headers, timeout=30.0 @@ -516,7 +546,7 @@ class TrainingService: params["end_date"] = request.end_date.isoformat() response = await client.get( - f"{settings.DATA_SERVICE_URL}/tenants/{tenant_id}/traffic/historical", + f"http://gateway:8000/tenants/{tenant_id}/traffic/historical", params=params, timeout=30.0 ) diff --git a/test_onboarding_flow.sh b/test_onboarding_flow.sh index b29d8639..4fa4d141 100755 --- a/test_onboarding_flow.sh +++ b/test_onboarding_flow.sh @@ -298,19 +298,40 @@ echo -e "${STEP_ICONS[1]} ${PURPLE}STEP 2: BAKERY REGISTRATION${NC}" echo "Simulating onboarding page step 2 - 'Datos de Panadería'" echo "" -log_step "2.1. Registering bakery/tenant" +log_step "2.1. Registering bakery/tenant with mock coordinates" -# Using exact schema from BakeryRegistration +# Mock coordinates for Madrid locations (since geolocation service is not running) +# These are real Madrid coordinates for testing weather and traffic data acquisition +MADRID_COORDS=( + "40.4168:-3.7038" # Sol (city center) + "40.4378:-3.6795" # Retiro area + "40.4093:-3.6936" # Atocha area + "40.4517:-3.6847" # Chamberí area + "40.3897:-3.6774" # Delicias area +) + +# Select random coordinates from Madrid locations +SELECTED_COORDS=${MADRID_COORDS[$((RANDOM % ${#MADRID_COORDS[@]}))]} +IFS=':' read -r MOCK_LATITUDE MOCK_LONGITUDE <<< "$SELECTED_COORDS" + +echo "Using mock coordinates for Madrid:" +echo " Latitude: $MOCK_LATITUDE" +echo " Longitude: $MOCK_LONGITUDE" +echo " (This simulates the address-to-coordinates conversion service)" + +# Using exact schema from BakeryRegistration with added coordinates BAKERY_DATA="{ \"name\": \"Panadería Test $(date +%H%M)\", \"business_type\": \"bakery\", \"address\": \"Calle Gran Vía 123\", \"city\": \"Madrid\", \"postal_code\": \"28001\", - \"phone\": \"+34600123456\" + \"phone\": \"+34600123456\", + \"latitude\": $MOCK_LATITUDE, + \"longitude\": $MOCK_LONGITUDE }" -echo "Bakery Data:" +echo "Bakery Data with mock coordinates:" echo "$BAKERY_DATA" | python3 -m json.tool BAKERY_RESPONSE=$(curl -s -w "\nHTTP_CODE:%{http_code}" -X POST "$API_BASE/api/v1/tenants/register" \ @@ -330,6 +351,37 @@ if check_response "$BAKERY_RESPONSE" "Bakery Registration"; then TENANT_ID=$(extract_json_field "$BAKERY_RESPONSE" "id") if [ -n "$TENANT_ID" ]; then log_success "Tenant ID extracted: $TENANT_ID" + log_success "Mock coordinates will be used for weather/traffic data: ($MOCK_LATITUDE, $MOCK_LONGITUDE)" + + # Store coordinates for later use in training + echo "BAKERY_LATITUDE=$MOCK_LATITUDE" > /tmp/bakery_coords.env + echo "BAKERY_LONGITUDE=$MOCK_LONGITUDE" >> /tmp/bakery_coords.env + echo "TENANT_ID=$TENANT_ID" >> /tmp/bakery_coords.env + + log_step "2.2. Testing weather data acquisition with mock coordinates" + # Test if weather service can use these coordinates + WEATHER_TEST_RESPONSE=$(curl -s -X GET "$API_BASE/api/v1/training/$TENANT_ID/weather/current?latitude=$MOCK_LATITUDE&longitude=$MOCK_LONGITUDE" \ + -H "Authorization: Bearer $ACCESS_TOKEN" \ + -H "X-Tenant-ID: $TENANT_ID" 2>/dev/null || echo '{"status":"service_unavailable"}') + + if echo "$WEATHER_TEST_RESPONSE" | grep -q '"temperature"\|"weather"'; then + log_success "Weather service can use mock coordinates" + else + log_warning "Weather service test skipped (coordinates stored for training)" + fi + + log_step "2.3. Testing traffic data acquisition with mock coordinates" + # Test if traffic service can use these coordinates + TRAFFIC_TEST_RESPONSE=$(curl -s -X GET "$API_BASE/api/v1/training/$TENANT_ID/traffic/current?latitude=$MOCK_LATITUDE&longitude=$MOCK_LONGITUDE" \ + -H "Authorization: Bearer $ACCESS_TOKEN" \ + -H "X-Tenant-ID: $TENANT_ID" 2>/dev/null || echo '{"status":"service_unavailable"}') + + if echo "$TRAFFIC_TEST_RESPONSE" | grep -q '"traffic_volume"\|"intensity"'; then + log_success "Traffic service can use mock coordinates" + else + log_warning "Traffic service test skipped (coordinates stored for training)" + fi + else log_error "Failed to extract tenant ID" exit 1