|
17 | 17 | import logging |
18 | 18 | from typing import Annotated |
19 | 19 |
|
20 | | -from fastapi import APIRouter, Request, responses, Query, HTTPException |
| 20 | +from fastapi import APIRouter, Request, responses, Query, Path |
21 | 21 | from pydantic import ValidationError |
22 | 22 |
|
23 | 23 | from api.error_response import response_error_handler |
24 | 24 | from api.models.checksums import Checksum |
25 | 25 | from api.models.statistics import GenomeStatistics, ExampleObjectList |
26 | 26 | from api.models.popular_species import PopularSpeciesGroup |
27 | 27 | from api.models.karyotype import Karyotype |
28 | | -from api.models.genome import BriefGenomeDetails, GenomeDetails, DatasetAttributes, GenomeByKeyword, Release |
| 28 | +from api.models.genome import BriefGenomeDetails, GenomeDetails, DatasetAttributes, GenomeByKeyword, Release, \ |
| 29 | + GenomeGroupsResponse, GenomesInGroupResponse |
29 | 30 | from api.models.ftplinks import FTPLinks |
30 | 31 | from api.models.vep import VepFilePaths |
31 | 32 |
|
@@ -347,3 +348,57 @@ async def get_releases( |
347 | 348 | response_data = responses.JSONResponse(error_response, status_code=500) |
348 | 349 |
|
349 | 350 | return response_data |
| 351 | + |
| 352 | +@router.get("/genome_groups", name="genome_groups") |
| 353 | +@redis_cache("genome_groups", arg_keys=["group_type", "release_label"]) |
| 354 | +async def get_genome_groups( |
| 355 | + group_type: str = Query(..., description="Group type, e.g. 'structural_variant'"), |
| 356 | + release_label: str | None = Query(None, description="Optional release label, e.g. '2025-02'") |
| 357 | +): |
| 358 | + try: |
| 359 | + genome_groups_dict = MessageToDict( |
| 360 | + grpc_client.get_genome_groups_with_reference( |
| 361 | + group_type=group_type, |
| 362 | + release_label=release_label |
| 363 | + ) |
| 364 | + ) |
| 365 | + logging.debug(f"genome_groups_dict: {genome_groups_dict}") |
| 366 | + if len(genome_groups_dict.get("genomeGroups", [])) == 0: |
| 367 | + return response_error_handler({ |
| 368 | + "status": 404, |
| 369 | + "details": "No genome groups found matching criteria" |
| 370 | + }) |
| 371 | + |
| 372 | + genome_groups = GenomeGroupsResponse(**genome_groups_dict) |
| 373 | + response_dict = genome_groups.model_dump() |
| 374 | + return responses.JSONResponse(response_dict, status_code=200) |
| 375 | + except Exception as ex: |
| 376 | + logging.exception("Error in get_genome_groups") |
| 377 | + return response_error_handler({"status": 500}) |
| 378 | + |
| 379 | +@router.get("/genome_groups/{group_id}/genomes", name="genomes_in_group") |
| 380 | +@redis_cache("genomes_in_group", arg_keys=["group_id", "release_label"]) |
| 381 | +async def get_genomes_in_group( |
| 382 | + group_id: str = Path(..., description="Group ID, e.g. 'grch38-group'"), |
| 383 | + release_label: str | None = Query(None, description="Optional release label, e.g. '2025-02'") |
| 384 | +): |
| 385 | + try: |
| 386 | + genomes_in_group_dict = MessageToDict( |
| 387 | + grpc_client.get_genomes_in_group( |
| 388 | + group_id=group_id, |
| 389 | + release_label=release_label |
| 390 | + ) |
| 391 | + ) |
| 392 | + logging.debug(f"genomes_in_group_dict: {genomes_in_group_dict}") |
| 393 | + if len(genomes_in_group_dict.get("genomes", [])) == 0: |
| 394 | + return response_error_handler({ |
| 395 | + "status": 404, |
| 396 | + "details": "No genomes found in specified group" |
| 397 | + }) |
| 398 | + |
| 399 | + genomes_in_group = GenomesInGroupResponse(**genomes_in_group_dict) |
| 400 | + response_dict = genomes_in_group.model_dump() |
| 401 | + return responses.JSONResponse(response_dict, status_code=200) |
| 402 | + except Exception as ex: |
| 403 | + logging.exception("Error in get_genomes_in_group") |
| 404 | + return response_error_handler({"status": 500}) |
0 commit comments