Browse Source

test postgresql config

chenhaiyang 4 years ago
parent
commit
db674110da

+ 5 - 17
app/api/routers/item.py

@@ -3,33 +3,21 @@ from typing import Any, List
 from fastapi import APIRouter, Depends
 from sqlalchemy.orm import Session
 
-from app import crud, schemas
 from app.api.dependencies.db import get_db
+from app.crud.crud_item import get_items
+from app.schemas.item import Item
 
 router = APIRouter()
 
 
-@router.get("/", response_model=List[schemas.Item])
+@router.get("/", response_model=List[Item])
 def read_items(
-        db: Session = Depends(get_db),
         skip: int = 0,
         limit: int = 100,
+        db: Session = Depends(get_db),
 ) -> Any:
     """
     Retrieve items.
     """
-    items = crud.item.get_multi(db, skip=skip, limit=limit)
+    items = get_items(db, skip=skip, limit=limit)
     return items
-
-
-@router.post("/", response_model=schemas.Item)
-def create_item(
-        *,
-        db: Session = Depends(get_db),
-        item_in: schemas.ItemCreate,
-) -> Any:
-    """
-    Create new item.
-    """
-    item = crud.item.create_with_owner(db=db, obj_in=item_in)
-    return item

+ 41 - 0
app/api/routers/user.py

@@ -0,0 +1,41 @@
+from typing import Any, List
+
+from fastapi import APIRouter, Depends, HTTPException
+from sqlalchemy.orm import Session
+
+from app.api.dependencies.db import get_db
+from app.schemas.user import User, UserCreate
+from app.schemas.item import Item, ItemCreate
+from app.crud.crud_user import get_user_by_email, create_user, get_users, get_user
+from app.crud.crud_item import create_user_item
+
+router = APIRouter()
+
+
+@router.post('/', response_model=User)
+def create_user(user: UserCreate, db: Session = Depends(get_db)):
+    db_user = get_user_by_email(db, email=user.email)
+    if db_user:
+        raise HTTPException(status_code=400, detail="Email already registered")
+    return create_user(db=db, user=user)
+
+
+@router.get('/', response_model=List[User])
+def read_users(skip: int = 0, limit: int = 100, db: Session = Depends(get_db)):
+    users = get_users(db, skip=skip, limit=limit)
+    return users
+
+
+@router.get('/{user_id}', response_model=User)
+def read_user(user_id: int, db: Session = Depends(get_db)):
+    db_user = get_user(db, user_id=user_id)
+    if db_user is None:
+        raise HTTPException(status_code=404, detail="User not found")
+    return db_user
+
+
+@router.post('/{user_id}/item', response_model=Item)
+def create_item_for_user(
+        user_id: int, item: ItemCreate, db: Session = Depends(get_db)
+):
+    return create_user_item(db, item=item, user_id=user_id)

+ 2 - 2
app/core/config.py

@@ -23,9 +23,9 @@ class Settings(BaseSettings):
     POSTGRES_USER: str
     POSTGRES_PASSWORD: str
     POSTGRES_DB: str
-    SQLALCHEMY_DATABASE_URI: Optional[PostgresDsn] = None
+    SQLALCHEMY_DATABASE_URL: Optional[PostgresDsn] = None
 
-    @validator('SQLALCHEMY_DATABASE_URI', pre=True)
+    @validator('SQLALCHEMY_DATABASE_URL', pre=True)
     def assemble_db_connection(cls, v: Optional[str], values: Dict[str, Any]) -> Any:
         if isinstance(v, str):
             return v

+ 1 - 1
app/crud/__init__.py

@@ -1,4 +1,4 @@
-from .crud_item import item
+# from .crud_item import item
 
 # For a new basic set of CRUD operations you could just do
 

+ 9 - 23
app/crud/crud_item.py

@@ -1,30 +1,16 @@
-from typing import List
-
-from fastapi.encoders import jsonable_encoder
 from sqlalchemy.orm import Session
 
-from app.crud.base import CRUDBase
 from app.models.item import Item
-from app.schemas.item import ItemCreate, ItemUpdate
-
+from app.schemas.item import ItemCreate
 
-class CRUDItem(CRUDBase[Item, ItemCreate, ItemUpdate]):
-    def create_with_owner(
-            self, db: Session, *, obj_in: ItemCreate
-    ) -> Item:
-        obj_in_data = jsonable_encoder(obj_in)
-        db_obj = self.model(**obj_in_data)
-        db.add(db_obj)
-        db.commit()
-        db.refresh(db_obj)
-        return db_obj
 
-    def get_multi_by_owner(
-            self, db: Session, *, owner_id: int, skip: int = 0, limit: int = 100
-    ) -> List[Item]:
-        return (
-            db.query(self.model).filter(Item.owner_id == owner_id).offset(skip).limit(limit).all()
-        )
+def get_items(db: Session, skip: int = 0, limit: int = 100):
+    return db.query(Item).offset(skip).limit(limit).all()
 
 
-item = CRUDItem(Item)
+def create_user_item(db: Session, item: ItemCreate, user_id: int):
+    db_item = Item(**item.dict(), owner_id=user_id)
+    db.add(db_item)
+    db.commit()
+    db.refresh(db_item)
+    return db_item

+ 25 - 0
app/crud/crud_user.py

@@ -0,0 +1,25 @@
+from sqlalchemy.orm import Session
+
+from app.models.user import User
+from app.schemas.user import UserCreate
+
+
+def get_user(db: Session, user_id: int):
+    return db.query(User).filter(User.id == user_id).first()
+
+
+def get_user_by_email(db: Session, email: str):
+    return db.query(User).filter(User.email == email).first()
+
+
+def get_users(db: Session, skip: int = 0, limit: int = 100):
+    return db.query(User).offset(skip).limit(limit).all()
+
+
+def create_user(db: Session, user: UserCreate):
+    fake_hashed_password = user.password + "notreallyhashed"
+    db_user = User(email=user.email, hashed_password=fake_hashed_password)
+    db.add(db_user)
+    db.commit()
+    db.refresh(db_user)
+    return db_user

+ 4 - 1
app/db/session.py

@@ -1,7 +1,10 @@
 from sqlalchemy import create_engine
+from sqlalchemy.ext.declarative import declarative_base
 from sqlalchemy.orm import sessionmaker
 
 from app.core.config import settings
 
-engine = create_engine(settings.SQLALCHEMY_DATABASE_URI, pool_pre_ping=True)
+engine = create_engine(settings.SQLALCHEMY_DATABASE_URL, pool_pre_ping=True)
 SessionLocal = sessionmaker(autocommit=False, autoflush=False, bind=engine)
+
+Base = declarative_base()

+ 3 - 1
app/main.py

@@ -7,7 +7,7 @@ import uvicorn
 from fastapi import FastAPI
 from loguru import logger
 
-from app.api.routers import targets, equipment, space
+from app.api.routers import targets, equipment, space, item, user
 from app.core.config import settings
 from app.core.events import create_start_app_handler
 from app.core.logger import InterceptHandler
@@ -24,6 +24,8 @@ def get_application() -> FastAPI:
     application.include_router(equipment.router, prefix='/equip', tags=['equipment'])
     application.include_router(space.router, prefix='/room', tags=['spaces'])
     application.include_router(targets.router, prefix='/target', tags=['targets'])
+    application.include_router(item.router, prefix='/items', tags=['items'])
+    application.include_router(user.router, prefix='/users', tags=['users'])
 
     return application
 

+ 1 - 1
app/models/__init__.py

@@ -1 +1 @@
-from .item import Item
+# from .item import Item

+ 8 - 2
app/models/item.py

@@ -1,9 +1,15 @@
-from sqlalchemy import Column, Integer, String
+from sqlalchemy import Column, Integer, String, ForeignKey
+from sqlalchemy.orm import relationship
 
-from app.db.base_class import Base
+from app.db.session import Base
 
 
 class Item(Base):
+    __tablename__ = "items"
+
     id = Column(Integer, primary_key=True, index=True)
     title = Column(String, index=True)
     description = Column(String, index=True)
+    owner_id = Column(Integer, ForeignKey("users.id"))
+
+    owner = relationship("User", back_populates="items")

+ 15 - 0
app/models/user.py

@@ -0,0 +1,15 @@
+from sqlalchemy import Boolean, Column, String, Integer
+from sqlalchemy.orm import relationship
+
+from app.db.session import Base
+
+
+class User(Base):
+    __tablename__ = "users"
+
+    id = Column(Integer, primary_key=True, index=True)
+    email = Column(String, unique=True, index=True)
+    hashed_password = Column(String)
+    is_active = Column(Boolean, default=True)
+
+    items = relationship("Item", back_populates="owner")

+ 1 - 1
app/schemas/__init__.py

@@ -1 +1 @@
-from .item import Item, ItemCreate, ItemInDB, ItemUpdate
+# from .item import Item, ItemCreate, ItemInDB, ItemUpdate

+ 3 - 15
app/schemas/item.py

@@ -4,29 +4,17 @@ from pydantic import BaseModel
 
 
 class ItemBase(BaseModel):
-    id: int
-    title: Optional[str] = None
+    title: str
     description: Optional[str] = None
 
 
 class ItemCreate(ItemBase):
-    title: str
-
-
-class ItemUpdate(ItemBase):
     pass
 
 
-class ItemInDBBase(ItemBase):
+class Item(ItemBase):
     id: int
+    owner_id: int
 
     class Config:
         orm_mode = True
-
-
-class Item(ItemInDBBase):
-    pass
-
-
-class ItemInDB(ItemInDBBase):
-    pass

+ 22 - 0
app/schemas/user.py

@@ -0,0 +1,22 @@
+from typing import List
+
+from pydantic import BaseModel
+
+from app.schemas.item import Item
+
+
+class UserBase(BaseModel):
+    email: str
+
+
+class UserCreate(UserBase):
+    password: str
+
+
+class User(UserBase):
+    id: int
+    is_active: bool
+    items: List[Item] = []
+
+    class Config:
+        orm_mode = True