mirror of
https://github.com/ThearchyHelios/AgentLab.git
synced 2026-11-15 01:21:59 +00:00
36 lines
1.4 KiB
Python
36 lines
1.4 KiB
Python
"""应用平台里管理类操作的留痕(audit_events):应用发布、授权、钩子、版本退役。
|
|
|
|
操作人记各「人」列的同一个名字(api/deps.actor_of:开登录是认证过的用户名,关登录是自报的署名),verified 照实记
|
|
这个名字是不是认证过的(关登录时恒为假)。和要留痕的改动同一个事务提交,调用方负责 commit。
|
|
"""
|
|
from __future__ import annotations
|
|
|
|
from typing import Any
|
|
|
|
from sqlalchemy.ext.asyncio import AsyncSession
|
|
|
|
from app.db.models_identity import AuditEvent
|
|
|
|
|
|
async def record(session: AsyncSession, *, action: str, subject_kind: str, subject_id: str | None,
|
|
actor: str | None, data: dict[str, Any] | None = None) -> AuditEvent:
|
|
from app.api.deps import current_principal
|
|
|
|
row = AuditEvent(actor=actor, verified=current_principal().verified, action=action, subject_kind=subject_kind,
|
|
subject_id=subject_id, data=_jsonable(data or {}))
|
|
session.add(row)
|
|
return row
|
|
|
|
|
|
def _jsonable(value: Any) -> Any:
|
|
"""审计数据进 JSON 列:时间写成 ISO 字符串。"""
|
|
from datetime import datetime
|
|
|
|
if isinstance(value, dict):
|
|
return {k: _jsonable(v) for k, v in value.items()}
|
|
if isinstance(value, (list, tuple)):
|
|
return [_jsonable(v) for v in value]
|
|
if isinstance(value, datetime):
|
|
return value.isoformat()
|
|
return value
|