Skip to content

Commit e3a498c

Browse files
committed
✨ Refactor confirmation service integration: centralize service retrieval in _rest_dependencies.py
1 parent e5fd903 commit e3a498c

File tree

5 files changed

+38
-53
lines changed

5 files changed

+38
-53
lines changed
Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,24 @@
1+
"""Common dependency injection helpers for REST controllers.
2+
3+
This module provides factory functions for creating service instances
4+
that are commonly used across multiple REST controllers in the login module.
5+
"""
6+
7+
from aiohttp import web
8+
9+
from ....db.plugin import get_asyncpg_engine
10+
from ..._confirmation_repository import ConfirmationRepository
11+
from ..._confirmation_service import ConfirmationService
12+
from ...settings import get_plugin_options
13+
14+
15+
def get_confirmation_service(app: web.Application) -> ConfirmationService:
16+
"""Get confirmation service instance from app.
17+
18+
Creates a ConfirmationService with proper repository and options injection.
19+
Used across multiple REST controllers for confirmation operations.
20+
"""
21+
engine = get_asyncpg_engine(app)
22+
repository = ConfirmationRepository(engine)
23+
options = get_plugin_options(app)
24+
return ConfirmationService(repository, options)

services/web/server/src/simcore_service_webserver/login/_controller/rest/change.py

Lines changed: 3 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -16,8 +16,6 @@
1616
from ....utils_rate_limiting import global_rate_limit_route
1717
from ....web_utils import flash_response
1818
from ... import _auth_service, _confirmation_web
19-
from ..._confirmation_repository import ConfirmationRepository
20-
from ..._confirmation_service import ConfirmationService
2119
from ..._emails_service import get_template_path, send_email_from_template
2220
from ..._login_service import (
2321
ACTIVE,
@@ -34,20 +32,12 @@
3432
)
3533
from ...decorators import login_required
3634
from ...errors import WrongPasswordError
37-
from ...settings import get_plugin_options
35+
from ._rest_dependencies import get_confirmation_service
3836
from .change_schemas import ChangeEmailBody, ChangePasswordBody, ResetPasswordBody
3937

4038
_logger = logging.getLogger(__name__)
4139

4240

43-
def _get_confirmation_service(app: web.Application) -> ConfirmationService:
44-
"""Get confirmation service instance from app."""
45-
engine = app["postgres_db_engine"]
46-
repository = ConfirmationRepository(engine)
47-
options = get_plugin_options(app)
48-
return ConfirmationService(repository, options)
49-
50-
5141
routes = RouteTableDef()
5242

5343

@@ -184,7 +174,7 @@ def _get_error_context(
184174
try:
185175
# Confirmation token that includes code to `complete_reset_password`.
186176
# Recreated if non-existent or expired (Guideline #2)
187-
confirmation_service = _get_confirmation_service(request.app)
177+
confirmation_service = get_confirmation_service(request.app)
188178
confirmation = (
189179
await confirmation_service.get_or_create_confirmation_without_data(
190180
user_id=user["id"], action="RESET_PASSWORD"
@@ -227,7 +217,7 @@ def _get_error_context(
227217
async def initiate_change_email(request: web.Request):
228218
# NOTE: This code have been intentially disabled in https://github.com/ITISFoundation/osparc-simcore/pull/5472
229219
product: Product = products_web.get_current_product(request)
230-
confirmation_service = _get_confirmation_service(request.app)
220+
confirmation_service = get_confirmation_service(request.app)
231221

232222
request_body = await parse_request_body_as(ChangeEmailBody, request)
233223

services/web/server/src/simcore_service_webserver/login/_controller/rest/confirmation.py

Lines changed: 5 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -30,8 +30,6 @@
3030
_security_service,
3131
_twofa_service,
3232
)
33-
from ..._confirmation_repository import ConfirmationRepository
34-
from ..._confirmation_service import ConfirmationService
3533
from ..._login_repository_legacy import (
3634
ConfirmationTokenDict,
3735
)
@@ -54,6 +52,7 @@
5452
get_plugin_options,
5553
get_plugin_settings,
5654
)
55+
from ._rest_dependencies import get_confirmation_service
5756
from .confirmation_schemas import (
5857
CodePathParam,
5958
PhoneConfirmationBody,
@@ -64,14 +63,6 @@
6463
_logger = logging.getLogger(__name__)
6564

6665

67-
def _get_confirmation_service(app: web.Application) -> ConfirmationService:
68-
"""Get confirmation service instance from app."""
69-
engine = app["postgres_db_engine"]
70-
repository = ConfirmationRepository(engine)
71-
options = get_plugin_options(app)
72-
return ConfirmationService(repository, options)
73-
74-
7566
def _confirmation_to_legacy_dict(confirmation: Confirmation) -> ConfirmationTokenDict:
7667
"""Convert new Confirmation model to legacy ConfirmationTokenDict format."""
7768
return {
@@ -91,7 +82,7 @@ async def _handle_confirm_registration(
9182
product_name: ProductName,
9283
confirmation: Confirmation,
9384
):
94-
confirmation_service = _get_confirmation_service(app)
85+
confirmation_service = get_confirmation_service(app)
9586
user_id = confirmation.user_id
9687

9788
# activate user and consume confirmation token
@@ -114,7 +105,7 @@ async def _handle_confirm_registration(
114105
async def _handle_confirm_change_email(
115106
app: web.Application, confirmation: Confirmation
116107
):
117-
confirmation_service = _get_confirmation_service(app)
108+
confirmation_service = get_confirmation_service(app)
118109
user_id = confirmation.user_id
119110

120111
# update and consume confirmation token
@@ -146,7 +137,7 @@ async def validate_confirmation_and_redirect(request: web.Request):
146137
"""
147138
cfg: LoginOptions = get_plugin_options(request.app)
148139
product: Product = products_web.get_current_product(request)
149-
confirmation_service = _get_confirmation_service(request.app)
140+
confirmation_service = get_confirmation_service(request.app)
150141

151142
path_params = parse_request_path_parameters_as(CodePathParam, request)
152143

@@ -267,7 +258,7 @@ async def complete_reset_password(request: web.Request):
267258
- Code is provided via email by calling first initiate_reset_password
268259
"""
269260
product: Product = products_web.get_current_product(request)
270-
confirmation_service = _get_confirmation_service(request.app)
261+
confirmation_service = get_confirmation_service(request.app)
271262

272263
path_params = parse_request_path_parameters_as(CodePathParam, request)
273264
request_body = await parse_request_body_as(ResetPasswordConfirmation, request)

services/web/server/src/simcore_service_webserver/login/_controller/rest/registration.py

Lines changed: 2 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -30,8 +30,6 @@
3030
_security_service,
3131
_twofa_service,
3232
)
33-
from ..._confirmation_repository import ConfirmationRepository
34-
from ..._confirmation_service import ConfirmationService
3533
from ..._emails_service import get_template_path, send_email_from_template
3634
from ..._invitations_service import (
3735
ConfirmedInvitationData,
@@ -54,9 +52,9 @@
5452
)
5553
from ...settings import (
5654
LoginSettingsForProduct,
57-
get_plugin_options,
5855
get_plugin_settings,
5956
)
57+
from ._rest_dependencies import get_confirmation_service
6058
from .registration_schemas import (
6159
InvitationCheck,
6260
InvitationInfo,
@@ -67,14 +65,6 @@
6765
_logger = logging.getLogger(__name__)
6866

6967

70-
def _get_confirmation_service(app: web.Application) -> ConfirmationService:
71-
"""Get confirmation service instance from app."""
72-
engine = app["postgres_db_engine"]
73-
repository = ConfirmationRepository(engine)
74-
options = get_plugin_options(app)
75-
return ConfirmationService(repository, options)
76-
77-
7868
routes = RouteTableDef()
7969

8070

@@ -225,7 +215,7 @@ async def register(request: web.Request):
225215

226216
if settings.LOGIN_REGISTRATION_CONFIRMATION_REQUIRED:
227217
# Confirmation required: send confirmation email
228-
confirmation_service = _get_confirmation_service(request.app)
218+
confirmation_service = get_confirmation_service(request.app)
229219
_confirmation: Confirmation = await confirmation_service.create_confirmation(
230220
user_id=user["id"],
231221
action="REGISTRATION",

services/web/server/src/simcore_service_webserver/login/_invitations_service.py

Lines changed: 4 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -42,8 +42,7 @@
4242
from ..products.models import Product
4343
from ..users import users_service
4444
from . import _auth_service
45-
from ._confirmation_repository import ConfirmationRepository
46-
from ._confirmation_service import ConfirmationService
45+
from ._controller.rest._rest_dependencies import get_confirmation_service
4746
from ._login_repository_legacy import (
4847
BaseConfirmationTokenDict,
4948
ConfirmationTokenDict,
@@ -53,19 +52,10 @@
5352
MSG_INVITATIONS_CONTACT_SUFFIX,
5453
MSG_USER_DISABLED,
5554
)
56-
from .settings import get_plugin_options
5755

5856
_logger = logging.getLogger(__name__)
5957

6058

61-
def _get_confirmation_service(app: web.Application) -> ConfirmationService:
62-
"""Get confirmation service instance from app."""
63-
engine = app["postgres_db_engine"]
64-
repository = ConfirmationRepository(engine)
65-
options = get_plugin_options(app)
66-
return ConfirmationService(repository, options)
67-
68-
6959
class ConfirmationTokenInfoDict(ConfirmationTokenDict):
7060
expires: datetime
7161
url: str
@@ -140,7 +130,7 @@ async def check_other_registrations(
140130
# w/ an expired confirmation will get deleted and its account (i.e. email)
141131
# can be overtaken by this new registration
142132
#
143-
confirmation_service = _get_confirmation_service(app)
133+
confirmation_service = get_confirmation_service(app)
144134
_confirmation = await confirmation_service.get_confirmation(
145135
filter_dict={
146136
"user_id": user["id"],
@@ -206,7 +196,7 @@ async def create_invitation_token(
206196
trial_account_days=trial_days,
207197
extra_credits_in_usd=extra_credits_in_usd,
208198
)
209-
confirmation_service = _get_confirmation_service(app)
199+
confirmation_service = get_confirmation_service(app)
210200
confirmation = await confirmation_service.create_confirmation(
211201
user_id=user_id,
212202
action=ConfirmationAction.INVITATION.name,
@@ -319,7 +309,7 @@ async def check_and_consume_invitation(
319309
)
320310

321311
# database-type invitations
322-
confirmation_service = _get_confirmation_service(app)
312+
confirmation_service = get_confirmation_service(app)
323313
if confirmation := await confirmation_service.validate_confirmation_code(
324314
invitation_code
325315
):

0 commit comments

Comments
 (0)