Skip to content

Commit 044edc5

Browse files
fix: repo
1 parent bfa1685 commit 044edc5

File tree

1 file changed

+30
-29
lines changed
  • services/director-v2/src/simcore_service_director_v2/modules/db/repositories

1 file changed

+30
-29
lines changed

services/director-v2/src/simcore_service_director_v2/modules/db/repositories/projects.py

Lines changed: 30 additions & 29 deletions
Original file line numberDiff line numberDiff line change
@@ -2,9 +2,11 @@
22

33
import sqlalchemy as sa
44
from models_library.projects import ProjectAtDB, ProjectID
5-
from models_library.projects_nodes import Node
65
from models_library.projects_nodes_io import NodeID
7-
from simcore_postgres_database.utils_projects_nodes import ProjectNode, ProjectNodesRepo
6+
from simcore_postgres_database.utils_projects_nodes import (
7+
ProjectNodesRepo,
8+
make_workbench_subquery,
9+
)
810
from simcore_postgres_database.utils_repos import pass_or_acquire_connection
911

1012
from ....core.errors import ProjectNotFoundError
@@ -14,48 +16,47 @@
1416
logger = logging.getLogger(__name__)
1517

1618

17-
def _project_node_to_node(project_node: ProjectNode) -> Node:
18-
"""Converts a ProjectNode from the database to a Node model for the API.
19-
20-
Handles field mapping and excludes database-specific fields that are not
21-
part of the Node model.
22-
"""
23-
node_data = project_node.model_dump_as_node()
24-
return Node.model_validate(node_data)
25-
26-
2719
class ProjectsRepository(BaseRepository):
2820
async def get_project(self, project_id: ProjectID) -> ProjectAtDB:
21+
workbench_subquery = make_workbench_subquery()
22+
2923
async with self.db_engine.connect() as conn:
30-
row = (
31-
await conn.execute(
32-
sa.select(projects).where(projects.c.uuid == str(project_id))
24+
query = (
25+
sa.select(
26+
projects,
27+
sa.func.coalesce(
28+
workbench_subquery.c.workbench, sa.text("'{}'::json")
29+
).label("workbench"),
30+
)
31+
.select_from(
32+
projects.outerjoin(
33+
workbench_subquery,
34+
projects.c.uuid == workbench_subquery.c.project_uuid,
35+
)
3336
)
34-
).one_or_none()
37+
.where(projects.c.uuid == str(project_id))
38+
)
39+
result = await conn.execute(query)
40+
row = result.one_or_none()
3541
if not row:
3642
raise ProjectNotFoundError(project_id=project_id)
37-
38-
repo = ProjectNodesRepo(project_uuid=project_id)
39-
nodes = await repo.list(conn)
40-
41-
project_workbench = {
42-
f"{node.node_id}": _project_node_to_node(node) for node in nodes
43-
}
44-
data = {**row._asdict(), "workbench": project_workbench}
45-
return ProjectAtDB.model_validate(data)
43+
return ProjectAtDB.model_validate(row)
4644

4745
async def is_node_present_in_workbench(
4846
self, project_id: ProjectID, node_uuid: NodeID
4947
) -> bool:
5048
async with pass_or_acquire_connection(self.db_engine) as conn:
51-
result = await conn.execute(
52-
sa.select(projects_nodes.c.project_node_id).where(
49+
stmt = (
50+
sa.select(sa.literal(1))
51+
.where(
5352
projects_nodes.c.project_uuid == str(project_id),
5453
projects_nodes.c.node_id == str(node_uuid),
5554
)
55+
.limit(1)
5656
)
57-
project_node = result.one_or_none()
58-
return project_node is not None
57+
58+
result = await conn.execute(stmt)
59+
return result.scalar_one_or_none() is not None
5960

6061
async def get_project_id_from_node(self, node_id: NodeID) -> ProjectID:
6162
async with self.db_engine.connect() as conn:

0 commit comments

Comments
 (0)