SPB Git forge

spb/ai-atlas

Public
41commits 1branches 0releases
4.6 MBsize
maindefault branch
12 days agolast push
HTML 77.2% TypeScript 10.5% Python 9.6% JavaScript 2.5%
2.6 KB · 35 lines python
Raw Blame History
1"""/sources — public transparency page: every source with tier, connectors and health (no credentials, no internal hosts)."""2from __future__ import annotations34from typing import Any56from fastapi import APIRouter, Request78from aiatlas.api.common import cached9from aiatlas.db import connection, fetch_all1011router = APIRouter(prefix="/api/v1/sources", tags=["sources"])121314@router.get("")15@cached(300)16async def list_sources(request: Request) -> dict[str, Any]:17    async with connection() as conn:18        rows = await fetch_all(conn, """19            select s.id, s.key, s.name, s.domain, s.tier, s.kind, s.category, s.base_url, s.robots_policy, s.enabled, s.priority, s.notes,20                   o.id as org_id, o.slug as org_slug, o.canonical_name as org_name,21                   (select count(*) from documents d where d.source_id = s.id) as documents,22                   (select count(*) from snapshots x join documents d on d.id = x.document_id where d.source_id = s.id) as snapshots,23                   (select max(d.last_fetched_at) from documents d where d.source_id = s.id) as last_crawled_at,24                   (select count(*) from claims c where c.source_id = s.id and c.status = 'current') as claims,25                   coalesce((select jsonb_agg(jsonb_build_object('name', c.name, 'label', c.label, 'health', c.health, 'enabled', c.enabled,26                                                                  'last_success_at', to_char(c.last_success_at at time zone 'UTC', 'YYYY-MM-DD"T"HH24:MI:SS.US"Z"'),27                                                                  'interval_seconds', c.interval_seconds, 'priority', c.priority, 'parser_version', c.parser_version) order by c.name)28                             from connectors c where c.source_id = s.id), '[]'::jsonb) as connectors29            from sources s left join entities o on o.id = s.organization_id order by s.tier, s.priority, s.name""")30    items = [{"key": r["key"], "name": r["name"], "domain": r["domain"], "tier": r["tier"], "kind": r["kind"], "category": r["category"], "base_url": r["base_url"],31              "robots_policy": r["robots_policy"], "organization": {"id": r["org_id"], "slug": r["org_slug"], "name": r["org_name"]} if r["org_id"] else None,32              "enabled": r["enabled"], "priority": r["priority"], "notes": r["notes"], "documents": int(r["documents"] or 0), "snapshots": int(r["snapshots"] or 0),33              "claims": int(r["claims"] or 0), "last_crawled_at": r["last_crawled_at"], "connectors": r["connectors"] or []} for r in rows]34    return {"items": items, "total": len(items), "tiers": {1: "official / primary", 2: "quality secondary", 3: "community", 4: "unverified"}}35