Skip to content
Merged
Show file tree
Hide file tree
Changes from 37 commits
Commits
Show all changes
51 commits
Select commit Hold shift + click to select a range
19bea51
feat: add readFunctions when getting permissions
giancarloromeo Jul 16, 2025
298bdd9
fix: update openapi-spec
giancarloromeo Jul 16, 2025
fa40d71
feat: add update endpoint
giancarloromeo Jul 17, 2025
9af987e
feat: add update functions endpoint
giancarloromeo Jul 17, 2025
27814d5
Merge branch 'master' into is1905/add-new-fuctions-rest-api-endpoints
giancarloromeo Jul 17, 2025
ee89ede
fix: update openapi-spec
giancarloromeo Jul 17, 2025
80535cc
fix: path
giancarloromeo Jul 17, 2025
a5f7066
feat: add batch get projects
giancarloromeo Jul 17, 2025
2d87133
fix: use new models
giancarloromeo Jul 17, 2025
14be903
feat: add list endpoint
giancarloromeo Jul 17, 2025
305b188
Merge branch 'master' into is1905/add-new-fuctions-rest-api-endpoints
giancarloromeo Jul 17, 2025
6043c7d
feat: get function
giancarloromeo Jul 17, 2025
7e67484
fix: minor
giancarloromeo Jul 17, 2025
2dc7497
Merge branch 'is1905/add-new-fuctions-rest-api-endpoints' of github.c…
giancarloromeo Jul 17, 2025
bcd0ff7
feat: add function list
giancarloromeo Jul 18, 2025
44ad1ce
fix: function listing
giancarloromeo Jul 18, 2025
4ce8271
fix: project id missing
giancarloromeo Jul 18, 2025
a65a99b
fix: list functions pagination
giancarloromeo Jul 18, 2025
e21a10b
fix: enable frontend
giancarloromeo Jul 18, 2025
e70e67e
fix: openapi spec
giancarloromeo Jul 18, 2025
3c46233
fix: add function ID
giancarloromeo Jul 18, 2025
d286654
fix: remap keys
giancarloromeo Jul 18, 2025
a29729b
fix: id key name
giancarloromeo Jul 18, 2025
fcedfc0
fix: remove unused uuid
giancarloromeo Jul 18, 2025
0c506ad
fix: template ID
giancarloromeo Jul 18, 2025
8cbf75e
fix: use template ID
giancarloromeo Jul 18, 2025
f06b3bf
feat: retrieve modified
giancarloromeo Jul 18, 2025
48f19af
feat: expose modified at
giancarloromeo Jul 18, 2025
0a969b5
fix: return proper templateId
giancarloromeo Jul 18, 2025
e8ca8bf
fix: typecheck
giancarloromeo Jul 18, 2025
4840afd
tests: add list functions
giancarloromeo Jul 21, 2025
a727158
tests: add function update
giancarloromeo Jul 21, 2025
edc8c2d
fix: typecheck
giancarloromeo Jul 21, 2025
b2a1898
fix: add modified_at field
giancarloromeo Jul 21, 2025
b57a590
fix: deprecated pydantic
giancarloromeo Jul 21, 2025
57010e5
fix: make openapi-spec
giancarloromeo Jul 21, 2025
f393d7c
Merge branch 'master' into is1905/add-new-fuctions-rest-api-endpoints
giancarloromeo Jul 21, 2025
606f2f7
fix: make openapi-spec
giancarloromeo Jul 21, 2025
a90ed58
Merge branch 'is1905/add-new-fuctions-rest-api-endpoints' of github.c…
giancarloromeo Jul 21, 2025
89571eb
fix: rename
giancarloromeo Jul 21, 2025
3c4e367
Merge branch 'master' into is1905/add-new-fuctions-rest-api-endpoints
giancarloromeo Jul 22, 2025
ebed70d
fix: use common create_json_response_from_page
giancarloromeo Jul 22, 2025
9d7fdbc
Merge branch 'is1905/add-new-fuctions-rest-api-endpoints' of github.c…
giancarloromeo Jul 22, 2025
d03ac59
fix: update field
giancarloromeo Jul 22, 2025
2bf2924
Merge branch 'master' into is1905/add-new-fuctions-rest-api-endpoints
giancarloromeo Jul 22, 2025
945f231
feat: add accessRights
giancarloromeo Jul 22, 2025
5e3f9f6
fix: rename field
giancarloromeo Jul 22, 2025
740c551
fix: make openapi-spec
giancarloromeo Jul 22, 2025
b900510
fix: order
giancarloromeo Jul 22, 2025
d440ad0
fix: access_rights not required
giancarloromeo Jul 22, 2025
38ebf35
fix: make openapi-spec
giancarloromeo Jul 22, 2025
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
24 changes: 24 additions & 0 deletions api/specs/web-server/_functions.py
Original file line number Diff line number Diff line change
Expand Up @@ -7,15 +7,19 @@

from typing import Annotated

from _common import as_query
from fastapi import APIRouter, Depends, status
from models_library.api_schemas_webserver.functions import (
FunctionToRegister,
RegisteredFunctionGet,
RegisteredFunctionUpdate,
)
from models_library.generics import Envelope
from simcore_service_webserver._meta import API_VTAG
from simcore_service_webserver.functions._controller._functions_rest_schemas import (
FunctionGetQueryParams,
FunctionPathParams,
FunctionsListQueryParams,
)

router = APIRouter(
Expand All @@ -35,12 +39,32 @@ async def register_function(
) -> Envelope[RegisteredFunctionGet]: ...


@router.get(
"/functions",
response_model=Envelope[list[RegisteredFunctionGet]],
)
async def list_functions(
_query: Annotated[as_query(FunctionsListQueryParams), Depends()],
): ...


@router.get(
"/functions/{function_id}",
response_model=Envelope[RegisteredFunctionGet],
)
async def get_function(
_path: Annotated[FunctionPathParams, Depends()],
_query: Annotated[as_query(FunctionGetQueryParams), Depends()],
): ...


@router.patch(
"/functions/{function_id}",
response_model=Envelope[RegisteredFunctionGet],
)
async def update_function(
_body: RegisteredFunctionUpdate,
_path: Annotated[FunctionPathParams, Depends()],
): ...


Expand Down
Original file line number Diff line number Diff line change
@@ -1,3 +1,4 @@
import datetime
from typing import Annotated, TypeAlias

from pydantic import Field
Expand All @@ -23,6 +24,7 @@
FunctionOutputs,
FunctionOutputSchema,
FunctionSchemaClass,
FunctionUpdate,
JSONFunctionInputSchema,
JSONFunctionOutputSchema,
ProjectFunction,
Expand All @@ -46,6 +48,7 @@
UnsupportedFunctionClassError,
UnsupportedFunctionFunctionJobClassCombinationError,
)
from ..projects import ProjectID
from ._base import InputSchema, OutputSchema

__all__ = [
Expand Down Expand Up @@ -113,7 +116,13 @@
class RegisteredSolverFunctionGet(RegisteredSolverFunction, OutputSchema): ...


class RegisteredProjectFunctionGet(RegisteredProjectFunction, OutputSchema): ...
class RegisteredProjectFunctionGet(RegisteredProjectFunction, OutputSchema):
uid: Annotated[FunctionID, Field(alias="uuid")]
title: Annotated[str, Field(alias="name")] = ""
project_id: Annotated[ProjectID, Field(alias="templateId")]
created_at: Annotated[datetime.datetime, Field(alias="creationDate")]
modified_at: Annotated[datetime.datetime, Field(alias="lastChangeDate")]
thumbnail: str | None = None


class SolverFunctionToRegister(SolverFunction, InputSchema): ...
Expand All @@ -131,3 +140,6 @@ class ProjectFunctionToRegister(ProjectFunction, InputSchema): ...
RegisteredProjectFunctionGet | RegisteredSolverFunctionGet,
Field(discriminator="function_class"),
]


class RegisteredFunctionUpdate(FunctionUpdate, InputSchema): ...
Original file line number Diff line number Diff line change
Expand Up @@ -386,4 +386,5 @@ def from_domain_model(cls, permission: UserPermission) -> Self:


class MyFunctionPermissionsGet(OutputSchema):
read_functions: bool
write_functions: bool
7 changes: 7 additions & 0 deletions packages/models-library/src/models_library/functions.py
Original file line number Diff line number Diff line change
Expand Up @@ -99,6 +99,12 @@ class FunctionBase(BaseModel):
class RegisteredFunctionBase(FunctionBase):
uid: FunctionID
created_at: datetime.datetime
modified_at: datetime.datetime


class FunctionUpdate(BaseModel):
title: str | None = None
description: str | None = None


class ProjectFunction(FunctionBase):
Expand Down Expand Up @@ -250,6 +256,7 @@ class FunctionDB(BaseModel):
class RegisteredFunctionDB(FunctionDB):
uuid: FunctionID
created: datetime.datetime
modified: datetime.datetime


class FunctionJobCollectionDB(BaseModel):
Expand Down
22 changes: 12 additions & 10 deletions services/api-server/tests/unit/api_functions/conftest.py
Original file line number Diff line number Diff line change
Expand Up @@ -127,9 +127,10 @@ def mock_function(
def mock_registered_project_function(mock_function: Function) -> RegisteredFunction:
return RegisteredProjectFunction(
**{
**mock_function.dict(),
"uid": str(uuid4()),
**mock_function.model_dump(),
"uid": f"{uuid4()}",
"created_at": datetime.datetime.now(datetime.UTC),
"modified_at": datetime.datetime.now(datetime.UTC),
}
)

Expand All @@ -148,8 +149,9 @@ def mock_registered_solver_function(
"input_schema": sample_input_schema,
"output_schema": sample_output_schema,
"default_inputs": None,
"uid": str(uuid4()),
"uid": f"{uuid4()}",
"created_at": datetime.datetime.now(datetime.UTC),
"modified_at": datetime.datetime.now(datetime.UTC),
"solver_key": "simcore/services/comp/ans-model",
"solver_version": "1.0.1",
}
Expand All @@ -166,7 +168,7 @@ def mock_project_function_job(
"description": "A test function job",
"inputs": {"key": "value"},
"outputs": None,
"project_job_id": str(uuid4()),
"project_job_id": f"{uuid4()}",
"function_class": FunctionClass.PROJECT,
}
return ProjectFunctionJob(**mock_function_job)
Expand All @@ -178,8 +180,8 @@ def mock_registered_project_function_job(
) -> RegisteredFunctionJob:
return RegisteredProjectFunctionJob(
**{
**mock_project_function_job.dict(),
"uid": str(uuid4()),
**mock_project_function_job.model_dump(),
"uid": f"{uuid4()}",
"created_at": datetime.datetime.now(datetime.UTC),
}
)
Expand All @@ -206,8 +208,8 @@ def mock_registered_solver_function_job(
) -> RegisteredFunctionJob:
return RegisteredSolverFunctionJob(
**{
**mock_solver_function_job.dict(),
"uid": str(uuid4()),
**mock_solver_function_job.model_dump(),
"uid": f"{uuid4()}",
"created_at": datetime.datetime.now(datetime.UTC),
}
)
Expand All @@ -222,7 +224,7 @@ def mock_function_job_collection(
"description": "A test function job collection",
"function_uid": mock_registered_project_function_job.function_uid,
"function_class": FunctionClass.PROJECT,
"project_id": str(uuid4()),
"project_id": f"{uuid4()}",
"function_job_ids": [
mock_registered_project_function_job.uid for _ in range(5)
],
Expand All @@ -237,7 +239,7 @@ def mock_registered_function_job_collection(
return RegisteredFunctionJobCollection(
**{
**mock_function_job_collection.model_dump(),
"uid": str(uuid4()),
"uid": f"{uuid4()}",
"created_at": datetime.datetime.now(datetime.UTC),
}
)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -631,6 +631,14 @@ qx.Class.define("osparc.data.Resources", {
create: {
method: "POST",
url: statics.API + "/functions"
},
getOne: {
method: "GET",
url: statics.API + "/functions/{functionId}?include_extras=true"
},
getPage: {
method: "GET",
url: statics.API + "/functions?include_extras=true"
}
}
},
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -92,7 +92,7 @@ qx.Class.define("osparc.store.Functions", {
},

fetchFunctionsPaginated: function(params, options) {
const isBackendReady = false;
const isBackendReady = true;
if (!isBackendReady) {
return new Promise(resolve => {
const response = this.__dummyResponse();
Expand All @@ -110,7 +110,7 @@ qx.Class.define("osparc.store.Functions", {
},

fetchFunction: function(functionId) {
const isBackendReady = false;
const isBackendReady = true;
if (!isBackendReady) {
return new Promise(resolve => {
const response = this.__dummyResponse();
Expand Down
Loading
Loading