You cannot select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
67 lines
2.5 KiB
Python
67 lines
2.5 KiB
Python
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
|