Skip to content

Commit 35e7048

Browse files
authored
🐛 Fix PO center invitations to include correct product info and links (#8261)
1 parent 656c83d commit 35e7048

File tree

5 files changed

+22
-8
lines changed

5 files changed

+22
-8
lines changed

services/web/server/src/simcore_service_webserver/invitations/_rest.py

Lines changed: 2 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,6 @@
1111
from pydantic import Field
1212
from servicelib.aiohttp.requests_validation import parse_request_body_as
1313
from servicelib.request_keys import RQT_USERID_KEY
14-
from yarl import URL
1514

1615
from .._meta import API_VTAG as VTAG
1716
from ..constants import RQ_PRODUCT_KEY
@@ -53,21 +52,19 @@ async def generate_invitation(request: web.Request):
5352
extra_credits_in_usd=body.extra_credits_in_usd,
5453
product=req_ctx.product_name,
5554
),
55+
request.url,
5656
)
5757
assert request.url.host # nosec
5858
assert generated.product == req_ctx.product_name # nosec
5959
assert generated.guest == body.guest # nosec
6060

61-
url = URL(f"{generated.invitation_url}")
62-
invitation_link = request.url.with_path(url.path).with_fragment(url.raw_fragment)
63-
6461
invitation = InvitationGenerated(
6562
product_name=generated.product,
6663
issuer=generated.issuer,
6764
guest=generated.guest,
6865
trial_account_days=generated.trial_account_days,
6966
extra_credits_in_usd=generated.extra_credits_in_usd,
7067
created=generated.created,
71-
invitation_link=f"{invitation_link}", # type: ignore[arg-type]
68+
invitation_link=generated.invitation_url,
7269
)
7370
return envelope_json_response(invitation.model_dump(exclude_none=True))

services/web/server/src/simcore_service_webserver/invitations/_service.py

Lines changed: 11 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,8 @@
88
ApiInvitationInputs,
99
)
1010
from models_library.emails import LowerCaseEmailStr
11-
from pydantic import AnyHttpUrl, TypeAdapter, ValidationError
11+
from pydantic import AnyHttpUrl, HttpUrl, TypeAdapter, ValidationError
12+
from yarl import URL
1213

1314
from ..groups.api import is_user_by_email_in_group
1415
from ..products.models import Product
@@ -134,7 +135,9 @@ async def extract_invitation(
134135

135136

136137
async def generate_invitation(
137-
app: web.Application, params: ApiInvitationInputs
138+
app: web.Application,
139+
params: ApiInvitationInputs,
140+
product_origin_url: URL,
138141
) -> ApiInvitationContentAndLink:
139142
"""
140143
Raises:
@@ -145,4 +148,10 @@ async def generate_invitation(
145148
invitation: ApiInvitationContentAndLink = await get_invitations_service_api(
146149
app=app
147150
).generate_invitation(params)
151+
152+
_normalized_url = URL(f"{invitation.invitation_url}")
153+
invitation.invitation_url = HttpUrl(
154+
f"{product_origin_url.with_path(_normalized_url.path).with_fragment(_normalized_url.raw_fragment)}"
155+
)
156+
148157
return invitation

services/web/server/src/simcore_service_webserver/users/_controller/rest/accounts_rest.py

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -164,10 +164,13 @@ async def approve_user_account(request: web.Request) -> web.Response:
164164
guest=approval_data.email,
165165
trial_account_days=approval_data.invitation.trial_account_days,
166166
extra_credits_in_usd=approval_data.invitation.extra_credits_in_usd,
167+
product=req_ctx.product_name,
167168
)
168169

169170
invitation_result = await invitations_service.generate_invitation(
170-
request.app, params=invitation_params
171+
request.app,
172+
params=invitation_params,
173+
product_origin_url=request.url.origin(),
171174
)
172175

173176
assert ( # nosec

services/web/server/tests/unit/with_dbs/03/invitations/test_login_handlers_registration_invitations.py

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -153,18 +153,22 @@ async def _register_account(invitation_url: HttpUrl, product_deployed: ProductNa
153153
invitation_product_a = await generate_invitation(
154154
client.app,
155155
ApiInvitationInputs(issuer="PO", guest=guest_email, product=product_a),
156+
product_origin_url=URL("http://product_a.com/some/path").origin(),
156157
)
157158
# 2. PO creates invitation for product B
158159
invitation_product_b = await generate_invitation(
159160
client.app,
160161
ApiInvitationInputs(issuer="PO", guest=guest_email, product=product_b),
162+
product_origin_url=URL("http://product_b.com/some/path").origin(),
161163
)
162164

163165
# CAN register for product A in deploy of product A
166+
assert invitation_product_a.invitation_url.host == "product_a.com"
164167
response = await _register_account(invitation_product_a.invitation_url, product_a)
165168
await assert_status(response, status.HTTP_200_OK)
166169

167170
# CANNOT register in product B in deploy of product A
171+
assert invitation_product_b.invitation_url.host == "product_b.com"
168172
response = await _register_account(invitation_product_b.invitation_url, product_a)
169173
await assert_status(response, status.HTTP_409_CONFLICT)
170174

services/web/server/tests/unit/with_dbs/03/invitations/test_users_accounts_rest_registration.py

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -595,6 +595,7 @@ async def test_approve_user_account_with_full_invitation_details(
595595
assert invitation_data["issuer"] == str(logged_user["id"])
596596
assert invitation_data["trial_account_days"] == 30
597597
assert invitation_data["extra_credits_in_usd"] == 100.0
598+
assert invitation_data["product"] == product_name
598599
assert "invitation_url" in invitation_data
599600

600601

0 commit comments

Comments
 (0)