Skip to content

Commit e1bff2b

Browse files
committed
feat: implement confirmation service setup and integrate with invitations service
1 parent 661099c commit e1bff2b

File tree

5 files changed

+39
-13
lines changed

5 files changed

+39
-13
lines changed
Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
from aiohttp import web
2+
3+
from ._confirmation_service import ConfirmationService
4+
5+
CONFIRMATION_SERVICE_APPKEY = web.AppKey("CONFIRMATION_SERVICE", ConfirmationService)

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

Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,20 @@
1+
import logging
12
from urllib.parse import quote
23

34
from aiohttp import web
5+
from simcore_service_webserver.login._application_keys import (
6+
CONFIRMATION_SERVICE_APPKEY,
7+
)
8+
from simcore_service_webserver.login.settings import get_plugin_options
49
from yarl import URL
510

11+
from ..application_setup import ensure_single_setup
12+
from ..db.plugin import get_asyncpg_engine
13+
from ._confirmation_repository import ConfirmationRepository
14+
from ._confirmation_service import ConfirmationService
15+
16+
_logger = logging.getLogger(__name__)
17+
618

719
def _url_for_confirmation(app: web.Application, code: str) -> URL:
820
# NOTE: this is in a query parameter, and can contain ? for example.
@@ -14,3 +26,17 @@ def make_confirmation_link(request: web.Request, code: str) -> str:
1426
assert code # nosec
1527
link = _url_for_confirmation(request.app, code=code)
1628
return f"{request.scheme}://{request.host}{link}"
29+
30+
31+
@ensure_single_setup(__name__, logger=_logger)
32+
def setup_confirmation(app: web.Application) -> None:
33+
"""Sets up the confirmation service in the application."""
34+
35+
async def _on_cleanup_ctx(app: web.Application):
36+
repository = ConfirmationRepository(get_asyncpg_engine(app))
37+
options = get_plugin_options(app)
38+
app[CONFIRMATION_SERVICE_APPKEY] = ConfirmationService(repository, options)
39+
40+
yield
41+
42+
app.cleanup_ctx.append(_on_cleanup_ctx)

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

Lines changed: 2 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -6,19 +6,12 @@
66

77
from aiohttp import web
88

9-
from ....db.plugin import get_asyncpg_engine
10-
from ..._confirmation_repository import ConfirmationRepository
9+
from ..._application_keys import CONFIRMATION_SERVICE_APPKEY
1110
from ..._confirmation_service import ConfirmationService
12-
from ...settings import get_plugin_options
1311

1412

1513
def get_confirmation_service(app: web.Application) -> ConfirmationService:
1614
"""Get confirmation service instance from app.
17-
18-
Creates a ConfirmationService with proper repository and options injection.
1915
Used across multiple REST controllers for confirmation operations.
2016
"""
21-
engine = get_asyncpg_engine(app)
22-
repository = ConfirmationRepository(engine)
23-
options = get_plugin_options(app)
24-
return ConfirmationService(repository, options)
17+
return app[CONFIRMATION_SERVICE_APPKEY]

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

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -42,7 +42,7 @@
4242
from ..products.models import Product
4343
from ..users import users_service
4444
from . import _auth_service
45-
from ._controller.rest._rest_dependencies import get_confirmation_service
45+
from ._application_keys import CONFIRMATION_SERVICE_APPKEY
4646
from ._models import (
4747
BaseConfirmationTokenDict,
4848
ConfirmationTokenDict,
@@ -128,7 +128,7 @@ async def check_other_registrations(
128128
# w/ an expired confirmation will get deleted and its account (i.e. email)
129129
# can be overtaken by this new registration
130130
#
131-
confirmation_service = get_confirmation_service(app)
131+
confirmation_service = app[CONFIRMATION_SERVICE_APPKEY]
132132
_confirmation = await confirmation_service.get_confirmation(
133133
filter_dict={
134134
"user_id": user["id"],
@@ -194,7 +194,7 @@ async def create_invitation_token(
194194
trial_account_days=trial_days,
195195
extra_credits_in_usd=extra_credits_in_usd,
196196
)
197-
confirmation_service = get_confirmation_service(app)
197+
confirmation_service = app[CONFIRMATION_SERVICE_APPKEY]
198198
confirmation = await confirmation_service.create_confirmation(
199199
user_id=user_id,
200200
action=ConfirmationAction.INVITATION.name,
@@ -307,7 +307,7 @@ async def check_and_consume_invitation(
307307
)
308308

309309
# database-type invitations
310-
confirmation_service = get_confirmation_service(app)
310+
confirmation_service = app[CONFIRMATION_SERVICE_APPKEY]
311311
if confirmation := await confirmation_service.validate_confirmation_code(
312312
invitation_code
313313
):

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

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,7 @@
2525
from ..products.plugin import setup_products
2626
from ..redis import setup_redis
2727
from ..rest.plugin import setup_rest
28+
from ._confirmation_web import setup_confirmation
2829
from ._controller.rest import (
2930
auth,
3031
change,
@@ -113,6 +114,7 @@ def setup_login(app: web.Application):
113114
setup_rest(app)
114115
setup_email(app)
115116
setup_invitations(app)
117+
setup_confirmation(app)
116118

117119
# routes
118120

0 commit comments

Comments
 (0)