|
@@ -17,10 +17,14 @@ from fastapi.openapi.docs import (
|
|
|
get_swagger_ui_html,
|
|
|
get_swagger_ui_oauth2_redirect_html,
|
|
|
)
|
|
|
-from sqlalchemy import create_engine
|
|
|
+from sqlalchemy import create_engine, and_
|
|
|
from sqlalchemy.orm import Session, sessionmaker
|
|
|
from sqlalchemy.ext.declarative import declarative_base
|
|
|
+from agent.models.db.graph import DbUserDataRelation as UserDataRelation
|
|
|
from pydantic import BaseModel, ConfigDict, Field, field_serializer
|
|
|
+
|
|
|
+from agent.libs.auth import SessionValues, verify_session_id
|
|
|
+from agent.libs.user_data_relation import UserDataRelationBusiness
|
|
|
from agent.models.web.knowledge_base import Base, KnowledgeBase, KnowledgeFile
|
|
|
from agent.utils import DatabaseUtils, MinioUtils, FileUtils
|
|
|
from config.site import settings
|
|
@@ -41,6 +45,7 @@ class KnowledgeBaseResponse(BaseModel):
|
|
|
description: Optional[str] = None
|
|
|
tags: Optional[str] = None
|
|
|
creator: Optional[str] = None
|
|
|
+ user_name: Optional[str] = None # 新增字段
|
|
|
file_count: int = 0
|
|
|
created_at: datetime = Field(default_factory=datetime.utcnow)
|
|
|
updated_at: datetime = Field(default_factory=datetime.utcnow)
|
|
@@ -59,6 +64,7 @@ class KnowledgeFileResponse(BaseModel):
|
|
|
file_size: float
|
|
|
file_type: str
|
|
|
minio_url: str
|
|
|
+ user_name: Optional[str] = None # 用户名
|
|
|
version: Optional[str] = None
|
|
|
author: Optional[str] = None
|
|
|
year: Optional[int] = None
|
|
@@ -146,8 +152,26 @@ class BatchFileUpdate(BaseModel):
|
|
|
# 使用utils.py中的FileUtils类进行文件转换
|
|
|
|
|
|
@router.post("/knowledge-base/", response_model=ResponseModel)
|
|
|
-def create_knowledge_base(kb: KnowledgeBaseCreate, db: Session = Depends(get_db)):
|
|
|
- kb_data = DatabaseUtils.create_knowledge_base(db, kb.name, kb.description, kb.tags)
|
|
|
+def create_knowledge_base(kb: KnowledgeBaseCreate, db: Session = Depends(get_db),
|
|
|
+ sess:SessionValues = Depends(verify_session_id)):
|
|
|
+ # 1. 从session获取user_id
|
|
|
+ user_id = sess.user_id
|
|
|
+ user_name = sess.username
|
|
|
+
|
|
|
+ # 2. 创建知识库
|
|
|
+ kb_data = DatabaseUtils.create_knowledge_base(db, kb.name, user_id, kb.description, kb.tags)
|
|
|
+
|
|
|
+ # 3. 创建用户数据关联
|
|
|
+ relation_business = UserDataRelationBusiness(db)
|
|
|
+ relation = relation_business.create_relation(
|
|
|
+ user_id=user_id,
|
|
|
+ data_category='KnowledgeBase',
|
|
|
+ data_id=kb_data.id,
|
|
|
+ user_name=user_name,
|
|
|
+ role_id=None,
|
|
|
+ role_name=None
|
|
|
+ )
|
|
|
+
|
|
|
return ResponseModel(
|
|
|
code=200,
|
|
|
message="创建成功",
|
|
@@ -180,10 +204,12 @@ def get_knowledge_base(kb_id: int, db: Session = Depends(get_db)):
|
|
|
kb = db.query(KnowledgeBase).filter(KnowledgeBase.id == kb_id, KnowledgeBase.is_deleted == 0).first()
|
|
|
if not kb:
|
|
|
raise HTTPException(status_code=404, detail="知识库不存在")
|
|
|
+
|
|
|
+ kb_data = KnowledgeBaseResponse.model_validate(kb).model_dump()
|
|
|
return ResponseModel(
|
|
|
code=200,
|
|
|
message="查询成功",
|
|
|
- data=KnowledgeBaseResponse.model_validate(kb).model_dump()
|
|
|
+ data=kb_data
|
|
|
)
|
|
|
|
|
|
|
|
@@ -222,13 +248,18 @@ def get_knowledge_base_by_name(name: str, db: Session = Depends(get_db)):
|
|
|
async def upload_files(
|
|
|
kb_id: int,
|
|
|
files: List[UploadFile] = File(...),
|
|
|
- db: Session = Depends(get_db)
|
|
|
+ db: Session = Depends(get_db),
|
|
|
+ sess: SessionValues = Depends(verify_session_id) # 添加session依赖
|
|
|
):
|
|
|
# 验证知识库是否存在
|
|
|
kb = db.query(KnowledgeBase).filter(KnowledgeBase.id == kb_id, KnowledgeBase.is_deleted == 0).first()
|
|
|
if not kb:
|
|
|
raise HTTPException(status_code=404, detail="知识库不存在")
|
|
|
|
|
|
+ # 获取当前用户信息
|
|
|
+ user_id = sess.user_id
|
|
|
+ user_name = sess.username
|
|
|
+
|
|
|
# 验证文件数量
|
|
|
if len(files) > settings.MAX_FILE_COUNT:
|
|
|
raise HTTPException(status_code=400, detail=f"单次上传文件数量不能超过{settings.MAX_FILE_COUNT}个")
|
|
@@ -303,11 +334,23 @@ async def upload_files(
|
|
|
file_size=file_size,
|
|
|
file_type=file_ext,
|
|
|
minio_url=minio_url,
|
|
|
- creator=kb.creator, # 使用知识库的创建人作为文件创建人
|
|
|
+ creator=user_id,
|
|
|
knowledge_type=knowledge_type
|
|
|
)
|
|
|
db.add(db_file)
|
|
|
uploaded_files.append(db_file)
|
|
|
+
|
|
|
+ # 创建用户数据关联
|
|
|
+ relation_business = UserDataRelationBusiness(db)
|
|
|
+ relation = relation_business.create_relation(
|
|
|
+ user_id=user_id,
|
|
|
+ data_category='KnowledgeFile',
|
|
|
+ data_id=db_file.id,
|
|
|
+ user_name=user_name,
|
|
|
+ role_id=None,
|
|
|
+ role_name=None
|
|
|
+ )
|
|
|
+
|
|
|
# 更新知识库文件计数
|
|
|
DatabaseUtils.increment_file_count(db, kb_id)
|
|
|
|
|
@@ -328,7 +371,13 @@ def list_files(kb_id: int, pageNo: int = 1, pageSize: int = 10, file_name: Optio
|
|
|
raise HTTPException(status_code=400, detail="每页条数必须大于等于1")
|
|
|
|
|
|
skip = (pageNo - 1) * pageSize
|
|
|
- query = db.query(KnowledgeFile).filter(
|
|
|
+ query = db.query(KnowledgeFile,UserDataRelation.user_name).\
|
|
|
+ outerjoin(UserDataRelation,
|
|
|
+ and_(
|
|
|
+ UserDataRelation.data_id == KnowledgeFile.id,
|
|
|
+ UserDataRelation.data_category == 'KnowledgeFile'
|
|
|
+ )).\
|
|
|
+ filter(
|
|
|
KnowledgeFile.knowledge_base_id == kb_id,
|
|
|
KnowledgeFile.is_deleted == 0
|
|
|
)
|
|
@@ -343,7 +392,12 @@ def list_files(kb_id: int, pageNo: int = 1, pageSize: int = 10, file_name: Optio
|
|
|
code=200,
|
|
|
message="查询成功",
|
|
|
data={
|
|
|
- "list": [KnowledgeFileResponse.model_validate(file).model_dump() for file in files],
|
|
|
+ "list": [KnowledgeFileResponse.model_validate(
|
|
|
+ {
|
|
|
+ **file[0].__dict__,
|
|
|
+ "user_name": file[1]
|
|
|
+ }
|
|
|
+ ).model_dump() for file in files],
|
|
|
"total": total
|
|
|
}
|
|
|
)
|
|
@@ -351,15 +405,28 @@ def list_files(kb_id: int, pageNo: int = 1, pageSize: int = 10, file_name: Optio
|
|
|
|
|
|
@router.get("/knowledge-base/{kb_id}/files/search/", response_model=ResponseModel)
|
|
|
def search_files(kb_id: int, file_name: str, db: Session = Depends(get_db)):
|
|
|
- files = db.query(KnowledgeFile).filter(
|
|
|
- KnowledgeFile.knowledge_base_id == kb_id,
|
|
|
- KnowledgeFile.file_name.ilike(f"%{file_name}%"),
|
|
|
- KnowledgeFile.is_deleted == 0
|
|
|
- ).all()
|
|
|
+ files = db.query(KnowledgeFile, UserDataRelation.user_name).\
|
|
|
+ join(UserDataRelation,
|
|
|
+ and_(
|
|
|
+ UserDataRelation.data_id == KnowledgeFile.id,
|
|
|
+ UserDataRelation.data_category == 'KnowledgeFile'
|
|
|
+ )).\
|
|
|
+ filter(
|
|
|
+ KnowledgeFile.knowledge_base_id == kb_id,
|
|
|
+ KnowledgeFile.file_name.ilike(f"%{file_name}%"),
|
|
|
+ KnowledgeFile.is_deleted == 0
|
|
|
+ ).all()
|
|
|
+
|
|
|
+ result = []
|
|
|
+ for file, user_name in files:
|
|
|
+ file_response = KnowledgeFileResponse.model_validate(file)
|
|
|
+ file_response.user_name = user_name
|
|
|
+ result.append(file_response.model_dump())
|
|
|
+
|
|
|
return ResponseModel(
|
|
|
code=200,
|
|
|
message="查询成功",
|
|
|
- data=[KnowledgeFileResponse.model_validate(file).model_dump() for file in files]
|
|
|
+ data=result
|
|
|
)
|
|
|
|
|
|
|