@@ -111,15 +111,12 @@ def _resolve_group(service_id: str) -> GroupEnum | None:
111111 return None
112112
113113
114- def _get_or_create_db_user (user_id : str ,
115- client : Auth0Client ,
116- db_session : Session ) -> BiocommonsUser :
114+ def _get_admin_db_user (* , user_id : str , db_session : Session ) -> BiocommonsUser :
117115 db_user = db_session .get (BiocommonsUser , user_id )
118116 if db_user is None :
119- db_user = BiocommonsUser .get_or_create (
120- auth0_id = user_id ,
121- db_session = db_session ,
122- auth0_client = client ,
117+ raise HTTPException (
118+ status_code = 404 ,
119+ detail = f"Admin user '{ user_id } ' is not registered in the portal database." ,
123120 )
124121 return db_user
125122
@@ -161,6 +158,50 @@ def _membership_response() -> dict[str, object]:
161158 return {"status" : "ok" , "updated" : True }
162159
163160
161+ def _assert_platform_admin_permissions (
162+ * , admin_user : SessionUser , platform : PlatformEnum , db_session : Session
163+ ) -> None :
164+ platform_record = db_session .get (Platform , platform )
165+ if platform_record is None :
166+ raise HTTPException (
167+ status_code = 404 ,
168+ detail = f"Platform '{ platform .value } ' is not configured" ,
169+ )
170+
171+ allowed_roles = {role .name for role in platform_record .admin_roles }
172+ if not allowed_roles :
173+ logger .warning (
174+ "Platform %s has no admin roles configured" , platform_record .id .value
175+ )
176+
177+ user_roles = set (admin_user .access_token .biocommons_roles or [])
178+ if user_roles .isdisjoint (allowed_roles ):
179+ raise HTTPException (
180+ status_code = 403 ,
181+ detail = "You do not have permission to manage this platform." ,
182+ )
183+
184+
185+ def _assert_group_admin_permissions (
186+ * , admin_user : SessionUser , group_id : str , db_session : Session
187+ ) -> None :
188+ group_record = db_session .get (BiocommonsGroup , group_id )
189+ if group_record is None :
190+ raise HTTPException (
191+ status_code = 404 ,
192+ detail = f"Group '{ group_id } ' is not configured" ,
193+ )
194+
195+ if not group_record .admin_roles :
196+ logger .warning ("Group %s has no admin roles configured" , group_id )
197+
198+ if not group_record .user_is_admin (admin_user ):
199+ raise HTTPException (
200+ status_code = 403 ,
201+ detail = "You do not have permission to manage this group." ,
202+ )
203+
204+
164205def _approve_platform_membership (
165206 * ,
166207 user_id : str ,
@@ -473,9 +514,13 @@ def approve_platform_membership(user_id: Annotated[str, UserIdParam],
473514 approving_user : Annotated [SessionUser , Depends (get_current_user )],
474515 db_session : Annotated [Session , Depends (get_db_session )]):
475516 platform = _parse_platform_or_404 (platform_id )
476- admin_record = _get_or_create_db_user (
517+ _assert_platform_admin_permissions (
518+ admin_user = approving_user ,
519+ platform = platform ,
520+ db_session = db_session ,
521+ )
522+ admin_record = _get_admin_db_user (
477523 user_id = approving_user .access_token .sub ,
478- client = client ,
479524 db_session = db_session ,
480525 )
481526 _approve_platform_membership (
@@ -495,9 +540,13 @@ def revoke_platform_membership(user_id: Annotated[str, UserIdParam],
495540 revoking_user : Annotated [SessionUser , Depends (get_current_user )],
496541 db_session : Annotated [Session , Depends (get_db_session )]):
497542 platform = _parse_platform_or_404 (platform_id )
498- admin_record = _get_or_create_db_user (
543+ _assert_platform_admin_permissions (
544+ admin_user = revoking_user ,
545+ platform = platform ,
546+ db_session = db_session ,
547+ )
548+ admin_record = _get_admin_db_user (
499549 user_id = revoking_user .access_token .sub ,
500- client = client ,
501550 db_session = db_session ,
502551 )
503552 _revoke_platform_membership (
@@ -517,9 +566,13 @@ def approve_group_membership(user_id: Annotated[str, UserIdParam],
517566 approving_user : Annotated [SessionUser , Depends (get_current_user )],
518567 db_session : Annotated [Session , Depends (get_db_session )]):
519568 group = _parse_group_or_404 (group_id )
520- admin_record = _get_or_create_db_user (
569+ _assert_group_admin_permissions (
570+ admin_user = approving_user ,
571+ group_id = group .value ,
572+ db_session = db_session ,
573+ )
574+ admin_record = _get_admin_db_user (
521575 user_id = approving_user .access_token .sub ,
522- client = client ,
523576 db_session = db_session ,
524577 )
525578 _approve_group_membership (
@@ -540,9 +593,13 @@ def revoke_group_membership(user_id: Annotated[str, UserIdParam],
540593 revoking_user : Annotated [SessionUser , Depends (get_current_user )],
541594 db_session : Annotated [Session , Depends (get_db_session )]):
542595 group = _parse_group_or_404 (group_id )
543- admin_record = _get_or_create_db_user (
596+ _assert_group_admin_permissions (
597+ admin_user = revoking_user ,
598+ group_id = group .value ,
599+ db_session = db_session ,
600+ )
601+ admin_record = _get_admin_db_user (
544602 user_id = revoking_user .access_token .sub ,
545- client = client ,
546603 db_session = db_session ,
547604 )
548605 _revoke_group_membership (
0 commit comments