deliveryman-api/app/api/endpoints/community_set.py
2025-03-10 14:27:46 +08:00

172 lines
5.6 KiB
Python

from fastapi import APIRouter, Depends, HTTPException, Query, Path
from sqlalchemy.orm import Session
from typing import List, Optional
from pydantic import BaseModel, Field
from app.models.database import get_db
from app.models.community_set import CommunitySet
from app.api.deps import get_current_user, get_admin_user
from app.models.user import UserDB
from app.models.community import CommunityDB
from app.models.community_set_mapping import CommunitySetMapping
from datetime import datetime
from app.core.response import success_response, error_response
router = APIRouter()
# 请求和响应模型
class CommunitySetCreate(BaseModel):
set_name: str = Field(..., min_length=1, max_length=100, description="集合名称")
user_id: Optional[int] = Field(None, description="用户ID")
class CommunitySetUpdate(BaseModel):
set_name: str = Field(..., min_length=1, max_length=100, description="集合名称")
user_id: Optional[int] = Field(None, description="用户ID")
class CommunitySetInfo(BaseModel):
id: int
set_name: str
user_id: Optional[int] = None
create_time: datetime
update_time: datetime
user_name: Optional[str] = None
class Config:
from_attributes = True
# 创建社区集合
@router.post("/", response_model=CommunitySetInfo)
async def create_community_set(
community_set: CommunitySetCreate,
db: Session = Depends(get_db),
current_user: UserDB = Depends(get_admin_user)
):
"""创建社区集合"""
new_set = CommunitySet(
set_name=community_set.set_name,
user_id=community_set.user_id
)
db.add(new_set)
db.commit()
db.refresh(new_set)
return success_response(data=CommunitySetInfo.model_validate(new_set))
# 获取当前用户的所有社区集合
@router.get("/list/user", response_model=List[CommunitySetInfo])
async def get_user_community_sets(
db: Session = Depends(get_db),
current_user: UserDB = Depends(get_current_user),
skip: int = Query(0, ge=0),
limit: int = Query(100, ge=1, le=100)
):
"""获取当前用户的所有社区集合"""
sets = db.query(CommunitySet).filter(
CommunitySet.user_id == current_user.userid
).offset(skip).limit(limit).all()
results = [CommunitySetInfo.model_validate(set) for set in sets]
total = db.query(CommunitySet).filter(
CommunitySet.user_id == current_user.userid
).count()
return success_response(data={"total": total, "items": results})
# 获取特定社区集合
@router.get("/{set_id}", response_model=CommunitySetInfo)
async def get_community_set(
set_id: int = Path(..., ge=1),
db: Session = Depends(get_db),
current_user: UserDB = Depends(get_current_user)
):
"""获取特定社区集合"""
community_set = db.query(CommunitySet).filter(
CommunitySet.id == set_id,
CommunitySet.user_id == current_user.userid
).first()
if not community_set:
raise HTTPException(status_code=404, detail="社区集合不存在")
result = CommunitySetInfo.model_validate(community_set)
return success_response(data=result)
# 管理员获取所有社区集合
@router.get("/list/all", response_model=List[CommunitySetInfo])
async def get_all_community_sets(
skip: int = Query(0, ge=0),
limit: int = Query(20, ge=1, le=100),
db: Session = Depends(get_db),
current_user: UserDB = Depends(get_admin_user)
):
"""管理员获取所有社区集合"""
# 获取所有社区集合, join 社区名字和 用户名字
sets = db.query(CommunitySet, UserDB.nickname.label("user_name")).outerjoin(UserDB, CommunitySet.user_id == UserDB.userid).offset(skip).limit(limit).all()
results = []
for set in sets:
# 查询集合下有多少个社区
community_count = db.query(CommunitySetMapping).filter(
CommunitySetMapping.set_id == set.CommunitySet.id
).count()
result= {
"id": set.CommunitySet.id,
"set_name": set.CommunitySet.set_name,
"user_id": set.CommunitySet.user_id,
"user_name": set.user_name,
"create_time": set.CommunitySet.create_time,
"update_time": set.CommunitySet.update_time,
"community_count": community_count
}
results.append(result)
total = db.query(CommunitySet).count()
return success_response(data={"total": total, "items": results})
# 更新社区集合
@router.put("/{set_id}", response_model=CommunitySetInfo)
async def update_community_set(
community_set: CommunitySetUpdate,
set_id: int = Path(..., ge=1),
db: Session = Depends(get_db),
current_user: UserDB = Depends(get_admin_user)
):
"""更新社区集合"""
db_set = db.query(CommunitySet).filter(
CommunitySet.id == set_id
).first()
if not db_set:
return error_response(code=404, message="社区集合不存在")
db_set.set_name = community_set.set_name
db_set.user_id = community_set.user_id
db.commit()
db.refresh(db_set)
return success_response(data= CommunitySetInfo.model_validate(db_set))
# 删除社区集合
@router.delete("/{set_id}", response_model=dict)
async def delete_community_set(
set_id: int = Path(..., ge=1),
db: Session = Depends(get_db),
current_user: UserDB = Depends(get_current_user)
):
"""删除社区集合"""
db_set = db.query(CommunitySet).filter(
CommunitySet.id == set_id,
CommunitySet.user_id == current_user.userid
).first()
if not db_set:
return error_response(code=404, message="社区集合不存在")
db.delete(db_set)
db.commit()
return success_response(data={"message": "社区集合已删除"})