Ver Fonte

add cors && fix http error code

conradlan há 3 anos atrás
pai
commit
b851b01e03

+ 3 - 2
app/api/api_v1/endpoints/login.py

@@ -30,7 +30,7 @@ def login_access_token(
         db, account=form_data.username, password=form_data.password
     )
     if not user:
-        raise HTTPException(status_code=400, detail="Incorrect email or password")
+        raise HTTPException(status_code=401, detail="Incorrect email or password")
     elif not crud.user.is_active(user):
         raise HTTPException(status_code=400, detail="Inactive user")
     access_token_expires = timedelta(minutes=settings.ACCESS_TOKEN_EXPIRE_MINUTES)
@@ -43,7 +43,8 @@ def login_access_token(
 
 
 @router.post("/login/test-token", response_model=schemas.UserCreate)
-def test_token(current_user: models.users = Depends(deps.get_current_active_user)) -> Any:
+def test_token(
+    current_user: models.users = Depends(deps.get_current_active_user)) -> Any:
     """
     Test access token
     """

+ 24 - 2
app/api/api_v1/endpoints/nft.py

@@ -9,7 +9,7 @@ from app.api import deps
 router = APIRouter()
 
 
-@router.get("/", response_model=schemas.NftPrint)
+@router.get("/", response_model=List[schemas.NftPrint])
 # @router.get("/")
 def read_items(
     db: Session = Depends(deps.get_db),
@@ -39,7 +39,8 @@ def create_item(
     """
     Create new item.
     """
-    nft = crud.nft.create_with_owner(db=db, obj_in=item_in, owner_id=current_user.userid)
+    nft = crud.nft.create_with_owner(
+        db=db, obj_in=item_in, owner_id=current_user.userid)
     return nft
 
 
@@ -81,6 +82,27 @@ def read_item(
     return nft
 
 
+# @router.post("/title", response_model=schemas.NftCreate)
+@router.post("/title")
+def read_user_by_title(
+    *,
+    db: Session = Depends(deps.get_db),
+    title: str,
+    skip: int = 0,
+    limit: int = 100,
+    current_user: models.users = Depends(deps.get_current_active_user),
+) -> Any:
+    """
+    Get item by title.
+    """
+    nft = crud.nft.get_user_by_title(db=db, title=title, skip=skip, limit=limit)
+    if not nft:
+        raise HTTPException(status_code=404, detail="Item not found")
+    if not crud.user.is_superuser(current_user) and (nft.userid != current_user.userid):
+        raise HTTPException(status_code=400, detail="Not enough permissions")
+    return nft
+
+
 @router.delete("/{id}", response_model=schemas.NftCreate)
 def delete_item(
     *,

+ 3 - 3
app/core/config.py

@@ -10,11 +10,11 @@ class Settings(BaseSettings):
     # 60 minutes * 24 hours * 8 days = 8 days
     ACCESS_TOKEN_EXPIRE_MINUTES: int = 60 * 24 * 8
     SERVER_NAME: str = "api.ptt.cx"
-    SERVER_HOST: AnyHttpUrl = "http://api.ptt.cx"
+    SERVER_HOST: AnyHttpUrl = "https://api.ptt.cx"
     # BACKEND_CORS_ORIGINS is a JSON-formatted list of origins
     # e.g: '["http://localhost", "http://localhost:4200", "http://localhost:3000", \
     # "http://localhost:8080", "http://local.dockertoolbox.tiangolo.com"]'
-    BACKEND_CORS_ORIGINS: List[AnyHttpUrl] = []
+    BACKEND_CORS_ORIGINS: List[AnyHttpUrl] = ['http://localhost']
 
     @validator("BACKEND_CORS_ORIGINS", pre=True)
     def assemble_cors_origins(cls, v: Union[str, List[str]]) -> Union[List[str], str]:
@@ -24,7 +24,7 @@ class Settings(BaseSettings):
             return v
         raise ValueError(v)
 
-    PROJECT_NAME: str = "creator"
+    PROJECT_NAME: str = "Ark Backend"
     SENTRY_DSN: Optional[HttpUrl] = ""
 
     @validator("SENTRY_DSN", pre=True)

+ 16 - 7
app/crud/crud_nft.py

@@ -1,26 +1,36 @@
-from typing import Any, Dict, List, Optional, Union
+from typing import List
 
 from sqlalchemy.orm import Session
 from sqlalchemy import func
+from sqlalchemy.sql.elements import Null
 
-from app.core.security import get_password_hash, verify_password
 from app.crud.base import CRUDBase
 from app.models.nft import Nft
-from app.schemas.nft import NftBase, NftCreate, NftUpdate
+from app.schemas.nft import NftBase, NftCreate, NftUpdate # noqa
 
 
 class CRUDNft(CRUDBase[Nft, NftBase, NftCreate]):
     def get_multi_by_owner(
         self, db: Session, *, skip: int = 0, limit: int = 100, owner_id: str
     ) -> List[Nft]:
-        return db.query(Nft).filter(Nft.userid==owner_id).offset(skip).limit(limit).all()
+        return db.query(Nft).filter(
+            Nft.userid == owner_id).offset(skip).limit(limit).all()
 
     def get_group_by_title(
         self, db: Session, *, skip: int = 0, limit: int = 100
     ) -> List[Nft]:
-        return db.query(Nft, func.count(Nft.userid)).group_by(Nft.title)#.offset(skip).limit(limit).all()
+        return db.query(Nft, func.count(Nft.userid).label('count'))\
+            .group_by(Nft.title).offset(skip).limit(limit).all()
 
-    def create_with_owner(self, db: Session, *, obj_in: NftCreate, owner_id:str) -> Nft:
+    def get_user_by_title(
+        self, db: Session, *, skip: int = 0, limit: int = 100, title: str
+    ) -> List[Nft]:
+        return db.query(Nft.userid).filter(Nft.title == title, Nft.userid != None)\
+            .offset(skip).limit(limit).all() # noqa
+
+    def create_with_owner(
+        self, db: Session, *, obj_in: NftCreate, owner_id: str
+    ) -> Nft:
         db_obj = Nft(
             hash=obj_in.hash,
             imgurl=obj_in.imgurl,
@@ -36,5 +46,4 @@ class CRUDNft(CRUDBase[Nft, NftBase, NftCreate]):
         return db_obj
 
 
-
 nft = CRUDNft(Nft)

+ 1 - 1
app/main.py

@@ -9,10 +9,10 @@ app = FastAPI(
 )
 
 # Set all CORS enabled origins
+# allow_origins=[str(origin) for origin in settings.BACKEND_CORS_ORIGINS],
 if settings.BACKEND_CORS_ORIGINS:
     app.add_middleware(
         CORSMiddleware,
-        # allow_origins=[str(origin) for origin in settings.BACKEND_CORS_ORIGINS],
         allow_origins=["*"],
         allow_credentials=True,
         allow_methods=["*"],

+ 4 - 2
app/schemas/nft.py

@@ -6,7 +6,7 @@ from pydantic import BaseModel
 class NftBase(BaseModel):
     hash: Optional[str] = None
     imgurl: Optional[str] = None
-    userid: Optional[str] = True
+    userid: Optional[str] = None
     title: Optional[str] = None
     context: Optional[str] = None
     is_active: Optional[bool] = True
@@ -16,12 +16,14 @@ class NftBase(BaseModel):
         orm_mode = True
 
 
-class NftPrint(NftBase):
+class NftPrint(BaseModel):
+    Nft: Optional[NftBase] = None
     count: Optional[int] = None
 
     class Config:
         orm_mode = True
 
+
 class NftCreate(NftBase):
     pass