feat: the people resource belong a user

This commit is contained in:
2025-11-23 22:36:17 +08:00
parent af8fa03e59
commit 3840080074
3 changed files with 42 additions and 12 deletions

View File

@@ -12,6 +12,7 @@ from utils.error import ErrorCode, error
class PeopleRLDBModel(RLDBBaseModel): class PeopleRLDBModel(RLDBBaseModel):
__tablename__ = 'peoples' __tablename__ = 'peoples'
id = Column(String(36), primary_key=True) id = Column(String(36), primary_key=True)
user_id = Column(String(36), index=True)
name = Column(String(255), index=True) name = Column(String(255), index=True)
contact = Column(String(255), index=True) contact = Column(String(255), index=True)
gender = Column(String(10)) gender = Column(String(10))
@@ -61,6 +62,8 @@ class Comment:
class People: class People:
# 数据库 ID # 数据库 ID
id: str id: str
# 所属用户 ID
user_id: str
# 姓名 # 姓名
name: str name: str
# 联系人 # 联系人
@@ -87,6 +90,7 @@ class People:
def __init__(self, **kwargs): def __init__(self, **kwargs):
# 初始化所有属性从kwargs中获取值如果不存在则设置默认值 # 初始化所有属性从kwargs中获取值如果不存在则设置默认值
self.id = kwargs.get('id', '') if kwargs.get('id', '') is not None else '' self.id = kwargs.get('id', '') if kwargs.get('id', '') is not None else ''
self.user_id = kwargs.get('user_id', '') if kwargs.get('user_id', '') is not None else ''
self.name = kwargs.get('name', '') if kwargs.get('name', '') is not None else '' self.name = kwargs.get('name', '') if kwargs.get('name', '') is not None else ''
self.contact = kwargs.get('contact', '') if kwargs.get('contact', '') is not None else '' self.contact = kwargs.get('contact', '') if kwargs.get('contact', '') is not None else ''
self.gender = kwargs.get('gender', '') if kwargs.get('gender', '') is not None else '' self.gender = kwargs.get('gender', '') if kwargs.get('gender', '') is not None else ''
@@ -121,6 +125,7 @@ class People:
# 将关系数据库模型转换为对象 # 将关系数据库模型转换为对象
return cls( return cls(
id=data.id, id=data.id,
user_id=data.user_id,
name=data.name, name=data.name,
contact=data.contact, contact=data.contact,
gender=data.gender, gender=data.gender,
@@ -138,6 +143,7 @@ class People:
# 将对象转换为字典格式 # 将对象转换为字典格式
return { return {
'id': self.id, 'id': self.id,
'user_id': self.user_id,
'name': self.name, 'name': self.name,
'contact': self.contact, 'contact': self.contact,
'gender': self.gender, 'gender': self.gender,
@@ -155,6 +161,7 @@ class People:
# 将对象转换为关系数据库模型 # 将对象转换为关系数据库模型
return PeopleRLDBModel( return PeopleRLDBModel(
id=self.id, id=self.id,
user_id=self.user_id,
name=self.name, name=self.name,
contact=self.contact, contact=self.contact,
gender=self.gender, gender=self.gender,

View File

@@ -1,4 +1,5 @@
from re import S
from typing import Protocol from typing import Protocol
import uuid import uuid
from sqlalchemy import Column, DateTime, String, create_engine, func from sqlalchemy import Column, DateTime, String, create_engine, func

View File

@@ -13,6 +13,7 @@ from models.people import People
from agents.extract_people_agent import ExtractPeopleAgent from agents.extract_people_agent import ExtractPeopleAgent
from utils import obs, ocr from utils import obs, ocr
from utils.config import get_instance as get_config from utils.config import get_instance as get_config
from utils.error import ErrorCode
api = FastAPI(title="Single People Management and Searching", version="0.1") api = FastAPI(title="Single People Management and Searching", version="0.1")
api.add_middleware( api.add_middleware(
@@ -84,18 +85,19 @@ def extract_people(text: str, cover_link: str = None) -> People:
class PostPeopleRequest(BaseModel): class PostPeopleRequest(BaseModel):
people: dict people: dict
@api.post("/api/people") @authorized_router.post("/api/people")
async def post_people(post_people_request: PostPeopleRequest): async def post_people(request: Request, post_people_request: PostPeopleRequest):
logging.debug(f"post_people_request: {post_people_request}") logging.debug(f"post_people_request: {post_people_request}")
people = People.from_dict(post_people_request.people) people = People.from_dict(post_people_request.people)
people.user_id = getattr(request.state, 'user_id', '')
service = get_people_service() service = get_people_service()
people.id, error = service.save(people) people.id, error = service.save(people)
if not error.success: if not error.success:
return BaseResponse(error_code=error.code, error_info=error.info) return BaseResponse(error_code=error.code, error_info=error.info)
return BaseResponse(error_code=0, error_info="success", data=people.id) return BaseResponse(error_code=0, error_info="success", data=people.id)
@api.put("/api/people/{people_id}") @authorized_router.put("/api/people/{people_id}")
async def update_people(people_id: str, post_people_request: PostPeopleRequest): async def update_people(request: Request, people_id: str, post_people_request: PostPeopleRequest):
logging.debug(f"post_people_request: {post_people_request}") logging.debug(f"post_people_request: {post_people_request}")
people = People.from_dict(post_people_request.people) people = People.from_dict(post_people_request.people)
people.id = people_id people.id = people_id
@@ -103,14 +105,22 @@ async def update_people(people_id: str, post_people_request: PostPeopleRequest):
res, error = service.get(people_id) res, error = service.get(people_id)
if not error.success or not res: if not error.success or not res:
return BaseResponse(error_code=error.code, error_info=error.info) return BaseResponse(error_code=error.code, error_info=error.info)
if res.user_id != getattr(request.state, 'user_id', ''):
return BaseResponse(error_code=ErrorCode.MODEL_ERROR.value, error_info="permission denied")
people.user_id = res.user_id
_, error = service.save(people) _, error = service.save(people)
if not error.success: if not error.success:
return BaseResponse(error_code=error.code, error_info=error.info) return BaseResponse(error_code=error.code, error_info=error.info)
return BaseResponse(error_code=0, error_info="success") return BaseResponse(error_code=0, error_info="success")
@api.delete("/api/people/{people_id}") @authorized_router.delete("/api/people/{people_id}")
async def delete_people(people_id: str): async def delete_people(request: Request, people_id: str):
service = get_people_service() service = get_people_service()
res, err = service.get(people_id)
if not err.success or not res:
return BaseResponse(error_code=err.code, error_info=err.info)
if res.user_id != getattr(request.state, 'user_id', ''):
return BaseResponse(error_code=ErrorCode.MODEL_ERROR.value, error_info="permission denied")
error = service.delete(people_id) error = service.delete(people_id)
if not error.success: if not error.success:
return BaseResponse(error_code=error.code, error_info=error.info) return BaseResponse(error_code=error.code, error_info=error.info)
@@ -121,8 +131,9 @@ class GetPeopleRequest(BaseModel):
conds: Optional[dict] = None conds: Optional[dict] = None
top_k: int = 5 top_k: int = 5
@api.get("/api/peoples") @authorized_router.get("/api/peoples")
async def get_peoples( async def get_peoples(
request: Request,
name: Optional[str] = Query(None, description="姓名"), name: Optional[str] = Query(None, description="姓名"),
gender: Optional[str] = Query(None, description="性别"), gender: Optional[str] = Query(None, description="性别"),
age: Optional[int] = Query(None, description="年龄"), age: Optional[int] = Query(None, description="年龄"),
@@ -134,6 +145,7 @@ async def get_peoples(
# 解析查询参数为字典 # 解析查询参数为字典
conds = {} conds = {}
conds["user_id"] = getattr(request.state, 'user_id', '')
if name: if name:
conds["name"] = name conds["name"] = name
if gender: if gender:
@@ -161,18 +173,28 @@ class RemarkRequest(BaseModel):
content: str content: str
@api.post("/api/people/{people_id}/remark") @authorized_router.post("/api/people/{people_id}/remark")
async def post_remark(people_id: str, request: RemarkRequest): async def post_remark(request: Request, people_id: str, body: RemarkRequest):
service = get_people_service() service = get_people_service()
error = service.save_remark(people_id, request.content) res, err = service.get(people_id)
if not err.success or not res:
return BaseResponse(error_code=err.code, error_info=err.info)
if res.user_id != getattr(request.state, 'user_id', ''):
return BaseResponse(error_code=ErrorCode.MODEL_ERROR.value, error_info="permission denied")
error = service.save_remark(people_id, body.content)
if not error.success: if not error.success:
return BaseResponse(error_code=error.code, error_info=error.info) return BaseResponse(error_code=error.code, error_info=error.info)
return BaseResponse(error_code=0, error_info="success") return BaseResponse(error_code=0, error_info="success")
@api.delete("/api/people/{people_id}/remark") @authorized_router.delete("/api/people/{people_id}/remark")
async def delete_remark(people_id: str): async def delete_remark(request: Request, people_id: str):
service = get_people_service() service = get_people_service()
res, err = service.get(people_id)
if not err.success or not res:
return BaseResponse(error_code=err.code, error_info=err.info)
if res.user_id != getattr(request.state, 'user_id', ''):
return BaseResponse(error_code=ErrorCode.MODEL_ERROR.value, error_info="permission denied")
error = service.delete_remark(people_id) error = service.delete_remark(people_id)
if not error.success: if not error.success:
return BaseResponse(error_code=error.code, error_info=error.info) return BaseResponse(error_code=error.code, error_info=error.info)