from fastapi import APIRouter, Depends, HTTPException from pydantic import BaseModel from sqlalchemy.exc import IntegrityError from sqlalchemy.orm import Session as DBSession from app.core.auth import require_settings_password from app.db.database import get_db from app.db.models import ModelPreset router = APIRouter(prefix="/api/models", tags=["models"]) class ModelPresetResponse(BaseModel): id: int label: str value: str class Config: from_attributes = True class ModelPresetRequest(BaseModel): label: str value: str @router.get("", response_model=list[ModelPresetResponse]) def list_model_presets(db: DBSession = Depends(get_db)): """モデル選択プルダウンの表示に使うため認証不要(誰でも読める)。""" return db.query(ModelPreset).order_by(ModelPreset.id).all() @router.post("", response_model=ModelPresetResponse, dependencies=[Depends(require_settings_password)]) def create_model_preset(req: ModelPresetRequest, db: DBSession = Depends(get_db)): preset = ModelPreset(label=req.label, value=req.value) db.add(preset) try: db.commit() except IntegrityError as e: db.rollback() raise HTTPException(status_code=400, detail=f"モデル文字列が重複しています: {req.value}") from e db.refresh(preset) return preset @router.put("/{preset_id}", response_model=ModelPresetResponse, dependencies=[Depends(require_settings_password)]) def update_model_preset(preset_id: int, req: ModelPresetRequest, db: DBSession = Depends(get_db)): preset = db.get(ModelPreset, preset_id) if not preset: raise HTTPException(status_code=404, detail="Model preset not found") preset.label = req.label preset.value = req.value try: db.commit() except IntegrityError as e: db.rollback() raise HTTPException(status_code=400, detail=f"モデル文字列が重複しています: {req.value}") from e db.refresh(preset) return preset @router.delete("/{preset_id}", status_code=204, dependencies=[Depends(require_settings_password)]) def delete_model_preset(preset_id: int, db: DBSession = Depends(get_db)): preset = db.get(ModelPreset, preset_id) if preset: db.delete(preset) db.commit()