"""Audit-Log: Plattform-Admins sehen alles, Workspace-Admins ihren Workspace.""" from fastapi import APIRouter, Request from fastapi.responses import HTMLResponse, Response from app import web from app.audit import views from app.identity import admin from app.workspaces import service as workspaces def router() -> APIRouter: r = APIRouter() def show(request: Request, workspace=None) -> HTMLResponse: filters = views.parse(dict(request.query_params), workspace_id=workspace.id if workspace else None) with web.db(request).session() as session: events, next_before = views.page(session, filters) users, names = views.labels(session, events) context = {"events": events, "next_before": next_before, "users": users, "workspace_names": names, "filters": filters, "actions": views.actions(session, workspace.id if workspace else None), "all_users": views.all_users(session), "count": views.count(session, filters), "all_workspaces": [] if workspace else views.all_workspaces(session), "workspace": workspace, "current_workspace": workspace, "base": f"/workspaces/{workspace.id}/audit" if workspace else "/admin/audit"} return web.render(request, "audit.html", context) def csv_response(request: Request, workspace_id: int | None, name: str) -> Response: filters = views.parse(dict(request.query_params), workspace_id=workspace_id) with web.db(request).session() as session: body = views.export(session, filters) return Response(body, media_type="text/csv; charset=utf-8", headers={"Content-Disposition": f'attachment; filename="{name}"'}) @r.get("/admin/audit") def platform(request: Request, principal: web.User) -> HTMLResponse: admin.require(principal) return show(request) @r.get("/admin/audit.csv") def platform_csv(request: Request, principal: web.User) -> Response: admin.require(principal) return csv_response(request, None, "audit.csv") @r.get("/workspaces/{workspace_id}/audit") def workspace(request: Request, principal: web.User, workspace_id: int) -> HTMLResponse: with web.db(request).session() as session: ws = workspaces.require_admin(session, principal, workspace_id).workspace return show(request, ws) @r.get("/workspaces/{workspace_id}/audit.csv") def workspace_csv(request: Request, principal: web.User, workspace_id: int) -> Response: with web.db(request).session() as session: workspaces.require_admin(session, principal, workspace_id) return csv_response(request, workspace_id, f"audit-workspace-{workspace_id}.csv") return r