Skip to content

Commit 98d92af

Browse files
committed
deprecating Storage
1 parent 9043d61 commit 98d92af

File tree

8 files changed

+44
-64
lines changed

8 files changed

+44
-64
lines changed

packages/postgres-database/src/simcore_postgres_database/utils_users.py

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -107,12 +107,13 @@ async def new_user(
107107
password_hash: str,
108108
status: UserStatus,
109109
expires_at: datetime | None,
110+
role: UserRole = UserRole.USER,
110111
) -> UserRow:
111112
user_data: dict[str, Any] = {
112113
"name": _generate_username_from_email(email),
113114
"email": email,
114115
"status": status,
115-
"role": UserRole.USER,
116+
"role": role,
116117
"expires_at": expires_at,
117118
}
118119

services/web/server/src/simcore_service_webserver/garbage_collector/_core_guests.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -159,7 +159,7 @@ async def remove_guest_user_with_all_its_resources(
159159
"Deleting user %s because it is a GUEST",
160160
f"{user_id=}",
161161
)
162-
await users_service.delete_user_without_projects(app, user_id)
162+
await users_service.delete_user_without_projects(app, user_id=user_id)
163163

164164
except (
165165
DatabaseError,

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

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -40,6 +40,7 @@
4040
InvitationsServiceUnavailableError,
4141
)
4242
from ..products.models import Product
43+
from ..users import users_service
4344
from . import _auth_service, _confirmation_service
4445
from ._login_repository_legacy import (
4546
AsyncpgStorage,
@@ -144,7 +145,9 @@ async def check_other_registrations(
144145
)
145146
if drop_previous_registration:
146147
if not _confirmation:
147-
await db.delete_user(user=dict(user))
148+
await users_service.delete_user_without_projects(
149+
app, user_id=user["id"], clean_cache=False
150+
)
148151
else:
149152
await db.delete_confirmation_and_user(
150153
user_id=user["id"], confirmation=_confirmation

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

Lines changed: 0 additions & 32 deletions
Original file line numberDiff line numberDiff line change
@@ -48,38 +48,6 @@ def __init__(
4848
self.user_tbl = user_table_name
4949
self.confirm_tbl = confirmation_table_name
5050

51-
#
52-
# CRUD user
53-
#
54-
55-
async def create_user(self, data: dict[str, Any]) -> dict[str, Any]:
56-
async with self.pool.acquire() as conn:
57-
user_id = await _login_repository_legacy_sql.insert(
58-
conn, self.user_tbl, data
59-
)
60-
new_user = await _login_repository_legacy_sql.find_one(
61-
conn, self.user_tbl, {"id": user_id}
62-
)
63-
assert new_user # nosec
64-
data.update(
65-
id=new_user["id"],
66-
created_at=new_user["created_at"],
67-
primary_gid=new_user["primary_gid"],
68-
)
69-
return data
70-
71-
async def update_user(self, user: dict[str, Any], updates: dict[str, Any]) -> None:
72-
async with self.pool.acquire() as conn:
73-
await _login_repository_legacy_sql.update(
74-
conn, self.user_tbl, {"id": user["id"]}, updates
75-
)
76-
77-
async def delete_user(self, user: dict[str, Any]) -> None:
78-
async with self.pool.acquire() as conn:
79-
await _login_repository_legacy_sql.delete(
80-
conn, self.user_tbl, {"id": user["id"]}
81-
)
82-
8351
#
8452
# CRUD confirmation
8553
#

services/web/server/src/simcore_service_webserver/studies_dispatcher/_users.py

Lines changed: 28 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -17,17 +17,21 @@
1717

1818
import redis.asyncio as aioredis
1919
from aiohttp import web
20+
from common_library.users_enums import UserRole, UserStatus
2021
from models_library.emails import LowerCaseEmailStr
22+
from models_library.users import UserID
2123
from pydantic import BaseModel, TypeAdapter
2224
from redis.exceptions import LockNotOwnedError
2325
from servicelib.aiohttp.application_keys import APP_FIRE_AND_FORGET_TASKS_KEY
2426
from servicelib.logging_utils import log_decorator
2527
from servicelib.utils import fire_and_forget_task
2628
from servicelib.utils_secrets import generate_password
29+
from simcore_postgres_database.utils_users import UsersRepo
2730

31+
from ..db.plugin import get_asyncpg_engine
2832
from ..garbage_collector.settings import GUEST_USER_RC_LOCK_FORMAT
29-
from ..groups.api import auto_add_user_to_product_group
30-
from ..login._login_service import ACTIVE, GUEST
33+
from ..groups import api as groups_service
34+
from ..login._login_service import GUEST
3135
from ..login.login_repository_legacy import AsyncpgStorage, get_plugin_storage
3236
from ..products import products_web
3337
from ..redis import get_redis_lock_manager_client
@@ -109,31 +113,33 @@ async def create_temporary_guest_user(request: web.Request):
109113
password = generate_password(length=12)
110114
expires_at = datetime.utcnow() + settings.STUDIES_GUEST_ACCOUNT_LIFETIME
111115

112-
usr = None
116+
user_id: UserID | None = None
117+
118+
repo = UsersRepo(get_asyncpg_engine(request.app))
119+
113120
try:
114121
async with redis_locks_client.lock(
115122
GUEST_USER_RC_LOCK_FORMAT.format(user_id=random_user_name),
116123
timeout=MAX_DELAY_TO_CREATE_USER,
117124
):
118125
# NOTE: usr Dict is incomplete, e.g. does not contain primary_gid
119-
usr = await db.create_user(
120-
{
121-
"name": random_user_name,
122-
"email": email,
123-
"password_hash": security_service.encrypt_password(password),
124-
"status": ACTIVE,
125-
"role": GUEST,
126-
"expires_at": expires_at,
127-
}
126+
user_row = await repo.new_user(
127+
email=email,
128+
password_hash=security_service.encrypt_password(password),
129+
status=UserStatus.ACTIVE,
130+
role=UserRole.GUEST,
131+
expires_at=expires_at,
128132
)
129-
user = await users_service.get_user(request.app, usr["id"])
130-
await auto_add_user_to_product_group(
131-
request.app, user_id=user["id"], product_name=product_name
133+
user_id = user_row.id
134+
135+
user = await users_service.get_user(request.app, user_id)
136+
await groups_service.auto_add_user_to_product_group(
137+
request.app, user_id=user_id, product_name=product_name
132138
)
133139

134140
# (2) read details above
135141
await redis_locks_client.lock(
136-
GUEST_USER_RC_LOCK_FORMAT.format(user_id=user["id"]),
142+
GUEST_USER_RC_LOCK_FORMAT.format(user_id=user_id),
137143
timeout=MAX_DELAY_TO_GUEST_FIRST_CONNECTION,
138144
).acquire()
139145

@@ -146,14 +152,16 @@ async def create_temporary_guest_user(request: web.Request):
146152
# stop creating GUEST users.
147153

148154
# NOTE: here we cleanup but if any trace is left it will be deleted by gc
149-
if usr is not None and usr.get("id"):
155+
if user_id:
150156

151-
async def _cleanup(draft_user):
157+
async def _cleanup():
152158
with suppress(Exception):
153-
await db.delete_user(draft_user)
159+
await users_service.delete_user_without_projects(
160+
request.app, user_id=user_id, clean_cache=False
161+
)
154162

155163
fire_and_forget_task(
156-
_cleanup(usr),
164+
_cleanup(),
157165
task_suffix_name="cleanup_temporary_guest_user",
158166
fire_and_forget_tasks_collection=request.app[
159167
APP_FIRE_AND_FORGET_TASKS_KEY

services/web/server/src/simcore_service_webserver/users/_users_service.py

Lines changed: 7 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -213,7 +213,9 @@ async def get_user_invoice_address(
213213
#
214214

215215

216-
async def delete_user_without_projects(app: web.Application, user_id: UserID) -> None:
216+
async def delete_user_without_projects(
217+
app: web.Application, *, user_id: UserID, clean_cache: bool = True
218+
) -> None:
217219
"""Deletes a user from the database if the user exists"""
218220
# WARNING: user cannot be deleted without deleting first all ist project
219221
# otherwise this function will raise asyncpg.exceptions.ForeignKeyViolationError
@@ -228,9 +230,10 @@ async def delete_user_without_projects(app: web.Application, user_id: UserID) ->
228230
)
229231
return
230232

231-
# This user might be cached in the auth. If so, any request
232-
# with this user-id will get thru producing unexpected side-effects
233-
await security_service.clean_auth_policy_cache(app)
233+
if clean_cache:
234+
# This user might be cached in the auth. If so, any request
235+
# with this user-id will get thru producing unexpected side-effects
236+
await security_service.clean_auth_policy_cache(app)
234237

235238

236239
async def set_user_as_deleted(app: web.Application, *, user_id: UserID) -> None:

services/web/server/tests/unit/with_dbs/03/login/test_login_logout.py

Lines changed: 1 addition & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -15,8 +15,7 @@ async def test_logout(client: TestClient, db: AsyncpgStorage):
1515
logout_url = client.app.router["auth_logout"].url_for()
1616
protected_url = client.app.router["get_my_profile"].url_for()
1717

18-
async with LoggedUser(client) as user:
19-
18+
async with LoggedUser(client):
2019
# try to access protected page
2120
response = await client.get(f"{protected_url}")
2221
assert response.url.path == protected_url.path
@@ -31,5 +30,3 @@ async def test_logout(client: TestClient, db: AsyncpgStorage):
3130
response = await client.get(f"{protected_url}")
3231
assert response.url.path == protected_url.path
3332
await assert_status(response, status.HTTP_401_UNAUTHORIZED)
34-
35-
await db.delete_user(user)

services/web/server/tests/unit/with_dbs/04/studies_dispatcher/test_studies_dispatcher_studies_access.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -421,7 +421,7 @@ async def enforce_garbage_collect_guest(uid):
421421
)
422422
await delete_task
423423

424-
await delete_user_without_projects(app, uid)
424+
await delete_user_without_projects(app, user_id=uid)
425425
return uid
426426

427427
user_id = await enforce_garbage_collect_guest(uid=data["id"])

0 commit comments

Comments
 (0)