Skip to content

Commit 8a9362e

Browse files
committed
feat: Support recording system operation logs
1 parent 2522137 commit 8a9362e

File tree

5 files changed

+99
-1
lines changed

5 files changed

+99
-1
lines changed
Lines changed: 43 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,43 @@
1+
"""empty message
2+
3+
Revision ID: 3d4bd2d673dc
4+
Revises: 24e961f6326b
5+
Create Date: 2025-12-19 13:30:54.743171
6+
7+
"""
8+
from alembic import op
9+
import sqlalchemy as sa
10+
import sqlmodel.sql.sqltypes
11+
from sqlalchemy.dialects import postgresql
12+
13+
# revision identifiers, used by Alembic.
14+
revision = '3d4bd2d673dc'
15+
down_revision = '24e961f6326b'
16+
branch_labels = None
17+
depends_on = None
18+
19+
20+
def upgrade():
21+
op.create_table('sys_logs',
22+
sa.Column('id', sa.BIGINT(), autoincrement=True, nullable=False),
23+
sa.Column('operation_type', sa.VARCHAR(length=255), autoincrement=False, nullable=True),
24+
sa.Column('operation_detail', sa.TEXT(), autoincrement=False, nullable=True),
25+
sa.Column('user_id', sa.BIGINT(), autoincrement=False, nullable=True),
26+
sa.Column('operation_status', sa.VARCHAR(length=255), autoincrement=False, nullable=True),
27+
sa.Column('oid', sa.BIGINT(), autoincrement=False, nullable=True),
28+
sa.Column('ip_address', sa.VARCHAR(length=255), autoincrement=False, nullable=True),
29+
sa.Column('user_agent', sa.VARCHAR(length=255), autoincrement=False, nullable=True),
30+
sa.Column('execution_time', sa.BIGINT(), autoincrement=False, nullable=True),
31+
sa.Column('error_message', sa.TEXT(), autoincrement=False, nullable=True),
32+
sa.Column('create_time', postgresql.TIMESTAMP(), autoincrement=False, nullable=True),
33+
sa.Column('module', sa.VARCHAR(length=255), autoincrement=False, nullable=True),
34+
sa.Column('remark', sa.VARCHAR(length=255), autoincrement=False, nullable=True),
35+
sa.Column('resource_id',sa.VARCHAR(length=255), autoincrement=False, nullable=True),
36+
sa.Column('request_method', sa.VARCHAR(length=255), autoincrement=False, nullable=True),
37+
sa.Column('request_path', sa.VARCHAR(length=255), autoincrement=False, nullable=True),
38+
sa.PrimaryKeyConstraint('id', name=op.f('sys_logs_pkey'))
39+
)
40+
41+
42+
def downgrade():
43+
op.drop_table('sys_logs')

backend/apps/chat/api/chat.py

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,8 @@
2121
from common.core.deps import CurrentAssistant, SessionDep, CurrentUser, Trans
2222
from common.utils.command_utils import parse_quick_command
2323
from common.utils.data_format import DataFormat
24+
from sqlbot_xpack.audit.models.log_model import OperationType, OperationDetails, OperationModules
25+
from sqlbot_xpack.audit.schemas.logger_decorator import system_log, LogConfig
2426

2527
router = APIRouter(tags=["Data Q&A"], prefix="/chat")
2628

@@ -80,6 +82,12 @@ async def rename(session: SessionDep, chat: RenameChat):
8082

8183

8284
@router.delete("/{chart_id}", response_model=str, summary=f"{PLACEHOLDER_PREFIX}delete_chat")
85+
@system_log(LogConfig(
86+
operation_type=OperationType.DELETE_QA,
87+
operation_detail=OperationDetails.DELETE_QA_DETAILS,
88+
module=OperationModules.QA,
89+
resource_id_expr="chart_id"
90+
))
8391
async def delete(session: SessionDep, chart_id: int):
8492
try:
8593
return delete_chat(session=session, chart_id=chart_id)
@@ -92,6 +100,12 @@ async def delete(session: SessionDep, chart_id: int):
92100

93101
@router.post("/start", response_model=ChatInfo, summary=f"{PLACEHOLDER_PREFIX}start_chat")
94102
@require_permissions(permission=SqlbotPermission(type='ds', keyExpression="create_chat_obj.datasource"))
103+
@system_log(LogConfig(
104+
operation_type=OperationType.CREATE_QA,
105+
operation_detail=OperationDetails.CREATE_QA_DETAILS,
106+
module=OperationModules.QA,
107+
result_id_expr="id"
108+
))
95109
async def start_chat(session: SessionDep, current_user: CurrentUser, create_chat_obj: CreateChat):
96110
try:
97111
return create_chat(session, current_user, create_chat_obj)

backend/apps/dashboard/api/dashboard_api.py

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,8 @@
33
from apps.dashboard.crud.dashboard_service import list_resource, load_resource, \
44
create_resource, create_canvas, validate_name, delete_resource, update_resource, update_canvas
55
from apps.dashboard.models.dashboard_model import CreateDashboard, BaseDashboard, QueryDashboard, DashboardResponse
6+
from sqlbot_xpack.audit.models.log_model import OperationType, OperationDetails, OperationModules
7+
from sqlbot_xpack.audit.schemas.logger_decorator import system_log, LogConfig
68
from common.core.deps import SessionDep, CurrentUser
79

810
router = APIRouter(tags=["dashboard"], prefix="/dashboard")
@@ -29,16 +31,34 @@ async def update_resource_api(session: SessionDep, user: CurrentUser, dashboard:
2931

3032

3133
@router.delete("/delete_resource/{resource_id}")
34+
@system_log(LogConfig(
35+
operation_type=OperationType.DELETE_DASHBOARD,
36+
operation_detail=OperationDetails.DELETE_DASHBOARD_DETAILS,
37+
module=OperationModules.DASHBOARD,
38+
resource_id_expr="resource_id"
39+
))
3240
async def delete_resource_api(session: SessionDep, resource_id: str):
3341
return delete_resource(session, resource_id)
3442

3543

3644
@router.post("/create_canvas", response_model=BaseDashboard)
45+
@system_log(LogConfig(
46+
operation_type=OperationType.CREATE_DASHBOARD,
47+
operation_detail=OperationDetails.CREATE_DASHBOARD_DETAILS,
48+
module=OperationModules.DASHBOARD,
49+
result_id_expr="id"
50+
))
3751
async def create_canvas_api(session: SessionDep, user: CurrentUser, dashboard: CreateDashboard):
3852
return create_canvas(session, user, dashboard)
3953

4054

4155
@router.post("/update_canvas", response_model=BaseDashboard)
56+
@system_log(LogConfig(
57+
operation_type=OperationType.UPDATE_DASHBOARD,
58+
operation_detail=OperationDetails.UPDATE_DASHBOARD_DETAILS,
59+
module=OperationModules.DASHBOARD,
60+
resource_id_expr="dashboard.id"
61+
))
4262
async def update_canvas_api(session: SessionDep, user: CurrentUser, dashboard: CreateDashboard):
4363
return update_canvas(session, user, dashboard)
4464

backend/apps/datasource/api/datasource.py

Lines changed: 20 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -28,7 +28,8 @@
2828
from ..crud.table import get_tables_by_ds_id
2929
from ..models.datasource import CoreDatasource, CreateDatasource, TableObj, CoreTable, CoreField, FieldObj, \
3030
TableSchemaResponse, ColumnSchemaResponse, PreviewResponse
31-
31+
from sqlbot_xpack.audit.models.log_model import OperationType, OperationDetails, OperationModules
32+
from sqlbot_xpack.audit.schemas.logger_decorator import system_log, LogConfig
3233
router = APIRouter(tags=["Datasource"], prefix="/datasource")
3334
path = settings.EXCEL_PATH
3435

@@ -69,6 +70,12 @@ def inner():
6970

7071

7172
@router.post("/add", response_model=CoreDatasource, summary=f"{PLACEHOLDER_PREFIX}ds_add")
73+
@system_log(LogConfig(
74+
operation_type=OperationType.CREATE_DATASOURCE,
75+
operation_detail=OperationDetails.CREATE_DATASOURCE_DETAILS,
76+
module=OperationModules.DATASOURCE,
77+
result_id_expr="id"
78+
))
7279
async def add(session: SessionDep, trans: Trans, user: CurrentUser, ds: CreateDatasource):
7380
def inner():
7481
return create_ds(session, trans, user, ds)
@@ -87,6 +94,12 @@ def inner():
8794

8895
@router.post("/update", response_model=CoreDatasource, summary=f"{PLACEHOLDER_PREFIX}ds_update")
8996
@require_permissions(permission=SqlbotPermission(type='ds', keyExpression="ds.id"))
97+
@system_log(LogConfig(
98+
operation_type=OperationType.UPDATE_DATASOURCE,
99+
operation_detail=OperationDetails.UPDATE_DATASOURCE_DETAILS,
100+
module=OperationModules.DATASOURCE,
101+
resource_id_expr="ds.id"
102+
))
90103
async def update(session: SessionDep, trans: Trans, user: CurrentUser, ds: CoreDatasource):
91104
def inner():
92105
return update_ds(session, trans, user, ds)
@@ -96,6 +109,12 @@ def inner():
96109

97110
@router.post("/delete/{id}", response_model=None, summary=f"{PLACEHOLDER_PREFIX}ds_delete")
98111
@require_permissions(permission=SqlbotPermission(type='ds', keyExpression="id"))
112+
@system_log(LogConfig(
113+
operation_type=OperationType.DELETE_DATASOURCE,
114+
operation_detail=OperationDetails.DELETE_DATASOURCE_DETAILS,
115+
module=OperationModules.DATASOURCE,
116+
resource_id_expr="id"
117+
))
99118
async def delete(session: SessionDep, id: int = Path(..., description=f"{PLACEHOLDER_PREFIX}ds_id")):
100119
return delete_ds(session, id)
101120

backend/main.py

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,7 @@
2121
from apps.system.crud.assistant import init_dynamic_cors
2222
from apps.system.middleware.auth import TokenMiddleware
2323
from apps.system.schemas.permission import RequestContextMiddleware
24+
from sqlbot_xpack.audit.schemas.request_context import RequestContextMiddlewareCommon
2425
from common.core.config import settings
2526
from common.core.response_middleware import ResponseMiddleware, exception_handler
2627
from common.core.sqlbot_cache import init_sqlbot_cache
@@ -201,6 +202,7 @@ async def custom_swagger_ui(request: Request):
201202
app.add_middleware(TokenMiddleware)
202203
app.add_middleware(ResponseMiddleware)
203204
app.add_middleware(RequestContextMiddleware)
205+
app.add_middleware(RequestContextMiddlewareCommon)
204206
app.include_router(api_router, prefix=settings.API_V1_STR)
205207

206208
# Register exception handlers

0 commit comments

Comments
 (0)