Files
border-red-post-nalati/backend/app/api/routes/indexes.py
T

92 lines
2.8 KiB
Python

from uuid import UUID
from fastapi import APIRouter, Depends, Query
from sqlalchemy import select
from sqlalchemy.orm import Session
from app.db.session import get_db
from app.models.indexing import Chunk, IndexPublication, IndexVersion
from app.schemas.catalog import Page
from app.schemas.indexing import (
ActiveIndex,
BuildIndex,
ChunkRead,
IndexRead,
PublicationRead,
PublishIndex,
)
from app.services.auth import CurrentSession, require_admin
from app.services.catalog import page_result
from app.services.indexing import active_index, build_index, publish_index, version_or_404
router = APIRouter(prefix="/indexes", tags=["indexes"], dependencies=[Depends(require_admin)])
@router.post("", response_model=IndexRead, status_code=201)
def build(
payload: BuildIndex,
current: CurrentSession = Depends(require_admin),
db: Session = Depends(get_db),
):
return build_index(db, payload, current.user.id)
@router.get("", response_model=Page[IndexRead])
def list_versions(
page: int = Query(1, ge=1),
page_size: int = Query(20, ge=1, le=100),
db: Session = Depends(get_db),
):
return page_result(
db,
select(IndexVersion).order_by(IndexVersion.created_at.desc(), IndexVersion.id),
page,
page_size,
)
@router.get("/active", response_model=ActiveIndex)
def active(db: Session = Depends(get_db)):
return active_index(db)
@router.get("/publications", response_model=Page[PublicationRead])
def publications(
page: int = Query(1, ge=1),
page_size: int = Query(20, ge=1, le=100),
db: Session = Depends(get_db),
):
return page_result(
db, select(IndexPublication).order_by(IndexPublication.generation.desc()), page, page_size
)
@router.get("/{version_id}", response_model=IndexRead)
def read_version(version_id: UUID, db: Session = Depends(get_db)):
return version_or_404(db, str(version_id))
@router.post("/{version_id}/publish", response_model=ActiveIndex)
def publish(
version_id: UUID,
payload: PublishIndex,
current: CurrentSession = Depends(require_admin),
db: Session = Depends(get_db),
):
return publish_index(db, version_id, payload.expected_generation, current.user.id)
@router.get("/{version_id}/chunks", response_model=Page[ChunkRead])
def chunks(
version_id: UUID,
knowledge_id: int | None = Query(None, gt=0),
page: int = Query(1, ge=1),
page_size: int = Query(20, ge=1, le=100),
db: Session = Depends(get_db),
):
version_or_404(db, str(version_id))
statement = select(Chunk).where(Chunk.index_version_id == str(version_id))
if knowledge_id is not None:
statement = statement.where(Chunk.knowledge_id == knowledge_id)
return page_result(db, statement.order_by(Chunk.knowledge_id, Chunk.ordinal), page, page_size)