Files
NovalRedot/backend/app/routers/world_setting.py
ROOG 20c759150a 新增角色管理、世界观设定、章节管理和AI工具调用功能
- 角色管理:CRUD API + 卡片网格UI,每个角色约200字描述
- 世界观设定:单篇长文编辑器,建议500字以上
- 章节管理:CRUD + 排序 API,左右分栏编辑器,单章5000字上限
- AI工具调用:支持工具审批流程和结构化工具调用
- 小说详情页新增章节、角色、世界观入口按钮

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-21 13:58:17 +08:00

57 lines
1.6 KiB
Python

from datetime import datetime, timezone
from fastapi import APIRouter, Depends, HTTPException
from sqlmodel import Session, select
from ..database import get_session
from ..models import Novel, WorldSetting
from ..schemas import WorldSettingUpdate, WorldSettingRead
router = APIRouter(prefix="/api/novels/{novel_id}/world-setting", tags=["world-setting"])
def _get_novel_or_404(novel_id: int, session: Session) -> Novel:
novel = session.get(Novel, novel_id)
if not novel:
raise HTTPException(status_code=404, detail="小说不存在")
return novel
@router.get("", response_model=WorldSettingRead)
def get_world_setting(
novel_id: int,
session: Session = Depends(get_session),
):
_get_novel_or_404(novel_id, session)
ws = session.exec(
select(WorldSetting).where(WorldSetting.novel_id == novel_id)
).first()
if not ws:
# 不存在则自动创建空记录
ws = WorldSetting(novel_id=novel_id, content="")
session.add(ws)
session.commit()
session.refresh(ws)
return ws
@router.put("", response_model=WorldSettingRead)
def save_world_setting(
novel_id: int,
data: WorldSettingUpdate,
session: Session = Depends(get_session),
):
_get_novel_or_404(novel_id, session)
ws = session.exec(
select(WorldSetting).where(WorldSetting.novel_id == novel_id)
).first()
if ws:
ws.content = data.content
ws.updated_at = datetime.now(timezone.utc)
else:
ws = WorldSetting(novel_id=novel_id, content=data.content)
session.add(ws)
session.commit()
session.refresh(ws)
return ws