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