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
« 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
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
15router = APIRouter()
18@router.get("/me", response_model=UserPublic)
19async def get_me(current_user: User = Depends(get_current_user)):
20 return current_user
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
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
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
50 TODO: Find a better way to handle this
51 """
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")
65 return membership