From dcfcad25765306a7bf1d5859b26245f97acc38d8 Mon Sep 17 00:00:00 2001 From: Pedro Crespo-Valero <32402063+pcrespov@users.noreply.github.com> Date: Fri, 21 Mar 2025 14:20:21 +0100 Subject: [PATCH 01/39] rest handlers --- api/specs/web-server/_projects_comments.py | 19 +++----- api/specs/web-server/_projects_folders.py | 7 ++- api/specs/web-server/_projects_groups.py | 16 +++---- api/specs/web-server/_projects_metadata.py | 10 ++-- api/specs/web-server/_projects_nodes.py | 2 +- .../_projects_nodes_pricing_unit.py | 12 ++--- api/specs/web-server/_projects_ports.py | 2 +- api/specs/web-server/_projects_wallet.py | 13 ++--- api/specs/web-server/_projects_workspaces.py | 7 ++- ...comments_handlers.py => _comments_rest.py} | 4 +- .../projects/_controller/__init__.py | 0 ...{_folders_handlers.py => _folders_rest.py} | 0 .../{_groups_handlers.py => _groups_rest.py} | 18 ++++--- ...metadata_handlers.py => _metadata_rest.py} | 0 .../{_nodes_handlers.py => _nodes_rest.py} | 2 +- .../{_ports_handlers.py => _ports_rest.py} | 8 ++-- ...y => _projects_nodes_pricing_unit_rest.py} | 9 ++-- .../{_tags_handlers.py => _tags_rest.py} | 4 +- ...{_wallets_handlers.py => _wallets_rest.py} | 4 +- ...spaces_handlers.py => _workspaces_rest.py} | 0 .../projects/plugin.py | 47 ++++++++++--------- .../02/test_projects_nodes_handler.py | 2 +- 22 files changed, 80 insertions(+), 106 deletions(-) rename services/web/server/src/simcore_service_webserver/projects/{_comments_handlers.py => _comments_rest.py} (99%) create mode 100644 services/web/server/src/simcore_service_webserver/projects/_controller/__init__.py rename services/web/server/src/simcore_service_webserver/projects/{_folders_handlers.py => _folders_rest.py} (100%) rename services/web/server/src/simcore_service_webserver/projects/{_groups_handlers.py => _groups_rest.py} (92%) rename services/web/server/src/simcore_service_webserver/projects/{_metadata_handlers.py => _metadata_rest.py} (100%) rename services/web/server/src/simcore_service_webserver/projects/{_nodes_handlers.py => _nodes_rest.py} (99%) rename services/web/server/src/simcore_service_webserver/projects/{_ports_handlers.py => _ports_rest.py} (97%) rename services/web/server/src/simcore_service_webserver/projects/{_projects_nodes_pricing_unit_handlers.py => _projects_nodes_pricing_unit_rest.py} (96%) rename services/web/server/src/simcore_service_webserver/projects/{_tags_handlers.py => _tags_rest.py} (96%) rename services/web/server/src/simcore_service_webserver/projects/{_wallets_handlers.py => _wallets_rest.py} (98%) rename services/web/server/src/simcore_service_webserver/projects/{_workspaces_handlers.py => _workspaces_rest.py} (100%) diff --git a/api/specs/web-server/_projects_comments.py b/api/specs/web-server/_projects_comments.py index 614464a900f..b4ca252c46f 100644 --- a/api/specs/web-server/_projects_comments.py +++ b/api/specs/web-server/_projects_comments.py @@ -1,4 +1,4 @@ -""" Helper script to automatically generate OAS +"""Helper script to automatically generate OAS This OAS are the source of truth """ @@ -17,7 +17,7 @@ from models_library.projects_comments import CommentID, ProjectsCommentsAPI from pydantic import NonNegativeInt from simcore_service_webserver._meta import API_VTAG -from simcore_service_webserver.projects._comments_handlers import ( +from simcore_service_webserver.projects._comments_rest import ( _ProjectCommentsBodyParams, _ProjectCommentsPathParams, _ProjectCommentsWithCommentPathParams, @@ -45,8 +45,7 @@ ) async def create_project_comment( project_uuid: ProjectID, body: _ProjectCommentsBodyParams -): - ... +): ... assert_handler_signature_against_model( @@ -61,8 +60,7 @@ async def create_project_comment( ) async def list_project_comments( project_uuid: ProjectID, limit: int = 20, offset: NonNegativeInt = 0 -): - ... +): ... assert_handler_signature_against_model( @@ -79,8 +77,7 @@ async def update_project_comment( project_uuid: ProjectID, comment_id: CommentID, body: _ProjectCommentsBodyParams, -): - ... +): ... assert_handler_signature_against_model( @@ -93,8 +90,7 @@ async def update_project_comment( description="Delete a specific comment associated with a project.", status_code=204, ) -async def delete_project_comment(project_uuid: ProjectID, comment_id: CommentID): - ... +async def delete_project_comment(project_uuid: ProjectID, comment_id: CommentID): ... assert_handler_signature_against_model( @@ -107,8 +103,7 @@ async def delete_project_comment(project_uuid: ProjectID, comment_id: CommentID) response_model=Envelope[ProjectsCommentsAPI], description="Retrieve a specific comment by its ID within a project.", ) -async def get_project_comment(project_uuid: ProjectID, comment_id: CommentID): - ... +async def get_project_comment(project_uuid: ProjectID, comment_id: CommentID): ... assert_handler_signature_against_model( diff --git a/api/specs/web-server/_projects_folders.py b/api/specs/web-server/_projects_folders.py index 125c6977cb3..cc6a7900c7d 100644 --- a/api/specs/web-server/_projects_folders.py +++ b/api/specs/web-server/_projects_folders.py @@ -1,4 +1,4 @@ -""" Helper script to automatically generate OAS +"""Helper script to automatically generate OAS This OAS are the source of truth """ @@ -13,7 +13,7 @@ from fastapi import APIRouter, Depends, status from simcore_service_webserver._meta import API_VTAG -from simcore_service_webserver.projects._folders_handlers import ( +from simcore_service_webserver.projects._folders_rest import ( _ProjectsFoldersPathParams, ) @@ -30,5 +30,4 @@ ) async def replace_project_folder( _path: Annotated[_ProjectsFoldersPathParams, Depends()], -): - ... +): ... diff --git a/api/specs/web-server/_projects_groups.py b/api/specs/web-server/_projects_groups.py index cfc0870d6a8..687d17a327a 100644 --- a/api/specs/web-server/_projects_groups.py +++ b/api/specs/web-server/_projects_groups.py @@ -11,7 +11,7 @@ from simcore_service_webserver._meta import API_VTAG from simcore_service_webserver.projects._common.models import ProjectPathParams from simcore_service_webserver.projects._groups_api import ProjectGroupGet -from simcore_service_webserver.projects._groups_handlers import ( +from simcore_service_webserver.projects._groups_rest import ( _ProjectsGroupsBodyParams, _ProjectsGroupsPathParams, ) @@ -30,16 +30,14 @@ async def create_project_group( _path: Annotated[_ProjectsGroupsPathParams, Depends()], _body: _ProjectsGroupsBodyParams, -): - ... +): ... @router.get( "/projects/{project_id}/groups", response_model=Envelope[list[ProjectGroupGet]], ) -async def list_project_groups(_path: Annotated[ProjectPathParams, Depends()]): - ... +async def list_project_groups(_path: Annotated[ProjectPathParams, Depends()]): ... @router.put( @@ -49,13 +47,13 @@ async def list_project_groups(_path: Annotated[ProjectPathParams, Depends()]): async def replace_project_group( _path: Annotated[_ProjectsGroupsPathParams, Depends()], _body: _ProjectsGroupsBodyParams, -): - ... +): ... @router.delete( "/projects/{project_id}/groups/{group_id}", status_code=status.HTTP_204_NO_CONTENT, ) -async def delete_project_group(_path: Annotated[_ProjectsGroupsPathParams, Depends()]): - ... +async def delete_project_group( + _path: Annotated[_ProjectsGroupsPathParams, Depends()], +): ... diff --git a/api/specs/web-server/_projects_metadata.py b/api/specs/web-server/_projects_metadata.py index ef6e429d7dd..6f4b093d092 100644 --- a/api/specs/web-server/_projects_metadata.py +++ b/api/specs/web-server/_projects_metadata.py @@ -1,4 +1,4 @@ -""" Helper script to automatically generate OAS +"""Helper script to automatically generate OAS This OAS are the source of truth """ @@ -18,7 +18,7 @@ ) from models_library.generics import Envelope from simcore_service_webserver._meta import API_VTAG -from simcore_service_webserver.projects._metadata_handlers import ProjectPathParams +from simcore_service_webserver.projects._metadata_rest import ProjectPathParams router = APIRouter(prefix=f"/{API_VTAG}", tags=["projects", "metadata"]) @@ -33,8 +33,7 @@ response_model=Envelope[ProjectMetadataGet], status_code=status.HTTP_200_OK, ) -async def get_project_metadata(_params: Annotated[ProjectPathParams, Depends()]): - ... +async def get_project_metadata(_params: Annotated[ProjectPathParams, Depends()]): ... @router.patch( @@ -44,5 +43,4 @@ async def get_project_metadata(_params: Annotated[ProjectPathParams, Depends()]) ) async def update_project_metadata( _params: Annotated[ProjectPathParams, Depends()], _body: ProjectMetadataUpdate -): - ... +): ... diff --git a/api/specs/web-server/_projects_nodes.py b/api/specs/web-server/_projects_nodes.py index 61650993ab7..58a06061afe 100644 --- a/api/specs/web-server/_projects_nodes.py +++ b/api/specs/web-server/_projects_nodes.py @@ -27,7 +27,7 @@ from models_library.projects_nodes_io import NodeID from simcore_service_webserver._meta import API_VTAG from simcore_service_webserver.projects._crud_handlers import ProjectPathParams -from simcore_service_webserver.projects._nodes_handlers import ( +from simcore_service_webserver.projects._nodes_rest import ( NodePathParams, _ProjectGroupAccess, _ProjectNodePreview, diff --git a/api/specs/web-server/_projects_nodes_pricing_unit.py b/api/specs/web-server/_projects_nodes_pricing_unit.py index 41da2f2a629..b5184dca94c 100644 --- a/api/specs/web-server/_projects_nodes_pricing_unit.py +++ b/api/specs/web-server/_projects_nodes_pricing_unit.py @@ -1,4 +1,4 @@ -""" Helper script to automatically generate OAS +"""Helper script to automatically generate OAS This OAS are the source of truth """ @@ -17,8 +17,8 @@ from models_library.projects_nodes_io import NodeID from models_library.resource_tracker import PricingPlanId, PricingUnitId from simcore_service_webserver._meta import API_VTAG -from simcore_service_webserver.projects._nodes_handlers import NodePathParams -from simcore_service_webserver.projects._projects_nodes_pricing_unit_handlers import ( +from simcore_service_webserver.projects._nodes_rest import NodePathParams +from simcore_service_webserver.projects._projects_nodes_pricing_unit_rest import ( _ProjectNodePricingUnitPathParams, ) @@ -35,8 +35,7 @@ response_model=Envelope[PricingUnitGet | None], description="Get currently connected pricing unit to the project node.", ) -async def get_project_node_pricing_unit(project_id: ProjectID, node_id: NodeID): - ... +async def get_project_node_pricing_unit(project_id: ProjectID, node_id: NodeID): ... assert_handler_signature_against_model(get_project_node_pricing_unit, NodePathParams) @@ -52,8 +51,7 @@ async def connect_pricing_unit_to_project_node( node_id: NodeID, pricing_plan_id: PricingPlanId, pricing_unit_id: PricingUnitId, -): - ... +): ... assert_handler_signature_against_model( diff --git a/api/specs/web-server/_projects_ports.py b/api/specs/web-server/_projects_ports.py index f7a98e53e59..c13a2ea60ad 100644 --- a/api/specs/web-server/_projects_ports.py +++ b/api/specs/web-server/_projects_ports.py @@ -9,7 +9,7 @@ from models_library.projects import ProjectID from models_library.projects_nodes import NodeID from simcore_service_webserver._meta import API_VTAG -from simcore_service_webserver.projects._ports_handlers import ( +from simcore_service_webserver.projects._ports_rest import ( ProjectInputGet, ProjectInputUpdate, ProjectMetadataPortGet, diff --git a/api/specs/web-server/_projects_wallet.py b/api/specs/web-server/_projects_wallet.py index ec6c4c0bc2f..c797de67c61 100644 --- a/api/specs/web-server/_projects_wallet.py +++ b/api/specs/web-server/_projects_wallet.py @@ -1,4 +1,4 @@ -""" Helper script to automatically generate OAS +"""Helper script to automatically generate OAS This OAS are the source of truth """ @@ -18,7 +18,7 @@ from models_library.wallets import WalletID from simcore_service_webserver._meta import API_VTAG from simcore_service_webserver.projects._common.models import ProjectPathParams -from simcore_service_webserver.projects._wallets_handlers import ( +from simcore_service_webserver.projects._wallets_rest import ( _PayProjectDebtBody, _ProjectWalletPathParams, ) @@ -36,8 +36,7 @@ response_model=Envelope[WalletGet | None], description="Get current connected wallet to the project.", ) -async def get_project_wallet(project_id: ProjectID): - ... +async def get_project_wallet(project_id: ProjectID): ... assert_handler_signature_against_model(get_project_wallet, ProjectPathParams) @@ -51,8 +50,7 @@ async def get_project_wallet(project_id: ProjectID): async def connect_wallet_to_project( project_id: ProjectID, wallet_id: WalletID, -): - ... +): ... assert_handler_signature_against_model(connect_wallet_to_project, ProjectPathParams) @@ -65,8 +63,7 @@ async def connect_wallet_to_project( async def pay_project_debt( _path: Annotated[_ProjectWalletPathParams, Depends()], _body: Annotated[_PayProjectDebtBody, Depends()], -): - ... +): ... assert_handler_signature_against_model(connect_wallet_to_project, ProjectPathParams) diff --git a/api/specs/web-server/_projects_workspaces.py b/api/specs/web-server/_projects_workspaces.py index 70840b04f20..d0f70de08bc 100644 --- a/api/specs/web-server/_projects_workspaces.py +++ b/api/specs/web-server/_projects_workspaces.py @@ -1,4 +1,4 @@ -""" Helper script to automatically generate OAS +"""Helper script to automatically generate OAS This OAS are the source of truth """ @@ -13,7 +13,7 @@ from fastapi import APIRouter, Depends, status from simcore_service_webserver._meta import API_VTAG -from simcore_service_webserver.projects._workspaces_handlers import ( +from simcore_service_webserver.projects._workspaces_rest import ( _ProjectWorkspacesPathParams, ) @@ -30,5 +30,4 @@ ) async def move_project_to_workspace( _path: Annotated[_ProjectWorkspacesPathParams, Depends()], -): - ... +): ... diff --git a/services/web/server/src/simcore_service_webserver/projects/_comments_handlers.py b/services/web/server/src/simcore_service_webserver/projects/_comments_rest.py similarity index 99% rename from services/web/server/src/simcore_service_webserver/projects/_comments_handlers.py rename to services/web/server/src/simcore_service_webserver/projects/_comments_rest.py index f3c274d13b9..670609fac20 100644 --- a/services/web/server/src/simcore_service_webserver/projects/_comments_handlers.py +++ b/services/web/server/src/simcore_service_webserver/projects/_comments_rest.py @@ -1,6 +1,4 @@ -""" Handlers for project comments operations - -""" +"""Handlers for project comments operations""" import logging from typing import Any diff --git a/services/web/server/src/simcore_service_webserver/projects/_controller/__init__.py b/services/web/server/src/simcore_service_webserver/projects/_controller/__init__.py new file mode 100644 index 00000000000..e69de29bb2d diff --git a/services/web/server/src/simcore_service_webserver/projects/_folders_handlers.py b/services/web/server/src/simcore_service_webserver/projects/_folders_rest.py similarity index 100% rename from services/web/server/src/simcore_service_webserver/projects/_folders_handlers.py rename to services/web/server/src/simcore_service_webserver/projects/_folders_rest.py diff --git a/services/web/server/src/simcore_service_webserver/projects/_groups_handlers.py b/services/web/server/src/simcore_service_webserver/projects/_groups_rest.py similarity index 92% rename from services/web/server/src/simcore_service_webserver/projects/_groups_handlers.py rename to services/web/server/src/simcore_service_webserver/projects/_groups_rest.py index 20128d6852f..3e69920b473 100644 --- a/services/web/server/src/simcore_service_webserver/projects/_groups_handlers.py +++ b/services/web/server/src/simcore_service_webserver/projects/_groups_rest.py @@ -1,6 +1,4 @@ -""" Handlers for project comments operations - -""" +"""Handlers for project comments operations""" import logging @@ -79,13 +77,13 @@ async def list_project_groups(request: web.Request): req_ctx = RequestContext.model_validate(request) path_params = parse_request_path_parameters_as(ProjectPathParams, request) - project_groups: list[ - ProjectGroupGet - ] = await _groups_api.list_project_groups_by_user_and_project( - request.app, - user_id=req_ctx.user_id, - project_id=path_params.project_id, - product_name=req_ctx.product_name, + project_groups: list[ProjectGroupGet] = ( + await _groups_api.list_project_groups_by_user_and_project( + request.app, + user_id=req_ctx.user_id, + project_id=path_params.project_id, + product_name=req_ctx.product_name, + ) ) return envelope_json_response(project_groups, web.HTTPOk) diff --git a/services/web/server/src/simcore_service_webserver/projects/_metadata_handlers.py b/services/web/server/src/simcore_service_webserver/projects/_metadata_rest.py similarity index 100% rename from services/web/server/src/simcore_service_webserver/projects/_metadata_handlers.py rename to services/web/server/src/simcore_service_webserver/projects/_metadata_rest.py diff --git a/services/web/server/src/simcore_service_webserver/projects/_nodes_handlers.py b/services/web/server/src/simcore_service_webserver/projects/_nodes_rest.py similarity index 99% rename from services/web/server/src/simcore_service_webserver/projects/_nodes_handlers.py rename to services/web/server/src/simcore_service_webserver/projects/_nodes_rest.py index 9c97f90b995..02cdd672ba4 100644 --- a/services/web/server/src/simcore_service_webserver/projects/_nodes_handlers.py +++ b/services/web/server/src/simcore_service_webserver/projects/_nodes_rest.py @@ -62,7 +62,6 @@ from ..groups.api import get_group_from_gid, list_all_user_groups_ids from ..groups.exceptions import GroupNotFoundError from ..login.decorators import login_required -from ..projects.api import has_user_project_access_rights from ..security.decorators import permission_required from ..users.api import get_user_id_from_gid, get_user_role from ..utils_aiohttp import envelope_json_response @@ -72,6 +71,7 @@ from ._common.exceptions_handlers import handle_plugin_requests_exceptions from ._common.models import ProjectPathParams, RequestContext from ._nodes_api import NodeScreenshot, get_node_screenshots +from .api import has_user_project_access_rights from .exceptions import ( NodeNotFoundError, ProjectNodeResourcesInsufficientRightsError, diff --git a/services/web/server/src/simcore_service_webserver/projects/_ports_handlers.py b/services/web/server/src/simcore_service_webserver/projects/_ports_rest.py similarity index 97% rename from services/web/server/src/simcore_service_webserver/projects/_ports_handlers.py rename to services/web/server/src/simcore_service_webserver/projects/_ports_rest.py index 45de957d2e7..268a16c7c55 100644 --- a/services/web/server/src/simcore_service_webserver/projects/_ports_handlers.py +++ b/services/web/server/src/simcore_service_webserver/projects/_ports_rest.py @@ -1,6 +1,6 @@ -""" Handlers for some CRUD operations for - - /projects/{*}/inputs - - /projects/{*}/outputs +"""Handlers for some CRUD operations for +- /projects/{*}/inputs +- /projects/{*}/outputs """ import logging @@ -27,10 +27,10 @@ from .._meta import API_VTAG as VTAG from ..login.decorators import login_required -from ..projects._access_rights_api import check_user_project_permission from ..security.decorators import permission_required from ..utils_aiohttp import envelope_json_response from . import _ports_api, projects_service +from ._access_rights_api import check_user_project_permission from ._common.exceptions_handlers import handle_plugin_requests_exceptions from ._common.models import ProjectPathParams, RequestContext from .db import ProjectDBAPI diff --git a/services/web/server/src/simcore_service_webserver/projects/_projects_nodes_pricing_unit_handlers.py b/services/web/server/src/simcore_service_webserver/projects/_projects_nodes_pricing_unit_rest.py similarity index 96% rename from services/web/server/src/simcore_service_webserver/projects/_projects_nodes_pricing_unit_handlers.py rename to services/web/server/src/simcore_service_webserver/projects/_projects_nodes_pricing_unit_rest.py index fe39871840f..6c403f12ec8 100644 --- a/services/web/server/src/simcore_service_webserver/projects/_projects_nodes_pricing_unit_handlers.py +++ b/services/web/server/src/simcore_service_webserver/projects/_projects_nodes_pricing_unit_rest.py @@ -1,6 +1,4 @@ -""" Handlers for CRUD operations on /projects/{*}/nodes/{*}/pricing-unit - -""" +"""Handlers for CRUD operations on /projects/{*}/nodes/{*}/pricing-unit""" import logging @@ -21,14 +19,13 @@ from . import projects_service from ._common.exceptions_handlers import handle_plugin_requests_exceptions from ._common.models import RequestContext -from ._nodes_handlers import NodePathParams +from ._nodes_rest import NodePathParams from .db import ProjectDBAPI _logger = logging.getLogger(__name__) -class PricingUnitError(OsparcErrorMixin, ValueError): - ... +class PricingUnitError(OsparcErrorMixin, ValueError): ... class PricingUnitNotFoundError(PricingUnitError): diff --git a/services/web/server/src/simcore_service_webserver/projects/_tags_handlers.py b/services/web/server/src/simcore_service_webserver/projects/_tags_rest.py similarity index 96% rename from services/web/server/src/simcore_service_webserver/projects/_tags_handlers.py rename to services/web/server/src/simcore_service_webserver/projects/_tags_rest.py index 1c8b11d968d..c0d47b4fc8f 100644 --- a/services/web/server/src/simcore_service_webserver/projects/_tags_handlers.py +++ b/services/web/server/src/simcore_service_webserver/projects/_tags_rest.py @@ -1,6 +1,4 @@ -""" Handlers for CRUD operations on /projects/{*}/tags/{*} - -""" +"""Handlers for CRUD operations on /projects/{*}/tags/{*}""" import logging diff --git a/services/web/server/src/simcore_service_webserver/projects/_wallets_handlers.py b/services/web/server/src/simcore_service_webserver/projects/_wallets_rest.py similarity index 98% rename from services/web/server/src/simcore_service_webserver/projects/_wallets_handlers.py rename to services/web/server/src/simcore_service_webserver/projects/_wallets_rest.py index dfa5d4cb4b1..a3ef663ff8b 100644 --- a/services/web/server/src/simcore_service_webserver/projects/_wallets_handlers.py +++ b/services/web/server/src/simcore_service_webserver/projects/_wallets_rest.py @@ -1,6 +1,4 @@ -""" Handlers for CRUD operations on /projects/{*}/wallet - -""" +"""Handlers for CRUD operations on /projects/{*}/wallet""" import logging from decimal import Decimal diff --git a/services/web/server/src/simcore_service_webserver/projects/_workspaces_handlers.py b/services/web/server/src/simcore_service_webserver/projects/_workspaces_rest.py similarity index 100% rename from services/web/server/src/simcore_service_webserver/projects/_workspaces_handlers.py rename to services/web/server/src/simcore_service_webserver/projects/_workspaces_rest.py diff --git a/services/web/server/src/simcore_service_webserver/projects/plugin.py b/services/web/server/src/simcore_service_webserver/projects/plugin.py index b563d381021..5ce48f74dc0 100644 --- a/services/web/server/src/simcore_service_webserver/projects/plugin.py +++ b/services/web/server/src/simcore_service_webserver/projects/plugin.py @@ -1,8 +1,9 @@ -""" projects management subsystem +"""projects management subsystem - A project is a document defining a osparc study - It contains metadata about the study (e.g. name, description, owner, etc) and a workbench section that describes the study pipeline +A project is a document defining a osparc study +It contains metadata about the study (e.g. name, description, owner, etc) and a workbench section that describes the study pipeline """ + import logging from aiohttp import web @@ -10,19 +11,19 @@ from ..constants import APP_SETTINGS_KEY from . import ( - _comments_handlers, + _comments_rest, _crud_handlers, - _folders_handlers, - _groups_handlers, - _metadata_handlers, - _nodes_handlers, - _ports_handlers, - _projects_nodes_pricing_unit_handlers, + _folders_rest, + _groups_rest, + _metadata_rest, + _nodes_rest, + _ports_rest, + _projects_nodes_pricing_unit_rest, _states_handlers, - _tags_handlers, + _tags_rest, _trash_rest, - _wallets_handlers, - _workspaces_handlers, + _wallets_rest, + _workspaces_rest, ) from ._observer import setup_project_observer_events from ._projects_access import setup_projects_access @@ -52,16 +53,16 @@ def setup_projects(app: web.Application) -> bool: app.router.add_routes(_states_handlers.routes) app.router.add_routes(_crud_handlers.routes) - app.router.add_routes(_comments_handlers.routes) - app.router.add_routes(_groups_handlers.routes) - app.router.add_routes(_metadata_handlers.routes) - app.router.add_routes(_ports_handlers.routes) - app.router.add_routes(_nodes_handlers.routes) - app.router.add_routes(_tags_handlers.routes) - app.router.add_routes(_wallets_handlers.routes) - app.router.add_routes(_folders_handlers.routes) - app.router.add_routes(_projects_nodes_pricing_unit_handlers.routes) - app.router.add_routes(_workspaces_handlers.routes) + app.router.add_routes(_comments_rest.routes) + app.router.add_routes(_groups_rest.routes) + app.router.add_routes(_metadata_rest.routes) + app.router.add_routes(_ports_rest.routes) + app.router.add_routes(_nodes_rest.routes) + app.router.add_routes(_tags_rest.routes) + app.router.add_routes(_wallets_rest.routes) + app.router.add_routes(_folders_rest.routes) + app.router.add_routes(_projects_nodes_pricing_unit_rest.routes) + app.router.add_routes(_workspaces_rest.routes) app.router.add_routes(_trash_rest.routes) return True diff --git a/services/web/server/tests/unit/with_dbs/02/test_projects_nodes_handler.py b/services/web/server/tests/unit/with_dbs/02/test_projects_nodes_handler.py index 2e7549cd7fa..004cbbd69e1 100644 --- a/services/web/server/tests/unit/with_dbs/02/test_projects_nodes_handler.py +++ b/services/web/server/tests/unit/with_dbs/02/test_projects_nodes_handler.py @@ -48,7 +48,7 @@ from servicelib.common_headers import UNDEFINED_DEFAULT_SIMCORE_USER_AGENT_VALUE from simcore_postgres_database.models.projects import projects as projects_db_model from simcore_service_webserver.db.models import UserRole -from simcore_service_webserver.projects._nodes_handlers import _ProjectNodePreview +from simcore_service_webserver.projects._nodes_rest import _ProjectNodePreview from simcore_service_webserver.projects.models import ProjectDict From bf971dee038d1ae44a59eb57516c1621a797fbcd Mon Sep 17 00:00:00 2001 From: Pedro Crespo-Valero <32402063+pcrespov@users.noreply.github.com> Date: Fri, 21 Mar 2025 14:22:34 +0100 Subject: [PATCH 02/39] moves to controlers folder --- api/specs/web-server/_projects.py | 33 +++++++----------- api/specs/web-server/_projects_folders.py | 2 +- api/specs/web-server/_projects_groups.py | 4 +-- api/specs/web-server/_projects_metadata.py | 4 ++- api/specs/web-server/_projects_nodes.py | 6 ++-- .../_projects_nodes_pricing_unit.py | 4 +-- api/specs/web-server/_projects_ports.py | 2 +- api/specs/web-server/_projects_states.py | 11 +++--- api/specs/web-server/_projects_workspaces.py | 2 +- .../{ => _controller}/_crud_handlers.py | 33 +++++++++--------- .../{ => _controller}/_crud_handlers_utils.py | 6 ++-- .../{ => _controller}/_folders_rest.py | 12 +++---- .../{ => _controller}/_groups_rest.py | 16 ++++----- .../{ => _controller}/_metadata_rest.py | 14 ++++---- .../projects/{ => _controller}/_nodes_rest.py | 34 +++++++++---------- .../projects/{ => _controller}/_ports_rest.py | 20 +++++------ .../_projects_nodes_pricing_unit_rest.py | 18 +++++----- .../{ => _controller}/_states_handlers.py | 28 +++++++-------- .../projects/{ => _controller}/_tags_rest.py | 12 +++---- .../projects/{ => _controller}/_trash_rest.py | 0 .../{ => _controller}/_wallets_rest.py | 0 .../{ => _controller}/_workspaces_rest.py | 12 +++---- .../projects/plugin.py | 6 ++-- .../02/test_projects_nodes_handler.py | 4 ++- 24 files changed, 141 insertions(+), 142 deletions(-) rename services/web/server/src/simcore_service_webserver/projects/{ => _controller}/_crud_handlers.py (94%) rename services/web/server/src/simcore_service_webserver/projects/{ => _controller}/_crud_handlers_utils.py (92%) rename services/web/server/src/simcore_service_webserver/projects/{ => _controller}/_folders_rest.py (83%) rename services/web/server/src/simcore_service_webserver/projects/{ => _controller}/_groups_rest.py (90%) rename services/web/server/src/simcore_service_webserver/projects/{ => _controller}/_metadata_rest.py (88%) rename services/web/server/src/simcore_service_webserver/projects/{ => _controller}/_nodes_rest.py (96%) rename services/web/server/src/simcore_service_webserver/projects/{ => _controller}/_ports_rest.py (93%) rename services/web/server/src/simcore_service_webserver/projects/{ => _controller}/_projects_nodes_pricing_unit_rest.py (91%) rename services/web/server/src/simcore_service_webserver/projects/{ => _controller}/_states_handlers.py (91%) rename services/web/server/src/simcore_service_webserver/projects/{ => _controller}/_tags_rest.py (84%) rename services/web/server/src/simcore_service_webserver/projects/{ => _controller}/_trash_rest.py (100%) rename services/web/server/src/simcore_service_webserver/projects/{ => _controller}/_wallets_rest.py (100%) rename services/web/server/src/simcore_service_webserver/projects/{ => _controller}/_workspaces_rest.py (83%) diff --git a/api/specs/web-server/_projects.py b/api/specs/web-server/_projects.py index 4c5a96c3198..9b33d2eebcc 100644 --- a/api/specs/web-server/_projects.py +++ b/api/specs/web-server/_projects.py @@ -1,4 +1,4 @@ -""" Helper script to automatically generate OAS +"""Helper script to automatically generate OAS This OAS are the source of truth """ @@ -35,7 +35,9 @@ _TO_HTTP_ERROR_MAP, ) from simcore_service_webserver.projects._common.models import ProjectPathParams -from simcore_service_webserver.projects._crud_handlers import ProjectCreateQueryParams +from simcore_service_webserver.projects._controller._crud_handlers import ( + ProjectCreateQueryParams, +) from simcore_service_webserver.projects._crud_handlers_models import ( ProjectActiveQueryParams, ProjectsListQueryParams, @@ -83,8 +85,7 @@ async def create_project( _h: Annotated[_ProjectCreateHeaderParams, Depends()], _query: Annotated[ProjectCreateQueryParams, Depends()], _body: ProjectCreateNew | ProjectCopyOverride, -): - ... +): ... @router.get( @@ -93,8 +94,7 @@ async def create_project( ) async def list_projects( _query: Annotated[as_query(ProjectsListQueryParams), Depends()], -): - ... +): ... @router.get( @@ -103,8 +103,7 @@ async def list_projects( ) async def get_active_project( _query: Annotated[ProjectActiveQueryParams, Depends()], -): - ... +): ... @router.get( @@ -113,8 +112,7 @@ async def get_active_project( ) async def get_project( _path: Annotated[ProjectPathParams, Depends()], -): - ... +): ... @router.patch( @@ -125,8 +123,7 @@ async def get_project( async def patch_project( _path: Annotated[ProjectPathParams, Depends()], _body: ProjectPatch, -): - ... +): ... @router.delete( @@ -135,8 +132,7 @@ async def patch_project( ) async def delete_project( _path: Annotated[ProjectPathParams, Depends()], -): - ... +): ... @router.post( @@ -146,8 +142,7 @@ async def delete_project( ) async def clone_project( _path: Annotated[ProjectPathParams, Depends()], -): - ... +): ... @router.get( @@ -156,8 +151,7 @@ async def clone_project( ) async def list_projects_full_search( _query: Annotated[as_query(ProjectsSearchQueryParams), Depends()], -): - ... +): ... @router.get( @@ -167,5 +161,4 @@ async def list_projects_full_search( ) async def get_project_inactivity( _path: Annotated[ProjectPathParams, Depends()], -): - ... +): ... diff --git a/api/specs/web-server/_projects_folders.py b/api/specs/web-server/_projects_folders.py index cc6a7900c7d..ff9b9a6b924 100644 --- a/api/specs/web-server/_projects_folders.py +++ b/api/specs/web-server/_projects_folders.py @@ -13,7 +13,7 @@ from fastapi import APIRouter, Depends, status from simcore_service_webserver._meta import API_VTAG -from simcore_service_webserver.projects._folders_rest import ( +from simcore_service_webserver.projects._controller._folders_rest import ( _ProjectsFoldersPathParams, ) diff --git a/api/specs/web-server/_projects_groups.py b/api/specs/web-server/_projects_groups.py index 687d17a327a..f8c34d88570 100644 --- a/api/specs/web-server/_projects_groups.py +++ b/api/specs/web-server/_projects_groups.py @@ -10,11 +10,11 @@ from models_library.generics import Envelope from simcore_service_webserver._meta import API_VTAG from simcore_service_webserver.projects._common.models import ProjectPathParams -from simcore_service_webserver.projects._groups_api import ProjectGroupGet -from simcore_service_webserver.projects._groups_rest import ( +from simcore_service_webserver.projects._controller._groups_rest import ( _ProjectsGroupsBodyParams, _ProjectsGroupsPathParams, ) +from simcore_service_webserver.projects._groups_api import ProjectGroupGet router = APIRouter( prefix=f"/{API_VTAG}", diff --git a/api/specs/web-server/_projects_metadata.py b/api/specs/web-server/_projects_metadata.py index 6f4b093d092..9f1f719eb21 100644 --- a/api/specs/web-server/_projects_metadata.py +++ b/api/specs/web-server/_projects_metadata.py @@ -18,7 +18,9 @@ ) from models_library.generics import Envelope from simcore_service_webserver._meta import API_VTAG -from simcore_service_webserver.projects._metadata_rest import ProjectPathParams +from simcore_service_webserver.projects._controller._metadata_rest import ( + ProjectPathParams, +) router = APIRouter(prefix=f"/{API_VTAG}", tags=["projects", "metadata"]) diff --git a/api/specs/web-server/_projects_nodes.py b/api/specs/web-server/_projects_nodes.py index 58a06061afe..b57f81e10d2 100644 --- a/api/specs/web-server/_projects_nodes.py +++ b/api/specs/web-server/_projects_nodes.py @@ -26,8 +26,10 @@ from models_library.projects import ProjectID from models_library.projects_nodes_io import NodeID from simcore_service_webserver._meta import API_VTAG -from simcore_service_webserver.projects._crud_handlers import ProjectPathParams -from simcore_service_webserver.projects._nodes_rest import ( +from simcore_service_webserver.projects._controller._crud_handlers import ( + ProjectPathParams, +) +from simcore_service_webserver.projects._controller._nodes_rest import ( NodePathParams, _ProjectGroupAccess, _ProjectNodePreview, diff --git a/api/specs/web-server/_projects_nodes_pricing_unit.py b/api/specs/web-server/_projects_nodes_pricing_unit.py index b5184dca94c..7ad5e66cc42 100644 --- a/api/specs/web-server/_projects_nodes_pricing_unit.py +++ b/api/specs/web-server/_projects_nodes_pricing_unit.py @@ -17,8 +17,8 @@ from models_library.projects_nodes_io import NodeID from models_library.resource_tracker import PricingPlanId, PricingUnitId from simcore_service_webserver._meta import API_VTAG -from simcore_service_webserver.projects._nodes_rest import NodePathParams -from simcore_service_webserver.projects._projects_nodes_pricing_unit_rest import ( +from simcore_service_webserver.projects._controller._nodes_rest import NodePathParams +from simcore_service_webserver.projects._controller._projects_nodes_pricing_unit_rest import ( _ProjectNodePricingUnitPathParams, ) diff --git a/api/specs/web-server/_projects_ports.py b/api/specs/web-server/_projects_ports.py index c13a2ea60ad..51e9bf0081d 100644 --- a/api/specs/web-server/_projects_ports.py +++ b/api/specs/web-server/_projects_ports.py @@ -9,7 +9,7 @@ from models_library.projects import ProjectID from models_library.projects_nodes import NodeID from simcore_service_webserver._meta import API_VTAG -from simcore_service_webserver.projects._ports_rest import ( +from simcore_service_webserver.projects._controller._ports_rest import ( ProjectInputGet, ProjectInputUpdate, ProjectMetadataPortGet, diff --git a/api/specs/web-server/_projects_states.py b/api/specs/web-server/_projects_states.py index 1547e8f3b35..68a2b2c8d28 100644 --- a/api/specs/web-server/_projects_states.py +++ b/api/specs/web-server/_projects_states.py @@ -14,7 +14,7 @@ from servicelib.aiohttp import status from simcore_service_webserver._meta import API_VTAG from simcore_service_webserver.director_v2.exceptions import DirectorServiceError -from simcore_service_webserver.projects._states_handlers import ( +from simcore_service_webserver.projects._controller._states_handlers import ( ProjectPathParams, _OpenProjectQuery, ) @@ -70,20 +70,17 @@ def open_project( client_session_id: Annotated[str, Body(...)], _path_params: Annotated[ProjectPathParams, Depends()], _query_params: Annotated[_OpenProjectQuery, Depends()], -): - ... +): ... @router.post("/projects/{project_id}:close", status_code=status.HTTP_204_NO_CONTENT) def close_project( _path_params: Annotated[ProjectPathParams, Depends()], client_session_id: Annotated[str, Body(...)], -): - ... +): ... @router.get("/projects/{project_id}/state", response_model=Envelope[ProjectState]) def get_project_state( _path_params: Annotated[ProjectPathParams, Depends()], -): - ... +): ... diff --git a/api/specs/web-server/_projects_workspaces.py b/api/specs/web-server/_projects_workspaces.py index d0f70de08bc..644a65d63f3 100644 --- a/api/specs/web-server/_projects_workspaces.py +++ b/api/specs/web-server/_projects_workspaces.py @@ -13,7 +13,7 @@ from fastapi import APIRouter, Depends, status from simcore_service_webserver._meta import API_VTAG -from simcore_service_webserver.projects._workspaces_rest import ( +from simcore_service_webserver.projects._controller._workspaces_rest import ( _ProjectWorkspacesPathParams, ) diff --git a/services/web/server/src/simcore_service_webserver/projects/_crud_handlers.py b/services/web/server/src/simcore_service_webserver/projects/_controller/_crud_handlers.py similarity index 94% rename from services/web/server/src/simcore_service_webserver/projects/_crud_handlers.py rename to services/web/server/src/simcore_service_webserver/projects/_controller/_crud_handlers.py index 2868d1a3cf0..296bec139f0 100644 --- a/services/web/server/src/simcore_service_webserver/projects/_crud_handlers.py +++ b/services/web/server/src/simcore_service_webserver/projects/_controller/_crud_handlers.py @@ -33,19 +33,19 @@ ) from servicelib.redis import get_project_locked_state -from .._meta import API_VTAG as VTAG -from ..catalog import catalog_service -from ..login.decorators import login_required -from ..redis import get_redis_lock_manager_client_sdk -from ..resource_manager.user_sessions import PROJECT_ID_KEY, managed_resource -from ..security.api import check_user_permission -from ..security.decorators import permission_required -from ..users.api import get_user_fullname -from ..utils_aiohttp import envelope_json_response -from . import _crud_api_create, _crud_api_read, _crud_handlers_utils, projects_service -from ._common.exceptions_handlers import handle_plugin_requests_exceptions -from ._common.models import ProjectPathParams, RequestContext -from ._crud_handlers_models import ( +from ..._meta import API_VTAG as VTAG +from ...catalog import catalog_service +from ...login.decorators import login_required +from ...redis import get_redis_lock_manager_client_sdk +from ...resource_manager.user_sessions import PROJECT_ID_KEY, managed_resource +from ...security.api import check_user_permission +from ...security.decorators import permission_required +from ...users.api import get_user_fullname +from ...utils_aiohttp import envelope_json_response +from .. import _crud_api_create, _crud_api_read, projects_service +from .._common.exceptions_handlers import handle_plugin_requests_exceptions +from .._common.models import ProjectPathParams, RequestContext +from .._crud_handlers_models import ( ProjectActiveQueryParams, ProjectCreateHeaders, ProjectCreateQueryParams, @@ -53,9 +53,10 @@ ProjectsListQueryParams, ProjectsSearchQueryParams, ) -from ._permalink_service import update_or_pop_permalink_in_project -from .models import ProjectDict -from .utils import get_project_unavailable_services, project_uses_available_services +from .._permalink_service import update_or_pop_permalink_in_project +from ..models import ProjectDict +from ..utils import get_project_unavailable_services, project_uses_available_services +from . import _crud_handlers_utils # When the user requests a project with a repo, the working copy might differ from # the repo project. A middleware in the meta module (if active) will resolve diff --git a/services/web/server/src/simcore_service_webserver/projects/_crud_handlers_utils.py b/services/web/server/src/simcore_service_webserver/projects/_controller/_crud_handlers_utils.py similarity index 92% rename from services/web/server/src/simcore_service_webserver/projects/_crud_handlers_utils.py rename to services/web/server/src/simcore_service_webserver/projects/_controller/_crud_handlers_utils.py index 0cb578f9432..beab5959668 100644 --- a/services/web/server/src/simcore_service_webserver/projects/_crud_handlers_utils.py +++ b/services/web/server/src/simcore_service_webserver/projects/_controller/_crud_handlers_utils.py @@ -5,9 +5,9 @@ from servicelib.mimetype_constants import MIMETYPE_APPLICATION_JSON from servicelib.rest_constants import RESPONSE_MODEL_POLICY -from . import _permalink_service -from ._crud_api_read import _paralell_update -from .models import ProjectDict +from .. import _permalink_service +from .._crud_api_read import _paralell_update +from ..models import ProjectDict async def aggregate_data_to_projects_from_request( diff --git a/services/web/server/src/simcore_service_webserver/projects/_folders_rest.py b/services/web/server/src/simcore_service_webserver/projects/_controller/_folders_rest.py similarity index 83% rename from services/web/server/src/simcore_service_webserver/projects/_folders_rest.py rename to services/web/server/src/simcore_service_webserver/projects/_controller/_folders_rest.py index 7a213d0a144..1343efc23f5 100644 --- a/services/web/server/src/simcore_service_webserver/projects/_folders_rest.py +++ b/services/web/server/src/simcore_service_webserver/projects/_controller/_folders_rest.py @@ -8,12 +8,12 @@ from servicelib.aiohttp import status from servicelib.aiohttp.requests_validation import parse_request_path_parameters_as -from .._meta import api_version_prefix as VTAG -from ..login.decorators import login_required -from ..security.decorators import permission_required -from . import _folders_api -from ._common.exceptions_handlers import handle_plugin_requests_exceptions -from ._common.models import RequestContext +from ..._meta import api_version_prefix as VTAG +from ...login.decorators import login_required +from ...security.decorators import permission_required +from .. import _folders_api +from .._common.exceptions_handlers import handle_plugin_requests_exceptions +from .._common.models import RequestContext _logger = logging.getLogger(__name__) diff --git a/services/web/server/src/simcore_service_webserver/projects/_groups_rest.py b/services/web/server/src/simcore_service_webserver/projects/_controller/_groups_rest.py similarity index 90% rename from services/web/server/src/simcore_service_webserver/projects/_groups_rest.py rename to services/web/server/src/simcore_service_webserver/projects/_controller/_groups_rest.py index 3e69920b473..af902d43101 100644 --- a/services/web/server/src/simcore_service_webserver/projects/_groups_rest.py +++ b/services/web/server/src/simcore_service_webserver/projects/_controller/_groups_rest.py @@ -12,14 +12,14 @@ parse_request_path_parameters_as, ) -from .._meta import api_version_prefix as VTAG -from ..login.decorators import login_required -from ..security.decorators import permission_required -from ..utils_aiohttp import envelope_json_response -from . import _groups_api -from ._common.exceptions_handlers import handle_plugin_requests_exceptions -from ._common.models import ProjectPathParams, RequestContext -from ._groups_api import ProjectGroupGet +from ..._meta import api_version_prefix as VTAG +from ...login.decorators import login_required +from ...security.decorators import permission_required +from ...utils_aiohttp import envelope_json_response +from .. import _groups_api +from .._common.exceptions_handlers import handle_plugin_requests_exceptions +from .._common.models import ProjectPathParams, RequestContext +from .._groups_api import ProjectGroupGet _logger = logging.getLogger(__name__) diff --git a/services/web/server/src/simcore_service_webserver/projects/_metadata_rest.py b/services/web/server/src/simcore_service_webserver/projects/_controller/_metadata_rest.py similarity index 88% rename from services/web/server/src/simcore_service_webserver/projects/_metadata_rest.py rename to services/web/server/src/simcore_service_webserver/projects/_controller/_metadata_rest.py index c6c1157e34e..12f4178e454 100644 --- a/services/web/server/src/simcore_service_webserver/projects/_metadata_rest.py +++ b/services/web/server/src/simcore_service_webserver/projects/_controller/_metadata_rest.py @@ -23,13 +23,13 @@ ) from servicelib.logging_utils import log_catch -from .._meta import api_version_prefix -from ..login.decorators import login_required -from ..security.decorators import permission_required -from ..utils_aiohttp import envelope_json_response -from . import _metadata_api -from ._common.exceptions_handlers import handle_plugin_requests_exceptions -from ._common.models import ProjectPathParams, RequestContext +from ..._meta import api_version_prefix +from ...login.decorators import login_required +from ...security.decorators import permission_required +from ...utils_aiohttp import envelope_json_response +from .. import _metadata_api +from .._common.exceptions_handlers import handle_plugin_requests_exceptions +from .._common.models import ProjectPathParams, RequestContext routes = web.RouteTableDef() diff --git a/services/web/server/src/simcore_service_webserver/projects/_nodes_rest.py b/services/web/server/src/simcore_service_webserver/projects/_controller/_nodes_rest.py similarity index 96% rename from services/web/server/src/simcore_service_webserver/projects/_nodes_rest.py rename to services/web/server/src/simcore_service_webserver/projects/_controller/_nodes_rest.py index 02cdd672ba4..fd14172dae9 100644 --- a/services/web/server/src/simcore_service_webserver/projects/_nodes_rest.py +++ b/services/web/server/src/simcore_service_webserver/projects/_controller/_nodes_rest.py @@ -56,23 +56,23 @@ from servicelib.services_utils import get_status_as_dict from simcore_postgres_database.models.users import UserRole -from .._meta import API_VTAG as VTAG -from ..catalog import catalog_service -from ..dynamic_scheduler import api as dynamic_scheduler_api -from ..groups.api import get_group_from_gid, list_all_user_groups_ids -from ..groups.exceptions import GroupNotFoundError -from ..login.decorators import login_required -from ..security.decorators import permission_required -from ..users.api import get_user_id_from_gid, get_user_role -from ..utils_aiohttp import envelope_json_response -from . import _access_rights_api as access_rights_service -from . import _nodes_api as _nodes_service -from . import nodes_utils, projects_service -from ._common.exceptions_handlers import handle_plugin_requests_exceptions -from ._common.models import ProjectPathParams, RequestContext -from ._nodes_api import NodeScreenshot, get_node_screenshots -from .api import has_user_project_access_rights -from .exceptions import ( +from ..._meta import API_VTAG as VTAG +from ...catalog import catalog_service +from ...dynamic_scheduler import api as dynamic_scheduler_api +from ...groups.api import get_group_from_gid, list_all_user_groups_ids +from ...groups.exceptions import GroupNotFoundError +from ...login.decorators import login_required +from ...security.decorators import permission_required +from ...users.api import get_user_id_from_gid, get_user_role +from ...utils_aiohttp import envelope_json_response +from .. import _access_rights_api as access_rights_service +from .. import _nodes_api as _nodes_service +from .. import nodes_utils, projects_service +from .._common.exceptions_handlers import handle_plugin_requests_exceptions +from .._common.models import ProjectPathParams, RequestContext +from .._nodes_api import NodeScreenshot, get_node_screenshots +from ..api import has_user_project_access_rights +from ..exceptions import ( NodeNotFoundError, ProjectNodeResourcesInsufficientRightsError, ProjectNodeResourcesInvalidError, diff --git a/services/web/server/src/simcore_service_webserver/projects/_ports_rest.py b/services/web/server/src/simcore_service_webserver/projects/_controller/_ports_rest.py similarity index 93% rename from services/web/server/src/simcore_service_webserver/projects/_ports_rest.py rename to services/web/server/src/simcore_service_webserver/projects/_controller/_ports_rest.py index 268a16c7c55..1d48f17cf1d 100644 --- a/services/web/server/src/simcore_service_webserver/projects/_ports_rest.py +++ b/services/web/server/src/simcore_service_webserver/projects/_controller/_ports_rest.py @@ -25,16 +25,16 @@ parse_request_path_parameters_as, ) -from .._meta import API_VTAG as VTAG -from ..login.decorators import login_required -from ..security.decorators import permission_required -from ..utils_aiohttp import envelope_json_response -from . import _ports_api, projects_service -from ._access_rights_api import check_user_project_permission -from ._common.exceptions_handlers import handle_plugin_requests_exceptions -from ._common.models import ProjectPathParams, RequestContext -from .db import ProjectDBAPI -from .models import ProjectDict +from ..._meta import API_VTAG as VTAG +from ...login.decorators import login_required +from ...security.decorators import permission_required +from ...utils_aiohttp import envelope_json_response +from .. import _ports_api, projects_service +from .._access_rights_api import check_user_project_permission +from .._common.exceptions_handlers import handle_plugin_requests_exceptions +from .._common.models import ProjectPathParams, RequestContext +from ..db import ProjectDBAPI +from ..models import ProjectDict log = logging.getLogger(__name__) diff --git a/services/web/server/src/simcore_service_webserver/projects/_projects_nodes_pricing_unit_rest.py b/services/web/server/src/simcore_service_webserver/projects/_controller/_projects_nodes_pricing_unit_rest.py similarity index 91% rename from services/web/server/src/simcore_service_webserver/projects/_projects_nodes_pricing_unit_rest.py rename to services/web/server/src/simcore_service_webserver/projects/_controller/_projects_nodes_pricing_unit_rest.py index 6c403f12ec8..72693231a83 100644 --- a/services/web/server/src/simcore_service_webserver/projects/_projects_nodes_pricing_unit_rest.py +++ b/services/web/server/src/simcore_service_webserver/projects/_controller/_projects_nodes_pricing_unit_rest.py @@ -11,16 +11,16 @@ from pydantic import BaseModel, ConfigDict from servicelib.aiohttp.requests_validation import parse_request_path_parameters_as -from .._meta import API_VTAG -from ..login.decorators import login_required -from ..resource_usage import service as rut_api -from ..security.decorators import permission_required -from ..utils_aiohttp import envelope_json_response -from . import projects_service -from ._common.exceptions_handlers import handle_plugin_requests_exceptions -from ._common.models import RequestContext +from ..._meta import API_VTAG +from ...login.decorators import login_required +from ...resource_usage import service as rut_api +from ...security.decorators import permission_required +from ...utils_aiohttp import envelope_json_response +from .. import projects_service +from .._common.exceptions_handlers import handle_plugin_requests_exceptions +from .._common.models import RequestContext +from ..db import ProjectDBAPI from ._nodes_rest import NodePathParams -from .db import ProjectDBAPI _logger = logging.getLogger(__name__) diff --git a/services/web/server/src/simcore_service_webserver/projects/_states_handlers.py b/services/web/server/src/simcore_service_webserver/projects/_controller/_states_handlers.py similarity index 91% rename from services/web/server/src/simcore_service_webserver/projects/_states_handlers.py rename to services/web/server/src/simcore_service_webserver/projects/_controller/_states_handlers.py index 0ccb6be1737..09e12e07aca 100644 --- a/services/web/server/src/simcore_service_webserver/projects/_states_handlers.py +++ b/services/web/server/src/simcore_service_webserver/projects/_controller/_states_handlers.py @@ -21,20 +21,20 @@ from simcore_postgres_database.models.users import UserRole from simcore_postgres_database.webserver_models import ProjectType -from .._meta import API_VTAG as VTAG -from ..director_v2.exceptions import DirectorServiceError -from ..login.decorators import login_required -from ..notifications import project_logs -from ..products import products_web -from ..products.models import Product -from ..security.decorators import permission_required -from ..users import api -from ..utils_aiohttp import envelope_json_response -from . import api as projects_api -from . import projects_service -from ._common.exceptions_handlers import handle_plugin_requests_exceptions -from ._common.models import ProjectPathParams, RequestContext -from .exceptions import ProjectStartsTooManyDynamicNodesError +from ..._meta import API_VTAG as VTAG +from ...director_v2.exceptions import DirectorServiceError +from ...login.decorators import login_required +from ...notifications import project_logs +from ...products import products_web +from ...products.models import Product +from ...security.decorators import permission_required +from ...users import api +from ...utils_aiohttp import envelope_json_response +from .. import api as projects_api +from .. import projects_service +from .._common.exceptions_handlers import handle_plugin_requests_exceptions +from .._common.models import ProjectPathParams, RequestContext +from ..exceptions import ProjectStartsTooManyDynamicNodesError _logger = logging.getLogger(__name__) diff --git a/services/web/server/src/simcore_service_webserver/projects/_tags_rest.py b/services/web/server/src/simcore_service_webserver/projects/_controller/_tags_rest.py similarity index 84% rename from services/web/server/src/simcore_service_webserver/projects/_tags_rest.py rename to services/web/server/src/simcore_service_webserver/projects/_controller/_tags_rest.py index c0d47b4fc8f..af4373d0149 100644 --- a/services/web/server/src/simcore_service_webserver/projects/_tags_rest.py +++ b/services/web/server/src/simcore_service_webserver/projects/_controller/_tags_rest.py @@ -6,12 +6,12 @@ from models_library.projects import ProjectID from servicelib.request_keys import RQT_USERID_KEY -from .._meta import API_VTAG -from ..login.decorators import login_required -from ..security.decorators import permission_required -from ..utils_aiohttp import envelope_json_response -from . import _tags_api as tags_api -from ._common.exceptions_handlers import handle_plugin_requests_exceptions +from ..._meta import API_VTAG +from ...login.decorators import login_required +from ...security.decorators import permission_required +from ...utils_aiohttp import envelope_json_response +from .. import _tags_api as tags_api +from .._common.exceptions_handlers import handle_plugin_requests_exceptions _logger = logging.getLogger(__name__) diff --git a/services/web/server/src/simcore_service_webserver/projects/_trash_rest.py b/services/web/server/src/simcore_service_webserver/projects/_controller/_trash_rest.py similarity index 100% rename from services/web/server/src/simcore_service_webserver/projects/_trash_rest.py rename to services/web/server/src/simcore_service_webserver/projects/_controller/_trash_rest.py diff --git a/services/web/server/src/simcore_service_webserver/projects/_wallets_rest.py b/services/web/server/src/simcore_service_webserver/projects/_controller/_wallets_rest.py similarity index 100% rename from services/web/server/src/simcore_service_webserver/projects/_wallets_rest.py rename to services/web/server/src/simcore_service_webserver/projects/_controller/_wallets_rest.py diff --git a/services/web/server/src/simcore_service_webserver/projects/_workspaces_rest.py b/services/web/server/src/simcore_service_webserver/projects/_controller/_workspaces_rest.py similarity index 83% rename from services/web/server/src/simcore_service_webserver/projects/_workspaces_rest.py rename to services/web/server/src/simcore_service_webserver/projects/_controller/_workspaces_rest.py index 2421670eb6e..b6ed4a0ad93 100644 --- a/services/web/server/src/simcore_service_webserver/projects/_workspaces_rest.py +++ b/services/web/server/src/simcore_service_webserver/projects/_controller/_workspaces_rest.py @@ -9,12 +9,12 @@ from servicelib.aiohttp import status from servicelib.aiohttp.requests_validation import parse_request_path_parameters_as -from .._meta import api_version_prefix as VTAG -from ..login.decorators import login_required -from ..security.decorators import permission_required -from . import _workspaces_api -from ._common.exceptions_handlers import handle_plugin_requests_exceptions -from ._common.models import RequestContext +from ..._meta import api_version_prefix as VTAG +from ...login.decorators import login_required +from ...security.decorators import permission_required +from .. import _workspaces_api +from .._common.exceptions_handlers import handle_plugin_requests_exceptions +from .._common.models import RequestContext _logger = logging.getLogger(__name__) diff --git a/services/web/server/src/simcore_service_webserver/projects/plugin.py b/services/web/server/src/simcore_service_webserver/projects/plugin.py index 5ce48f74dc0..43d837bb61f 100644 --- a/services/web/server/src/simcore_service_webserver/projects/plugin.py +++ b/services/web/server/src/simcore_service_webserver/projects/plugin.py @@ -12,6 +12,10 @@ from ..constants import APP_SETTINGS_KEY from . import ( _comments_rest, + _trash_rest, + _wallets_rest, +) +from ._controller import ( _crud_handlers, _folders_rest, _groups_rest, @@ -21,8 +25,6 @@ _projects_nodes_pricing_unit_rest, _states_handlers, _tags_rest, - _trash_rest, - _wallets_rest, _workspaces_rest, ) from ._observer import setup_project_observer_events diff --git a/services/web/server/tests/unit/with_dbs/02/test_projects_nodes_handler.py b/services/web/server/tests/unit/with_dbs/02/test_projects_nodes_handler.py index 004cbbd69e1..65a988aa0f5 100644 --- a/services/web/server/tests/unit/with_dbs/02/test_projects_nodes_handler.py +++ b/services/web/server/tests/unit/with_dbs/02/test_projects_nodes_handler.py @@ -48,7 +48,9 @@ from servicelib.common_headers import UNDEFINED_DEFAULT_SIMCORE_USER_AGENT_VALUE from simcore_postgres_database.models.projects import projects as projects_db_model from simcore_service_webserver.db.models import UserRole -from simcore_service_webserver.projects._nodes_rest import _ProjectNodePreview +from simcore_service_webserver.projects._controller._nodes_rest import ( + _ProjectNodePreview, +) from simcore_service_webserver.projects.models import ProjectDict From d925f2026edc03cbe377013a18ab414803a542d6 Mon Sep 17 00:00:00 2001 From: Pedro Crespo-Valero <32402063+pcrespov@users.noreply.github.com> Date: Fri, 21 Mar 2025 14:26:40 +0100 Subject: [PATCH 03/39] renames rest --- api/specs/web-server/_projects.py | 2 +- api/specs/web-server/_projects_nodes.py | 6 +++--- api/specs/web-server/_projects_states.py | 2 +- .../{_crud_handlers.py => _projects_rest.py} | 10 +++++----- ..._crud_handlers_utils.py => _projects_rest_utils.py} | 0 .../{_states_handlers.py => _projects_states_rest.py} | 0 .../src/simcore_service_webserver/projects/plugin.py | 8 ++++---- 7 files changed, 14 insertions(+), 14 deletions(-) rename services/web/server/src/simcore_service_webserver/projects/_controller/{_crud_handlers.py => _projects_rest.py} (98%) rename services/web/server/src/simcore_service_webserver/projects/_controller/{_crud_handlers_utils.py => _projects_rest_utils.py} (100%) rename services/web/server/src/simcore_service_webserver/projects/_controller/{_states_handlers.py => _projects_states_rest.py} (100%) diff --git a/api/specs/web-server/_projects.py b/api/specs/web-server/_projects.py index 9b33d2eebcc..845a218390a 100644 --- a/api/specs/web-server/_projects.py +++ b/api/specs/web-server/_projects.py @@ -35,7 +35,7 @@ _TO_HTTP_ERROR_MAP, ) from simcore_service_webserver.projects._common.models import ProjectPathParams -from simcore_service_webserver.projects._controller._crud_handlers import ( +from simcore_service_webserver.projects._controller._projects_rest import ( ProjectCreateQueryParams, ) from simcore_service_webserver.projects._crud_handlers_models import ( diff --git a/api/specs/web-server/_projects_nodes.py b/api/specs/web-server/_projects_nodes.py index b57f81e10d2..6b64d5d3154 100644 --- a/api/specs/web-server/_projects_nodes.py +++ b/api/specs/web-server/_projects_nodes.py @@ -26,14 +26,14 @@ from models_library.projects import ProjectID from models_library.projects_nodes_io import NodeID from simcore_service_webserver._meta import API_VTAG -from simcore_service_webserver.projects._controller._crud_handlers import ( - ProjectPathParams, -) from simcore_service_webserver.projects._controller._nodes_rest import ( NodePathParams, _ProjectGroupAccess, _ProjectNodePreview, ) +from simcore_service_webserver.projects._controller._projects_rest import ( + ProjectPathParams, +) router = APIRouter( prefix=f"/{API_VTAG}", diff --git a/api/specs/web-server/_projects_states.py b/api/specs/web-server/_projects_states.py index 68a2b2c8d28..41a9638179f 100644 --- a/api/specs/web-server/_projects_states.py +++ b/api/specs/web-server/_projects_states.py @@ -14,7 +14,7 @@ from servicelib.aiohttp import status from simcore_service_webserver._meta import API_VTAG from simcore_service_webserver.director_v2.exceptions import DirectorServiceError -from simcore_service_webserver.projects._controller._states_handlers import ( +from simcore_service_webserver.projects._controller._projects_states_rest import ( ProjectPathParams, _OpenProjectQuery, ) diff --git a/services/web/server/src/simcore_service_webserver/projects/_controller/_crud_handlers.py b/services/web/server/src/simcore_service_webserver/projects/_controller/_projects_rest.py similarity index 98% rename from services/web/server/src/simcore_service_webserver/projects/_controller/_crud_handlers.py rename to services/web/server/src/simcore_service_webserver/projects/_controller/_projects_rest.py index 296bec139f0..9b86204fc0d 100644 --- a/services/web/server/src/simcore_service_webserver/projects/_controller/_crud_handlers.py +++ b/services/web/server/src/simcore_service_webserver/projects/_controller/_projects_rest.py @@ -56,7 +56,7 @@ from .._permalink_service import update_or_pop_permalink_in_project from ..models import ProjectDict from ..utils import get_project_unavailable_services, project_uses_available_services -from . import _crud_handlers_utils +from . import _projects_rest_utils # When the user requests a project with a repo, the working copy might differ from # the repo project. A middleware in the meta module (if active) will resolve @@ -166,11 +166,11 @@ async def list_projects(request: web.Request): order_by=OrderBy.model_construct(**query_params.order_by.model_dump()), ) - projects = await _crud_handlers_utils.aggregate_data_to_projects_from_request( + projects = await _projects_rest_utils.aggregate_data_to_projects_from_request( request, projects ) - return _crud_handlers_utils.create_page_response( + return _projects_rest_utils.create_page_response( projects=projects, request_url=request.url, total=total_number_of_projects, @@ -206,11 +206,11 @@ async def list_projects_full_search(request: web.Request): order_by=OrderBy.model_construct(**query_params.order_by.model_dump()), ) - projects = await _crud_handlers_utils.aggregate_data_to_projects_from_request( + projects = await _projects_rest_utils.aggregate_data_to_projects_from_request( request, projects ) - return _crud_handlers_utils.create_page_response( + return _projects_rest_utils.create_page_response( projects=projects, request_url=request.url, total=total_number_of_projects, diff --git a/services/web/server/src/simcore_service_webserver/projects/_controller/_crud_handlers_utils.py b/services/web/server/src/simcore_service_webserver/projects/_controller/_projects_rest_utils.py similarity index 100% rename from services/web/server/src/simcore_service_webserver/projects/_controller/_crud_handlers_utils.py rename to services/web/server/src/simcore_service_webserver/projects/_controller/_projects_rest_utils.py diff --git a/services/web/server/src/simcore_service_webserver/projects/_controller/_states_handlers.py b/services/web/server/src/simcore_service_webserver/projects/_controller/_projects_states_rest.py similarity index 100% rename from services/web/server/src/simcore_service_webserver/projects/_controller/_states_handlers.py rename to services/web/server/src/simcore_service_webserver/projects/_controller/_projects_states_rest.py diff --git a/services/web/server/src/simcore_service_webserver/projects/plugin.py b/services/web/server/src/simcore_service_webserver/projects/plugin.py index 43d837bb61f..6efda62ad22 100644 --- a/services/web/server/src/simcore_service_webserver/projects/plugin.py +++ b/services/web/server/src/simcore_service_webserver/projects/plugin.py @@ -16,14 +16,14 @@ _wallets_rest, ) from ._controller import ( - _crud_handlers, _folders_rest, _groups_rest, _metadata_rest, _nodes_rest, _ports_rest, _projects_nodes_pricing_unit_rest, - _states_handlers, + _projects_rest, + _projects_states_rest, _tags_rest, _workspaces_rest, ) @@ -53,8 +53,8 @@ def setup_projects(app: web.Application) -> bool: # registers event handlers (e.g. on_user_disconnect) setup_project_observer_events(app) - app.router.add_routes(_states_handlers.routes) - app.router.add_routes(_crud_handlers.routes) + app.router.add_routes(_projects_states_rest.routes) + app.router.add_routes(_projects_rest.routes) app.router.add_routes(_comments_rest.routes) app.router.add_routes(_groups_rest.routes) app.router.add_routes(_metadata_rest.routes) From 338250cfa727549700e6e74bf71777e946fa0a03 Mon Sep 17 00:00:00 2001 From: Pedro Crespo-Valero <32402063+pcrespov@users.noreply.github.com> Date: Fri, 21 Mar 2025 14:30:06 +0100 Subject: [PATCH 04/39] service modules --- api/specs/web-server/_projects_groups.py | 2 +- .../folders/_workspaces_repository.py | 2 +- ...s_rights_api.py => _access_rights_service.py} | 0 .../projects/_comments_rest.py | 14 +++++++------- .../{_comments_api.py => _comments_service.py} | 6 +++--- .../projects/_controller/_folders_rest.py | 4 ++-- .../projects/_controller/_groups_rest.py | 12 ++++++------ .../projects/_controller/_metadata_rest.py | 8 ++++---- .../projects/_controller/_nodes_rest.py | 6 +++--- .../projects/_controller/_ports_rest.py | 14 +++++++------- .../projects/_controller/_tags_rest.py | 2 +- .../projects/_controller/_workspaces_rest.py | 4 ++-- .../projects/_crud_api_create.py | 2 +- .../projects/_crud_api_delete.py | 7 +++---- .../{_folders_api.py => _folders_service.py} | 2 +- .../{_groups_api.py => _groups_service.py} | 8 ++++---- .../{_metadata_api.py => _metadata_service.py} | 2 +- .../{_nodes_api.py => _nodes_service.py} | 0 .../{_ports_api.py => _ports_service.py} | 0 .../projects/{_tags_api.py => _tags_service.py} | 6 ++---- .../projects/_trash_service.py | 2 +- .../{_wallets_api.py => _wallets_service.py} | 0 ..._workspaces_api.py => _workspaces_service.py} | 2 +- .../simcore_service_webserver/projects/api.py | 6 +++--- .../projects/projects_service.py | 16 ++++++++-------- .../unit/isolated/test_projects__nodes_api.py | 2 +- .../unit/with_dbs/02/test_projects__ports_api.py | 2 +- ...ud_handlers__clone_in_workspace_and_folder.py | 2 +- .../tests/unit/with_dbs/03/trash/test_trash.py | 2 +- 29 files changed, 66 insertions(+), 69 deletions(-) rename services/web/server/src/simcore_service_webserver/projects/{_access_rights_api.py => _access_rights_service.py} (100%) rename services/web/server/src/simcore_service_webserver/projects/{_comments_api.py => _comments_service.py} (95%) rename services/web/server/src/simcore_service_webserver/projects/{_folders_api.py => _folders_service.py} (97%) rename services/web/server/src/simcore_service_webserver/projects/{_groups_api.py => _groups_service.py} (96%) rename services/web/server/src/simcore_service_webserver/projects/{_metadata_api.py => _metadata_service.py} (98%) rename services/web/server/src/simcore_service_webserver/projects/{_nodes_api.py => _nodes_service.py} (100%) rename services/web/server/src/simcore_service_webserver/projects/{_ports_api.py => _ports_service.py} (100%) rename services/web/server/src/simcore_service_webserver/projects/{_tags_api.py => _tags_service.py} (95%) rename services/web/server/src/simcore_service_webserver/projects/{_wallets_api.py => _wallets_service.py} (100%) rename services/web/server/src/simcore_service_webserver/projects/{_workspaces_api.py => _workspaces_service.py} (97%) diff --git a/api/specs/web-server/_projects_groups.py b/api/specs/web-server/_projects_groups.py index f8c34d88570..d4dda17e4ed 100644 --- a/api/specs/web-server/_projects_groups.py +++ b/api/specs/web-server/_projects_groups.py @@ -14,7 +14,7 @@ _ProjectsGroupsBodyParams, _ProjectsGroupsPathParams, ) -from simcore_service_webserver.projects._groups_api import ProjectGroupGet +from simcore_service_webserver.projects._groups_service import ProjectGroupGet router = APIRouter( prefix=f"/{API_VTAG}", diff --git a/services/web/server/src/simcore_service_webserver/folders/_workspaces_repository.py b/services/web/server/src/simcore_service_webserver/folders/_workspaces_repository.py index bac38edb7ca..9a1faa19110 100644 --- a/services/web/server/src/simcore_service_webserver/folders/_workspaces_repository.py +++ b/services/web/server/src/simcore_service_webserver/folders/_workspaces_repository.py @@ -11,7 +11,7 @@ from ..projects import _folders_db as project_to_folders_db from ..projects import _groups_db as project_groups_db from ..projects import _projects_db as projects_db -from ..projects._access_rights_api import check_user_project_permission +from ..projects._access_rights_service import check_user_project_permission from ..users.api import get_user from ..workspaces.api import check_user_workspace_access from . import _folders_repository diff --git a/services/web/server/src/simcore_service_webserver/projects/_access_rights_api.py b/services/web/server/src/simcore_service_webserver/projects/_access_rights_service.py similarity index 100% rename from services/web/server/src/simcore_service_webserver/projects/_access_rights_api.py rename to services/web/server/src/simcore_service_webserver/projects/_access_rights_service.py diff --git a/services/web/server/src/simcore_service_webserver/projects/_comments_rest.py b/services/web/server/src/simcore_service_webserver/projects/_comments_rest.py index 670609fac20..2a428995ade 100644 --- a/services/web/server/src/simcore_service_webserver/projects/_comments_rest.py +++ b/services/web/server/src/simcore_service_webserver/projects/_comments_rest.py @@ -26,7 +26,7 @@ from ..login.decorators import login_required from ..security.decorators import permission_required from ..utils_aiohttp import envelope_json_response -from . import _comments_api, projects_service +from . import _comments_service, projects_service from ._common.exceptions_handlers import handle_plugin_requests_exceptions from ._common.models import RequestContext @@ -74,7 +74,7 @@ async def create_project_comment(request: web.Request): include_state=False, ) - comment_id = await _comments_api.create_project_comment( + comment_id = await _comments_service.create_project_comment( request=request, project_uuid=path_params.project_uuid, user_id=req_ctx.user_id, @@ -116,12 +116,12 @@ async def list_project_comments(request: web.Request): include_state=False, ) - total_project_comments = await _comments_api.total_project_comments( + total_project_comments = await _comments_service.total_project_comments( request=request, project_uuid=path_params.project_uuid, ) - project_comments = await _comments_api.list_project_comments( + project_comments = await _comments_service.list_project_comments( request=request, project_uuid=path_params.project_uuid, offset=query_params.offset, @@ -165,7 +165,7 @@ async def update_project_comment(request: web.Request): include_state=False, ) - updated_comment = await _comments_api.update_project_comment( + updated_comment = await _comments_service.update_project_comment( request=request, comment_id=path_params.comment_id, project_uuid=path_params.project_uuid, @@ -195,7 +195,7 @@ async def delete_project_comment(request: web.Request): include_state=False, ) - await _comments_api.delete_project_comment( + await _comments_service.delete_project_comment( request=request, comment_id=path_params.comment_id, ) @@ -223,7 +223,7 @@ async def get_project_comment(request: web.Request): include_state=False, ) - comment = await _comments_api.get_project_comment( + comment = await _comments_service.get_project_comment( request=request, comment_id=path_params.comment_id, ) diff --git a/services/web/server/src/simcore_service_webserver/projects/_comments_api.py b/services/web/server/src/simcore_service_webserver/projects/_comments_service.py similarity index 95% rename from services/web/server/src/simcore_service_webserver/projects/_comments_api.py rename to services/web/server/src/simcore_service_webserver/projects/_comments_service.py index 55cfedac30c..c318465459a 100644 --- a/services/web/server/src/simcore_service_webserver/projects/_comments_api.py +++ b/services/web/server/src/simcore_service_webserver/projects/_comments_service.py @@ -39,9 +39,9 @@ async def list_project_comments( ) -> list[ProjectsCommentsAPI]: db: ProjectDBAPI = request.app[APP_PROJECT_DBAPI] - projects_comments_db_model: list[ - ProjectsCommentsDB - ] = await db.list_project_comments(project_uuid, offset, limit) + projects_comments_db_model: list[ProjectsCommentsDB] = ( + await db.list_project_comments(project_uuid, offset, limit) + ) projects_comments_api_model = [ ProjectsCommentsAPI(**comment.model_dump()) for comment in projects_comments_db_model diff --git a/services/web/server/src/simcore_service_webserver/projects/_controller/_folders_rest.py b/services/web/server/src/simcore_service_webserver/projects/_controller/_folders_rest.py index 1343efc23f5..bee68a87ccc 100644 --- a/services/web/server/src/simcore_service_webserver/projects/_controller/_folders_rest.py +++ b/services/web/server/src/simcore_service_webserver/projects/_controller/_folders_rest.py @@ -11,7 +11,7 @@ from ..._meta import api_version_prefix as VTAG from ...login.decorators import login_required from ...security.decorators import permission_required -from .. import _folders_api +from .. import _folders_service from .._common.exceptions_handlers import handle_plugin_requests_exceptions from .._common.models import RequestContext @@ -43,7 +43,7 @@ async def replace_project_folder(request: web.Request): req_ctx = RequestContext.model_validate(request) path_params = parse_request_path_parameters_as(_ProjectsFoldersPathParams, request) - await _folders_api.move_project_into_folder( + await _folders_service.move_project_into_folder( app=request.app, user_id=req_ctx.user_id, project_id=path_params.project_id, diff --git a/services/web/server/src/simcore_service_webserver/projects/_controller/_groups_rest.py b/services/web/server/src/simcore_service_webserver/projects/_controller/_groups_rest.py index af902d43101..75417314720 100644 --- a/services/web/server/src/simcore_service_webserver/projects/_controller/_groups_rest.py +++ b/services/web/server/src/simcore_service_webserver/projects/_controller/_groups_rest.py @@ -16,10 +16,10 @@ from ...login.decorators import login_required from ...security.decorators import permission_required from ...utils_aiohttp import envelope_json_response -from .. import _groups_api +from .. import _groups_service from .._common.exceptions_handlers import handle_plugin_requests_exceptions from .._common.models import ProjectPathParams, RequestContext -from .._groups_api import ProjectGroupGet +from .._groups_service import ProjectGroupGet _logger = logging.getLogger(__name__) @@ -55,7 +55,7 @@ async def create_project_group(request: web.Request): path_params = parse_request_path_parameters_as(_ProjectsGroupsPathParams, request) body_params = await parse_request_body_as(_ProjectsGroupsBodyParams, request) - project_groups: ProjectGroupGet = await _groups_api.create_project_group( + project_groups: ProjectGroupGet = await _groups_service.create_project_group( request.app, user_id=req_ctx.user_id, project_id=path_params.project_id, @@ -78,7 +78,7 @@ async def list_project_groups(request: web.Request): path_params = parse_request_path_parameters_as(ProjectPathParams, request) project_groups: list[ProjectGroupGet] = ( - await _groups_api.list_project_groups_by_user_and_project( + await _groups_service.list_project_groups_by_user_and_project( request.app, user_id=req_ctx.user_id, project_id=path_params.project_id, @@ -101,7 +101,7 @@ async def replace_project_group(request: web.Request): path_params = parse_request_path_parameters_as(_ProjectsGroupsPathParams, request) body_params = await parse_request_body_as(_ProjectsGroupsBodyParams, request) - return await _groups_api.replace_project_group( + return await _groups_service.replace_project_group( app=request.app, user_id=req_ctx.user_id, project_id=path_params.project_id, @@ -124,7 +124,7 @@ async def delete_project_group(request: web.Request): req_ctx = RequestContext.model_validate(request) path_params = parse_request_path_parameters_as(_ProjectsGroupsPathParams, request) - await _groups_api.delete_project_group( + await _groups_service.delete_project_group( app=request.app, user_id=req_ctx.user_id, project_id=path_params.project_id, diff --git a/services/web/server/src/simcore_service_webserver/projects/_controller/_metadata_rest.py b/services/web/server/src/simcore_service_webserver/projects/_controller/_metadata_rest.py index 12f4178e454..a9dfb2c4c55 100644 --- a/services/web/server/src/simcore_service_webserver/projects/_controller/_metadata_rest.py +++ b/services/web/server/src/simcore_service_webserver/projects/_controller/_metadata_rest.py @@ -27,7 +27,7 @@ from ...login.decorators import login_required from ...security.decorators import permission_required from ...utils_aiohttp import envelope_json_response -from .. import _metadata_api +from .. import _metadata_service from .._common.exceptions_handlers import handle_plugin_requests_exceptions from .._common.models import ProjectPathParams, RequestContext @@ -52,7 +52,7 @@ async def get_project_metadata(request: web.Request) -> web.Response: req_ctx = RequestContext.model_validate(request) path_params = parse_request_path_parameters_as(ProjectPathParams, request) - custom_metadata = await _metadata_api.get_project_custom_metadata( + custom_metadata = await _metadata_service.get_project_custom_metadata( request.app, user_id=req_ctx.user_id, project_uuid=path_params.project_id ) @@ -73,14 +73,14 @@ async def update_project_metadata(request: web.Request) -> web.Response: path_params = parse_request_path_parameters_as(ProjectPathParams, request) update = await parse_request_body_as(ProjectMetadataUpdate, request) - custom_metadata = await _metadata_api.set_project_custom_metadata( + custom_metadata = await _metadata_service.set_project_custom_metadata( request.app, user_id=req_ctx.user_id, project_uuid=path_params.project_id, value=update.custom, ) with log_catch(_logger, reraise=False): - await _metadata_api.set_project_ancestors_from_custom_metadata( + await _metadata_service.set_project_ancestors_from_custom_metadata( request.app, user_id=req_ctx.user_id, project_uuid=path_params.project_id, diff --git a/services/web/server/src/simcore_service_webserver/projects/_controller/_nodes_rest.py b/services/web/server/src/simcore_service_webserver/projects/_controller/_nodes_rest.py index fd14172dae9..7f7816b67cb 100644 --- a/services/web/server/src/simcore_service_webserver/projects/_controller/_nodes_rest.py +++ b/services/web/server/src/simcore_service_webserver/projects/_controller/_nodes_rest.py @@ -65,12 +65,12 @@ from ...security.decorators import permission_required from ...users.api import get_user_id_from_gid, get_user_role from ...utils_aiohttp import envelope_json_response -from .. import _access_rights_api as access_rights_service -from .. import _nodes_api as _nodes_service +from .. import _access_rights_service as access_rights_service +from .. import _nodes_service as _nodes_service from .. import nodes_utils, projects_service from .._common.exceptions_handlers import handle_plugin_requests_exceptions from .._common.models import ProjectPathParams, RequestContext -from .._nodes_api import NodeScreenshot, get_node_screenshots +from .._nodes_service import NodeScreenshot, get_node_screenshots from ..api import has_user_project_access_rights from ..exceptions import ( NodeNotFoundError, diff --git a/services/web/server/src/simcore_service_webserver/projects/_controller/_ports_rest.py b/services/web/server/src/simcore_service_webserver/projects/_controller/_ports_rest.py index 1d48f17cf1d..da33c4c5684 100644 --- a/services/web/server/src/simcore_service_webserver/projects/_controller/_ports_rest.py +++ b/services/web/server/src/simcore_service_webserver/projects/_controller/_ports_rest.py @@ -29,8 +29,8 @@ from ...login.decorators import login_required from ...security.decorators import permission_required from ...utils_aiohttp import envelope_json_response -from .. import _ports_api, projects_service -from .._access_rights_api import check_user_project_permission +from .. import _ports_service, projects_service +from .._access_rights_service import check_user_project_permission from .._common.exceptions_handlers import handle_plugin_requests_exceptions from .._common.models import ProjectPathParams, RequestContext from ..db import ProjectDBAPI @@ -72,7 +72,7 @@ async def get_project_inputs(request: web.Request) -> web.Response: workbench = await _get_validated_workbench_model( app=request.app, project_id=path_params.project_id, user_id=req_ctx.user_id ) - inputs: dict[NodeID, Any] = _ports_api.get_project_inputs(workbench) + inputs: dict[NodeID, Any] = _ports_service.get_project_inputs(workbench) return envelope_json_response( { @@ -99,7 +99,7 @@ async def update_project_inputs(request: web.Request) -> web.Response: workbench = await _get_validated_workbench_model( app=request.app, project_id=path_params.project_id, user_id=req_ctx.user_id ) - current_inputs: dict[NodeID, Any] = _ports_api.get_project_inputs(workbench) + current_inputs: dict[NodeID, Any] = _ports_service.get_project_inputs(workbench) # build workbench patch partial_workbench_data = {} @@ -133,7 +133,7 @@ async def update_project_inputs(request: web.Request) -> web.Response: workbench = TypeAdapter(dict[NodeID, Node]).validate_python( updated_project["workbench"] ) - inputs: dict[NodeID, Any] = _ports_api.get_project_inputs(workbench) + inputs: dict[NodeID, Any] = _ports_service.get_project_inputs(workbench) return envelope_json_response( { @@ -163,7 +163,7 @@ async def get_project_outputs(request: web.Request) -> web.Response: workbench = await _get_validated_workbench_model( app=request.app, project_id=path_params.project_id, user_id=req_ctx.user_id ) - outputs: dict[NodeID, Any] = await _ports_api.get_project_outputs( + outputs: dict[NodeID, Any] = await _ports_service.get_project_outputs( request.app, project_id=path_params.project_id, workbench=workbench ) @@ -218,6 +218,6 @@ async def list_project_metadata_ports(request: web.Request) -> web.Response: kind=port.kind, content_schema=port.get_schema(), ) - for port in _ports_api.iter_project_ports(workbench) + for port in _ports_service.iter_project_ports(workbench) ] ) diff --git a/services/web/server/src/simcore_service_webserver/projects/_controller/_tags_rest.py b/services/web/server/src/simcore_service_webserver/projects/_controller/_tags_rest.py index af4373d0149..356551aaed5 100644 --- a/services/web/server/src/simcore_service_webserver/projects/_controller/_tags_rest.py +++ b/services/web/server/src/simcore_service_webserver/projects/_controller/_tags_rest.py @@ -10,7 +10,7 @@ from ...login.decorators import login_required from ...security.decorators import permission_required from ...utils_aiohttp import envelope_json_response -from .. import _tags_api as tags_api +from .. import _tags_service as tags_api from .._common.exceptions_handlers import handle_plugin_requests_exceptions _logger = logging.getLogger(__name__) diff --git a/services/web/server/src/simcore_service_webserver/projects/_controller/_workspaces_rest.py b/services/web/server/src/simcore_service_webserver/projects/_controller/_workspaces_rest.py index b6ed4a0ad93..95082b66c88 100644 --- a/services/web/server/src/simcore_service_webserver/projects/_controller/_workspaces_rest.py +++ b/services/web/server/src/simcore_service_webserver/projects/_controller/_workspaces_rest.py @@ -12,7 +12,7 @@ from ..._meta import api_version_prefix as VTAG from ...login.decorators import login_required from ...security.decorators import permission_required -from .. import _workspaces_api +from .. import _workspaces_service from .._common.exceptions_handlers import handle_plugin_requests_exceptions from .._common.models import RequestContext @@ -44,7 +44,7 @@ async def move_project_to_workspace(request: web.Request): _ProjectWorkspacesPathParams, request ) - await _workspaces_api.move_project_into_workspace( + await _workspaces_service.move_project_into_workspace( app=request.app, user_id=req_ctx.user_id, project_id=path_params.project_id, diff --git a/services/web/server/src/simcore_service_webserver/projects/_crud_api_create.py b/services/web/server/src/simcore_service_webserver/projects/_crud_api_create.py index 711b5b0f64c..e77df91ae20 100644 --- a/services/web/server/src/simcore_service_webserver/projects/_crud_api_create.py +++ b/services/web/server/src/simcore_service_webserver/projects/_crud_api_create.py @@ -41,7 +41,7 @@ from ..workspaces.errors import WorkspaceAccessForbiddenError from . import _folders_db as project_to_folders_db from . import projects_service -from ._metadata_api import set_project_ancestors +from ._metadata_service import set_project_ancestors from ._permalink_service import update_or_pop_permalink_in_project from .db import ProjectDBAPI from .exceptions import ( diff --git a/services/web/server/src/simcore_service_webserver/projects/_crud_api_delete.py b/services/web/server/src/simcore_service_webserver/projects/_crud_api_delete.py index f8e5f727603..d438fdddac6 100644 --- a/services/web/server/src/simcore_service_webserver/projects/_crud_api_delete.py +++ b/services/web/server/src/simcore_service_webserver/projects/_crud_api_delete.py @@ -1,4 +1,4 @@ -""" Implements logic to delete a project (and all associated services, data, etc) +"""Implements logic to delete a project (and all associated services, data, etc) NOTE: this entire module is protected within the `projects` package @@ -17,7 +17,7 @@ from ..storage.api import delete_data_folders_of_project from ..users.api import FullNameDict from ..users.exceptions import UserNotFoundError -from ._access_rights_api import check_user_project_permission +from ._access_rights_service import check_user_project_permission from .db import ProjectDBAPI from .exceptions import ( ProjectDeleteError, @@ -44,8 +44,7 @@ async def __call__( *, notify_users: bool = True, user_name: FullNameDict | None = None, - ) -> None: - ... + ) -> None: ... async def mark_project_as_deleted( diff --git a/services/web/server/src/simcore_service_webserver/projects/_folders_api.py b/services/web/server/src/simcore_service_webserver/projects/_folders_service.py similarity index 97% rename from services/web/server/src/simcore_service_webserver/projects/_folders_api.py rename to services/web/server/src/simcore_service_webserver/projects/_folders_service.py index 7595f31d94d..3ce644f70ef 100644 --- a/services/web/server/src/simcore_service_webserver/projects/_folders_api.py +++ b/services/web/server/src/simcore_service_webserver/projects/_folders_service.py @@ -7,8 +7,8 @@ from models_library.users import UserID from ..folders import _folders_repository as _folders_repository -from ..projects._access_rights_api import get_user_project_access_rights from . import _folders_db as project_to_folders_db +from ._access_rights_service import get_user_project_access_rights from .db import APP_PROJECT_DBAPI, ProjectDBAPI from .exceptions import ProjectInvalidRightsError diff --git a/services/web/server/src/simcore_service_webserver/projects/_groups_api.py b/services/web/server/src/simcore_service_webserver/projects/_groups_service.py similarity index 96% rename from services/web/server/src/simcore_service_webserver/projects/_groups_api.py rename to services/web/server/src/simcore_service_webserver/projects/_groups_service.py index 355b25481f6..b79a51c42e1 100644 --- a/services/web/server/src/simcore_service_webserver/projects/_groups_api.py +++ b/services/web/server/src/simcore_service_webserver/projects/_groups_service.py @@ -10,7 +10,7 @@ from ..users import api as users_api from . import _groups_db as projects_groups_db -from ._access_rights_api import check_user_project_permission +from ._access_rights_service import check_user_project_permission from ._groups_db import ProjectGroupGetDB from .db import APP_PROJECT_DBAPI, ProjectDBAPI from .exceptions import ProjectInvalidRightsError @@ -76,9 +76,9 @@ async def list_project_groups_by_user_and_project( permission="read", ) - project_groups_db: list[ - ProjectGroupGetDB - ] = await projects_groups_db.list_project_groups(app=app, project_id=project_id) + project_groups_db: list[ProjectGroupGetDB] = ( + await projects_groups_db.list_project_groups(app=app, project_id=project_id) + ) project_groups_api: list[ProjectGroupGet] = [ ProjectGroupGet.model_validate(group.model_dump()) diff --git a/services/web/server/src/simcore_service_webserver/projects/_metadata_api.py b/services/web/server/src/simcore_service_webserver/projects/_metadata_service.py similarity index 98% rename from services/web/server/src/simcore_service_webserver/projects/_metadata_api.py rename to services/web/server/src/simcore_service_webserver/projects/_metadata_service.py index f17c7941a1d..ab4b89e2eaf 100644 --- a/services/web/server/src/simcore_service_webserver/projects/_metadata_api.py +++ b/services/web/server/src/simcore_service_webserver/projects/_metadata_service.py @@ -10,7 +10,7 @@ from ..db.plugin import get_database_engine from . import _metadata_db -from ._access_rights_api import validate_project_ownership +from ._access_rights_service import validate_project_ownership _logger = logging.getLogger(__name__) diff --git a/services/web/server/src/simcore_service_webserver/projects/_nodes_api.py b/services/web/server/src/simcore_service_webserver/projects/_nodes_service.py similarity index 100% rename from services/web/server/src/simcore_service_webserver/projects/_nodes_api.py rename to services/web/server/src/simcore_service_webserver/projects/_nodes_service.py diff --git a/services/web/server/src/simcore_service_webserver/projects/_ports_api.py b/services/web/server/src/simcore_service_webserver/projects/_ports_service.py similarity index 100% rename from services/web/server/src/simcore_service_webserver/projects/_ports_api.py rename to services/web/server/src/simcore_service_webserver/projects/_ports_service.py diff --git a/services/web/server/src/simcore_service_webserver/projects/_tags_api.py b/services/web/server/src/simcore_service_webserver/projects/_tags_service.py similarity index 95% rename from services/web/server/src/simcore_service_webserver/projects/_tags_api.py rename to services/web/server/src/simcore_service_webserver/projects/_tags_service.py index 93bf232706b..5693a8680a3 100644 --- a/services/web/server/src/simcore_service_webserver/projects/_tags_api.py +++ b/services/web/server/src/simcore_service_webserver/projects/_tags_service.py @@ -1,6 +1,4 @@ -""" Handlers for CRUD operations on /projects/{*}/tags/{*} - -""" +"""Handlers for CRUD operations on /projects/{*}/tags/{*}""" import logging @@ -10,7 +8,7 @@ from models_library.workspaces import UserWorkspaceWithAccessRights from ..workspaces import _workspaces_repository as workspaces_db -from ._access_rights_api import check_user_project_permission +from ._access_rights_service import check_user_project_permission from .db import ProjectDBAPI from .models import ProjectDict diff --git a/services/web/server/src/simcore_service_webserver/projects/_trash_service.py b/services/web/server/src/simcore_service_webserver/projects/_trash_service.py index 1ec1c81d534..27e486809e9 100644 --- a/services/web/server/src/simcore_service_webserver/projects/_trash_service.py +++ b/services/web/server/src/simcore_service_webserver/projects/_trash_service.py @@ -18,7 +18,7 @@ from . import _crud_api_read from . import _projects_db as _projects_repository from . import _projects_service_delete, projects_service -from ._access_rights_api import check_user_project_permission +from ._access_rights_service import check_user_project_permission from ._projects_db import _OLDEST_TRASHED_FIRST from .exceptions import ( ProjectNotFoundError, diff --git a/services/web/server/src/simcore_service_webserver/projects/_wallets_api.py b/services/web/server/src/simcore_service_webserver/projects/_wallets_service.py similarity index 100% rename from services/web/server/src/simcore_service_webserver/projects/_wallets_api.py rename to services/web/server/src/simcore_service_webserver/projects/_wallets_service.py diff --git a/services/web/server/src/simcore_service_webserver/projects/_workspaces_api.py b/services/web/server/src/simcore_service_webserver/projects/_workspaces_service.py similarity index 97% rename from services/web/server/src/simcore_service_webserver/projects/_workspaces_api.py rename to services/web/server/src/simcore_service_webserver/projects/_workspaces_service.py index 1462168fa52..78219ffefd1 100644 --- a/services/web/server/src/simcore_service_webserver/projects/_workspaces_api.py +++ b/services/web/server/src/simcore_service_webserver/projects/_workspaces_service.py @@ -8,12 +8,12 @@ from simcore_postgres_database.utils_repos import transaction_context from ..db.plugin import get_asyncpg_engine -from ..projects._access_rights_api import get_user_project_access_rights from ..users.api import get_user from ..workspaces.api import check_user_workspace_access from . import _folders_db as project_to_folders_db from . import _groups_db as project_groups_db from . import _projects_db +from ._access_rights_service import get_user_project_access_rights from .exceptions import ProjectInvalidRightsError _logger = logging.getLogger(__name__) diff --git a/services/web/server/src/simcore_service_webserver/projects/api.py b/services/web/server/src/simcore_service_webserver/projects/api.py index 52b6dbf9109..bde3efa68d9 100644 --- a/services/web/server/src/simcore_service_webserver/projects/api.py +++ b/services/web/server/src/simcore_service_webserver/projects/api.py @@ -1,15 +1,15 @@ # NOTE: we will slowly move heere projects_api.py -from ._access_rights_api import ( +from ._access_rights_service import ( check_user_project_permission, has_user_project_access_rights, ) -from ._groups_api import ( +from ._groups_service import ( create_project_group_without_checking_permissions, delete_project_group_without_checking_permissions, ) -from ._wallets_api import ( +from ._wallets_service import ( check_project_financial_status, connect_wallet_to_project, get_project_wallet, diff --git a/services/web/server/src/simcore_service_webserver/projects/projects_service.py b/services/web/server/src/simcore_service_webserver/projects/projects_service.py index c29ffb62785..82a74aa36ec 100644 --- a/services/web/server/src/simcore_service_webserver/projects/projects_service.py +++ b/services/web/server/src/simcore_service_webserver/projects/projects_service.py @@ -125,12 +125,12 @@ from ..workspaces import _workspaces_repository as workspaces_db from . import ( _crud_api_delete, - _nodes_api, + _nodes_service, _projects_db, _projects_nodes_repository, - _wallets_api, + _wallets_service, ) -from ._access_rights_api import ( +from ._access_rights_service import ( check_user_project_permission, has_user_project_access_rights, ) @@ -629,10 +629,10 @@ async def _start_dynamic_service( # noqa: C901 @exclusive( get_redis_lock_manager_client_sdk(request.app), - lock_key=_nodes_api.get_service_start_lock_key(user_id, project_uuid), + lock_key=_nodes_service.get_service_start_lock_key(user_id, project_uuid), blocking=True, blocking_timeout=datetime.timedelta( - seconds=_nodes_api.get_total_project_dynamic_nodes_creation_interval( + seconds=_nodes_service.get_total_project_dynamic_nodes_creation_interval( get_plugin_settings(request.app).PROJECTS_MAX_NUM_RUNNING_DYNAMIC_NODES ) ), @@ -641,7 +641,7 @@ async def _() -> None: project_running_nodes = await dynamic_scheduler_api.list_dynamic_services( request.app, user_id=user_id, project_id=project_uuid ) - _nodes_api.check_num_service_per_projects_limit( + _nodes_service.check_num_service_per_projects_limit( app=request.app, number_of_services=len(project_running_nodes), user_id=user_id, @@ -657,7 +657,7 @@ async def _() -> None: and app_settings.WEBSERVER_CREDIT_COMPUTATION_ENABLED ): # Deal with Wallet - project_wallet = await _wallets_api.get_project_wallet( + project_wallet = await _wallets_service.get_project_wallet( request.app, project_id=project_uuid ) if project_wallet is None: @@ -672,7 +672,7 @@ async def _() -> None: project_wallet_id = TypeAdapter(WalletID).validate_python( user_default_wallet_preference.value ) - await _wallets_api.connect_wallet_to_project( + await _wallets_service.connect_wallet_to_project( request.app, product_name=product_name, project_id=project_uuid, diff --git a/services/web/server/tests/unit/isolated/test_projects__nodes_api.py b/services/web/server/tests/unit/isolated/test_projects__nodes_api.py index 27f8df86ace..610575306e6 100644 --- a/services/web/server/tests/unit/isolated/test_projects__nodes_api.py +++ b/services/web/server/tests/unit/isolated/test_projects__nodes_api.py @@ -3,7 +3,7 @@ import pytest from models_library.api_schemas_storage.storage_schemas import FileMetaDataGet -from simcore_service_webserver.projects._nodes_api import ( +from simcore_service_webserver.projects._nodes_service import ( _SUPPORTED_PREVIEW_FILE_EXTENSIONS, _FileWithThumbnail, _get_files_with_thumbnails, diff --git a/services/web/server/tests/unit/with_dbs/02/test_projects__ports_api.py b/services/web/server/tests/unit/with_dbs/02/test_projects__ports_api.py index 0ff4d0f28f8..ec4eabc9665 100644 --- a/services/web/server/tests/unit/with_dbs/02/test_projects__ports_api.py +++ b/services/web/server/tests/unit/with_dbs/02/test_projects__ports_api.py @@ -9,7 +9,7 @@ import pytest from models_library.projects_nodes import Node, NodeID from models_library.utils.json_schema import jsonschema_validate_schema -from simcore_service_webserver.projects._ports_api import ( +from simcore_service_webserver.projects._ports_service import ( InvalidInputValue, _get_outputs_in_workbench, get_project_inputs, diff --git a/services/web/server/tests/unit/with_dbs/02/test_projects_crud_handlers__clone_in_workspace_and_folder.py b/services/web/server/tests/unit/with_dbs/02/test_projects_crud_handlers__clone_in_workspace_and_folder.py index 15542cff620..fa7ed48abeb 100644 --- a/services/web/server/tests/unit/with_dbs/02/test_projects_crud_handlers__clone_in_workspace_and_folder.py +++ b/services/web/server/tests/unit/with_dbs/02/test_projects_crud_handlers__clone_in_workspace_and_folder.py @@ -21,7 +21,7 @@ from simcore_postgres_database.models.workspaces import workspaces from simcore_service_webserver.db.models import UserRole from simcore_service_webserver.folders._folders_service import create_folder -from simcore_service_webserver.projects._folders_api import move_project_into_folder +from simcore_service_webserver.projects._folders_service import move_project_into_folder from simcore_service_webserver.projects.models import ProjectDict from simcore_service_webserver.workspaces._workspaces_service import create_workspace from yarl import URL diff --git a/services/web/server/tests/unit/with_dbs/03/trash/test_trash.py b/services/web/server/tests/unit/with_dbs/03/trash/test_trash.py index 86cfb24dd24..01ca261f80e 100644 --- a/services/web/server/tests/unit/with_dbs/03/trash/test_trash.py +++ b/services/web/server/tests/unit/with_dbs/03/trash/test_trash.py @@ -23,7 +23,7 @@ from pytest_simcore.helpers.webserver_login import UserInfoDict from servicelib.aiohttp import status from simcore_service_webserver.db.models import UserRole -from simcore_service_webserver.projects._groups_api import ProjectGroupGet +from simcore_service_webserver.projects._groups_service import ProjectGroupGet from simcore_service_webserver.projects.models import ProjectDict from tenacity import AsyncRetrying, stop_after_attempt, wait_fixed from yarl import URL From a2db406eca68513d103ef063d531bfadc12c05cd Mon Sep 17 00:00:00 2001 From: Pedro Crespo-Valero <32402063+pcrespov@users.noreply.github.com> Date: Fri, 21 Mar 2025 14:32:13 +0100 Subject: [PATCH 05/39] rest exceptions --- api/specs/web-server/_projects.py | 6 ++--- api/specs/web-server/_trash.py | 23 +++++++------------ .../projects/_comments_rest.py | 2 +- .../projects/_controller/_folders_rest.py | 2 +- .../projects/_controller/_groups_rest.py | 2 +- .../projects/_controller/_metadata_rest.py | 2 +- .../projects/_controller/_nodes_rest.py | 2 +- .../projects/_controller/_ports_rest.py | 2 +- .../_projects_nodes_pricing_unit_rest.py | 2 +- .../projects/_controller/_projects_rest.py | 2 +- .../_controller/_projects_states_rest.py | 2 +- .../_rest_exceptions.py} | 0 .../projects/_controller/_tags_rest.py | 2 +- .../projects/_controller/_workspaces_rest.py | 2 +- 14 files changed, 22 insertions(+), 29 deletions(-) rename services/web/server/src/simcore_service_webserver/projects/{_common/exceptions_handlers.py => _controller/_rest_exceptions.py} (100%) diff --git a/api/specs/web-server/_projects.py b/api/specs/web-server/_projects.py index 845a218390a..e3b7ecfd4e7 100644 --- a/api/specs/web-server/_projects.py +++ b/api/specs/web-server/_projects.py @@ -31,13 +31,13 @@ from models_library.rest_pagination import Page from pydantic import BaseModel from simcore_service_webserver._meta import API_VTAG -from simcore_service_webserver.projects._common.exceptions_handlers import ( - _TO_HTTP_ERROR_MAP, -) from simcore_service_webserver.projects._common.models import ProjectPathParams from simcore_service_webserver.projects._controller._projects_rest import ( ProjectCreateQueryParams, ) +from simcore_service_webserver.projects._controller._rest_exceptions import ( + _TO_HTTP_ERROR_MAP, +) from simcore_service_webserver.projects._crud_handlers_models import ( ProjectActiveQueryParams, ProjectsListQueryParams, diff --git a/api/specs/web-server/_trash.py b/api/specs/web-server/_trash.py index 193d994d55c..983db403e15 100644 --- a/api/specs/web-server/_trash.py +++ b/api/specs/web-server/_trash.py @@ -15,7 +15,7 @@ FoldersPathParams, FolderTrashQueryParams, ) -from simcore_service_webserver.projects._common.exceptions_handlers import ( +from simcore_service_webserver.projects._controller._rest_exceptions import ( _TO_HTTP_ERROR_MAP, ) from simcore_service_webserver.projects._trash_rest import ProjectPathParams @@ -37,8 +37,7 @@ "/trash:empty", status_code=status.HTTP_204_NO_CONTENT, ) -def empty_trash(): - ... +def empty_trash(): ... _extra_tags: list[str | Enum] = ["projects"] @@ -66,8 +65,7 @@ def empty_trash(): def trash_project( _path: Annotated[ProjectPathParams, Depends()], _query: Annotated[RemoveQueryParams, Depends()], -): - ... +): ... @router.post( @@ -77,8 +75,7 @@ def trash_project( ) def untrash_project( _path: Annotated[ProjectPathParams, Depends()], -): - ... +): ... _extra_tags = ["folders"] @@ -99,8 +96,7 @@ def untrash_project( def trash_folder( _path: Annotated[FoldersPathParams, Depends()], _query: Annotated[FolderTrashQueryParams, Depends()], -): - ... +): ... @router.post( @@ -110,8 +106,7 @@ def trash_folder( ) def untrash_folder( _path: Annotated[FoldersPathParams, Depends()], -): - ... +): ... _extra_tags = ["workspaces"] @@ -132,8 +127,7 @@ def untrash_folder( def trash_workspace( _path: Annotated[WorkspacesPathParams, Depends()], _query: Annotated[WorkspaceTrashQueryParams, Depends()], -): - ... +): ... @router.post( @@ -143,5 +137,4 @@ def trash_workspace( ) def untrash_workspace( _path: Annotated[WorkspacesPathParams, Depends()], -): - ... +): ... diff --git a/services/web/server/src/simcore_service_webserver/projects/_comments_rest.py b/services/web/server/src/simcore_service_webserver/projects/_comments_rest.py index 2a428995ade..214846addcd 100644 --- a/services/web/server/src/simcore_service_webserver/projects/_comments_rest.py +++ b/services/web/server/src/simcore_service_webserver/projects/_comments_rest.py @@ -27,8 +27,8 @@ from ..security.decorators import permission_required from ..utils_aiohttp import envelope_json_response from . import _comments_service, projects_service -from ._common.exceptions_handlers import handle_plugin_requests_exceptions from ._common.models import RequestContext +from ._controller._rest_exceptions import handle_plugin_requests_exceptions _logger = logging.getLogger(__name__) diff --git a/services/web/server/src/simcore_service_webserver/projects/_controller/_folders_rest.py b/services/web/server/src/simcore_service_webserver/projects/_controller/_folders_rest.py index bee68a87ccc..d08a405b05c 100644 --- a/services/web/server/src/simcore_service_webserver/projects/_controller/_folders_rest.py +++ b/services/web/server/src/simcore_service_webserver/projects/_controller/_folders_rest.py @@ -12,8 +12,8 @@ from ...login.decorators import login_required from ...security.decorators import permission_required from .. import _folders_service -from .._common.exceptions_handlers import handle_plugin_requests_exceptions from .._common.models import RequestContext +from ._rest_exceptions import handle_plugin_requests_exceptions _logger = logging.getLogger(__name__) diff --git a/services/web/server/src/simcore_service_webserver/projects/_controller/_groups_rest.py b/services/web/server/src/simcore_service_webserver/projects/_controller/_groups_rest.py index 75417314720..7dfe26547d9 100644 --- a/services/web/server/src/simcore_service_webserver/projects/_controller/_groups_rest.py +++ b/services/web/server/src/simcore_service_webserver/projects/_controller/_groups_rest.py @@ -17,9 +17,9 @@ from ...security.decorators import permission_required from ...utils_aiohttp import envelope_json_response from .. import _groups_service -from .._common.exceptions_handlers import handle_plugin_requests_exceptions from .._common.models import ProjectPathParams, RequestContext from .._groups_service import ProjectGroupGet +from ._rest_exceptions import handle_plugin_requests_exceptions _logger = logging.getLogger(__name__) diff --git a/services/web/server/src/simcore_service_webserver/projects/_controller/_metadata_rest.py b/services/web/server/src/simcore_service_webserver/projects/_controller/_metadata_rest.py index a9dfb2c4c55..96e6ec3bb17 100644 --- a/services/web/server/src/simcore_service_webserver/projects/_controller/_metadata_rest.py +++ b/services/web/server/src/simcore_service_webserver/projects/_controller/_metadata_rest.py @@ -28,8 +28,8 @@ from ...security.decorators import permission_required from ...utils_aiohttp import envelope_json_response from .. import _metadata_service -from .._common.exceptions_handlers import handle_plugin_requests_exceptions from .._common.models import ProjectPathParams, RequestContext +from ._rest_exceptions import handle_plugin_requests_exceptions routes = web.RouteTableDef() diff --git a/services/web/server/src/simcore_service_webserver/projects/_controller/_nodes_rest.py b/services/web/server/src/simcore_service_webserver/projects/_controller/_nodes_rest.py index 7f7816b67cb..f664306dbef 100644 --- a/services/web/server/src/simcore_service_webserver/projects/_controller/_nodes_rest.py +++ b/services/web/server/src/simcore_service_webserver/projects/_controller/_nodes_rest.py @@ -68,7 +68,6 @@ from .. import _access_rights_service as access_rights_service from .. import _nodes_service as _nodes_service from .. import nodes_utils, projects_service -from .._common.exceptions_handlers import handle_plugin_requests_exceptions from .._common.models import ProjectPathParams, RequestContext from .._nodes_service import NodeScreenshot, get_node_screenshots from ..api import has_user_project_access_rights @@ -77,6 +76,7 @@ ProjectNodeResourcesInsufficientRightsError, ProjectNodeResourcesInvalidError, ) +from ._rest_exceptions import handle_plugin_requests_exceptions _logger = logging.getLogger(__name__) diff --git a/services/web/server/src/simcore_service_webserver/projects/_controller/_ports_rest.py b/services/web/server/src/simcore_service_webserver/projects/_controller/_ports_rest.py index da33c4c5684..a0ce08ccc57 100644 --- a/services/web/server/src/simcore_service_webserver/projects/_controller/_ports_rest.py +++ b/services/web/server/src/simcore_service_webserver/projects/_controller/_ports_rest.py @@ -31,10 +31,10 @@ from ...utils_aiohttp import envelope_json_response from .. import _ports_service, projects_service from .._access_rights_service import check_user_project_permission -from .._common.exceptions_handlers import handle_plugin_requests_exceptions from .._common.models import ProjectPathParams, RequestContext from ..db import ProjectDBAPI from ..models import ProjectDict +from ._rest_exceptions import handle_plugin_requests_exceptions log = logging.getLogger(__name__) diff --git a/services/web/server/src/simcore_service_webserver/projects/_controller/_projects_nodes_pricing_unit_rest.py b/services/web/server/src/simcore_service_webserver/projects/_controller/_projects_nodes_pricing_unit_rest.py index 72693231a83..0a1c7cadcf8 100644 --- a/services/web/server/src/simcore_service_webserver/projects/_controller/_projects_nodes_pricing_unit_rest.py +++ b/services/web/server/src/simcore_service_webserver/projects/_controller/_projects_nodes_pricing_unit_rest.py @@ -17,10 +17,10 @@ from ...security.decorators import permission_required from ...utils_aiohttp import envelope_json_response from .. import projects_service -from .._common.exceptions_handlers import handle_plugin_requests_exceptions from .._common.models import RequestContext from ..db import ProjectDBAPI from ._nodes_rest import NodePathParams +from ._rest_exceptions import handle_plugin_requests_exceptions _logger = logging.getLogger(__name__) diff --git a/services/web/server/src/simcore_service_webserver/projects/_controller/_projects_rest.py b/services/web/server/src/simcore_service_webserver/projects/_controller/_projects_rest.py index 9b86204fc0d..8654ac5630e 100644 --- a/services/web/server/src/simcore_service_webserver/projects/_controller/_projects_rest.py +++ b/services/web/server/src/simcore_service_webserver/projects/_controller/_projects_rest.py @@ -43,7 +43,6 @@ from ...users.api import get_user_fullname from ...utils_aiohttp import envelope_json_response from .. import _crud_api_create, _crud_api_read, projects_service -from .._common.exceptions_handlers import handle_plugin_requests_exceptions from .._common.models import ProjectPathParams, RequestContext from .._crud_handlers_models import ( ProjectActiveQueryParams, @@ -57,6 +56,7 @@ from ..models import ProjectDict from ..utils import get_project_unavailable_services, project_uses_available_services from . import _projects_rest_utils +from ._rest_exceptions import handle_plugin_requests_exceptions # When the user requests a project with a repo, the working copy might differ from # the repo project. A middleware in the meta module (if active) will resolve diff --git a/services/web/server/src/simcore_service_webserver/projects/_controller/_projects_states_rest.py b/services/web/server/src/simcore_service_webserver/projects/_controller/_projects_states_rest.py index 09e12e07aca..33b7c22eb06 100644 --- a/services/web/server/src/simcore_service_webserver/projects/_controller/_projects_states_rest.py +++ b/services/web/server/src/simcore_service_webserver/projects/_controller/_projects_states_rest.py @@ -32,9 +32,9 @@ from ...utils_aiohttp import envelope_json_response from .. import api as projects_api from .. import projects_service -from .._common.exceptions_handlers import handle_plugin_requests_exceptions from .._common.models import ProjectPathParams, RequestContext from ..exceptions import ProjectStartsTooManyDynamicNodesError +from ._rest_exceptions import handle_plugin_requests_exceptions _logger = logging.getLogger(__name__) diff --git a/services/web/server/src/simcore_service_webserver/projects/_common/exceptions_handlers.py b/services/web/server/src/simcore_service_webserver/projects/_controller/_rest_exceptions.py similarity index 100% rename from services/web/server/src/simcore_service_webserver/projects/_common/exceptions_handlers.py rename to services/web/server/src/simcore_service_webserver/projects/_controller/_rest_exceptions.py diff --git a/services/web/server/src/simcore_service_webserver/projects/_controller/_tags_rest.py b/services/web/server/src/simcore_service_webserver/projects/_controller/_tags_rest.py index 356551aaed5..7de6fd20454 100644 --- a/services/web/server/src/simcore_service_webserver/projects/_controller/_tags_rest.py +++ b/services/web/server/src/simcore_service_webserver/projects/_controller/_tags_rest.py @@ -11,7 +11,7 @@ from ...security.decorators import permission_required from ...utils_aiohttp import envelope_json_response from .. import _tags_service as tags_api -from .._common.exceptions_handlers import handle_plugin_requests_exceptions +from ._rest_exceptions import handle_plugin_requests_exceptions _logger = logging.getLogger(__name__) diff --git a/services/web/server/src/simcore_service_webserver/projects/_controller/_workspaces_rest.py b/services/web/server/src/simcore_service_webserver/projects/_controller/_workspaces_rest.py index 95082b66c88..071c45c7de8 100644 --- a/services/web/server/src/simcore_service_webserver/projects/_controller/_workspaces_rest.py +++ b/services/web/server/src/simcore_service_webserver/projects/_controller/_workspaces_rest.py @@ -13,8 +13,8 @@ from ...login.decorators import login_required from ...security.decorators import permission_required from .. import _workspaces_service -from .._common.exceptions_handlers import handle_plugin_requests_exceptions from .._common.models import RequestContext +from ._rest_exceptions import handle_plugin_requests_exceptions _logger = logging.getLogger(__name__) From ecb0c3b7be19cb127fe14c96b8118ea8a3075d0c Mon Sep 17 00:00:00 2001 From: Pedro Crespo-Valero <32402063+pcrespov@users.noreply.github.com> Date: Fri, 21 Mar 2025 14:34:21 +0100 Subject: [PATCH 06/39] controllers names --- api/specs/web-server/_projects.py | 6 +-- api/specs/web-server/_projects_folders.py | 2 +- api/specs/web-server/_projects_groups.py | 2 +- api/specs/web-server/_projects_metadata.py | 2 +- api/specs/web-server/_projects_nodes.py | 4 +- .../_projects_nodes_pricing_unit.py | 4 +- api/specs/web-server/_projects_ports.py | 2 +- api/specs/web-server/_projects_states.py | 2 +- api/specs/web-server/_projects_workspaces.py | 2 +- ..._projects_rest_utils.py => _rest_utils.py} | 0 .../{_folders_rest.py => folders_rest.py} | 0 .../{_groups_rest.py => groups_rest.py} | 0 .../{_metadata_rest.py => metadata_rest.py} | 0 ...nit_rest.py => nodes_pricing_unit_rest.py} | 2 +- .../{_nodes_rest.py => nodes_rest.py} | 0 .../{_ports_rest.py => ports_rest.py} | 0 .../{_projects_rest.py => projects_rest.py} | 10 ++--- .../projects_slot.py} | 10 ++--- ...states_rest.py => projects_states_rest.py} | 0 .../{_tags_rest.py => tags_rest.py} | 0 .../{_trash_rest.py => trash_rest.py} | 0 .../{_wallets_rest.py => wallets_rest.py} | 0 ..._workspaces_rest.py => workspaces_rest.py} | 0 .../projects/plugin.py | 42 +++++++++---------- .../02/test_projects_nodes_handler.py | 2 +- 25 files changed, 45 insertions(+), 47 deletions(-) rename services/web/server/src/simcore_service_webserver/projects/_controller/{_projects_rest_utils.py => _rest_utils.py} (100%) rename services/web/server/src/simcore_service_webserver/projects/_controller/{_folders_rest.py => folders_rest.py} (100%) rename services/web/server/src/simcore_service_webserver/projects/_controller/{_groups_rest.py => groups_rest.py} (100%) rename services/web/server/src/simcore_service_webserver/projects/_controller/{_metadata_rest.py => metadata_rest.py} (100%) rename services/web/server/src/simcore_service_webserver/projects/_controller/{_projects_nodes_pricing_unit_rest.py => nodes_pricing_unit_rest.py} (99%) rename services/web/server/src/simcore_service_webserver/projects/_controller/{_nodes_rest.py => nodes_rest.py} (100%) rename services/web/server/src/simcore_service_webserver/projects/_controller/{_ports_rest.py => ports_rest.py} (100%) rename services/web/server/src/simcore_service_webserver/projects/_controller/{_projects_rest.py => projects_rest.py} (98%) rename services/web/server/src/simcore_service_webserver/projects/{_observer.py => _controller/projects_slot.py} (85%) rename services/web/server/src/simcore_service_webserver/projects/_controller/{_projects_states_rest.py => projects_states_rest.py} (100%) rename services/web/server/src/simcore_service_webserver/projects/_controller/{_tags_rest.py => tags_rest.py} (100%) rename services/web/server/src/simcore_service_webserver/projects/_controller/{_trash_rest.py => trash_rest.py} (100%) rename services/web/server/src/simcore_service_webserver/projects/_controller/{_wallets_rest.py => wallets_rest.py} (100%) rename services/web/server/src/simcore_service_webserver/projects/_controller/{_workspaces_rest.py => workspaces_rest.py} (100%) diff --git a/api/specs/web-server/_projects.py b/api/specs/web-server/_projects.py index e3b7ecfd4e7..51ae3611ee7 100644 --- a/api/specs/web-server/_projects.py +++ b/api/specs/web-server/_projects.py @@ -32,12 +32,12 @@ from pydantic import BaseModel from simcore_service_webserver._meta import API_VTAG from simcore_service_webserver.projects._common.models import ProjectPathParams -from simcore_service_webserver.projects._controller._projects_rest import ( - ProjectCreateQueryParams, -) from simcore_service_webserver.projects._controller._rest_exceptions import ( _TO_HTTP_ERROR_MAP, ) +from simcore_service_webserver.projects._controller.projects_rest import ( + ProjectCreateQueryParams, +) from simcore_service_webserver.projects._crud_handlers_models import ( ProjectActiveQueryParams, ProjectsListQueryParams, diff --git a/api/specs/web-server/_projects_folders.py b/api/specs/web-server/_projects_folders.py index ff9b9a6b924..f3c5b337b49 100644 --- a/api/specs/web-server/_projects_folders.py +++ b/api/specs/web-server/_projects_folders.py @@ -13,7 +13,7 @@ from fastapi import APIRouter, Depends, status from simcore_service_webserver._meta import API_VTAG -from simcore_service_webserver.projects._controller._folders_rest import ( +from simcore_service_webserver.projects._controller.folders_rest import ( _ProjectsFoldersPathParams, ) diff --git a/api/specs/web-server/_projects_groups.py b/api/specs/web-server/_projects_groups.py index d4dda17e4ed..34eeaaf92b1 100644 --- a/api/specs/web-server/_projects_groups.py +++ b/api/specs/web-server/_projects_groups.py @@ -10,7 +10,7 @@ from models_library.generics import Envelope from simcore_service_webserver._meta import API_VTAG from simcore_service_webserver.projects._common.models import ProjectPathParams -from simcore_service_webserver.projects._controller._groups_rest import ( +from simcore_service_webserver.projects._controller.groups_rest import ( _ProjectsGroupsBodyParams, _ProjectsGroupsPathParams, ) diff --git a/api/specs/web-server/_projects_metadata.py b/api/specs/web-server/_projects_metadata.py index 9f1f719eb21..0e97d475aa3 100644 --- a/api/specs/web-server/_projects_metadata.py +++ b/api/specs/web-server/_projects_metadata.py @@ -18,7 +18,7 @@ ) from models_library.generics import Envelope from simcore_service_webserver._meta import API_VTAG -from simcore_service_webserver.projects._controller._metadata_rest import ( +from simcore_service_webserver.projects._controller.metadata_rest import ( ProjectPathParams, ) diff --git a/api/specs/web-server/_projects_nodes.py b/api/specs/web-server/_projects_nodes.py index 6b64d5d3154..454d7c4f733 100644 --- a/api/specs/web-server/_projects_nodes.py +++ b/api/specs/web-server/_projects_nodes.py @@ -26,12 +26,12 @@ from models_library.projects import ProjectID from models_library.projects_nodes_io import NodeID from simcore_service_webserver._meta import API_VTAG -from simcore_service_webserver.projects._controller._nodes_rest import ( +from simcore_service_webserver.projects._controller.nodes_rest import ( NodePathParams, _ProjectGroupAccess, _ProjectNodePreview, ) -from simcore_service_webserver.projects._controller._projects_rest import ( +from simcore_service_webserver.projects._controller.projects_rest import ( ProjectPathParams, ) diff --git a/api/specs/web-server/_projects_nodes_pricing_unit.py b/api/specs/web-server/_projects_nodes_pricing_unit.py index 7ad5e66cc42..91c7f0cdb19 100644 --- a/api/specs/web-server/_projects_nodes_pricing_unit.py +++ b/api/specs/web-server/_projects_nodes_pricing_unit.py @@ -17,10 +17,10 @@ from models_library.projects_nodes_io import NodeID from models_library.resource_tracker import PricingPlanId, PricingUnitId from simcore_service_webserver._meta import API_VTAG -from simcore_service_webserver.projects._controller._nodes_rest import NodePathParams -from simcore_service_webserver.projects._controller._projects_nodes_pricing_unit_rest import ( +from simcore_service_webserver.projects._controller.nodes_pricing_unit_rest import ( _ProjectNodePricingUnitPathParams, ) +from simcore_service_webserver.projects._controller.nodes_rest import NodePathParams router = APIRouter( prefix=f"/{API_VTAG}", diff --git a/api/specs/web-server/_projects_ports.py b/api/specs/web-server/_projects_ports.py index 51e9bf0081d..a5874b8d071 100644 --- a/api/specs/web-server/_projects_ports.py +++ b/api/specs/web-server/_projects_ports.py @@ -9,7 +9,7 @@ from models_library.projects import ProjectID from models_library.projects_nodes import NodeID from simcore_service_webserver._meta import API_VTAG -from simcore_service_webserver.projects._controller._ports_rest import ( +from simcore_service_webserver.projects._controller.ports_rest import ( ProjectInputGet, ProjectInputUpdate, ProjectMetadataPortGet, diff --git a/api/specs/web-server/_projects_states.py b/api/specs/web-server/_projects_states.py index 41a9638179f..5c1b2a5299b 100644 --- a/api/specs/web-server/_projects_states.py +++ b/api/specs/web-server/_projects_states.py @@ -14,7 +14,7 @@ from servicelib.aiohttp import status from simcore_service_webserver._meta import API_VTAG from simcore_service_webserver.director_v2.exceptions import DirectorServiceError -from simcore_service_webserver.projects._controller._projects_states_rest import ( +from simcore_service_webserver.projects._controller.projects_states_rest import ( ProjectPathParams, _OpenProjectQuery, ) diff --git a/api/specs/web-server/_projects_workspaces.py b/api/specs/web-server/_projects_workspaces.py index 644a65d63f3..17ec63fc367 100644 --- a/api/specs/web-server/_projects_workspaces.py +++ b/api/specs/web-server/_projects_workspaces.py @@ -13,7 +13,7 @@ from fastapi import APIRouter, Depends, status from simcore_service_webserver._meta import API_VTAG -from simcore_service_webserver.projects._controller._workspaces_rest import ( +from simcore_service_webserver.projects._controller.workspaces_rest import ( _ProjectWorkspacesPathParams, ) diff --git a/services/web/server/src/simcore_service_webserver/projects/_controller/_projects_rest_utils.py b/services/web/server/src/simcore_service_webserver/projects/_controller/_rest_utils.py similarity index 100% rename from services/web/server/src/simcore_service_webserver/projects/_controller/_projects_rest_utils.py rename to services/web/server/src/simcore_service_webserver/projects/_controller/_rest_utils.py diff --git a/services/web/server/src/simcore_service_webserver/projects/_controller/_folders_rest.py b/services/web/server/src/simcore_service_webserver/projects/_controller/folders_rest.py similarity index 100% rename from services/web/server/src/simcore_service_webserver/projects/_controller/_folders_rest.py rename to services/web/server/src/simcore_service_webserver/projects/_controller/folders_rest.py diff --git a/services/web/server/src/simcore_service_webserver/projects/_controller/_groups_rest.py b/services/web/server/src/simcore_service_webserver/projects/_controller/groups_rest.py similarity index 100% rename from services/web/server/src/simcore_service_webserver/projects/_controller/_groups_rest.py rename to services/web/server/src/simcore_service_webserver/projects/_controller/groups_rest.py diff --git a/services/web/server/src/simcore_service_webserver/projects/_controller/_metadata_rest.py b/services/web/server/src/simcore_service_webserver/projects/_controller/metadata_rest.py similarity index 100% rename from services/web/server/src/simcore_service_webserver/projects/_controller/_metadata_rest.py rename to services/web/server/src/simcore_service_webserver/projects/_controller/metadata_rest.py diff --git a/services/web/server/src/simcore_service_webserver/projects/_controller/_projects_nodes_pricing_unit_rest.py b/services/web/server/src/simcore_service_webserver/projects/_controller/nodes_pricing_unit_rest.py similarity index 99% rename from services/web/server/src/simcore_service_webserver/projects/_controller/_projects_nodes_pricing_unit_rest.py rename to services/web/server/src/simcore_service_webserver/projects/_controller/nodes_pricing_unit_rest.py index 0a1c7cadcf8..450f262295a 100644 --- a/services/web/server/src/simcore_service_webserver/projects/_controller/_projects_nodes_pricing_unit_rest.py +++ b/services/web/server/src/simcore_service_webserver/projects/_controller/nodes_pricing_unit_rest.py @@ -19,8 +19,8 @@ from .. import projects_service from .._common.models import RequestContext from ..db import ProjectDBAPI -from ._nodes_rest import NodePathParams from ._rest_exceptions import handle_plugin_requests_exceptions +from .nodes_rest import NodePathParams _logger = logging.getLogger(__name__) diff --git a/services/web/server/src/simcore_service_webserver/projects/_controller/_nodes_rest.py b/services/web/server/src/simcore_service_webserver/projects/_controller/nodes_rest.py similarity index 100% rename from services/web/server/src/simcore_service_webserver/projects/_controller/_nodes_rest.py rename to services/web/server/src/simcore_service_webserver/projects/_controller/nodes_rest.py diff --git a/services/web/server/src/simcore_service_webserver/projects/_controller/_ports_rest.py b/services/web/server/src/simcore_service_webserver/projects/_controller/ports_rest.py similarity index 100% rename from services/web/server/src/simcore_service_webserver/projects/_controller/_ports_rest.py rename to services/web/server/src/simcore_service_webserver/projects/_controller/ports_rest.py diff --git a/services/web/server/src/simcore_service_webserver/projects/_controller/_projects_rest.py b/services/web/server/src/simcore_service_webserver/projects/_controller/projects_rest.py similarity index 98% rename from services/web/server/src/simcore_service_webserver/projects/_controller/_projects_rest.py rename to services/web/server/src/simcore_service_webserver/projects/_controller/projects_rest.py index 8654ac5630e..2d5d45f2895 100644 --- a/services/web/server/src/simcore_service_webserver/projects/_controller/_projects_rest.py +++ b/services/web/server/src/simcore_service_webserver/projects/_controller/projects_rest.py @@ -55,7 +55,7 @@ from .._permalink_service import update_or_pop_permalink_in_project from ..models import ProjectDict from ..utils import get_project_unavailable_services, project_uses_available_services -from . import _projects_rest_utils +from . import _rest_utils from ._rest_exceptions import handle_plugin_requests_exceptions # When the user requests a project with a repo, the working copy might differ from @@ -166,11 +166,11 @@ async def list_projects(request: web.Request): order_by=OrderBy.model_construct(**query_params.order_by.model_dump()), ) - projects = await _projects_rest_utils.aggregate_data_to_projects_from_request( + projects = await _rest_utils.aggregate_data_to_projects_from_request( request, projects ) - return _projects_rest_utils.create_page_response( + return _rest_utils.create_page_response( projects=projects, request_url=request.url, total=total_number_of_projects, @@ -206,11 +206,11 @@ async def list_projects_full_search(request: web.Request): order_by=OrderBy.model_construct(**query_params.order_by.model_dump()), ) - projects = await _projects_rest_utils.aggregate_data_to_projects_from_request( + projects = await _rest_utils.aggregate_data_to_projects_from_request( request, projects ) - return _projects_rest_utils.create_page_response( + return _rest_utils.create_page_response( projects=projects, request_url=request.url, total=total_number_of_projects, diff --git a/services/web/server/src/simcore_service_webserver/projects/_observer.py b/services/web/server/src/simcore_service_webserver/projects/_controller/projects_slot.py similarity index 85% rename from services/web/server/src/simcore_service_webserver/projects/_observer.py rename to services/web/server/src/simcore_service_webserver/projects/_controller/projects_slot.py index f830ae40f6f..d471d63c3c3 100644 --- a/services/web/server/src/simcore_service_webserver/projects/_observer.py +++ b/services/web/server/src/simcore_service_webserver/projects/_controller/projects_slot.py @@ -1,6 +1,4 @@ -""" Handlers to events registered in servicelib.observer.event_registry - -""" +"""Handlers to events registered in servicelib.observer.event_registry""" import logging @@ -15,9 +13,9 @@ from servicelib.logging_utils import log_context from servicelib.utils import logged_gather -from ..notifications import project_logs -from ..resource_manager.user_sessions import PROJECT_ID_KEY, managed_resource -from .projects_service import retrieve_and_notify_project_locked_state +from ...notifications import project_logs +from ...resource_manager.user_sessions import PROJECT_ID_KEY, managed_resource +from ..projects_service import retrieve_and_notify_project_locked_state _logger = logging.getLogger(__name__) diff --git a/services/web/server/src/simcore_service_webserver/projects/_controller/_projects_states_rest.py b/services/web/server/src/simcore_service_webserver/projects/_controller/projects_states_rest.py similarity index 100% rename from services/web/server/src/simcore_service_webserver/projects/_controller/_projects_states_rest.py rename to services/web/server/src/simcore_service_webserver/projects/_controller/projects_states_rest.py diff --git a/services/web/server/src/simcore_service_webserver/projects/_controller/_tags_rest.py b/services/web/server/src/simcore_service_webserver/projects/_controller/tags_rest.py similarity index 100% rename from services/web/server/src/simcore_service_webserver/projects/_controller/_tags_rest.py rename to services/web/server/src/simcore_service_webserver/projects/_controller/tags_rest.py diff --git a/services/web/server/src/simcore_service_webserver/projects/_controller/_trash_rest.py b/services/web/server/src/simcore_service_webserver/projects/_controller/trash_rest.py similarity index 100% rename from services/web/server/src/simcore_service_webserver/projects/_controller/_trash_rest.py rename to services/web/server/src/simcore_service_webserver/projects/_controller/trash_rest.py diff --git a/services/web/server/src/simcore_service_webserver/projects/_controller/_wallets_rest.py b/services/web/server/src/simcore_service_webserver/projects/_controller/wallets_rest.py similarity index 100% rename from services/web/server/src/simcore_service_webserver/projects/_controller/_wallets_rest.py rename to services/web/server/src/simcore_service_webserver/projects/_controller/wallets_rest.py diff --git a/services/web/server/src/simcore_service_webserver/projects/_controller/_workspaces_rest.py b/services/web/server/src/simcore_service_webserver/projects/_controller/workspaces_rest.py similarity index 100% rename from services/web/server/src/simcore_service_webserver/projects/_controller/_workspaces_rest.py rename to services/web/server/src/simcore_service_webserver/projects/_controller/workspaces_rest.py diff --git a/services/web/server/src/simcore_service_webserver/projects/plugin.py b/services/web/server/src/simcore_service_webserver/projects/plugin.py index 6efda62ad22..0fd3495ab4f 100644 --- a/services/web/server/src/simcore_service_webserver/projects/plugin.py +++ b/services/web/server/src/simcore_service_webserver/projects/plugin.py @@ -16,18 +16,18 @@ _wallets_rest, ) from ._controller import ( - _folders_rest, - _groups_rest, - _metadata_rest, - _nodes_rest, - _ports_rest, - _projects_nodes_pricing_unit_rest, - _projects_rest, - _projects_states_rest, - _tags_rest, - _workspaces_rest, + folders_rest, + groups_rest, + metadata_rest, + nodes_pricing_unit_rest, + nodes_rest, + ports_rest, + projects_rest, + projects_states_rest, + tags_rest, + workspaces_rest, ) -from ._observer import setup_project_observer_events +from ._controller.projects_slot import setup_project_observer_events from ._projects_access import setup_projects_access from .db import setup_projects_db @@ -53,18 +53,18 @@ def setup_projects(app: web.Application) -> bool: # registers event handlers (e.g. on_user_disconnect) setup_project_observer_events(app) - app.router.add_routes(_projects_states_rest.routes) - app.router.add_routes(_projects_rest.routes) + app.router.add_routes(projects_states_rest.routes) + app.router.add_routes(projects_rest.routes) app.router.add_routes(_comments_rest.routes) - app.router.add_routes(_groups_rest.routes) - app.router.add_routes(_metadata_rest.routes) - app.router.add_routes(_ports_rest.routes) - app.router.add_routes(_nodes_rest.routes) - app.router.add_routes(_tags_rest.routes) + app.router.add_routes(groups_rest.routes) + app.router.add_routes(metadata_rest.routes) + app.router.add_routes(ports_rest.routes) + app.router.add_routes(nodes_rest.routes) + app.router.add_routes(tags_rest.routes) app.router.add_routes(_wallets_rest.routes) - app.router.add_routes(_folders_rest.routes) - app.router.add_routes(_projects_nodes_pricing_unit_rest.routes) - app.router.add_routes(_workspaces_rest.routes) + app.router.add_routes(folders_rest.routes) + app.router.add_routes(nodes_pricing_unit_rest.routes) + app.router.add_routes(workspaces_rest.routes) app.router.add_routes(_trash_rest.routes) return True diff --git a/services/web/server/tests/unit/with_dbs/02/test_projects_nodes_handler.py b/services/web/server/tests/unit/with_dbs/02/test_projects_nodes_handler.py index 65a988aa0f5..4db7e6f8a22 100644 --- a/services/web/server/tests/unit/with_dbs/02/test_projects_nodes_handler.py +++ b/services/web/server/tests/unit/with_dbs/02/test_projects_nodes_handler.py @@ -48,7 +48,7 @@ from servicelib.common_headers import UNDEFINED_DEFAULT_SIMCORE_USER_AGENT_VALUE from simcore_postgres_database.models.projects import projects as projects_db_model from simcore_service_webserver.db.models import UserRole -from simcore_service_webserver.projects._controller._nodes_rest import ( +from simcore_service_webserver.projects._controller.nodes_rest import ( _ProjectNodePreview, ) from simcore_service_webserver.projects.models import ProjectDict From b8ee42b2fa1b3c2ad51f4dbe3173f99e3fa35f7c Mon Sep 17 00:00:00 2001 From: Pedro Crespo-Valero <32402063+pcrespov@users.noreply.github.com> Date: Fri, 21 Mar 2025 14:36:39 +0100 Subject: [PATCH 07/39] repo --- .../{_access_rights_db.py => _access_rights_repository.py} | 0 .../projects/_access_rights_service.py | 2 +- 2 files changed, 1 insertion(+), 1 deletion(-) rename services/web/server/src/simcore_service_webserver/projects/{_access_rights_db.py => _access_rights_repository.py} (100%) diff --git a/services/web/server/src/simcore_service_webserver/projects/_access_rights_db.py b/services/web/server/src/simcore_service_webserver/projects/_access_rights_repository.py similarity index 100% rename from services/web/server/src/simcore_service_webserver/projects/_access_rights_db.py rename to services/web/server/src/simcore_service_webserver/projects/_access_rights_repository.py diff --git a/services/web/server/src/simcore_service_webserver/projects/_access_rights_service.py b/services/web/server/src/simcore_service_webserver/projects/_access_rights_service.py index 05071ca5992..35df05c7ce0 100644 --- a/services/web/server/src/simcore_service_webserver/projects/_access_rights_service.py +++ b/services/web/server/src/simcore_service_webserver/projects/_access_rights_service.py @@ -5,7 +5,7 @@ from ..db.plugin import get_database_engine from ..workspaces.api import get_workspace -from ._access_rights_db import get_project_owner +from ._access_rights_repository import get_project_owner from ._db_utils import PermissionStr from .db import APP_PROJECT_DBAPI, ProjectDBAPI from .exceptions import ProjectInvalidRightsError, ProjectNotFoundError From bf016488ad0ff53bbf28b03803bf99a041e0a9e2 Mon Sep 17 00:00:00 2001 From: Pedro Crespo-Valero <32402063+pcrespov@users.noreply.github.com> Date: Fri, 21 Mar 2025 14:38:02 +0100 Subject: [PATCH 08/39] rest --- api/specs/web-server/_projects_comments.py | 2 +- .../comments_rest.py} | 14 +++++++------- .../simcore_service_webserver/projects/plugin.py | 4 ++-- 3 files changed, 10 insertions(+), 10 deletions(-) rename services/web/server/src/simcore_service_webserver/projects/{_comments_rest.py => _controller/comments_rest.py} (95%) diff --git a/api/specs/web-server/_projects_comments.py b/api/specs/web-server/_projects_comments.py index b4ca252c46f..21b045af945 100644 --- a/api/specs/web-server/_projects_comments.py +++ b/api/specs/web-server/_projects_comments.py @@ -17,7 +17,7 @@ from models_library.projects_comments import CommentID, ProjectsCommentsAPI from pydantic import NonNegativeInt from simcore_service_webserver._meta import API_VTAG -from simcore_service_webserver.projects._comments_rest import ( +from simcore_service_webserver.projects._controller.comments_rest import ( _ProjectCommentsBodyParams, _ProjectCommentsPathParams, _ProjectCommentsWithCommentPathParams, diff --git a/services/web/server/src/simcore_service_webserver/projects/_comments_rest.py b/services/web/server/src/simcore_service_webserver/projects/_controller/comments_rest.py similarity index 95% rename from services/web/server/src/simcore_service_webserver/projects/_comments_rest.py rename to services/web/server/src/simcore_service_webserver/projects/_controller/comments_rest.py index 214846addcd..8d285116d91 100644 --- a/services/web/server/src/simcore_service_webserver/projects/_comments_rest.py +++ b/services/web/server/src/simcore_service_webserver/projects/_controller/comments_rest.py @@ -22,13 +22,13 @@ from servicelib.mimetype_constants import MIMETYPE_APPLICATION_JSON from servicelib.rest_constants import RESPONSE_MODEL_POLICY -from .._meta import API_VTAG as VTAG -from ..login.decorators import login_required -from ..security.decorators import permission_required -from ..utils_aiohttp import envelope_json_response -from . import _comments_service, projects_service -from ._common.models import RequestContext -from ._controller._rest_exceptions import handle_plugin_requests_exceptions +from ..._meta import API_VTAG as VTAG +from ...login.decorators import login_required +from ...security.decorators import permission_required +from ...utils_aiohttp import envelope_json_response +from .. import _comments_service, projects_service +from .._common.models import RequestContext +from ._rest_exceptions import handle_plugin_requests_exceptions _logger = logging.getLogger(__name__) diff --git a/services/web/server/src/simcore_service_webserver/projects/plugin.py b/services/web/server/src/simcore_service_webserver/projects/plugin.py index 0fd3495ab4f..a8f254ea948 100644 --- a/services/web/server/src/simcore_service_webserver/projects/plugin.py +++ b/services/web/server/src/simcore_service_webserver/projects/plugin.py @@ -11,11 +11,11 @@ from ..constants import APP_SETTINGS_KEY from . import ( - _comments_rest, _trash_rest, _wallets_rest, ) from ._controller import ( + comments_rest, folders_rest, groups_rest, metadata_rest, @@ -55,7 +55,7 @@ def setup_projects(app: web.Application) -> bool: app.router.add_routes(projects_states_rest.routes) app.router.add_routes(projects_rest.routes) - app.router.add_routes(_comments_rest.routes) + app.router.add_routes(comments_rest.routes) app.router.add_routes(groups_rest.routes) app.router.add_routes(metadata_rest.routes) app.router.add_routes(ports_rest.routes) From ca4470b2abd605123603cbcdf2cbf3e1802bc257 Mon Sep 17 00:00:00 2001 From: Pedro Crespo-Valero <32402063+pcrespov@users.noreply.github.com> Date: Fri, 21 Mar 2025 14:38:21 +0100 Subject: [PATCH 09/39] repo --- .../helpers/webserver_projects.py | 8 ++-- .../folders/_workspaces_repository.py | 4 +- ...comments_db.py => _comments_repository.py} | 0 .../projects/_crud_api_create.py | 2 +- ...{_folders_db.py => _folders_repository.py} | 0 .../projects/_folders_service.py | 2 +- .../{_groups_db.py => _groups_respository.py} | 0 .../projects/_groups_service.py | 4 +- ...metadata_db.py => _metadata_repository.py} | 0 .../projects/_metadata_service.py | 14 +++--- .../projects/_workspaces_service.py | 4 +- .../simcore_service_webserver/projects/db.py | 2 +- .../studies_dispatcher/_studies_access.py | 4 +- services/web/server/tests/conftest.py | 4 +- .../integration/01/test_garbage_collection.py | 4 +- .../02/test_projects_comments_handlers.py | 4 +- .../tests/unit/with_dbs/03/test_project_db.py | 46 ++++++++++--------- .../unit/with_dbs/04/folders/test_folders.py | 2 +- 18 files changed, 56 insertions(+), 48 deletions(-) rename services/web/server/src/simcore_service_webserver/projects/{_comments_db.py => _comments_repository.py} (100%) rename services/web/server/src/simcore_service_webserver/projects/{_folders_db.py => _folders_repository.py} (100%) rename services/web/server/src/simcore_service_webserver/projects/{_groups_db.py => _groups_respository.py} (100%) rename services/web/server/src/simcore_service_webserver/projects/{_metadata_db.py => _metadata_repository.py} (100%) diff --git a/packages/pytest-simcore/src/pytest_simcore/helpers/webserver_projects.py b/packages/pytest-simcore/src/pytest_simcore/helpers/webserver_projects.py index fbcfaa7b474..91d389115eb 100644 --- a/packages/pytest-simcore/src/pytest_simcore/helpers/webserver_projects.py +++ b/packages/pytest-simcore/src/pytest_simcore/helpers/webserver_projects.py @@ -1,6 +1,4 @@ -""" helpers to manage the projects's database and produce fixtures/mockup data for testing - -""" +"""helpers to manage the projects's database and produce fixtures/mockup data for testing""" # pylint: disable=no-value-for-parameter @@ -17,7 +15,9 @@ from models_library.services_resources import ServiceResourcesDictHelpers from simcore_postgres_database.utils_projects_nodes import ProjectNodeCreate from simcore_service_webserver.projects._db_utils import DB_EXCLUSIVE_COLUMNS -from simcore_service_webserver.projects._groups_db import update_or_insert_project_group +from simcore_service_webserver.projects._groups_respository import ( + update_or_insert_project_group, +) from simcore_service_webserver.projects.db import APP_PROJECT_DBAPI, ProjectDBAPI from simcore_service_webserver.projects.models import ProjectDict from simcore_service_webserver.utils import now_str diff --git a/services/web/server/src/simcore_service_webserver/folders/_workspaces_repository.py b/services/web/server/src/simcore_service_webserver/folders/_workspaces_repository.py index 9a1faa19110..23fd3e57e65 100644 --- a/services/web/server/src/simcore_service_webserver/folders/_workspaces_repository.py +++ b/services/web/server/src/simcore_service_webserver/folders/_workspaces_repository.py @@ -8,8 +8,8 @@ from simcore_postgres_database.utils_repos import transaction_context from ..db.plugin import get_asyncpg_engine -from ..projects import _folders_db as project_to_folders_db -from ..projects import _groups_db as project_groups_db +from ..projects import _folders_repository as project_to_folders_db +from ..projects import _groups_respository as project_groups_db from ..projects import _projects_db as projects_db from ..projects._access_rights_service import check_user_project_permission from ..users.api import get_user diff --git a/services/web/server/src/simcore_service_webserver/projects/_comments_db.py b/services/web/server/src/simcore_service_webserver/projects/_comments_repository.py similarity index 100% rename from services/web/server/src/simcore_service_webserver/projects/_comments_db.py rename to services/web/server/src/simcore_service_webserver/projects/_comments_repository.py diff --git a/services/web/server/src/simcore_service_webserver/projects/_crud_api_create.py b/services/web/server/src/simcore_service_webserver/projects/_crud_api_create.py index e77df91ae20..8a748d8589d 100644 --- a/services/web/server/src/simcore_service_webserver/projects/_crud_api_create.py +++ b/services/web/server/src/simcore_service_webserver/projects/_crud_api_create.py @@ -39,7 +39,7 @@ from ..users.api import get_user_fullname from ..workspaces.api import check_user_workspace_access, get_user_workspace from ..workspaces.errors import WorkspaceAccessForbiddenError -from . import _folders_db as project_to_folders_db +from . import _folders_repository as project_to_folders_db from . import projects_service from ._metadata_service import set_project_ancestors from ._permalink_service import update_or_pop_permalink_in_project diff --git a/services/web/server/src/simcore_service_webserver/projects/_folders_db.py b/services/web/server/src/simcore_service_webserver/projects/_folders_repository.py similarity index 100% rename from services/web/server/src/simcore_service_webserver/projects/_folders_db.py rename to services/web/server/src/simcore_service_webserver/projects/_folders_repository.py diff --git a/services/web/server/src/simcore_service_webserver/projects/_folders_service.py b/services/web/server/src/simcore_service_webserver/projects/_folders_service.py index 3ce644f70ef..91a892e64bb 100644 --- a/services/web/server/src/simcore_service_webserver/projects/_folders_service.py +++ b/services/web/server/src/simcore_service_webserver/projects/_folders_service.py @@ -7,7 +7,7 @@ from models_library.users import UserID from ..folders import _folders_repository as _folders_repository -from . import _folders_db as project_to_folders_db +from . import _folders_repository as project_to_folders_db from ._access_rights_service import get_user_project_access_rights from .db import APP_PROJECT_DBAPI, ProjectDBAPI from .exceptions import ProjectInvalidRightsError diff --git a/services/web/server/src/simcore_service_webserver/projects/_groups_db.py b/services/web/server/src/simcore_service_webserver/projects/_groups_respository.py similarity index 100% rename from services/web/server/src/simcore_service_webserver/projects/_groups_db.py rename to services/web/server/src/simcore_service_webserver/projects/_groups_respository.py diff --git a/services/web/server/src/simcore_service_webserver/projects/_groups_service.py b/services/web/server/src/simcore_service_webserver/projects/_groups_service.py index b79a51c42e1..a0225edc31b 100644 --- a/services/web/server/src/simcore_service_webserver/projects/_groups_service.py +++ b/services/web/server/src/simcore_service_webserver/projects/_groups_service.py @@ -9,9 +9,9 @@ from pydantic import BaseModel from ..users import api as users_api -from . import _groups_db as projects_groups_db +from . import _groups_respository as projects_groups_db from ._access_rights_service import check_user_project_permission -from ._groups_db import ProjectGroupGetDB +from ._groups_respository import ProjectGroupGetDB from .db import APP_PROJECT_DBAPI, ProjectDBAPI from .exceptions import ProjectInvalidRightsError diff --git a/services/web/server/src/simcore_service_webserver/projects/_metadata_db.py b/services/web/server/src/simcore_service_webserver/projects/_metadata_repository.py similarity index 100% rename from services/web/server/src/simcore_service_webserver/projects/_metadata_db.py rename to services/web/server/src/simcore_service_webserver/projects/_metadata_repository.py diff --git a/services/web/server/src/simcore_service_webserver/projects/_metadata_service.py b/services/web/server/src/simcore_service_webserver/projects/_metadata_service.py index ab4b89e2eaf..6eb8662c841 100644 --- a/services/web/server/src/simcore_service_webserver/projects/_metadata_service.py +++ b/services/web/server/src/simcore_service_webserver/projects/_metadata_service.py @@ -9,7 +9,7 @@ from pydantic import TypeAdapter from ..db.plugin import get_database_engine -from . import _metadata_db +from . import _metadata_repository from ._access_rights_service import validate_project_ownership _logger = logging.getLogger(__name__) @@ -20,7 +20,7 @@ async def get_project_custom_metadata( ) -> MetadataDict: await validate_project_ownership(app, user_id=user_id, project_uuid=project_uuid) - return await _metadata_db.get_project_custom_metadata( + return await _metadata_repository.get_project_custom_metadata( engine=get_database_engine(app), project_uuid=project_uuid ) @@ -33,7 +33,7 @@ async def set_project_custom_metadata( ) -> MetadataDict: await validate_project_ownership(app, user_id=user_id, project_uuid=project_uuid) - return await _metadata_db.set_project_custom_metadata( + return await _metadata_repository.set_project_custom_metadata( engine=get_database_engine(app), project_uuid=project_uuid, custom_metadata=value, @@ -48,7 +48,7 @@ async def _project_has_ancestors( ) -> bool: await validate_project_ownership(app, user_id=user_id, project_uuid=project_uuid) - return await _metadata_db.project_has_ancestors( + return await _metadata_repository.project_has_ancestors( engine=get_database_engine(app), project_uuid=project_uuid ) @@ -73,11 +73,11 @@ async def set_project_ancestors_from_custom_metadata( return # let's try to get the parent project UUID - parent_project_uuid = await _metadata_db.get_project_id_from_node_id( + parent_project_uuid = await _metadata_repository.get_project_id_from_node_id( get_database_engine(app), node_id=parent_node_id ) - await _metadata_db.set_project_ancestors( + await _metadata_repository.set_project_ancestors( get_database_engine(app), project_uuid=project_uuid, parent_project_uuid=parent_project_uuid, @@ -94,7 +94,7 @@ async def set_project_ancestors( ) -> None: await validate_project_ownership(app, user_id=user_id, project_uuid=project_uuid) - await _metadata_db.set_project_ancestors( + await _metadata_repository.set_project_ancestors( get_database_engine(app), project_uuid=project_uuid, parent_project_uuid=parent_project_uuid, diff --git a/services/web/server/src/simcore_service_webserver/projects/_workspaces_service.py b/services/web/server/src/simcore_service_webserver/projects/_workspaces_service.py index 78219ffefd1..9c656c05c55 100644 --- a/services/web/server/src/simcore_service_webserver/projects/_workspaces_service.py +++ b/services/web/server/src/simcore_service_webserver/projects/_workspaces_service.py @@ -10,8 +10,8 @@ from ..db.plugin import get_asyncpg_engine from ..users.api import get_user from ..workspaces.api import check_user_workspace_access -from . import _folders_db as project_to_folders_db -from . import _groups_db as project_groups_db +from . import _folders_repository as project_to_folders_db +from . import _groups_respository as project_groups_db from . import _projects_db from ._access_rights_service import get_user_project_access_rights from .exceptions import ProjectInvalidRightsError diff --git a/services/web/server/src/simcore_service_webserver/projects/db.py b/services/web/server/src/simcore_service_webserver/projects/db.py index 7d512b484d6..a52cff6ad27 100644 --- a/services/web/server/src/simcore_service_webserver/projects/db.py +++ b/services/web/server/src/simcore_service_webserver/projects/db.py @@ -66,7 +66,7 @@ from tenacity.retry import retry_if_exception_type from ..utils import now_str -from ._comments_db import ( +from ._comments_repository import ( create_project_comment, delete_project_comment, get_project_comment, diff --git a/services/web/server/src/simcore_service_webserver/studies_dispatcher/_studies_access.py b/services/web/server/src/simcore_service_webserver/studies_dispatcher/_studies_access.py index de80153e66e..b5bfb26ede9 100644 --- a/services/web/server/src/simcore_service_webserver/studies_dispatcher/_studies_access.py +++ b/services/web/server/src/simcore_service_webserver/studies_dispatcher/_studies_access.py @@ -1,4 +1,4 @@ -""" handles access to *public* studies +"""handles access to *public* studies Handles a request to share a given sharable study via '/study/{id}' @@ -30,7 +30,7 @@ from ..director_v2._core_computations import create_or_update_pipeline from ..dynamic_scheduler import api as dynamic_scheduler_api from ..products import products_web -from ..projects._groups_db import get_project_group +from ..projects._groups_respository import get_project_group from ..projects.api import check_user_project_permission from ..projects.db import ProjectDBAPI from ..projects.exceptions import ( diff --git a/services/web/server/tests/conftest.py b/services/web/server/tests/conftest.py index 2ff0c5c2a0a..3392e880a61 100644 --- a/services/web/server/tests/conftest.py +++ b/services/web/server/tests/conftest.py @@ -41,7 +41,9 @@ from simcore_service_webserver.projects._crud_api_create import ( OVERRIDABLE_DOCUMENT_KEYS, ) -from simcore_service_webserver.projects._groups_db import update_or_insert_project_group +from simcore_service_webserver.projects._groups_respository import ( + update_or_insert_project_group, +) from simcore_service_webserver.projects.models import ProjectDict from simcore_service_webserver.utils import to_datetime from tenacity.asyncio import AsyncRetrying diff --git a/services/web/server/tests/integration/01/test_garbage_collection.py b/services/web/server/tests/integration/01/test_garbage_collection.py index 57f23d09302..8d474ef14d6 100644 --- a/services/web/server/tests/integration/01/test_garbage_collection.py +++ b/services/web/server/tests/integration/01/test_garbage_collection.py @@ -41,7 +41,9 @@ from simcore_service_webserver.groups.api import add_user_in_group from simcore_service_webserver.login.plugin import setup_login from simcore_service_webserver.projects._crud_api_delete import get_scheduled_tasks -from simcore_service_webserver.projects._groups_db import update_or_insert_project_group +from simcore_service_webserver.projects._groups_respository import ( + update_or_insert_project_group, +) from simcore_service_webserver.projects.models import ProjectDict from simcore_service_webserver.projects.plugin import setup_projects from simcore_service_webserver.resource_manager.plugin import setup_resource_manager diff --git a/services/web/server/tests/unit/with_dbs/02/test_projects_comments_handlers.py b/services/web/server/tests/unit/with_dbs/02/test_projects_comments_handlers.py index 604ee40308c..ce96b379258 100644 --- a/services/web/server/tests/unit/with_dbs/02/test_projects_comments_handlers.py +++ b/services/web/server/tests/unit/with_dbs/02/test_projects_comments_handlers.py @@ -16,7 +16,9 @@ from servicelib.aiohttp import status from simcore_service_webserver._meta import api_version_prefix from simcore_service_webserver.db.models import UserRole -from simcore_service_webserver.projects._groups_db import update_or_insert_project_group +from simcore_service_webserver.projects._groups_respository import ( + update_or_insert_project_group, +) from simcore_service_webserver.projects.models import ProjectDict API_PREFIX = "/" + api_version_prefix diff --git a/services/web/server/tests/unit/with_dbs/03/test_project_db.py b/services/web/server/tests/unit/with_dbs/03/test_project_db.py index d62cac76a51..a39f248521d 100644 --- a/services/web/server/tests/unit/with_dbs/03/test_project_db.py +++ b/services/web/server/tests/unit/with_dbs/03/test_project_db.py @@ -30,7 +30,9 @@ from simcore_postgres_database.models.users import UserRole from simcore_postgres_database.utils_projects_nodes import ProjectNodesRepo from simcore_service_webserver.projects._db_utils import PermissionStr -from simcore_service_webserver.projects._groups_db import update_or_insert_project_group +from simcore_service_webserver.projects._groups_respository import ( + update_or_insert_project_group, +) from simcore_service_webserver.projects.api import has_user_project_access_rights from simcore_service_webserver.projects.db import ProjectAccessRights, ProjectDBAPI from simcore_service_webserver.projects.exceptions import ( @@ -350,7 +352,7 @@ async def test_insert_project_to_db( @pytest.mark.parametrize( "user_role", - [(UserRole.USER)], + [UserRole.USER], ) async def test_patch_user_project_workbench_raises_if_project_does_not_exist( fake_project: dict[str, Any], @@ -376,7 +378,7 @@ async def test_patch_user_project_workbench_raises_if_project_does_not_exist( @pytest.mark.parametrize( "user_role", - [(UserRole.USER)], + [UserRole.USER], ) async def test_patch_user_project_workbench_creates_nodes( fake_project: dict[str, Any], @@ -420,7 +422,7 @@ async def test_patch_user_project_workbench_creates_nodes( @pytest.mark.parametrize( "user_role", - [(UserRole.USER)], + [UserRole.USER], ) async def test_patch_user_project_workbench_creates_nodes_raises_if_invalid_node_is_passed( fake_project: dict[str, Any], @@ -457,7 +459,7 @@ async def test_patch_user_project_workbench_creates_nodes_raises_if_invalid_node @pytest.mark.parametrize( "user_role", - [(UserRole.USER)], + [UserRole.USER], ) @pytest.mark.parametrize("number_of_nodes", [1, randint(250, 300)]) # noqa: S311 async def test_patch_user_project_workbench_concurrently( @@ -514,18 +516,18 @@ async def test_patch_user_project_workbench_concurrently( for n in range(_NUMBER_OF_NODES): expected_project["workbench"][node_uuids[n]].update(randomly_created_outputs[n]) - patched_projects: list[ - tuple[dict[str, Any], dict[str, Any]] - ] = await asyncio.gather( - *[ - db_api._update_project_workbench( # noqa: SLF001 - {NodeIDStr(node_uuids[n]): randomly_created_outputs[n]}, - user_id=logged_user["id"], - project_uuid=new_project["uuid"], - allow_workbench_changes=False, - ) - for n in range(_NUMBER_OF_NODES) - ] + patched_projects: list[tuple[dict[str, Any], dict[str, Any]]] = ( + await asyncio.gather( + *[ + db_api._update_project_workbench( # noqa: SLF001 + {NodeIDStr(node_uuids[n]): randomly_created_outputs[n]}, + user_id=logged_user["id"], + project_uuid=new_project["uuid"], + allow_workbench_changes=False, + ) + for n in range(_NUMBER_OF_NODES) + ] + ) ) # NOTE: each returned project contains the project with some updated workbenches # the ordering is uncontrolled. @@ -743,9 +745,9 @@ async def test_replace_user_project( }, "output_2": 5, } - node_data[ - "runHash" - ] = "5b0583fa546ac82f0e41cef9705175b7187ce3928ba42892e842add912c16676" + node_data["runHash"] = ( + "5b0583fa546ac82f0e41cef9705175b7187ce3928ba42892e842add912c16676" + ) # replacing with the new entries shall return the very same data replaced_project = await db_api.replace_project( working_project, @@ -917,7 +919,7 @@ async def inserted_project( ), ], ) -@pytest.mark.parametrize("user_role", [(UserRole.USER)]) +@pytest.mark.parametrize("user_role", [UserRole.USER]) async def test_check_project_node_has_all_required_inputs_raises( client: TestClient, logged_user: dict[str, Any], @@ -948,7 +950,7 @@ async def test_check_project_node_has_all_required_inputs_raises( ), ], ) -@pytest.mark.parametrize("user_role", [(UserRole.USER)]) +@pytest.mark.parametrize("user_role", [UserRole.USER]) async def test_check_project_node_has_all_required_inputs_ok( client: TestClient, logged_user: dict[str, Any], diff --git a/services/web/server/tests/unit/with_dbs/04/folders/test_folders.py b/services/web/server/tests/unit/with_dbs/04/folders/test_folders.py index 7785d0dbaeb..dca9d86c38d 100644 --- a/services/web/server/tests/unit/with_dbs/04/folders/test_folders.py +++ b/services/web/server/tests/unit/with_dbs/04/folders/test_folders.py @@ -23,7 +23,7 @@ from servicelib.aiohttp import status from servicelib.aiohttp.application_keys import APP_FIRE_AND_FORGET_TASKS_KEY from simcore_service_webserver.db.models import UserRole -from simcore_service_webserver.projects._groups_db import ( +from simcore_service_webserver.projects._groups_respository import ( GroupID, update_or_insert_project_group, ) From 341d382a9acd77be872de2b909fd0a188d043e47 Mon Sep 17 00:00:00 2001 From: Pedro Crespo-Valero <32402063+pcrespov@users.noreply.github.com> Date: Fri, 21 Mar 2025 14:42:05 +0100 Subject: [PATCH 10/39] schemas --- api/specs/web-server/_projects.py | 4 +++- api/specs/web-server/_projects_groups.py | 4 +++- api/specs/web-server/_projects_wallet.py | 4 +++- .../{_common/models.py => _controller/_rest_schemas.py} | 2 +- .../projects/_controller/comments_rest.py | 2 +- .../projects/_controller/folders_rest.py | 2 +- .../projects/_controller/groups_rest.py | 2 +- .../projects/_controller/metadata_rest.py | 2 +- .../projects/_controller/nodes_pricing_unit_rest.py | 2 +- .../projects/_controller/nodes_rest.py | 2 +- .../projects/_controller/ports_rest.py | 2 +- .../projects/_controller/projects_rest.py | 2 +- .../projects/_controller/projects_states_rest.py | 2 +- .../projects/_controller/workspaces_rest.py | 2 +- 14 files changed, 20 insertions(+), 14 deletions(-) rename services/web/server/src/simcore_service_webserver/projects/{_common/models.py => _controller/_rest_schemas.py} (91%) diff --git a/api/specs/web-server/_projects.py b/api/specs/web-server/_projects.py index 51ae3611ee7..3c8e46f53af 100644 --- a/api/specs/web-server/_projects.py +++ b/api/specs/web-server/_projects.py @@ -31,10 +31,12 @@ from models_library.rest_pagination import Page from pydantic import BaseModel from simcore_service_webserver._meta import API_VTAG -from simcore_service_webserver.projects._common.models import ProjectPathParams from simcore_service_webserver.projects._controller._rest_exceptions import ( _TO_HTTP_ERROR_MAP, ) +from simcore_service_webserver.projects._controller._rest_schemas import ( + ProjectPathParams, +) from simcore_service_webserver.projects._controller.projects_rest import ( ProjectCreateQueryParams, ) diff --git a/api/specs/web-server/_projects_groups.py b/api/specs/web-server/_projects_groups.py index 34eeaaf92b1..091e374e4ca 100644 --- a/api/specs/web-server/_projects_groups.py +++ b/api/specs/web-server/_projects_groups.py @@ -9,7 +9,9 @@ from fastapi import APIRouter, Depends, status from models_library.generics import Envelope from simcore_service_webserver._meta import API_VTAG -from simcore_service_webserver.projects._common.models import ProjectPathParams +from simcore_service_webserver.projects._controller._rest_schemas import ( + ProjectPathParams, +) from simcore_service_webserver.projects._controller.groups_rest import ( _ProjectsGroupsBodyParams, _ProjectsGroupsPathParams, diff --git a/api/specs/web-server/_projects_wallet.py b/api/specs/web-server/_projects_wallet.py index c797de67c61..21f20d12fa0 100644 --- a/api/specs/web-server/_projects_wallet.py +++ b/api/specs/web-server/_projects_wallet.py @@ -17,7 +17,9 @@ from models_library.projects import ProjectID from models_library.wallets import WalletID from simcore_service_webserver._meta import API_VTAG -from simcore_service_webserver.projects._common.models import ProjectPathParams +from simcore_service_webserver.projects._controller._rest_schemas import ( + ProjectPathParams, +) from simcore_service_webserver.projects._wallets_rest import ( _PayProjectDebtBody, _ProjectWalletPathParams, diff --git a/services/web/server/src/simcore_service_webserver/projects/_common/models.py b/services/web/server/src/simcore_service_webserver/projects/_controller/_rest_schemas.py similarity index 91% rename from services/web/server/src/simcore_service_webserver/projects/_common/models.py rename to services/web/server/src/simcore_service_webserver/projects/_controller/_rest_schemas.py index 6f358378f60..300c0d53394 100644 --- a/services/web/server/src/simcore_service_webserver/projects/_common/models.py +++ b/services/web/server/src/simcore_service_webserver/projects/_controller/_rest_schemas.py @@ -1,4 +1,4 @@ -""" Handlers for STANDARD methods on /projects colletions +"""Handlers for STANDARD methods on /projects colletions Standard methods or CRUD that states for Create+Read(Get&List)+Update+Delete diff --git a/services/web/server/src/simcore_service_webserver/projects/_controller/comments_rest.py b/services/web/server/src/simcore_service_webserver/projects/_controller/comments_rest.py index 8d285116d91..7223424e4c9 100644 --- a/services/web/server/src/simcore_service_webserver/projects/_controller/comments_rest.py +++ b/services/web/server/src/simcore_service_webserver/projects/_controller/comments_rest.py @@ -27,8 +27,8 @@ from ...security.decorators import permission_required from ...utils_aiohttp import envelope_json_response from .. import _comments_service, projects_service -from .._common.models import RequestContext from ._rest_exceptions import handle_plugin_requests_exceptions +from ._rest_schemas import RequestContext _logger = logging.getLogger(__name__) diff --git a/services/web/server/src/simcore_service_webserver/projects/_controller/folders_rest.py b/services/web/server/src/simcore_service_webserver/projects/_controller/folders_rest.py index d08a405b05c..7d7a7f6f954 100644 --- a/services/web/server/src/simcore_service_webserver/projects/_controller/folders_rest.py +++ b/services/web/server/src/simcore_service_webserver/projects/_controller/folders_rest.py @@ -12,8 +12,8 @@ from ...login.decorators import login_required from ...security.decorators import permission_required from .. import _folders_service -from .._common.models import RequestContext from ._rest_exceptions import handle_plugin_requests_exceptions +from ._rest_schemas import RequestContext _logger = logging.getLogger(__name__) diff --git a/services/web/server/src/simcore_service_webserver/projects/_controller/groups_rest.py b/services/web/server/src/simcore_service_webserver/projects/_controller/groups_rest.py index 7dfe26547d9..9d678339e95 100644 --- a/services/web/server/src/simcore_service_webserver/projects/_controller/groups_rest.py +++ b/services/web/server/src/simcore_service_webserver/projects/_controller/groups_rest.py @@ -17,9 +17,9 @@ from ...security.decorators import permission_required from ...utils_aiohttp import envelope_json_response from .. import _groups_service -from .._common.models import ProjectPathParams, RequestContext from .._groups_service import ProjectGroupGet from ._rest_exceptions import handle_plugin_requests_exceptions +from ._rest_schemas import ProjectPathParams, RequestContext _logger = logging.getLogger(__name__) diff --git a/services/web/server/src/simcore_service_webserver/projects/_controller/metadata_rest.py b/services/web/server/src/simcore_service_webserver/projects/_controller/metadata_rest.py index 96e6ec3bb17..b383d8e4175 100644 --- a/services/web/server/src/simcore_service_webserver/projects/_controller/metadata_rest.py +++ b/services/web/server/src/simcore_service_webserver/projects/_controller/metadata_rest.py @@ -28,8 +28,8 @@ from ...security.decorators import permission_required from ...utils_aiohttp import envelope_json_response from .. import _metadata_service -from .._common.models import ProjectPathParams, RequestContext from ._rest_exceptions import handle_plugin_requests_exceptions +from ._rest_schemas import ProjectPathParams, RequestContext routes = web.RouteTableDef() diff --git a/services/web/server/src/simcore_service_webserver/projects/_controller/nodes_pricing_unit_rest.py b/services/web/server/src/simcore_service_webserver/projects/_controller/nodes_pricing_unit_rest.py index 450f262295a..8e7b1c09ea0 100644 --- a/services/web/server/src/simcore_service_webserver/projects/_controller/nodes_pricing_unit_rest.py +++ b/services/web/server/src/simcore_service_webserver/projects/_controller/nodes_pricing_unit_rest.py @@ -17,9 +17,9 @@ from ...security.decorators import permission_required from ...utils_aiohttp import envelope_json_response from .. import projects_service -from .._common.models import RequestContext from ..db import ProjectDBAPI from ._rest_exceptions import handle_plugin_requests_exceptions +from ._rest_schemas import RequestContext from .nodes_rest import NodePathParams _logger = logging.getLogger(__name__) diff --git a/services/web/server/src/simcore_service_webserver/projects/_controller/nodes_rest.py b/services/web/server/src/simcore_service_webserver/projects/_controller/nodes_rest.py index f664306dbef..41dd29f33a4 100644 --- a/services/web/server/src/simcore_service_webserver/projects/_controller/nodes_rest.py +++ b/services/web/server/src/simcore_service_webserver/projects/_controller/nodes_rest.py @@ -68,7 +68,6 @@ from .. import _access_rights_service as access_rights_service from .. import _nodes_service as _nodes_service from .. import nodes_utils, projects_service -from .._common.models import ProjectPathParams, RequestContext from .._nodes_service import NodeScreenshot, get_node_screenshots from ..api import has_user_project_access_rights from ..exceptions import ( @@ -77,6 +76,7 @@ ProjectNodeResourcesInvalidError, ) from ._rest_exceptions import handle_plugin_requests_exceptions +from ._rest_schemas import ProjectPathParams, RequestContext _logger = logging.getLogger(__name__) diff --git a/services/web/server/src/simcore_service_webserver/projects/_controller/ports_rest.py b/services/web/server/src/simcore_service_webserver/projects/_controller/ports_rest.py index a0ce08ccc57..4a5761e5a37 100644 --- a/services/web/server/src/simcore_service_webserver/projects/_controller/ports_rest.py +++ b/services/web/server/src/simcore_service_webserver/projects/_controller/ports_rest.py @@ -31,10 +31,10 @@ from ...utils_aiohttp import envelope_json_response from .. import _ports_service, projects_service from .._access_rights_service import check_user_project_permission -from .._common.models import ProjectPathParams, RequestContext from ..db import ProjectDBAPI from ..models import ProjectDict from ._rest_exceptions import handle_plugin_requests_exceptions +from ._rest_schemas import ProjectPathParams, RequestContext log = logging.getLogger(__name__) diff --git a/services/web/server/src/simcore_service_webserver/projects/_controller/projects_rest.py b/services/web/server/src/simcore_service_webserver/projects/_controller/projects_rest.py index 2d5d45f2895..c7228056790 100644 --- a/services/web/server/src/simcore_service_webserver/projects/_controller/projects_rest.py +++ b/services/web/server/src/simcore_service_webserver/projects/_controller/projects_rest.py @@ -43,7 +43,6 @@ from ...users.api import get_user_fullname from ...utils_aiohttp import envelope_json_response from .. import _crud_api_create, _crud_api_read, projects_service -from .._common.models import ProjectPathParams, RequestContext from .._crud_handlers_models import ( ProjectActiveQueryParams, ProjectCreateHeaders, @@ -57,6 +56,7 @@ from ..utils import get_project_unavailable_services, project_uses_available_services from . import _rest_utils from ._rest_exceptions import handle_plugin_requests_exceptions +from ._rest_schemas import ProjectPathParams, RequestContext # When the user requests a project with a repo, the working copy might differ from # the repo project. A middleware in the meta module (if active) will resolve diff --git a/services/web/server/src/simcore_service_webserver/projects/_controller/projects_states_rest.py b/services/web/server/src/simcore_service_webserver/projects/_controller/projects_states_rest.py index 33b7c22eb06..be113946af9 100644 --- a/services/web/server/src/simcore_service_webserver/projects/_controller/projects_states_rest.py +++ b/services/web/server/src/simcore_service_webserver/projects/_controller/projects_states_rest.py @@ -32,9 +32,9 @@ from ...utils_aiohttp import envelope_json_response from .. import api as projects_api from .. import projects_service -from .._common.models import ProjectPathParams, RequestContext from ..exceptions import ProjectStartsTooManyDynamicNodesError from ._rest_exceptions import handle_plugin_requests_exceptions +from ._rest_schemas import ProjectPathParams, RequestContext _logger = logging.getLogger(__name__) diff --git a/services/web/server/src/simcore_service_webserver/projects/_controller/workspaces_rest.py b/services/web/server/src/simcore_service_webserver/projects/_controller/workspaces_rest.py index 071c45c7de8..14b085c66b1 100644 --- a/services/web/server/src/simcore_service_webserver/projects/_controller/workspaces_rest.py +++ b/services/web/server/src/simcore_service_webserver/projects/_controller/workspaces_rest.py @@ -13,8 +13,8 @@ from ...login.decorators import login_required from ...security.decorators import permission_required from .. import _workspaces_service -from .._common.models import RequestContext from ._rest_exceptions import handle_plugin_requests_exceptions +from ._rest_schemas import RequestContext _logger = logging.getLogger(__name__) From 3e287d019e7487adbc1e94bffe1ec38f054ac51d Mon Sep 17 00:00:00 2001 From: Pedro Crespo-Valero <32402063+pcrespov@users.noreply.github.com> Date: Fri, 21 Mar 2025 14:42:24 +0100 Subject: [PATCH 11/39] drop common --- .../src/simcore_service_webserver/projects/_common/__init__.py | 0 1 file changed, 0 insertions(+), 0 deletions(-) delete mode 100644 services/web/server/src/simcore_service_webserver/projects/_common/__init__.py diff --git a/services/web/server/src/simcore_service_webserver/projects/_common/__init__.py b/services/web/server/src/simcore_service_webserver/projects/_common/__init__.py deleted file mode 100644 index e69de29bb2d..00000000000 From e155dabd13f2f65c86308ba977b0d40e66d1092b Mon Sep 17 00:00:00 2001 From: Pedro Crespo-Valero <32402063+pcrespov@users.noreply.github.com> Date: Fri, 21 Mar 2025 14:51:51 +0100 Subject: [PATCH 12/39] db, db_utils and projects_db -> projects_repository_* --- .../src/pytest_simcore/helpers/webserver_projects.py | 9 +++++++-- .../simcore_service_webserver/db_listener/plugin.py | 5 +++-- .../folders/_workspaces_repository.py | 2 +- .../garbage_collector/_core_guests.py | 2 +- .../garbage_collector/_core_utils.py | 5 ++++- .../garbage_collector/plugin.py | 2 +- .../projects/_access_rights_service.py | 4 ++-- .../projects/_comments_service.py | 2 +- .../projects/_controller/nodes_pricing_unit_rest.py | 2 +- .../projects/_controller/ports_rest.py | 2 +- .../projects/_crud_api_create.py | 2 +- .../projects/_crud_api_delete.py | 2 +- .../projects/_crud_api_read.py | 4 ++-- .../projects/_folders_service.py | 2 +- .../projects/_groups_service.py | 2 +- .../projects/_projects_access.py | 2 +- .../{_projects_db.py => _projects_repository.py} | 0 .../{db.py => _projects_repository_legacy.py} | 4 ++-- ...utils.py => _projects_repository_legacy_utils.py} | 2 +- .../projects/_projects_service_delete.py | 5 ++--- .../projects/_tags_service.py | 2 +- .../projects/_trash_service.py | 4 ++-- .../projects/_wallets_service.py | 2 +- .../projects/_workspaces_service.py | 4 ++-- .../src/simcore_service_webserver/projects/plugin.py | 12 +++++------- .../projects/projects_service.py | 10 +++++----- .../studies_dispatcher/_projects.py | 12 ++++++------ .../studies_dispatcher/_studies_access.py | 4 ++-- .../workspaces/_workspaces_service.py | 2 +- .../tests/unit/isolated/test_projects__db_utils.py | 10 +++++----- .../unit/with_dbs/02/test_projects_repository.py | 2 +- .../server/tests/unit/with_dbs/03/test_project_db.py | 9 +++++++-- 32 files changed, 72 insertions(+), 61 deletions(-) rename services/web/server/src/simcore_service_webserver/projects/{_projects_db.py => _projects_repository.py} (100%) rename services/web/server/src/simcore_service_webserver/projects/{db.py => _projects_repository_legacy.py} (99%) rename services/web/server/src/simcore_service_webserver/projects/{_db_utils.py => _projects_repository_legacy_utils.py} (99%) diff --git a/packages/pytest-simcore/src/pytest_simcore/helpers/webserver_projects.py b/packages/pytest-simcore/src/pytest_simcore/helpers/webserver_projects.py index 91d389115eb..9cb6933791a 100644 --- a/packages/pytest-simcore/src/pytest_simcore/helpers/webserver_projects.py +++ b/packages/pytest-simcore/src/pytest_simcore/helpers/webserver_projects.py @@ -14,11 +14,16 @@ from models_library.projects_nodes_io import NodeID from models_library.services_resources import ServiceResourcesDictHelpers from simcore_postgres_database.utils_projects_nodes import ProjectNodeCreate -from simcore_service_webserver.projects._db_utils import DB_EXCLUSIVE_COLUMNS from simcore_service_webserver.projects._groups_respository import ( update_or_insert_project_group, ) -from simcore_service_webserver.projects.db import APP_PROJECT_DBAPI, ProjectDBAPI +from simcore_service_webserver.projects._projects_repository_legacy import ( + APP_PROJECT_DBAPI, + ProjectDBAPI, +) +from simcore_service_webserver.projects._projects_repository_legacy_utils import ( + DB_EXCLUSIVE_COLUMNS, +) from simcore_service_webserver.projects.models import ProjectDict from simcore_service_webserver.utils import now_str diff --git a/services/web/server/src/simcore_service_webserver/db_listener/plugin.py b/services/web/server/src/simcore_service_webserver/db_listener/plugin.py index a4fda5b69bd..f047491d3a4 100644 --- a/services/web/server/src/simcore_service_webserver/db_listener/plugin.py +++ b/services/web/server/src/simcore_service_webserver/db_listener/plugin.py @@ -1,14 +1,15 @@ """ - computation module is the main entry-point for computational backend +computation module is the main entry-point for computational backend """ + import logging from aiohttp import web from servicelib.aiohttp.application_setup import ModuleCategory, app_module_setup from ..db.plugin import setup_db -from ..projects.db import setup_projects_db +from ..projects._projects_repository_legacy import setup_projects_db from ..rabbitmq import setup_rabbitmq from ..socketio.plugin import setup_socketio from ._db_comp_tasks_listening_task import create_comp_tasks_listening_task diff --git a/services/web/server/src/simcore_service_webserver/folders/_workspaces_repository.py b/services/web/server/src/simcore_service_webserver/folders/_workspaces_repository.py index 23fd3e57e65..f6950d23921 100644 --- a/services/web/server/src/simcore_service_webserver/folders/_workspaces_repository.py +++ b/services/web/server/src/simcore_service_webserver/folders/_workspaces_repository.py @@ -10,7 +10,7 @@ from ..db.plugin import get_asyncpg_engine from ..projects import _folders_repository as project_to_folders_db from ..projects import _groups_respository as project_groups_db -from ..projects import _projects_db as projects_db +from ..projects import _projects_repository as projects_db from ..projects._access_rights_service import check_user_project_permission from ..users.api import get_user from ..workspaces.api import check_user_workspace_access diff --git a/services/web/server/src/simcore_service_webserver/garbage_collector/_core_guests.py b/services/web/server/src/simcore_service_webserver/garbage_collector/_core_guests.py index 1d44f39e793..ed00ce5d4b0 100644 --- a/services/web/server/src/simcore_service_webserver/garbage_collector/_core_guests.py +++ b/services/web/server/src/simcore_service_webserver/garbage_collector/_core_guests.py @@ -11,7 +11,7 @@ from simcore_postgres_database.aiopg_errors import DatabaseError from simcore_postgres_database.models.users import UserRole -from ..projects.db import ProjectDBAPI +from ..projects._projects_repository_legacy import ProjectDBAPI from ..projects.exceptions import ProjectDeleteError, ProjectNotFoundError from ..projects.projects_service import get_project_for_user, submit_delete_project_task from ..redis import get_redis_lock_manager_client diff --git a/services/web/server/src/simcore_service_webserver/garbage_collector/_core_utils.py b/services/web/server/src/simcore_service_webserver/garbage_collector/_core_utils.py index 21ee7e29401..67106abddcc 100644 --- a/services/web/server/src/simcore_service_webserver/garbage_collector/_core_utils.py +++ b/services/web/server/src/simcore_service_webserver/garbage_collector/_core_utils.py @@ -8,11 +8,14 @@ from simcore_postgres_database.aiopg_errors import DatabaseError from ..groups.api import get_group_from_gid +from ..projects._projects_repository_legacy import ( + APP_PROJECT_DBAPI, + ProjectAccessRights, +) from ..projects.api import ( create_project_group_without_checking_permissions, delete_project_group_without_checking_permissions, ) -from ..projects.db import APP_PROJECT_DBAPI, ProjectAccessRights from ..projects.exceptions import ProjectNotFoundError from ..users.api import get_user, get_user_id_from_gid, get_users_in_group from ..users.exceptions import UserNotFoundError diff --git a/services/web/server/src/simcore_service_webserver/garbage_collector/plugin.py b/services/web/server/src/simcore_service_webserver/garbage_collector/plugin.py index 167679b62d8..3c42457ece5 100644 --- a/services/web/server/src/simcore_service_webserver/garbage_collector/plugin.py +++ b/services/web/server/src/simcore_service_webserver/garbage_collector/plugin.py @@ -7,7 +7,7 @@ from ..application_settings import get_application_settings from ..login.plugin import setup_login_storage from ..products.plugin import setup_products -from ..projects.db import setup_projects_db +from ..projects._projects_repository_legacy import setup_projects_db from ..socketio.plugin import setup_socketio from . import _tasks_api_keys, _tasks_core, _tasks_trash, _tasks_users from .settings import get_plugin_settings diff --git a/services/web/server/src/simcore_service_webserver/projects/_access_rights_service.py b/services/web/server/src/simcore_service_webserver/projects/_access_rights_service.py index 35df05c7ce0..72f94eba0dd 100644 --- a/services/web/server/src/simcore_service_webserver/projects/_access_rights_service.py +++ b/services/web/server/src/simcore_service_webserver/projects/_access_rights_service.py @@ -6,8 +6,8 @@ from ..db.plugin import get_database_engine from ..workspaces.api import get_workspace from ._access_rights_repository import get_project_owner -from ._db_utils import PermissionStr -from .db import APP_PROJECT_DBAPI, ProjectDBAPI +from ._projects_repository_legacy import APP_PROJECT_DBAPI, ProjectDBAPI +from ._projects_repository_legacy_utils import PermissionStr from .exceptions import ProjectInvalidRightsError, ProjectNotFoundError from .models import UserProjectAccessRightsWithWorkspace diff --git a/services/web/server/src/simcore_service_webserver/projects/_comments_service.py b/services/web/server/src/simcore_service_webserver/projects/_comments_service.py index c318465459a..7999d1e591c 100644 --- a/services/web/server/src/simcore_service_webserver/projects/_comments_service.py +++ b/services/web/server/src/simcore_service_webserver/projects/_comments_service.py @@ -10,7 +10,7 @@ from models_library.users import UserID from pydantic import PositiveInt -from .db import APP_PROJECT_DBAPI, ProjectDBAPI +from ._projects_repository_legacy import APP_PROJECT_DBAPI, ProjectDBAPI log = logging.getLogger(__name__) diff --git a/services/web/server/src/simcore_service_webserver/projects/_controller/nodes_pricing_unit_rest.py b/services/web/server/src/simcore_service_webserver/projects/_controller/nodes_pricing_unit_rest.py index 8e7b1c09ea0..e4b0649410e 100644 --- a/services/web/server/src/simcore_service_webserver/projects/_controller/nodes_pricing_unit_rest.py +++ b/services/web/server/src/simcore_service_webserver/projects/_controller/nodes_pricing_unit_rest.py @@ -17,7 +17,7 @@ from ...security.decorators import permission_required from ...utils_aiohttp import envelope_json_response from .. import projects_service -from ..db import ProjectDBAPI +from .._projects_repository_legacy import ProjectDBAPI from ._rest_exceptions import handle_plugin_requests_exceptions from ._rest_schemas import RequestContext from .nodes_rest import NodePathParams diff --git a/services/web/server/src/simcore_service_webserver/projects/_controller/ports_rest.py b/services/web/server/src/simcore_service_webserver/projects/_controller/ports_rest.py index 4a5761e5a37..d9b1b1f81b2 100644 --- a/services/web/server/src/simcore_service_webserver/projects/_controller/ports_rest.py +++ b/services/web/server/src/simcore_service_webserver/projects/_controller/ports_rest.py @@ -31,7 +31,7 @@ from ...utils_aiohttp import envelope_json_response from .. import _ports_service, projects_service from .._access_rights_service import check_user_project_permission -from ..db import ProjectDBAPI +from .._projects_repository_legacy import ProjectDBAPI from ..models import ProjectDict from ._rest_exceptions import handle_plugin_requests_exceptions from ._rest_schemas import ProjectPathParams, RequestContext diff --git a/services/web/server/src/simcore_service_webserver/projects/_crud_api_create.py b/services/web/server/src/simcore_service_webserver/projects/_crud_api_create.py index 8a748d8589d..391161f9b8c 100644 --- a/services/web/server/src/simcore_service_webserver/projects/_crud_api_create.py +++ b/services/web/server/src/simcore_service_webserver/projects/_crud_api_create.py @@ -43,7 +43,7 @@ from . import projects_service from ._metadata_service import set_project_ancestors from ._permalink_service import update_or_pop_permalink_in_project -from .db import ProjectDBAPI +from ._projects_repository_legacy import ProjectDBAPI from .exceptions import ( ParentNodeNotFoundError, ParentProjectNotFoundError, diff --git a/services/web/server/src/simcore_service_webserver/projects/_crud_api_delete.py b/services/web/server/src/simcore_service_webserver/projects/_crud_api_delete.py index d438fdddac6..8c251dbcd63 100644 --- a/services/web/server/src/simcore_service_webserver/projects/_crud_api_delete.py +++ b/services/web/server/src/simcore_service_webserver/projects/_crud_api_delete.py @@ -18,7 +18,7 @@ from ..users.api import FullNameDict from ..users.exceptions import UserNotFoundError from ._access_rights_service import check_user_project_permission -from .db import ProjectDBAPI +from ._projects_repository_legacy import ProjectDBAPI from .exceptions import ( ProjectDeleteError, ProjectInvalidRightsError, diff --git a/services/web/server/src/simcore_service_webserver/projects/_crud_api_read.py b/services/web/server/src/simcore_service_webserver/projects/_crud_api_read.py index 5965a7e4a2a..665c5721402 100644 --- a/services/web/server/src/simcore_service_webserver/projects/_crud_api_read.py +++ b/services/web/server/src/simcore_service_webserver/projects/_crud_api_read.py @@ -23,8 +23,8 @@ from ..folders import _folders_repository from ..workspaces._workspaces_service import check_user_workspace_access from . import projects_service -from ._projects_db import batch_get_trashed_by_primary_gid -from .db import ProjectDBAPI +from ._projects_repository import batch_get_trashed_by_primary_gid +from ._projects_repository_legacy import ProjectDBAPI from .models import ProjectDict, ProjectTypeAPI diff --git a/services/web/server/src/simcore_service_webserver/projects/_folders_service.py b/services/web/server/src/simcore_service_webserver/projects/_folders_service.py index 91a892e64bb..dfdcb82a6a5 100644 --- a/services/web/server/src/simcore_service_webserver/projects/_folders_service.py +++ b/services/web/server/src/simcore_service_webserver/projects/_folders_service.py @@ -9,7 +9,7 @@ from ..folders import _folders_repository as _folders_repository from . import _folders_repository as project_to_folders_db from ._access_rights_service import get_user_project_access_rights -from .db import APP_PROJECT_DBAPI, ProjectDBAPI +from ._projects_repository_legacy import APP_PROJECT_DBAPI, ProjectDBAPI from .exceptions import ProjectInvalidRightsError _logger = logging.getLogger(__name__) diff --git a/services/web/server/src/simcore_service_webserver/projects/_groups_service.py b/services/web/server/src/simcore_service_webserver/projects/_groups_service.py index a0225edc31b..ae81118c305 100644 --- a/services/web/server/src/simcore_service_webserver/projects/_groups_service.py +++ b/services/web/server/src/simcore_service_webserver/projects/_groups_service.py @@ -12,7 +12,7 @@ from . import _groups_respository as projects_groups_db from ._access_rights_service import check_user_project_permission from ._groups_respository import ProjectGroupGetDB -from .db import APP_PROJECT_DBAPI, ProjectDBAPI +from ._projects_repository_legacy import APP_PROJECT_DBAPI, ProjectDBAPI from .exceptions import ProjectInvalidRightsError _logger = logging.getLogger(__name__) diff --git a/services/web/server/src/simcore_service_webserver/projects/_projects_access.py b/services/web/server/src/simcore_service_webserver/projects/_projects_access.py index c0054dc5c3f..729a90612cf 100644 --- a/services/web/server/src/simcore_service_webserver/projects/_projects_access.py +++ b/services/web/server/src/simcore_service_webserver/projects/_projects_access.py @@ -4,7 +4,7 @@ from ..projects.api import check_user_project_permission from ..security.api import get_access_model -from .db import ProjectDBAPI +from ._projects_repository_legacy import ProjectDBAPI async def can_update_node_inputs(context): diff --git a/services/web/server/src/simcore_service_webserver/projects/_projects_db.py b/services/web/server/src/simcore_service_webserver/projects/_projects_repository.py similarity index 100% rename from services/web/server/src/simcore_service_webserver/projects/_projects_db.py rename to services/web/server/src/simcore_service_webserver/projects/_projects_repository.py diff --git a/services/web/server/src/simcore_service_webserver/projects/db.py b/services/web/server/src/simcore_service_webserver/projects/_projects_repository_legacy.py similarity index 99% rename from services/web/server/src/simcore_service_webserver/projects/db.py rename to services/web/server/src/simcore_service_webserver/projects/_projects_repository_legacy.py index a52cff6ad27..e322c947a1a 100644 --- a/services/web/server/src/simcore_service_webserver/projects/db.py +++ b/services/web/server/src/simcore_service_webserver/projects/_projects_repository_legacy.py @@ -74,7 +74,8 @@ total_project_comments, update_project_comment, ) -from ._db_utils import ( +from ._projects_repository import PROJECT_DB_COLS +from ._projects_repository_legacy_utils import ( ANY_USER_ID_SENTINEL, BaseProjectDB, ProjectAccessRights, @@ -85,7 +86,6 @@ patch_workbench, update_workbench, ) -from ._projects_db import PROJECT_DB_COLS from .exceptions import ( ProjectDeleteError, ProjectInvalidRightsError, diff --git a/services/web/server/src/simcore_service_webserver/projects/_db_utils.py b/services/web/server/src/simcore_service_webserver/projects/_projects_repository_legacy_utils.py similarity index 99% rename from services/web/server/src/simcore_service_webserver/projects/_db_utils.py rename to services/web/server/src/simcore_service_webserver/projects/_projects_repository_legacy_utils.py index ecc88a5a59e..c92c5910d06 100644 --- a/services/web/server/src/simcore_service_webserver/projects/_db_utils.py +++ b/services/web/server/src/simcore_service_webserver/projects/_projects_repository_legacy_utils.py @@ -24,7 +24,7 @@ from ..db.models import GroupType, groups, projects_tags, user_to_groups, users from ..users.exceptions import UserNotFoundError from ..utils import format_datetime -from ._projects_db import PROJECT_DB_COLS +from ._projects_repository import PROJECT_DB_COLS from .exceptions import ( NodeNotFoundError, ProjectInvalidRightsError, diff --git a/services/web/server/src/simcore_service_webserver/projects/_projects_service_delete.py b/services/web/server/src/simcore_service_webserver/projects/_projects_service_delete.py index bd021a4810f..3c0e6039cbb 100644 --- a/services/web/server/src/simcore_service_webserver/projects/_projects_service_delete.py +++ b/services/web/server/src/simcore_service_webserver/projects/_projects_service_delete.py @@ -11,7 +11,7 @@ from servicelib.redis._errors import ProjectLockError from ..director_v2 import api as director_v2_service -from . import _projects_db as _projects_repository +from . import _projects_repository as _projects_repository from . import projects_service from .exceptions import ProjectDeleteError, ProjectNotFoundError @@ -37,8 +37,7 @@ def _monitor_step(steps: dict[str, Any], *, name: str, elapsed: bool = False): class StopServicesCallback(Protocol): - async def __call__(self, app: web.Application, project_uuid: ProjectID) -> None: - ... + async def __call__(self, app: web.Application, project_uuid: ProjectID) -> None: ... async def batch_stop_services_in_project( diff --git a/services/web/server/src/simcore_service_webserver/projects/_tags_service.py b/services/web/server/src/simcore_service_webserver/projects/_tags_service.py index 5693a8680a3..ea9d3e0d783 100644 --- a/services/web/server/src/simcore_service_webserver/projects/_tags_service.py +++ b/services/web/server/src/simcore_service_webserver/projects/_tags_service.py @@ -9,7 +9,7 @@ from ..workspaces import _workspaces_repository as workspaces_db from ._access_rights_service import check_user_project_permission -from .db import ProjectDBAPI +from ._projects_repository_legacy import ProjectDBAPI from .models import ProjectDict _logger = logging.getLogger(__name__) diff --git a/services/web/server/src/simcore_service_webserver/projects/_trash_service.py b/services/web/server/src/simcore_service_webserver/projects/_trash_service.py index 27e486809e9..f0669197814 100644 --- a/services/web/server/src/simcore_service_webserver/projects/_trash_service.py +++ b/services/web/server/src/simcore_service_webserver/projects/_trash_service.py @@ -16,10 +16,10 @@ from ..director_v2 import api as director_v2_api from ..dynamic_scheduler import api as dynamic_scheduler_api from . import _crud_api_read -from . import _projects_db as _projects_repository +from . import _projects_repository as _projects_repository from . import _projects_service_delete, projects_service from ._access_rights_service import check_user_project_permission -from ._projects_db import _OLDEST_TRASHED_FIRST +from ._projects_repository import _OLDEST_TRASHED_FIRST from .exceptions import ( ProjectNotFoundError, ProjectNotTrashedError, diff --git a/services/web/server/src/simcore_service_webserver/projects/_wallets_service.py b/services/web/server/src/simcore_service_webserver/projects/_wallets_service.py index 1610cb4c363..4148fdbcbbe 100644 --- a/services/web/server/src/simcore_service_webserver/projects/_wallets_service.py +++ b/services/web/server/src/simcore_service_webserver/projects/_wallets_service.py @@ -18,7 +18,7 @@ from ..rabbitmq import get_rabbitmq_rpc_client from ..users import api as users_api from ..wallets import _api as wallets_api -from .db import ProjectDBAPI +from ._projects_repository_legacy import ProjectDBAPI from .exceptions import ( ProjectInDebtCanNotChangeWalletError, ProjectInDebtCanNotOpenError, diff --git a/services/web/server/src/simcore_service_webserver/projects/_workspaces_service.py b/services/web/server/src/simcore_service_webserver/projects/_workspaces_service.py index 9c656c05c55..fcfeb608c3a 100644 --- a/services/web/server/src/simcore_service_webserver/projects/_workspaces_service.py +++ b/services/web/server/src/simcore_service_webserver/projects/_workspaces_service.py @@ -12,7 +12,7 @@ from ..workspaces.api import check_user_workspace_access from . import _folders_repository as project_to_folders_db from . import _groups_respository as project_groups_db -from . import _projects_db +from . import _projects_repository from ._access_rights_service import get_user_project_access_rights from .exceptions import ProjectInvalidRightsError @@ -53,7 +53,7 @@ async def move_project_into_workspace( ) # 4. Update workspace ID on the project resource - await _projects_db.patch_project( + await _projects_repository.patch_project( app=app, connection=conn, project_uuid=project_id, diff --git a/services/web/server/src/simcore_service_webserver/projects/plugin.py b/services/web/server/src/simcore_service_webserver/projects/plugin.py index a8f254ea948..4acb0e8e1e8 100644 --- a/services/web/server/src/simcore_service_webserver/projects/plugin.py +++ b/services/web/server/src/simcore_service_webserver/projects/plugin.py @@ -10,10 +10,6 @@ from servicelib.aiohttp.application_setup import ModuleCategory, app_module_setup from ..constants import APP_SETTINGS_KEY -from . import ( - _trash_rest, - _wallets_rest, -) from ._controller import ( comments_rest, folders_rest, @@ -25,11 +21,13 @@ projects_rest, projects_states_rest, tags_rest, + trash_rest, + wallets_rest, workspaces_rest, ) from ._controller.projects_slot import setup_project_observer_events from ._projects_access import setup_projects_access -from .db import setup_projects_db +from ._projects_repository_legacy import setup_projects_db logger = logging.getLogger(__name__) @@ -61,10 +59,10 @@ def setup_projects(app: web.Application) -> bool: app.router.add_routes(ports_rest.routes) app.router.add_routes(nodes_rest.routes) app.router.add_routes(tags_rest.routes) - app.router.add_routes(_wallets_rest.routes) + app.router.add_routes(wallets_rest.routes) app.router.add_routes(folders_rest.routes) app.router.add_routes(nodes_pricing_unit_rest.routes) app.router.add_routes(workspaces_rest.routes) - app.router.add_routes(_trash_rest.routes) + app.router.add_routes(trash_rest.routes) return True diff --git a/services/web/server/src/simcore_service_webserver/projects/projects_service.py b/services/web/server/src/simcore_service_webserver/projects/projects_service.py index 82a74aa36ec..0c577a2ae14 100644 --- a/services/web/server/src/simcore_service_webserver/projects/projects_service.py +++ b/services/web/server/src/simcore_service_webserver/projects/projects_service.py @@ -126,17 +126,17 @@ from . import ( _crud_api_delete, _nodes_service, - _projects_db, _projects_nodes_repository, + _projects_repository, _wallets_service, ) from ._access_rights_service import ( check_user_project_permission, has_user_project_access_rights, ) -from ._db_utils import PermissionStr from ._nodes_utils import set_reservation_same_as_limit, validate_new_service_resources -from .db import APP_PROJECT_DBAPI, ProjectDBAPI +from ._projects_repository_legacy import APP_PROJECT_DBAPI, ProjectDBAPI +from ._projects_repository_legacy_utils import PermissionStr from .exceptions import ( ClustersKeeperNotAvailableError, DefaultPricingUnitNotFoundError, @@ -219,7 +219,7 @@ async def get_project_for_user( and project.get("trashed_by", project.get("trashedBy")) is not None ): project.update( - trashedByPrimaryGid=await _projects_db.get_trashed_by_primary_gid( + trashedByPrimaryGid=await _projects_repository.get_trashed_by_primary_gid( app, projects_uuid=project["uuid"] ) ) @@ -305,7 +305,7 @@ async def patch_project( raise ProjectOwnerNotFoundInTheProjectAccessRightsError # 4. Patch the project - await _projects_db.patch_project( + await _projects_repository.patch_project( app=app, project_uuid=project_uuid, new_partial_project_data=patch_project_data, diff --git a/services/web/server/src/simcore_service_webserver/studies_dispatcher/_projects.py b/services/web/server/src/simcore_service_webserver/studies_dispatcher/_projects.py index 9067cd58a7a..16151e1af37 100644 --- a/services/web/server/src/simcore_service_webserver/studies_dispatcher/_projects.py +++ b/services/web/server/src/simcore_service_webserver/studies_dispatcher/_projects.py @@ -1,8 +1,8 @@ -""" Projects management +"""Projects management - Keeps functionality that couples with the following app modules - - projects - - TMP: add_new_project includes to projects and director_v2 app modules! +Keeps functionality that couples with the following app modules + - projects + - TMP: add_new_project includes to projects and director_v2 app modules! """ @@ -21,7 +21,7 @@ from pydantic import AnyUrl, HttpUrl, TypeAdapter from servicelib.logging_utils import log_decorator -from ..projects.db import ProjectDBAPI +from ..projects._projects_repository_legacy import ProjectDBAPI from ..projects.exceptions import ProjectInvalidRightsError, ProjectNotFoundError from ..projects.projects_service import get_project_for_user from ..utils import now_str @@ -189,7 +189,7 @@ async def _add_new_project( # TODO: this piece was taken from the end of projects.projects_handlers.create_projects from ..director_v2.api import create_or_update_pipeline - from ..projects.db import APP_PROJECT_DBAPI + from ..projects._projects_repository_legacy import APP_PROJECT_DBAPI db: ProjectDBAPI = app[APP_PROJECT_DBAPI] diff --git a/services/web/server/src/simcore_service_webserver/studies_dispatcher/_studies_access.py b/services/web/server/src/simcore_service_webserver/studies_dispatcher/_studies_access.py index b5bfb26ede9..ef7d37569f7 100644 --- a/services/web/server/src/simcore_service_webserver/studies_dispatcher/_studies_access.py +++ b/services/web/server/src/simcore_service_webserver/studies_dispatcher/_studies_access.py @@ -31,8 +31,8 @@ from ..dynamic_scheduler import api as dynamic_scheduler_api from ..products import products_web from ..projects._groups_respository import get_project_group +from ..projects._projects_repository_legacy import ProjectDBAPI from ..projects.api import check_user_project_permission -from ..projects.db import ProjectDBAPI from ..projects.exceptions import ( ProjectGroupNotFoundError, ProjectInvalidRightsError, @@ -141,7 +141,7 @@ async def copy_study_to_account( - Replaces template parameters by values passed in query - Avoids multiple copies of the same template on each account """ - from ..projects.db import APP_PROJECT_DBAPI + from ..projects._projects_repository_legacy import APP_PROJECT_DBAPI from ..projects.utils import clone_project_document, substitute_parameterized_inputs db: ProjectDBAPI = request.config_dict[APP_PROJECT_DBAPI] diff --git a/services/web/server/src/simcore_service_webserver/workspaces/_workspaces_service.py b/services/web/server/src/simcore_service_webserver/workspaces/_workspaces_service.py index e87dc72d054..e96e7937eb4 100644 --- a/services/web/server/src/simcore_service_webserver/workspaces/_workspaces_service.py +++ b/services/web/server/src/simcore_service_webserver/workspaces/_workspaces_service.py @@ -13,7 +13,7 @@ ) from pydantic import NonNegativeInt -from ..projects._db_utils import PermissionStr +from ..projects._projects_repository_legacy_utils import PermissionStr from ..users.api import get_user from . import _workspaces_repository as db from .errors import WorkspaceAccessForbiddenError diff --git a/services/web/server/tests/unit/isolated/test_projects__db_utils.py b/services/web/server/tests/unit/isolated/test_projects__db_utils.py index 2a5203ae137..06631e73a4b 100644 --- a/services/web/server/tests/unit/isolated/test_projects__db_utils.py +++ b/services/web/server/tests/unit/isolated/test_projects__db_utils.py @@ -16,11 +16,7 @@ from models_library.projects_nodes import Node from models_library.services import ServiceKey from models_library.utils.fastapi_encoders import jsonable_encoder -from simcore_service_webserver.projects._db_utils import ( - DB_EXCLUSIVE_COLUMNS, - SCHEMA_NON_NULL_KEYS, -) -from simcore_service_webserver.projects.db import ( +from simcore_service_webserver.projects._projects_repository_legacy import ( ProjectAccessRights, assemble_array_groups, convert_to_db_names, @@ -29,6 +25,10 @@ patch_workbench, update_workbench, ) +from simcore_service_webserver.projects._projects_repository_legacy_utils import ( + DB_EXCLUSIVE_COLUMNS, + SCHEMA_NON_NULL_KEYS, +) from simcore_service_webserver.projects.exceptions import ( NodeNotFoundError, ProjectInvalidUsageError, diff --git a/services/web/server/tests/unit/with_dbs/02/test_projects_repository.py b/services/web/server/tests/unit/with_dbs/02/test_projects_repository.py index da2307578a6..6dccd486a0b 100644 --- a/services/web/server/tests/unit/with_dbs/02/test_projects_repository.py +++ b/services/web/server/tests/unit/with_dbs/02/test_projects_repository.py @@ -12,7 +12,7 @@ from common_library.users_enums import UserRole from pytest_simcore.helpers.webserver_login import UserInfoDict from simcore_service_webserver.projects import ( - _projects_db as projects_service_repository, + _projects_repository as projects_service_repository, ) from simcore_service_webserver.projects.exceptions import ProjectNotFoundError from simcore_service_webserver.projects.models import ProjectDBGet, ProjectDict diff --git a/services/web/server/tests/unit/with_dbs/03/test_project_db.py b/services/web/server/tests/unit/with_dbs/03/test_project_db.py index a39f248521d..80844ea6eec 100644 --- a/services/web/server/tests/unit/with_dbs/03/test_project_db.py +++ b/services/web/server/tests/unit/with_dbs/03/test_project_db.py @@ -29,12 +29,17 @@ from simcore_postgres_database.models.projects_to_products import projects_to_products from simcore_postgres_database.models.users import UserRole from simcore_postgres_database.utils_projects_nodes import ProjectNodesRepo -from simcore_service_webserver.projects._db_utils import PermissionStr from simcore_service_webserver.projects._groups_respository import ( update_or_insert_project_group, ) +from simcore_service_webserver.projects._projects_repository_legacy import ( + ProjectAccessRights, + ProjectDBAPI, +) +from simcore_service_webserver.projects._projects_repository_legacy_utils import ( + PermissionStr, +) from simcore_service_webserver.projects.api import has_user_project_access_rights -from simcore_service_webserver.projects.db import ProjectAccessRights, ProjectDBAPI from simcore_service_webserver.projects.exceptions import ( NodeNotFoundError, ProjectNodeRequiredInputsNotSetError, From 1185af468fe9a14273c418d4d4e02f707fcbb812 Mon Sep 17 00:00:00 2001 From: Pedro Crespo-Valero <32402063+pcrespov@users.noreply.github.com> Date: Fri, 21 Mar 2025 14:56:19 +0100 Subject: [PATCH 13/39] projects service --- .../_db_comp_tasks_listening_task.py | 11 +++-- .../exporter/_formatter/_sds.py | 2 +- .../exporter/_handlers.py | 2 +- .../folders/_folders_service.py | 18 +++---- .../garbage_collector/_core_disconnected.py | 2 +- .../garbage_collector/_core_guests.py | 5 +- .../garbage_collector/_core_orphans.py | 4 +- .../_rabbitmq_exclusive_queue_consumers.py | 4 +- .../projects/_controller/comments_rest.py | 12 ++--- .../_controller/nodes_pricing_unit_rest.py | 8 ++-- .../projects/_controller/nodes_rest.py | 48 ++++++++++--------- .../projects/_controller/ports_rest.py | 4 +- .../projects/_controller/projects_rest.py | 14 +++--- .../projects/_controller/projects_slot.py | 2 +- .../_controller/projects_states_rest.py | 26 +++++----- .../projects/_crud_api_create.py | 12 ++--- .../projects/_crud_api_read.py | 4 +- ...ojects_service.py => _projects_service.py} | 0 .../projects/_projects_service_delete.py | 4 +- .../projects/_trash_service.py | 10 ++-- .../projects/nodes_utils.py | 10 ++-- .../studies_dispatcher/_projects.py | 2 +- .../tests/unit/with_dbs/03/test_project_db.py | 6 +-- .../test_resource_manager.py | 4 +- .../test_studies_dispatcher_projects.py | 2 +- .../test_studies_dispatcher_studies_access.py | 4 +- 26 files changed, 114 insertions(+), 106 deletions(-) rename services/web/server/src/simcore_service_webserver/projects/{projects_service.py => _projects_service.py} (100%) diff --git a/services/web/server/src/simcore_service_webserver/db_listener/_db_comp_tasks_listening_task.py b/services/web/server/src/simcore_service_webserver/db_listener/_db_comp_tasks_listening_task.py index 2777fe57e49..f6f3853eaf7 100644 --- a/services/web/server/src/simcore_service_webserver/db_listener/_db_comp_tasks_listening_task.py +++ b/services/web/server/src/simcore_service_webserver/db_listener/_db_comp_tasks_listening_task.py @@ -2,6 +2,7 @@ First a procedure is registered in postgres that gets triggered whenever the outputs of a record in comp_task table is changed. """ + import asyncio import json import logging @@ -22,7 +23,7 @@ from sqlalchemy.sql import select from ..db.plugin import get_database_engine -from ..projects import exceptions, projects_service +from ..projects import _projects_service, exceptions from ..projects.nodes_utils import update_node_outputs from ._utils import convert_state_from_db @@ -47,12 +48,14 @@ async def _update_project_state( new_state: RunningState, node_errors: list[ErrorDict] | None, ) -> None: - project = await projects_service.update_project_node_state( + project = await _projects_service.update_project_node_state( app, user_id, project_uuid, node_uuid, new_state ) - await projects_service.notify_project_node_update(app, project, node_uuid, node_errors) - await projects_service.notify_project_state_update(app, project) + await _projects_service.notify_project_node_update( + app, project, node_uuid, node_errors + ) + await _projects_service.notify_project_state_update(app, project) @dataclass(frozen=True) diff --git a/services/web/server/src/simcore_service_webserver/exporter/_formatter/_sds.py b/services/web/server/src/simcore_service_webserver/exporter/_formatter/_sds.py index d605ada5e59..806e33b5df5 100644 --- a/services/web/server/src/simcore_service_webserver/exporter/_formatter/_sds.py +++ b/services/web/server/src/simcore_service_webserver/exporter/_formatter/_sds.py @@ -8,9 +8,9 @@ from servicelib.pools import non_blocking_process_pool_executor from ...catalog import catalog_service +from ...projects._projects_service import get_project_for_user from ...projects.exceptions import BaseProjectError from ...projects.models import ProjectDict -from ...projects.projects_service import get_project_for_user from ...scicrunch.db import ResearchResourceRepository from ..exceptions import SDSException from .template_json import write_template_json diff --git a/services/web/server/src/simcore_service_webserver/exporter/_handlers.py b/services/web/server/src/simcore_service_webserver/exporter/_handlers.py index 783ec5679c0..db7466c8e73 100644 --- a/services/web/server/src/simcore_service_webserver/exporter/_handlers.py +++ b/services/web/server/src/simcore_service_webserver/exporter/_handlers.py @@ -15,7 +15,7 @@ from .._meta import API_VTAG from ..constants import RQ_PRODUCT_KEY from ..login.decorators import login_required -from ..projects.projects_service import create_user_notification_cb +from ..projects._projects_service import create_user_notification_cb from ..redis import get_redis_lock_manager_client_sdk from ..security.decorators import permission_required from ..users.api import get_user_fullname diff --git a/services/web/server/src/simcore_service_webserver/folders/_folders_service.py b/services/web/server/src/simcore_service_webserver/folders/_folders_service.py index 26e50075959..ffe542dccf7 100644 --- a/services/web/server/src/simcore_service_webserver/folders/_folders_service.py +++ b/services/web/server/src/simcore_service_webserver/folders/_folders_service.py @@ -15,7 +15,7 @@ from servicelib.common_headers import UNDEFINED_DEFAULT_SIMCORE_USER_AGENT_VALUE from servicelib.utils import fire_and_forget_task -from ..projects.projects_service import submit_delete_project_task +from ..projects._projects_service import submit_delete_project_task from ..users.api import get_user from ..workspaces.api import check_user_workspace_access from ..workspaces.errors import ( @@ -352,14 +352,14 @@ async def delete_folder( # 1. Delete folder content # 1.1 Delete all child projects that I am an owner - project_id_list: list[ - ProjectID - ] = await _folders_repository.get_projects_recursively_only_if_user_is_owner( - app, - folder_id=folder_id, - private_workspace_user_id_or_none=user_id if workspace_is_private else None, - user_id=user_id, - product_name=product_name, + project_id_list: list[ProjectID] = ( + await _folders_repository.get_projects_recursively_only_if_user_is_owner( + app, + folder_id=folder_id, + private_workspace_user_id_or_none=user_id if workspace_is_private else None, + user_id=user_id, + product_name=product_name, + ) ) # fire and forget task for project deletion diff --git a/services/web/server/src/simcore_service_webserver/garbage_collector/_core_disconnected.py b/services/web/server/src/simcore_service_webserver/garbage_collector/_core_disconnected.py index 68a7c6b55bf..fb5b149cb16 100644 --- a/services/web/server/src/simcore_service_webserver/garbage_collector/_core_disconnected.py +++ b/services/web/server/src/simcore_service_webserver/garbage_collector/_core_disconnected.py @@ -5,8 +5,8 @@ from servicelib.common_headers import UNDEFINED_DEFAULT_SIMCORE_USER_AGENT_VALUE from servicelib.utils import logged_gather +from ..projects._projects_service import remove_project_dynamic_services from ..projects.exceptions import ProjectLockError, ProjectNotFoundError -from ..projects.projects_service import remove_project_dynamic_services from ..redis import get_redis_lock_manager_client from ..resource_manager.registry import ( RedisResourceRegistry, diff --git a/services/web/server/src/simcore_service_webserver/garbage_collector/_core_guests.py b/services/web/server/src/simcore_service_webserver/garbage_collector/_core_guests.py index ed00ce5d4b0..20f3bb45e8b 100644 --- a/services/web/server/src/simcore_service_webserver/garbage_collector/_core_guests.py +++ b/services/web/server/src/simcore_service_webserver/garbage_collector/_core_guests.py @@ -12,8 +12,11 @@ from simcore_postgres_database.models.users import UserRole from ..projects._projects_repository_legacy import ProjectDBAPI +from ..projects._projects_service import ( + get_project_for_user, + submit_delete_project_task, +) from ..projects.exceptions import ProjectDeleteError, ProjectNotFoundError -from ..projects.projects_service import get_project_for_user, submit_delete_project_task from ..redis import get_redis_lock_manager_client from ..resource_manager.registry import RedisResourceRegistry from ..users import exceptions diff --git a/services/web/server/src/simcore_service_webserver/garbage_collector/_core_orphans.py b/services/web/server/src/simcore_service_webserver/garbage_collector/_core_orphans.py index 66579377779..37e2eb29f4a 100644 --- a/services/web/server/src/simcore_service_webserver/garbage_collector/_core_orphans.py +++ b/services/web/server/src/simcore_service_webserver/garbage_collector/_core_orphans.py @@ -15,11 +15,11 @@ from servicelib.utils import limited_as_completed, logged_gather from ..dynamic_scheduler import api as dynamic_scheduler_api -from ..projects.api import has_user_project_access_rights -from ..projects.projects_service import ( +from ..projects._projects_service import ( is_node_id_present_in_any_project_workbench, list_node_ids_in_project, ) +from ..projects.api import has_user_project_access_rights from ..resource_manager.registry import RedisResourceRegistry from ..users.api import get_user_role from ..users.exceptions import UserNotFoundError diff --git a/services/web/server/src/simcore_service_webserver/notifications/_rabbitmq_exclusive_queue_consumers.py b/services/web/server/src/simcore_service_webserver/notifications/_rabbitmq_exclusive_queue_consumers.py index 4193c6fce7f..ecaf6054a22 100644 --- a/services/web/server/src/simcore_service_webserver/notifications/_rabbitmq_exclusive_queue_consumers.py +++ b/services/web/server/src/simcore_service_webserver/notifications/_rabbitmq_exclusive_queue_consumers.py @@ -18,7 +18,7 @@ from servicelib.rabbitmq import RabbitMQClient from servicelib.utils import logged_gather -from ..projects import projects_service +from ..projects import _projects_service from ..projects.exceptions import ProjectNotFoundError from ..rabbitmq import get_rabbitmq_client from ..socketio.messages import ( @@ -42,7 +42,7 @@ async def _convert_to_node_update_event( app: web.Application, message: ProgressRabbitMessageNode ) -> SocketMessageDict | None: try: - project = await projects_service.get_project_for_user( + project = await _projects_service.get_project_for_user( app, f"{message.project_id}", message.user_id ) if f"{message.node_id}" in project["workbench"]: diff --git a/services/web/server/src/simcore_service_webserver/projects/_controller/comments_rest.py b/services/web/server/src/simcore_service_webserver/projects/_controller/comments_rest.py index 7223424e4c9..41ea58d2043 100644 --- a/services/web/server/src/simcore_service_webserver/projects/_controller/comments_rest.py +++ b/services/web/server/src/simcore_service_webserver/projects/_controller/comments_rest.py @@ -26,7 +26,7 @@ from ...login.decorators import login_required from ...security.decorators import permission_required from ...utils_aiohttp import envelope_json_response -from .. import _comments_service, projects_service +from .. import _comments_service, _projects_service from ._rest_exceptions import handle_plugin_requests_exceptions from ._rest_schemas import RequestContext @@ -67,7 +67,7 @@ async def create_project_comment(request: web.Request): body_params = await parse_request_body_as(_ProjectCommentsBodyParams, request) # ensure the project exists - await projects_service.get_project_for_user( + await _projects_service.get_project_for_user( request.app, project_uuid=f"{path_params.project_uuid}", user_id=req_ctx.user_id, @@ -109,7 +109,7 @@ async def list_project_comments(request: web.Request): ) # ensure the project exists - await projects_service.get_project_for_user( + await _projects_service.get_project_for_user( request.app, project_uuid=f"{path_params.project_uuid}", user_id=req_ctx.user_id, @@ -158,7 +158,7 @@ async def update_project_comment(request: web.Request): body_params = await parse_request_body_as(_ProjectCommentsBodyParams, request) # ensure the project exists - await projects_service.get_project_for_user( + await _projects_service.get_project_for_user( request.app, project_uuid=f"{path_params.project_uuid}", user_id=req_ctx.user_id, @@ -188,7 +188,7 @@ async def delete_project_comment(request: web.Request): ) # ensure the project exists - await projects_service.get_project_for_user( + await _projects_service.get_project_for_user( request.app, project_uuid=f"{path_params.project_uuid}", user_id=req_ctx.user_id, @@ -216,7 +216,7 @@ async def get_project_comment(request: web.Request): ) # ensure the project exists - await projects_service.get_project_for_user( + await _projects_service.get_project_for_user( request.app, project_uuid=f"{path_params.project_uuid}", user_id=req_ctx.user_id, diff --git a/services/web/server/src/simcore_service_webserver/projects/_controller/nodes_pricing_unit_rest.py b/services/web/server/src/simcore_service_webserver/projects/_controller/nodes_pricing_unit_rest.py index e4b0649410e..4420ed2ae8f 100644 --- a/services/web/server/src/simcore_service_webserver/projects/_controller/nodes_pricing_unit_rest.py +++ b/services/web/server/src/simcore_service_webserver/projects/_controller/nodes_pricing_unit_rest.py @@ -16,7 +16,7 @@ from ...resource_usage import service as rut_api from ...security.decorators import permission_required from ...utils_aiohttp import envelope_json_response -from .. import projects_service +from .. import _projects_service from .._projects_repository_legacy import ProjectDBAPI from ._rest_exceptions import handle_plugin_requests_exceptions from ._rest_schemas import RequestContext @@ -48,7 +48,7 @@ async def get_project_node_pricing_unit(request: web.Request): path_params = parse_request_path_parameters_as(NodePathParams, request) # ensure the project exists - await projects_service.get_project_for_user( + await _projects_service.get_project_for_user( request.app, project_uuid=f"{path_params.project_id}", user_id=req_ctx.user_id, @@ -97,7 +97,7 @@ async def connect_pricing_unit_to_project_node(request: web.Request): ) # ensure the project exists - project = await projects_service.get_project_for_user( + project = await _projects_service.get_project_for_user( request.app, project_uuid=f"{path_params.project_id}", user_id=req_ctx.user_id, @@ -123,7 +123,7 @@ async def connect_pricing_unit_to_project_node(request: web.Request): node_data = project["workbench"][NodeIDStr(f"{path_params.node_id}")] - await projects_service.update_project_node_resources_from_hardware_info( + await _projects_service.update_project_node_resources_from_hardware_info( request.app, user_id=req_ctx.user_id, project_id=path_params.project_id, diff --git a/services/web/server/src/simcore_service_webserver/projects/_controller/nodes_rest.py b/services/web/server/src/simcore_service_webserver/projects/_controller/nodes_rest.py index 41dd29f33a4..6e31dc63137 100644 --- a/services/web/server/src/simcore_service_webserver/projects/_controller/nodes_rest.py +++ b/services/web/server/src/simcore_service_webserver/projects/_controller/nodes_rest.py @@ -67,7 +67,7 @@ from ...utils_aiohttp import envelope_json_response from .. import _access_rights_service as access_rights_service from .. import _nodes_service as _nodes_service -from .. import nodes_utils, projects_service +from .. import _projects_service, nodes_utils from .._nodes_service import NodeScreenshot, get_node_screenshots from ..api import has_user_project_access_rights from ..exceptions import ( @@ -101,7 +101,7 @@ async def create_node(request: web.Request) -> web.Response: path_params = parse_request_path_parameters_as(ProjectPathParams, request) body = await parse_request_body_as(NodeCreate, request) - if await projects_service.is_service_deprecated( + if await _projects_service.is_service_deprecated( request.app, req_ctx.user_id, body.service_key, @@ -113,13 +113,13 @@ async def create_node(request: web.Request) -> web.Response: ) # ensure the project exists - project_data = await projects_service.get_project_for_user( + project_data = await _projects_service.get_project_for_user( request.app, project_uuid=f"{path_params.project_id}", user_id=req_ctx.user_id, ) data = { - "node_id": await projects_service.add_project_node( + "node_id": await _projects_service.add_project_node( request, project_data, req_ctx.user_id, @@ -144,13 +144,13 @@ async def get_node(request: web.Request) -> web.Response: path_params = parse_request_path_parameters_as(NodePathParams, request) # ensure the project exists - project = await projects_service.get_project_for_user( + project = await _projects_service.get_project_for_user( request.app, project_uuid=f"{path_params.project_id}", user_id=req_ctx.user_id, ) - if await projects_service.is_project_node_deprecated( + if await _projects_service.is_project_node_deprecated( request.app, req_ctx.user_id, project, @@ -182,7 +182,7 @@ async def patch_project_node(request: web.Request) -> web.Response: path_params = parse_request_path_parameters_as(NodePathParams, request) node_patch = await parse_request_body_as(NodePatch, request) - await projects_service.patch_project_node( + await _projects_service.patch_project_node( request.app, product_name=req_ctx.product_name, user_id=req_ctx.user_id, @@ -203,12 +203,12 @@ async def delete_node(request: web.Request) -> web.Response: path_params = parse_request_path_parameters_as(NodePathParams, request) # ensure the project exists - await projects_service.get_project_for_user( + await _projects_service.get_project_for_user( request.app, project_uuid=f"{path_params.project_id}", user_id=req_ctx.user_id, ) - await projects_service.delete_project_node( + await _projects_service.delete_project_node( request, path_params.project_id, req_ctx.user_id, @@ -278,7 +278,7 @@ async def start_node(request: web.Request) -> web.Response: req_ctx = RequestContext.model_validate(request) path_params = parse_request_path_parameters_as(NodePathParams, request) - await projects_service.start_project_node( + await _projects_service.start_project_node( request, product_name=req_ctx.product_name, user_id=req_ctx.user_id, @@ -388,7 +388,7 @@ async def get_node_resources(request: web.Request) -> web.Response: path_params = parse_request_path_parameters_as(NodePathParams, request) # ensure the project exists - project = await projects_service.get_project_for_user( + project = await _projects_service.get_project_for_user( request.app, project_uuid=f"{path_params.project_id}", user_id=req_ctx.user_id, @@ -398,13 +398,15 @@ async def get_node_resources(request: web.Request) -> web.Response: node_id = f"{path_params.node_id}" raise NodeNotFoundError(project_uuid=project_uuid, node_uuid=node_id) - resources: ServiceResourcesDict = await projects_service.get_project_node_resources( - request.app, - user_id=req_ctx.user_id, - project_id=path_params.project_id, - node_id=path_params.node_id, - service_key=project["workbench"][f"{path_params.node_id}"]["key"], - service_version=project["workbench"][f"{path_params.node_id}"]["version"], + resources: ServiceResourcesDict = ( + await _projects_service.get_project_node_resources( + request.app, + user_id=req_ctx.user_id, + project_id=path_params.project_id, + node_id=path_params.node_id, + service_key=project["workbench"][f"{path_params.node_id}"]["key"], + service_version=project["workbench"][f"{path_params.node_id}"]["version"], + ) ) return envelope_json_response(resources) @@ -422,7 +424,7 @@ async def replace_node_resources(request: web.Request) -> web.Response: body = await parse_request_body_as(ServiceResourcesDict, request) # ensure the project exists - project = await projects_service.get_project_for_user( + project = await _projects_service.get_project_for_user( request.app, project_uuid=f"{path_params.project_id}", user_id=req_ctx.user_id, @@ -432,7 +434,7 @@ async def replace_node_resources(request: web.Request) -> web.Response: project_uuid=f"{path_params.project_id}", node_uuid=f"{path_params.node_id}" ) try: - new_node_resources = await projects_service.update_project_node_resources( + new_node_resources = await _projects_service.update_project_node_resources( request.app, user_id=req_ctx.user_id, project_id=path_params.project_id, @@ -525,7 +527,7 @@ async def get_project_services_access_for_gid(request: web.Request) -> web.Respo _ServicesAccessQuery, request ) - project = await projects_service.get_project_for_user( + project = await _projects_service.get_project_for_user( request.app, project_uuid=f"{path_params.project_id}", user_id=req_ctx.user_id, @@ -642,7 +644,7 @@ async def list_project_nodes_previews(request: web.Request) -> web.Response: assert req_ctx # nosec nodes_previews: list[_ProjectNodePreview] = [] - project_data = await projects_service.get_project_for_user( + project_data = await _projects_service.get_project_for_user( request.app, project_uuid=f"{path_params.project_id}", user_id=req_ctx.user_id, @@ -681,7 +683,7 @@ async def get_project_node_preview(request: web.Request) -> web.Response: path_params = parse_request_path_parameters_as(NodePathParams, request) assert req_ctx # nosec - project_data = await projects_service.get_project_for_user( + project_data = await _projects_service.get_project_for_user( request.app, project_uuid=f"{path_params.project_id}", user_id=req_ctx.user_id, diff --git a/services/web/server/src/simcore_service_webserver/projects/_controller/ports_rest.py b/services/web/server/src/simcore_service_webserver/projects/_controller/ports_rest.py index d9b1b1f81b2..b4a28c97286 100644 --- a/services/web/server/src/simcore_service_webserver/projects/_controller/ports_rest.py +++ b/services/web/server/src/simcore_service_webserver/projects/_controller/ports_rest.py @@ -29,7 +29,7 @@ from ...login.decorators import login_required from ...security.decorators import permission_required from ...utils_aiohttp import envelope_json_response -from .. import _ports_service, projects_service +from .. import _ports_service, _projects_service from .._access_rights_service import check_user_project_permission from .._projects_repository_legacy import ProjectDBAPI from ..models import ProjectDict @@ -42,7 +42,7 @@ async def _get_validated_workbench_model( app: web.Application, project_id: ProjectID, user_id: UserID ) -> dict[NodeID, Node]: - project: ProjectDict = await projects_service.get_project_for_user( + project: ProjectDict = await _projects_service.get_project_for_user( app, project_uuid=f"{project_id}", user_id=user_id, diff --git a/services/web/server/src/simcore_service_webserver/projects/_controller/projects_rest.py b/services/web/server/src/simcore_service_webserver/projects/_controller/projects_rest.py index c7228056790..3584902d9c0 100644 --- a/services/web/server/src/simcore_service_webserver/projects/_controller/projects_rest.py +++ b/services/web/server/src/simcore_service_webserver/projects/_controller/projects_rest.py @@ -42,7 +42,7 @@ from ...security.decorators import permission_required from ...users.api import get_user_fullname from ...utils_aiohttp import envelope_json_response -from .. import _crud_api_create, _crud_api_read, projects_service +from .. import _crud_api_create, _crud_api_read, _projects_service from .._crud_handlers_models import ( ProjectActiveQueryParams, ProjectCreateHeaders, @@ -248,7 +248,7 @@ async def get_active_project(request: web.Request) -> web.Response: data = None if user_active_projects: - project = await projects_service.get_project_for_user( + project = await _projects_service.get_project_for_user( request.app, project_uuid=user_active_projects[0], user_id=req_ctx.user_id, @@ -287,7 +287,7 @@ async def get_project(request: web.Request): ) ) - project = await projects_service.get_project_for_user( + project = await _projects_service.get_project_for_user( request.app, project_uuid=f"{path_params.project_id}", user_id=req_ctx.user_id, @@ -328,7 +328,7 @@ async def get_project(request: web.Request): async def get_project_inactivity(request: web.Request): path_params = parse_request_path_parameters_as(ProjectPathParams, request) - project_inactivity = await projects_service.get_project_inactivity( + project_inactivity = await _projects_service.get_project_inactivity( app=request.app, project_id=path_params.project_id ) return web.json_response(Envelope(data=project_inactivity), dumps=json_dumps) @@ -347,7 +347,7 @@ async def patch_project(request: web.Request): path_params = parse_request_path_parameters_as(ProjectPathParams, request) project_patch = await parse_request_body_as(ProjectPatch, request) - await projects_service.patch_project( + await _projects_service.patch_project( request.app, user_id=req_ctx.user_id, project_uuid=path_params.project_id, @@ -379,7 +379,7 @@ async def delete_project(request: web.Request): req_ctx = RequestContext.model_validate(request) path_params = parse_request_path_parameters_as(ProjectPathParams, request) - await projects_service.get_project_for_user( + await _projects_service.get_project_for_user( request.app, project_uuid=f"{path_params.project_id}", user_id=req_ctx.user_id, @@ -417,7 +417,7 @@ async def delete_project(request: web.Request): reason=f"Project {path_params.project_id} is locked: {project_locked_state=}" ) - await projects_service.submit_delete_project_task( + await _projects_service.submit_delete_project_task( request.app, project_uuid=path_params.project_id, user_id=req_ctx.user_id, diff --git a/services/web/server/src/simcore_service_webserver/projects/_controller/projects_slot.py b/services/web/server/src/simcore_service_webserver/projects/_controller/projects_slot.py index d471d63c3c3..8537fbc6616 100644 --- a/services/web/server/src/simcore_service_webserver/projects/_controller/projects_slot.py +++ b/services/web/server/src/simcore_service_webserver/projects/_controller/projects_slot.py @@ -15,7 +15,7 @@ from ...notifications import project_logs from ...resource_manager.user_sessions import PROJECT_ID_KEY, managed_resource -from ..projects_service import retrieve_and_notify_project_locked_state +from .._projects_service import retrieve_and_notify_project_locked_state _logger = logging.getLogger(__name__) diff --git a/services/web/server/src/simcore_service_webserver/projects/_controller/projects_states_rest.py b/services/web/server/src/simcore_service_webserver/projects/_controller/projects_states_rest.py index be113946af9..bd3736ade53 100644 --- a/services/web/server/src/simcore_service_webserver/projects/_controller/projects_states_rest.py +++ b/services/web/server/src/simcore_service_webserver/projects/_controller/projects_states_rest.py @@ -30,8 +30,8 @@ from ...security.decorators import permission_required from ...users import api from ...utils_aiohttp import envelope_json_response +from .. import _projects_service from .. import api as projects_api -from .. import projects_service from ..exceptions import ProjectStartsTooManyDynamicNodesError from ._rest_exceptions import handle_plugin_requests_exceptions from ._rest_schemas import ProjectPathParams, RequestContext @@ -69,7 +69,7 @@ async def open_project(request: web.Request) -> web.Response: raise web.HTTPBadRequest(reason="Invalid request body") from exc try: - project_type: ProjectType = await projects_service.get_project_type( + project_type: ProjectType = await _projects_service.get_project_type( request.app, path_params.project_id ) user_role: UserRole = await api.get_user_role( @@ -79,7 +79,7 @@ async def open_project(request: web.Request) -> web.Response: # only USERS/TESTERS can do that raise web.HTTPForbidden(reason="Wrong user role to open/edit a template") - project = await projects_service.get_project_for_user( + project = await _projects_service.get_project_for_user( request.app, project_uuid=f"{path_params.project_id}", user_id=req_ctx.user_id, @@ -97,7 +97,7 @@ async def open_project(request: web.Request) -> web.Response: product: Product = products_web.get_current_product(request) - if not await projects_service.try_open_project_for_user( + if not await _projects_service.try_open_project_for_user( req_ctx.user_id, project_uuid=path_params.project_id, client_session_id=client_session_id, @@ -107,7 +107,7 @@ async def open_project(request: web.Request) -> web.Response: raise HTTPLockedError(reason="Project is locked, try later") # the project can be opened, let's update its product links - await projects_service.update_project_linked_product( + await _projects_service.update_project_linked_product( request.app, path_params.project_id, req_ctx.product_name ) @@ -120,30 +120,30 @@ async def open_project(request: web.Request) -> web.Response: # NOTE: this method raises that exception when the number of dynamic # services in the project is highter than the maximum allowed per project # the project shall still open though. - await projects_service.run_project_dynamic_services( + await _projects_service.run_project_dynamic_services( request, project, req_ctx.user_id, req_ctx.product_name ) # and let's update the project last change timestamp - await projects_service.update_project_last_change_timestamp( + await _projects_service.update_project_last_change_timestamp( request.app, path_params.project_id ) # notify users that project is now opened - project = await projects_service.add_project_states_for_user( + project = await _projects_service.add_project_states_for_user( user_id=req_ctx.user_id, project=project, is_template=False, app=request.app, ) - await projects_service.notify_project_state_update(request.app, project) + await _projects_service.notify_project_state_update(request.app, project) return envelope_json_response(ProjectGet.from_domain_model(project)) except DirectorServiceError as exc: # there was an issue while accessing the director-v2/director-v0 # ensure the project is closed again - await projects_service.try_close_project_for_user( + await _projects_service.try_close_project_for_user( user_id=req_ctx.user_id, project_uuid=f"{path_params.project_id}", client_session_id=client_session_id, @@ -177,13 +177,13 @@ async def close_project(request: web.Request) -> web.Response: raise web.HTTPBadRequest(reason="Invalid request body") from exc # ensure the project exists - await projects_service.get_project_for_user( + await _projects_service.get_project_for_user( request.app, project_uuid=f"{path_params.project_id}", user_id=req_ctx.user_id, include_state=False, ) - await projects_service.try_close_project_for_user( + await _projects_service.try_close_project_for_user( req_ctx.user_id, f"{path_params.project_id}", client_session_id, @@ -210,7 +210,7 @@ async def get_project_state(request: web.Request) -> web.Response: path_params = parse_request_path_parameters_as(ProjectPathParams, request) # check that project exists and queries state - validated_project = await projects_service.get_project_for_user( + validated_project = await _projects_service.get_project_for_user( request.app, project_uuid=f"{path_params.project_id}", user_id=req_ctx.user_id, diff --git a/services/web/server/src/simcore_service_webserver/projects/_crud_api_create.py b/services/web/server/src/simcore_service_webserver/projects/_crud_api_create.py index 391161f9b8c..3b8b69cc202 100644 --- a/services/web/server/src/simcore_service_webserver/projects/_crud_api_create.py +++ b/services/web/server/src/simcore_service_webserver/projects/_crud_api_create.py @@ -40,7 +40,7 @@ from ..workspaces.api import check_user_workspace_access, get_user_workspace from ..workspaces.errors import WorkspaceAccessForbiddenError from . import _folders_repository as project_to_folders_db -from . import projects_service +from . import _projects_service from ._metadata_service import set_project_ancestors from ._permalink_service import update_or_pop_permalink_in_project from ._projects_repository_legacy import ProjectDBAPI @@ -77,7 +77,7 @@ async def _prepare_project_copy( deep_copy: bool, task_progress: TaskProgress, ) -> tuple[ProjectDict, CopyProjectNodesCoro | None, CopyFileCoro | None]: - source_project = await projects_service.get_project_for_user( + source_project = await _projects_service.get_project_for_user( app, project_uuid=f"{src_project_uuid}", user_id=user_id, @@ -192,7 +192,7 @@ async def _copy() -> None: owner=Owner( user_id=user_id, **await get_user_fullname(app, user_id=user_id) ), - notification_cb=projects_service.create_user_notification_cb( + notification_cb=_projects_service.create_user_notification_cb( user_id, ProjectID(f"{source_project['uuid']}"), app ), )(_copy)() @@ -404,7 +404,7 @@ async def create_project( # pylint: disable=too-many-arguments,too-many-branche project_uuid=new_project["uuid"] ) # Appends state - new_project = await projects_service.add_project_states_for_user( + new_project = await _projects_service.add_project_states_for_user( user_id=user_id, project=new_project, is_template=as_template, @@ -460,7 +460,7 @@ async def create_project( # pylint: disable=too-many-arguments,too-many-branche except (ParentProjectNotFoundError, ParentNodeNotFoundError) as exc: if project_uuid := new_project.get("uuid"): - await projects_service.submit_delete_project_task( + await _projects_service.submit_delete_project_task( app=request.app, project_uuid=project_uuid, user_id=user_id, @@ -474,7 +474,7 @@ async def create_project( # pylint: disable=too-many-arguments,too-many-branche f"{user_id=}", ) if project_uuid := new_project.get("uuid"): - await projects_service.submit_delete_project_task( + await _projects_service.submit_delete_project_task( app=request.app, project_uuid=project_uuid, user_id=user_id, diff --git a/services/web/server/src/simcore_service_webserver/projects/_crud_api_read.py b/services/web/server/src/simcore_service_webserver/projects/_crud_api_read.py index 665c5721402..45c0837ec03 100644 --- a/services/web/server/src/simcore_service_webserver/projects/_crud_api_read.py +++ b/services/web/server/src/simcore_service_webserver/projects/_crud_api_read.py @@ -22,7 +22,7 @@ from ..catalog import catalog_service from ..folders import _folders_repository from ..workspaces._workspaces_service import check_user_workspace_access -from . import projects_service +from . import _projects_service from ._projects_repository import batch_get_trashed_by_primary_gid from ._projects_repository_legacy import ProjectDBAPI from .models import ProjectDict, ProjectTypeAPI @@ -65,7 +65,7 @@ async def _aggregate_data_to_projects_from_other_sources( # udpating `project.state` update_state_per_project = [ - projects_service.add_project_states_for_user( + _projects_service.add_project_states_for_user( user_id=user_id, project=prj, is_template=prj_type == ProjectTypeDB.TEMPLATE, diff --git a/services/web/server/src/simcore_service_webserver/projects/projects_service.py b/services/web/server/src/simcore_service_webserver/projects/_projects_service.py similarity index 100% rename from services/web/server/src/simcore_service_webserver/projects/projects_service.py rename to services/web/server/src/simcore_service_webserver/projects/_projects_service.py diff --git a/services/web/server/src/simcore_service_webserver/projects/_projects_service_delete.py b/services/web/server/src/simcore_service_webserver/projects/_projects_service_delete.py index 3c0e6039cbb..547d309fec8 100644 --- a/services/web/server/src/simcore_service_webserver/projects/_projects_service_delete.py +++ b/services/web/server/src/simcore_service_webserver/projects/_projects_service_delete.py @@ -12,7 +12,7 @@ from ..director_v2 import api as director_v2_service from . import _projects_repository as _projects_repository -from . import projects_service +from . import _projects_service from .exceptions import ProjectDeleteError, ProjectNotFoundError _logger = logging.getLogger(__name__) @@ -47,7 +47,7 @@ async def batch_stop_services_in_project( director_v2_service.stop_pipeline( app, user_id=user_id, project_id=project_uuid ), - projects_service.remove_project_dynamic_services( + _projects_service.remove_project_dynamic_services( user_id=user_id, project_uuid=f"{project_uuid}", app=app, diff --git a/services/web/server/src/simcore_service_webserver/projects/_trash_service.py b/services/web/server/src/simcore_service_webserver/projects/_trash_service.py index f0669197814..c18834008e4 100644 --- a/services/web/server/src/simcore_service_webserver/projects/_trash_service.py +++ b/services/web/server/src/simcore_service_webserver/projects/_trash_service.py @@ -17,7 +17,7 @@ from ..dynamic_scheduler import api as dynamic_scheduler_api from . import _crud_api_read from . import _projects_repository as _projects_repository -from . import _projects_service_delete, projects_service +from . import _projects_service, _projects_service_delete from ._access_rights_service import check_user_project_permission from ._projects_repository import _OLDEST_TRASHED_FIRST from .exceptions import ( @@ -88,7 +88,7 @@ async def trash_project( product_name=product_name, ) - await projects_service.patch_project( + await _projects_service.patch_project( app, user_id=user_id, product_name=product_name, @@ -109,7 +109,7 @@ async def untrash_project( project_id: ProjectID, ) -> None: # NOTE: check_user_project_permission is inside projects_api.patch_project - await projects_service.patch_project( + await _projects_service.patch_project( app, user_id=user_id, product_name=product_name, @@ -207,7 +207,7 @@ async def delete_explicitly_trashed_project( ProjectNotFoundError: If the project is not found. ProjectNotTrashedError: If the project was not trashed explicitly by the user from the specified datetime. """ - project = await projects_service.get_project_for_user( + project = await _projects_service.get_project_for_user( app, project_uuid=f"{project_id}", user_id=user_id ) @@ -222,7 +222,7 @@ async def delete_explicitly_trashed_project( reason="Cannot delete trashed project since it does not fit current criteria", ) - await projects_service.delete_project_by_user( + await _projects_service.delete_project_by_user( app, user_id=user_id, project_uuid=project_id, diff --git a/services/web/server/src/simcore_service_webserver/projects/nodes_utils.py b/services/web/server/src/simcore_service_webserver/projects/nodes_utils.py index 32531914163..4cf8a690aee 100644 --- a/services/web/server/src/simcore_service_webserver/projects/nodes_utils.py +++ b/services/web/server/src/simcore_service_webserver/projects/nodes_utils.py @@ -12,7 +12,7 @@ from servicelib.logging_utils import log_decorator from servicelib.utils import fire_and_forget_task, logged_gather -from . import projects_service +from . import _projects_service from .utils import get_frontend_node_outputs_changes log = logging.getLogger(__name__) @@ -46,7 +46,7 @@ async def update_node_outputs( ui_changed_keys: set[str] | None, ) -> None: # the new outputs might be {}, or {key_name: payload} - project, keys_changed = await projects_service.update_project_node_outputs( + project, keys_changed = await _projects_service.update_project_node_outputs( app, user_id, project_uuid, @@ -55,14 +55,14 @@ async def update_node_outputs( new_run_hash=run_hash, ) - await projects_service.notify_project_node_update( + await _projects_service.notify_project_node_update( app, project, node_uuid, errors=node_errors ) # get depending node and notify for these ones as well depending_node_uuids = await project_get_depending_nodes(project, node_uuid) await logged_gather( *[ - projects_service.notify_project_node_update(app, project, nid, errors=None) + _projects_service.notify_project_node_update(app, project, nid, errors=None) for nid in depending_node_uuids ] ) @@ -86,7 +86,7 @@ async def update_node_outputs( ) # fire&forget to notify connected nodes to retrieve its inputs **if necessary** - await projects_service.post_trigger_connected_service_retrieve( + await _projects_service.post_trigger_connected_service_retrieve( app=app, project=project, updated_node_uuid=f"{node_uuid}", changed_keys=keys ) diff --git a/services/web/server/src/simcore_service_webserver/studies_dispatcher/_projects.py b/services/web/server/src/simcore_service_webserver/studies_dispatcher/_projects.py index 16151e1af37..b1803391a06 100644 --- a/services/web/server/src/simcore_service_webserver/studies_dispatcher/_projects.py +++ b/services/web/server/src/simcore_service_webserver/studies_dispatcher/_projects.py @@ -22,8 +22,8 @@ from servicelib.logging_utils import log_decorator from ..projects._projects_repository_legacy import ProjectDBAPI +from ..projects._projects_service import get_project_for_user from ..projects.exceptions import ProjectInvalidRightsError, ProjectNotFoundError -from ..projects.projects_service import get_project_for_user from ..utils import now_str from ._core import compose_uuid_from from ._models import FileParams, ServiceInfo, ViewerInfo diff --git a/services/web/server/tests/unit/with_dbs/03/test_project_db.py b/services/web/server/tests/unit/with_dbs/03/test_project_db.py index 80844ea6eec..d164f5414ed 100644 --- a/services/web/server/tests/unit/with_dbs/03/test_project_db.py +++ b/services/web/server/tests/unit/with_dbs/03/test_project_db.py @@ -39,6 +39,9 @@ from simcore_service_webserver.projects._projects_repository_legacy_utils import ( PermissionStr, ) +from simcore_service_webserver.projects._projects_service import ( + _check_project_node_has_all_required_inputs, +) from simcore_service_webserver.projects.api import has_user_project_access_rights from simcore_service_webserver.projects.exceptions import ( NodeNotFoundError, @@ -46,9 +49,6 @@ ProjectNotFoundError, ) from simcore_service_webserver.projects.models import ProjectDict -from simcore_service_webserver.projects.projects_service import ( - _check_project_node_has_all_required_inputs, -) from simcore_service_webserver.users.exceptions import UserNotFoundError from simcore_service_webserver.utils import to_datetime from sqlalchemy.engine.result import Row diff --git a/services/web/server/tests/unit/with_dbs/04/garbage_collector/test_resource_manager.py b/services/web/server/tests/unit/with_dbs/04/garbage_collector/test_resource_manager.py index b1410c02040..19c434f584e 100644 --- a/services/web/server/tests/unit/with_dbs/04/garbage_collector/test_resource_manager.py +++ b/services/web/server/tests/unit/with_dbs/04/garbage_collector/test_resource_manager.py @@ -44,11 +44,11 @@ from simcore_service_webserver.login.plugin import setup_login from simcore_service_webserver.notifications.plugin import setup_notifications from simcore_service_webserver.products.plugin import setup_products -from simcore_service_webserver.projects.plugin import setup_projects -from simcore_service_webserver.projects.projects_service import ( +from simcore_service_webserver.projects._projects_service import ( remove_project_dynamic_services, submit_delete_project_task, ) +from simcore_service_webserver.projects.plugin import setup_projects from simcore_service_webserver.rabbitmq import setup_rabbitmq from simcore_service_webserver.resource_manager.plugin import setup_resource_manager from simcore_service_webserver.resource_manager.registry import ( diff --git a/services/web/server/tests/unit/with_dbs/04/studies_dispatcher/test_studies_dispatcher_projects.py b/services/web/server/tests/unit/with_dbs/04/studies_dispatcher/test_studies_dispatcher_projects.py index b1c7e7259d2..7518fbd0b15 100644 --- a/services/web/server/tests/unit/with_dbs/04/studies_dispatcher/test_studies_dispatcher_projects.py +++ b/services/web/server/tests/unit/with_dbs/04/studies_dispatcher/test_studies_dispatcher_projects.py @@ -18,7 +18,7 @@ from pytest_simcore.helpers.webserver_login import NewUser from pytest_simcore.helpers.webserver_projects import delete_all_projects from simcore_service_webserver.groups.api import auto_add_user_to_groups -from simcore_service_webserver.projects.projects_service import get_project_for_user +from simcore_service_webserver.projects._projects_service import get_project_for_user from simcore_service_webserver.studies_dispatcher._models import ServiceInfo from simcore_service_webserver.studies_dispatcher._projects import ( UserInfo, diff --git a/services/web/server/tests/unit/with_dbs/04/studies_dispatcher/test_studies_dispatcher_studies_access.py b/services/web/server/tests/unit/with_dbs/04/studies_dispatcher/test_studies_dispatcher_studies_access.py index 74466ef0367..ff781e2b3a1 100644 --- a/services/web/server/tests/unit/with_dbs/04/studies_dispatcher/test_studies_dispatcher_studies_access.py +++ b/services/web/server/tests/unit/with_dbs/04/studies_dispatcher/test_studies_dispatcher_studies_access.py @@ -31,10 +31,10 @@ from servicelib.common_headers import UNDEFINED_DEFAULT_SIMCORE_USER_AGENT_VALUE from servicelib.rest_responses import unwrap_envelope from settings_library.utils_session import DEFAULT_SESSION_COOKIE_NAME -from simcore_service_webserver.projects.models import ProjectDict -from simcore_service_webserver.projects.projects_service import ( +from simcore_service_webserver.projects._projects_service import ( submit_delete_project_task, ) +from simcore_service_webserver.projects.models import ProjectDict from simcore_service_webserver.users.api import ( delete_user_without_projects, get_user_role, From d7ca7499cf2f588ab976a96d69386589922e8242 Mon Sep 17 00:00:00 2001 From: Pedro Crespo-Valero <32402063+pcrespov@users.noreply.github.com> Date: Fri, 21 Mar 2025 15:32:59 +0100 Subject: [PATCH 14/39] fix mypy --- .../projects/_controller/trash_rest.py | 18 ++++++------ .../projects/_controller/wallets_rest.py | 29 +++++++++---------- 2 files changed, 23 insertions(+), 24 deletions(-) diff --git a/services/web/server/src/simcore_service_webserver/projects/_controller/trash_rest.py b/services/web/server/src/simcore_service_webserver/projects/_controller/trash_rest.py index ec75d337a93..f1cae188a7d 100644 --- a/services/web/server/src/simcore_service_webserver/projects/_controller/trash_rest.py +++ b/services/web/server/src/simcore_service_webserver/projects/_controller/trash_rest.py @@ -7,20 +7,20 @@ parse_request_query_parameters_as, ) -from .._meta import API_VTAG as VTAG -from ..exception_handling import ( +from ..._meta import API_VTAG as VTAG +from ...exception_handling import ( ExceptionToHttpErrorMap, HttpErrorInfo, exception_handling_decorator, to_exceptions_handlers_map, ) -from ..login.decorators import get_user_id, login_required -from ..products import products_web -from ..security.decorators import permission_required -from . import _trash_service -from ._common.exceptions_handlers import handle_plugin_requests_exceptions -from ._common.models import ProjectPathParams, RemoveQueryParams -from .exceptions import ProjectRunningConflictError, ProjectStoppingError +from ...login.decorators import get_user_id, login_required +from ...products import products_web +from ...security.decorators import permission_required +from .. import _trash_service +from ..exceptions import ProjectRunningConflictError, ProjectStoppingError +from ._rest_exceptions import handle_plugin_requests_exceptions +from ._rest_schemas import ProjectPathParams, RemoveQueryParams _logger = logging.getLogger(__name__) diff --git a/services/web/server/src/simcore_service_webserver/projects/_controller/wallets_rest.py b/services/web/server/src/simcore_service_webserver/projects/_controller/wallets_rest.py index a3ef663ff8b..7f5cc48ea7f 100644 --- a/services/web/server/src/simcore_service_webserver/projects/_controller/wallets_rest.py +++ b/services/web/server/src/simcore_service_webserver/projects/_controller/wallets_rest.py @@ -15,14 +15,13 @@ parse_request_path_parameters_as, ) -from .._meta import API_VTAG -from ..login.decorators import login_required -from ..security.decorators import permission_required -from ..utils_aiohttp import envelope_json_response -from . import _wallets_api as wallets_api -from . import projects_service -from ._common.exceptions_handlers import handle_plugin_requests_exceptions -from ._common.models import ProjectPathParams, RequestContext +from ..._meta import API_VTAG +from ...login.decorators import login_required +from ...security.decorators import permission_required +from ...utils_aiohttp import envelope_json_response +from .. import _projects_service, _wallets_service +from ._rest_exceptions import handle_plugin_requests_exceptions +from ._rest_schemas import ProjectPathParams, RequestContext _logger = logging.getLogger(__name__) @@ -39,13 +38,13 @@ async def get_project_wallet(request: web.Request): path_params = parse_request_path_parameters_as(ProjectPathParams, request) # ensure the project exists - await projects_service.get_project_for_user( + await _projects_service.get_project_for_user( request.app, project_uuid=f"{path_params.project_id}", user_id=req_ctx.user_id, include_state=False, ) - wallet: WalletGet | None = await wallets_api.get_project_wallet( + wallet: WalletGet | None = await _wallets_service.get_project_wallet( request.app, path_params.project_id ) @@ -70,14 +69,14 @@ async def connect_wallet_to_project(request: web.Request): path_params = parse_request_path_parameters_as(_ProjectWalletPathParams, request) # ensure the project exists - await projects_service.get_project_for_user( + await _projects_service.get_project_for_user( request.app, project_uuid=f"{path_params.project_id}", user_id=req_ctx.user_id, include_state=False, ) - wallet: WalletGet = await wallets_api.connect_wallet_to_project( + wallet: WalletGet = await _wallets_service.connect_wallet_to_project( request.app, product_name=req_ctx.product_name, project_id=path_params.project_id, @@ -106,7 +105,7 @@ async def pay_project_debt(request: web.Request): body_params = await parse_request_body_as(_PayProjectDebtBody, request) # Ensure the project exists - await projects_service.get_project_for_user( + await _projects_service.get_project_for_user( request.app, project_uuid=f"{path_params.project_id}", user_id=req_ctx.user_id, @@ -114,7 +113,7 @@ async def pay_project_debt(request: web.Request): ) # Get curently associated wallet with the project - current_wallet: WalletGet | None = await wallets_api.get_project_wallet( + current_wallet: WalletGet | None = await _wallets_service.get_project_wallet( request.app, path_params.project_id ) if not current_wallet: @@ -137,7 +136,7 @@ async def pay_project_debt(request: web.Request): # Steps: # 1. Transfer the required credits from the specified wallet to the connected wallet. # 2. Mark the project transactions as billed - await wallets_api.pay_debt_with_different_wallet( + await _wallets_service.pay_debt_with_different_wallet( app=request.app, product_name=req_ctx.product_name, project_id=path_params.project_id, From 142a80ee0eb4407a8bb6accf262a39ffc6a6260b Mon Sep 17 00:00:00 2001 From: Pedro Crespo-Valero <32402063+pcrespov@users.noreply.github.com> Date: Fri, 21 Mar 2025 15:35:00 +0100 Subject: [PATCH 15/39] imports --- .../folders/_workspaces_repository.py | 6 +++--- .../projects/_crud_api_create.py | 11 +++++------ .../projects/_folders_service.py | 14 +++++++------- .../projects/_workspaces_service.py | 4 ++-- 4 files changed, 17 insertions(+), 18 deletions(-) diff --git a/services/web/server/src/simcore_service_webserver/folders/_workspaces_repository.py b/services/web/server/src/simcore_service_webserver/folders/_workspaces_repository.py index f6950d23921..c6e40a22685 100644 --- a/services/web/server/src/simcore_service_webserver/folders/_workspaces_repository.py +++ b/services/web/server/src/simcore_service_webserver/folders/_workspaces_repository.py @@ -8,7 +8,7 @@ from simcore_postgres_database.utils_repos import transaction_context from ..db.plugin import get_asyncpg_engine -from ..projects import _folders_repository as project_to_folders_db +from ..projects import _folders_repository as _folders_repository from ..projects import _groups_respository as project_groups_db from ..projects import _projects_repository as projects_db from ..projects._access_rights_service import check_user_project_permission @@ -106,7 +106,7 @@ async def move_folder_into_workspace( # 7. Remove all records of project to folders that are not in the folders that we are moving # (ex. If we are moving from private workspace, the same project can be in different folders for different users) - await project_to_folders_db.delete_all_project_to_folder_by_project_ids_not_in_folder_ids( + await _folders_repository.delete_all_project_to_folder_by_project_ids_not_in_folder_ids( app, connection=conn, project_id_or_ids=set(project_ids), @@ -114,7 +114,7 @@ async def move_folder_into_workspace( ) # 8. Update the user id field for the remaining folders - await project_to_folders_db.update_project_to_folder( + await _folders_repository.update_project_to_folder( app, connection=conn, folders_id_or_ids=set(folder_ids), diff --git a/services/web/server/src/simcore_service_webserver/projects/_crud_api_create.py b/services/web/server/src/simcore_service_webserver/projects/_crud_api_create.py index 3b8b69cc202..2850c0e6ecd 100644 --- a/services/web/server/src/simcore_service_webserver/projects/_crud_api_create.py +++ b/services/web/server/src/simcore_service_webserver/projects/_crud_api_create.py @@ -30,7 +30,7 @@ from ..catalog import catalog_service from ..director_v2 import api as director_v2_api from ..dynamic_scheduler import api as dynamic_scheduler_api -from ..folders import _folders_repository as _folders_repository +from ..folders import _folders_repository as folders_folders_repository from ..redis import get_redis_lock_manager_client_sdk from ..storage.api import ( copy_data_folders_from_project, @@ -39,8 +39,7 @@ from ..users.api import get_user_fullname from ..workspaces.api import check_user_workspace_access, get_user_workspace from ..workspaces.errors import WorkspaceAccessForbiddenError -from . import _folders_repository as project_to_folders_db -from . import _projects_service +from . import _folders_repository, _projects_service from ._metadata_service import set_project_ancestors from ._permalink_service import update_or_pop_permalink_in_project from ._projects_repository_legacy import ProjectDBAPI @@ -293,7 +292,7 @@ async def create_project( # pylint: disable=too-many-arguments,too-many-branche ) if folder_id := predefined_project.get("folderId", None): # Check user has access to folder - await _folders_repository.get_for_user_or_workspace( + await folders_folders_repository.get_for_user_or_workspace( request.app, folder_id=folder_id, product_name=product_name, @@ -322,7 +321,7 @@ async def create_project( # pylint: disable=too-many-arguments,too-many-branche # 1.2 does project belong to some folder? workspace_id = new_project["workspaceId"] - prj_to_folder_db = await project_to_folders_db.get_project_to_folder( + prj_to_folder_db = await _folders_repository.get_project_to_folder( request.app, project_id=from_study, private_workspace_user_id_or_none=( @@ -369,7 +368,7 @@ async def create_project( # pylint: disable=too-many-arguments,too-many-branche # 3.2 move project to proper folder if folder_id: - await project_to_folders_db.insert_project_to_folder( + await _folders_repository.insert_project_to_folder( request.app, project_id=new_project["uuid"], folder_id=folder_id, diff --git a/services/web/server/src/simcore_service_webserver/projects/_folders_service.py b/services/web/server/src/simcore_service_webserver/projects/_folders_service.py index dfdcb82a6a5..cd563b28d3d 100644 --- a/services/web/server/src/simcore_service_webserver/projects/_folders_service.py +++ b/services/web/server/src/simcore_service_webserver/projects/_folders_service.py @@ -6,8 +6,8 @@ from models_library.projects import ProjectID from models_library.users import UserID -from ..folders import _folders_repository as _folders_repository -from . import _folders_repository as project_to_folders_db +from ..folders import _folders_repository as folders_folders_repository +from . import _folders_repository as _folders_repository from ._access_rights_service import get_user_project_access_rights from ._projects_repository_legacy import APP_PROJECT_DBAPI, ProjectDBAPI from .exceptions import ProjectInvalidRightsError @@ -45,7 +45,7 @@ async def move_project_into_folder( if folder_id: # Check user has access to folder - await _folders_repository.get_for_user_or_workspace( + await folders_folders_repository.get_for_user_or_workspace( app, folder_id=folder_id, product_name=product_name, @@ -54,7 +54,7 @@ async def move_project_into_folder( ) # Move project to folder - prj_to_folder_db = await project_to_folders_db.get_project_to_folder( + prj_to_folder_db = await _folders_repository.get_project_to_folder( app, project_id=project_id, private_workspace_user_id_or_none=user_id if workspace_is_private else None, @@ -62,7 +62,7 @@ async def move_project_into_folder( if prj_to_folder_db is None: if folder_id is None: return - await project_to_folders_db.insert_project_to_folder( + await _folders_repository.insert_project_to_folder( app, project_id=project_id, folder_id=folder_id, @@ -70,7 +70,7 @@ async def move_project_into_folder( ) else: # Delete old - await project_to_folders_db.delete_project_to_folder( + await _folders_repository.delete_project_to_folder( app, project_id=project_id, folder_id=prj_to_folder_db.folder_id, @@ -78,7 +78,7 @@ async def move_project_into_folder( ) # Create new if folder_id is not None: - await project_to_folders_db.insert_project_to_folder( + await _folders_repository.insert_project_to_folder( app, project_id=project_id, folder_id=folder_id, diff --git a/services/web/server/src/simcore_service_webserver/projects/_workspaces_service.py b/services/web/server/src/simcore_service_webserver/projects/_workspaces_service.py index fcfeb608c3a..14e73f2a1bf 100644 --- a/services/web/server/src/simcore_service_webserver/projects/_workspaces_service.py +++ b/services/web/server/src/simcore_service_webserver/projects/_workspaces_service.py @@ -10,7 +10,7 @@ from ..db.plugin import get_asyncpg_engine from ..users.api import get_user from ..workspaces.api import check_user_workspace_access -from . import _folders_repository as project_to_folders_db +from . import _folders_repository as _folders_repository from . import _groups_respository as project_groups_db from . import _projects_repository from ._access_rights_service import get_user_project_access_rights @@ -46,7 +46,7 @@ async def move_project_into_workspace( async with transaction_context(get_asyncpg_engine(app)) as conn: # 3. Delete project to folders (for everybody) - await project_to_folders_db.delete_all_project_to_folder_by_project_id( + await _folders_repository.delete_all_project_to_folder_by_project_id( app, connection=conn, project_id=project_id, From 3803a653b5315084a483c5c5a0b7dc429b8bea9b Mon Sep 17 00:00:00 2001 From: Pedro Crespo-Valero <32402063+pcrespov@users.noreply.github.com> Date: Fri, 21 Mar 2025 15:43:01 +0100 Subject: [PATCH 16/39] imports --- .../director_v2/_api_utils.py | 4 ++-- .../folders/_workspaces_repository.py | 16 +++++++------- .../_rabbitmq_exclusive_queue_consumers.py | 4 ++-- .../projects/_groups_service.py | 10 ++++----- .../projects/_projects_service.py | 14 +++++------- .../projects/_projects_service_delete.py | 6 ++--- .../projects/_trash_service.py | 4 ++-- .../projects/_wallets_service.py | 12 +++++----- .../projects/_workspaces_service.py | 8 +++---- .../resource_usage/_observer.py | 11 ++++------ .../simcore_service_webserver/wallets/_api.py | 4 ++-- .../wallets/_groups_api.py | 18 +++++++-------- .../workspaces/_groups_service.py | 22 +++++++++---------- 13 files changed, 63 insertions(+), 70 deletions(-) diff --git a/services/web/server/src/simcore_service_webserver/director_v2/_api_utils.py b/services/web/server/src/simcore_service_webserver/director_v2/_api_utils.py index 9cd864f01cf..7c8328c9929 100644 --- a/services/web/server/src/simcore_service_webserver/director_v2/_api_utils.py +++ b/services/web/server/src/simcore_service_webserver/director_v2/_api_utils.py @@ -9,7 +9,7 @@ from ..projects import api as projects_api from ..users import preferences_api as user_preferences_api from ..users.exceptions import UserDefaultWalletNotFoundError -from ..wallets import api as wallets_api +from ..wallets import api as wallets_service async def get_wallet_info( @@ -49,7 +49,7 @@ async def get_wallet_info( project_wallet_id = project_wallet.wallet_id # Check whether user has access to the wallet - wallet = await wallets_api.get_wallet_with_available_credits_by_user_and_wallet( + wallet = await wallets_service.get_wallet_with_available_credits_by_user_and_wallet( app, user_id=user_id, wallet_id=project_wallet_id, diff --git a/services/web/server/src/simcore_service_webserver/folders/_workspaces_repository.py b/services/web/server/src/simcore_service_webserver/folders/_workspaces_repository.py index c6e40a22685..99f8a823746 100644 --- a/services/web/server/src/simcore_service_webserver/folders/_workspaces_repository.py +++ b/services/web/server/src/simcore_service_webserver/folders/_workspaces_repository.py @@ -8,9 +8,9 @@ from simcore_postgres_database.utils_repos import transaction_context from ..db.plugin import get_asyncpg_engine -from ..projects import _folders_repository as _folders_repository -from ..projects import _groups_respository as project_groups_db -from ..projects import _projects_repository as projects_db +from ..projects import _folders_repository as projects_folders_repository +from ..projects import _groups_respository as projects_groups_repository +from ..projects import _projects_repository as projects_repository from ..projects._access_rights_service import check_user_project_permission from ..users.api import get_user from ..workspaces.api import check_user_workspace_access @@ -78,7 +78,7 @@ async def move_folder_into_workspace( async with transaction_context(get_asyncpg_engine(app)) as conn: # 4. Update workspace ID on the project resource for project_id in project_ids: - await projects_db.patch_project( + await projects_repository.patch_project( app=app, connection=conn, project_uuid=project_id, @@ -106,7 +106,7 @@ async def move_folder_into_workspace( # 7. Remove all records of project to folders that are not in the folders that we are moving # (ex. If we are moving from private workspace, the same project can be in different folders for different users) - await _folders_repository.delete_all_project_to_folder_by_project_ids_not_in_folder_ids( + await projects_folders_repository.delete_all_project_to_folder_by_project_ids_not_in_folder_ids( app, connection=conn, project_id_or_ids=set(project_ids), @@ -114,7 +114,7 @@ async def move_folder_into_workspace( ) # 8. Update the user id field for the remaining folders - await _folders_repository.update_project_to_folder( + await projects_folders_repository.update_project_to_folder( app, connection=conn, folders_id_or_ids=set(folder_ids), @@ -124,10 +124,10 @@ async def move_folder_into_workspace( # 9. Remove all project permissions, leave only the user who moved the project user = await get_user(app, user_id=user_id) for project_id in project_ids: - await project_groups_db.delete_all_project_groups( + await projects_groups_repository.delete_all_project_groups( app, connection=conn, project_id=project_id ) - await project_groups_db.update_or_insert_project_group( + await projects_groups_repository.update_or_insert_project_group( app, connection=conn, project_id=project_id, diff --git a/services/web/server/src/simcore_service_webserver/notifications/_rabbitmq_exclusive_queue_consumers.py b/services/web/server/src/simcore_service_webserver/notifications/_rabbitmq_exclusive_queue_consumers.py index ecaf6054a22..7c3925b8c50 100644 --- a/services/web/server/src/simcore_service_webserver/notifications/_rabbitmq_exclusive_queue_consumers.py +++ b/services/web/server/src/simcore_service_webserver/notifications/_rabbitmq_exclusive_queue_consumers.py @@ -30,7 +30,7 @@ send_message_to_user, ) from ..socketio.models import WebSocketNodeProgress, WebSocketProjectProgress -from ..wallets import api as wallets_api +from ..wallets import api as wallets_service from ._rabbitmq_consumers_common import SubcribeArgumentsTuple, subscribe_to_rabbitmq _logger = logging.getLogger(__name__) @@ -127,7 +127,7 @@ async def _events_message_parser(app: web.Application, data: bytes) -> bool: async def _osparc_credits_message_parser(app: web.Application, data: bytes) -> bool: rabbit_message = TypeAdapter(WalletCreditsMessage).validate_json(data) - wallet_groups = await wallets_api.list_wallet_groups_with_read_access_by_wallet( + wallet_groups = await wallets_service.list_wallet_groups_with_read_access_by_wallet( app, wallet_id=rabbit_message.wallet_id ) rooms_to_notify: Generator[GroupID, None, None] = ( diff --git a/services/web/server/src/simcore_service_webserver/projects/_groups_service.py b/services/web/server/src/simcore_service_webserver/projects/_groups_service.py index ae81118c305..99018300f10 100644 --- a/services/web/server/src/simcore_service_webserver/projects/_groups_service.py +++ b/services/web/server/src/simcore_service_webserver/projects/_groups_service.py @@ -8,7 +8,7 @@ from models_library.users import UserID from pydantic import BaseModel -from ..users import api as users_api +from ..users import api as users_service from . import _groups_respository as projects_groups_db from ._access_rights_service import check_user_project_permission from ._groups_respository import ProjectGroupGetDB @@ -109,9 +109,9 @@ async def replace_project_group( project_db: ProjectDBAPI = app[APP_PROJECT_DBAPI] project = await project_db.get_project_db(project_id) - project_owner_user: dict = await users_api.get_user(app, project.prj_owner) + project_owner_user: dict = await users_service.get_user(app, project.prj_owner) if project_owner_user["primary_gid"] == group_id: - user: dict = await users_api.get_user(app, user_id) + user: dict = await users_service.get_user(app, user_id) if user["primary_gid"] != project_owner_user["primary_gid"]: # Only the owner of the project can modify the owner group raise ProjectInvalidRightsError( @@ -143,7 +143,7 @@ async def delete_project_group( group_id: GroupID, product_name: ProductName, ) -> None: - user: dict = await users_api.get_user(app, user_id=user_id) + user: dict = await users_service.get_user(app, user_id=user_id) if user["primary_gid"] != group_id: await check_user_project_permission( app, @@ -155,7 +155,7 @@ async def delete_project_group( project_db: ProjectDBAPI = app[APP_PROJECT_DBAPI] project = await project_db.get_project_db(project_id) - project_owner_user: dict = await users_api.get_user(app, project.prj_owner) + project_owner_user: dict = await users_service.get_user(app, project.prj_owner) if project_owner_user["primary_gid"] == group_id: if user["primary_gid"] != project_owner_user["primary_gid"]: # Only the owner of the project can delete the owner group diff --git a/services/web/server/src/simcore_service_webserver/projects/_projects_service.py b/services/web/server/src/simcore_service_webserver/projects/_projects_service.py index 0c577a2ae14..fc4ba397284 100644 --- a/services/web/server/src/simcore_service_webserver/projects/_projects_service.py +++ b/services/web/server/src/simcore_service_webserver/projects/_projects_service.py @@ -120,7 +120,7 @@ UserDefaultWalletNotFoundError, get_frontend_user_preference, ) -from ..wallets import api as wallets_api +from ..wallets import api as wallets_service from ..wallets.errors import WalletNotEnoughCreditsError from ..workspaces import _workspaces_repository as workspaces_db from . import ( @@ -682,13 +682,11 @@ async def _() -> None: else: project_wallet_id = project_wallet.wallet_id # Check whether user has access to the wallet - wallet = ( - await wallets_api.get_wallet_with_available_credits_by_user_and_wallet( - request.app, - user_id=user_id, - wallet_id=project_wallet_id, - product_name=product_name, - ) + wallet = await wallets_service.get_wallet_with_available_credits_by_user_and_wallet( + request.app, + user_id=user_id, + wallet_id=project_wallet_id, + product_name=product_name, ) wallet_info = WalletInfo( wallet_id=project_wallet_id, diff --git a/services/web/server/src/simcore_service_webserver/projects/_projects_service_delete.py b/services/web/server/src/simcore_service_webserver/projects/_projects_service_delete.py index 547d309fec8..680b0b4525e 100644 --- a/services/web/server/src/simcore_service_webserver/projects/_projects_service_delete.py +++ b/services/web/server/src/simcore_service_webserver/projects/_projects_service_delete.py @@ -11,7 +11,7 @@ from servicelib.redis._errors import ProjectLockError from ..director_v2 import api as director_v2_service -from . import _projects_repository as _projects_repository +from . import _projects_repository as projects_repository from . import _projects_service from .exceptions import ProjectDeleteError, ProjectNotFoundError @@ -68,7 +68,7 @@ async def delete_project_as_admin( try: # 1. hide with _monitor_step(state, name="hide"): - project = await _projects_repository.patch_project( + project = await projects_repository.patch_project( app, project_uuid=project_uuid, new_partial_project_data={"hidden": True}, @@ -83,7 +83,7 @@ async def delete_project_as_admin( # 3. delete with _monitor_step(state, name="delete"): - await _projects_repository.delete_project(app, project_uuid=project_uuid) + await projects_repository.delete_project(app, project_uuid=project_uuid) except ProjectNotFoundError as err: _logger.debug( diff --git a/services/web/server/src/simcore_service_webserver/projects/_trash_service.py b/services/web/server/src/simcore_service_webserver/projects/_trash_service.py index c18834008e4..cd0de244548 100644 --- a/services/web/server/src/simcore_service_webserver/projects/_trash_service.py +++ b/services/web/server/src/simcore_service_webserver/projects/_trash_service.py @@ -16,7 +16,7 @@ from ..director_v2 import api as director_v2_api from ..dynamic_scheduler import api as dynamic_scheduler_api from . import _crud_api_read -from . import _projects_repository as _projects_repository +from . import _projects_repository as projects_repository from . import _projects_service, _projects_service_delete from ._access_rights_service import check_user_project_permission from ._projects_repository import _OLDEST_TRASHED_FIRST @@ -243,7 +243,7 @@ async def batch_delete_trashed_projects_as_admin( ( page_params.total_number_of_items, expired_trashed_projects, - ) = await _projects_repository.list_trashed_projects( + ) = await projects_repository.list_trashed_projects( app, # both implicit and explicitly trashed trashed_before=trashed_before, diff --git a/services/web/server/src/simcore_service_webserver/projects/_wallets_service.py b/services/web/server/src/simcore_service_webserver/projects/_wallets_service.py index 4148fdbcbbe..e671b7eac6e 100644 --- a/services/web/server/src/simcore_service_webserver/projects/_wallets_service.py +++ b/services/web/server/src/simcore_service_webserver/projects/_wallets_service.py @@ -16,8 +16,8 @@ ) from ..rabbitmq import get_rabbitmq_rpc_client -from ..users import api as users_api -from ..wallets import _api as wallets_api +from ..users import api as users_service +from ..wallets import _api as wallets_service from ._projects_repository_legacy import ProjectDBAPI from .exceptions import ( ProjectInDebtCanNotChangeWalletError, @@ -73,7 +73,7 @@ async def connect_wallet_to_project( db: ProjectDBAPI = ProjectDBAPI.get_from_app_context(app) # ensure the wallet can be used by the user - wallet: WalletGet = await wallets_api.get_wallet_by_user( + wallet: WalletGet = await wallets_service.get_wallet_by_user( app, user_id=user_id, wallet_id=wallet_id, @@ -153,20 +153,20 @@ async def pay_debt_with_different_wallet( assert current_wallet_id != new_wallet_id # nosec # ensure the wallets can be used by the user - new_wallet: WalletGet = await wallets_api.get_wallet_by_user( + new_wallet: WalletGet = await wallets_service.get_wallet_by_user( app, user_id=user_id, wallet_id=new_wallet_id, product_name=product_name, ) - current_wallet: WalletGet = await wallets_api.get_wallet_by_user( + current_wallet: WalletGet = await wallets_service.get_wallet_by_user( app, user_id=user_id, wallet_id=current_wallet_id, product_name=product_name, ) - user = await users_api.get_user(app, user_id=user_id) + user = await users_service.get_user(app, user_id=user_id) # Transfer credits from the source wallet to the connected wallet rpc_client = get_rabbitmq_rpc_client(app) diff --git a/services/web/server/src/simcore_service_webserver/projects/_workspaces_service.py b/services/web/server/src/simcore_service_webserver/projects/_workspaces_service.py index 14e73f2a1bf..e606c2f02a7 100644 --- a/services/web/server/src/simcore_service_webserver/projects/_workspaces_service.py +++ b/services/web/server/src/simcore_service_webserver/projects/_workspaces_service.py @@ -10,9 +10,7 @@ from ..db.plugin import get_asyncpg_engine from ..users.api import get_user from ..workspaces.api import check_user_workspace_access -from . import _folders_repository as _folders_repository -from . import _groups_respository as project_groups_db -from . import _projects_repository +from . import _folders_repository, _groups_respository, _projects_repository from ._access_rights_service import get_user_project_access_rights from .exceptions import ProjectInvalidRightsError @@ -62,10 +60,10 @@ async def move_project_into_workspace( # 5. Remove all project permissions, leave only the user who moved the project user = await get_user(app, user_id=user_id) - await project_groups_db.delete_all_project_groups( + await _groups_respository.delete_all_project_groups( app, connection=conn, project_id=project_id ) - await project_groups_db.update_or_insert_project_group( + await _groups_respository.update_or_insert_project_group( app, connection=conn, project_id=project_id, diff --git a/services/web/server/src/simcore_service_webserver/resource_usage/_observer.py b/services/web/server/src/simcore_service_webserver/resource_usage/_observer.py index 4362247f3ec..114bc1df298 100644 --- a/services/web/server/src/simcore_service_webserver/resource_usage/_observer.py +++ b/services/web/server/src/simcore_service_webserver/resource_usage/_observer.py @@ -1,7 +1,4 @@ -""" Handlers to events registered in servicelib.observer.event_registry - -""" - +"""Handlers to events registered in servicelib.observer.event_registry""" import logging @@ -15,7 +12,7 @@ from servicelib.utils import logged_gather from ..notifications import wallet_osparc_credits -from ..wallets import api as wallets_api +from ..wallets import api as wallets_service _logger = logging.getLogger(__name__) @@ -30,7 +27,7 @@ async def _on_user_disconnected( assert client_session_id # nosec # Get all user wallets and unsubscribe - user_wallet = await wallets_api.list_wallets_for_user( + user_wallet = await wallets_service.list_wallets_for_user( app, user_id=user_id, product_name=product_name ) disconnect_tasks = [ @@ -44,7 +41,7 @@ async def _on_user_connected( user_id: int, app: web.Application, product_name: str ) -> None: # Get all user wallets and subscribe - user_wallet = await wallets_api.list_wallets_for_user( + user_wallet = await wallets_service.list_wallets_for_user( app, user_id=user_id, product_name=product_name ) _logger.debug("Connecting user %s to wallets %s", f"{user_id}", f"{user_wallet}") diff --git a/services/web/server/src/simcore_service_webserver/wallets/_api.py b/services/web/server/src/simcore_service_webserver/wallets/_api.py index a9721f5dfe0..dd092e2a39f 100644 --- a/services/web/server/src/simcore_service_webserver/wallets/_api.py +++ b/services/web/server/src/simcore_service_webserver/wallets/_api.py @@ -16,7 +16,7 @@ from pydantic import TypeAdapter from ..resource_usage.service import get_wallet_total_available_credits -from ..users import api as users_api +from ..users import api as users_service from ..users import preferences_api as user_preferences_api from ..users.exceptions import UserDefaultWalletNotFoundError from . import _db as db @@ -33,7 +33,7 @@ async def create_wallet( thumbnail: str | None, product_name: ProductName, ) -> WalletGet: - user: dict = await users_api.get_user(app, user_id) + user: dict = await users_service.get_user(app, user_id) wallet_db: WalletDB = await db.create_wallet( app=app, owner=user["primary_gid"], diff --git a/services/web/server/src/simcore_service_webserver/wallets/_groups_api.py b/services/web/server/src/simcore_service_webserver/wallets/_groups_api.py index 5a3dcc0a339..05b6625ae5e 100644 --- a/services/web/server/src/simcore_service_webserver/wallets/_groups_api.py +++ b/services/web/server/src/simcore_service_webserver/wallets/_groups_api.py @@ -8,7 +8,7 @@ from models_library.wallets import UserWalletDB, WalletID from pydantic import BaseModel, ConfigDict -from ..users import api as users_api +from ..users import api as users_service from . import _db as wallets_db from . import _groups_db as wallets_groups_db from ._groups_db import WalletGroupGetDB @@ -87,9 +87,9 @@ async def list_wallet_groups_by_user_and_wallet( ), ) - wallet_groups_db: list[ - WalletGroupGetDB - ] = await wallets_groups_db.list_wallet_groups(app=app, wallet_id=wallet_id) + wallet_groups_db: list[WalletGroupGetDB] = ( + await wallets_groups_db.list_wallet_groups(app=app, wallet_id=wallet_id) + ) wallet_groups_api: list[WalletGroupGet] = [ WalletGroupGet.model_validate(group) for group in wallet_groups_db @@ -103,9 +103,9 @@ async def list_wallet_groups_with_read_access_by_wallet( *, wallet_id: WalletID, ) -> list[WalletGroupGet]: - wallet_groups_db: list[ - WalletGroupGetDB - ] = await wallets_groups_db.list_wallet_groups(app=app, wallet_id=wallet_id) + wallet_groups_db: list[WalletGroupGetDB] = ( + await wallets_groups_db.list_wallet_groups(app=app, wallet_id=wallet_id) + ) wallet_groups_api: list[WalletGroupGet] = [ WalletGroupGet.model_validate(group) @@ -135,7 +135,7 @@ async def update_wallet_group( reason=f"User does not have write access to wallet {wallet_id}" ) if wallet.owner == group_id: - user: dict = await users_api.get_user(app, user_id) + user: dict = await users_service.get_user(app, user_id) if user["primary_gid"] != wallet.owner: # Only the owner of the wallet can modify the owner group raise WalletAccessForbiddenError( @@ -177,7 +177,7 @@ async def delete_wallet_group( reason=f"User does not have delete access to wallet {wallet_id}" ) if wallet.owner == group_id: - user: dict = await users_api.get_user(app, user_id) + user: dict = await users_service.get_user(app, user_id) if user["primary_gid"] != wallet.owner: # Only the owner of the wallet can delete the owner group raise WalletAccessForbiddenError( diff --git a/services/web/server/src/simcore_service_webserver/workspaces/_groups_service.py b/services/web/server/src/simcore_service_webserver/workspaces/_groups_service.py index 37737e73590..d8293854bd3 100644 --- a/services/web/server/src/simcore_service_webserver/workspaces/_groups_service.py +++ b/services/web/server/src/simcore_service_webserver/workspaces/_groups_service.py @@ -8,7 +8,7 @@ from models_library.workspaces import UserWorkspaceWithAccessRights, WorkspaceID from pydantic import BaseModel, ConfigDict -from ..users import api as users_api +from ..users import api as users_service from . import _groups_repository as workspaces_groups_db from . import _workspaces_repository as workspaces_db from ._groups_repository import WorkspaceGroupGetDB @@ -80,10 +80,10 @@ async def list_workspace_groups_by_user_and_workspace( permission="read", ) - workspace_groups_db: list[ - WorkspaceGroupGetDB - ] = await workspaces_groups_db.list_workspace_groups( - app=app, workspace_id=workspace_id + workspace_groups_db: list[WorkspaceGroupGetDB] = ( + await workspaces_groups_db.list_workspace_groups( + app=app, workspace_id=workspace_id + ) ) workspace_groups_api: list[WorkspaceGroupGet] = [ @@ -98,10 +98,10 @@ async def list_workspace_groups_with_read_access_by_workspace( *, workspace_id: WorkspaceID, ) -> list[WorkspaceGroupGet]: - workspace_groups_db: list[ - WorkspaceGroupGetDB - ] = await workspaces_groups_db.list_workspace_groups( - app=app, workspace_id=workspace_id + workspace_groups_db: list[WorkspaceGroupGetDB] = ( + await workspaces_groups_db.list_workspace_groups( + app=app, workspace_id=workspace_id + ) ) workspace_groups_api: list[WorkspaceGroupGet] = [ @@ -137,7 +137,7 @@ async def update_workspace_group( reason=f"User does not have write access to workspace {workspace_id}" ) if workspace.owner_primary_gid == group_id: - user: dict = await users_api.get_user(app, user_id) + user: dict = await users_service.get_user(app, user_id) if user["primary_gid"] != workspace.owner_primary_gid: # Only the owner of the workspace can modify the owner group raise WorkspaceAccessForbiddenError( @@ -169,7 +169,7 @@ async def delete_workspace_group( group_id: GroupID, product_name: ProductName, ) -> None: - user: dict = await users_api.get_user(app, user_id=user_id) + user: dict = await users_service.get_user(app, user_id=user_id) workspace: UserWorkspaceWithAccessRights = ( await workspaces_db.get_workspace_for_user( app=app, From a71759fcbbb3ec9320025d1500f91bda5f420e42 Mon Sep 17 00:00:00 2001 From: Pedro Crespo-Valero <32402063+pcrespov@users.noreply.github.com> Date: Fri, 21 Mar 2025 15:45:53 +0100 Subject: [PATCH 17/39] imports --- .../diagnostics/_handlers.py | 4 ++-- .../projects/_crud_api_create.py | 4 ++-- .../projects/_projects_service.py | 12 ++++++------ .../projects/_trash_service.py | 4 ++-- 4 files changed, 12 insertions(+), 12 deletions(-) diff --git a/services/web/server/src/simcore_service_webserver/diagnostics/_handlers.py b/services/web/server/src/simcore_service_webserver/diagnostics/_handlers.py index 214fafff773..4d84df1022c 100644 --- a/services/web/server/src/simcore_service_webserver/diagnostics/_handlers.py +++ b/services/web/server/src/simcore_service_webserver/diagnostics/_handlers.py @@ -15,7 +15,7 @@ from .._meta import API_VERSION, APP_NAME, api_version_prefix from ..catalog import catalog_service from ..db import plugin -from ..director_v2 import api as director_v2_api +from ..director_v2 import api as director_v2_service from ..login.decorators import login_required from ..resource_usage._client import is_resource_usage_tracking_service_responsive from ..security.decorators import permission_required @@ -124,7 +124,7 @@ async def _check_storage(): async def _check_director2(): check.services["director_v2"] = { - "healthy": await director_v2_api.is_healthy(request.app) + "healthy": await director_v2_service.is_healthy(request.app) } async def _check_catalog(): diff --git a/services/web/server/src/simcore_service_webserver/projects/_crud_api_create.py b/services/web/server/src/simcore_service_webserver/projects/_crud_api_create.py index 2850c0e6ecd..fe6894dea17 100644 --- a/services/web/server/src/simcore_service_webserver/projects/_crud_api_create.py +++ b/services/web/server/src/simcore_service_webserver/projects/_crud_api_create.py @@ -28,7 +28,7 @@ from ..application_settings import get_application_settings from ..catalog import catalog_service -from ..director_v2 import api as director_v2_api +from ..director_v2 import api as director_v2_service from ..dynamic_scheduler import api as dynamic_scheduler_api from ..folders import _folders_repository as folders_folders_repository from ..redis import get_redis_lock_manager_client_sdk @@ -395,7 +395,7 @@ async def create_project( # pylint: disable=too-many-arguments,too-many-branche task_progress.update() # This is a new project and every new graph needs to be reflected in the pipeline tables - await director_v2_api.create_or_update_pipeline( + await director_v2_service.create_or_update_pipeline( request.app, user_id, new_project["uuid"], product_name ) # get the latest state of the project (lastChangeDate for instance) diff --git a/services/web/server/src/simcore_service_webserver/projects/_projects_service.py b/services/web/server/src/simcore_service_webserver/projects/_projects_service.py index fc4ba397284..8e1f956c62e 100644 --- a/services/web/server/src/simcore_service_webserver/projects/_projects_service.py +++ b/services/web/server/src/simcore_service_webserver/projects/_projects_service.py @@ -95,7 +95,7 @@ from ..application_settings import get_application_settings from ..catalog import catalog_service -from ..director_v2 import api as director_v2_api +from ..director_v2 import api as director_v2_service from ..dynamic_scheduler import api as dynamic_scheduler_api from ..products import products_web from ..rabbitmq import get_rabbitmq_rpc_client @@ -842,7 +842,7 @@ async def add_project_node( # also ensure the project is updated by director-v2 since services # are due to access comp_tasks at some point see [https://github.com/ITISFoundation/osparc-simcore/issues/3216] - await director_v2_api.create_or_update_pipeline( + await director_v2_service.create_or_update_pipeline( request.app, user_id, project["uuid"], product_name ) await dynamic_scheduler_api.update_projects_networks( @@ -965,7 +965,7 @@ async def delete_project_node( await db.remove_project_node(user_id, project_uuid, NodeID(node_uuid)) # also ensure the project is updated by director-v2 since services product_name = products_web.get_product_name(request) - await director_v2_api.create_or_update_pipeline( + await director_v2_service.create_or_update_pipeline( request.app, user_id, project_uuid, product_name ) await dynamic_scheduler_api.update_projects_networks( @@ -1095,7 +1095,7 @@ async def patch_project_node( ) # 4. Make calls to director-v2 to keep data in sync (ex. comp_tasks DB table) - await director_v2_api.create_or_update_pipeline( + await director_v2_service.create_or_update_pipeline( app, user_id, project_id, product_name=product_name ) if _node_patch_exclude_unset.get("label"): @@ -1550,7 +1550,7 @@ async def get_project_states_for_user( running_state = RunningState.UNKNOWN lock_state, computation_task = await logged_gather( _get_project_lock_state(user_id, project_uuid, app), - director_v2_api.get_computation_task(app, user_id, UUID(project_uuid)), + director_v2_service.get_computation_task(app, user_id, UUID(project_uuid)), ) if computation_task: # get the running state @@ -1577,7 +1577,7 @@ async def add_project_states_for_user( running_state = RunningState.UNKNOWN if not is_template and ( - computation_task := await director_v2_api.get_computation_task( + computation_task := await director_v2_service.get_computation_task( app, user_id, project["uuid"] ) ): diff --git a/services/web/server/src/simcore_service_webserver/projects/_trash_service.py b/services/web/server/src/simcore_service_webserver/projects/_trash_service.py index cd0de244548..2ea1dfa7297 100644 --- a/services/web/server/src/simcore_service_webserver/projects/_trash_service.py +++ b/services/web/server/src/simcore_service_webserver/projects/_trash_service.py @@ -13,7 +13,7 @@ from servicelib.aiohttp.application_keys import APP_FIRE_AND_FORGET_TASKS_KEY from servicelib.utils import fire_and_forget_task -from ..director_v2 import api as director_v2_api +from ..director_v2 import api as director_v2_service from ..dynamic_scheduler import api as dynamic_scheduler_api from . import _crud_api_read from . import _projects_repository as projects_repository @@ -38,7 +38,7 @@ async def _is_project_running( project_id: ProjectID, ) -> bool: return bool( - await director_v2_api.is_pipeline_running( + await director_v2_service.is_pipeline_running( app, user_id=user_id, project_id=project_id ) ) or bool( From c613c482eeceadf45330b68d655c0f2415331f1a Mon Sep 17 00:00:00 2001 From: Pedro Crespo-Valero <32402063+pcrespov@users.noreply.github.com> Date: Fri, 21 Mar 2025 15:46:40 +0100 Subject: [PATCH 18/39] imports --- .../garbage_collector/_core_orphans.py | 6 ++-- .../projects/_controller/nodes_rest.py | 10 +++--- .../projects/_crud_api_create.py | 4 +-- .../projects/_projects_service.py | 34 +++++++++++-------- .../projects/_trash_service.py | 4 +-- .../studies_dispatcher/_redirects_handlers.py | 15 ++++---- .../studies_dispatcher/_studies_access.py | 4 +-- 7 files changed, 39 insertions(+), 38 deletions(-) diff --git a/services/web/server/src/simcore_service_webserver/garbage_collector/_core_orphans.py b/services/web/server/src/simcore_service_webserver/garbage_collector/_core_orphans.py index 37e2eb29f4a..2bdc3552e40 100644 --- a/services/web/server/src/simcore_service_webserver/garbage_collector/_core_orphans.py +++ b/services/web/server/src/simcore_service_webserver/garbage_collector/_core_orphans.py @@ -14,7 +14,7 @@ from servicelib.logging_utils import log_catch, log_context from servicelib.utils import limited_as_completed, logged_gather -from ..dynamic_scheduler import api as dynamic_scheduler_api +from ..dynamic_scheduler import api as dynamic_scheduler_service from ..projects._projects_service import ( is_node_id_present_in_any_project_workbench, list_node_ids_in_project, @@ -55,7 +55,7 @@ async def _remove_service( logging.INFO, msg=f"removing {(service.node_uuid, service.host)} with {save_service_state=}", ): - await dynamic_scheduler_api.stop_dynamic_service( + await dynamic_scheduler_service.stop_dynamic_service( app, dynamic_service_stop=DynamicServiceStop( user_id=service.user_id, @@ -90,7 +90,7 @@ async def remove_orphaned_services( # in between and the GC would remove services that actually should be running. with log_catch(_logger, reraise=False): - running_services = await dynamic_scheduler_api.list_dynamic_services(app) + running_services = await dynamic_scheduler_service.list_dynamic_services(app) if not running_services: # nothing to do return diff --git a/services/web/server/src/simcore_service_webserver/projects/_controller/nodes_rest.py b/services/web/server/src/simcore_service_webserver/projects/_controller/nodes_rest.py index 6e31dc63137..955f075a80f 100644 --- a/services/web/server/src/simcore_service_webserver/projects/_controller/nodes_rest.py +++ b/services/web/server/src/simcore_service_webserver/projects/_controller/nodes_rest.py @@ -58,7 +58,7 @@ from ..._meta import API_VTAG as VTAG from ...catalog import catalog_service -from ...dynamic_scheduler import api as dynamic_scheduler_api +from ...dynamic_scheduler import api as dynamic_scheduler_service from ...groups.api import get_group_from_gid, list_all_user_groups_ids from ...groups.exceptions import GroupNotFoundError from ...login.decorators import login_required @@ -163,7 +163,7 @@ async def get_node(request: web.Request) -> web.Response: ) service_data: NodeGetIdle | NodeGetUnknown | DynamicServiceGet | NodeGet = ( - await dynamic_scheduler_api.get_dynamic_service( + await dynamic_scheduler_service.get_dynamic_service( app=request.app, node_id=path_params.node_id ) ) @@ -232,7 +232,7 @@ async def retrieve_node(request: web.Request) -> web.Response: retrieve = await parse_request_body_as(NodeRetrieve, request) return web.json_response( - await dynamic_scheduler_api.retrieve_inputs( + await dynamic_scheduler_service.retrieve_inputs( request.app, path_params.node_id, retrieve.port_keys ), dumps=json_dumps, @@ -297,7 +297,7 @@ async def _stop_dynamic_service_task( ): # NOTE: _handle_project_nodes_exceptions only decorate handlers try: - await dynamic_scheduler_api.stop_dynamic_service( + await dynamic_scheduler_service.stop_dynamic_service( app, dynamic_service_stop=dynamic_service_stop ) return web.json_response(status=status.HTTP_204_NO_CONTENT) @@ -364,7 +364,7 @@ async def restart_node(request: web.Request) -> web.Response: path_params = parse_request_path_parameters_as(NodePathParams, request) - await dynamic_scheduler_api.restart_user_services( + await dynamic_scheduler_service.restart_user_services( request.app, node_id=path_params.node_id ) diff --git a/services/web/server/src/simcore_service_webserver/projects/_crud_api_create.py b/services/web/server/src/simcore_service_webserver/projects/_crud_api_create.py index fe6894dea17..07d303bcfeb 100644 --- a/services/web/server/src/simcore_service_webserver/projects/_crud_api_create.py +++ b/services/web/server/src/simcore_service_webserver/projects/_crud_api_create.py @@ -29,7 +29,7 @@ from ..application_settings import get_application_settings from ..catalog import catalog_service from ..director_v2 import api as director_v2_service -from ..dynamic_scheduler import api as dynamic_scheduler_api +from ..dynamic_scheduler import api as dynamic_scheduler_service from ..folders import _folders_repository as folders_folders_repository from ..redis import get_redis_lock_manager_client_sdk from ..storage.api import ( @@ -389,7 +389,7 @@ async def create_project( # pylint: disable=too-many-arguments,too-many-branche ) # update the network information in director-v2 - await dynamic_scheduler_api.update_projects_networks( + await dynamic_scheduler_service.update_projects_networks( request.app, project_id=ProjectID(new_project["uuid"]) ) task_progress.update() diff --git a/services/web/server/src/simcore_service_webserver/projects/_projects_service.py b/services/web/server/src/simcore_service_webserver/projects/_projects_service.py index 8e1f956c62e..4758a39f7f7 100644 --- a/services/web/server/src/simcore_service_webserver/projects/_projects_service.py +++ b/services/web/server/src/simcore_service_webserver/projects/_projects_service.py @@ -96,7 +96,7 @@ from ..application_settings import get_application_settings from ..catalog import catalog_service from ..director_v2 import api as director_v2_service -from ..dynamic_scheduler import api as dynamic_scheduler_api +from ..dynamic_scheduler import api as dynamic_scheduler_service from ..products import products_web from ..rabbitmq import get_rabbitmq_rpc_client from ..redis import get_redis_lock_manager_client_sdk @@ -638,7 +638,7 @@ async def _start_dynamic_service( # noqa: C901 ), ) async def _() -> None: - project_running_nodes = await dynamic_scheduler_api.list_dynamic_services( + project_running_nodes = await dynamic_scheduler_service.list_dynamic_services( request.app, user_id=user_id, project_id=project_uuid ) _nodes_service.check_num_service_per_projects_limit( @@ -761,7 +761,7 @@ async def _() -> None: service_key=service_key, service_version=service_version, ) - await dynamic_scheduler_api.run_dynamic_service( + await dynamic_scheduler_service.run_dynamic_service( app=request.app, dynamic_service_start=DynamicServiceStart( product_name=product_name, @@ -845,7 +845,7 @@ async def add_project_node( await director_v2_service.create_or_update_pipeline( request.app, user_id, project["uuid"], product_name ) - await dynamic_scheduler_api.update_projects_networks( + await dynamic_scheduler_service.update_projects_networks( request.app, project_id=ProjectID(project["uuid"]) ) @@ -900,7 +900,7 @@ async def _remove_service_and_its_data_folders( ) -> None: if stop_service: # no need to save the state of the node when deleting it - await dynamic_scheduler_api.stop_dynamic_service( + await dynamic_scheduler_service.stop_dynamic_service( app, dynamic_service_stop=DynamicServiceStop( user_id=user_id, @@ -936,10 +936,12 @@ async def delete_project_node( permission="write", ) - list_running_dynamic_services = await dynamic_scheduler_api.list_dynamic_services( - request.app, - user_id=user_id, - project_id=project_uuid, + list_running_dynamic_services = ( + await dynamic_scheduler_service.list_dynamic_services( + request.app, + user_id=user_id, + project_id=project_uuid, + ) ) fire_and_forget_task( @@ -968,7 +970,7 @@ async def delete_project_node( await director_v2_service.create_or_update_pipeline( request.app, user_id, project_uuid, product_name ) - await dynamic_scheduler_api.update_projects_networks( + await dynamic_scheduler_service.update_projects_networks( request.app, project_id=project_uuid ) @@ -1099,7 +1101,9 @@ async def patch_project_node( app, user_id, project_id, product_name=product_name ) if _node_patch_exclude_unset.get("label"): - await dynamic_scheduler_api.update_projects_networks(app, project_id=project_id) + await dynamic_scheduler_service.update_projects_networks( + app, project_id=project_id + ) # 5. Updates project states for user, if inputs/outputs have been changed if {"inputs", "outputs"} & _node_patch_exclude_unset.keys(): @@ -1203,7 +1207,7 @@ async def _safe_retrieve( app: web.Application, node_id: NodeID, port_keys: list[str] ) -> None: try: - await dynamic_scheduler_api.retrieve_inputs(app, node_id, port_keys) + await dynamic_scheduler_service.retrieve_inputs(app, node_id, port_keys) except RPCServerError as exc: log.warning( "Unable to call :retrieve endpoint on service %s, keys: [%s]: error: [%s]", @@ -1733,7 +1737,7 @@ async def run_project_dynamic_services( project_settings: ProjectsSettings = get_plugin_settings(request.app) running_services_uuids: list[NodeIDStr] = [ f"{d.node_uuid}" - for d in await dynamic_scheduler_api.list_dynamic_services( + for d in await dynamic_scheduler_service.list_dynamic_services( request.app, user_id=user_id, project_id=ProjectID(project["uuid"]) ) ] @@ -1849,7 +1853,7 @@ async def _locked_stop_dynamic_serivces_in_project() -> None: ServiceWasNotFoundError, ): # here RPC exceptions are suppressed. in case the service is not found to preserve old behavior - await dynamic_scheduler_api.stop_dynamic_services_in_project( + await dynamic_scheduler_service.stop_dynamic_services_in_project( app=app, user_id=user_id, project_id=project_uuid, @@ -1940,7 +1944,7 @@ async def get_project_inactivity( app: web.Application, project_id: ProjectID ) -> GetProjectInactivityResponse: project_settings: ProjectsSettings = get_plugin_settings(app) - return await dynamic_scheduler_api.get_project_inactivity( + return await dynamic_scheduler_service.get_project_inactivity( app, project_id=project_id, # NOTE: project is considered inactive if all services exposing an /inactivity diff --git a/services/web/server/src/simcore_service_webserver/projects/_trash_service.py b/services/web/server/src/simcore_service_webserver/projects/_trash_service.py index 2ea1dfa7297..21fa813d88f 100644 --- a/services/web/server/src/simcore_service_webserver/projects/_trash_service.py +++ b/services/web/server/src/simcore_service_webserver/projects/_trash_service.py @@ -14,7 +14,7 @@ from servicelib.utils import fire_and_forget_task from ..director_v2 import api as director_v2_service -from ..dynamic_scheduler import api as dynamic_scheduler_api +from ..dynamic_scheduler import api as dynamic_scheduler_service from . import _crud_api_read from . import _projects_repository as projects_repository from . import _projects_service, _projects_service_delete @@ -42,7 +42,7 @@ async def _is_project_running( app, user_id=user_id, project_id=project_id ) ) or bool( - await dynamic_scheduler_api.list_dynamic_services( + await dynamic_scheduler_service.list_dynamic_services( app, user_id=user_id, project_id=project_id ) ) diff --git a/services/web/server/src/simcore_service_webserver/studies_dispatcher/_redirects_handlers.py b/services/web/server/src/simcore_service_webserver/studies_dispatcher/_redirects_handlers.py index 859551ed5d0..0a0d37ef17b 100644 --- a/services/web/server/src/simcore_service_webserver/studies_dispatcher/_redirects_handlers.py +++ b/services/web/server/src/simcore_service_webserver/studies_dispatcher/_redirects_handlers.py @@ -1,6 +1,4 @@ -""" Handles request to the viewers redirection entrypoints - -""" +"""Handles request to the viewers redirection entrypoints""" import functools import logging @@ -18,7 +16,7 @@ from servicelib.aiohttp.typing_extension import Handler from servicelib.logging_errors import create_troubleshotting_log_kwargs -from ..dynamic_scheduler import api as dynamic_scheduler_api +from ..dynamic_scheduler import api as dynamic_scheduler_service from ..products import products_web from ..utils import compose_support_error_msg from ..utils_aiohttp import create_redirect_to_page_response @@ -169,8 +167,7 @@ def ensure_extension_upper_and_dotless(cls, v): return v -class ServiceAndFileParams(FileQueryParams, ServiceParams): - ... +class ServiceAndFileParams(FileQueryParams, ServiceParams): ... class ViewerQueryParams(BaseModel): @@ -253,7 +250,7 @@ async def get_redirection_to_viewer(request: web.Request): file_params.download_link, product_name=products_web.get_product_name(request), ) - await dynamic_scheduler_api.update_projects_networks( + await dynamic_scheduler_service.update_projects_networks( request.app, project_id=project_id ) @@ -284,7 +281,7 @@ async def get_redirection_to_viewer(request: web.Request): service_info=_create_service_info_from(valid_service), product_name=products_web.get_product_name(request), ) - await dynamic_scheduler_api.update_projects_networks( + await dynamic_scheduler_service.update_projects_networks( request.app, project_id=project_id ) @@ -322,7 +319,7 @@ async def get_redirection_to_viewer(request: web.Request): ).STUDIES_DEFAULT_FILE_THUMBNAIL, product_name=products_web.get_product_name(request), ) - await dynamic_scheduler_api.update_projects_networks( + await dynamic_scheduler_service.update_projects_networks( request.app, project_id=project_id ) diff --git a/services/web/server/src/simcore_service_webserver/studies_dispatcher/_studies_access.py b/services/web/server/src/simcore_service_webserver/studies_dispatcher/_studies_access.py index ef7d37569f7..e3e6004f8d3 100644 --- a/services/web/server/src/simcore_service_webserver/studies_dispatcher/_studies_access.py +++ b/services/web/server/src/simcore_service_webserver/studies_dispatcher/_studies_access.py @@ -28,7 +28,7 @@ from ..constants import INDEX_RESOURCE_NAME from ..director_v2._core_computations import create_or_update_pipeline -from ..dynamic_scheduler import api as dynamic_scheduler_api +from ..dynamic_scheduler import api as dynamic_scheduler_service from ..products import products_web from ..projects._groups_respository import get_project_group from ..projects._projects_repository_legacy import ProjectDBAPI @@ -212,7 +212,7 @@ async def copy_study_to_account( await create_or_update_pipeline( request.app, user["id"], project["uuid"], product_name ) - await dynamic_scheduler_api.update_projects_networks( + await dynamic_scheduler_service.update_projects_networks( request.app, project_id=ProjectID(project["uuid"]) ) From 1cba176ee583f68185357b82a92e295726fa393e Mon Sep 17 00:00:00 2001 From: Pedro Crespo-Valero <32402063+pcrespov@users.noreply.github.com> Date: Fri, 21 Mar 2025 15:49:02 +0100 Subject: [PATCH 19/39] dv2 --- .../simcore_service_webserver/diagnostics/_handlers.py | 2 +- .../director_v2/{api.py => director_v2_service.py} | 2 +- .../projects/_crud_api_create.py | 2 +- .../projects/_crud_api_delete.py | 4 ++-- .../projects/_ports_service.py | 2 +- .../projects/_projects_service.py | 2 +- .../projects/_projects_service_delete.py | 2 +- .../projects/_trash_service.py | 2 +- .../studies_dispatcher/_projects.py | 2 +- .../server/tests/unit/with_dbs/01/test_director_v2.py | 10 ++++++---- 10 files changed, 16 insertions(+), 14 deletions(-) rename services/web/server/src/simcore_service_webserver/director_v2/{api.py => director_v2_service.py} (98%) diff --git a/services/web/server/src/simcore_service_webserver/diagnostics/_handlers.py b/services/web/server/src/simcore_service_webserver/diagnostics/_handlers.py index 4d84df1022c..22409ba6557 100644 --- a/services/web/server/src/simcore_service_webserver/diagnostics/_handlers.py +++ b/services/web/server/src/simcore_service_webserver/diagnostics/_handlers.py @@ -15,7 +15,7 @@ from .._meta import API_VERSION, APP_NAME, api_version_prefix from ..catalog import catalog_service from ..db import plugin -from ..director_v2 import api as director_v2_service +from ..director_v2 import director_v2_service from ..login.decorators import login_required from ..resource_usage._client import is_resource_usage_tracking_service_responsive from ..security.decorators import permission_required diff --git a/services/web/server/src/simcore_service_webserver/director_v2/api.py b/services/web/server/src/simcore_service_webserver/director_v2/director_v2_service.py similarity index 98% rename from services/web/server/src/simcore_service_webserver/director_v2/api.py rename to services/web/server/src/simcore_service_webserver/director_v2/director_v2_service.py index 2ecbb1446fd..0f8a3f16321 100644 --- a/services/web/server/src/simcore_service_webserver/director_v2/api.py +++ b/services/web/server/src/simcore_service_webserver/director_v2/director_v2_service.py @@ -1,4 +1,4 @@ -""" plugin API +"""plugin API PLEASE avoid importing from any other module to access this plugin's functionality """ diff --git a/services/web/server/src/simcore_service_webserver/projects/_crud_api_create.py b/services/web/server/src/simcore_service_webserver/projects/_crud_api_create.py index 07d303bcfeb..4bb6f9b938a 100644 --- a/services/web/server/src/simcore_service_webserver/projects/_crud_api_create.py +++ b/services/web/server/src/simcore_service_webserver/projects/_crud_api_create.py @@ -28,7 +28,7 @@ from ..application_settings import get_application_settings from ..catalog import catalog_service -from ..director_v2 import api as director_v2_service +from ..director_v2 import director_v2_service from ..dynamic_scheduler import api as dynamic_scheduler_service from ..folders import _folders_repository as folders_folders_repository from ..redis import get_redis_lock_manager_client_sdk diff --git a/services/web/server/src/simcore_service_webserver/projects/_crud_api_delete.py b/services/web/server/src/simcore_service_webserver/projects/_crud_api_delete.py index 8c251dbcd63..866609110f3 100644 --- a/services/web/server/src/simcore_service_webserver/projects/_crud_api_delete.py +++ b/services/web/server/src/simcore_service_webserver/projects/_crud_api_delete.py @@ -13,7 +13,7 @@ from models_library.projects import ProjectID from models_library.users import UserID -from ..director_v2 import api +from ..director_v2 import director_v2_service from ..storage.api import delete_data_folders_of_project from ..users.api import FullNameDict from ..users.exceptions import UserNotFoundError @@ -110,7 +110,7 @@ async def delete_project( # stops computational services # - raises DirectorServiceError - await api.delete_pipeline(app, user_id, project_uuid) + await director_v2_service.delete_pipeline(app, user_id, project_uuid) # rm data from storage await delete_data_folders_of_project(app, project_uuid, user_id) diff --git a/services/web/server/src/simcore_service_webserver/projects/_ports_service.py b/services/web/server/src/simcore_service_webserver/projects/_ports_service.py index 9ae42c397c8..e00998744ba 100644 --- a/services/web/server/src/simcore_service_webserver/projects/_ports_service.py +++ b/services/web/server/src/simcore_service_webserver/projects/_ports_service.py @@ -26,7 +26,7 @@ from models_library.utils.services_io import JsonSchemaDict, get_service_io_json_schema from pydantic import ConfigDict, ValidationError -from ..director_v2.api import get_batch_tasks_outputs +from ..director_v2.director_v2_service import get_batch_tasks_outputs from .exceptions import InvalidInputValue diff --git a/services/web/server/src/simcore_service_webserver/projects/_projects_service.py b/services/web/server/src/simcore_service_webserver/projects/_projects_service.py index 4758a39f7f7..64f41e88491 100644 --- a/services/web/server/src/simcore_service_webserver/projects/_projects_service.py +++ b/services/web/server/src/simcore_service_webserver/projects/_projects_service.py @@ -95,7 +95,7 @@ from ..application_settings import get_application_settings from ..catalog import catalog_service -from ..director_v2 import api as director_v2_service +from ..director_v2 import director_v2_service from ..dynamic_scheduler import api as dynamic_scheduler_service from ..products import products_web from ..rabbitmq import get_rabbitmq_rpc_client diff --git a/services/web/server/src/simcore_service_webserver/projects/_projects_service_delete.py b/services/web/server/src/simcore_service_webserver/projects/_projects_service_delete.py index 680b0b4525e..3273d17665c 100644 --- a/services/web/server/src/simcore_service_webserver/projects/_projects_service_delete.py +++ b/services/web/server/src/simcore_service_webserver/projects/_projects_service_delete.py @@ -10,7 +10,7 @@ from servicelib.common_headers import UNDEFINED_DEFAULT_SIMCORE_USER_AGENT_VALUE from servicelib.redis._errors import ProjectLockError -from ..director_v2 import api as director_v2_service +from ..director_v2 import director_v2_service from . import _projects_repository as projects_repository from . import _projects_service from .exceptions import ProjectDeleteError, ProjectNotFoundError diff --git a/services/web/server/src/simcore_service_webserver/projects/_trash_service.py b/services/web/server/src/simcore_service_webserver/projects/_trash_service.py index 21fa813d88f..87b1b1f4e8e 100644 --- a/services/web/server/src/simcore_service_webserver/projects/_trash_service.py +++ b/services/web/server/src/simcore_service_webserver/projects/_trash_service.py @@ -13,7 +13,7 @@ from servicelib.aiohttp.application_keys import APP_FIRE_AND_FORGET_TASKS_KEY from servicelib.utils import fire_and_forget_task -from ..director_v2 import api as director_v2_service +from ..director_v2 import director_v2_service from ..dynamic_scheduler import api as dynamic_scheduler_service from . import _crud_api_read from . import _projects_repository as projects_repository diff --git a/services/web/server/src/simcore_service_webserver/studies_dispatcher/_projects.py b/services/web/server/src/simcore_service_webserver/studies_dispatcher/_projects.py index b1803391a06..a4adbf8e576 100644 --- a/services/web/server/src/simcore_service_webserver/studies_dispatcher/_projects.py +++ b/services/web/server/src/simcore_service_webserver/studies_dispatcher/_projects.py @@ -188,7 +188,7 @@ async def _add_new_project( # TODO: move this to projects_api # TODO: this piece was taken from the end of projects.projects_handlers.create_projects - from ..director_v2.api import create_or_update_pipeline + from ..director_v2.director_v2_service import create_or_update_pipeline from ..projects._projects_repository_legacy import APP_PROJECT_DBAPI db: ProjectDBAPI = app[APP_PROJECT_DBAPI] diff --git a/services/web/server/tests/unit/with_dbs/01/test_director_v2.py b/services/web/server/tests/unit/with_dbs/01/test_director_v2.py index f18bc9e1754..9c5914e3112 100644 --- a/services/web/server/tests/unit/with_dbs/01/test_director_v2.py +++ b/services/web/server/tests/unit/with_dbs/01/test_director_v2.py @@ -10,7 +10,7 @@ from models_library.projects_pipeline import ComputationTask from models_library.projects_state import RunningState from models_library.users import UserID -from simcore_service_webserver.director_v2 import api +from simcore_service_webserver.director_v2 import director_v2_service @pytest.fixture() @@ -37,7 +37,7 @@ async def test_create_pipeline( project_id: ProjectID, osparc_product_name: str, ): - task_out = await api.create_or_update_pipeline( + task_out = await director_v2_service.create_or_update_pipeline( client.app, user_id, project_id, osparc_product_name ) assert task_out @@ -51,7 +51,9 @@ async def test_get_computation_task( user_id: UserID, project_id: ProjectID, ): - task_out = await api.get_computation_task(client.app, user_id, project_id) + task_out = await director_v2_service.get_computation_task( + client.app, user_id, project_id + ) assert task_out assert isinstance(task_out, ComputationTask) assert task_out.state == RunningState.NOT_STARTED @@ -60,4 +62,4 @@ async def test_get_computation_task( async def test_delete_pipeline( mocked_director_v2, client, user_id: UserID, project_id: ProjectID ): - await api.delete_pipeline(client.app, user_id, project_id) + await director_v2_service.delete_pipeline(client.app, user_id, project_id) From fee6d6de00108256d49a5df6c6b912f1d1e2a603 Mon Sep 17 00:00:00 2001 From: Pedro Crespo-Valero <32402063+pcrespov@users.noreply.github.com> Date: Fri, 21 Mar 2025 15:55:04 +0100 Subject: [PATCH 20/39] import and groups_repo --- .../helpers/webserver_projects.py | 2 +- .../folders/_workspaces_repository.py | 2 +- .../projects/_folders_service.py | 2 +- .../projects/_groups_models.py | 18 +++++++++++++++++ ...s_respository.py => _groups_repository.py} | 20 ++----------------- .../projects/_groups_service.py | 16 +++++++-------- .../projects/_workspaces_service.py | 6 +++--- .../studies_dispatcher/_studies_access.py | 2 +- services/web/server/tests/conftest.py | 2 +- .../integration/01/test_garbage_collection.py | 2 +- .../02/test_projects_comments_handlers.py | 2 +- .../tests/unit/with_dbs/03/test_project_db.py | 2 +- .../unit/with_dbs/04/folders/test_folders.py | 2 +- 13 files changed, 40 insertions(+), 38 deletions(-) create mode 100644 services/web/server/src/simcore_service_webserver/projects/_groups_models.py rename services/web/server/src/simcore_service_webserver/projects/{_groups_respository.py => _groups_repository.py} (95%) diff --git a/packages/pytest-simcore/src/pytest_simcore/helpers/webserver_projects.py b/packages/pytest-simcore/src/pytest_simcore/helpers/webserver_projects.py index 9cb6933791a..99ee393f394 100644 --- a/packages/pytest-simcore/src/pytest_simcore/helpers/webserver_projects.py +++ b/packages/pytest-simcore/src/pytest_simcore/helpers/webserver_projects.py @@ -14,7 +14,7 @@ from models_library.projects_nodes_io import NodeID from models_library.services_resources import ServiceResourcesDictHelpers from simcore_postgres_database.utils_projects_nodes import ProjectNodeCreate -from simcore_service_webserver.projects._groups_respository import ( +from simcore_service_webserver.projects._groups_repository import ( update_or_insert_project_group, ) from simcore_service_webserver.projects._projects_repository_legacy import ( diff --git a/services/web/server/src/simcore_service_webserver/folders/_workspaces_repository.py b/services/web/server/src/simcore_service_webserver/folders/_workspaces_repository.py index 99f8a823746..29c435d4855 100644 --- a/services/web/server/src/simcore_service_webserver/folders/_workspaces_repository.py +++ b/services/web/server/src/simcore_service_webserver/folders/_workspaces_repository.py @@ -9,7 +9,7 @@ from ..db.plugin import get_asyncpg_engine from ..projects import _folders_repository as projects_folders_repository -from ..projects import _groups_respository as projects_groups_repository +from ..projects import _groups_repository as projects_groups_repository from ..projects import _projects_repository as projects_repository from ..projects._access_rights_service import check_user_project_permission from ..users.api import get_user diff --git a/services/web/server/src/simcore_service_webserver/projects/_folders_service.py b/services/web/server/src/simcore_service_webserver/projects/_folders_service.py index cd563b28d3d..16230322f61 100644 --- a/services/web/server/src/simcore_service_webserver/projects/_folders_service.py +++ b/services/web/server/src/simcore_service_webserver/projects/_folders_service.py @@ -7,7 +7,7 @@ from models_library.users import UserID from ..folders import _folders_repository as folders_folders_repository -from . import _folders_repository as _folders_repository +from . import _folders_repository from ._access_rights_service import get_user_project_access_rights from ._projects_repository_legacy import APP_PROJECT_DBAPI, ProjectDBAPI from .exceptions import ProjectInvalidRightsError diff --git a/services/web/server/src/simcore_service_webserver/projects/_groups_models.py b/services/web/server/src/simcore_service_webserver/projects/_groups_models.py new file mode 100644 index 00000000000..a9d0828ed5b --- /dev/null +++ b/services/web/server/src/simcore_service_webserver/projects/_groups_models.py @@ -0,0 +1,18 @@ +import logging +from datetime import datetime + +from models_library.groups import GroupID +from pydantic import BaseModel, ConfigDict + +_logger = logging.getLogger(__name__) + + +class ProjectGroupGetDB(BaseModel): + gid: GroupID + read: bool + write: bool + delete: bool + created: datetime + modified: datetime + + model_config = ConfigDict(from_attributes=True) diff --git a/services/web/server/src/simcore_service_webserver/projects/_groups_respository.py b/services/web/server/src/simcore_service_webserver/projects/_groups_repository.py similarity index 95% rename from services/web/server/src/simcore_service_webserver/projects/_groups_respository.py rename to services/web/server/src/simcore_service_webserver/projects/_groups_repository.py index 1e0d40c901d..00f7d467054 100644 --- a/services/web/server/src/simcore_service_webserver/projects/_groups_respository.py +++ b/services/web/server/src/simcore_service_webserver/projects/_groups_repository.py @@ -1,10 +1,9 @@ import logging -from datetime import datetime from aiohttp import web from models_library.groups import GroupID from models_library.projects import ProjectID -from pydantic import BaseModel, ConfigDict, TypeAdapter +from pydantic import TypeAdapter from simcore_postgres_database.models.project_to_groups import project_to_groups from simcore_postgres_database.utils_repos import transaction_context from sqlalchemy import func, literal_column @@ -13,26 +12,11 @@ from sqlalchemy.sql import select from ..db.plugin import get_asyncpg_engine +from ._groups_models import ProjectGroupGetDB from .exceptions import ProjectGroupNotFoundError _logger = logging.getLogger(__name__) -### Models - - -class ProjectGroupGetDB(BaseModel): - gid: GroupID - read: bool - write: bool - delete: bool - created: datetime - modified: datetime - - model_config = ConfigDict(from_attributes=True) - - -## DB API - async def create_project_group( app: web.Application, diff --git a/services/web/server/src/simcore_service_webserver/projects/_groups_service.py b/services/web/server/src/simcore_service_webserver/projects/_groups_service.py index 99018300f10..af2d9161b10 100644 --- a/services/web/server/src/simcore_service_webserver/projects/_groups_service.py +++ b/services/web/server/src/simcore_service_webserver/projects/_groups_service.py @@ -9,9 +9,9 @@ from pydantic import BaseModel from ..users import api as users_service -from . import _groups_respository as projects_groups_db +from . import _groups_repository from ._access_rights_service import check_user_project_permission -from ._groups_respository import ProjectGroupGetDB +from ._groups_models import ProjectGroupGetDB from ._projects_repository_legacy import APP_PROJECT_DBAPI, ProjectDBAPI from .exceptions import ProjectInvalidRightsError @@ -46,7 +46,7 @@ async def create_project_group( permission="write", ) - project_group_db: ProjectGroupGetDB = await projects_groups_db.create_project_group( + project_group_db: ProjectGroupGetDB = await _groups_repository.create_project_group( app=app, project_id=project_id, group_id=group_id, @@ -77,7 +77,7 @@ async def list_project_groups_by_user_and_project( ) project_groups_db: list[ProjectGroupGetDB] = ( - await projects_groups_db.list_project_groups(app=app, project_id=project_id) + await _groups_repository.list_project_groups(app=app, project_id=project_id) ) project_groups_api: list[ProjectGroupGet] = [ @@ -121,7 +121,7 @@ async def replace_project_group( ) project_group_db: ProjectGroupGetDB = ( - await projects_groups_db.replace_project_group( + await _groups_repository.replace_project_group( app=app, project_id=project_id, group_id=group_id, @@ -165,7 +165,7 @@ async def delete_project_group( reason=f"User does not have access to modify owner project group in project {project_id}", ) - await projects_groups_db.delete_project_group( + await _groups_repository.delete_project_group( app=app, project_id=project_id, group_id=group_id ) @@ -179,7 +179,7 @@ async def delete_project_group_without_checking_permissions( project_id: ProjectID, group_id: GroupID, ) -> None: - await projects_groups_db.delete_project_group( + await _groups_repository.delete_project_group( app=app, project_id=project_id, group_id=group_id ) @@ -193,7 +193,7 @@ async def create_project_group_without_checking_permissions( write: bool, delete: bool, ) -> None: - await projects_groups_db.update_or_insert_project_group( + await _groups_repository.update_or_insert_project_group( app=app, project_id=project_id, group_id=group_id, diff --git a/services/web/server/src/simcore_service_webserver/projects/_workspaces_service.py b/services/web/server/src/simcore_service_webserver/projects/_workspaces_service.py index e606c2f02a7..fdf40f27371 100644 --- a/services/web/server/src/simcore_service_webserver/projects/_workspaces_service.py +++ b/services/web/server/src/simcore_service_webserver/projects/_workspaces_service.py @@ -10,7 +10,7 @@ from ..db.plugin import get_asyncpg_engine from ..users.api import get_user from ..workspaces.api import check_user_workspace_access -from . import _folders_repository, _groups_respository, _projects_repository +from . import _folders_repository, _groups_repository, _projects_repository from ._access_rights_service import get_user_project_access_rights from .exceptions import ProjectInvalidRightsError @@ -60,10 +60,10 @@ async def move_project_into_workspace( # 5. Remove all project permissions, leave only the user who moved the project user = await get_user(app, user_id=user_id) - await _groups_respository.delete_all_project_groups( + await _groups_repository.delete_all_project_groups( app, connection=conn, project_id=project_id ) - await _groups_respository.update_or_insert_project_group( + await _groups_repository.update_or_insert_project_group( app, connection=conn, project_id=project_id, diff --git a/services/web/server/src/simcore_service_webserver/studies_dispatcher/_studies_access.py b/services/web/server/src/simcore_service_webserver/studies_dispatcher/_studies_access.py index e3e6004f8d3..691f6c4df69 100644 --- a/services/web/server/src/simcore_service_webserver/studies_dispatcher/_studies_access.py +++ b/services/web/server/src/simcore_service_webserver/studies_dispatcher/_studies_access.py @@ -30,7 +30,7 @@ from ..director_v2._core_computations import create_or_update_pipeline from ..dynamic_scheduler import api as dynamic_scheduler_service from ..products import products_web -from ..projects._groups_respository import get_project_group +from ..projects._groups_repository import get_project_group from ..projects._projects_repository_legacy import ProjectDBAPI from ..projects.api import check_user_project_permission from ..projects.exceptions import ( diff --git a/services/web/server/tests/conftest.py b/services/web/server/tests/conftest.py index 3392e880a61..a833d401b4d 100644 --- a/services/web/server/tests/conftest.py +++ b/services/web/server/tests/conftest.py @@ -41,7 +41,7 @@ from simcore_service_webserver.projects._crud_api_create import ( OVERRIDABLE_DOCUMENT_KEYS, ) -from simcore_service_webserver.projects._groups_respository import ( +from simcore_service_webserver.projects._groups_repository import ( update_or_insert_project_group, ) from simcore_service_webserver.projects.models import ProjectDict diff --git a/services/web/server/tests/integration/01/test_garbage_collection.py b/services/web/server/tests/integration/01/test_garbage_collection.py index 8d474ef14d6..43b89e073b8 100644 --- a/services/web/server/tests/integration/01/test_garbage_collection.py +++ b/services/web/server/tests/integration/01/test_garbage_collection.py @@ -41,7 +41,7 @@ from simcore_service_webserver.groups.api import add_user_in_group from simcore_service_webserver.login.plugin import setup_login from simcore_service_webserver.projects._crud_api_delete import get_scheduled_tasks -from simcore_service_webserver.projects._groups_respository import ( +from simcore_service_webserver.projects._groups_repository import ( update_or_insert_project_group, ) from simcore_service_webserver.projects.models import ProjectDict diff --git a/services/web/server/tests/unit/with_dbs/02/test_projects_comments_handlers.py b/services/web/server/tests/unit/with_dbs/02/test_projects_comments_handlers.py index ce96b379258..9a187a1d081 100644 --- a/services/web/server/tests/unit/with_dbs/02/test_projects_comments_handlers.py +++ b/services/web/server/tests/unit/with_dbs/02/test_projects_comments_handlers.py @@ -16,7 +16,7 @@ from servicelib.aiohttp import status from simcore_service_webserver._meta import api_version_prefix from simcore_service_webserver.db.models import UserRole -from simcore_service_webserver.projects._groups_respository import ( +from simcore_service_webserver.projects._groups_repository import ( update_or_insert_project_group, ) from simcore_service_webserver.projects.models import ProjectDict diff --git a/services/web/server/tests/unit/with_dbs/03/test_project_db.py b/services/web/server/tests/unit/with_dbs/03/test_project_db.py index d164f5414ed..4aa9791d226 100644 --- a/services/web/server/tests/unit/with_dbs/03/test_project_db.py +++ b/services/web/server/tests/unit/with_dbs/03/test_project_db.py @@ -29,7 +29,7 @@ from simcore_postgres_database.models.projects_to_products import projects_to_products from simcore_postgres_database.models.users import UserRole from simcore_postgres_database.utils_projects_nodes import ProjectNodesRepo -from simcore_service_webserver.projects._groups_respository import ( +from simcore_service_webserver.projects._groups_repository import ( update_or_insert_project_group, ) from simcore_service_webserver.projects._projects_repository_legacy import ( diff --git a/services/web/server/tests/unit/with_dbs/04/folders/test_folders.py b/services/web/server/tests/unit/with_dbs/04/folders/test_folders.py index dca9d86c38d..ffa59d4c5a4 100644 --- a/services/web/server/tests/unit/with_dbs/04/folders/test_folders.py +++ b/services/web/server/tests/unit/with_dbs/04/folders/test_folders.py @@ -23,7 +23,7 @@ from servicelib.aiohttp import status from servicelib.aiohttp.application_keys import APP_FIRE_AND_FORGET_TASKS_KEY from simcore_service_webserver.db.models import UserRole -from simcore_service_webserver.projects._groups_respository import ( +from simcore_service_webserver.projects._groups_repository import ( GroupID, update_or_insert_project_group, ) From 6b06e26ef91b10f1c0112098703fd6d0be45664a Mon Sep 17 00:00:00 2001 From: Pedro Crespo-Valero <32402063+pcrespov@users.noreply.github.com> Date: Fri, 21 Mar 2025 15:58:40 +0100 Subject: [PATCH 21/39] import --- .../simcore_service_webserver/diagnostics/_handlers.py | 6 +++--- .../folders/_workspaces_repository.py | 4 ++-- .../projects/_projects_service.py | 8 ++++---- .../projects/_projects_service_delete.py | 6 +++--- .../simcore_service_webserver/projects/_tags_service.py | 6 +++--- .../simcore_service_webserver/projects/_trash_service.py | 7 +++---- .../workspaces/_groups_service.py | 6 +++--- 7 files changed, 21 insertions(+), 22 deletions(-) diff --git a/services/web/server/src/simcore_service_webserver/diagnostics/_handlers.py b/services/web/server/src/simcore_service_webserver/diagnostics/_handlers.py index 22409ba6557..a25b1442d65 100644 --- a/services/web/server/src/simcore_service_webserver/diagnostics/_handlers.py +++ b/services/web/server/src/simcore_service_webserver/diagnostics/_handlers.py @@ -19,7 +19,7 @@ from ..login.decorators import login_required from ..resource_usage._client import is_resource_usage_tracking_service_responsive from ..security.decorators import permission_required -from ..storage import api as storage_api +from ..storage import api as storage_service from ..utils import TaskInfoDict, get_task_info, get_tracemalloc_info from ..utils_aiohttp import envelope_json_response @@ -118,7 +118,7 @@ async def _check_pg(): async def _check_storage(): check.services["storage"] = { - "healthy": await storage_api.is_healthy(request.app), + "healthy": await storage_service.is_healthy(request.app), "status_url": _get_url_for("get_service_status", service_name="storage"), } @@ -158,7 +158,7 @@ async def get_service_status(request: web.Request): if service_name == "storage": with suppress(ClientError): - status = await storage_api.get_app_status(request.app) + status = await storage_service.get_app_status(request.app) return envelope_json_response(status) raise web.HTTPNotFound diff --git a/services/web/server/src/simcore_service_webserver/folders/_workspaces_repository.py b/services/web/server/src/simcore_service_webserver/folders/_workspaces_repository.py index 29c435d4855..9535ec3fd7c 100644 --- a/services/web/server/src/simcore_service_webserver/folders/_workspaces_repository.py +++ b/services/web/server/src/simcore_service_webserver/folders/_workspaces_repository.py @@ -10,7 +10,7 @@ from ..db.plugin import get_asyncpg_engine from ..projects import _folders_repository as projects_folders_repository from ..projects import _groups_repository as projects_groups_repository -from ..projects import _projects_repository as projects_repository +from ..projects import _projects_repository as _projects_repository from ..projects._access_rights_service import check_user_project_permission from ..users.api import get_user from ..workspaces.api import check_user_workspace_access @@ -78,7 +78,7 @@ async def move_folder_into_workspace( async with transaction_context(get_asyncpg_engine(app)) as conn: # 4. Update workspace ID on the project resource for project_id in project_ids: - await projects_repository.patch_project( + await _projects_repository.patch_project( app=app, connection=conn, project_uuid=project_id, diff --git a/services/web/server/src/simcore_service_webserver/projects/_projects_service.py b/services/web/server/src/simcore_service_webserver/projects/_projects_service.py index 64f41e88491..93992e205da 100644 --- a/services/web/server/src/simcore_service_webserver/projects/_projects_service.py +++ b/services/web/server/src/simcore_service_webserver/projects/_projects_service.py @@ -112,7 +112,7 @@ send_message_to_standard_group, send_message_to_user, ) -from ..storage import api as storage_api +from ..storage import api as storage_service from ..users.api import FullNameDict, get_user, get_user_fullname, get_user_role from ..users.exceptions import UserNotFoundError from ..users.preferences_api import ( @@ -122,7 +122,7 @@ ) from ..wallets import api as wallets_service from ..wallets.errors import WalletNotEnoughCreditsError -from ..workspaces import _workspaces_repository as workspaces_db +from ..workspaces import _workspaces_repository as workspaces_workspaces_repository from . import ( _crud_api_delete, _nodes_service, @@ -226,7 +226,7 @@ async def get_project_for_user( if project["workspaceId"] is not None: workspace: UserWorkspaceWithAccessRights = ( - await workspaces_db.get_workspace_for_user( + await workspaces_workspaces_repository.get_workspace_for_user( app=app, user_id=user_id, workspace_id=project["workspaceId"], @@ -912,7 +912,7 @@ async def _remove_service_and_its_data_folders( ) # remove the node's data if any - await storage_api.delete_data_folders_of_project_node( + await storage_service.delete_data_folders_of_project_node( app, f"{project_uuid}", node_uuid, user_id ) diff --git a/services/web/server/src/simcore_service_webserver/projects/_projects_service_delete.py b/services/web/server/src/simcore_service_webserver/projects/_projects_service_delete.py index 3273d17665c..032a6fbb978 100644 --- a/services/web/server/src/simcore_service_webserver/projects/_projects_service_delete.py +++ b/services/web/server/src/simcore_service_webserver/projects/_projects_service_delete.py @@ -11,7 +11,7 @@ from servicelib.redis._errors import ProjectLockError from ..director_v2 import director_v2_service -from . import _projects_repository as projects_repository +from . import _projects_repository as _projects_repository from . import _projects_service from .exceptions import ProjectDeleteError, ProjectNotFoundError @@ -68,7 +68,7 @@ async def delete_project_as_admin( try: # 1. hide with _monitor_step(state, name="hide"): - project = await projects_repository.patch_project( + project = await _projects_repository.patch_project( app, project_uuid=project_uuid, new_partial_project_data={"hidden": True}, @@ -83,7 +83,7 @@ async def delete_project_as_admin( # 3. delete with _monitor_step(state, name="delete"): - await projects_repository.delete_project(app, project_uuid=project_uuid) + await _projects_repository.delete_project(app, project_uuid=project_uuid) except ProjectNotFoundError as err: _logger.debug( diff --git a/services/web/server/src/simcore_service_webserver/projects/_tags_service.py b/services/web/server/src/simcore_service_webserver/projects/_tags_service.py index ea9d3e0d783..d7f1af590a2 100644 --- a/services/web/server/src/simcore_service_webserver/projects/_tags_service.py +++ b/services/web/server/src/simcore_service_webserver/projects/_tags_service.py @@ -7,7 +7,7 @@ from models_library.users import UserID from models_library.workspaces import UserWorkspaceWithAccessRights -from ..workspaces import _workspaces_repository as workspaces_db +from ..workspaces import _workspaces_repository as workspaces_workspaces_repository from ._access_rights_service import check_user_project_permission from ._projects_repository_legacy import ProjectDBAPI from .models import ProjectDict @@ -35,7 +35,7 @@ async def add_tag( if project["workspaceId"] is not None: workspace: UserWorkspaceWithAccessRights = ( - await workspaces_db.get_workspace_for_user( + await workspaces_workspaces_repository.get_workspace_for_user( app=app, user_id=user_id, workspace_id=project["workspaceId"], @@ -69,7 +69,7 @@ async def remove_tag( if project["workspaceId"] is not None: workspace: UserWorkspaceWithAccessRights = ( - await workspaces_db.get_workspace_for_user( + await workspaces_workspaces_repository.get_workspace_for_user( app=app, user_id=user_id, workspace_id=project["workspaceId"], diff --git a/services/web/server/src/simcore_service_webserver/projects/_trash_service.py b/services/web/server/src/simcore_service_webserver/projects/_trash_service.py index 87b1b1f4e8e..eba311f8111 100644 --- a/services/web/server/src/simcore_service_webserver/projects/_trash_service.py +++ b/services/web/server/src/simcore_service_webserver/projects/_trash_service.py @@ -16,10 +16,9 @@ from ..director_v2 import director_v2_service from ..dynamic_scheduler import api as dynamic_scheduler_service from . import _crud_api_read -from . import _projects_repository as projects_repository +from . import _projects_repository as _projects_repository from . import _projects_service, _projects_service_delete from ._access_rights_service import check_user_project_permission -from ._projects_repository import _OLDEST_TRASHED_FIRST from .exceptions import ( ProjectNotFoundError, ProjectNotTrashedError, @@ -243,13 +242,13 @@ async def batch_delete_trashed_projects_as_admin( ( page_params.total_number_of_items, expired_trashed_projects, - ) = await projects_repository.list_trashed_projects( + ) = await _projects_repository.list_trashed_projects( app, # both implicit and explicitly trashed trashed_before=trashed_before, offset=page_params.offset, limit=page_params.limit, - order_by=_OLDEST_TRASHED_FIRST, + order_by=_projects_repository._OLDEST_TRASHED_FIRST, ) # BATCH delete for project in expired_trashed_projects: diff --git a/services/web/server/src/simcore_service_webserver/workspaces/_groups_service.py b/services/web/server/src/simcore_service_webserver/workspaces/_groups_service.py index d8293854bd3..37c84b3682a 100644 --- a/services/web/server/src/simcore_service_webserver/workspaces/_groups_service.py +++ b/services/web/server/src/simcore_service_webserver/workspaces/_groups_service.py @@ -10,7 +10,7 @@ from ..users import api as users_service from . import _groups_repository as workspaces_groups_db -from . import _workspaces_repository as workspaces_db +from . import _workspaces_repository as workspaces_workspaces_repository from ._groups_repository import WorkspaceGroupGetDB from ._workspaces_service import check_user_workspace_access from .errors import WorkspaceAccessForbiddenError @@ -125,7 +125,7 @@ async def update_workspace_group( product_name: ProductName, ) -> WorkspaceGroupGet: workspace: UserWorkspaceWithAccessRights = ( - await workspaces_db.get_workspace_for_user( + await workspaces_workspaces_repository.get_workspace_for_user( app=app, user_id=user_id, workspace_id=workspace_id, @@ -171,7 +171,7 @@ async def delete_workspace_group( ) -> None: user: dict = await users_service.get_user(app, user_id=user_id) workspace: UserWorkspaceWithAccessRights = ( - await workspaces_db.get_workspace_for_user( + await workspaces_workspaces_repository.get_workspace_for_user( app=app, user_id=user_id, workspace_id=workspace_id, From 9c0d0661b429e932ad90deebc27550b22edaf867 Mon Sep 17 00:00:00 2001 From: Pedro Crespo-Valero <32402063+pcrespov@users.noreply.github.com> Date: Fri, 21 Mar 2025 16:02:02 +0100 Subject: [PATCH 22/39] security service --- .../projects/{_projects_access.py => _security_service.py} | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) rename services/web/server/src/simcore_service_webserver/projects/{_projects_access.py => _security_service.py} (96%) diff --git a/services/web/server/src/simcore_service_webserver/projects/_projects_access.py b/services/web/server/src/simcore_service_webserver/projects/_security_service.py similarity index 96% rename from services/web/server/src/simcore_service_webserver/projects/_projects_access.py rename to services/web/server/src/simcore_service_webserver/projects/_security_service.py index 729a90612cf..2a3827d7a5a 100644 --- a/services/web/server/src/simcore_service_webserver/projects/_projects_access.py +++ b/services/web/server/src/simcore_service_webserver/projects/_security_service.py @@ -7,7 +7,7 @@ from ._projects_repository_legacy import ProjectDBAPI -async def can_update_node_inputs(context): +async def _can_update_node_inputs(context): """Check function associated to "project.workbench.node.inputs.update" permission label Returns True if user has permission to update inputs @@ -61,4 +61,4 @@ def setup_projects_access(app: web.Application): # TODO: add here also named permissions, i.e. all project.* operations hrba.roles[UserRole.GUEST].check[ "project.workbench.node.inputs.update" - ] = can_update_node_inputs + ] = _can_update_node_inputs From 4fd26e4403dffd3b1d6cdeeaa1394118836d118f Mon Sep 17 00:00:00 2001 From: Pedro Crespo-Valero <32402063+pcrespov@users.noreply.github.com> Date: Fri, 21 Mar 2025 16:02:16 +0100 Subject: [PATCH 23/39] security service --- .../src/simcore_service_webserver/projects/_security_service.py | 2 +- .../web/server/src/simcore_service_webserver/projects/plugin.py | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/services/web/server/src/simcore_service_webserver/projects/_security_service.py b/services/web/server/src/simcore_service_webserver/projects/_security_service.py index 2a3827d7a5a..9a0ff0b50a5 100644 --- a/services/web/server/src/simcore_service_webserver/projects/_security_service.py +++ b/services/web/server/src/simcore_service_webserver/projects/_security_service.py @@ -2,9 +2,9 @@ from aiohttp import web from simcore_postgres_database.models.users import UserRole -from ..projects.api import check_user_project_permission from ..security.api import get_access_model from ._projects_repository_legacy import ProjectDBAPI +from .api import check_user_project_permission async def _can_update_node_inputs(context): diff --git a/services/web/server/src/simcore_service_webserver/projects/plugin.py b/services/web/server/src/simcore_service_webserver/projects/plugin.py index 4acb0e8e1e8..f968908c797 100644 --- a/services/web/server/src/simcore_service_webserver/projects/plugin.py +++ b/services/web/server/src/simcore_service_webserver/projects/plugin.py @@ -26,8 +26,8 @@ workspaces_rest, ) from ._controller.projects_slot import setup_project_observer_events -from ._projects_access import setup_projects_access from ._projects_repository_legacy import setup_projects_db +from ._security_service import setup_projects_access logger = logging.getLogger(__name__) From 3a2937ea8d822d29499779167aa6082345222420 Mon Sep 17 00:00:00 2001 From: Pedro Crespo-Valero <32402063+pcrespov@users.noreply.github.com> Date: Fri, 21 Mar 2025 16:26:49 +0100 Subject: [PATCH 24/39] mocks --- .../tests/unit/isolated/test_garbage_collector_core.py | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/services/web/server/tests/unit/isolated/test_garbage_collector_core.py b/services/web/server/tests/unit/isolated/test_garbage_collector_core.py index 5205f7fa4da..b944b0d93c1 100644 --- a/services/web/server/tests/unit/isolated/test_garbage_collector_core.py +++ b/services/web/server/tests/unit/isolated/test_garbage_collector_core.py @@ -24,9 +24,9 @@ from simcore_service_webserver.resource_manager.registry import UserSessionDict from simcore_service_webserver.users.exceptions import UserNotFoundError -MODULE_GC_CORE_ORPHANS: Final[ - str -] = "simcore_service_webserver.garbage_collector._core_orphans" +MODULE_GC_CORE_ORPHANS: Final[str] = ( + "simcore_service_webserver.garbage_collector._core_orphans" +) @pytest.fixture @@ -91,7 +91,7 @@ async def mock_is_node_id_present_in_any_project_workbench( @pytest.fixture async def mock_list_dynamic_services(mocker: MockerFixture) -> mock.AsyncMock: return mocker.patch( - f"{MODULE_GC_CORE_ORPHANS}.dynamic_scheduler_api.list_dynamic_services", + f"{MODULE_GC_CORE_ORPHANS}.dynamic_scheduler_service.list_dynamic_services", autospec=True, return_value=[], ) @@ -100,7 +100,7 @@ async def mock_list_dynamic_services(mocker: MockerFixture) -> mock.AsyncMock: @pytest.fixture async def mock_stop_dynamic_service(mocker: MockerFixture) -> mock.AsyncMock: return mocker.patch( - f"{MODULE_GC_CORE_ORPHANS}.dynamic_scheduler_api.stop_dynamic_service", + f"{MODULE_GC_CORE_ORPHANS}.dynamic_scheduler_service.stop_dynamic_service", autospec=True, ) From b59f899d06ce2b53d45b6485a7e362b5a325ad24 Mon Sep 17 00:00:00 2001 From: Pedro Crespo-Valero <32402063+pcrespov@users.noreply.github.com> Date: Fri, 21 Mar 2025 17:28:43 +0100 Subject: [PATCH 25/39] fixes mocks --- .../web/server/tests/unit/with_dbs/02/conftest.py | 6 +++--- .../02/test_projects_crud_handlers__patch.py | 4 ++-- .../with_dbs/02/test_projects_groups_handlers.py | 4 ++-- .../02/test_projects_nodes_handlers__patch.py | 12 ++++++------ .../02/test_projects_nodes_pricing_unit_handlers.py | 2 +- .../with_dbs/02/test_projects_states_handlers.py | 2 +- .../with_dbs/02/test_projects_wallet_handlers.py | 6 +++--- .../tests/unit/with_dbs/04/folders/test_folders.py | 2 +- .../04/garbage_collector/test_resource_manager.py | 2 +- .../test_studies_dispatcher_handlers.py | 2 +- .../test_studies_dispatcher_studies_access.py | 2 +- .../test_workspaces__folders_and_projects_crud.py | 4 ++-- .../test_workspaces__list_projects_full_search.py | 2 +- ..._workspaces__moving_folders_between_workspaces.py | 2 +- ...workspaces__moving_projects_between_workspaces.py | 2 +- services/web/server/tests/unit/with_dbs/conftest.py | 2 +- 16 files changed, 28 insertions(+), 28 deletions(-) diff --git a/services/web/server/tests/unit/with_dbs/02/conftest.py b/services/web/server/tests/unit/with_dbs/02/conftest.py index 22d898f2a10..784af775086 100644 --- a/services/web/server/tests/unit/with_dbs/02/conftest.py +++ b/services/web/server/tests/unit/with_dbs/02/conftest.py @@ -92,12 +92,12 @@ def mock_catalog_api( ) -> dict[str, mock.Mock]: return { "get_service_resources": mocker.patch( - "simcore_service_webserver.projects.projects_service.catalog_service.get_service_resources", + "simcore_service_webserver.projects._projects_service.catalog_service.get_service_resources", return_value=mock_service_resources, autospec=True, ), "get_service": mocker.patch( - "simcore_service_webserver.projects.projects_service.catalog_service.get_service", + "simcore_service_webserver.projects._projects_service.catalog_service.get_service", return_value=mock_service, autospec=True, ), @@ -374,7 +374,7 @@ def mock_get_total_project_dynamic_nodes_creation_interval( ) -> None: _VERY_LONG_LOCK_TIMEOUT_S: Final[float] = 300 mocker.patch( - "simcore_service_webserver.projects.projects_service._nodes_api" + "simcore_service_webserver.projects._projects_service._nodes_api" ".get_total_project_dynamic_nodes_creation_interval", return_value=_VERY_LONG_LOCK_TIMEOUT_S, ) diff --git a/services/web/server/tests/unit/with_dbs/02/test_projects_crud_handlers__patch.py b/services/web/server/tests/unit/with_dbs/02/test_projects_crud_handlers__patch.py index 08100ff95f5..35481018925 100644 --- a/services/web/server/tests/unit/with_dbs/02/test_projects_crud_handlers__patch.py +++ b/services/web/server/tests/unit/with_dbs/02/test_projects_crud_handlers__patch.py @@ -25,7 +25,7 @@ @pytest.fixture def mock_catalog_api_get_services_for_user_in_product(mocker: MockerFixture): mocker.patch( - "simcore_service_webserver.projects._crud_handlers.catalog_service.get_services_for_user_in_product", + "simcore_service_webserver.projects._controllers.projects_rest.catalog_service.get_services_for_user_in_product", spec=True, return_value=[], ) @@ -34,7 +34,7 @@ def mock_catalog_api_get_services_for_user_in_product(mocker: MockerFixture): @pytest.fixture def mock_project_uses_available_services(mocker: MockerFixture): mocker.patch( - "simcore_service_webserver.projects._crud_handlers.project_uses_available_services", + "simcore_service_webserver.projects._controllers.projects_rest.project_uses_available_services", spec=True, return_value=True, ) diff --git a/services/web/server/tests/unit/with_dbs/02/test_projects_groups_handlers.py b/services/web/server/tests/unit/with_dbs/02/test_projects_groups_handlers.py index 214d284d8f0..65904e1715d 100644 --- a/services/web/server/tests/unit/with_dbs/02/test_projects_groups_handlers.py +++ b/services/web/server/tests/unit/with_dbs/02/test_projects_groups_handlers.py @@ -20,7 +20,7 @@ @pytest.fixture def mock_catalog_api_get_services_for_user_in_product(mocker: MockerFixture): mocker.patch( - "simcore_service_webserver.projects._crud_handlers.catalog_service.get_services_for_user_in_product", + "simcore_service_webserver.projects._controllers.projects_rest.catalog_service.get_services_for_user_in_product", spec=True, return_value=[], ) @@ -29,7 +29,7 @@ def mock_catalog_api_get_services_for_user_in_product(mocker: MockerFixture): @pytest.fixture def mock_project_uses_available_services(mocker: MockerFixture): mocker.patch( - "simcore_service_webserver.projects._crud_handlers.project_uses_available_services", + "simcore_service_webserver.projects._controllers.projects_rest.project_uses_available_services", spec=True, return_value=True, ) diff --git a/services/web/server/tests/unit/with_dbs/02/test_projects_nodes_handlers__patch.py b/services/web/server/tests/unit/with_dbs/02/test_projects_nodes_handlers__patch.py index 1819923c9a4..184a53426bf 100644 --- a/services/web/server/tests/unit/with_dbs/02/test_projects_nodes_handlers__patch.py +++ b/services/web/server/tests/unit/with_dbs/02/test_projects_nodes_handlers__patch.py @@ -29,7 +29,7 @@ @pytest.fixture def mock_catalog_api_get_services_for_user_in_product(mocker: MockerFixture): mocker.patch( - "simcore_service_webserver.projects._crud_handlers.catalog_service.get_services_for_user_in_product", + "simcore_service_webserver.projects._controllers.projects_rest.catalog_service.get_services_for_user_in_product", spec=True, return_value=[], ) @@ -38,7 +38,7 @@ def mock_catalog_api_get_services_for_user_in_product(mocker: MockerFixture): @pytest.fixture def mock_project_uses_available_services(mocker: MockerFixture): mocker.patch( - "simcore_service_webserver.projects._crud_handlers.project_uses_available_services", + "simcore_service_webserver.projects._controllers.projects_rest.project_uses_available_services", spec=True, return_value=True, ) @@ -47,7 +47,7 @@ def mock_project_uses_available_services(mocker: MockerFixture): @pytest.fixture def mock_catalog_rpc_check_for_service(mocker: MockerFixture): mocker.patch( - "simcore_service_webserver.projects.projects_service.catalog_rpc.check_for_service", + "simcore_service_webserver.projects._projects_service.catalog_rpc.check_for_service", spec=True, return_value=True, ) @@ -56,7 +56,7 @@ def mock_catalog_rpc_check_for_service(mocker: MockerFixture): @pytest.fixture def mocked_notify_project_node_update(mocker: MockerFixture): return mocker.patch( - "simcore_service_webserver.projects.projects_service.notify_project_node_update", + "simcore_service_webserver.projects._projects_service.notify_project_node_update", ) @@ -362,14 +362,14 @@ async def test_patch_project_node_service_key_with_error( _patch_version = {"version": "2.0.9"} with mocker.patch( - "simcore_service_webserver.projects.projects_service.catalog_rpc.check_for_service", + "simcore_service_webserver.projects._projects_service.catalog_rpc.check_for_service", side_effect=CatalogForbiddenError(name="test"), ): resp = await client.patch(f"{url}", json=_patch_version) assert resp.status == status.HTTP_403_FORBIDDEN with mocker.patch( - "simcore_service_webserver.projects.projects_service.catalog_rpc.check_for_service", + "simcore_service_webserver.projects._projects_service.catalog_rpc.check_for_service", side_effect=CatalogItemNotFoundError(name="test"), ): resp = await client.patch(f"{url}", json=_patch_version) diff --git a/services/web/server/tests/unit/with_dbs/02/test_projects_nodes_pricing_unit_handlers.py b/services/web/server/tests/unit/with_dbs/02/test_projects_nodes_pricing_unit_handlers.py index 0abad556de1..3e59aebe177 100644 --- a/services/web/server/tests/unit/with_dbs/02/test_projects_nodes_pricing_unit_handlers.py +++ b/services/web/server/tests/unit/with_dbs/02/test_projects_nodes_pricing_unit_handlers.py @@ -136,7 +136,7 @@ def _fake_instance_type_details( ] return mocker.patch( - "simcore_service_webserver.projects.projects_service.get_instance_type_details", + "simcore_service_webserver.projects._projects_service.get_instance_type_details", side_effect=_fake_instance_type_details, ) diff --git a/services/web/server/tests/unit/with_dbs/02/test_projects_states_handlers.py b/services/web/server/tests/unit/with_dbs/02/test_projects_states_handlers.py index 3963a10bf7b..0e87b12171e 100644 --- a/services/web/server/tests/unit/with_dbs/02/test_projects_states_handlers.py +++ b/services/web/server/tests/unit/with_dbs/02/test_projects_states_handlers.py @@ -1073,7 +1073,7 @@ async def test_project_node_lifetime( # noqa: PLR0915 create_dynamic_service_mock: Callable[..., Awaitable[DynamicServiceGet]], ): mock_storage_api_delete_data_folders_of_project_node = mocker.patch( - "simcore_service_webserver.projects._crud_handlers.projects_service.storage_api.delete_data_folders_of_project_node", + "simcore_service_webserver.projects._controllers.projects_rest.projects_service.storage_api.delete_data_folders_of_project_node", return_value="", ) assert client.app diff --git a/services/web/server/tests/unit/with_dbs/02/test_projects_wallet_handlers.py b/services/web/server/tests/unit/with_dbs/02/test_projects_wallet_handlers.py index 07a447de907..436581d9de3 100644 --- a/services/web/server/tests/unit/with_dbs/02/test_projects_wallet_handlers.py +++ b/services/web/server/tests/unit/with_dbs/02/test_projects_wallet_handlers.py @@ -111,7 +111,7 @@ def mock_get_project_wallet_total_credits( mocker: MockerFixture, setup_wallets_db: list[WalletGet] ): mocker.patch( - "simcore_service_webserver.projects._wallets_api.credit_transactions.get_project_wallet_total_credits", + "simcore_service_webserver.projects._wallets_service.credit_transactions.get_project_wallet_total_credits", spec=True, return_value=WalletTotalCredits( wallet_id=setup_wallets_db[0].wallet_id, available_osparc_credits=Decimal(0) @@ -122,7 +122,7 @@ def mock_get_project_wallet_total_credits( @pytest.fixture def mock_get_service_run_page(mocker: MockerFixture): mocker.patch( - "simcore_service_webserver.projects._wallets_api.service_runs.get_service_run_page", + "simcore_service_webserver.projects._wallets_service.service_runs.get_service_run_page", spec=True, return_value=ServiceRunPage(items=[], total=0), ) @@ -181,7 +181,7 @@ async def test_project_wallets_full_workflow( @pytest.fixture def mock_pay_project_debt(mocker: MockerFixture): return mocker.patch( - "simcore_service_webserver.projects._wallets_api.credit_transactions.pay_project_debt", + "simcore_service_webserver.projects._wallets_service.credit_transactions.pay_project_debt", spec=True, ) diff --git a/services/web/server/tests/unit/with_dbs/04/folders/test_folders.py b/services/web/server/tests/unit/with_dbs/04/folders/test_folders.py index ffa59d4c5a4..060bb022b69 100644 --- a/services/web/server/tests/unit/with_dbs/04/folders/test_folders.py +++ b/services/web/server/tests/unit/with_dbs/04/folders/test_folders.py @@ -387,7 +387,7 @@ def mock_storage_delete_data_folders(mocker: MockerFixture) -> mock.Mock: autospec=True, ) mocker.patch( - "simcore_service_webserver.projects.projects_service.remove_project_dynamic_services", + "simcore_service_webserver.projects._projects_service.remove_project_dynamic_services", autospec=True, ) mocker.patch( diff --git a/services/web/server/tests/unit/with_dbs/04/garbage_collector/test_resource_manager.py b/services/web/server/tests/unit/with_dbs/04/garbage_collector/test_resource_manager.py index 19c434f584e..f5b37b61960 100644 --- a/services/web/server/tests/unit/with_dbs/04/garbage_collector/test_resource_manager.py +++ b/services/web/server/tests/unit/with_dbs/04/garbage_collector/test_resource_manager.py @@ -651,7 +651,7 @@ async def test_interactive_services_remain_after_websocket_reconnection_from_2_t async def mocked_notification_system(mocker): mocks = {} mocked_notification_system = mocker.patch( - "simcore_service_webserver.projects.projects_service.retrieve_and_notify_project_locked_state", + "simcore_service_webserver.projects._projects_service.retrieve_and_notify_project_locked_state", return_value=Future(), ) mocked_notification_system.return_value.set_result("") diff --git a/services/web/server/tests/unit/with_dbs/04/studies_dispatcher/test_studies_dispatcher_handlers.py b/services/web/server/tests/unit/with_dbs/04/studies_dispatcher/test_studies_dispatcher_handlers.py index aacee1c0887..2d48886050a 100644 --- a/services/web/server/tests/unit/with_dbs/04/studies_dispatcher/test_studies_dispatcher_handlers.py +++ b/services/web/server/tests/unit/with_dbs/04/studies_dispatcher/test_studies_dispatcher_handlers.py @@ -299,7 +299,7 @@ def mocks_on_projects_api(mocker) -> None: All projects in this module are UNLOCKED """ mocker.patch( - "simcore_service_webserver.projects.projects_service._get_project_lock_state", + "simcore_service_webserver.projects._projects_service._get_project_lock_state", return_value=ProjectLocked(value=False, status=ProjectStatus.CLOSED), ) diff --git a/services/web/server/tests/unit/with_dbs/04/studies_dispatcher/test_studies_dispatcher_studies_access.py b/services/web/server/tests/unit/with_dbs/04/studies_dispatcher/test_studies_dispatcher_studies_access.py index ff781e2b3a1..16dfde75956 100644 --- a/services/web/server/tests/unit/with_dbs/04/studies_dispatcher/test_studies_dispatcher_studies_access.py +++ b/services/web/server/tests/unit/with_dbs/04/studies_dispatcher/test_studies_dispatcher_studies_access.py @@ -136,7 +136,7 @@ def mocks_on_projects_api(mocker: MockerFixture) -> None: All projects in this module are UNLOCKED """ mocker.patch( - "simcore_service_webserver.projects.projects_service._get_project_lock_state", + "simcore_service_webserver.projects._projects_service._get_project_lock_state", return_value=ProjectLocked(value=False, status=ProjectStatus.CLOSED), ) diff --git a/services/web/server/tests/unit/with_dbs/04/workspaces/test_workspaces__folders_and_projects_crud.py b/services/web/server/tests/unit/with_dbs/04/workspaces/test_workspaces__folders_and_projects_crud.py index cb5f211f533..935ff7aaf3e 100644 --- a/services/web/server/tests/unit/with_dbs/04/workspaces/test_workspaces__folders_and_projects_crud.py +++ b/services/web/server/tests/unit/with_dbs/04/workspaces/test_workspaces__folders_and_projects_crud.py @@ -32,7 +32,7 @@ def mock_catalog_api_get_services_for_user_in_product(mocker: MockerFixture): return_value=[], ) mocker.patch( - "simcore_service_webserver.projects._crud_handlers.project_uses_available_services", + "simcore_service_webserver.projects._controllers.projects_rest.project_uses_available_services", spec=True, return_value=True, ) @@ -254,7 +254,7 @@ def mock_storage_delete_data_folders(mocker: MockerFixture) -> mock.Mock: autospec=True, ) mocker.patch( - "simcore_service_webserver.projects.projects_service.remove_project_dynamic_services", + "simcore_service_webserver.projects._projects_service.remove_project_dynamic_services", autospec=True, ) mocker.patch( diff --git a/services/web/server/tests/unit/with_dbs/04/workspaces/test_workspaces__list_projects_full_search.py b/services/web/server/tests/unit/with_dbs/04/workspaces/test_workspaces__list_projects_full_search.py index 279bb591665..d59d85d036a 100644 --- a/services/web/server/tests/unit/with_dbs/04/workspaces/test_workspaces__list_projects_full_search.py +++ b/services/web/server/tests/unit/with_dbs/04/workspaces/test_workspaces__list_projects_full_search.py @@ -28,7 +28,7 @@ def mock_catalog_api_get_services_for_user_in_product(mocker: MockerFixture): return_value=[], ) mocker.patch( - "simcore_service_webserver.projects._crud_handlers.project_uses_available_services", + "simcore_service_webserver.projects._controllers.projects_rest.project_uses_available_services", spec=True, return_value=True, ) diff --git a/services/web/server/tests/unit/with_dbs/04/workspaces/test_workspaces__moving_folders_between_workspaces.py b/services/web/server/tests/unit/with_dbs/04/workspaces/test_workspaces__moving_folders_between_workspaces.py index 2f1e73ceb84..a5eedae2136 100644 --- a/services/web/server/tests/unit/with_dbs/04/workspaces/test_workspaces__moving_folders_between_workspaces.py +++ b/services/web/server/tests/unit/with_dbs/04/workspaces/test_workspaces__moving_folders_between_workspaces.py @@ -33,7 +33,7 @@ def mock_catalog_api_get_services_for_user_in_product(mocker: MockerFixture): return_value=[], ) mocker.patch( - "simcore_service_webserver.projects._crud_handlers.project_uses_available_services", + "simcore_service_webserver.projects._controllers.projects_rest.project_uses_available_services", spec=True, return_value=True, ) diff --git a/services/web/server/tests/unit/with_dbs/04/workspaces/test_workspaces__moving_projects_between_workspaces.py b/services/web/server/tests/unit/with_dbs/04/workspaces/test_workspaces__moving_projects_between_workspaces.py index 30cf718a37f..eb5fee54fc4 100644 --- a/services/web/server/tests/unit/with_dbs/04/workspaces/test_workspaces__moving_projects_between_workspaces.py +++ b/services/web/server/tests/unit/with_dbs/04/workspaces/test_workspaces__moving_projects_between_workspaces.py @@ -33,7 +33,7 @@ def mock_catalog_api_get_services_for_user_in_product(mocker: MockerFixture): return_value=[], ) mocker.patch( - "simcore_service_webserver.projects._crud_handlers.project_uses_available_services", + "simcore_service_webserver.projects._controllers.projects_rest.project_uses_available_services", spec=True, return_value=True, ) diff --git a/services/web/server/tests/unit/with_dbs/conftest.py b/services/web/server/tests/unit/with_dbs/conftest.py index 25ca1f218e0..c7e84f1e7bb 100644 --- a/services/web/server/tests/unit/with_dbs/conftest.py +++ b/services/web/server/tests/unit/with_dbs/conftest.py @@ -375,7 +375,7 @@ async def _mock_result(): ) mock2 = mocker.patch( - "simcore_service_webserver.projects.projects_service.storage_api.delete_data_folders_of_project_node", + "simcore_service_webserver.projects._projects_service.storage_service.delete_data_folders_of_project_node", autospec=True, return_value=None, ) From 7d7f8852f38f5e7cb7f332df39a1b2fc69f3173b Mon Sep 17 00:00:00 2001 From: Pedro Crespo-Valero <32402063+pcrespov@users.noreply.github.com> Date: Fri, 21 Mar 2025 17:37:08 +0100 Subject: [PATCH 26/39] fixes mocks --- .../web/server/tests/unit/with_dbs/02/conftest.py | 2 +- ...est_projects_nodes_handlers__services_access.py | 14 +++++++------- .../with_dbs/02/test_projects_states_handlers.py | 4 ++-- .../tests/unit/with_dbs/03/trash/test_trash.py | 4 ++-- .../tests/unit/with_dbs/04/folders/test_folders.py | 2 +- .../test_workspaces__folders_and_projects_crud.py | 2 +- 6 files changed, 14 insertions(+), 14 deletions(-) diff --git a/services/web/server/tests/unit/with_dbs/02/conftest.py b/services/web/server/tests/unit/with_dbs/02/conftest.py index 784af775086..cf8cbb179de 100644 --- a/services/web/server/tests/unit/with_dbs/02/conftest.py +++ b/services/web/server/tests/unit/with_dbs/02/conftest.py @@ -374,7 +374,7 @@ def mock_get_total_project_dynamic_nodes_creation_interval( ) -> None: _VERY_LONG_LOCK_TIMEOUT_S: Final[float] = 300 mocker.patch( - "simcore_service_webserver.projects._projects_service._nodes_api" + "simcore_service_webserver.projects._projects_service._nodes_service" ".get_total_project_dynamic_nodes_creation_interval", return_value=_VERY_LONG_LOCK_TIMEOUT_S, ) diff --git a/services/web/server/tests/unit/with_dbs/02/test_projects_nodes_handlers__services_access.py b/services/web/server/tests/unit/with_dbs/02/test_projects_nodes_handlers__services_access.py index f70587ebe56..238cba62055 100644 --- a/services/web/server/tests/unit/with_dbs/02/test_projects_nodes_handlers__services_access.py +++ b/services/web/server/tests/unit/with_dbs/02/test_projects_nodes_handlers__services_access.py @@ -59,7 +59,7 @@ def fake_project( @pytest.fixture def mock_catalog_api_get_service_access_rights_response(mocker: MockerFixture): mocker.patch( - "simcore_service_webserver.projects._nodes_handlers.catalog_service.get_service_access_rights", + "simcore_service_webserver.projects._controller.nodes_rest.catalog_service.get_service_access_rights", spec=True, side_effect=[ ServiceAccessRightsGet( @@ -130,7 +130,7 @@ async def test_accessible_thanks_to_everyone_group_id( logged_user: UserInfoDict, ): mocker.patch( - "simcore_service_webserver.projects._nodes_handlers.catalog_service.get_service_access_rights", + "simcore_service_webserver.projects._controller.nodes_rest.catalog_service.get_service_access_rights", spec=True, side_effect=[ ServiceAccessRightsGet( @@ -185,7 +185,7 @@ async def test_accessible_thanks_to_concrete_group_id( for_gid = logged_user["primary_gid"] mocker.patch( - "simcore_service_webserver.projects._nodes_handlers.catalog_service.get_service_access_rights", + "simcore_service_webserver.projects._controller.nodes_rest.catalog_service.get_service_access_rights", spec=True, side_effect=[ ServiceAccessRightsGet( @@ -238,7 +238,7 @@ async def test_accessible_through_product_group( for_gid = logged_user["primary_gid"] mocker.patch( - "simcore_service_webserver.projects._nodes_handlers.catalog_service.get_service_access_rights", + "simcore_service_webserver.projects._controller.nodes_rest.catalog_service.get_service_access_rights", spec=True, side_effect=[ ServiceAccessRightsGet( @@ -297,7 +297,7 @@ async def test_accessible_for_one_service( for_gid = logged_user["primary_gid"] mocker.patch( - "simcore_service_webserver.projects._nodes_handlers.catalog_service.get_service_access_rights", + "simcore_service_webserver.projects._controller.nodes_rest.catalog_service.get_service_access_rights", spec=True, side_effect=[ ServiceAccessRightsGet( @@ -355,7 +355,7 @@ async def test_not_accessible_for_more_services( logged_user: UserInfoDict, ): mocker.patch( - "simcore_service_webserver.projects._nodes_handlers.catalog_service.get_service_access_rights", + "simcore_service_webserver.projects._controller.nodes_rest.catalog_service.get_service_access_rights", spec=True, side_effect=[ ServiceAccessRightsGet( @@ -421,7 +421,7 @@ async def test_not_accessible_for_service_because_of_execute_access_false( for_gid = logged_user["primary_gid"] mocker.patch( - "simcore_service_webserver.projects._nodes_handlers.catalog_service.get_service_access_rights", + "simcore_service_webserver.projects._controller.nodes_rest.catalog_service.get_service_access_rights", spec=True, side_effect=[ ServiceAccessRightsGet( diff --git a/services/web/server/tests/unit/with_dbs/02/test_projects_states_handlers.py b/services/web/server/tests/unit/with_dbs/02/test_projects_states_handlers.py index 0e87b12171e..3d4b26894b8 100644 --- a/services/web/server/tests/unit/with_dbs/02/test_projects_states_handlers.py +++ b/services/web/server/tests/unit/with_dbs/02/test_projects_states_handlers.py @@ -453,7 +453,7 @@ async def test_open_project__in_debt( added_wallet, _ = await assert_status(resp, status.HTTP_201_CREATED) mock_get_project_wallet_total_credits = mocker.patch( - "simcore_service_webserver.projects._wallets_api.credit_transactions.get_project_wallet_total_credits", + "simcore_service_webserver.projects._wallets_service.credit_transactions.get_project_wallet_total_credits", spec=True, return_value=WalletTotalCredits( wallet_id=added_wallet["walletId"], @@ -1073,7 +1073,7 @@ async def test_project_node_lifetime( # noqa: PLR0915 create_dynamic_service_mock: Callable[..., Awaitable[DynamicServiceGet]], ): mock_storage_api_delete_data_folders_of_project_node = mocker.patch( - "simcore_service_webserver.projects._controllers.projects_rest.projects_service.storage_api.delete_data_folders_of_project_node", + "simcore_service_webserver.projects._projects_service.storage_service.delete_data_folders_of_project_node", return_value="", ) assert client.app diff --git a/services/web/server/tests/unit/with_dbs/03/trash/test_trash.py b/services/web/server/tests/unit/with_dbs/03/trash/test_trash.py index 01ca261f80e..a662c8c574b 100644 --- a/services/web/server/tests/unit/with_dbs/03/trash/test_trash.py +++ b/services/web/server/tests/unit/with_dbs/03/trash/test_trash.py @@ -61,12 +61,12 @@ async def test_trash_projects( # noqa: PLR0915 autospec=True, ) mocker.patch( - "simcore_service_webserver.projects._trash_service.director_v2_api.is_pipeline_running", + "simcore_service_webserver.projects._trash_service.director_v2_service.is_pipeline_running", return_value=is_project_running, autospec=True, ) mocker.patch( - "simcore_service_webserver.projects._trash_service.dynamic_scheduler_api.list_dynamic_services", + "simcore_service_webserver.projects._trash_service.dynamic_scheduler_service.list_dynamic_services", return_value=[mocker.MagicMock()] if is_project_running else [], autospec=True, ) diff --git a/services/web/server/tests/unit/with_dbs/04/folders/test_folders.py b/services/web/server/tests/unit/with_dbs/04/folders/test_folders.py index 060bb022b69..1ba0859bab3 100644 --- a/services/web/server/tests/unit/with_dbs/04/folders/test_folders.py +++ b/services/web/server/tests/unit/with_dbs/04/folders/test_folders.py @@ -391,7 +391,7 @@ def mock_storage_delete_data_folders(mocker: MockerFixture) -> mock.Mock: autospec=True, ) mocker.patch( - "simcore_service_webserver.projects._crud_api_delete.api.delete_pipeline", + "simcore_service_webserver.projects._crud_api_delete.director_v2_service.delete_pipeline", autospec=True, ) return mocker.patch( diff --git a/services/web/server/tests/unit/with_dbs/04/workspaces/test_workspaces__folders_and_projects_crud.py b/services/web/server/tests/unit/with_dbs/04/workspaces/test_workspaces__folders_and_projects_crud.py index 935ff7aaf3e..fd2a1a7595e 100644 --- a/services/web/server/tests/unit/with_dbs/04/workspaces/test_workspaces__folders_and_projects_crud.py +++ b/services/web/server/tests/unit/with_dbs/04/workspaces/test_workspaces__folders_and_projects_crud.py @@ -258,7 +258,7 @@ def mock_storage_delete_data_folders(mocker: MockerFixture) -> mock.Mock: autospec=True, ) mocker.patch( - "simcore_service_webserver.projects._crud_api_delete.api.delete_pipeline", + "simcore_service_webserver.projects._crud_api_delete.director_v2_service.delete_pipeline", autospec=True, ) return mocker.patch( From 37aca04c161c1d7c89650b8e4f04c5b7037153cb Mon Sep 17 00:00:00 2001 From: Pedro Crespo-Valero <32402063+pcrespov@users.noreply.github.com> Date: Fri, 21 Mar 2025 17:52:21 +0100 Subject: [PATCH 27/39] fixes mocks --- .../04/studies_dispatcher/test_studies_dispatcher_handlers.py | 4 ++-- .../04/studies_dispatcher/test_studies_dispatcher_projects.py | 2 +- services/web/server/tests/unit/with_dbs/conftest.py | 2 +- 3 files changed, 4 insertions(+), 4 deletions(-) diff --git a/services/web/server/tests/unit/with_dbs/04/studies_dispatcher/test_studies_dispatcher_handlers.py b/services/web/server/tests/unit/with_dbs/04/studies_dispatcher/test_studies_dispatcher_handlers.py index 2d48886050a..025f5b8ff41 100644 --- a/services/web/server/tests/unit/with_dbs/04/studies_dispatcher/test_studies_dispatcher_handlers.py +++ b/services/web/server/tests/unit/with_dbs/04/studies_dispatcher/test_studies_dispatcher_handlers.py @@ -396,7 +396,7 @@ async def test_dispatch_study_anonymously( ): assert client.app mock_client_director_v2_func = mocker.patch( - "simcore_service_webserver.director_v2.api.create_or_update_pipeline", + "simcore_service_webserver.director_v2.director_v2_service.create_or_update_pipeline", return_value=None, ) mock_dynamic_scheduler_update_project_networks = mocker.patch( @@ -462,7 +462,7 @@ async def test_dispatch_logged_in_user( ): assert client.app mock_client_director_v2_pipline_update = mocker.patch( - "simcore_service_webserver.director_v2.api.create_or_update_pipeline", + "simcore_service_webserver.director_v2.director_v2_service.create_or_update_pipeline", return_value=None, ) mock_dynamic_scheduler_update_project_networks = mocker.patch( diff --git a/services/web/server/tests/unit/with_dbs/04/studies_dispatcher/test_studies_dispatcher_projects.py b/services/web/server/tests/unit/with_dbs/04/studies_dispatcher/test_studies_dispatcher_projects.py index 7518fbd0b15..2ae68f22182 100644 --- a/services/web/server/tests/unit/with_dbs/04/studies_dispatcher/test_studies_dispatcher_projects.py +++ b/services/web/server/tests/unit/with_dbs/04/studies_dispatcher/test_studies_dispatcher_projects.py @@ -94,7 +94,7 @@ async def test_add_new_project_from_model_instance( assert client.app mock_directorv2_api = mocker.patch( - "simcore_service_webserver.director_v2.api.create_or_update_pipeline", + "simcore_service_webserver.director_v2.director_v2_service.create_or_update_pipeline", return_value=None, ) diff --git a/services/web/server/tests/unit/with_dbs/conftest.py b/services/web/server/tests/unit/with_dbs/conftest.py index c7e84f1e7bb..38e96c4367d 100644 --- a/services/web/server/tests/unit/with_dbs/conftest.py +++ b/services/web/server/tests/unit/with_dbs/conftest.py @@ -417,7 +417,7 @@ async def mocked_dynamic_services_interface( ) mock["director_v2.api.create_or_update_pipeline"] = mocker.patch( - "simcore_service_webserver.director_v2.api.create_or_update_pipeline", + "simcore_service_webserver.director_v2.director_v2_service.create_or_update_pipeline", autospec=True, return_value=None, ) From 3ed28dea61d759a16dfe7d57c8709ec3d6f923fb Mon Sep 17 00:00:00 2001 From: Pedro Crespo-Valero <32402063+pcrespov@users.noreply.github.com> Date: Fri, 21 Mar 2025 17:55:30 +0100 Subject: [PATCH 28/39] fixes mocks --- .../unit/with_dbs/02/test_projects_crud_handlers__patch.py | 4 ++-- .../tests/unit/with_dbs/02/test_projects_groups_handlers.py | 4 ++-- .../unit/with_dbs/02/test_projects_nodes_handlers__patch.py | 4 ++-- .../workspaces/test_workspaces__folders_and_projects_crud.py | 2 +- .../workspaces/test_workspaces__list_projects_full_search.py | 2 +- .../test_workspaces__moving_folders_between_workspaces.py | 2 +- .../test_workspaces__moving_projects_between_workspaces.py | 2 +- 7 files changed, 10 insertions(+), 10 deletions(-) diff --git a/services/web/server/tests/unit/with_dbs/02/test_projects_crud_handlers__patch.py b/services/web/server/tests/unit/with_dbs/02/test_projects_crud_handlers__patch.py index 35481018925..dbb33ea5ecd 100644 --- a/services/web/server/tests/unit/with_dbs/02/test_projects_crud_handlers__patch.py +++ b/services/web/server/tests/unit/with_dbs/02/test_projects_crud_handlers__patch.py @@ -25,7 +25,7 @@ @pytest.fixture def mock_catalog_api_get_services_for_user_in_product(mocker: MockerFixture): mocker.patch( - "simcore_service_webserver.projects._controllers.projects_rest.catalog_service.get_services_for_user_in_product", + "simcore_service_webserver.projects._controller.projects_rest.catalog_service.get_services_for_user_in_product", spec=True, return_value=[], ) @@ -34,7 +34,7 @@ def mock_catalog_api_get_services_for_user_in_product(mocker: MockerFixture): @pytest.fixture def mock_project_uses_available_services(mocker: MockerFixture): mocker.patch( - "simcore_service_webserver.projects._controllers.projects_rest.project_uses_available_services", + "simcore_service_webserver.projects._controller.projects_rest.project_uses_available_services", spec=True, return_value=True, ) diff --git a/services/web/server/tests/unit/with_dbs/02/test_projects_groups_handlers.py b/services/web/server/tests/unit/with_dbs/02/test_projects_groups_handlers.py index 65904e1715d..5f89e4aa032 100644 --- a/services/web/server/tests/unit/with_dbs/02/test_projects_groups_handlers.py +++ b/services/web/server/tests/unit/with_dbs/02/test_projects_groups_handlers.py @@ -20,7 +20,7 @@ @pytest.fixture def mock_catalog_api_get_services_for_user_in_product(mocker: MockerFixture): mocker.patch( - "simcore_service_webserver.projects._controllers.projects_rest.catalog_service.get_services_for_user_in_product", + "simcore_service_webserver.projects._controller.projects_rest.catalog_service.get_services_for_user_in_product", spec=True, return_value=[], ) @@ -29,7 +29,7 @@ def mock_catalog_api_get_services_for_user_in_product(mocker: MockerFixture): @pytest.fixture def mock_project_uses_available_services(mocker: MockerFixture): mocker.patch( - "simcore_service_webserver.projects._controllers.projects_rest.project_uses_available_services", + "simcore_service_webserver.projects._controller.projects_rest.project_uses_available_services", spec=True, return_value=True, ) diff --git a/services/web/server/tests/unit/with_dbs/02/test_projects_nodes_handlers__patch.py b/services/web/server/tests/unit/with_dbs/02/test_projects_nodes_handlers__patch.py index 184a53426bf..3bba1eaf118 100644 --- a/services/web/server/tests/unit/with_dbs/02/test_projects_nodes_handlers__patch.py +++ b/services/web/server/tests/unit/with_dbs/02/test_projects_nodes_handlers__patch.py @@ -29,7 +29,7 @@ @pytest.fixture def mock_catalog_api_get_services_for_user_in_product(mocker: MockerFixture): mocker.patch( - "simcore_service_webserver.projects._controllers.projects_rest.catalog_service.get_services_for_user_in_product", + "simcore_service_webserver.projects._controller.projects_rest.catalog_service.get_services_for_user_in_product", spec=True, return_value=[], ) @@ -38,7 +38,7 @@ def mock_catalog_api_get_services_for_user_in_product(mocker: MockerFixture): @pytest.fixture def mock_project_uses_available_services(mocker: MockerFixture): mocker.patch( - "simcore_service_webserver.projects._controllers.projects_rest.project_uses_available_services", + "simcore_service_webserver.projects._controller.projects_rest.project_uses_available_services", spec=True, return_value=True, ) diff --git a/services/web/server/tests/unit/with_dbs/04/workspaces/test_workspaces__folders_and_projects_crud.py b/services/web/server/tests/unit/with_dbs/04/workspaces/test_workspaces__folders_and_projects_crud.py index fd2a1a7595e..ac519fba507 100644 --- a/services/web/server/tests/unit/with_dbs/04/workspaces/test_workspaces__folders_and_projects_crud.py +++ b/services/web/server/tests/unit/with_dbs/04/workspaces/test_workspaces__folders_and_projects_crud.py @@ -32,7 +32,7 @@ def mock_catalog_api_get_services_for_user_in_product(mocker: MockerFixture): return_value=[], ) mocker.patch( - "simcore_service_webserver.projects._controllers.projects_rest.project_uses_available_services", + "simcore_service_webserver.projects._controller.projects_rest.project_uses_available_services", spec=True, return_value=True, ) diff --git a/services/web/server/tests/unit/with_dbs/04/workspaces/test_workspaces__list_projects_full_search.py b/services/web/server/tests/unit/with_dbs/04/workspaces/test_workspaces__list_projects_full_search.py index d59d85d036a..c71cdf4fb40 100644 --- a/services/web/server/tests/unit/with_dbs/04/workspaces/test_workspaces__list_projects_full_search.py +++ b/services/web/server/tests/unit/with_dbs/04/workspaces/test_workspaces__list_projects_full_search.py @@ -28,7 +28,7 @@ def mock_catalog_api_get_services_for_user_in_product(mocker: MockerFixture): return_value=[], ) mocker.patch( - "simcore_service_webserver.projects._controllers.projects_rest.project_uses_available_services", + "simcore_service_webserver.projects._controller.projects_rest.project_uses_available_services", spec=True, return_value=True, ) diff --git a/services/web/server/tests/unit/with_dbs/04/workspaces/test_workspaces__moving_folders_between_workspaces.py b/services/web/server/tests/unit/with_dbs/04/workspaces/test_workspaces__moving_folders_between_workspaces.py index a5eedae2136..b18252fbdd1 100644 --- a/services/web/server/tests/unit/with_dbs/04/workspaces/test_workspaces__moving_folders_between_workspaces.py +++ b/services/web/server/tests/unit/with_dbs/04/workspaces/test_workspaces__moving_folders_between_workspaces.py @@ -33,7 +33,7 @@ def mock_catalog_api_get_services_for_user_in_product(mocker: MockerFixture): return_value=[], ) mocker.patch( - "simcore_service_webserver.projects._controllers.projects_rest.project_uses_available_services", + "simcore_service_webserver.projects._controller.projects_rest.project_uses_available_services", spec=True, return_value=True, ) diff --git a/services/web/server/tests/unit/with_dbs/04/workspaces/test_workspaces__moving_projects_between_workspaces.py b/services/web/server/tests/unit/with_dbs/04/workspaces/test_workspaces__moving_projects_between_workspaces.py index eb5fee54fc4..a308040670b 100644 --- a/services/web/server/tests/unit/with_dbs/04/workspaces/test_workspaces__moving_projects_between_workspaces.py +++ b/services/web/server/tests/unit/with_dbs/04/workspaces/test_workspaces__moving_projects_between_workspaces.py @@ -33,7 +33,7 @@ def mock_catalog_api_get_services_for_user_in_product(mocker: MockerFixture): return_value=[], ) mocker.patch( - "simcore_service_webserver.projects._controllers.projects_rest.project_uses_available_services", + "simcore_service_webserver.projects._controller.projects_rest.project_uses_available_services", spec=True, return_value=True, ) From 07707a412d22ee4681b06f9784fdc8bca8b2a6da Mon Sep 17 00:00:00 2001 From: Pedro Crespo-Valero <32402063+pcrespov@users.noreply.github.com> Date: Fri, 21 Mar 2025 18:08:23 +0100 Subject: [PATCH 29/39] fix sonar --- .../projects/_folders_service.py | 16 +++++++++------- .../projects/_projects_service.py | 7 +++++-- .../projects/_security_service.py | 7 +------ 3 files changed, 15 insertions(+), 15 deletions(-) diff --git a/services/web/server/src/simcore_service_webserver/projects/_folders_service.py b/services/web/server/src/simcore_service_webserver/projects/_folders_service.py index 16230322f61..88659d68ac5 100644 --- a/services/web/server/src/simcore_service_webserver/projects/_folders_service.py +++ b/services/web/server/src/simcore_service_webserver/projects/_folders_service.py @@ -43,13 +43,17 @@ async def move_project_into_folder( ) workspace_is_private = False + private_workspace_user_id_or_none: UserID | None = ( + user_id if workspace_is_private else None + ) + if folder_id: # Check user has access to folder await folders_folders_repository.get_for_user_or_workspace( app, folder_id=folder_id, product_name=product_name, - user_id=user_id if workspace_is_private else None, + user_id=private_workspace_user_id_or_none, workspace_id=project_db.workspace_id, ) @@ -57,7 +61,7 @@ async def move_project_into_folder( prj_to_folder_db = await _folders_repository.get_project_to_folder( app, project_id=project_id, - private_workspace_user_id_or_none=user_id if workspace_is_private else None, + private_workspace_user_id_or_none=private_workspace_user_id_or_none, ) if prj_to_folder_db is None: if folder_id is None: @@ -66,7 +70,7 @@ async def move_project_into_folder( app, project_id=project_id, folder_id=folder_id, - private_workspace_user_id_or_none=user_id if workspace_is_private else None, + private_workspace_user_id_or_none=private_workspace_user_id_or_none, ) else: # Delete old @@ -74,7 +78,7 @@ async def move_project_into_folder( app, project_id=project_id, folder_id=prj_to_folder_db.folder_id, - private_workspace_user_id_or_none=user_id if workspace_is_private else None, + private_workspace_user_id_or_none=private_workspace_user_id_or_none, ) # Create new if folder_id is not None: @@ -82,7 +86,5 @@ async def move_project_into_folder( app, project_id=project_id, folder_id=folder_id, - private_workspace_user_id_or_none=( - user_id if workspace_is_private else None - ), + private_workspace_user_id_or_none=private_workspace_user_id_or_none, ) diff --git a/services/web/server/src/simcore_service_webserver/projects/_projects_service.py b/services/web/server/src/simcore_service_webserver/projects/_projects_service.py index 93992e205da..f079b8fb5f6 100644 --- a/services/web/server/src/simcore_service_webserver/projects/_projects_service.py +++ b/services/web/server/src/simcore_service_webserver/projects/_projects_service.py @@ -210,7 +210,10 @@ async def get_project_for_user( # adds state if it is not a template if include_state: project = await add_project_states_for_user( - user_id, project, project_type is ProjectType.TEMPLATE, app + user_id=user_id, + project=project, + is_template=project_type is ProjectType.TEMPLATE, + app=app, ) # adds `trashed_by_primary_gid` @@ -1550,7 +1553,6 @@ async def get_project_states_for_user( user_id: int, project_uuid: str, app: web.Application ) -> ProjectState: # for templates: the project is never locked and never opened. also the running state is always unknown - lock_state = ProjectLocked(value=False, status=ProjectStatus.CLOSED) running_state = RunningState.UNKNOWN lock_state, computation_task = await logged_gather( _get_project_lock_state(user_id, project_uuid, app), @@ -1566,6 +1568,7 @@ async def get_project_states_for_user( async def add_project_states_for_user( + *, user_id: int, project: ProjectDict, is_template: bool, diff --git a/services/web/server/src/simcore_service_webserver/projects/_security_service.py b/services/web/server/src/simcore_service_webserver/projects/_security_service.py index 9a0ff0b50a5..f3c176b4de8 100644 --- a/services/web/server/src/simcore_service_webserver/projects/_security_service.py +++ b/services/web/server/src/simcore_service_webserver/projects/_security_service.py @@ -34,17 +34,13 @@ async def _can_update_node_inputs(context): diffs = jsondiff.diff(current_project, updated_project) - # TODO: depends on schema. Shall change if schema changes!? if "workbench" in diffs: try: for node in diffs["workbench"]: # can ONLY modify `inputs` fields set as ReadAndWrite access = current_project["workbench"][node]["inputAccess"] inputs = diffs["workbench"][node]["inputs"] - for key in inputs: - if access.get(key) != "ReadAndWrite": - return False - return True + return all(access.get(key) == "ReadAndWrite" for key in inputs) except KeyError: pass return False @@ -58,7 +54,6 @@ def setup_projects_access(app: web.Application): """ hrba = get_access_model(app) - # TODO: add here also named permissions, i.e. all project.* operations hrba.roles[UserRole.GUEST].check[ "project.workbench.node.inputs.update" ] = _can_update_node_inputs From d27f5cc1cc3c78a6c4c002967f6c678d375ba86c Mon Sep 17 00:00:00 2001 From: Pedro Crespo-Valero <32402063+pcrespov@users.noreply.github.com> Date: Fri, 21 Mar 2025 18:31:30 +0100 Subject: [PATCH 30/39] fix mocks --- .../web/server/tests/unit/with_dbs/03/trash/test_trash.py | 2 +- .../04/studies_dispatcher/test_studies_dispatcher_handlers.py | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/services/web/server/tests/unit/with_dbs/03/trash/test_trash.py b/services/web/server/tests/unit/with_dbs/03/trash/test_trash.py index a662c8c574b..396dfcc7c97 100644 --- a/services/web/server/tests/unit/with_dbs/03/trash/test_trash.py +++ b/services/web/server/tests/unit/with_dbs/03/trash/test_trash.py @@ -53,7 +53,7 @@ async def test_trash_projects( # noqa: PLR0915 # this test should emulate NO errors stopping services mock_remove_dynamic_services = mocker.patch( - "simcore_service_webserver.projects._trash_service._projects_service_delete.projects_service.remove_project_dynamic_services", + "simcore_service_webserver.projects._trash_service._projects_service_delete._projects_service.remove_project_dynamic_services", autospec=True, ) mock_stop_pipeline = mocker.patch( diff --git a/services/web/server/tests/unit/with_dbs/04/studies_dispatcher/test_studies_dispatcher_handlers.py b/services/web/server/tests/unit/with_dbs/04/studies_dispatcher/test_studies_dispatcher_handlers.py index 025f5b8ff41..3498fd2abcb 100644 --- a/services/web/server/tests/unit/with_dbs/04/studies_dispatcher/test_studies_dispatcher_handlers.py +++ b/services/web/server/tests/unit/with_dbs/04/studies_dispatcher/test_studies_dispatcher_handlers.py @@ -400,7 +400,7 @@ async def test_dispatch_study_anonymously( return_value=None, ) mock_dynamic_scheduler_update_project_networks = mocker.patch( - "simcore_service_webserver.studies_dispatcher._redirects_handlers.dynamic_scheduler_api.update_projects_networks", + "simcore_service_webserver.studies_dispatcher._redirects_handlers.dynamic_scheduler_service.update_projects_networks", return_value=None, ) @@ -466,7 +466,7 @@ async def test_dispatch_logged_in_user( return_value=None, ) mock_dynamic_scheduler_update_project_networks = mocker.patch( - "simcore_service_webserver.studies_dispatcher._redirects_handlers.dynamic_scheduler_api.update_projects_networks", + "simcore_service_webserver.studies_dispatcher._redirects_handlers.dynamic_scheduler_service.update_projects_networks", return_value=None, ) From cd32f5b7fdbb99c807265f890d25731c4659d6a4 Mon Sep 17 00:00:00 2001 From: Pedro Crespo-Valero <32402063+pcrespov@users.noreply.github.com> Date: Fri, 21 Mar 2025 18:31:49 +0100 Subject: [PATCH 31/39] cleanup --- .../projects/_projects_service_delete.py | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/services/web/server/src/simcore_service_webserver/projects/_projects_service_delete.py b/services/web/server/src/simcore_service_webserver/projects/_projects_service_delete.py index 032a6fbb978..bd8d57886e4 100644 --- a/services/web/server/src/simcore_service_webserver/projects/_projects_service_delete.py +++ b/services/web/server/src/simcore_service_webserver/projects/_projects_service_delete.py @@ -11,8 +11,7 @@ from servicelib.redis._errors import ProjectLockError from ..director_v2 import director_v2_service -from . import _projects_repository as _projects_repository -from . import _projects_service +from . import _projects_repository, _projects_service from .exceptions import ProjectDeleteError, ProjectNotFoundError _logger = logging.getLogger(__name__) From 94b8f9163da523efa3061f27192513a3f3e6af51 Mon Sep 17 00:00:00 2001 From: Pedro Crespo-Valero <32402063+pcrespov@users.noreply.github.com> Date: Fri, 21 Mar 2025 18:48:20 +0100 Subject: [PATCH 32/39] fixes imports --- api/specs/web-server/_projects_wallet.py | 2 +- api/specs/web-server/_trash.py | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/api/specs/web-server/_projects_wallet.py b/api/specs/web-server/_projects_wallet.py index 21f20d12fa0..78878bc163e 100644 --- a/api/specs/web-server/_projects_wallet.py +++ b/api/specs/web-server/_projects_wallet.py @@ -20,7 +20,7 @@ from simcore_service_webserver.projects._controller._rest_schemas import ( ProjectPathParams, ) -from simcore_service_webserver.projects._wallets_rest import ( +from simcore_service_webserver.projects._controller.wallets_rest import ( _PayProjectDebtBody, _ProjectWalletPathParams, ) diff --git a/api/specs/web-server/_trash.py b/api/specs/web-server/_trash.py index 983db403e15..7ec30e777bc 100644 --- a/api/specs/web-server/_trash.py +++ b/api/specs/web-server/_trash.py @@ -18,7 +18,7 @@ from simcore_service_webserver.projects._controller._rest_exceptions import ( _TO_HTTP_ERROR_MAP, ) -from simcore_service_webserver.projects._trash_rest import ProjectPathParams +from simcore_service_webserver.projects._controller.trash_rest import ProjectPathParams from simcore_service_webserver.workspaces._common.models import ( WorkspacesPathParams, WorkspaceTrashQueryParams, From 25b6cf06f86a13a894c654c5851633c1a292bde6 Mon Sep 17 00:00:00 2001 From: Pedro Crespo-Valero <32402063+pcrespov@users.noreply.github.com> Date: Sat, 22 Mar 2025 13:28:10 +0100 Subject: [PATCH 33/39] fixes pylint --- .../projects/_projects_repository.py | 4 ++-- .../src/simcore_service_webserver/projects/_trash_service.py | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/services/web/server/src/simcore_service_webserver/projects/_projects_repository.py b/services/web/server/src/simcore_service_webserver/projects/_projects_repository.py index 2754d1124a9..d3312bdc1eb 100644 --- a/services/web/server/src/simcore_service_webserver/projects/_projects_repository.py +++ b/services/web/server/src/simcore_service_webserver/projects/_projects_repository.py @@ -37,7 +37,7 @@ ProjectDBGet, ) -_OLDEST_TRASHED_FIRST = OrderBy(field=IDStr("trashed"), direction=OrderDirection.ASC) +OLDEST_TRASHED_FIRST = OrderBy(field=IDStr("trashed"), direction=OrderDirection.ASC) def _to_sql_expression(table: sa.Table, order_by: OrderBy): @@ -59,7 +59,7 @@ async def list_trashed_projects( offset: NonNegativeInt = 0, limit: PositiveInt = MAXIMUM_NUMBER_OF_ITEMS_PER_PAGE, # order - order_by: OrderBy = _OLDEST_TRASHED_FIRST, + order_by: OrderBy = OLDEST_TRASHED_FIRST, ) -> tuple[int, list[ProjectDBGet]]: base_query = sql.select(*PROJECT_DB_COLS).where(projects.c.trashed.is_not(None)) diff --git a/services/web/server/src/simcore_service_webserver/projects/_trash_service.py b/services/web/server/src/simcore_service_webserver/projects/_trash_service.py index eba311f8111..a70a52937bb 100644 --- a/services/web/server/src/simcore_service_webserver/projects/_trash_service.py +++ b/services/web/server/src/simcore_service_webserver/projects/_trash_service.py @@ -248,7 +248,7 @@ async def batch_delete_trashed_projects_as_admin( trashed_before=trashed_before, offset=page_params.offset, limit=page_params.limit, - order_by=_projects_repository._OLDEST_TRASHED_FIRST, + order_by=_projects_repository.OLDEST_TRASHED_FIRST, ) # BATCH delete for project in expired_trashed_projects: From 986baeb038f777c46ca04fe90820b93278f3b47c Mon Sep 17 00:00:00 2001 From: Pedro Crespo-Valero <32402063+pcrespov@users.noreply.github.com> Date: Mon, 24 Mar 2025 10:32:55 +0100 Subject: [PATCH 34/39] @sanderegg review: all naming --- .../director_v2/director_v2_service.py | 7 +------ 1 file changed, 1 insertion(+), 6 deletions(-) diff --git a/services/web/server/src/simcore_service_webserver/director_v2/director_v2_service.py b/services/web/server/src/simcore_service_webserver/director_v2/director_v2_service.py index 0f8a3f16321..4a1a26a8a20 100644 --- a/services/web/server/src/simcore_service_webserver/director_v2/director_v2_service.py +++ b/services/web/server/src/simcore_service_webserver/director_v2/director_v2_service.py @@ -1,8 +1,3 @@ -"""plugin API - -PLEASE avoid importing from any other module to access this plugin's functionality -""" - from ._abc import ( AbstractProjectRunPolicy, get_project_run_policy, @@ -22,9 +17,9 @@ # director-v2 module internal API __all__: tuple[str, ...] = ( "AbstractProjectRunPolicy", + "DirectorServiceError", "create_or_update_pipeline", "delete_pipeline", - "DirectorServiceError", "get_batch_tasks_outputs", "get_computation_task", "get_project_run_policy", From 501db98a35da0f059dec764953d412173d3d81ec Mon Sep 17 00:00:00 2001 From: Pedro Crespo-Valero <32402063+pcrespov@users.noreply.github.com> Date: Mon, 24 Mar 2025 10:47:02 +0100 Subject: [PATCH 35/39] @sanderegg review: comments --- .../projects/_controller/_rest_schemas.py | 6 ------ .../projects/_controller/comments_rest.py | 2 -- .../projects/_controller/groups_rest.py | 2 -- .../projects/_controller/nodes_pricing_unit_rest.py | 2 -- .../projects/_controller/nodes_rest.py | 2 -- .../projects/_controller/ports_rest.py | 5 ----- .../projects/_controller/projects_rest.py | 6 ------ .../projects/_controller/projects_states_rest.py | 2 -- .../projects/_controller/tags_rest.py | 2 -- .../projects/_controller/wallets_rest.py | 2 -- 10 files changed, 31 deletions(-) diff --git a/services/web/server/src/simcore_service_webserver/projects/_controller/_rest_schemas.py b/services/web/server/src/simcore_service_webserver/projects/_controller/_rest_schemas.py index 300c0d53394..1ad5b9a1e91 100644 --- a/services/web/server/src/simcore_service_webserver/projects/_controller/_rest_schemas.py +++ b/services/web/server/src/simcore_service_webserver/projects/_controller/_rest_schemas.py @@ -1,9 +1,3 @@ -"""Handlers for STANDARD methods on /projects colletions - -Standard methods or CRUD that states for Create+Read(Get&List)+Update+Delete - -""" - from models_library.projects import ProjectID from pydantic import BaseModel, ConfigDict, Field diff --git a/services/web/server/src/simcore_service_webserver/projects/_controller/comments_rest.py b/services/web/server/src/simcore_service_webserver/projects/_controller/comments_rest.py index 41ea58d2043..183cf1fa3b6 100644 --- a/services/web/server/src/simcore_service_webserver/projects/_controller/comments_rest.py +++ b/services/web/server/src/simcore_service_webserver/projects/_controller/comments_rest.py @@ -1,5 +1,3 @@ -"""Handlers for project comments operations""" - import logging from typing import Any diff --git a/services/web/server/src/simcore_service_webserver/projects/_controller/groups_rest.py b/services/web/server/src/simcore_service_webserver/projects/_controller/groups_rest.py index 9d678339e95..696a540cd6e 100644 --- a/services/web/server/src/simcore_service_webserver/projects/_controller/groups_rest.py +++ b/services/web/server/src/simcore_service_webserver/projects/_controller/groups_rest.py @@ -1,5 +1,3 @@ -"""Handlers for project comments operations""" - import logging from aiohttp import web diff --git a/services/web/server/src/simcore_service_webserver/projects/_controller/nodes_pricing_unit_rest.py b/services/web/server/src/simcore_service_webserver/projects/_controller/nodes_pricing_unit_rest.py index 4420ed2ae8f..6476389c4d7 100644 --- a/services/web/server/src/simcore_service_webserver/projects/_controller/nodes_pricing_unit_rest.py +++ b/services/web/server/src/simcore_service_webserver/projects/_controller/nodes_pricing_unit_rest.py @@ -1,5 +1,3 @@ -"""Handlers for CRUD operations on /projects/{*}/nodes/{*}/pricing-unit""" - import logging from aiohttp import web diff --git a/services/web/server/src/simcore_service_webserver/projects/_controller/nodes_rest.py b/services/web/server/src/simcore_service_webserver/projects/_controller/nodes_rest.py index 955f075a80f..37f63daf7f1 100644 --- a/services/web/server/src/simcore_service_webserver/projects/_controller/nodes_rest.py +++ b/services/web/server/src/simcore_service_webserver/projects/_controller/nodes_rest.py @@ -1,5 +1,3 @@ -"""Handlers for CRUD operations on /projects/{*}/nodes/{*}""" - import asyncio import logging diff --git a/services/web/server/src/simcore_service_webserver/projects/_controller/ports_rest.py b/services/web/server/src/simcore_service_webserver/projects/_controller/ports_rest.py index b4a28c97286..396ba2bbae7 100644 --- a/services/web/server/src/simcore_service_webserver/projects/_controller/ports_rest.py +++ b/services/web/server/src/simcore_service_webserver/projects/_controller/ports_rest.py @@ -1,8 +1,3 @@ -"""Handlers for some CRUD operations for -- /projects/{*}/inputs -- /projects/{*}/outputs -""" - import logging from typing import Any, Literal diff --git a/services/web/server/src/simcore_service_webserver/projects/_controller/projects_rest.py b/services/web/server/src/simcore_service_webserver/projects/_controller/projects_rest.py index 3584902d9c0..a3bfa8c84a8 100644 --- a/services/web/server/src/simcore_service_webserver/projects/_controller/projects_rest.py +++ b/services/web/server/src/simcore_service_webserver/projects/_controller/projects_rest.py @@ -1,9 +1,3 @@ -"""Handlers for STANDARD methods on /projects colletions - -Standard methods or CRUD that states for Create+Read(Get&List)+Update+Delete - -""" - import logging from aiohttp import web diff --git a/services/web/server/src/simcore_service_webserver/projects/_controller/projects_states_rest.py b/services/web/server/src/simcore_service_webserver/projects/_controller/projects_states_rest.py index bd3736ade53..252708921fe 100644 --- a/services/web/server/src/simcore_service_webserver/projects/_controller/projects_states_rest.py +++ b/services/web/server/src/simcore_service_webserver/projects/_controller/projects_states_rest.py @@ -1,5 +1,3 @@ -"""handlers for project states""" - import contextlib import json import logging diff --git a/services/web/server/src/simcore_service_webserver/projects/_controller/tags_rest.py b/services/web/server/src/simcore_service_webserver/projects/_controller/tags_rest.py index 7de6fd20454..9fce75cda63 100644 --- a/services/web/server/src/simcore_service_webserver/projects/_controller/tags_rest.py +++ b/services/web/server/src/simcore_service_webserver/projects/_controller/tags_rest.py @@ -1,5 +1,3 @@ -"""Handlers for CRUD operations on /projects/{*}/tags/{*}""" - import logging from aiohttp import web diff --git a/services/web/server/src/simcore_service_webserver/projects/_controller/wallets_rest.py b/services/web/server/src/simcore_service_webserver/projects/_controller/wallets_rest.py index 7f5cc48ea7f..a2b734a20cb 100644 --- a/services/web/server/src/simcore_service_webserver/projects/_controller/wallets_rest.py +++ b/services/web/server/src/simcore_service_webserver/projects/_controller/wallets_rest.py @@ -1,5 +1,3 @@ -"""Handlers for CRUD operations on /projects/{*}/wallet""" - import logging from decimal import Decimal from typing import Annotated From 7df5ce75b6ff4b1313e302c2b3cc51133c2d042b Mon Sep 17 00:00:00 2001 From: Pedro Crespo-Valero <32402063+pcrespov@users.noreply.github.com> Date: Mon, 24 Mar 2025 10:50:59 +0100 Subject: [PATCH 36/39] rest schemas --- api/specs/web-server/_projects.py | 6 ++---- .../projects/_controller/_rest_schemas.py | 6 +++++- .../projects/_controller/projects_rest.py | 17 ++++++++++------- .../projects_rest_schemas.py} | 13 +++---------- 4 files changed, 20 insertions(+), 22 deletions(-) rename services/web/server/src/simcore_service_webserver/projects/{_crud_handlers_models.py => _controller/projects_rest_schemas.py} (96%) diff --git a/api/specs/web-server/_projects.py b/api/specs/web-server/_projects.py index 3c8e46f53af..87a5cea975e 100644 --- a/api/specs/web-server/_projects.py +++ b/api/specs/web-server/_projects.py @@ -37,11 +37,9 @@ from simcore_service_webserver.projects._controller._rest_schemas import ( ProjectPathParams, ) -from simcore_service_webserver.projects._controller.projects_rest import ( - ProjectCreateQueryParams, -) -from simcore_service_webserver.projects._crud_handlers_models import ( +from simcore_service_webserver.projects._controller.projects_rest_schemas import ( ProjectActiveQueryParams, + ProjectCreateQueryParams, ProjectsListQueryParams, ProjectsSearchQueryParams, ) diff --git a/services/web/server/src/simcore_service_webserver/projects/_controller/_rest_schemas.py b/services/web/server/src/simcore_service_webserver/projects/_controller/_rest_schemas.py index 1ad5b9a1e91..9618a73bb4c 100644 --- a/services/web/server/src/simcore_service_webserver/projects/_controller/_rest_schemas.py +++ b/services/web/server/src/simcore_service_webserver/projects/_controller/_rest_schemas.py @@ -1,5 +1,9 @@ from models_library.projects import ProjectID -from pydantic import BaseModel, ConfigDict, Field +from pydantic import ( + BaseModel, + ConfigDict, + Field, +) from ...models import RequestContext diff --git a/services/web/server/src/simcore_service_webserver/projects/_controller/projects_rest.py b/services/web/server/src/simcore_service_webserver/projects/_controller/projects_rest.py index a3bfa8c84a8..f20360d1cc0 100644 --- a/services/web/server/src/simcore_service_webserver/projects/_controller/projects_rest.py +++ b/services/web/server/src/simcore_service_webserver/projects/_controller/projects_rest.py @@ -37,7 +37,16 @@ from ...users.api import get_user_fullname from ...utils_aiohttp import envelope_json_response from .. import _crud_api_create, _crud_api_read, _projects_service -from .._crud_handlers_models import ( +from .._permalink_service import update_or_pop_permalink_in_project +from ..models import ProjectDict +from ..utils import get_project_unavailable_services, project_uses_available_services +from . import _rest_utils +from ._rest_exceptions import handle_plugin_requests_exceptions +from ._rest_schemas import ( + ProjectPathParams, + RequestContext, +) +from .projects_rest_schemas import ( ProjectActiveQueryParams, ProjectCreateHeaders, ProjectCreateQueryParams, @@ -45,12 +54,6 @@ ProjectsListQueryParams, ProjectsSearchQueryParams, ) -from .._permalink_service import update_or_pop_permalink_in_project -from ..models import ProjectDict -from ..utils import get_project_unavailable_services, project_uses_available_services -from . import _rest_utils -from ._rest_exceptions import handle_plugin_requests_exceptions -from ._rest_schemas import ProjectPathParams, RequestContext # When the user requests a project with a repo, the working copy might differ from # the repo project. A middleware in the meta module (if active) will resolve diff --git a/services/web/server/src/simcore_service_webserver/projects/_crud_handlers_models.py b/services/web/server/src/simcore_service_webserver/projects/_controller/projects_rest_schemas.py similarity index 96% rename from services/web/server/src/simcore_service_webserver/projects/_crud_handlers_models.py rename to services/web/server/src/simcore_service_webserver/projects/_controller/projects_rest_schemas.py index 398643f32a7..55834b7b658 100644 --- a/services/web/server/src/simcore_service_webserver/projects/_crud_handlers_models.py +++ b/services/web/server/src/simcore_service_webserver/projects/_controller/projects_rest_schemas.py @@ -1,9 +1,3 @@ -""" Handlers for STANDARD methods on /projects colletions - -Standard methods or CRUD that states for Create+Read(Get&List)+Update+Delete - -""" - from typing import Annotated, Self from models_library.basic_types import IDStr @@ -38,8 +32,8 @@ X_SIMCORE_USER_AGENT, ) -from .exceptions import WrongTagIdsInQueryError -from .models import ProjectTypeAPI +from ..exceptions import WrongTagIdsInQueryError +from ..models import ProjectTypeAPI class ProjectCreateHeaders(BaseModel): @@ -159,8 +153,7 @@ class ProjectsListQueryParams( ProjectsListOrderParams, # type: ignore[misc, valid-type] FiltersQueryParameters[ProjectFilters], ProjectsListExtraQueryParams, -): - ... +): ... class ProjectActiveQueryParams(BaseModel): From 014756d78665f812547df99f1330d343b588726d Mon Sep 17 00:00:00 2001 From: Pedro Crespo-Valero <32402063+pcrespov@users.noreply.github.com> Date: Mon, 24 Mar 2025 11:01:24 +0100 Subject: [PATCH 37/39] minor --- .../projects/_controller/groups_rest.py | 4 ---- .../projects/_controller/metadata_rest.py | 5 ----- .../projects/_controller/nodes_rest.py | 3 +-- 3 files changed, 1 insertion(+), 11 deletions(-) diff --git a/services/web/server/src/simcore_service_webserver/projects/_controller/groups_rest.py b/services/web/server/src/simcore_service_webserver/projects/_controller/groups_rest.py index 696a540cd6e..7d79461144a 100644 --- a/services/web/server/src/simcore_service_webserver/projects/_controller/groups_rest.py +++ b/services/web/server/src/simcore_service_webserver/projects/_controller/groups_rest.py @@ -22,10 +22,6 @@ _logger = logging.getLogger(__name__) -# -# projects groups COLLECTION ------------------------- -# - routes = web.RouteTableDef() diff --git a/services/web/server/src/simcore_service_webserver/projects/_controller/metadata_rest.py b/services/web/server/src/simcore_service_webserver/projects/_controller/metadata_rest.py index b383d8e4175..f03b711f56d 100644 --- a/services/web/server/src/simcore_service_webserver/projects/_controller/metadata_rest.py +++ b/services/web/server/src/simcore_service_webserver/projects/_controller/metadata_rest.py @@ -36,11 +36,6 @@ _logger = logging.getLogger(__name__) -# -# projects/*/custom-metadata -# - - @routes.get( f"/{api_version_prefix}/projects/{{project_id}}/metadata", name="get_project_metadata", diff --git a/services/web/server/src/simcore_service_webserver/projects/_controller/nodes_rest.py b/services/web/server/src/simcore_service_webserver/projects/_controller/nodes_rest.py index 37f63daf7f1..9642ba581d3 100644 --- a/services/web/server/src/simcore_service_webserver/projects/_controller/nodes_rest.py +++ b/services/web/server/src/simcore_service_webserver/projects/_controller/nodes_rest.py @@ -64,8 +64,7 @@ from ...users.api import get_user_id_from_gid, get_user_role from ...utils_aiohttp import envelope_json_response from .. import _access_rights_service as access_rights_service -from .. import _nodes_service as _nodes_service -from .. import _projects_service, nodes_utils +from .. import _nodes_service, _projects_service, nodes_utils from .._nodes_service import NodeScreenshot, get_node_screenshots from ..api import has_user_project_access_rights from ..exceptions import ( From 894573c9bcfd78545649556efdb27245a4c6a6b1 Mon Sep 17 00:00:00 2001 From: Pedro Crespo-Valero <32402063+pcrespov@users.noreply.github.com> Date: Mon, 24 Mar 2025 16:03:53 +0100 Subject: [PATCH 38/39] @GitHK review:doc --- docs/controller-service-repository.drawio.svg | 450 ++++++++++++++++++ 1 file changed, 450 insertions(+) create mode 100644 docs/controller-service-repository.drawio.svg diff --git a/docs/controller-service-repository.drawio.svg b/docs/controller-service-repository.drawio.svg new file mode 100644 index 00000000000..1e080936bc4 --- /dev/null +++ b/docs/controller-service-repository.drawio.svg @@ -0,0 +1,450 @@ + + + + + + + + + + +
+
+
+ APP +
+
+
+
+ + APP + +
+
+
+ + + + + + + +
+
+
+ CONTROLLER +
+
+
+
+ + CONTROLLER + +
+
+
+ + + + + + + +
+
+
+ SERVICE +
+
+
+
+ + SERVICE + +
+
+
+ + + + + + + +
+
+
+ Persistence +
+
+
+
+ + Persistence + +
+
+
+ + + + + + + +
+
+
+ REPOSITORY +
+
+
+
+ + REPOSITORY + +
+
+
+ + + + + + + + + + + +
+
+
+ Dependencies go inwards +
+
+
+
+ + Dependencies go inwards + +
+
+
+ + + + + + + + + + + + + + + +
+
+
+ OTHER APPS +
+
+
+
+ + OTHER APPS + +
+
+
+ + + + + + + + + + + +
+
+
+ OTHER APPS +
+
+
+
+ + OTHER APPS + +
+
+
+ + + + + + + +
+
+
+ Domain A +
+
+
+
+ + Domain A + +
+
+
+ + + + + + + +
+
+
+ + rest + + api +
+ (schema-model, http-errors) +
+
+
+
+
+ + rest api... + +
+
+
+ + + + + + + +
+
+
+ + service api +
+ + io: + + + domain-model, domain-errors + +
+
+
+
+
+ + service api... + +
+
+
+ + + + + + + +
+
+
+ + repository api + +
+ + io: + + + domain-model, domain-errors + +
+
+
+
+
+ + repository api... + +
+
+
+ + + + + + + +
+
+
+ Domain B +
+
+
+
+ + Domain B + +
+
+
+ + + + + + + +
+
+
+ + rest + + api +
+ + io: schema + + + -model, http-errors + +
+
+
+
+
+ + rest api... + +
+
+
+ + + + + + + +
+
+
+ + service api +
+ + io: + + + domain-model, domain-errors + +
+
+
+
+
+ + service api... + +
+
+
+ + + + + + + +
+
+
+ repository api +
+ + io: + + + domain-model, domain-errors + +
+
+
+
+
+ + repository api... + +
+
+
+ + + + + + + +
+
+
+ + rpc + + api +
+ + io: schema + + + -model, rpc-exceptions + +
+
+
+
+
+ + rpc api... + +
+
+
+
+ + + + + Text is not SVG - cannot display + + + +
From 4e4e78082e371be4fec83017c278d42aaedb3093 Mon Sep 17 00:00:00 2001 From: Pedro Crespo-Valero <32402063+pcrespov@users.noreply.github.com> Date: Mon, 24 Mar 2025 16:17:39 +0100 Subject: [PATCH 39/39] improved --- docs/controller-service-repository.drawio.svg | 205 ++++++++++-------- 1 file changed, 117 insertions(+), 88 deletions(-) diff --git a/docs/controller-service-repository.drawio.svg b/docs/controller-service-repository.drawio.svg index 1e080936bc4..6a0e6ae91d2 100644 --- a/docs/controller-service-repository.drawio.svg +++ b/docs/controller-service-repository.drawio.svg @@ -1,35 +1,43 @@ - - + + + + + + + + - + -
+
+ web +
APP
- - APP + + web... - + -
+
CONTROLLER @@ -37,20 +45,20 @@
- + CONTROLLER - + -
+
SERVICE @@ -58,20 +66,21 @@
- + SERVICE - + + -
+
Persistence @@ -79,20 +88,20 @@
- + Persistence - + -
+
REPOSITORY @@ -100,24 +109,24 @@
- + REPOSITORY - - + + - + -
+
Dependencies go inwards @@ -125,74 +134,90 @@
- + Dependencies go inwards - - + + - - + - + -
-
+
+
- OTHER APPS + CONTROLLER
- - OTHER APPS + + CONTROLLER - - + + + + + + + + + - + -
+
- OTHER APPS + OTHER +
+ web APPS
- - OTHER APPS + + OTHER... - + + + + + + + + + -
+
Domain A @@ -200,20 +225,20 @@
- + Domain A - + -
+
@@ -227,20 +252,20 @@
- + rest api... - + -
+
@@ -257,20 +282,20 @@
- + service api... - + -
+
@@ -288,20 +313,20 @@
- + repository api... - + -
+
Domain B @@ -309,115 +334,119 @@
- + Domain B - + + + + + -
+
- - rest - - api -
+ + service api +
- io: schema + io: - -model, http-errors + domain-model, domain-errors -
+
- - rest api... + + service api... - + -
+
- - service api -
+ repository api +
io: domain-model, domain-errors - +
- - service api... + + repository api... - + -
+
- repository api + + rpc + + api
- io: + io: schema - domain-model, domain-errors + -model, rpc-exceptions
- - repository api... + + rpc api... - + -
+
- rpc + rest api
@@ -425,15 +454,15 @@ io: schema - -model, rpc-exceptions + -model, http-errors
- - rpc api... + + rest api...