Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Spike/get concepts associated with a document from vespa #459

Merged
merged 2 commits into from
Feb 6, 2025
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
48 changes: 47 additions & 1 deletion app/api/api_v1/routers/documents.py
Original file line number Diff line number Diff line change
Expand Up @@ -16,7 +16,7 @@
get_slugged_objects,
)
from app.service.custom_app import AppTokenFactory
from app.service.search import get_family_from_vespa
from app.service.search import get_document_from_vespa, get_family_from_vespa

_LOGGER = logging.getLogger(__file__)

Expand Down Expand Up @@ -105,3 +105,49 @@ async def family_detail_from_vespa(
return hits
except ValueError as err:
raise HTTPException(status_code=NOT_FOUND, detail=str(err))


@documents_router.get("/document/{import_id}", response_model=SearchResponse)
async def doc_detail_from_vespa(
import_id: str,
request: Request,
app_token: Annotated[str, Header()],
db=Depends(get_db),
):
"""Get details of the document associated with a slug from vespa.

NOTE: As part of our concepts spike, we're going to use this endpoint
to get the document data from Vespa. The frontend will use this
endpoint alongside the `/documents` endpoint if feature flags are
enabled.

:param str import_id: Document import id to get vespa representation
for.
:param Request request: Request object.
:param Annotated[str, Header()] app_token: App token containing
allowed corpora.
:param Depends[get_db] db: Database session to query against.
:return SearchResponse: An object representing the document in
Vespa - including concepts.
"""
_LOGGER.info(
f"Getting detailed information for vespa document '{import_id}'",
extra={
"props": {"import_id_or_slug": import_id, "app_token": str(app_token)},
},
)

# Decode the app token and validate it.
token = AppTokenFactory()
token.decode_and_validate(db, request, app_token)

try:
# TODO: Make this respect the allowed corpora from the decoded token.
hits = get_document_from_vespa(document_id=import_id, db=db)
if hits.total_family_hits == 0:
raise HTTPException(
status_code=NOT_FOUND, detail=f"Nothing found for {import_id} in Vespa"
)
return hits
except ValueError as err:
raise HTTPException(status_code=NOT_FOUND, detail=str(err))
22 changes: 22 additions & 0 deletions app/service/search.py
Original file line number Diff line number Diff line change
Expand Up @@ -614,6 +614,28 @@ def get_family_from_vespa(family_id: str, db: Session) -> CprSdkSearchResponse:
return result


def get_document_from_vespa(document_id: str, db: Session) -> CprSdkSearchResponse:
"""Get a document from vespa.

:param str document_id: The id of the document to get.
:param Session db: Database session to query against.
:return CprSdkSearchResponse: The document from vespa.
"""
search_body = SearchParameters(
document_ids=[document_id], documents_only=True, all_results=True
)

_LOGGER.info(
f"Getting vespa document '{document_id}'",
extra={"props": {"search_body": search_body.model_dump()}},
)
try:
result = _VESPA_CONNECTION.search(parameters=search_body)
except QueryError as e:
raise ValidationError(e)
return result


def get_s3_doc_url_from_cdn(
s3_client: S3Client, s3_document: S3Document, data_dump_s3_key: str
) -> Optional[str]:
Expand Down
2 changes: 1 addition & 1 deletion pyproject.toml
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
[tool.poetry]
name = "navigator_backend"
version = "1.23.3"
version = "1.23.4"
description = ""
authors = ["CPR-dev-team <[email protected]>"]
packages = [{ include = "app" }, { include = "tests" }]
Expand Down
Loading