Skip to content
Merged
Show file tree
Hide file tree
Changes from 1 commit
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
32 changes: 32 additions & 0 deletions src/mavedb/routers/score_sets.py
Original file line number Diff line number Diff line change
Expand Up @@ -672,6 +672,38 @@ def search_my_score_sets(
return {"score_sets": enriched_score_sets, "num_score_sets": num_score_sets}


@router.get(
"/score-sets/",
status_code=200,
response_model=list[score_set.ScoreSet],
responses={**ACCESS_CONTROL_ERROR_RESPONSES},
response_model_exclude_none=True,
summary="Fetch score sets by URN list",
)
async def show_score_sets(
*,
urns: str = Query(..., description="Comma-separated list of score set URNs"),
db: Session = Depends(deps.get_db),
user_data: UserData = Depends(get_current_user),
) -> Any:
"""
Fetch score sets identified by a list of URNs.
"""
urn_list = [urn.strip() for urn in urns.split(",") if urn.strip()]
if not urn_list:
raise HTTPException(status_code=422, detail="At least one URN is required")

save_to_logging_context({"requested_resource": urn_list})
response_items: list[score_set.ScoreSet] = []
for urn in urn_list:
item = await fetch_score_set_by_urn(db, urn, user_data, None, False)
enriched_experiment = enrich_experiment_with_num_score_sets(item.experiment, user_data)
response_item = score_set.ScoreSet.model_validate(item).copy(update={"experiment": enriched_experiment})
response_items.append(response_item)

return response_items


@router.get(
"/score-sets/{urn}",
status_code=200,
Expand Down
50 changes: 50 additions & 0 deletions tests/routers/test_score_set.py
Original file line number Diff line number Diff line change
Expand Up @@ -713,6 +713,56 @@ def test_get_own_private_score_set(client, setup_router_db):
assert (key, expected_response[key]) == (key, response_data[key])


def test_get_score_sets_by_comma_separated_urns(client, setup_router_db):
experiment = create_experiment(client)
first_score_set = create_seq_score_set(client, experiment["urn"])
second_score_set = create_seq_score_set(client, experiment["urn"])

response = client.get(
"/api/v1/score-sets/",
params={"urns": f"{first_score_set['urn']}, {second_score_set['urn']}"},
)
assert response.status_code == 200

response_data = response.json()
assert [item["urn"] for item in response_data] == [first_score_set["urn"], second_score_set["urn"]]

for item in response_data:
jsonschema.validate(instance=item, schema=ScoreSet.model_json_schema())


def test_get_score_sets_requires_at_least_one_urn(client, setup_router_db):
response = client.get("/api/v1/score-sets/", params={"urns": " , "})
assert response.status_code == 422
assert response.json()["detail"] == "At least one URN is required"


def test_get_score_sets_with_mixed_valid_and_invalid_urns_returns_404(client, setup_router_db):
experiment = create_experiment(client)
score_set = create_seq_score_set(client, experiment["urn"])
missing_urn = "urn:mavedb:99999999-z-9"

response = client.get(
"/api/v1/score-sets/",
params={"urns": f"{score_set['urn']},{missing_urn}"},
)
assert response.status_code == 404
assert response.json()["detail"] == f"score set with URN '{missing_urn}' not found"


def test_get_score_sets_with_whitespace_around_urns_in_mixed_list_returns_404(client, setup_router_db):
experiment = create_experiment(client)
score_set = create_seq_score_set(client, experiment["urn"])
missing_urn = "urn:mavedb:99999999-z-9"

response = client.get(
"/api/v1/score-sets/",
params={"urns": f" {score_set['urn']} , {missing_urn} "},
)
assert response.status_code == 404
assert response.json()["detail"] == f"score set with URN '{missing_urn}' not found"


def test_cannot_get_other_user_private_score_set(session, client, setup_router_db):
experiment = create_experiment(client)
score_set = create_seq_score_set(client, experiment["urn"])
Expand Down
Loading