Skip to content
Snippets Groups Projects
Select Git revision
  • 7731aa532189da3ab355825802700786443a9ded
  • main default protected
2 results

server.py

Blame
  • 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
        )