from typing import List from fastapi import APIRouter, Depends, HTTPException from sqlalchemy.orm import Session from app.engine.postgresdb import get_db from app.schema.index import UserCreate, User as UserSchema from app.model.user import User as UserModel user_router = r = APIRouter(prefix="/api/v1/users", tags=["users"]) @r.post( "/", response_model=UserSchema, responses={ 200: {"description": "New user created"}, 400: {"description": "Bad request"}, 409: {"description": "Conflict"}, 500: {"description": "Internal server error"}, }, ) async def create_user(user: UserCreate, db: Session = Depends(get_db)): try: db_user = ( db.query(UserModel).filter(UserModel.email == user.email).sort_by(UserModel.updated_at, desc=True).first() ) if db_user and not db_user.is_deleted: raise HTTPException(status_code=409, detail="User already exists") db_user = UserModel(**user.dict()) db.add(db_user) db.commit() db.refresh(db_user) return db_user except Exception as e: raise HTTPException(status_code=500, detail=str(e)) @r.get( "/{user_id}", response_model=UserSchema, responses={ 200: {"description": "User found"}, 404: {"description": "User not found"}, 500: {"description": "Internal server error"}, }, ) async def get_user(user_id: int, db: Session = Depends(get_db)): user = db.query(UserModel).get(user_id) if not user: raise HTTPException(status_code=404, detail="User not found") return user @r.put( "/{user_id}", response_model=UserSchema, responses={ 200: {"description": "User updated"}, 404: {"description": "User not found"}, 500: {"description": "Internal server error"}, }, ) async def update_user(user_id: int, user_payload: UserCreate, db: Session = Depends(get_db)): user = db.query(UserModel).get(user_id) if not user: raise HTTPException(status_code=404, detail="User not found") user.name = user_payload.name user.email = user_payload.email db.commit() db.refresh(user) return user @r.delete( "/{user_id}", response_model=UserSchema, responses={ 200: {"description": "User deleted"}, 404: {"description": "User not found"}, 500: {"description": "Internal server error"}, }, ) async def delete_user(user_id: int, db: Session = Depends(get_db)): user = db.query(UserModel).get(user_id) if not user: raise HTTPException(status_code=404, detail="User not found") user.is_deleted = True db.commit() db.refresh(user) return user