diff --git a/src/alpine_bits_python/api.py b/src/alpine_bits_python/api.py index ec31cff..702b832 100644 --- a/src/alpine_bits_python/api.py +++ b/src/alpine_bits_python/api.py @@ -1410,14 +1410,32 @@ async def handle_xml_upload( filename, ) - # Process the conversion XML and save to database - # Use SessionMaker for concurrent processing of large XML files - # This allows multiple reservations to be processed in parallel with independent sessions - conversion_service = ConversionService(session_maker) - processing_stats = await conversion_service.process_conversion_xml(xml_content) + # Process the conversion XML in the background + async def process_in_background(): + """Process conversion XML asynchronously in the background.""" + try: + # Use SessionMaker for concurrent processing of large XML files + # This allows multiple reservations to be processed + # in parallel with independent sessions + conversion_service = ConversionService(session_maker) + processing_stats = await conversion_service.process_conversion_xml( + xml_content + ) - _LOGGER.info( - "Conversion processing complete for %s: %s", filename, processing_stats + _LOGGER.info( + "Conversion processing complete for %s: %s", + filename, + processing_stats, + ) + except Exception: + _LOGGER.exception( + "Error processing conversion XML in background for %s", filename + ) + + # Create background task and add done callback for error logging + task = asyncio.create_task(process_in_background()) + task.add_done_callback( + lambda t: t.exception() if not t.cancelled() else None ) response_headers = { @@ -1425,25 +1443,17 @@ async def handle_xml_upload( "X-AlpineBits-Server-Accept-Encoding": "gzip", } - # Return processing stats in response + # Return immediate acknowledgment response_content = f""" - success - Conversion data processed successfully - - {processing_stats["total_reservations"]} - {processing_stats["deleted_reservations"]} - {processing_stats["total_daily_sales"]} - {processing_stats["matched_to_reservation"]} - {processing_stats["matched_to_customer"]} - {processing_stats["matched_to_hashed_customer"]} - {processing_stats["unmatched"]} - {processing_stats["errors"]} - + accepted + XML file received and queued for processing + {filename} + {datetime.now().isoformat()} """ return Response( - content=response_content, headers=response_headers, status_code=200 + content=response_content, headers=response_headers, status_code=202 ) except HTTPException: