Select Git revision
inputFiles.lst
server.py 4.48 KiB
# 서버 메인
# REST API로 만들면 될 듯
"""
GET: /user/get/{name}, /user/all
POST: /user/create
"""
from typing import Dict
import uvicorn
from fastapi import Depends, FastAPI
from fastapi.encoders import jsonable_encoder
from fastapi.middleware.cors import CORSMiddleware
from fastapi.responses import JSONResponse
from sqlalchemy.orm import Session
import db_model.crud as crud
import db_model.database
import db_model.models
import db_model.schemas as schemas
from config import Config, Error
db_model.models.Base.metadata.create_all(bind=db_model.database.engine)
app = FastAPI(title="오늘의 메뉴", description="소프트웨어공학", version="1.0.0")
app.add_middleware(
CORSMiddleware,
allow_origins=["*"],
allow_methods=["GET", "POST"],
allow_headers=["*"],
allow_credentials=True,
)
# Dependency
def get_db():
db = db_model.database.SessionLocal()
try:
yield db
finally:
db.close()
@app.get("/")
async def hello():
return "오늘의 메뉴 서버 작동 중!"
@app.get("/user/get/{name}")
async def get_user(name: str, db: Session = Depends(get_db)):
"""유저 정보 얻기 by 이름
Args:
name (str): 유저 이름
Returns:
JSON: 유저 정보
"""
user = crud.get_user_by_user_name(db=db, user_name=name)
if user is None:
return JSONResponse({"error": Error.USER_NON_EXIST})
is_password_correct = crud.check_username_password(db, user)
print(is_password_correct)
return JSONResponse(
{"name": user.name, "email": user.email, "fav_menus": user.fav_menus}
)
@app.post("/user/check")
async def check_username_password(
user: schemas.UserAuthenticate, db: Session = Depends(get_db)
):
db_user = crud.get_user_by_user_name(db, user_name=user.name)
if db_user is None:
return JSONResponse({"error": Error.USER_NON_EXIST})
is_password_correct = crud.check_username_password(db, user)
return JSONResponse({"name": user.name, "code": is_password_correct})
@app.get("/user/all")
async def get_all_users(db: Session = Depends(get_db)):
"""모든 유저 불러오기
Returns:
JSON: 유저들 정보
"""
db_users = crud.get_all_users(db=db)
users = tuple(jsonable_encoder(user, exclude={"id"}) for user in db_users)
return JSONResponse({"users": users})
@app.post("/user/create")
async def create_user(content: Dict, db: Session = Depends(get_db)):
"""유저 생성 함수
Args:
content (Dict): {"user_name": "유저이름", "user_password": "test1",
"user_email": "test@ajou.ac.kr", "user_fav_menus": "라면,떡볶이"}
Returns:
JSON: if user doesn't exist return new user's infomation in JSON format
"""
user_name, user_password, user_email, user_fav_menus = (
content["user_name"],
content["user_password"],
content["user_email"],
content["user_fav_menus"],
)
user = crud.get_user_by_user_name(
db=db, user_name=user_name
) # TODO check_duplicate 함수 만들기
if user is None:
user = crud.create_user(
db=db,
name=user_name,
password=user_password,
email=user_email,
fav_menus=user_fav_menus,
)
return JSONResponse(
content={
"name": user.name,
"email": user.email,
"fav_menus": user.fav_menus,
}
)
else:
return JSONResponse(content={"error": Error.USER_DUPLICATE})
""" ------------------------- 구현 중 """
@app.post("/review/post")
async def review_post(db: Session = Depends(get_db)):
review = crud.post_new_review() # 이미 존재하는 리뷰를 수정? / 계속 새로운 리뷰를 올릴 수 있음
return JSONResponse(content={})
@app.post("/review/edit")
async def review_edit(db: Session = Depends(get_db)):
review = crud.get_my_review()
return JSONResponse(content={})
@app.get("/menu/all")
async def get_all_menu(db: Session = Depends(get_db)):
menus = crud.get_all_menu() # 필터링 기능 추가해서 식당마다 불러오는 것도 좋을듯
return JSONResponse(content={})
@app.get("/menu/get/{name}")
async def get_menu_by_name(db: Session = Depends(get_db)):
menu = crud.get_menu_by_name()
return JSONResponse(content={})
""" ------------------------- """
if __name__ == "__main__":
uvicorn.run(
"server:app", host="0.0.0.0", port=Config.PORT, log_level="info", reload=True
)