pulse-be / routers /users.py
khawir's picture
added routes for adding/removing sites to users
a60d65d
from datetime import datetime
from fastapi import Depends, APIRouter, HTTPException, Query
from sqlmodel import Session, select
from models import User, UserCreate, UserPublic, UserUpdate, UserPublicWith, Site
from core import crud, utils
router = APIRouter(
prefix="/users",
tags=["users"],
dependencies=[Depends(crud.get_current_super_user)]
)
@router.post("/", response_model=UserPublic)
def create_user(*, session: Session = Depends(utils.get_session), user: UserCreate):
return crud.add_user(session, user)
@router.get("/", response_model=list[UserPublic])
def read_users(*,
session: Session = Depends(utils.get_session),
offset: int = 0,
limit: int = Query(default=100, le=100),
):
users = session.exec(select(User).offset(offset).limit(limit)).all()
return users
@router.get("/{user_id}", response_model=UserPublicWith)
def read_user(*, session: Session = Depends(utils.get_session), user_id: int):
user = session.get(User, user_id)
if not user:
raise HTTPException(status_code=404, detail="User not found")
return user
@router.patch("/{user_id}", response_model=UserPublic)
def update_user(*,
session: Session = Depends(utils.get_session),
user_id: int,
user: UserUpdate
):
db_user = session.get(User, user_id)
if not db_user:
raise HTTPException(status_code=404, detail="User not found")
return crud.edit_user(session, db_user, user)
@router.delete("/{user_id}")
def delete_user(*, session: Session = Depends(utils.get_session), user_id: int):
user = session.get(User, user_id)
if not user:
raise HTTPException(status_code=404, detail="User not found")
session.delete(user)
session.commit()
@router.patch("/{user_id}/site/{site_id}", response_model=UserPublicWith)
def add_user_site(*,
session: Session = Depends(utils.get_session),
user_id: int,
site_id: int,
):
db_user = session.get(User, user_id)
if not db_user:
raise HTTPException(status_code=404, detail="User not found")
user_site_list = [site.id for site in db_user.sites]
if site_id in user_site_list:
raise HTTPException(status_code=404, detail=f"Site '{site_id}' already associated with the user")
db_site = session.get(Site, site_id)
if not db_site:
raise HTTPException(status_code=404, detail="Site not found")
db_user.sites.append(db_site)
session.add(db_user)
session.commit()
session.refresh(db_user)
return db_user
@router.patch("/{user_id}/notsite/{site_id}", response_model=UserPublicWith)
def delete_user_site(*,
session: Session = Depends(utils.get_session),
user_id: int,
site_id: int,
):
db_user = session.get(User, user_id)
if not db_user:
raise HTTPException(status_code=404, detail="User not found")
user_site_list = [site.id for site in db_user.sites]
if site_id not in user_site_list:
raise HTTPException(status_code=404, detail=f"Site '{site_id}' not associated with the user")
db_site = session.get(Site, site_id)
if not db_site:
raise HTTPException(status_code=404, detail="Site not found")
db_user.sites.remove(db_site)
session.add(db_user)
session.commit()
session.refresh(db_user)
return db_user