Skip to content

Commit 1da768b

Browse files
fix
1 parent 4476cac commit 1da768b

File tree

4 files changed

+52
-3
lines changed

4 files changed

+52
-3
lines changed

packages/postgres-database/src/simcore_postgres_database/models/comp_runs_collections.py

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -35,4 +35,7 @@
3535
"ix_comp_runs_collections_client_or_system_generated_id",
3636
"client_or_system_generated_id",
3737
),
38+
sa.UniqueConstraint(
39+
"client_or_system_generated_id", name="client_or_system_generated_id_uniqueness"
40+
),
3841
)

services/web/server/src/simcore_service_webserver/director_v2/_comp_runs_collections_repository.py

Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@
55
from pydantic import TypeAdapter
66
from simcore_postgres_database.models.comp_runs_collections import comp_runs_collections
77
from sqlalchemy import func
8+
from sqlalchemy.dialects.postgresql import insert as pg_insert
89

910
from ._comp_runs_collections_models import CompRunCollectionDBGet
1011

@@ -63,3 +64,32 @@ async def get_comp_run_collection_or_none_by_client_generated_id(
6364
if row is None:
6465
return None
6566
return CompRunCollectionDBGet.model_validate(row)
67+
68+
69+
async def upsert_comp_run_collection(
70+
conn,
71+
client_or_system_generated_id: str,
72+
client_or_system_generated_display_name: str,
73+
is_generated_by_system: bool,
74+
) -> CollectionRunID:
75+
"""Upsert a computational run collection. If it exists, only update the modified time."""
76+
insert_stmt = pg_insert(comp_runs_collections).values(
77+
client_or_system_generated_id=client_or_system_generated_id,
78+
client_or_system_generated_display_name=client_or_system_generated_display_name,
79+
is_generated_by_system=is_generated_by_system,
80+
created=func.now(),
81+
modified=func.now(),
82+
)
83+
on_update_stmt = insert_stmt.on_conflict_do_update(
84+
index_elements=[
85+
comp_runs_collections.c.client_or_system_generated_display_name
86+
],
87+
set_={
88+
"modified": func.now(),
89+
},
90+
)
91+
result = await conn.stream(
92+
on_update_stmt.returning(comp_runs_collections.c.collection_run_id)
93+
)
94+
collection_id_tuple: tuple[UUID] = result.one()
95+
return TypeAdapter(CollectionRunID).validate_python(collection_id_tuple[0])

services/web/server/src/simcore_service_webserver/director_v2/_comp_runs_collections_service.py

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -27,6 +27,22 @@ async def create_comp_run_collection(
2727
)
2828

2929

30+
async def upsert_comp_run_collection(
31+
app: web.Application,
32+
*,
33+
client_or_system_generated_id: str,
34+
client_or_system_generated_display_name: str,
35+
is_generated_by_system: bool,
36+
) -> CollectionRunID:
37+
async with transaction_context(get_asyncpg_engine(app)) as conn:
38+
return await _comp_runs_collections_repository.upsert_comp_run_collection(
39+
conn=conn,
40+
client_or_system_generated_id=client_or_system_generated_id,
41+
client_or_system_generated_display_name=client_or_system_generated_display_name,
42+
is_generated_by_system=is_generated_by_system,
43+
)
44+
45+
3046
async def get_comp_run_collection_or_none_by_id(
3147
app: web.Application, *, collection_run_id: CollectionRunID
3248
) -> CompRunCollectionDBGet | None:

services/web/server/src/simcore_service_webserver/director_v2/_controller/rest.py

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -88,7 +88,7 @@ async def start_computation(request: web.Request) -> web.Response:
8888
comp_run_collection: CompRunCollectionDBGet | None = None
8989
if group_id_or_none:
9090
comp_run_collection = await _comp_runs_collections_service.get_comp_run_collection_or_none_by_client_generated_id(
91-
request.app, client_or_system_generated_id=group_id_or_none # type: ignore
91+
request.app, client_or_system_generated_id=str(group_id_or_none)
9292
)
9393
if comp_run_collection is not None:
9494
created_at: datetime = comp_run_collection.created
@@ -111,10 +111,10 @@ async def start_computation(request: web.Request) -> web.Response:
111111
client_or_system_generated_id = f"{group_id_or_none}"
112112
group_name = custom_metadata.get("group_name", "No Group Name")
113113

114-
collection_run_id = await _comp_runs_collections_service.create_comp_run_collection(
114+
collection_run_id = await _comp_runs_collections_service.upsert_comp_run_collection(
115115
request.app,
116116
client_or_system_generated_id=client_or_system_generated_id,
117-
client_or_system_generated_display_name=group_name, # type: ignore
117+
client_or_system_generated_display_name=str(group_name),
118118
is_generated_by_system=is_generated_by_system,
119119
)
120120

0 commit comments

Comments
 (0)