Coverage for src/cstlcore/me/router.py: 74%

27 statements  

« prev     ^ index     » next       coverage.py v7.9.1, created at 2026-02-19 12:46 +0000

1from fastapi import APIRouter, Depends, HTTPException 

2from sqlmodel import Session 

3 

4from cstlcore.auth.dependencies import get_current_user, is_user_admin 

5from cstlcore.constellations.models import Constellation, ConstellationPublic 

6from cstlcore.database.dependencies import get_session 

7from cstlcore.memberships.dependencies import require_read_access 

8from cstlcore.memberships.models import ( 

9 AccessEnum, 

10 ConstellationMembership, 

11 ConstellationMembershipPublic, 

12) 

13from cstlcore.users.models import User, UserPublic 

14 

15router = APIRouter() 

16 

17 

18@router.get("/me", response_model=UserPublic) 

19async def get_me(current_user: User = Depends(get_current_user)): 

20 return current_user 

21 

22 

23@router.get("/me/memberships", response_model=list[ConstellationMembershipPublic]) 

24async def get_my_memberships( 

25 current_user: User = Depends(get_current_user), 

26): 

27 return current_user.memberships 

28 

29 

30@router.get("/me/constellations", response_model=list[ConstellationPublic]) 

31async def get_my_constellations( 

32 user: User = Depends(get_current_user), 

33): 

34 constellations = [membership.constellation for membership in user.memberships] 

35 return constellations 

36 

37 

38@router.get( 

39 "/me/constellations/{constellation_id}/access", 

40 response_model=ConstellationMembershipPublic, 

41) 

42async def get_my_constellation_access( 

43 user: User = Depends(get_current_user), 

44 constellation: Constellation = Depends(require_read_access), 

45 session: Session = Depends(get_session), 

46): 

47 """ 

48 [LEGACY] Endpoint required by Neo4j's api 

49 

50 TODO: Find a better way to handle this 

51 """ 

52 

53 membership = session.get(ConstellationMembership, (constellation.id, user.id)) 

54 if not membership: 

55 # If no membership exists but user passed require_read_access, 

56 # they must be an admin - return synthetic admin membership 

57 if is_user_admin(user): 

58 return ConstellationMembershipPublic( 

59 access=AccessEnum.OWNER, 

60 constellation=constellation, 

61 user=user, 

62 ) 

63 raise HTTPException(status_code=404, detail="Membership not found") 

64 

65 return membership