mirror of
https://github.com/bleak-ai/gcontext.git
synced 2026-08-11 13:19:23 +02:00
API: replace the marketplace (submit/approve/reject/moderation) with a minimal counter table (id + downloads). Single upsert endpoint auto-creates rows on first ping, X-Source: site exclusion preserved. Inline migration copies existing counts and drops legacy tables. Removes slowapi, pyyaml, manifest validation, and all moderation routes. CLI: gcontext add now pings the API after a successful registry install so the download counter reflects real usage. Fire-and-forget with 3s timeout, gated to skip when GCONTEXT_REGISTRY is overridden (tests, private registries). Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
43 lines
1.3 KiB
Python
43 lines
1.3 KiB
Python
import re
|
|
|
|
from fastapi import APIRouter, Depends, HTTPException, Request
|
|
from sqlalchemy import select
|
|
from sqlalchemy.dialects.postgresql import insert
|
|
from sqlalchemy.orm import Session
|
|
|
|
from .db import get_session
|
|
from .models import Workflow
|
|
from .schemas import WorkflowOut
|
|
|
|
router = APIRouter(prefix="/api/workflows", tags=["workflows"])
|
|
|
|
SLUG_RE = re.compile(r"^[a-z0-9][a-z0-9-]*$")
|
|
|
|
|
|
@router.get("/{workflow_id}", response_model=WorkflowOut)
|
|
def get_workflow(
|
|
workflow_id: str, request: Request, session: Session = Depends(get_session)
|
|
):
|
|
if not SLUG_RE.match(workflow_id):
|
|
raise HTTPException(status_code=404, detail="invalid workflow id")
|
|
|
|
if request.headers.get("x-source") == "site":
|
|
row = session.scalars(
|
|
select(Workflow).where(Workflow.id == workflow_id)
|
|
).first()
|
|
return WorkflowOut(id=workflow_id, downloads=row.downloads if row else 0)
|
|
|
|
stmt = (
|
|
insert(Workflow)
|
|
.values(id=workflow_id, downloads=1)
|
|
.on_conflict_do_update(
|
|
index_elements=[Workflow.id],
|
|
set_={"downloads": Workflow.downloads + 1},
|
|
)
|
|
.returning(Workflow.downloads)
|
|
)
|
|
result = session.execute(stmt)
|
|
session.commit()
|
|
count = result.scalar_one()
|
|
return WorkflowOut(id=workflow_id, downloads=count)
|