Skip to content

Commit 23ec8aa

Browse files
authored
♻️ Major Refactor: Isolate webserver's user Subdomains & Modernize Internal Structure (🚨) (#8083)
1 parent dbd3129 commit 23ec8aa

File tree

106 files changed

+1057
-786
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

106 files changed

+1057
-786
lines changed

api/specs/web-server/_users.py

Lines changed: 8 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -14,20 +14,22 @@
1414
MyProfilePatch,
1515
MyTokenCreate,
1616
MyTokenGet,
17+
TokenPathParams,
1718
UserGet,
1819
UsersSearch,
1920
)
2021
from models_library.api_schemas_webserver.users_preferences import PatchRequestBody
2122
from models_library.generics import Envelope
2223
from models_library.user_preferences import PreferenceIdentifier
2324
from simcore_service_webserver._meta import API_VTAG
24-
from simcore_service_webserver.users._notifications import (
25+
from simcore_service_webserver.user_notifications._controller.rest.user_notification_rest import (
26+
NotificationPathParams,
27+
)
28+
from simcore_service_webserver.user_notifications._models import (
2529
UserNotification,
2630
UserNotificationCreate,
2731
UserNotificationPatch,
2832
)
29-
from simcore_service_webserver.users._notifications_rest import _NotificationPathParams
30-
from simcore_service_webserver.users._tokens_rest import _TokenPathParams
3133

3234
router = APIRouter(prefix=f"/{API_VTAG}", tags=["users"])
3335

@@ -76,15 +78,15 @@ async def create_token(_body: MyTokenCreate): ...
7678
response_model=Envelope[MyTokenGet],
7779
)
7880
async def get_token(
79-
_path: Annotated[_TokenPathParams, Depends()],
81+
_path: Annotated[TokenPathParams, Depends()],
8082
): ...
8183

8284

8385
@router.delete(
8486
"/me/tokens/{service}",
8587
status_code=status.HTTP_204_NO_CONTENT,
8688
)
87-
async def delete_token(_path: Annotated[_TokenPathParams, Depends()]): ...
89+
async def delete_token(_path: Annotated[TokenPathParams, Depends()]): ...
8890

8991

9092
@router.get(
@@ -108,7 +110,7 @@ async def create_user_notification(
108110
status_code=status.HTTP_204_NO_CONTENT,
109111
)
110112
async def mark_notification_as_read(
111-
_path: Annotated[_NotificationPathParams, Depends()],
113+
_path: Annotated[NotificationPathParams, Depends()],
112114
_body: UserNotificationPatch,
113115
): ...
114116

packages/models-library/src/models_library/api_schemas_webserver/users.py

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@
1111
from models_library.rest_filters import Filters
1212
from models_library.rest_pagination import PageQueryParameters
1313
from pydantic import (
14+
BaseModel,
1415
ConfigDict,
1516
EmailStr,
1617
Field,
@@ -334,6 +335,10 @@ def _consistency_check(cls, v, info: ValidationInfo):
334335
#
335336

336337

338+
class TokenPathParams(BaseModel):
339+
service: str
340+
341+
337342
class MyTokenCreate(InputSchemaWithoutCamelCase):
338343
service: Annotated[
339344
IDStr,

packages/service-library/src/servicelib/aiohttp/observer.py

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@
88
from collections.abc import Callable
99

1010
from aiohttp import web
11+
from servicelib.aiohttp.application_setup import ensure_single_setup
1112

1213
from ..utils import logged_gather
1314

@@ -17,10 +18,10 @@
1718
_APP_OBSERVER_EVENTS_REGISTRY_KEY = "{__name__}.event_registry"
1819

1920

20-
class ObserverRegistryNotFoundError(RuntimeError):
21-
...
21+
class ObserverRegistryNotFoundError(RuntimeError): ...
2222

2323

24+
@ensure_single_setup(__name__, logger=log)
2425
def setup_observer_registry(app: web.Application):
2526
# only once
2627
app.setdefault(_APP_OBSERVER_EVENTS_REGISTRY_KEY, defaultdict(list))

services/web/server/src/simcore_service_webserver/conversations/_conversation_message_service.py

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,7 @@
1717
from models_library.users import UserID
1818

1919
# Import or define SocketMessageDict
20-
from ..users.api import get_user_primary_group_id
20+
from ..users import users_service
2121
from . import _conversation_message_repository
2222
from ._conversation_service import _get_recipients
2323
from ._socketio import (
@@ -39,7 +39,7 @@ async def create_message(
3939
content: str,
4040
type_: ConversationMessageType,
4141
) -> ConversationMessageGetDB:
42-
_user_group_id = await get_user_primary_group_id(app, user_id=user_id)
42+
_user_group_id = await users_service.get_user_primary_group_id(app, user_id=user_id)
4343

4444
created_message = await _conversation_message_repository.create(
4545
app,
@@ -110,7 +110,7 @@ async def delete_message(
110110
message_id=message_id,
111111
)
112112

113-
_user_group_id = await get_user_primary_group_id(app, user_id=user_id)
113+
_user_group_id = await users_service.get_user_primary_group_id(app, user_id=user_id)
114114

115115
await notify_conversation_message_deleted(
116116
app,

services/web/server/src/simcore_service_webserver/conversations/_conversation_service.py

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -22,8 +22,8 @@
2222
notify_conversation_updated,
2323
)
2424
from ..projects._groups_repository import list_project_groups
25+
from ..users import users_service
2526
from ..users._users_service import get_users_in_group
26-
from ..users.api import get_user_primary_group_id
2727
from . import _conversation_repository
2828

2929
_logger = logging.getLogger(__name__)
@@ -52,7 +52,7 @@ async def create_conversation(
5252
if project_uuid is None:
5353
raise NotImplementedError
5454

55-
_user_group_id = await get_user_primary_group_id(app, user_id=user_id)
55+
_user_group_id = await users_service.get_user_primary_group_id(app, user_id=user_id)
5656

5757
created_conversation = await _conversation_repository.create(
5858
app,
@@ -121,7 +121,7 @@ async def delete_conversation(
121121
conversation_id=conversation_id,
122122
)
123123

124-
_user_group_id = await get_user_primary_group_id(app, user_id=user_id)
124+
_user_group_id = await users_service.get_user_primary_group_id(app, user_id=user_id)
125125

126126
await notify_conversation_deleted(
127127
app,

services/web/server/src/simcore_service_webserver/director_v2/_director_v2_service.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -28,7 +28,7 @@
2828
from ..products import products_service
2929
from ..products.models import Product
3030
from ..projects import projects_wallets_service
31-
from ..users import preferences_api as user_preferences_service
31+
from ..user_preferences import user_preferences_service
3232
from ..users.exceptions import UserDefaultWalletNotFoundError
3333
from ..wallets import api as wallets_service
3434
from ._client import DirectorV2RestClient

services/web/server/src/simcore_service_webserver/exporter/_handlers.py

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,7 @@
1818
from ..projects._projects_service import create_user_notification_cb
1919
from ..redis import get_redis_lock_manager_client_sdk
2020
from ..security.decorators import permission_required
21-
from ..users.api import get_user_fullname
21+
from ..users import users_service
2222
from ._formatter.archive import get_sds_archive_path
2323
from .exceptions import SDSException
2424
from .utils import CleanupFileResponse
@@ -52,7 +52,8 @@ async def export_project(request: web.Request):
5252
project_uuid=project_uuid,
5353
status=ProjectStatus.EXPORTING,
5454
owner=Owner(
55-
user_id=user_id, **await get_user_fullname(request.app, user_id=user_id)
55+
user_id=user_id,
56+
**await users_service.get_user_fullname(request.app, user_id=user_id),
5657
),
5758
notification_cb=create_user_notification_cb(
5859
user_id, ProjectID(f"{project_uuid}"), request.app

services/web/server/src/simcore_service_webserver/folders/_folders_service.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,7 @@
1313
from pydantic import NonNegativeInt
1414

1515
from ..projects._projects_service import delete_project_by_user
16-
from ..users.api import get_user
16+
from ..users.users_service import get_user
1717
from ..workspaces.api import check_user_workspace_access
1818
from ..workspaces.errors import (
1919
WorkspaceAccessForbiddenError,

services/web/server/src/simcore_service_webserver/folders/_workspaces_repository.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,7 @@
1212
from ..projects import _groups_repository as projects_groups_repository
1313
from ..projects import _projects_repository as _projects_repository
1414
from ..projects._access_rights_service import check_user_project_permission
15-
from ..users.api import get_user
15+
from ..users import users_service
1616
from ..workspaces.api import check_user_workspace_access
1717
from . import _folders_repository
1818

@@ -122,7 +122,7 @@ async def move_folder_into_workspace(
122122
)
123123

124124
# 9. Remove all project permissions, leave only the user who moved the project
125-
user = await get_user(app, user_id=user_id)
125+
user = await users_service.get_user(app, user_id=user_id)
126126
for project_id in project_ids:
127127
await projects_groups_repository.delete_all_project_groups(
128128
app, connection=conn, project_id=project_id

services/web/server/src/simcore_service_webserver/functions/_functions_repository.py

Lines changed: 10 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -88,7 +88,7 @@
8888

8989
from ..db.plugin import get_asyncpg_engine
9090
from ..groups.api import list_all_user_groups_ids
91-
from ..users.api import get_user_primary_group_id
91+
from ..users import users_service
9292

9393
_FUNCTIONS_TABLE_COLS = get_columns_from_db_model(functions_table, RegisteredFunctionDB)
9494
_FUNCTION_JOBS_TABLE_COLS = get_columns_from_db_model(
@@ -148,7 +148,9 @@ async def create_function( # noqa: PLR0913
148148

149149
registered_function = RegisteredFunctionDB.model_validate(row)
150150

151-
user_primary_group_id = await get_user_primary_group_id(app, user_id=user_id)
151+
user_primary_group_id = await users_service.get_user_primary_group_id(
152+
app, user_id=user_id
153+
)
152154
await set_group_permissions(
153155
app,
154156
connection=transaction,
@@ -206,7 +208,9 @@ async def create_function_job( # noqa: PLR0913
206208

207209
registered_function_job = RegisteredFunctionJobDB.model_validate(row)
208210

209-
user_primary_group_id = await get_user_primary_group_id(app, user_id=user_id)
211+
user_primary_group_id = await users_service.get_user_primary_group_id(
212+
app, user_id=user_id
213+
)
210214
await set_group_permissions(
211215
app,
212216
connection=transaction,
@@ -291,7 +295,9 @@ async def create_function_job_collection(
291295
) # nosec
292296
job_collection_entries.append(entry)
293297

294-
user_primary_group_id = await get_user_primary_group_id(app, user_id=user_id)
298+
user_primary_group_id = await users_service.get_user_primary_group_id(
299+
app, user_id=user_id
300+
)
295301
await set_group_permissions(
296302
app,
297303
connection=transaction,

0 commit comments

Comments
 (0)