Procházet zdrojové kódy

add pydantic model/ORM model

conradlan před 3 roky
rodič
revize
a43ae5372d
6 změnil soubory, kde provedl 99 přidání a 3 odebrání
  1. 12 0
      crud.py
  2. 15 0
      database.py
  3. 26 3
      main.py
  4. 20 0
      models.py
  5. 2 0
      requiremnets.txt
  6. 24 0
      schemas.py

+ 12 - 0
crud.py

@@ -0,0 +1,12 @@
+from sqlalchemy.orm import Session
+
+from . import models, schemas
+
+def create_user(db: Session, user: schemas.UserInfo):
+    db_user = models.UserInfo(
+        email=user.email, name=user.name, order_id=user.order_id, phone=user.phone
+        )
+    db.add(db_user)
+    db.commit()
+    db.refresh(db_user)
+    return db_user

+ 15 - 0
database.py

@@ -0,0 +1,15 @@
+from sqlalchemy import create_engine
+from sqlalchemy.ext.declarative import declarative_base
+from sqlalchemy.orm import sessionmaker
+
+
+## ENV LOAD
+SQLALCHEMY_DATABASE_URL = 'mysql://choozmo:pAssw0rd@db.ptt.cx:3306/DBNAME?charset=utf8mb4'
+
+engine = create_engine(SQLALCHEMY_DATABASE_URL)
+SessionLocal = sessionmaker(autocommit=False, autoflush=False, bind=engine)
+Base = declarative_base()
+
+
+
+### define database session, deal with database setup and connection

+ 26 - 3
main.py

@@ -4,15 +4,25 @@ import os
 import logging
 from typing import AsyncContextManager, Optional
 from fastapi import FastAPI, Request, responses
+from fastapi.params import Depends
 from fastapi.templating import Jinja2Templates
 from pydantic import BaseModel
 from dotenv import load_dotenv
 from os.path import join, dirname
 from linepay import LinePayApi
+from pydantic.errors import UrlSchemeError
 from starlette.responses import HTMLResponse
+from pydantic import BaseModel, EmailStr, validator
+from sqlalchemy.orm import Session
+from . import crud, models, schemas
+from .database import SessionLocal, engine
+
+
+
 
 # dotenv
 dotenv_path = join(dirname(__file__),'./env/.env')
+# dotenv_path = join(dirname(__file__),'./env/test.env') ## sandbox
 load_dotenv(dotenv_path)
 
 # logger (TBD)
@@ -24,15 +34,28 @@ templates = Jinja2Templates(directory="templates")
 LINE_PAY_CHANNEL_ID = os.environ.get("LINE_PAY_CHANNEL_ID")
 LINE_PAY_CHANNEL_SECRET = os.environ.get("LINE_PAY_CHANNEL_SECRET")
 LINE_PAY_REQEST_BASE_URL = "https://{}".format(os.environ.get("HOST_NAME"))
-line = LinePayApi(LINE_PAY_CHANNEL_ID, LINE_PAY_CHANNEL_SECRET, is_sandbox=True)
+line = LinePayApi(LINE_PAY_CHANNEL_ID, LINE_PAY_CHANNEL_SECRET, is_sandbox=False)
+# line = LinePayApi(LINE_PAY_CHANNEL_ID, LINE_PAY_CHANNEL_SECRET, is_sandbox=True)
 
 # CACHE
 CACHE = {}
 
 
+
+# db
+models.Base.metadata.create_all(bind=engine)
+
 # Fastapi
 app = FastAPI()
 
+# Dependency
+def get_db():
+    db = SessionLocal()
+    try:
+        yield db
+    finally:
+        db.close()
+
 
 
 @app.get('/')
@@ -40,8 +63,8 @@ def hellow():
     return {"Hello" : "World"}
 
 ## Request
-@app.get('/request', response_class=HTMLResponse)
-async def pay_request(request: Request):
+@app.post('/request', response_class=HTMLResponse)
+async def pay_request(userinfo: schemas.UserInfo, db: Session = Depends(get_db)):
     order_id = str(uuid.uuid4())
     amount = 1200
     currency = "TWD"

+ 20 - 0
models.py

@@ -0,0 +1,20 @@
+from sqlalchemy import Column, Integer, String, DateTime
+from sqlalchemy.engine.base import Transaction
+
+from .database import Base
+from datetime import datetime
+
+
+class order_info_linepay(Base):
+    __tablename__ = "order_info_linepay"
+    
+    id = Column(Integer, primary_key=True, nullable=False)
+    order_id = Column(String(255), unique=True, nullable=False)
+    email = Column(String(255), nullable=False)
+    phone = Column(String(20))
+    full_name = Column(String(50))
+    transaction_date = Column(DateTime, nullable=False, default=datetime.now())
+
+
+
+## this is for ORM model  define database model

+ 2 - 0
requiremnets.txt

@@ -4,6 +4,7 @@ certifi==2021.10.8
 charset-normalizer==2.0.7
 click==8.0.3
 fastapi==0.70.0
+greenlet==1.1.2
 gunicorn==20.1.0
 h11==0.12.0
 httptools==0.2.0
@@ -16,6 +17,7 @@ python-dotenv==0.19.1
 PyYAML==6.0
 requests==2.26.0
 sniffio==1.2.0
+SQLAlchemy==1.4.25
 starlette==0.16.0
 typing-extensions==3.10.0.2
 unicorn==1.0.3

+ 24 - 0
schemas.py

@@ -0,0 +1,24 @@
+from typing import Optional
+
+from pydantic import BaseModel, validator, EmailStr
+from datetime import datetime
+
+
+# UserInfo
+class order_info_linepay(BaseModel):
+    id: int
+    # UUID4 validation???
+    order_id: str
+    email: EmailStr
+    # phone: phone??
+    # @validator('phone')
+    # def check_phone()
+    phone: Optional[str] = None
+    full_name: Optional[str] = None
+    transaction_date: datetime = datetime.now()
+
+    ## this is to avoid lazy loading problem
+    class Config:
+        orm_mode = True
+
+## this is for data parsing&&&data validation