from fastapi import FastAPI, Depends, HTTPException from sqlalchemy.orm import Session import logging import models, schemas, crud from database import SessionLocal, engine logging.basicConfig(level=logging.INFO) logger = logging.getLogger(__name__) models.Base.metadata.create_all(bind=engine) app = FastAPI() def get_db(): db = SessionLocal() try: yield db finally: db.close() @app.post("/users/", response_model=schemas.UserResponse) def create_user(user: schemas.UserCreate, db: Session = Depends(get_db)): """Создает нового пользователя на основе предоставленных данных.""" try: result = crud.create_user(db, user) logger.info(f"User created: {result.id}") return result except ValueError as e: logger.warning(f"Failed to create user: {e}") raise HTTPException(status_code=400, detail=str(e)) except ConnectionError as e: logger.error(f"Database error: {e}") raise HTTPException(status_code=500, detail=str(e)) @app.get("/users/") def read_users(db: Session = Depends(get_db)): """Возвращает список всех пользователей.""" try: return crud.get_users(db) except ConnectionError as e: raise HTTPException(status_code=500, detail=str(e)) @app.get("/users/{user_id}") def read_user(user_id: int, db: Session = Depends(get_db)): """Возвращает информацию о пользователе по его ID.""" try: return crud.get_user(db, user_id) except LookupError as e: raise HTTPException(status_code=404, detail=str(e)) except ConnectionError as e: raise HTTPException(status_code=500, detail=str(e)) @app.delete("/users/{user_id}") def delete_user(user_id: int, db: Session = Depends(get_db)): """Удаляет пользователя по его ID.""" try: return crud.delete_user(db, user_id) except LookupError as e: raise HTTPException(status_code=404, detail=str(e)) except ConnectionError as e: raise HTTPException(status_code=500, detail=str(e)) @app.put("/users/{user_id}", response_model=schemas.UserResponse) def update_user(user_id: int, user: schemas.UserCreate, db: Session = Depends(get_db)): """Обновляет данные пользователя по его ID.""" try: return crud.update_user(db, user_id, user) except LookupError as e: raise HTTPException(status_code=404, detail=str(e)) except ConnectionError as e: raise HTTPException(status_code=500, detail=str(e)) @app.post("/posts/") def create_post(post: schemas.PostCreate, db: Session = Depends(get_db)): """Создает новый пост на основе предоставленных данных.""" try: return crud.create_post(db, post) except LookupError as e: raise HTTPException(status_code=404, detail=str(e)) except ValueError as e: raise HTTPException(status_code=400, detail=str(e)) except ConnectionError as e: raise HTTPException(status_code=500, detail=str(e)) @app.get("/posts/") def read_posts(db: Session = Depends(get_db)): """Возвращает список всех постов.""" try: return crud.get_posts(db) except ConnectionError as e: raise HTTPException(status_code=500, detail=str(e)) @app.get("/posts/{post_id}") def read_post(post_id: int, db: Session = Depends(get_db)): """Возвращает информацию о посте по его ID.""" try: return crud.get_post(db, post_id) except LookupError as e: raise HTTPException(status_code=404, detail=str(e)) except ConnectionError as e: raise HTTPException(status_code=500, detail=str(e)) @app.put("/posts/{post_id}", response_model=schemas.PostResponse) def update_post(post_id: int, post: schemas.PostCreate, db: Session = Depends(get_db)): """Обновляет данные поста по его ID.""" try: return crud.update_post(db, post_id, post) except LookupError as e: raise HTTPException(status_code=404, detail=str(e)) except ConnectionError as e: raise HTTPException(status_code=500, detail=str(e))