diff --git a/chain_service/controllers/chain.py b/chain_service/controllers/chain.py index 942596b..a7e5d17 100644 --- a/chain_service/controllers/chain.py +++ b/chain_service/controllers/chain.py @@ -34,3 +34,20 @@ async def chain_list_controller(chain_repository: ChainRepositoryDependency): except Exception: logger.exception(f"Error during chain list") return HTTPException(status_code=500, detail="Error during chain list") + + +@router.get("/{chain_id}") +async def chain_get_controller( + chain_id: str, chain_repository: ChainRepositoryDependency +): + try: + assert (chain := await chain_repository.get_by_id(chain_id)) + return chain + + except AssertionError: + logger.info(f"Chain not found {chain_id}") + return HTTPException(status_code=404, detail="Chain not found") + + except Exception: + logger.exception("Error during chain get") + return HTTPException(status_code=500, detail="Error during chain get") diff --git a/chain_service/repositories/chain.py b/chain_service/repositories/chain.py index 1512ecc..6218337 100644 --- a/chain_service/repositories/chain.py +++ b/chain_service/repositories/chain.py @@ -1,4 +1,5 @@ import pymongo +from uuid import UUID from typing import List from pydantic import TypeAdapter @@ -21,3 +22,8 @@ class ChainRepository: sort_order = [("last_modified", pymongo.DESCENDING)] chains = [chain async for chain in self.collection.find().sort(sort_order)] return TypeAdapter(List[Chain]).validate_python(chains) + + async def get_by_id(self, chain_id: str) -> Chain | None: + query = {"_id": UUID(chain_id)} + chain = await self.collection.find_one(query) + return Chain.model_validate(chain) if chain else None