Skip to content

Commit c853404

Browse files
committed
✨ Refactor services to improve dependency injection and enhance pagination handling
1 parent cafe745 commit c853404

File tree

10 files changed

+75
-25
lines changed

10 files changed

+75
-25
lines changed

services/api-server/src/simcore_service_api_server/_service_jobs.py

Lines changed: 6 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,11 @@
55
from models_library.products import ProductName
66
from models_library.projects import ProjectID
77
from models_library.projects_nodes_io import NodeID
8-
from models_library.rest_pagination import PageMetaInfoLimitOffset, PageOffsetInt
8+
from models_library.rest_pagination import (
9+
MAXIMUM_NUMBER_OF_ITEMS_PER_PAGE,
10+
PageMetaInfoLimitOffset,
11+
PageOffsetInt,
12+
)
913
from models_library.rpc_pagination import PageLimitInt
1014
from models_library.users import UserID
1115
from pydantic import HttpUrl
@@ -24,8 +28,6 @@
2428

2529
_logger = logging.getLogger(__name__)
2630

27-
DEFAULT_PAGINATION_LIMIT = 999 # MAXIMUM_NUMBER_OF_ITEMS_PER_PAGE - 1
28-
2931

3032
class JobService:
3133
# clients
@@ -53,7 +55,7 @@ async def list_jobs_by_resource_prefix(
5355
*,
5456
job_parent_resource_name_prefix: str,
5557
offset: PageOffsetInt = 0,
56-
limit: PageLimitInt = DEFAULT_PAGINATION_LIMIT,
58+
limit: PageLimitInt = MAXIMUM_NUMBER_OF_ITEMS_PER_PAGE - 1,
5759
) -> tuple[list[Job], PageMetaInfoLimitOffset]:
5860
"""Lists all jobs for a user with pagination based on resource name prefix"""
5961

services/api-server/src/simcore_service_api_server/_service_programs.py

Lines changed: 1 addition & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,3 @@
1-
from typing import Annotated
2-
3-
from fastapi import Depends
41
from models_library.api_schemas_catalog.services import ServiceListFilters
52
from models_library.basic_types import VersionStr
63
from models_library.rest_pagination import PageMetaInfoLimitOffset
@@ -14,7 +11,7 @@
1411
class ProgramService:
1512
_catalog_service: CatalogService
1613

17-
def __init__(self, _catalog_service: Annotated[CatalogService, Depends()]):
14+
def __init__(self, _catalog_service: CatalogService):
1815
self._catalog_service = _catalog_service
1916

2017
async def get_program(

services/api-server/src/simcore_service_api_server/_service_solvers.py

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -29,15 +29,31 @@
2929
class SolverService:
3030
_catalog_service: CatalogService
3131
_job_service: JobService
32+
# context
33+
_user_id: UserID
34+
_product_name: ProductName
3235

3336
def __init__(
3437
self,
3538
catalog_service: CatalogService,
3639
job_service: JobService,
40+
user_id: UserID,
41+
product_name: ProductName,
3742
):
3843
self._catalog_service = catalog_service
3944
self._job_service = job_service
4045

46+
# context
47+
if user_id != self._job_service._user_id:
48+
msg = f"User ID {user_id} does not match job service user ID {self._job_service._user_id}"
49+
raise ValueError(msg)
50+
if product_name != self._job_service._product_name:
51+
msg = f"Product name {product_name} does not match job service product name {self._job_service._product_name}"
52+
raise ValueError(msg)
53+
54+
self._user_id = user_id
55+
self._product_name = product_name
56+
4157
async def get_solver(
4258
self,
4359
*,

services/api-server/src/simcore_service_api_server/_service_studies.py

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,11 @@
1+
from models_library.products import ProductName
12
from models_library.rest_pagination import (
23
MAXIMUM_NUMBER_OF_ITEMS_PER_PAGE,
34
PageMetaInfoLimitOffset,
45
PageOffsetInt,
56
)
67
from models_library.rpc_pagination import PageLimitInt
8+
from models_library.users import UserID
79
from simcore_service_api_server.models.schemas.studies import StudyID
810

911
from ._service_jobs import JobService
@@ -16,11 +18,30 @@
1618
class StudyService:
1719
_job_service: JobService
1820

21+
# context
22+
_user_id: UserID
23+
_product_name: ProductName
24+
1925
def __init__(
2026
self,
2127
job_service: JobService,
28+
user_id: UserID,
29+
product_name: ProductName,
2230
):
2331
self._job_service = job_service
32+
self._user_id = user_id
33+
self._product_name = product_name
34+
35+
# context
36+
if user_id != self._job_service._user_id:
37+
msg = f"User ID {user_id} does not match job service user ID {self._job_service._user_id}"
38+
raise ValueError(msg)
39+
if product_name != self._job_service._product_name:
40+
msg = f"Product name {product_name} does not match job service product name {self._job_service._product_name}"
41+
raise ValueError(msg)
42+
43+
self._user_id = user_id
44+
self._product_name = product_name
2445

2546
async def list_jobs(
2647
self,

services/api-server/src/simcore_service_api_server/api/dependencies/services.py

Lines changed: 17 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@
77
from models_library.products import ProductName
88
from models_library.users import UserID
99
from servicelib.rabbitmq import RabbitMQRPCClient
10+
from simcore_service_api_server._service_programs import ProgramService
1011
from simcore_service_api_server._service_studies import StudyService
1112

1213
from ..._service_jobs import JobService
@@ -76,21 +77,36 @@ def get_job_service(
7677
def get_solver_service(
7778
catalog_service: Annotated[CatalogService, Depends(get_catalog_service)],
7879
job_service: Annotated[JobService, Depends(get_job_service)],
80+
user_id: Annotated[UserID, Depends(get_current_user_id)],
81+
product_name: Annotated[ProductName, Depends(get_product_name)],
7982
) -> SolverService:
8083
"""
8184
"Assembles" the SolverService layer to the underlying service and client interfaces
8285
in the context of the rest controller (i.e. api/dependencies)
8386
"""
84-
8587
return SolverService(
8688
catalog_service=catalog_service,
8789
job_service=job_service,
90+
user_id=user_id,
91+
product_name=product_name,
8892
)
8993

9094

9195
def get_study_service(
9296
job_service: Annotated[JobService, Depends(get_job_service)],
97+
user_id: Annotated[UserID, Depends(get_current_user_id)],
98+
product_name: Annotated[ProductName, Depends(get_product_name)],
9399
) -> StudyService:
94100
return StudyService(
95101
job_service=job_service,
102+
user_id=user_id,
103+
product_name=product_name,
104+
)
105+
106+
107+
def get_program_service(
108+
catalog_service: Annotated[CatalogService, Depends(get_catalog_service)],
109+
) -> ProgramService:
110+
return ProgramService(
111+
_catalog_service=catalog_service,
96112
)

services/api-server/src/simcore_service_api_server/api/routes/programs.py

Lines changed: 7 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -31,8 +31,10 @@
3131
from ...models.schemas.jobs import Job, JobInputs
3232
from ...models.schemas.programs import Program, ProgramKeyId
3333
from ..dependencies.authentication import get_current_user_id, get_product_name
34+
from ..dependencies.services import get_job_service, get_program_service
3435

3536
_logger = logging.getLogger(__name__)
37+
3638
router = APIRouter()
3739

3840

@@ -49,7 +51,7 @@
4951
)
5052
async def list_programs(
5153
user_id: Annotated[PositiveInt, Depends(get_current_user_id)],
52-
program_service: Annotated[ProgramService, Depends()],
54+
program_service: Annotated[ProgramService, Depends(get_program_service)],
5355
url_for: Annotated[Callable, Depends(get_reverse_url_mapper)],
5456
product_name: Annotated[str, Depends(get_product_name)],
5557
page_params: Annotated[PaginationParams, Depends()],
@@ -89,7 +91,7 @@ async def list_programs(
8991
async def list_program_history(
9092
program_key: ProgramKeyId,
9193
user_id: Annotated[PositiveInt, Depends(get_current_user_id)],
92-
program_service: Annotated[ProgramService, Depends()],
94+
program_service: Annotated[ProgramService, Depends(get_program_service)],
9395
url_for: Annotated[Callable, Depends(get_reverse_url_mapper)],
9496
product_name: Annotated[str, Depends(get_product_name)],
9597
page_params: Annotated[PaginationParams, Depends()],
@@ -124,7 +126,7 @@ async def get_program_release(
124126
program_key: ProgramKeyId,
125127
version: VersionStr,
126128
user_id: Annotated[int, Depends(get_current_user_id)],
127-
program_service: Annotated[ProgramService, Depends()],
129+
program_service: Annotated[ProgramService, Depends(get_program_service)],
128130
url_for: Annotated[Callable, Depends(get_reverse_url_mapper)],
129131
product_name: Annotated[str, Depends(get_product_name)],
130132
) -> Program:
@@ -163,8 +165,8 @@ async def create_program_job(
163165
program_key: ProgramKeyId,
164166
version: VersionStr,
165167
user_id: Annotated[PositiveInt, Depends(get_current_user_id)],
166-
program_service: Annotated[ProgramService, Depends()],
167-
job_service: Annotated[JobService, Depends()],
168+
program_service: Annotated[ProgramService, Depends(get_program_service)],
169+
job_service: Annotated[JobService, Depends(get_job_service)],
168170
url_for: Annotated[Callable, Depends(get_reverse_url_mapper)],
169171
product_name: Annotated[str, Depends(get_product_name)],
170172
x_simcore_parent_project_uuid: Annotated[ProjectID | None, Header()] = None,

services/api-server/src/simcore_service_api_server/api/routes/solvers.py

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -22,7 +22,7 @@
2222
from ...services_rpc.catalog import CatalogService
2323
from ..dependencies.application import get_reverse_url_mapper
2424
from ..dependencies.authentication import get_current_user_id, get_product_name
25-
from ..dependencies.services import get_solver_service
25+
from ..dependencies.services import get_catalog_service, get_solver_service
2626
from ..dependencies.webserver_http import AuthSession, get_webserver_session
2727
from ._constants import (
2828
FMSG_CHANGELOG_NEW_IN_VERSION,
@@ -74,7 +74,7 @@
7474
)
7575
async def list_solvers(
7676
user_id: Annotated[int, Depends(get_current_user_id)],
77-
catalog_service: Annotated[CatalogService, Depends()],
77+
catalog_service: Annotated[CatalogService, Depends(get_catalog_service)],
7878
url_for: Annotated[Callable, Depends(get_reverse_url_mapper)],
7979
product_name: Annotated[str, Depends(get_product_name)],
8080
):
@@ -348,7 +348,7 @@ async def list_solver_ports(
348348
solver_key: SolverKeyId,
349349
version: VersionStr,
350350
user_id: Annotated[int, Depends(get_current_user_id)],
351-
catalog_service: Annotated[CatalogService, Depends()],
351+
catalog_service: Annotated[CatalogService, Depends(get_catalog_service)],
352352
product_name: Annotated[str, Depends(get_product_name)],
353353
):
354354
ports = await catalog_service.get_service_ports(

services/api-server/src/simcore_service_api_server/api/routes/solvers_jobs.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -34,7 +34,7 @@
3434
)
3535
from ..dependencies.application import get_reverse_url_mapper
3636
from ..dependencies.authentication import get_current_user_id, get_product_name
37-
from ..dependencies.services import get_api_client, get_solver_service
37+
from ..dependencies.services import get_api_client, get_job_service, get_solver_service
3838
from ..dependencies.webserver_http import AuthSession, get_webserver_session
3939
from ._constants import (
4040
FMSG_CHANGELOG_ADDED_IN_VERSION,
@@ -92,7 +92,7 @@ async def create_solver_job(
9292
inputs: JobInputs,
9393
user_id: Annotated[PositiveInt, Depends(get_current_user_id)],
9494
solver_service: Annotated[SolverService, Depends(get_solver_service)],
95-
job_service: Annotated[JobService, Depends()],
95+
job_service: Annotated[JobService, Depends(get_job_service)],
9696
url_for: Annotated[Callable, Depends(get_reverse_url_mapper)],
9797
product_name: Annotated[str, Depends(get_product_name)],
9898
hidden: Annotated[bool, Query()] = True,

services/api-server/src/simcore_service_api_server/api/routes/studies_jobs.py

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -225,6 +225,7 @@ async def create_study_job(
225225
async def get_study_job(
226226
study_id: StudyID,
227227
job_id: JobID,
228+
study_service: Annotated[StudyService, Depends(get_study_service)],
228229
):
229230
msg = f"get study job study_id={study_id!r} job_id={job_id!r}. SEE https://github.com/ITISFoundation/osparc-simcore/issues/4177"
230231
raise NotImplementedError(msg)

services/api-server/src/simcore_service_api_server/services_rpc/catalog.py

Lines changed: 1 addition & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,5 @@
11
from functools import partial
2-
from typing import Annotated
32

4-
from fastapi import Depends
53
from models_library.api_schemas_catalog.services import (
64
LatestServiceGet,
75
ServiceGetV2,
@@ -31,7 +29,6 @@
3129
ServiceForbiddenAccessError,
3230
)
3331

34-
from ..api.dependencies.rabbitmq import get_rabbitmq_rpc_client
3532
from ..exceptions.service_errors_utils import service_exception_mapper
3633

3734
_exception_mapper = partial(service_exception_mapper, service_name="CatalogService")
@@ -40,9 +37,7 @@
4037
class CatalogService:
4138
_client: RabbitMQRPCClient
4239

43-
def __init__(
44-
self, client: Annotated[RabbitMQRPCClient, Depends(get_rabbitmq_rpc_client)]
45-
):
40+
def __init__(self, client: RabbitMQRPCClient):
4641
self._client = client
4742

4843
async def list_latest_releases(

0 commit comments

Comments
 (0)