Unify NetX UI to compact ops chrome and add API key purge.

Align network/list shells and audit header with industrial panels; allow permanently deleting revoked API keys.

Co-authored-by: Cursor <cursoragent@cursor.com>
This commit is contained in:
oliver 2026-10-11 16:20:31 +08:00
parent 4d60601050
commit 046029aa16
11 changed files with 417 additions and 286 deletions

View file

@ -30,6 +30,7 @@ from .auth_service import (
list_users,
login_issue_token,
refresh_login_tokens,
delete_api_token,
revoke_api_token,
revoke_auth_session_for_user,
revoke_auth_sessions,
@ -537,3 +538,27 @@ def api_revoke_token(
detail={"token_id": row.id, "name": row.name},
)
return {"ok": True, "id": row.id}
@router.delete("/v1/api-tokens/{token_id}/purge")
def api_purge_token(
token_id: str,
request: Request,
ctx: Annotated[AuthContext, Depends(require_user)],
db: Session = Depends(get_db),
) -> dict[str, Any]:
row = delete_api_token(db, token_id=token_id, actor=ctx.user)
ip, ua = _client_meta(request)
write_audit(
db,
action="api_tokens.purge",
actor_user_id=ctx.user.id,
actor_username=ctx.user.username,
method="DELETE",
path=f"/v1/api-tokens/{token_id}/purge",
status_code=200,
client_ip=ip,
user_agent=ua,
detail={"token_id": row.id, "name": row.name},
)
return {"ok": True, "id": row.id}

View file

@ -667,6 +667,18 @@ def revoke_api_token(db: Session, *, token_id: str, actor: AppUser) -> ApiToken:
return row
def delete_api_token(db: Session, *, token_id: str, actor: AppUser) -> ApiToken:
"""Permanently remove an API key row (revoked or active)."""
row = db.query(ApiToken).filter(ApiToken.id == str(token_id)).one_or_none()
if row is None:
raise HTTPException(status_code=404, detail="api_token_not_found")
if actor.role != "admin" and row.user_id != actor.id:
raise HTTPException(status_code=403, detail="forbidden")
db.delete(row)
db.commit()
return row
def update_api_token(
db: Session,
*,