from __future__ import annotations from fastapi import APIRouter, Depends from sqlalchemy import select from sqlalchemy.orm import Session from iti.auth import require_permission from iti.db import get_db from iti.responses import ok, page from iti_system.models import SysConfig from iti_system.schemas import ConfigCreate, ConfigQuery, ConfigUpdate from iti_system.services import apply_keyword, dump_config, get_or_404, paginate_query router = APIRouter(prefix="/sys/config", tags=["system.config"]) @router.get("/list", dependencies=[Depends(require_permission("system:config:list"))]) def list_config(query: ConfigQuery = Depends(), db: Session = Depends(get_db)): return ok([dump_config(item) for item in db.scalars(_query_configs(query)).all()]) @router.get("/page", dependencies=[Depends(require_permission("system:config:list"))]) def page_config(query: ConfigQuery = Depends(), db: Session = Depends(get_db)): result = paginate_query(db, _query_configs(query), page=query.page, size=query.size) return page([dump_config(item) for item in result["items"]], result["page"]) @router.post("", dependencies=[Depends(require_permission("system:config:create"))]) def create_config(payload: ConfigCreate, db: Session = Depends(get_db)): item = SysConfig(**payload.model_dump()) db.add(item) db.commit() db.refresh(item) return ok(dump_config(item)) @router.put("/{id}", dependencies=[Depends(require_permission("system:config:edit"))]) def update_config(id: str, payload: ConfigUpdate, db: Session = Depends(get_db)): item = get_or_404(db, SysConfig, id, "配置不存在") for key, value in payload.model_dump(exclude_unset=True).items(): setattr(item, key, value) db.commit() db.refresh(item) return ok(dump_config(item)) @router.delete("/{id}", dependencies=[Depends(require_permission("system:config:delete"))]) def delete_config(id: str, db: Session = Depends(get_db)): item = get_or_404(db, SysConfig, id, "配置不存在") db.delete(item) db.commit() return ok() def _query_configs(query: ConfigQuery): stmt = select(SysConfig).order_by(SysConfig.sort, SysConfig.created_at.desc()) stmt = apply_keyword(stmt, query.keyword, SysConfig.name, SysConfig.code, SysConfig.value) if query.type: stmt = stmt.where(SysConfig.type == query.type) if query.code: stmt = stmt.where(SysConfig.code.like(f"%{query.code}%")) if query.status: stmt = stmt.where(SysConfig.status == query.status) return stmt