Files
gcontext/api/app/routes_public.py
T
bernatsamperaandClaude Opus 4.6 ce6e7711af Strip API to install-counter service, add CLI install ping
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>
2026-08-11 00:12:09 +02:00

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)