105 lines
3.3 KiB
Python
105 lines
3.3 KiB
Python
from __future__ import annotations
|
|
|
|
from fastapi import APIRouter, Depends, Query
|
|
|
|
from app.core.deps import CurrentUser, DbDep, require_perm
|
|
from app.core.exceptions import ok
|
|
from app.schemas.skill import (
|
|
SkillCallLogRead,
|
|
SkillCreate,
|
|
SkillTestRequest,
|
|
SkillUpdate,
|
|
)
|
|
from app.services import skill_service
|
|
|
|
router = APIRouter(prefix="/skills", tags=["skill"])
|
|
|
|
|
|
@router.get("", dependencies=[Depends(require_perm("skill:view"))])
|
|
async def list_skills(
|
|
db: DbDep,
|
|
page: int = Query(1, ge=1),
|
|
size: int = Query(20, ge=1, le=200),
|
|
keyword: str | None = None,
|
|
executor_type: str | None = None,
|
|
category: str | None = None,
|
|
) -> dict:
|
|
rows, total = await skill_service.paginate(db, page, size, keyword, executor_type, category)
|
|
return ok({
|
|
"list": [skill_service.to_read(s).model_dump() for s in rows],
|
|
"total": total,
|
|
"page": page,
|
|
"size": size,
|
|
})
|
|
|
|
|
|
@router.get("/{sid}", dependencies=[Depends(require_perm("skill:view"))])
|
|
async def get_skill(sid: int, db: DbDep) -> dict:
|
|
s = await skill_service.get(db, sid)
|
|
return ok(skill_service.to_read(s).model_dump())
|
|
|
|
|
|
@router.post("", dependencies=[Depends(require_perm("skill:create"))])
|
|
async def create_skill(data: SkillCreate, db: DbDep) -> dict:
|
|
s = await skill_service.create(db, data)
|
|
return ok(skill_service.to_read(s).model_dump())
|
|
|
|
|
|
@router.patch("/{sid}", dependencies=[Depends(require_perm("skill:update"))])
|
|
async def update_skill(sid: int, data: SkillUpdate, db: DbDep) -> dict:
|
|
s = await skill_service.update(db, sid, data)
|
|
return ok(skill_service.to_read(s).model_dump())
|
|
|
|
|
|
@router.delete("/{sid}", dependencies=[Depends(require_perm("skill:delete"))])
|
|
async def delete_skill(sid: int, db: DbDep) -> dict:
|
|
await skill_service.delete(db, sid)
|
|
return ok()
|
|
|
|
|
|
@router.post("/{sid}/test", dependencies=[Depends(require_perm("skill:test"))])
|
|
async def test_skill(sid: int, body: SkillTestRequest, db: DbDep, user: CurrentUser) -> dict:
|
|
log = await skill_service.test_skill(db, sid, body.input_data, body.product_id, user)
|
|
return ok(_log_to_dict(log))
|
|
|
|
|
|
def _log_to_dict(log) -> dict:
|
|
return {
|
|
"id": log.id,
|
|
"skill_id": log.skill_id,
|
|
"skill_code": log.skill_code,
|
|
"operator_id": log.operator_id,
|
|
"operator_name": log.operator_name,
|
|
"executor_type": log.executor_type,
|
|
"product_id": log.product_id,
|
|
"input_data": log.input_data,
|
|
"output_data": log.output_data,
|
|
"result": log.result,
|
|
"message": log.message,
|
|
"cost_ms": log.cost_ms,
|
|
"source": log.source,
|
|
"created_at": log.created_at.isoformat() if log.created_at else None,
|
|
}
|
|
|
|
|
|
# Skill 调用日志
|
|
log_router = APIRouter(prefix="/skill-logs", tags=["skill-log"])
|
|
|
|
|
|
@log_router.get("", dependencies=[Depends(require_perm("skill:log:view"))])
|
|
async def list_skill_logs(
|
|
db: DbDep,
|
|
page: int = Query(1, ge=1),
|
|
size: int = Query(20, ge=1, le=200),
|
|
skill_id: int | None = None,
|
|
result: str | None = None,
|
|
source: str | None = None,
|
|
) -> dict:
|
|
rows, total = await skill_service.paginate_logs(db, page, size, skill_id, result, source)
|
|
return ok({
|
|
"list": [_log_to_dict(r) for r in rows],
|
|
"total": total,
|
|
"page": page,
|
|
"size": size,
|
|
})
|