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
« prev ^ index » next coverage.py v7.9.1, created at 2026-02-19 12:46 +0000
1import uuid
3from fastapi import APIRouter, Depends, HTTPException
4from sqlmodel import Session, select
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
12router = APIRouter()
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()
19 return users
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
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})
35 constellation = Constellation(
36 id=uuid.uuid4(), name="My Constellation", description="Your own universe!"
37 )
39 membership = ConstellationMembership(
40 access=AccessEnum.OWNER, constellation_id=constellation.id, user_id=db_user.id
41 )
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