From fb4beedd7ee92777711a854c1c264db460a38d49 Mon Sep 17 00:00:00 2001
From: zhaoqingang <zhaoqg0118@163.com>
Date: 星期五, 11 四月 2025 09:56:29 +0800
Subject: [PATCH] 首页模型

---
 app/api/__init__.py |  107 ++++++++++++++++++++++++++++++++++++++++++++++++++++-
 1 files changed, 104 insertions(+), 3 deletions(-)

diff --git a/app/api/__init__.py b/app/api/__init__.py
index 51c31da..de2282f 100644
--- a/app/api/__init__.py
+++ b/app/api/__init__.py
@@ -1,18 +1,29 @@
+import urllib
+from datetime import datetime
+from typing import Callable, Any
+from urllib.parse import urlencode
+
 import jwt
-from fastapi import FastAPI, Depends, HTTPException
+# from cryptography.fernet import Fernet
+from fastapi import FastAPI, Depends, HTTPException, Header, Request
 from fastapi.security import OAuth2PasswordBearer
 from passlib.context import CryptContext
 from pydantic import BaseModel
 from starlette import status
 from starlette.websockets import WebSocket, WebSocketDisconnect
 
-from app.models.user_model import UserModel
+from Log import logger
+from app.models.base_model import SessionLocal
+# from app.models.app_model import AppRegisterModel
+from app.models.user_model import UserModel, UserApiTokenModel
 from app.service.auth import SECRET_KEY, ALGORITHM
+from app.config.config import settings
 
 app = FastAPI()
 
 pwd_context = CryptContext(schemes=["bcrypt"], deprecated="auto")
 oauth2_scheme = OAuth2PasswordBearer(tokenUrl="token")
+# cipher_suite = Fernet(settings.HASH_SUB_KEY)
 
 
 class Response(BaseModel):
@@ -21,9 +32,50 @@
     data: dict = {}
 
 
+class ResponseList(BaseModel):
+    code: int = 200
+    msg: str = ""
+    data: list[dict] = []
+
+
+def verify_token(token: str) -> Any:
+    """
+    楠岃瘉 Token 鏄惁鏈夋晥
+    """
+    db = SessionLocal()
+    try:
+        db_token = db.query(UserApiTokenModel).filter(UserApiTokenModel.token == token, UserApiTokenModel.is_active == 1).first()
+        return db_token is not None and (db_token.expires_at is None or db_token.expires_at > datetime.now())
+    finally:
+        db.close()
+
+def token_required()-> Callable:
+    def decorated_function(request: Request)-> Any:
+        authorization_str = request.headers.get("Authorization")
+        if not authorization_str:
+            raise HTTPException(status_code=401, detail="Authorization` can't be empty")
+        authorization_list = authorization_str.split()
+        if len(authorization_list) < 2:
+            raise HTTPException(status_code=401, detail="Invalid token")
+        token = authorization_list[1]
+        objs = verify_token(token)
+        if not objs:
+            raise HTTPException(status_code=401, detail="Invalid token")
+        user = UserModel(username="", id=objs.user_id)
+        return user
+    return decorated_function
+
 def get_current_user(token: str = Depends(oauth2_scheme)):
     try:
         payload = jwt.decode(token, SECRET_KEY, algorithms=[ALGORITHM])
+        expired_time = payload.get("lex")
+        if not expired_time:
+            raise HTTPException(status_code=status.HTTP_401_UNAUTHORIZED,  detail="浠ょ墝鏃犳晥鎴栧凡杩囨湡",
+            headers={"WWW-Authenticate": "Bearer"})
+        if datetime.strptime(expired_time, "%Y-%m-%d %H:%M:%S") < datetime.now():
+            raise HTTPException(status_code=status.HTTP_401_UNAUTHORIZED,  detail="绯荤粺鎺堟潈宸茶繃鏈燂紒",
+            headers={"WWW-Authenticate": "Bearer"})
+
         username: str = payload.get("sub")
         if username is None:
             raise HTTPException(
@@ -66,4 +118,53 @@
     except jwt.PyJWTError as e:
         print(e)
         await websocket.close(code=1008)
-        raise WebSocketDisconnect(code=status.WS_1008_POLICY_VIOLATION)
\ No newline at end of file
+        raise WebSocketDisconnect(code=status.WS_1008_POLICY_VIOLATION)
+
+
+def format_file_url(agent_id: str, file_url: str, doc_id: str = None, doc_name: str = None) -> str:
+    if file_url:
+        # 瀵� file_url 杩涜 URL 缂栫爜
+        encoded_file_url = urllib.parse.quote(file_url, safe=':/')
+        return f"./api/files/download/?url={encoded_file_url}&agent_id={agent_id}"
+
+    if doc_id:
+        # 瀵� doc_id 鍜� doc_name 杩涜 URL 缂栫爜
+        encoded_doc_id = urllib.parse.quote(doc_id, safe='')
+        encoded_doc_name = urllib.parse.quote(doc_name, safe='')
+        return f"./api/files/download/?doc_id={encoded_doc_id}&doc_name={encoded_doc_name}&agent_id={agent_id}"
+
+    return file_url
+
+
+def process_files(files, agent_id):
+    """
+    澶勭悊鏂囦欢鍒楄〃锛屾牸寮忓寲姣忎釜鏂囦欢鐨� URL銆�
+
+    :param files: 鏂囦欢鍒楄〃锛屾瘡涓枃浠舵槸涓�涓瓧鍏�
+    :param agent_id: 浠g悊 ID
+    """
+    if not files:
+        return  # 濡傛灉鏂囦欢鍒楄〃涓虹┖锛岀洿鎺ヨ繑鍥�
+
+    for file in files:
+        if "file_url" in file and file["file_url"]:
+            try:
+                file["file_url"] = format_file_url(agent_id, file["file_url"])
+            except Exception as e:
+                # 璁板綍寮傚父淇℃伅锛屼絾缁х画澶勭悊鍏朵粬鏂囦欢
+                print(f"Error processing file URL: {e}")
+
+def get_api_key(authorization: str = Header(...)):
+    if not authorization.startswith("Bearer "):
+        raise HTTPException(status_code=401, detail="Invalid Authorization header format.")
+    return authorization.split(" ")[1]
+
+
+
+if __name__=="__main__":
+
+    files1 = [{"file_url": "aaa.com"}, {"file_url":"bbb.com"}]
+    print(files1)
+
+    process_files(files1,11111)
+    print(files1)
\ No newline at end of file

--
Gitblit v1.8.0