Skip to content

Commit 38026e3

Browse files
committed
use batch models/schemas in register function job rpc endpoints
1 parent 91fccb8 commit 38026e3

File tree

4 files changed

+41
-11
lines changed

4 files changed

+41
-11
lines changed

packages/models-library/src/models_library/batch_operations.py

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -85,3 +85,20 @@ class BatchGetEnvelope(BaseModel, Generic[ResourceT, IdentifierT]):
8585
description="List of identifiers for items that were not found",
8686
),
8787
] = DEFAULT_FACTORY
88+
89+
90+
class BatchCreateEnvelope(BaseModel, Generic[SchemaT]):
91+
"""Generic envelope model for batch-create operations.
92+
93+
This model represents the result of a strict batch create operation,
94+
containing the list of created items. The operation is expected to be "strict"
95+
in the sense that it either creates all requested items or fails entirely.
96+
"""
97+
98+
created_items: Annotated[
99+
list[SchemaT],
100+
Field(
101+
min_length=1,
102+
description="List of successfully created items",
103+
),
104+
]

packages/models-library/src/models_library/functions.py

Lines changed: 11 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@
77
from models_library import projects
88
from models_library.basic_regex import UUID_RE_BASE
99
from models_library.basic_types import ConstrainedStr
10+
from models_library.batch_operations import BatchCreateEnvelope
1011
from models_library.groups import GroupID
1112
from models_library.products import ProductName
1213
from models_library.services_types import ServiceKey, ServiceVersion
@@ -269,10 +270,12 @@ class RegisteredPythonCodeFunctionJob(PythonCodeFunctionJob, RegisteredFunctionJ
269270
| RegisteredSolverFunctionJob,
270271
Field(discriminator="function_class"),
271272
]
272-
RegisteredFunctionJobList: TypeAlias = Annotated[
273-
list[RegisteredFunctionJob],
274-
Field(max_length=_MAX_LIST_LENGTH, min_length=_MIN_LIST_LENGTH),
275-
]
273+
274+
275+
class BatchCreateRegisteredFunctionJobs(BatchCreateEnvelope[RegisteredFunctionJob]):
276+
"""Envelope model for batch registering function jobs"""
277+
278+
pass
276279

277280

278281
RegisteredFunctionJobPatch = Annotated[
@@ -373,6 +376,10 @@ class RegisteredFunctionJobDB(FunctionJobDB):
373376
created: datetime.datetime
374377

375378

379+
class BatchCreateRegisteredFunctionJobsDB(BatchCreateEnvelope[RegisteredFunctionJobDB]):
380+
pass
381+
382+
376383
class RegisteredFunctionJobWithStatusDB(FunctionJobDB):
377384
uuid: FunctionJobID
378385
created: datetime.datetime

services/web/server/src/simcore_service_webserver/functions/_function_jobs_repository.py

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@
66
import sqlalchemy
77
from aiohttp import web
88
from models_library.functions import (
9+
BatchCreateRegisteredFunctionJobsDB,
910
FunctionClass,
1011
FunctionClassSpecificData,
1112
FunctionID,
@@ -69,7 +70,7 @@ async def create_function_jobs( # noqa: PLR0913
6970
user_id: UserID,
7071
product_name: ProductName,
7172
function_jobs: list[FunctionJobDB],
72-
) -> list[RegisteredFunctionJobDB]:
73+
) -> BatchCreateRegisteredFunctionJobsDB:
7374
async with transaction_context(get_asyncpg_engine(app), connection) as transaction:
7475
await check_user_api_access_rights(
7576
app,
@@ -126,7 +127,7 @@ async def create_function_jobs( # noqa: PLR0913
126127
execute=True,
127128
)
128129

129-
return created_jobs
130+
return BatchCreateRegisteredFunctionJobsDB(created_items=created_jobs)
130131

131132

132133
async def patch_function_job(

services/web/server/src/simcore_service_webserver/functions/_functions_service.py

Lines changed: 10 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@
33
from aiohttp import web
44
from models_library.basic_types import IDStr
55
from models_library.functions import (
6+
BatchCreateRegisteredFunctionJobs,
67
Function,
78
FunctionClass,
89
FunctionClassSpecificData,
@@ -30,7 +31,6 @@
3031
RegisteredFunctionJob,
3132
RegisteredFunctionJobCollection,
3233
RegisteredFunctionJobDB,
33-
RegisteredFunctionJobList,
3434
RegisteredFunctionJobWithStatus,
3535
RegisteredFunctionJobWithStatusDB,
3636
RegisteredProjectFunction,
@@ -102,8 +102,9 @@ async def register_function_job(
102102
product_name=product_name,
103103
function_jobs=[encoded_function_jobs],
104104
)
105-
assert len(created_function_jobs_db) == 1 # nosec
106-
return _decode_functionjob(created_function_jobs_db[0])
105+
created_items = created_function_jobs_db.created_items
106+
assert len(created_items) == 1 # nosec
107+
return _decode_functionjob(created_items[0])
107108

108109

109110
async def register_function_job_batch(
@@ -112,7 +113,7 @@ async def register_function_job_batch(
112113
user_id: UserID,
113114
product_name: ProductName,
114115
function_jobs: FunctionJobList,
115-
) -> RegisteredFunctionJobList:
116+
) -> BatchCreateRegisteredFunctionJobs:
116117
TypeAdapter(FunctionJobList).validate_python(function_jobs)
117118
encoded_function_jobs = [_encode_functionjob(job) for job in function_jobs]
118119
created_function_jobs_db = await _function_jobs_repository.create_function_jobs(
@@ -121,7 +122,11 @@ async def register_function_job_batch(
121122
product_name=product_name,
122123
function_jobs=encoded_function_jobs,
123124
)
124-
return [_decode_functionjob(job) for job in created_function_jobs_db]
125+
return BatchCreateRegisteredFunctionJobs(
126+
created_items=[
127+
_decode_functionjob(job) for job in created_function_jobs_db.created_items
128+
]
129+
)
125130

126131

127132
async def patch_registered_function_job(

0 commit comments

Comments
 (0)