Skip to content

Commit 567ffca

Browse files
committed
admin and users
1 parent 9379260 commit 567ffca

File tree

9 files changed

+93
-121
lines changed

9 files changed

+93
-121
lines changed

api/specs/web-server/_users.py

Lines changed: 20 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -14,10 +14,9 @@
1414
MyProfilePatch,
1515
MyTokenCreate,
1616
MyTokenGet,
17-
MyUserGet,
1817
MyUsersGetParams,
1918
MyUsersSearchQueryParams,
20-
UserGet,
19+
UserAsAdminGet,
2120
UsersSearchQueryParams,
2221
)
2322
from models_library.api_schemas_webserver.users_preferences import PatchRequestBody
@@ -145,40 +144,49 @@ async def list_user_permissions():
145144
...
146145

147146

147+
#
148+
# USERS public
149+
#
150+
151+
148152
@router.get(
149-
"/me/users/{user_id}",
150-
response_model=Envelope[MyUserGet],
153+
"/users/{user_id}",
154+
response_model=Envelope[UserAsAdminGet],
151155
)
152156
async def get_user(_path: Annotated[MyUsersGetParams, Depends()]):
153157
...
154158

155159

156160
@router.get(
157-
"/me/users:search",
158-
response_model=Envelope[list[MyUserGet]],
161+
"/users:search",
162+
response_model=Envelope[list[UserAsAdminGet]],
159163
description="Search among users who are publicly visible to the caller (i.e., me) based on their privacy settings.",
160164
)
161165
async def search_users(_query: Annotated[MyUsersSearchQueryParams, Depends()]):
162166
...
163167

164168

169+
#
170+
# USERS admin
171+
#
172+
165173
_extra_tags: list[str | Enum] = ["admin"]
166174

167175

168176
@router.get(
169-
"/users:search",
170-
response_model=Envelope[list[UserGet]],
177+
"/admin/users:search",
178+
response_model=Envelope[list[UserAsAdminGet]],
171179
tags=_extra_tags,
172180
)
173-
async def search_users_as_admin(_query: Annotated[UsersSearchQueryParams, Depends()]):
181+
async def search_users_for_admin(_query: Annotated[UsersSearchQueryParams, Depends()]):
174182
# NOTE: see `Search` in `Common Custom Methods` in https://cloud.google.com/apis/design/custom_methods
175183
...
176184

177185

178186
@router.post(
179-
"/users:pre-register",
180-
response_model=Envelope[UserGet],
187+
"/admin/users:pre-register",
188+
response_model=Envelope[UserAsAdminGet],
181189
tags=_extra_tags,
182190
)
183-
async def pre_register_user_as_admin(_body: PreRegisteredUserGet):
191+
async def pre_register_user_for_admin(_body: PreRegisteredUserGet):
184192
...

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

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -212,7 +212,7 @@ class MyUsersSearchQueryParams(BaseModel):
212212
limit: Annotated[int, annotated_types.Interval(ge=1, le=50)] = 10
213213

214214

215-
class MyUserGet(OutputSchema):
215+
class UserAsAdminGet(OutputSchema):
216216
# Public profile of a user subject to its privacy settings
217217
user_id: UserID
218218
group_id: GroupID
@@ -233,7 +233,7 @@ class UsersSearchQueryParams(BaseModel):
233233
]
234234

235235

236-
class UserGet(OutputSchema):
236+
class UserAsAdminGet(OutputSchema):
237237
# ONLY for admins
238238
first_name: str | None
239239
last_name: str | None

services/static-webserver/client/source/class/osparc/data/Resources.js

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -962,11 +962,11 @@ qx.Class.define("osparc.data.Resources", {
962962
endpoints: {
963963
search: {
964964
method: "GET",
965-
url: statics.API + "/users:search?email={email}"
965+
url: statics.API + "/admin/users:search?email={email}"
966966
},
967967
preRegister: {
968968
method: "POST",
969-
url: statics.API + "/users:pre-register"
969+
url: statics.API + "/admin/users:pre-register"
970970
}
971971
}
972972
},

services/web/server/src/simcore_service_webserver/api/v0/openapi.yaml

Lines changed: 20 additions & 88 deletions
Original file line numberDiff line numberDiff line change
@@ -1323,7 +1323,7 @@ paths:
13231323
application/json:
13241324
schema:
13251325
$ref: '#/components/schemas/Envelope_list_MyPermissionGet__'
1326-
/v0/me/users/{user_id}:
1326+
/v0/users/{user_id}:
13271327
get:
13281328
tags:
13291329
- user
@@ -1344,8 +1344,8 @@ paths:
13441344
content:
13451345
application/json:
13461346
schema:
1347-
$ref: '#/components/schemas/Envelope_MyUserGet_'
1348-
/v0/me/users:search:
1347+
$ref: '#/components/schemas/Envelope_UserAsAdminGet_'
1348+
/v0/users:search:
13491349
get:
13501350
tags:
13511351
- user
@@ -1377,14 +1377,14 @@ paths:
13771377
content:
13781378
application/json:
13791379
schema:
1380-
$ref: '#/components/schemas/Envelope_list_MyUserGet__'
1381-
/v0/users:search:
1380+
$ref: '#/components/schemas/Envelope_list_UserAsAdminGet__'
1381+
/v0/admin/users:search:
13821382
get:
13831383
tags:
13841384
- user
13851385
- admin
1386-
summary: Search Users As Admin
1387-
operationId: search_users_as_admin
1386+
summary: Search Users For Admin
1387+
operationId: search_users_for_admin
13881388
parameters:
13891389
- name: email
13901390
in: query
@@ -1400,14 +1400,14 @@ paths:
14001400
content:
14011401
application/json:
14021402
schema:
1403-
$ref: '#/components/schemas/Envelope_list_UserGet__'
1404-
/v0/users:pre-register:
1403+
$ref: '#/components/schemas/Envelope_list_UserAsAdminGet__'
1404+
/v0/admin/users:pre-register:
14051405
post:
14061406
tags:
14071407
- user
14081408
- admin
1409-
summary: Pre Register User As Admin
1410-
operationId: pre_register_user_as_admin
1409+
summary: Pre Register User For Admin
1410+
operationId: pre_register_user_for_admin
14111411
requestBody:
14121412
content:
14131413
application/json:
@@ -1420,7 +1420,7 @@ paths:
14201420
content:
14211421
application/json:
14221422
schema:
1423-
$ref: '#/components/schemas/Envelope_UserGet_'
1423+
$ref: '#/components/schemas/Envelope_UserAsAdminGet_'
14241424
/v0/wallets:
14251425
get:
14261426
tags:
@@ -8253,19 +8253,6 @@ components:
82538253
title: Error
82548254
type: object
82558255
title: Envelope[MyTokenGet]
8256-
Envelope_MyUserGet_:
8257-
properties:
8258-
data:
8259-
anyOf:
8260-
- $ref: '#/components/schemas/MyUserGet'
8261-
- type: 'null'
8262-
error:
8263-
anyOf:
8264-
- {}
8265-
- type: 'null'
8266-
title: Error
8267-
type: object
8268-
title: Envelope[MyUserGet]
82698256
Envelope_NodeCreated_:
82708257
properties:
82718258
data:
@@ -8624,19 +8611,19 @@ components:
86248611
title: Error
86258612
type: object
86268613
title: Envelope[Union[WalletGet, NoneType]]
8627-
Envelope_UserGet_:
8614+
Envelope_UserAsAdminGet_:
86288615
properties:
86298616
data:
86308617
anyOf:
8631-
- $ref: '#/components/schemas/UserGet'
8618+
- $ref: '#/components/schemas/UserAsAdminGet'
86328619
- type: 'null'
86338620
error:
86348621
anyOf:
86358622
- {}
86368623
- type: 'null'
86378624
title: Error
86388625
type: object
8639-
title: Envelope[UserGet]
8626+
title: Envelope[UserAsAdminGet]
86408627
Envelope_WalletGetWithAvailableCredits_:
86418628
properties:
86428629
data:
@@ -9030,22 +9017,6 @@ components:
90309017
title: Error
90319018
type: object
90329019
title: Envelope[list[MyTokenGet]]
9033-
Envelope_list_MyUserGet__:
9034-
properties:
9035-
data:
9036-
anyOf:
9037-
- items:
9038-
$ref: '#/components/schemas/MyUserGet'
9039-
type: array
9040-
- type: 'null'
9041-
title: Data
9042-
error:
9043-
anyOf:
9044-
- {}
9045-
- type: 'null'
9046-
title: Error
9047-
type: object
9048-
title: Envelope[list[MyUserGet]]
90499020
Envelope_list_OsparcCreditsAggregatedByServiceGet__:
90509021
properties:
90519022
data:
@@ -9286,12 +9257,12 @@ components:
92869257
title: Error
92879258
type: object
92889259
title: Envelope[list[TaskGet]]
9289-
Envelope_list_UserGet__:
9260+
Envelope_list_UserAsAdminGet__:
92909261
properties:
92919262
data:
92929263
anyOf:
92939264
- items:
9294-
$ref: '#/components/schemas/UserGet'
9265+
$ref: '#/components/schemas/UserAsAdminGet'
92959266
type: array
92969267
- type: 'null'
92979268
title: Data
@@ -9301,7 +9272,7 @@ components:
93019272
- type: 'null'
93029273
title: Error
93039274
type: object
9304-
title: Envelope[list[UserGet]]
9275+
title: Envelope[list[UserAsAdminGet]]
93059276
Envelope_list_UserNotification__:
93069277
properties:
93079278
data:
@@ -10931,45 +10902,6 @@ components:
1093110902
- service
1093210903
- token_key
1093310904
title: MyTokenGet
10934-
MyUserGet:
10935-
properties:
10936-
userId:
10937-
type: integer
10938-
exclusiveMinimum: true
10939-
title: Userid
10940-
minimum: 0
10941-
groupId:
10942-
type: integer
10943-
exclusiveMinimum: true
10944-
title: Groupid
10945-
minimum: 0
10946-
userName:
10947-
type: string
10948-
maxLength: 100
10949-
minLength: 1
10950-
title: Username
10951-
firstName:
10952-
anyOf:
10953-
- type: string
10954-
- type: 'null'
10955-
title: Firstname
10956-
lastName:
10957-
anyOf:
10958-
- type: string
10959-
- type: 'null'
10960-
title: Lastname
10961-
email:
10962-
anyOf:
10963-
- type: string
10964-
format: email
10965-
- type: 'null'
10966-
title: Email
10967-
type: object
10968-
required:
10969-
- userId
10970-
- groupId
10971-
- userName
10972-
title: MyUserGet
1097310905
Node-Input:
1097410906
properties:
1097510907
key:
@@ -14463,7 +14395,7 @@ components:
1446314395
- number
1446414396
- e_tag
1446514397
title: UploadedPart
14466-
UserGet:
14398+
UserAsAdminGet:
1446714399
properties:
1446814400
firstName:
1446914401
anyOf:
@@ -14554,7 +14486,7 @@ components:
1455414486
- country
1455514487
- registered
1455614488
- status
14557-
title: UserGet
14489+
title: UserAsAdminGet
1455814490
UserNotification:
1455914491
properties:
1456014492
user_id:

services/web/server/src/simcore_service_webserver/security/_authz_access_roles.py

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -83,6 +83,7 @@ class PermissionDict(TypedDict, total=False):
8383
"user.notifications.write",
8484
"user.profile.delete",
8585
"user.profile.update",
86+
"user.read",
8687
"user.tokens.*",
8788
"wallets.*",
8889
"workspaces.*",
@@ -103,7 +104,7 @@ class PermissionDict(TypedDict, total=False):
103104
can=[
104105
"product.details.*",
105106
"product.invitations.create",
106-
"user.users.*",
107+
"user.admin.read",
107108
],
108109
inherits=[UserRole.TESTER],
109110
),

services/web/server/src/simcore_service_webserver/users/_common/schemas.py

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,7 @@
1212

1313
import pycountry
1414
from models_library.api_schemas_webserver._base import InputSchema
15-
from models_library.api_schemas_webserver.users import UserGet
15+
from models_library.api_schemas_webserver.users import UserAsAdminGet
1616
from models_library.emails import LowerCaseEmailStr
1717
from models_library.users import UserID
1818
from pydantic import BaseModel, ConfigDict, Field, field_validator, model_validator
@@ -109,4 +109,6 @@ def _pre_check_and_normalize_country(cls, v):
109109

110110

111111
# asserts field names are in sync
112-
assert set(PreRegisteredUserGet.model_fields).issubset(UserGet.model_fields) # nosec
112+
assert set(PreRegisteredUserGet.model_fields).issubset(
113+
UserAsAdminGet.model_fields
114+
) # nosec

0 commit comments

Comments
 (0)