Skip to content
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
65 changes: 39 additions & 26 deletions app/api/resources/rapid_view.py
Original file line number Diff line number Diff line change
Expand Up @@ -41,21 +41,34 @@ async def resolve_rapid_stable_id(request: Request, stable_id: str):
)
return HTMLResponse(generate_rapid_id_page(res))

matches = search_results.get("matches")
metadata_results = get_metadata(matches)
try:
matches = search_results.get("matches")
metadata_results = get_metadata(matches)

stable_id_resolver_response = StableIdResolverResponse(
stable_id=stable_id,
code=308,
rapid_archive_url=rapid_archive_url
)
results = build_stable_id_resolver_content(metadata_results)
stable_id_resolver_response.content = results
stable_id_resolver_response = StableIdResolverResponse(
stable_id=stable_id,
code=308,
rapid_archive_url=rapid_archive_url
)
results = build_stable_id_resolver_content(metadata_results)
stable_id_resolver_response.content = results

if is_json_request(request):
return results
if is_json_request(request):
return results

return HTMLResponse(generate_rapid_id_page(stable_id_resolver_response))
return HTMLResponse(generate_rapid_id_page(stable_id_resolver_response))
except Exception as e:
logging.error(f"Error: {e}")
if is_json_request(request):
return response_error_handler({"status": 500})
res = StableIdResolverResponse(
stable_id=stable_id,
code=500,
message=str(e),
content=None,
rapid_archive_url=rapid_archive_url
)
return HTMLResponse(generate_rapid_id_page(res))


@router.get("/info/{subpath:path}", name="Resolve rapid help page")
Expand Down Expand Up @@ -94,19 +107,19 @@ async def resolve_species(
)
return rapid_resolved_response(response, request)

assembly_accession_id = format_assembly_accession(species_url_name)

if assembly_accession_id is None:
input_error_response = RapidResolverResponse(
response_type=RapidResolverHtmlResponseType.ERROR,
code=422,
resolved_url=f"{ENSEMBL_URL}/species-selector",
message="Invalid input accession ID",
species_name=species_url_name,
)
return rapid_resolved_response(input_error_response, request)

try:
assembly_accession_id = format_assembly_accession(species_url_name)

if assembly_accession_id is None:
input_error_response = RapidResolverResponse(
response_type=RapidResolverHtmlResponseType.ERROR,
code=422,
resolved_url=f"{ENSEMBL_URL}/species-selector",
message="Invalid input accession ID",
species_name=species_url_name,
)
return rapid_resolved_response(input_error_response, request)

genome_object = get_genome_id_from_assembly_accession_id(assembly_accession_id)

if genome_object and genome_object != {}:
Expand All @@ -131,7 +144,7 @@ async def resolve_species(
else:
raise HTTPException(status_code=404, detail="Genome not found")
except HTTPException as e:
logging.debug(e)
logging.error(f"HTTP Error: {e.detail}")
response = RapidResolverResponse(
response_type=RapidResolverHtmlResponseType.ERROR,
code=e.status_code,
Expand All @@ -141,7 +154,7 @@ async def resolve_species(
)
return rapid_resolved_response(response, request)
except Exception as e:
logging.debug(f"Unexpected error occurred: {e}")
logging.error(f"Error: {e}")
response = RapidResolverResponse(
species_name=species_url_name,
response_type=RapidResolverHtmlResponseType.ERROR,
Expand Down
48 changes: 30 additions & 18 deletions app/api/resources/resolver_view.py
Original file line number Diff line number Diff line change
Expand Up @@ -41,26 +41,38 @@ async def resolve(
)
return HTMLResponse(generate_resolver_id_page(res))

matches = search_results.get("matches")
try:
matches = search_results.get("matches")

# Get metadata for all genomes
metadata_results = get_metadata(matches)
# Get metadata for all genomes
metadata_results = get_metadata(matches)

stable_id_resolver_response = StableIdResolverResponse(
stable_id=stable_id,
code=308,
)
results = build_stable_id_resolver_content(metadata_results)
stable_id_resolver_response.content = results
stable_id_resolver_response = StableIdResolverResponse(
stable_id=stable_id,
code=308,
)
results = build_stable_id_resolver_content(metadata_results)
stable_id_resolver_response.content = results

if is_json_request(request):
return results
if is_json_request(request):
return results

if len(results) == 1:
if app == "entity-viewer":
resolved_url = results[0].entity_viewer_url
if len(results) == 1:
if app == "entity-viewer":
resolved_url = results[0].entity_viewer_url
else:
resolved_url = results[0].genome_browser_url
return RedirectResponse(resolved_url)
else:
resolved_url = results[0].genome_browser_url
return RedirectResponse(resolved_url)
else:
return HTMLResponse(generate_resolver_id_page(stable_id_resolver_response))
return HTMLResponse(generate_resolver_id_page(stable_id_resolver_response))
except Exception as e:
logging.error(f"Error: {e}")
if is_json_request(request):
return response_error_handler({"status": 500})
res = StableIdResolverResponse(
stable_id=stable_id,
code=500,
message=str(e),
content=None
)
return HTMLResponse(generate_resolver_id_page(res))
2 changes: 1 addition & 1 deletion app/api/resources/templates/shared/id_content.html
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,7 @@
<span class="search-param-label">Gene</span>
<span class="search-param-value">{{ response.stable_id }}</span>
</div>
{% if response.code == 404 and response.message %}
{% if (response.code == 404 or response.code == 500) and response.message %}
Copy link

@azangru azangru Sep 16, 2025

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

The id_content.html isn't really well-suited for showing the 500 error. For that matter, it doesn't really fit the 404 error either. The Venn diagram doesn't make sense here. There isn't a 'redirect' happening.

Image Image

Also, I realise that the 404 page says:

You will be redirected to the new Ensembl website, where you will find the latest genomic information

which isn't correct (the 404 page isn't redirecting user anywhere).

I don't have any concrete solutions for this; just pointing this out. I wouldn't say that this is a blocker.

<div class="error-message">
{{ response.message }}
</div>
Expand Down
22 changes: 7 additions & 15 deletions app/api/utils/metadata.py
Original file line number Diff line number Diff line change
@@ -1,4 +1,3 @@
from loguru import logger
import requests
from typing import List

Expand All @@ -15,19 +14,16 @@ def get_metadata(matches: List[SearchMatch] = []):
try:
session = requests.Session()
with session.get(
url=f"{ENSEMBL_URL}/api/metadata/genome/{genome_id}/details"
url=f"{ENSEMBL_URL}/api/metadata/genome/{genome_id}/details",
timeout=10
) as response:
response.raise_for_status()
metadata_results[genome_id] = response.json()
metadata_results[genome_id]["unversioned_stable_id"] = match.get(
"unversioned_stable_id"
)
except requests.exceptions.HTTPError as HTTPError:
logger.error(f"HTTPError: {HTTPError}")
raise HTTPError
except Exception as e:
logger.exception(e)
raise e
except Exception:
raise Exception("Failed to fetch data from metadata service")

return metadata_results

Expand All @@ -38,12 +34,8 @@ def get_genome_id_from_assembly_accession_id(accession_id: str):
metadata_api_url = (
f"{ENSEMBL_URL}/api/metadata/genomeid?assembly_accession_id={accession_id}"
)
with session.get(url=metadata_api_url) as response:
with session.get(url=metadata_api_url, timeout=10) as response:
response.raise_for_status()
return response.json()
except requests.exceptions.HTTPError as HTTPError:
logger.error(f"HTTPError: {HTTPError}")
raise HTTPError
except Exception as e:
logger.exception(e)
raise e
except Exception:
raise Exception("Failed to fetch data from metadata service")
11 changes: 3 additions & 8 deletions app/api/utils/rapid.py
Original file line number Diff line number Diff line change
Expand Up @@ -15,20 +15,15 @@ def get_assembly_accession_from_ncbi(accession_id: str):
f"{NCBI_DATASETS_URL}/genome/accession/{accession_id}/dataset_report"
)

with session.get(url=ncbi_dataset_api_url) as response:
with session.get(url=ncbi_dataset_api_url, timeout=10) as response:
response.raise_for_status()
response_json = response.json()
if response_json and response_json["reports"]:
return response_json["reports"][0]
else:
return None

except requests.exceptions.HTTPError as HTTPError:
logger.error(f"HTTPError: {HTTPError}")
raise HTTPError
except Exception as e:
logger.exception(e)
raise e
except Exception:
raise Exception("Failed to fetch data from NCBI")


def format_assembly_accession(species_url_name: str):
Expand Down