172 lines
5.6 KiB
Python
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": "社区集合已删除"}) |