|
|
@@ -0,0 +1,84 @@
|
|
|
+from typing import Dict
|
|
|
+import json
|
|
|
+
|
|
|
+from fastapi import APIRouter, Depends, HTTPException
|
|
|
+from fastapi.security import OAuth2PasswordBearer
|
|
|
+from passlib.context import CryptContext
|
|
|
+from sqlalchemy.orm import Session
|
|
|
+
|
|
|
+from app.api import Response
|
|
|
+from app.config.config import settings
|
|
|
+from app.models.base_model import get_db
|
|
|
+from app.models.token_model import upsert_token
|
|
|
+from app.models.user import User, UserCreate, LoginData
|
|
|
+from app.models.user_model import UserModel
|
|
|
+from app.service.auth import authenticate_user, create_access_token
|
|
|
+from app.service.bisheng import BishengService
|
|
|
+from app.service.ragflow import RagflowService
|
|
|
+
|
|
|
+router = APIRouter()
|
|
|
+
|
|
|
+pwd_context = CryptContext(schemes=["bcrypt"], deprecated="auto")
|
|
|
+oauth2_scheme = OAuth2PasswordBearer(tokenUrl="token")
|
|
|
+
|
|
|
+
|
|
|
+@router.post("/register", response_model=Response)
|
|
|
+async def register(user: UserCreate, db=Depends(get_db)):
|
|
|
+ db_user = db.query(UserModel).filter(UserModel.username == user.username).first()
|
|
|
+ if db_user:
|
|
|
+ return Response(code=200, msg="Username already registered")
|
|
|
+
|
|
|
+ bisheng_service = BishengService(settings.bisheng_base_url)
|
|
|
+ ragflow_service = RagflowService(settings.ragflow_base_url)
|
|
|
+
|
|
|
+ # 注册到毕昇
|
|
|
+ try:
|
|
|
+ await bisheng_service.register(user.username, user.password)
|
|
|
+ except Exception as e:
|
|
|
+ return Response(code=500, msg=f"Failed to register with Bisheng: {str(e)}")
|
|
|
+
|
|
|
+ # 注册到ragflow
|
|
|
+ try:
|
|
|
+ await ragflow_service.register(user.username, user.password)
|
|
|
+ except Exception as e:
|
|
|
+ return Response(code=500, msg=f"Failed to register with Ragflow: {str(e)}")
|
|
|
+
|
|
|
+ # 存储用户信息
|
|
|
+ hashed_password = pwd_context.hash(user.password)
|
|
|
+ db_user = UserModel(username=user.username, hashed_password=hashed_password)
|
|
|
+ db.add(db_user)
|
|
|
+ db.commit()
|
|
|
+ db.refresh(db_user)
|
|
|
+ return Response(code=200, msg="User registered successfully",data={"username": db_user.username})
|
|
|
+
|
|
|
+
|
|
|
+@router.post("/login", response_model=Response)
|
|
|
+async def login(login_data: LoginData, db: Session = Depends(get_db)):
|
|
|
+ user = authenticate_user(db, login_data.username, login_data.password)
|
|
|
+ if not user:
|
|
|
+ return Response(code=400, msg="Incorrect username or password")
|
|
|
+
|
|
|
+ bisheng_service = BishengService(settings.bisheng_base_url)
|
|
|
+ ragflow_service = RagflowService(settings.ragflow_base_url)
|
|
|
+
|
|
|
+ # 登录到毕昇
|
|
|
+ try:
|
|
|
+ bisheng_token = await bisheng_service.login(login_data.username, login_data.password)
|
|
|
+ except Exception as e:
|
|
|
+ return Response(code=500, msg=f"Failed to login with Bisheng: {str(e)}")
|
|
|
+
|
|
|
+ # 登录到ragflow
|
|
|
+ try:
|
|
|
+ ragflow_token = await ragflow_service.login(login_data.username, login_data.password)
|
|
|
+ except Exception as e:
|
|
|
+ return Response(code=500, msg=f"Failed to login with Ragflow: {str(e)}")
|
|
|
+
|
|
|
+ # 创建本地token
|
|
|
+ access_token = create_access_token(data={"sub": user.username})
|
|
|
+
|
|
|
+ upsert_token(db, user.id, access_token, bisheng_token, ragflow_token)
|
|
|
+
|
|
|
+ return Response(code=200, msg="Login successful", data={
|
|
|
+ "access_token": access_token,
|
|
|
+ "token_type": "bearer"
|
|
|
+ })
|