Browse Source

Merge branch 'master' of http://git.choozmo.com:3000/conradlan/ark_backend

CJYen 3 years ago
parent
commit
456b82ae18

+ 1 - 1
app/api/api_v1/api.py

@@ -6,4 +6,4 @@ api_router = APIRouter()
 api_router.include_router(login.router, tags=["login"])
 api_router.include_router(users.router, prefix="/user", tags=["user"])
 api_router.include_router(nft.router, prefix="/nft", tags=["nft"])
-api_router.include_router(line.router,prefix="/line", tags=["line"])
+api_router.include_router(line.router, prefix="/line", tags=["line"])

+ 2 - 0
app/api/api_v1/endpoints/line.py

@@ -1,3 +1,5 @@
+import pymysql
+pymysql.install_as_MySQLdb()
 import uvicorn
 import fastapi
 from fastapi.middleware.cors import CORSMiddleware

+ 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
     """

+ 27 - 4
app/api/api_v1/endpoints/nft.py

@@ -9,18 +9,19 @@ from app.api import deps
 router = APIRouter()
 
 
-@router.get("/", response_model=List[schemas.NftBase])
+@router.get("/", response_model=List[schemas.NftPrint])
+# @router.get("/")
 def read_items(
     db: Session = Depends(deps.get_db),
     skip: int = 0,
     limit: int = 100,
-    current_user: models.users = Depends(deps.get_current_active_user),
+    current_user: models.users = Depends(deps.get_current_active_superuser),
 ) -> Any:
     """
     Retrieve items.
     """
     if crud.user.is_superuser(current_user):
-        nfts = crud.nft.get_multi(db, skip=skip, limit=limit)
+        nfts = crud.nft.get_group_by_title(db, skip=skip, limit=limit)
     else:
         nfts = crud.nft.get_multi_by_owner(
             db=db, owner_id=current_user.userid, skip=skip, limit=limit
@@ -38,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
 
 
@@ -80,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)

+ 27 - 12
app/crud/crud_nft.py

@@ -1,21 +1,37 @@
-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.models.nft import Nft
+from app.schemas.nft import NftBase, NftCreate, NftUpdate # noqa
 
 
-class CRUDUser(CRUDBase[nft, NftBase, NftCreate]):
+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()
-
-    def create_with_owner(self, db: Session, *, obj_in: NftCreate, owner_id:str) -> nft:
-        db_obj = nft(
+    ) -> List[Nft]:
+        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).label('count'))\
+            .group_by(Nft.title).offset(skip).limit(limit).all()
+
+    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,
             userid=owner_id,
@@ -30,5 +46,4 @@ class CRUDUser(CRUDBase[nft, NftBase, NftCreate]):
         return db_obj
 
 
-
-nft = CRUDUser(nft)
+nft = CRUDNft(Nft)

+ 2 - 1
app/main.py

@@ -7,10 +7,11 @@ from app.core.config import settings
 app = FastAPI(title=settings.PROJECT_NAME, openapi_url=f"{settings.API_V1_STR}/openapi.json")
 
 # 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=["*"],
         allow_headers=["*"],

+ 1 - 1
app/models/__init__.py

@@ -1,2 +1,2 @@
 from .user import users
-from .nft import nft
+from .nft import Nft

+ 1 - 1
app/models/nft.py

@@ -3,7 +3,7 @@ from sqlalchemy.sql.sqltypes import Integer
 from app.db.base_class import Base
 
 
-class nft(Base):
+class Nft(Base):
     id = Column(Integer, primary_key=True, nullable=False)
     hash = Column(String(200), unique=True)
     imgurl = Column(String(200))

+ 9 - 1
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,6 +16,14 @@ class NftBase(BaseModel):
         orm_mode = True
 
 
+class NftPrint(BaseModel):
+    Nft: Optional[NftBase] = None
+    count: Optional[int] = None
+
+    class Config:
+        orm_mode = True
+
+
 class NftCreate(NftBase):
     pass