diff --git a/.gitignore b/.gitignore index bee8a64..be2ac13 100644 --- a/.gitignore +++ b/.gitignore @@ -1 +1,2 @@ __pycache__ +gatekeeper.db diff --git a/main.py b/main.py index 8e3dfea..200e02b 100644 --- a/main.py +++ b/main.py @@ -1,7 +1,56 @@ -from fastapi import FastAPI +from fastapi import FastAPI, Depends, HTTPException +from sqlalchemy.orm import Session +from typing import List + +from models import User +from schemas import UserCreate, User as UserSchema +from services import SessionLocal, engine app = FastAPI() -@app.get("/") -async def root(): - return {"message": "Hello World"} \ No newline at end of file +def get_db(): + db = SessionLocal() + try: + yield db + finally: + db.close() + +@app.post("/users/", response_model=UserSchema) +def create_user(user: UserCreate, db: Session = Depends(get_db)): + db_user = User(**user.dict()) + db.add(db_user) + db.commit() + db.refresh(db_user) + return db_user + +@app.get("/users/", response_model=List[UserSchema]) +def read_users(db: Session = Depends(get_db)): + users = db.query(User).all() + return users + +@app.get("/users/{user_id}", response_model=UserSchema) +def read_user(user_id: int, db: Session = Depends(get_db)): + db_user = db.query(User).filter(User.id == user_id).first() + if db_user is None: + raise HTTPException(status_code=404, detail="User not found") + return db_user + +@app.put("/users/{user_id}", response_model=UserSchema) +def update_user(user_id: int, user: UserCreate, db: Session = Depends(get_db)): + db_user = db.query(User).filter(User.id == user_id).first() + if db_user is None: + raise HTTPException(status_code=404, detail="User not found") + for key, value in user.dict().items(): + setattr(db_user, key, value) + db.commit() + db.refresh(db_user) + return db_user + +@app.delete("/users/{user_id}") +def delete_user(user_id: int, db: Session = Depends(get_db)): + db_user = db.query(User).filter(User.id == user_id).first() + if db_user is None: + raise HTTPException(status_code=404, detail="User not found") + db.delete(db_user) + db.commit() + return {"message": "User deleted successfully"} \ No newline at end of file diff --git a/models.py b/models.py new file mode 100644 index 0000000..0fdf035 --- /dev/null +++ b/models.py @@ -0,0 +1,13 @@ +from sqlalchemy import Column, Integer, String, Boolean +from sqlalchemy.ext.declarative import declarative_base + +Base = declarative_base() + +class User(Base): + __tablename__ = "users" + + id = Column(Integer, primary_key=True, index=True) + name = Column(String, index=True) + email = Column(String, nullable=True) + password = Column(String) + is_admin = Column(Boolean, default=False) \ No newline at end of file diff --git a/schemas.py b/schemas.py new file mode 100644 index 0000000..6e35a63 --- /dev/null +++ b/schemas.py @@ -0,0 +1,14 @@ +from pydantic import BaseModel + +class UserBase(BaseModel): + name: str + email: str | None + is_admin: bool + +class UserCreate(UserBase): + password: str + +class User(UserBase): + id: int + class Config: + from_attributes = True \ No newline at end of file diff --git a/services.py b/services.py new file mode 100644 index 0000000..8fc97bb --- /dev/null +++ b/services.py @@ -0,0 +1,12 @@ +from sqlalchemy import create_engine +from sqlalchemy.orm import sessionmaker + +SQLALCHEMY_DATABASE_URL = "sqlite:///./gatekeeper.db" + +engine = create_engine( + SQLALCHEMY_DATABASE_URL, connect_args={"check_same_thread": False} +) +SessionLocal = sessionmaker(autocommit=False, autoflush=False, bind=engine) + +from models import Base +Base.metadata.create_all(bind=engine) \ No newline at end of file