Coverage for src/cstlcore/users/router.py: 100%

31 statements  

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

1import uuid 

2 

3from fastapi import APIRouter, Depends, HTTPException 

4from sqlmodel import Session, select 

5 

6from cstlcore.constellations.models import Constellation 

7from cstlcore.database.dependencies import get_session 

8from cstlcore.memberships.models import AccessEnum, ConstellationMembership 

9from cstlcore.security.password import get_password_hash 

10from cstlcore.users.models import User, UserCreate, UserPublic 

11 

12router = APIRouter() 

13 

14 

15@router.get("/users", response_model=list[UserPublic]) 

16async def get_all_users(session: Session = Depends(get_session)): 

17 users = session.exec(select(User)).all() 

18 

19 return users 

20 

21 

22@router.get("/users/{user_id}", response_model=UserPublic) 

23async def get_user(user_id: uuid.UUID, session: Session = Depends(get_session)): 

24 user = session.get(User, user_id) 

25 if not user: 

26 raise HTTPException(status_code=404, detail="User not found") 

27 return user 

28 

29 

30@router.post("/users", response_model=UserPublic, status_code=201) 

31async def create_user(user: UserCreate, session: Session = Depends(get_session)): 

32 password_hash = get_password_hash(user.password) 

33 db_user = User.model_validate(user, update={"password_hash": password_hash}) 

34 

35 constellation = Constellation( 

36 id=uuid.uuid4(), name="My Constellation", description="Your own universe!" 

37 ) 

38 

39 membership = ConstellationMembership( 

40 access=AccessEnum.OWNER, constellation_id=constellation.id, user_id=db_user.id 

41 ) 

42 

43 session.add(db_user) 

44 session.add(constellation) 

45 session.add(membership) 

46 session.commit() 

47 session.refresh(db_user) 

48 return db_user