33import asyncio
44from contextlib import suppress
55from dataclasses import dataclass
6+ from typing import Any
67
78from sanic import HTTPResponse , Request , empty , json
89from sanic_ext import validate
2425 validate_resource_pool_post ,
2526 validate_resource_pool_put_or_patch ,
2627)
27- from renku_data_services .crc .db import ClusterRepository , MemberRepository , ResourcePoolRepository
28+ from renku_data_services .crc .db import (
29+ ClusterRepository ,
30+ MemberRepository ,
31+ ResourcePoolMemberResult ,
32+ ResourcePoolRepository ,
33+ )
2834from renku_data_services .crc .models import MemberType , ResourcePoolMemberIdentifier
2935from renku_data_services .users .db import UserRepo as KcUserRepo
3036from renku_data_services .users .models import UserInfo
@@ -263,8 +269,8 @@ def get_all(self) -> BlueprintFactoryResponse:
263269 async def _get_all (_ : Request , user : base_models .APIUser , resource_pool_id : int ) -> HTTPResponse :
264270 members = await self .repo .get_resource_pool_members (user , resource_pool_id )
265271 return validated_json (
266- apispec .PoolMembers ,
267- [{ "member_type" : m . member_type . value , "id" : m . member_id , "relation" : m . relation } for m in members ],
272+ apispec .PoolMembersResponse ,
273+ [self . _dump_member_response ( m ) for m in members ],
268274 )
269275
270276 return "/resource_pools/<resource_pool_id>/members" , ["GET" ], _get_all
@@ -301,15 +307,10 @@ async def _put_post(
301307 self , user : base_models .APIUser , resource_pool_id : int , body : apispec .PoolMembers , post : bool = True
302308 ) -> HTTPResponse :
303309 identifiers = self ._to_identifiers (body )
304- updated = await self .repo .update_resource_pool_members (
305- api_user = user ,
306- resource_pool_id = resource_pool_id ,
307- members = identifiers ,
308- append = post ,
309- )
310+ members = await self .repo .update_resource_pool_members (user , resource_pool_id , identifiers , append = post )
310311 return validated_json (
311- apispec .PoolMembers ,
312- [{ "member_type" : m . member_type . value , "id" : m . member_id , "relation" : m . relation } for m in updated ],
312+ apispec .PoolMembersResponse ,
313+ [self . _dump_member_response ( m ) for m in members ],
313314 status = 201 if post else 200 ,
314315 )
315316
@@ -325,14 +326,14 @@ async def _get(
325326 members = await self .repo .get_resource_pool_members (user , resource_pool_id )
326327 for m in members :
327328 if m .member_type .value == member_type and m .member_id == member_id :
328- payload = { "member_type" : m . member_type . value , "id" : m . member_id , "relation" : m . relation }
329+ payload = self . _dump_member_response ( m )
329330 match member_type :
330331 case "user" :
331- return validated_json (apispec .PoolMemberUser , payload )
332+ return validated_json (apispec .PoolMemberUserResponse , payload )
332333 case "group" :
333- return validated_json (apispec .PoolMemberGroup , payload )
334+ return validated_json (apispec .PoolMemberGroupResponse , payload )
334335 case "project" :
335- return validated_json (apispec .PoolMemberProject , payload )
336+ return validated_json (apispec .PoolMemberProjectResponse , payload )
336337 case _:
337338 raise errors .ValidationError (message = f"Invalid member type: { member_type } " )
338339 raise errors .MissingResourceError (
@@ -395,6 +396,25 @@ def _to_identifiers(body: apispec.PoolMembers) -> list[ResourcePoolMemberIdentif
395396 )
396397 return identifiers
397398
399+ @staticmethod
400+ def _dump_member_response (m : ResourcePoolMemberResult ) -> dict [str , Any ]:
401+ """Serialize a member result for GET responses."""
402+ result : dict [str , Any ] = {
403+ "member_type" : m .member_type .value ,
404+ "id" : m .member_id ,
405+ "relation" : m .relation ,
406+ }
407+ match m .member_type :
408+ case MemberType .USER :
409+ result ["email" ] = m .email or ""
410+ case MemberType .PROJECT :
411+ result ["namespace" ] = m .namespace or ""
412+ result ["name" ] = m .name or ""
413+ case MemberType .GROUP :
414+ result ["slug" ] = m .slug or ""
415+ result ["name" ] = m .name or ""
416+ return result
417+
398418
399419@dataclass (kw_only = True )
400420class ClassesBP (CustomBlueprint ):
0 commit comments