82 lines
2.8 KiB
Python
82 lines
2.8 KiB
Python
"""
|
|
节目期次 API — 增改查(责编和管理员可操作)
|
|
"""
|
|
|
|
from fastapi import APIRouter, Depends, HTTPException, status
|
|
from sqlmodel import Session, select
|
|
|
|
from app.core.deps import get_current_user, require_role
|
|
from app.db.session import get_session
|
|
from app.models.user import User, UserRole
|
|
from app.schemas.episode import EpisodeCreate, EpisodeResponse, EpisodeUpdate
|
|
|
|
router = APIRouter(prefix="/api/episodes", tags=["节目期次"])
|
|
|
|
|
|
@router.get("", response_model=list[EpisodeResponse])
|
|
def list_episodes(
|
|
limit: int = 50,
|
|
offset: int = 0,
|
|
session: Session = Depends(get_session),
|
|
current_user: User = Depends(require_role(UserRole.zhipianren, UserRole.zebian)),
|
|
):
|
|
"""获取节目期次列表(仅管理员/责编)。按播出日期倒序。"""
|
|
statement = select(Episode).order_by(Episode.air_date.desc()).offset(offset).limit(limit)
|
|
episodes = session.exec(statement).all()
|
|
return episodes
|
|
|
|
|
|
@router.get("/{episode_id}", response_model=EpisodeResponse)
|
|
def get_episode(
|
|
episode_id: int,
|
|
session: Session = Depends(get_session),
|
|
current_user: User = Depends(require_role(UserRole.zhipianren, UserRole.zebian)),
|
|
):
|
|
"""根据 ID 获取单期节目(仅管理员/责编)。"""
|
|
episode = session.get(Episode, episode_id)
|
|
if episode is None:
|
|
raise HTTPException(status_code=status.HTTP_404_NOT_FOUND, detail="期次不存在")
|
|
return episode
|
|
|
|
|
|
@router.post("", response_model=EpisodeResponse, status_code=status.HTTP_201_CREATED)
|
|
def create_episode(
|
|
body: EpisodeCreate,
|
|
session: Session = Depends(get_session),
|
|
current_user: User = Depends(require_role(UserRole.zhipianren, UserRole.zebian)),
|
|
):
|
|
"""新增一期节目(仅管理员/责编)。"""
|
|
# 检查期次号唯一
|
|
existing = session.exec(
|
|
select(Episode).where(Episode.episode_number == body.episode_number)
|
|
).first()
|
|
if existing:
|
|
raise HTTPException(status_code=status.HTTP_409_CONFLICT, detail="期次号已存在")
|
|
|
|
episode = Episode.model_validate(body.model_dump())
|
|
session.add(episode)
|
|
session.commit()
|
|
session.refresh(episode)
|
|
return episode
|
|
|
|
|
|
@router.patch("/{episode_id}", response_model=EpisodeResponse)
|
|
def update_episode(
|
|
episode_id: int,
|
|
body: EpisodeUpdate,
|
|
session: Session = Depends(get_session),
|
|
current_user: User = Depends(require_role(UserRole.zhipianren, UserRole.zebian)),
|
|
):
|
|
"""更新一期节目信息(仅管理员/责编)。"""
|
|
episode = session.get(Episode, episode_id)
|
|
if episode is None:
|
|
raise HTTPException(status_code=status.HTTP_404_NOT_FOUND, detail="期次不存在")
|
|
|
|
update_data = body.model_dump(exclude_unset=True)
|
|
for field, value in update_data.items():
|
|
setattr(episode, field, value)
|
|
|
|
session.add(episode)
|
|
session.commit()
|
|
session.refresh(episode)
|
|
return episode |