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": "社区集合已删除"})