11from datetime import datetime , timezone
22from typing import Optional , Union
33
4- from sqlalchemy import and_ , case , delete , func , select , update , bindparam
4+ from sqlalchemy import and_ , case , delete , func , select , update , bindparam , or_
55from sqlalchemy .ext .asyncio import AsyncSession
66from sqlalchemy .sql .functions import coalesce
77
@@ -69,14 +69,21 @@ async def get_nodes(
6969 core_id : int | None = None ,
7070 offset : int | None = None ,
7171 limit : int | None = None ,
72+ ids : list [int ] | None = None ,
73+ search : str | None = None ,
7274) -> list [Node ]:
7375 """
74- Retrieves nodes based on optional status and enabled filters.
76+ Retrieves nodes based on optional status, enabled, id, and search filters.
7577
7678 Args:
7779 db (AsyncSession): The database session.
7880 status (Optional[Union[app.db.models.NodeStatus, list]]): The status or list of statuses to filter by.
7981 enabled (bool): If True, excludes disabled nodes.
82+ core_id (int | None): Optional core/backend ID filter.
83+ offset (int | None): Optional pagination offset.
84+ limit (int | None): Optional pagination limit.
85+ ids (list[int] | None): Optional list of node IDs to filter by.
86+ search (str | None): Optional search term to match node names.
8087
8188 Returns:
8289 List[Node]: A list of Node objects matching the criteria.
@@ -95,6 +102,15 @@ async def get_nodes(
95102 if core_id :
96103 query = query .where (Node .core_config_id == core_id )
97104
105+ if ids :
106+ query = query .where (Node .id .in_ (ids ))
107+
108+ if search :
109+ search_value = search .strip ()
110+ if search_value :
111+ like_expression = f"%{ search_value } %"
112+ query = query .where (or_ (Node .name .ilike (like_expression ), Node .api_key .ilike (like_expression )))
113+
98114 if offset :
99115 query = query .offset (offset )
100116 if limit :
0 commit comments