11import logging
22
3+ import sqlalchemy as sa
4+
35from aiohttp import web
46from models_library .projects import ProjectID
5- from models_library .projects_nodes import PartialNode
7+ from models_library .projects_nodes import Node , PartialNode
68from models_library .projects_nodes_io import NodeID
79from simcore_postgres_database .utils_repos import transaction_context
810from simcore_postgres_database .webserver_models import projects_nodes
911from sqlalchemy .ext .asyncio import AsyncConnection
1012
13+ from .exceptions import NodeNotFoundError
1114from ..db .plugin import get_asyncpg_engine
1215
1316_logger = logging .getLogger (__name__ )
1417
1518
19+ _SELECTION_PROJECTS_NODES_DB_ARGS = [
20+ projects_nodes .c .id ,
21+ projects_nodes .c .key ,
22+ projects_nodes .c .version ,
23+ projects_nodes .c .label ,
24+ projects_nodes .c .thumbnail ,
25+ projects_nodes .c .inputs ,
26+ projects_nodes .c .outputs ,
27+ ]
28+
29+
30+ async def get (
31+ app : web .Application ,
32+ connection : AsyncConnection | None = None ,
33+ * ,
34+ project_id : ProjectID ,
35+ node_id : NodeID ,
36+ ) -> Node :
37+ async with transaction_context (get_asyncpg_engine (app ), connection ) as conn :
38+ get_stmt = sa .select (
39+ * _SELECTION_PROJECTS_NODES_DB_ARGS
40+ ).where (
41+ (projects_nodes .c .project_uuid == f"{ project_id } " )
42+ & (projects_nodes .c .node_id == f"{ node_id } " )
43+ )
44+
45+ result = await conn .stream (get_stmt )
46+ assert result # nosec
47+
48+ row = await result .first ()
49+ if row is None :
50+ raise NodeNotFoundError (
51+ project_uuid = f"{ project_id } " ,
52+ node_uuid = f"{ node_id } "
53+ )
54+ assert row # nosec
55+ return Node .model_validate (row , from_attributes = True )
56+
57+
1658async def update (
1759 app : web .Application ,
1860 connection : AsyncConnection | None = None ,
@@ -22,6 +64,7 @@ async def update(
2264 partial_node : PartialNode ,
2365) -> None :
2466 values = partial_node .model_dump (mode = "json" , exclude_unset = True )
67+
2568 async with transaction_context (get_asyncpg_engine (app ), connection ) as conn :
2669 await conn .stream (
2770 projects_nodes .update ()
0 commit comments