from fastapi import APIRouter, Depends, HTTPException from sqlalchemy.orm import Session from app.database import get_db from app.models.setting import AiSetting from app.schemas.setting import AiSettingCreate from app.routers.admin import get_current_admin_user from app.models.user import AdminUser router = APIRouter(prefix="/admin/settings", tags=["AI设置"]) @router.get("", response_model=list) def list_settings( db: Session = Depends(get_db), current_user: AdminUser = Depends(get_current_admin_user), ): """列出所有 AI 配置""" return db.query(AiSetting).order_by(AiSetting.created_at.desc()).all() @router.get("/active") def get_active_setting( db: Session = Depends(get_db), ): """获取当前激活的 AI 配置(无需认证,供爬虫/优化器使用)""" setting = db.query(AiSetting).filter(AiSetting.is_active == True).first() if not setting: from app.routers.settings import _ensure_default_settings setting = _ensure_default_settings(db) return setting @router.post("") def create_setting( setting: AiSettingCreate, db: Session = Depends(get_db), current_user: AdminUser = Depends(get_current_admin_user), ): """新建 AI 配置""" db_setting = AiSetting(**setting.model_dump()) db.add(db_setting) db.commit() db.refresh(db_setting) return db_setting @router.put("/{setting_id}") def update_setting( setting_id: int, setting: AiSettingCreate, db: Session = Depends(get_db), current_user: AdminUser = Depends(get_current_admin_user), ): """更新 AI 配置""" db_setting = db.query(AiSetting).filter(AiSetting.id == setting_id).first() if not db_setting: raise HTTPException(status_code=404, detail="配置不存在") for key, value in setting.model_dump().items(): setattr(db_setting, key, value) db.commit() db.refresh(db_setting) return db_setting @router.put("/{setting_id}/toggle") def toggle_setting( setting_id: int, db: Session = Depends(get_db), current_user: AdminUser = Depends(get_current_admin_user), ): """切换激活状态(只能有一个活跃)""" db_setting = db.query(AiSetting).filter(AiSetting.id == setting_id).first() if not db_setting: raise HTTPException(status_code=404, detail="配置不存在") # 先全部设为非活跃 db.query(AiSetting).update({AiSetting.is_active: False}) db_setting.is_active = True db.commit() return {"message": "已激活", "id": setting_id} @router.delete("/{setting_id}") def delete_setting( setting_id: int, db: Session = Depends(get_db), current_user: AdminUser = Depends(get_current_admin_user), ): """删除 AI 配置""" db_setting = db.query(AiSetting).filter(AiSetting.id == setting_id).first() if not db_setting: raise HTTPException(status_code=404, detail="配置不存在") db.delete(db_setting) db.commit() return {"message": "删除成功"} def _ensure_default_settings(db: Session) -> AiSetting: """当没有激活配置时,创建一条默认配置""" existing = db.query(AiSetting).first() if existing: existing.is_active = True db.commit() return existing defaults = AiSetting( is_active=True, # 默认提示词会在 main.py 迁移时填充 ) db.add(defaults) db.commit() db.refresh(defaults) return defaults