This commit is contained in:
@@ -10,7 +10,8 @@ from fastapi.responses import FileResponse,JSONResponse,Response
|
||||
from sqlalchemy import select,func,text
|
||||
from starlette.concurrency import run_in_threadpool
|
||||
from .config import settings
|
||||
from .db import Job,sessions
|
||||
from .expiry import expiration
|
||||
from .db import Job,sessions,active_jobs
|
||||
from .storage import storage
|
||||
from .uploads import read_schematic
|
||||
from .models.api import ComparisonStatus,ComparisonUploadResponse
|
||||
@@ -37,20 +38,19 @@ def register_comparison_routes(app, *, authorize, require_api, error):
|
||||
@app.post('/api/v1/comparisons',status_code=202,response_model=ComparisonUploadResponse,response_model_exclude_unset=True,tags=['Comparisons'])
|
||||
async def create(old_file:Annotated[UploadFile,File()],new_file:Annotated[UploadFile,File()],
|
||||
access:Annotated[Literal['private','unlisted'],Form()]='private',
|
||||
expires_in:Annotated[int|None,Form(gt=0)]=None,
|
||||
expires_in:Annotated[int|None,Form(ge=-1, description="-1 for no expiry, or positive seconds")]=None,
|
||||
x_api_key:Annotated[str|None,Header()]=None):
|
||||
require_api(x_api_key)
|
||||
ttl=expires_in or settings().link_ttl
|
||||
if ttl>settings().link_ttl:error('invalid_expiry','expires_in exceeds the configured link lifetime',422)
|
||||
now=time.time();expires_at=expiration(expires_in,now)
|
||||
try:
|
||||
old_name,old=await read_schematic(old_file)
|
||||
new_name,new=await read_schematic(new_file)
|
||||
finally:
|
||||
await old_file.close();await new_file.close()
|
||||
identifier=secrets.token_hex(24);token=secrets.token_urlsafe(32);now=time.time()
|
||||
identifier=secrets.token_hex(24);token=secrets.token_urlsafe(32)
|
||||
job=Job(id=identifier,filename='Schematic comparison',status='queued',access=access,
|
||||
token_hash=hashlib.sha256(token.encode()).hexdigest(),created_at=now,updated_at=now,
|
||||
expires_at=now+ttl,attempt=0,input_key=identifier+'/comparison.json')
|
||||
expires_at=expires_at,attempt=0,input_key=identifier+'/comparison.json')
|
||||
files={identifier+'/old.SchDoc':old,identifier+'/new.SchDoc':new,
|
||||
job.input_key:json.dumps({'schema_version':'1.0','old_filename':old_name,'new_filename':new_name}).encode()}
|
||||
def persist():
|
||||
@@ -58,7 +58,7 @@ def register_comparison_routes(app, *, authorize, require_api, error):
|
||||
try:
|
||||
with sessions().begin() as db:
|
||||
if db.bind.dialect.name=='postgresql':db.execute(text('SELECT pg_advisory_xact_lock(84721309)'))
|
||||
pending=db.scalar(select(func.count()).select_from(Job).where(Job.status.in_(['queued','processing']),Job.expires_at>now))
|
||||
pending=db.scalar(select(func.count()).select_from(Job).where(Job.status.in_(['queued','processing']),active_jobs(now)))
|
||||
if pending>=settings().max_pending:error('queue_full','Rendering queue is full; try again later',503)
|
||||
for key,body in files.items():
|
||||
try: storage().put(key,body)
|
||||
|
||||
مرجع در شماره جدید
مسدود کردن کاربر