File size: 2,504 Bytes
bd279b4
5a0e691
f42f5a6
5a0e691
 
bd279b4
f8dfa58
f42f5a6
bd279b4
5a0e691
 
 
bd279b4
5a0e691
 
 
 
 
9a28cd0
1f75a84
 
 
cee7881
f3682aa
5a0e691
 
51ed454
bd279b4
5a0e691
 
 
 
76fb273
 
5a0e691
 
 
 
 
 
f8dfa58
5a0e691
211c4f9
88aa370
5a0e691
 
1f75a84
 
 
 
 
 
 
 
76fb273
5a0e691
76fb273
e5d75ff
76fb273
5a0e691
 
88aa370
5a0e691
 
f42f5a6
5a0e691
 
 
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
from fastapi import APIRouter, HTTPException, Depends, Request
from pydantic import BaseModel
from app.services.validators import validate_fasta
from app.pipeline.definitions.protein_analysis import get_pipeline_definition
from app.services.supabase import get_supabase
from app.services.rate_limit import check_daily_limit, check_daily_limit_pipelines
from app.services.auth import get_user_id
from app.models.responses import PipelineRunResponse, PipelineDefinitionResponse
from app.deps import limiter
from datetime import datetime, timezone
import uuid


router = APIRouter()


class PipelineRunRequest(BaseModel):
    sequence: str
    pipeline_type: str = "protein_analysis"
    database: str = ""
    program: str = ""
    max_hits: int = 100
    query_accession: str = ""
    fast_mode: bool = False


@router.post("/run", response_model=PipelineRunResponse)
async def run_pipeline(request: Request, req: PipelineRunRequest, user_id: str | None = Depends(get_user_id)):
    validation = validate_fasta(req.sequence, "blast")
    if not validation.valid:
        raise HTTPException(status_code=400, detail=validation.error)

    seq = str(validation.sequences[0].seq).upper()
    clean = "".join(c for c in seq if c.isalpha())

    job_id = str(uuid.uuid4())
    supabase = get_supabase()

    supabase.table("jobs").insert({
        "id": job_id,
        "user_id": user_id,
        "tool": "pipeline",
        "query_preview": clean,
        "status": "queued",
        "pipeline_type": req.pipeline_type,
        "steps_completed": [],
        "context_json": {
            "sequence": clean,
            "fast_mode": req.fast_mode,
            "database": req.database,
            "program": req.program,
            "max_hits": req.max_hits,
            "query_accession": req.query_accession,
        },
        "progress_pct": 0,
        "created_at": datetime.now(timezone.utc).isoformat(),
        "completed_at": None,
        "error": None,
        "share_token": None,
    }).execute()

    return {"job_id": job_id, "status": "queued"}


@router.get("/definitions", response_model=PipelineDefinitionResponse)
async def list_pipeline_definitions():
    return {"pipelines": [get_pipeline_definition()]}


@router.get("/{pipeline_type}/definition")
async def get_pipeline_definition_endpoint(pipeline_type: str):
    if pipeline_type == "protein_analysis":
        return get_pipeline_definition()
    raise HTTPException(status_code=404, detail=f"Unknown pipeline: {pipeline_type}")