@ -10,7 +10,7 @@ from typing import List, Optional
from fastapi import APIRouter , Depends , HTTPException , Query , Response
from fastapi import APIRouter , Depends , HTTPException , Query , Response
from sqlalchemy . ext . asyncio import AsyncSession
from sqlalchemy . ext . asyncio import AsyncSession
from app . core . database import get_db
from app . core . database import get_db , AsyncSessionLocal
from app . schemas . filing import (
from app . schemas . filing import (
BulkExhibitItem ,
BulkExhibitItem ,
BulkExhibitRequest ,
BulkExhibitRequest ,
@ -290,9 +290,11 @@ async def get_exhibit_bulk(
async def _fetch_one ( item : dict ) - > BulkExhibitItem :
async def _fetch_one ( item : dict ) - > BulkExhibitItem :
accession_number = item . get ( " accession_number " , " " )
accession_number = item . get ( " accession_number " , " " )
exhibit_type = item . get ( " exhibit_type " , " EX-99.1 " )
exhibit_type = item . get ( " exhibit_type " , " EX-99.1 " )
# Each concurrent call gets its own DB session to avoid session contention
async with AsyncSessionLocal ( ) as session :
try :
try :
result = await asyncio . wait_for (
result = await asyncio . wait_for (
sec_filings_service . get_exhibit_content ( db , accession_number , exhibit_type ) ,
sec_filings_service . get_exhibit_content ( session , accession_number , exhibit_type ) ,
timeout = 30 ,
timeout = 30 ,
)
)
return BulkExhibitItem (
return BulkExhibitItem (