mirror of
https://github.com/safishamsi/graphify.git
synced 2026-07-11 18:07:31 +00:00
79 lines
2.4 KiB
Python
79 lines
2.4 KiB
Python
"""
|
|
API module - exposes the document pipeline over HTTP.
|
|
Thin layer over parser, validator, processor, and storage.
|
|
"""
|
|
from parser import batch_parse, parse_file
|
|
from validator import validate_document, ValidationError
|
|
from processor import process_and_save, enrich_document
|
|
from storage import load_record, delete_record, list_records, load_index
|
|
|
|
|
|
def handle_upload(paths: list) -> dict:
|
|
"""
|
|
Accept a list of file paths, run the full pipeline on each,
|
|
and return a summary of what succeeded and what failed.
|
|
"""
|
|
results = batch_parse(paths)
|
|
succeeded = [r for r in results if r["ok"]]
|
|
failed = [r for r in results if not r["ok"]]
|
|
return {
|
|
"uploaded": len(succeeded),
|
|
"failed": len(failed),
|
|
"ids": [r["id"] for r in succeeded],
|
|
"errors": failed,
|
|
}
|
|
|
|
|
|
def handle_get(record_id: str) -> dict:
|
|
"""Fetch a document by ID and return it."""
|
|
try:
|
|
return load_record(record_id)
|
|
except KeyError:
|
|
return {"error": f"Record {record_id} not found"}
|
|
|
|
|
|
def handle_delete(record_id: str) -> dict:
|
|
"""Delete a document by ID."""
|
|
deleted = delete_record(record_id)
|
|
if deleted:
|
|
return {"deleted": record_id}
|
|
return {"error": f"Record {record_id} not found"}
|
|
|
|
|
|
def handle_list() -> dict:
|
|
"""List all document IDs in storage."""
|
|
return {"records": list_records()}
|
|
|
|
|
|
def handle_search(query: str) -> dict:
|
|
"""
|
|
Simple keyword search over the index.
|
|
Returns documents whose keyword list overlaps with the query terms.
|
|
"""
|
|
terms = set(query.lower().split())
|
|
index = load_index()
|
|
matches = []
|
|
for record_id, entry in index.items():
|
|
keywords = set(entry.get("keywords", []))
|
|
if terms & keywords:
|
|
matches.append({
|
|
"id": record_id,
|
|
"title": entry.get("title", ""),
|
|
"matched_keywords": list(terms & keywords),
|
|
})
|
|
return {"query": query, "results": matches}
|
|
|
|
|
|
def handle_enrich(record_id: str) -> dict:
|
|
"""Re-enrich a document to pick up new cross-references."""
|
|
try:
|
|
doc = load_record(record_id)
|
|
except KeyError:
|
|
return {"error": f"Record {record_id} not found"}
|
|
try:
|
|
validated = validate_document(doc)
|
|
except ValidationError as e:
|
|
return {"error": str(e)}
|
|
enriched_id = process_and_save(validated)
|
|
return {"enriched": enriched_id}
|